ETH Price: $2,426.20 (-3.13%)

Token

SHIBDUTY (SOD)
 

Overview

Max Total Supply

1,000,000,000,000,000 SOD

Holders

271

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0 SOD

Value
$0.00
0x499838fc8558abd13933a828fbe802623354fffe
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ShibDuty

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.12;
// SPDX-License-Identifier: Unlicensed
interface IERC20 {

    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}



/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    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");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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);
            }
        }
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
    * @dev Leaves the contract without owner. It will not be possible to call
    * `onlyOwner` functions anymore. Can only be called by the current owner.
    *
    * NOTE: Renouncing ownership will leave the contract without an owner,
    * thereby removing any functionality that is only available to the owner.
    */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

}

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

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

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

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private botWallets;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private isExchangeWallet;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000000000 * 10 ** 9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "SHIBDUTY";
    string private _symbol = "SOD";
    uint8 private _decimals = 9;
    bool private tradingOpen = false;
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public _maxBuyAmount = 35000000000000 * 10**9;
    uint256 public _maxWalletAmount = 52500000000000 * 10**9;
    uint256 public numTokensSellToAddToLiquidity = 7000000000000 * 10**9;
    uint public ethSellAmount = 1000000000000000000;  //1 ETH
    address public marketingWallet = 0x2ac47c24042154e87c64d41f98130D6a16e4D5d9;
    address public devWallet = 0x73281e23f36A5A0a0709a4dc7214053d31056f5A;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    struct Distribution {
        uint256 marketingFeePercentage;
        uint256 devFeePercentage;
    }

    struct TaxFees {
        uint256 reflectionBuyFee;
        uint256 liquidityBuyFee;
        uint256 sellReflectionFee;
        uint256 sellLiquidityFee;
        uint256 largeSellFee;
    }
    bool private doTakeFees;
    bool private isSellTxn;
    TaxFees public taxFees;
    Distribution public distribution;

    constructor () {
        _rOwned[_msgSender()] = _rTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[_msgSender()] = true;
        taxFees = TaxFees(0,12,0,12,0);
        distribution = Distribution(50, 50);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

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

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

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

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

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

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

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

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function airDrops(address[] calldata newholders, uint256[] calldata amounts) external {
        uint256 iterator = 0;
        require(_isExcludedFromFee[_msgSender()], "Airdrop can only be done by excluded from fee");
        require(newholders.length == amounts.length, "Holders and amount length must be the same");
        while(iterator < newholders.length){
            _tokenTransfer(_msgSender(), newholders[iterator], amounts[iterator] * 10**9, false, false);
            iterator += 1;
        }
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromFee(address[] calldata addresses) public onlyOwner {
        addRemoveFee(addresses, true);
    }

    function includeInFee(address[] calldata addresses) public onlyOwner {
        addRemoveFee(addresses, false);
    }

    function addExchange(address[] calldata addresses) public onlyOwner {
        addRemoveExchange(addresses, true);
    }

    function removeExchange(address[] calldata addresses) public onlyOwner {
        addRemoveExchange(addresses, false);
    }

    function setExtraSellEthAmount(uint ethPrice) external onlyOwner {
        ethSellAmount = ethPrice;
    }
    function createV2Pair() external onlyOwner {
        require(uniswapV2Pair == address(0),"UniswapV2Pair has already been set");
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
    }
    function addRemoveExchange(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            isExchangeWallet[addr] = flag;
        }
    }

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

    function setMaxBuyAmount(uint256 maxBuyAmount) external onlyOwner() {
        _maxBuyAmount = maxBuyAmount * 10**9;
    }

    function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() {
        _maxWalletAmount = maxWalletAmount * 10**9;
    }
    function setTaxFees(uint256 reflectionFee, uint256 liquidityFee, uint256 sellReflectionFee, uint256 sellLiquidityFee, uint256 superSellOffFee) external onlyOwner {
        taxFees.reflectionBuyFee = reflectionFee;
        taxFees.liquidityBuyFee = liquidityFee;
        taxFees.sellLiquidityFee = sellLiquidityFee;
        taxFees.sellReflectionFee = sellReflectionFee;
        taxFees.largeSellFee = superSellOffFee;
    }

    function setDistribution(uint256 marketingFeePercentage, uint256 devFeePercentage) external onlyOwner {
        require(marketingFeePercentage.add(devFeePercentage) == 100, "Fee percentage must equal 100");
        distribution.marketingFeePercentage = marketingFeePercentage;
        distribution.devFeePercentage = devFeePercentage;
    }

    function setNumTokensToSell(uint256 numTokensSellToAddToLiquidity_) external onlyOwner {
        numTokensSellToAddToLiquidity = numTokensSellToAddToLiquidity_ * 10**9;
    }

    function setWallets(address _marketingWallet, address _devWallet) external onlyOwner {
        marketingWallet = _marketingWallet;
        devWallet = _devWallet;
    }

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

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

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

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

    function getContractTokenBalance() public view returns (uint256) {
        return balanceOf(address(this));
    }   

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

    receive() external payable {}

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        uint256 reflectionFee = 0;
        if(doTakeFees) {
            reflectionFee = taxFees.reflectionBuyFee;
            if(isSellTxn) {
                reflectionFee = taxFees.sellReflectionFee;
            }
        }
        return _amount.mul(reflectionFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        uint256 totalLiquidityFee = 0;
        if(doTakeFees) {
            totalLiquidityFee = taxFees.liquidityBuyFee;
            if(isSellTxn) {
                totalLiquidityFee = taxFees.sellLiquidityFee;
                uint ethPrice = getEthPrice(_amount);
                if(ethPrice >= ethSellAmount) {
                    totalLiquidityFee = totalLiquidityFee.add(taxFees.largeSellFee);
                }
            }
        }
        return _amount.mul(totalLiquidityFee).div(10**2);
    }

    function getEthPrice(uint tokenAmount) public view returns (uint)  {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        return uniswapV2Router.getAmountsOut(tokenAmount, path)[1];
    }
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

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

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

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

    function sellTaxTokens() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance >= numTokensSellToAddToLiquidity && !inSwapAndLiquify && swapAndLiquifyEnabled) {
            //send eth to wallets marketing and dev
            distributeShares(contractTokenBalance);
        }
    }

    function distributeShares(uint256 balanceToShareTokens) private lockTheSwap {
        swapTokensForEth(balanceToShareTokens);
        uint256 balanceToShare = address(this).balance;
        uint256 marketingShare = balanceToShare.mul(distribution.marketingFeePercentage).div(100);
        uint256 devShare = balanceToShare.mul(distribution.devFeePercentage).div(100);
        payable(marketingWallet).transfer(marketingShare);
        payable(devWallet).transfer(devShare);

    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell) private {
        doTakeFees = takeFees;
        isSellTxn = isSell;
        _transferStandard(sender, recipient, amount);
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newholders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distribution","outputs":[{"internalType":"uint256","name":"marketingFeePercentage","type":"uint256"},{"internalType":"uint256","name":"devFeePercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"includeInFee","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":"addr","type":"address"}],"name":"isAddressBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFeePercentage","type":"uint256"},{"internalType":"uint256","name":"devFeePercentage","type":"uint256"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPrice","type":"uint256"}],"name":"setExtraSellEthAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuyAmount","type":"uint256"}],"name":"setMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokensSellToAddToLiquidity_","type":"uint256"}],"name":"setNumTokensToSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"sellReflectionFee","type":"uint256"},{"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"superSellOffFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"reflectionBuyFee","type":"uint256"},{"internalType":"uint256","name":"liquidityBuyFee","type":"uint256"},{"internalType":"uint256","name":"sellReflectionFee","type":"uint256"},{"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"largeSellFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405269d3c21bcecceda1000000600755600754600019620000249190620006eb565b60001962000033919062000752565b6008556040518060400160405280600881526020017f5348494244555459000000000000000000000000000000000000000000000000815250600a90805190602001906200008392919062000602565b506040518060400160405280600381526020017f534f440000000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000d192919062000602565b506009600c60006101000a81548160ff021916908360ff1602179055506000600c60016101000a81548160ff021916908315150217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600c60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d60156101000a81548160ff0219169083151502179055506907695a92c20d6fe00000600e55690b1e07dc231427d00000600f5569017b7883c06916600000601055670de0b6b3a7640000601155732ac47c24042154e87c64d41f98130d6a16e4d5d9601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507373281e23f36a5a0a0709a4dc7214053d31056f5a601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620002eb57600080fd5b506000620002fe620005d160201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060085460016000620003b3620005d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016005600062000407620005d960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600560006200046e620005d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506040518060a0016040528060008152602001600c815260200160008152602001600c81526020016000815250601560008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050506040518060400160405280603281526020016032815250601a600082015181600001556020820151816001015590505062000562620005d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600754604051620005c391906200079e565b60405180910390a36200081f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200061090620007ea565b90600052602060002090601f01602090048101928262000634576000855562000680565b82601f106200064f57805160ff191683800117855562000680565b8280016001018555821562000680579182015b828111156200067f57825182559160200191906001019062000662565b5b5090506200068f919062000693565b5090565b5b80821115620006ae57600081600090555060010162000694565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620006f882620006b2565b91506200070583620006b2565b925082620007185762000717620006bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200075f82620006b2565b91506200076c83620006b2565b92508282101562000782576200078162000723565b5b828203905092915050565b6200079881620006b2565b82525050565b6000602082019050620007b560008301846200078d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080357607f821691505b602082108103620008195762000818620007bb565b5b50919050565b615a68806200082f6000396000f3fe6080604052600436106102cd5760003560e01c806375f0a87411610175578063a9059cbb116100dc578063dc0aa9cf11610095578063e7dad4f91161006f578063e7dad4f914610b1a578063f18dba2614610b57578063f2fde38b14610b80578063f34eb0b814610ba9576102d4565b8063dc0aa9cf14610a8b578063dcda6af314610ab4578063dd62ed3e14610add576102d4565b8063a9059cbb14610991578063ab0d8b85146109ce578063b6a99872146109f7578063c49b9a8014610a0e578063d12a768814610a37578063d3f6a15714610a62576102d4565b80638da5cb5b1161012e5780638da5cb5b1461087f5780638ea5220f146108aa57806391142cb3146108d557806395d89b41146109005780639b0e2e861461092b578063a457c2d714610954576102d4565b806375f0a874146107715780637ca2ea441461079c57806385141a77146107c557806385d4787b146107f0578063870d365d146108195780638a5c508514610856576102d4565b8063313ce567116102345780634a74bb02116101ed5780636c0a24eb116101c75780636c0a24eb146106c957806370a08231146106f4578063715018a61461073157806371b9189c14610748576102d4565b80634a74bb02146106355780635342acb4146106605780635ee58efc1461069d576102d4565b8063313ce56714610511578063317d94531461053c57806339509351146105675780633bd5d173146105a45780634549b039146105cd57806349bd5a5e1461060a576102d4565b806313114a9d1161028657806313114a9d146103ed5780631694505e1461041857806318160ddd1461044357806323b872dd1461046e57806327a14fc2146104ab5780632d838119146104d4576102d4565b8063024022f7146102d9578063035ae135146103025780630492f0551461032b57806306fdde0314610356578063095ea7b3146103815780630ddc0976146103be576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b5061030060048036038101906102fb9190614242565b610bd2565b005b34801561030e57600080fd5b5061032960048036038101906103249190614242565b610c77565b005b34801561033757600080fd5b50610340610d1c565b60405161034d91906142a8565b60405180910390f35b34801561036257600080fd5b5061036b610d22565b604051610378919061435c565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190614408565b610db4565b6040516103b59190614463565b60405180910390f35b3480156103ca57600080fd5b506103d3610dd2565b6040516103e495949392919061447e565b60405180910390f35b3480156103f957600080fd5b50610402610df6565b60405161040f91906142a8565b60405180910390f35b34801561042457600080fd5b5061042d610e00565b60405161043a9190614530565b60405180910390f35b34801561044f57600080fd5b50610458610e26565b60405161046591906142a8565b60405180910390f35b34801561047a57600080fd5b506104956004803603810190610490919061454b565b610e30565b6040516104a29190614463565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd919061459e565b610f09565b005b3480156104e057600080fd5b506104fb60048036038101906104f6919061459e565b610fb7565b60405161050891906142a8565b60405180910390f35b34801561051d57600080fd5b50610526611025565b60405161053391906145e7565b60405180910390f35b34801561054857600080fd5b5061055161103c565b60405161055e91906142a8565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190614408565b61104c565b60405161059b9190614463565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c6919061459e565b6110ff565b005b3480156105d957600080fd5b506105f460048036038101906105ef919061462e565b6111ed565b60405161060191906142a8565b60405180910390f35b34801561061657600080fd5b5061061f611271565b60405161062c919061467d565b60405180910390f35b34801561064157600080fd5b5061064a611297565b6040516106579190614463565b60405180910390f35b34801561066c57600080fd5b5061068760048036038101906106829190614698565b6112aa565b6040516106949190614463565b60405180910390f35b3480156106a957600080fd5b506106b2611300565b6040516106c09291906146c5565b60405180910390f35b3480156106d557600080fd5b506106de611312565b6040516106eb91906142a8565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190614698565b611318565b60405161072891906142a8565b60405180910390f35b34801561073d57600080fd5b50610746611369565b005b34801561075457600080fd5b5061076f600480360381019061076a9190614242565b6114bc565b005b34801561077d57600080fd5b50610786611561565b604051610793919061467d565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be919061459e565b611587565b005b3480156107d157600080fd5b506107da611635565b6040516107e7919061467d565b60405180910390f35b3480156107fc57600080fd5b506108176004803603810190610812919061482c565b61165b565b005b34801561082557600080fd5b50610840600480360381019061083b919061459e565b6116fe565b60405161084d91906142a8565b60405180910390f35b34801561086257600080fd5b5061087d6004803603810190610878919061459e565b611941565b005b34801561088b57600080fd5b506108946119e0565b6040516108a1919061467d565b60405180910390f35b3480156108b657600080fd5b506108bf611a09565b6040516108cc919061467d565b60405180910390f35b3480156108e157600080fd5b506108ea611a2f565b6040516108f791906142a8565b60405180910390f35b34801561090c57600080fd5b50610915611a35565b604051610922919061435c565b60405180910390f35b34801561093757600080fd5b50610952600480360381019061094d919061482c565b611ac7565b005b34801561096057600080fd5b5061097b60048036038101906109769190614408565b611b6a565b6040516109889190614463565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b39190614408565b611c37565b6040516109c59190614463565b60405180910390f35b3480156109da57600080fd5b506109f560048036038101906109f09190614242565b611c55565b005b348015610a0357600080fd5b50610a0c611cfa565b005b348015610a1a57600080fd5b50610a356004803603810190610a309190614875565b612000565b005b348015610a4357600080fd5b50610a4c6120e9565b604051610a5991906142a8565b60405180910390f35b348015610a6e57600080fd5b50610a896004803603810190610a8491906148a2565b6120ef565b005b348015610a9757600080fd5b50610ab26004803603810190610aad91906148e2565b61220a565b005b348015610ac057600080fd5b50610adb6004803603810190610ad691906149b3565b6122d8565b005b348015610ae957600080fd5b50610b046004803603810190610aff91906148a2565b612440565b604051610b1191906142a8565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c9190614698565b6124c7565b604051610b4e9190614463565b60405180910390f35b348015610b6357600080fd5b50610b7e6004803603810190610b799190614a34565b61251d565b005b348015610b8c57600080fd5b50610ba76004803603810190610ba29190614698565b61261f565b005b348015610bb557600080fd5b50610bd06004803603810190610bcb919061459e565b6127e0565b005b610bda61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90614ac0565b60405180910390fd5b610c7382826000612896565b5050565b610c7f61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390614ac0565b60405180910390fd5b610d1882826001612941565b5050565b600e5481565b6060600a8054610d3190614b0f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5d90614b0f565b8015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b5050505050905090565b6000610dc8610dc161288e565b84846129ec565b6001905092915050565b60158060000154908060010154908060020154908060030154908060040154905085565b6000600954905090565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b6000610e3d848484612bb5565b610efe84610e4961288e565b610ef9856040518060600160405280602881526020016159e660289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610eaf61288e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134be9092919063ffffffff16565b6129ec565b600190509392505050565b610f1161288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9590614ac0565b60405180910390fd5b633b9aca0081610fae9190614b6f565b600f8190555050565b6000600854821115610ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff590614c3b565b60405180910390fd5b6000611008613522565b905061101d818461354d90919063ffffffff16565b915050919050565b6000600c60009054906101000a900460ff16905090565b600061104730611318565b905090565b60006110f561105961288e565b846110f0856003600061106a61288e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359790919063ffffffff16565b6129ec565b6001905092915050565b600061110961288e565b90506000611116836135f5565b5050505050905061116f81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461365190919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111c78160085461365190919063ffffffff16565b6008819055506111e28360095461359790919063ffffffff16565b600981905550505050565b6000600754831115611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b90614ca7565b60405180910390fd5b81611254576000611244846135f5565b505050505090508091505061126b565b600061125f846135f5565b50505050915050809150505b92915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60159054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601a8060000154908060010154905082565b600f5481565b6000611362600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb7565b9050919050565b61137161288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590614ac0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114c461288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154890614ac0565b60405180910390fd5b61155d82826001612896565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61158f61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161390614ac0565b60405180910390fd5b633b9aca008161162c9190614b6f565b60108190555050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61166361288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790614ac0565b60405180910390fd5b6116fb81600161369b565b50565b600080600267ffffffffffffffff81111561171c5761171b6146ee565b5b60405190808252806020026020018201604052801561174a5781602001602082028036833780820191505090505b509050308160008151811061176257611761614cc7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182d9190614d0b565b8160018151811061184157611840614cc7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b81526004016118d8929190614df6565b600060405180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061191e9190614efe565b60018151811061193157611930614cc7565b5b6020026020010151915050919050565b61194961288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd90614ac0565b60405180910390fd5b8060118190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b6060600b8054611a4490614b0f565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7090614b0f565b8015611abd5780601f10611a9257610100808354040283529160200191611abd565b820191906000526020600020905b815481529060010190602001808311611aa057829003601f168201915b5050505050905090565b611acf61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5390614ac0565b60405180910390fd5b611b6781600061369b565b50565b6000611c2d611b7761288e565b84611c2885604051806060016040528060258152602001615a0e6025913960036000611ba161288e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134be9092919063ffffffff16565b6129ec565b6001905092915050565b6000611c4b611c4461288e565b8484612bb5565b6001905092915050565b611c5d61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190614ac0565b60405180910390fd5b611cf682826000612941565b5050565b611d0261288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8690614ac0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1790614fb9565b60405180910390fd5b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb19190614d0b565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5e9190614d0b565b6040518363ffffffff1660e01b8152600401611f7b929190614fd9565b6020604051808303816000875af1158015611f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbe9190614d0b565b600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61200861288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90614ac0565b60405180910390fd5b80600d60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516120de9190614463565b60405180910390a150565b60105481565b6120f761288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b90614ac0565b60405180910390fd5b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b61221261288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461229f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229690614ac0565b60405180910390fd5b84601560000181905550836015600101819055508160156003018190555082601560020181905550806015600401819055505050505050565b6000600560006122e661288e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236490615074565b60405180910390fd5b8282905085859050146123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90615106565b60405180910390fd5b5b84849050811015612439576124256123cc61288e565b8686848181106123df576123de614cc7565b5b90506020020160208101906123f49190614698565b633b9aca0086868681811061240c5761240b614cc7565b5b9050602002013561241d9190614b6f565b600080613792565b6001816124329190615126565b90506123b6565b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61252561288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a990614ac0565b60405180910390fd5b60646125c7828461359790919063ffffffff16565b14612607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fe906151c8565b60405180910390fd5b81601a6000018190555080601a600101819055505050565b61262761288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90614ac0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a9061525a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6127e861288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286c90614ac0565b60405180910390fd5b633b9aca00816128859190614b6f565b600e8190555050565b600033905090565b60005b8383905081101561293b5760008484838181106128b9576128b8614cc7565b5b90506020020160208101906128ce9190614698565b905082600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806129339061527a565b915050612899565b50505050565b60005b838390508110156129e657600084848381811061296457612963614cc7565b5b90506020020160208101906129799190614698565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806129de9061527a565b915050612944565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5290615334565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac1906153c6565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612ba891906142a8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1b90615458565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a906154ea565b60405180910390fd5b60008111612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd9061557c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5e906155e8565b60405180910390fd5b600080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612e0e5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612e4d5750612e1d6119e0565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612e8c5750612e5c6119e0565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b90506000612eab84612e9d87611318565b61359790919063ffffffff16565b9050612eb56119e0565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612f235750612ef36119e0565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612f7d5750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561306657600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156130265750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305c9061567a565b60405180910390fd5b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061310b5750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561319b57600e54841115613155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314c9061570c565b60405180910390fd5b600f5481111561319a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131919061579e565b60405180910390fd5b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156132465750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b806132f05750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156132ef5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b1561330257600192506133016137d7565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156133ae5750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156134045750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561345a5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156134a95760009150600f548111156134a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349f9061579e565b60405180910390fd5b5b6134b68686868587613792565b505050505050565b6000838311158290613506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fd919061435c565b60405180910390fd5b506000838561351591906157be565b9050809150509392505050565b600080600061352f61382d565b91509150613546818361354d90919063ffffffff16565b9250505090565b600061358f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061387a565b905092915050565b60008082846135a69190615126565b9050838110156135eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e29061583e565b60405180910390fd5b8091505092915050565b600080600080600080600080600061360c8a6138dd565b925092509250600080600061362a8d8686613625613522565b613937565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600061369383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506134be565b905092915050565b60005b825181101561378d5760008382815181106136bc576136bb614cc7565b5b602002602001015190508215613729576001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613779565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b5080806137859061527a565b91505061369e565b505050565b816014806101000a81548160ff02191690831515021790555080601460156101000a81548160ff0219169083151502179055506137d08585856139c0565b5050505050565b60006137e230611318565b905060105481101580156138035750600d60149054906101000a900460ff16155b801561381b5750600d60159054906101000a900460ff165b1561382a5761382981613b8b565b5b50565b600080600060085490506000600754905061385560075460085461354d90919063ffffffff16565b82101561386d57600854600754935093505050613876565b81819350935050505b9091565b600080831182906138c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b8919061435c565b60405180910390fd5b50600083856138d0919061588d565b9050809150509392505050565b6000806000806138ec85613d05565b905060006138f986613d74565b9050600061392282613914858a61365190919063ffffffff16565b61365190919063ffffffff16565b90508083839550955095505050509193909250565b6000806000806139508589613e1590919063ffffffff16565b905060006139678689613e1590919063ffffffff16565b9050600061397e8789613e1590919063ffffffff16565b905060006139a782613999858761365190919063ffffffff16565b61365190919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000806000806000806139d2876135f5565b955095509550955095509550613a3086600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461365190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ac585600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359790919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b1181613e8f565b613b1b8483613f4c565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613b7891906142a8565b60405180910390a3505050505050505050565b6001600d60146101000a81548160ff021916908315150217905550613baf81613f86565b60004790506000613be16064613bd3601a6000015485613e1590919063ffffffff16565b61354d90919063ffffffff16565b90506000613c106064613c02601a6001015486613e1590919063ffffffff16565b61354d90919063ffffffff16565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613c7a573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613ce3573d6000803e3d6000fd5b505050506000600d60146101000a81548160ff02191690831515021790555050565b6000806000905060148054906101000a900460ff1615613d46576015600001549050601460159054906101000a900460ff1615613d455760156002015490505b5b613d6c6064613d5e8386613e1590919063ffffffff16565b61354d90919063ffffffff16565b915050919050565b6000806000905060148054906101000a900460ff1615613de7576015600101549050601460159054906101000a900460ff1615613de65760156003015490506000613dbe846116fe565b90506011548110613de457613de16015600401548361359790919063ffffffff16565b91505b505b5b613e0d6064613dff8386613e1590919063ffffffff16565b61354d90919063ffffffff16565b915050919050565b6000808303613e275760009050613e89565b60008284613e359190614b6f565b9050828482613e44919061588d565b14613e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e7b90615930565b60405180910390fd5b809150505b92915050565b6000613e99613522565b90506000613eb08284613e1590919063ffffffff16565b9050613f0481600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359790919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613f618260085461365190919063ffffffff16565b600881905550613f7c8160095461359790919063ffffffff16565b6009819055505050565b6000600267ffffffffffffffff811115613fa357613fa26146ee565b5b604051908082528060200260200182016040528015613fd15781602001602082028036833780820191505090505b5090503081600081518110613fe957613fe8614cc7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140b49190614d0b565b816001815181106140c8576140c7614cc7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061412f30600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129ec565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161419395949392919061598b565b600060405180830381600087803b1580156141ad57600080fd5b505af11580156141c1573d6000803e3d6000fd5b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112614202576142016141dd565b5b8235905067ffffffffffffffff81111561421f5761421e6141e2565b5b60208301915083602082028301111561423b5761423a6141e7565b5b9250929050565b60008060208385031215614259576142586141d3565b5b600083013567ffffffffffffffff811115614277576142766141d8565b5b614283858286016141ec565b92509250509250929050565b6000819050919050565b6142a28161428f565b82525050565b60006020820190506142bd6000830184614299565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142fd5780820151818401526020810190506142e2565b8381111561430c576000848401525b50505050565b6000601f19601f8301169050919050565b600061432e826142c3565b61433881856142ce565b93506143488185602086016142df565b61435181614312565b840191505092915050565b600060208201905081810360008301526143768184614323565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143a98261437e565b9050919050565b6143b98161439e565b81146143c457600080fd5b50565b6000813590506143d6816143b0565b92915050565b6143e58161428f565b81146143f057600080fd5b50565b600081359050614402816143dc565b92915050565b6000806040838503121561441f5761441e6141d3565b5b600061442d858286016143c7565b925050602061443e858286016143f3565b9150509250929050565b60008115159050919050565b61445d81614448565b82525050565b60006020820190506144786000830184614454565b92915050565b600060a0820190506144936000830188614299565b6144a06020830187614299565b6144ad6040830186614299565b6144ba6060830185614299565b6144c76080830184614299565b9695505050505050565b6000819050919050565b60006144f66144f16144ec8461437e565b6144d1565b61437e565b9050919050565b6000614508826144db565b9050919050565b600061451a826144fd565b9050919050565b61452a8161450f565b82525050565b60006020820190506145456000830184614521565b92915050565b600080600060608486031215614564576145636141d3565b5b6000614572868287016143c7565b9350506020614583868287016143c7565b9250506040614594868287016143f3565b9150509250925092565b6000602082840312156145b4576145b36141d3565b5b60006145c2848285016143f3565b91505092915050565b600060ff82169050919050565b6145e1816145cb565b82525050565b60006020820190506145fc60008301846145d8565b92915050565b61460b81614448565b811461461657600080fd5b50565b60008135905061462881614602565b92915050565b60008060408385031215614645576146446141d3565b5b6000614653858286016143f3565b925050602061466485828601614619565b9150509250929050565b6146778161439e565b82525050565b6000602082019050614692600083018461466e565b92915050565b6000602082840312156146ae576146ad6141d3565b5b60006146bc848285016143c7565b91505092915050565b60006040820190506146da6000830185614299565b6146e76020830184614299565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61472682614312565b810181811067ffffffffffffffff82111715614745576147446146ee565b5b80604052505050565b60006147586141c9565b9050614764828261471d565b919050565b600067ffffffffffffffff821115614784576147836146ee565b5b602082029050602081019050919050565b60006147a86147a384614769565b61474e565b905080838252602082019050602084028301858111156147cb576147ca6141e7565b5b835b818110156147f457806147e088826143c7565b8452602084019350506020810190506147cd565b5050509392505050565b600082601f830112614813576148126141dd565b5b8135614823848260208601614795565b91505092915050565b600060208284031215614842576148416141d3565b5b600082013567ffffffffffffffff8111156148605761485f6141d8565b5b61486c848285016147fe565b91505092915050565b60006020828403121561488b5761488a6141d3565b5b600061489984828501614619565b91505092915050565b600080604083850312156148b9576148b86141d3565b5b60006148c7858286016143c7565b92505060206148d8858286016143c7565b9150509250929050565b600080600080600060a086880312156148fe576148fd6141d3565b5b600061490c888289016143f3565b955050602061491d888289016143f3565b945050604061492e888289016143f3565b935050606061493f888289016143f3565b9250506080614950888289016143f3565b9150509295509295909350565b60008083601f840112614973576149726141dd565b5b8235905067ffffffffffffffff8111156149905761498f6141e2565b5b6020830191508360208202830111156149ac576149ab6141e7565b5b9250929050565b600080600080604085870312156149cd576149cc6141d3565b5b600085013567ffffffffffffffff8111156149eb576149ea6141d8565b5b6149f7878288016141ec565b9450945050602085013567ffffffffffffffff811115614a1a57614a196141d8565b5b614a268782880161495d565b925092505092959194509250565b60008060408385031215614a4b57614a4a6141d3565b5b6000614a59858286016143f3565b9250506020614a6a858286016143f3565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614aaa6020836142ce565b9150614ab582614a74565b602082019050919050565b60006020820190508181036000830152614ad981614a9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b2757607f821691505b602082108103614b3a57614b39614ae0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b7a8261428f565b9150614b858361428f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bbe57614bbd614b40565b5b828202905092915050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614c25602a836142ce565b9150614c3082614bc9565b604082019050919050565b60006020820190508181036000830152614c5481614c18565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614c91601f836142ce565b9150614c9c82614c5b565b602082019050919050565b60006020820190508181036000830152614cc081614c84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614d05816143b0565b92915050565b600060208284031215614d2157614d206141d3565b5b6000614d2f84828501614cf6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614d6d8161439e565b82525050565b6000614d7f8383614d64565b60208301905092915050565b6000602082019050919050565b6000614da382614d38565b614dad8185614d43565b9350614db883614d54565b8060005b83811015614de9578151614dd08882614d73565b9750614ddb83614d8b565b925050600181019050614dbc565b5085935050505092915050565b6000604082019050614e0b6000830185614299565b8181036020830152614e1d8184614d98565b90509392505050565b600067ffffffffffffffff821115614e4157614e406146ee565b5b602082029050602081019050919050565b600081519050614e61816143dc565b92915050565b6000614e7a614e7584614e26565b61474e565b90508083825260208201905060208402830185811115614e9d57614e9c6141e7565b5b835b81811015614ec65780614eb28882614e52565b845260208401935050602081019050614e9f565b5050509392505050565b600082601f830112614ee557614ee46141dd565b5b8151614ef5848260208601614e67565b91505092915050565b600060208284031215614f1457614f136141d3565b5b600082015167ffffffffffffffff811115614f3257614f316141d8565b5b614f3e84828501614ed0565b91505092915050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fa36022836142ce565b9150614fae82614f47565b604082019050919050565b60006020820190508181036000830152614fd281614f96565b9050919050565b6000604082019050614fee600083018561466e565b614ffb602083018461466e565b9392505050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b600061505e602d836142ce565b915061506982615002565b604082019050919050565b6000602082019050818103600083015261508d81615051565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b60006150f0602a836142ce565b91506150fb82615094565b604082019050919050565b6000602082019050818103600083015261511f816150e3565b9050919050565b60006151318261428f565b915061513c8361428f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561517157615170614b40565b5b828201905092915050565b7f4665652070657263656e74616765206d75737420657175616c20313030000000600082015250565b60006151b2601d836142ce565b91506151bd8261517c565b602082019050919050565b600060208201905081810360008301526151e1816151a5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006152446026836142ce565b915061524f826151e8565b604082019050919050565b6000602082019050818103600083015261527381615237565b9050919050565b60006152858261428f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036152b7576152b6614b40565b5b600182019050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061531e6024836142ce565b9150615329826152c2565b604082019050919050565b6000602082019050818103600083015261534d81615311565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006153b06022836142ce565b91506153bb82615354565b604082019050919050565b600060208201905081810360008301526153df816153a3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006154426025836142ce565b915061544d826153e6565b604082019050919050565b6000602082019050818103600083015261547181615435565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006154d46023836142ce565b91506154df82615478565b604082019050919050565b60006020820190508181036000830152615503816154c7565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006155666029836142ce565b91506155718261550a565b604082019050919050565b6000602082019050818103600083015261559581615559565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e207365740000600082015250565b60006155d2601e836142ce565b91506155dd8261559c565b602082019050919050565b60006020820190508181036000830152615601816155c5565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b6000615664602f836142ce565b915061566f82615608565b604082019050919050565b6000602082019050818103600083015261569381615657565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b60006156f66028836142ce565b91506157018261569a565b604082019050919050565b60006020820190508181036000830152615725816156e9565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b60006157886025836142ce565b91506157938261572c565b604082019050919050565b600060208201905081810360008301526157b78161577b565b9050919050565b60006157c98261428f565b91506157d48361428f565b9250828210156157e7576157e6614b40565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615828601b836142ce565b9150615833826157f2565b602082019050919050565b600060208201905081810360008301526158578161581b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158988261428f565b91506158a38361428f565b9250826158b3576158b261585e565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061591a6021836142ce565b9150615925826158be565b604082019050919050565b600060208201905081810360008301526159498161590d565b9050919050565b6000819050919050565b600061597561597061596b84615950565b6144d1565b61428f565b9050919050565b6159858161595a565b82525050565b600060a0820190506159a06000830188614299565b6159ad602083018761597c565b81810360408301526159bf8186614d98565b90506159ce606083018561466e565b6159db6080830184614299565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220559928ecc4108f6ce8e5bd5902cf6e659befb1599c093e08d3d6722a3b5cc17664736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c806375f0a87411610175578063a9059cbb116100dc578063dc0aa9cf11610095578063e7dad4f91161006f578063e7dad4f914610b1a578063f18dba2614610b57578063f2fde38b14610b80578063f34eb0b814610ba9576102d4565b8063dc0aa9cf14610a8b578063dcda6af314610ab4578063dd62ed3e14610add576102d4565b8063a9059cbb14610991578063ab0d8b85146109ce578063b6a99872146109f7578063c49b9a8014610a0e578063d12a768814610a37578063d3f6a15714610a62576102d4565b80638da5cb5b1161012e5780638da5cb5b1461087f5780638ea5220f146108aa57806391142cb3146108d557806395d89b41146109005780639b0e2e861461092b578063a457c2d714610954576102d4565b806375f0a874146107715780637ca2ea441461079c57806385141a77146107c557806385d4787b146107f0578063870d365d146108195780638a5c508514610856576102d4565b8063313ce567116102345780634a74bb02116101ed5780636c0a24eb116101c75780636c0a24eb146106c957806370a08231146106f4578063715018a61461073157806371b9189c14610748576102d4565b80634a74bb02146106355780635342acb4146106605780635ee58efc1461069d576102d4565b8063313ce56714610511578063317d94531461053c57806339509351146105675780633bd5d173146105a45780634549b039146105cd57806349bd5a5e1461060a576102d4565b806313114a9d1161028657806313114a9d146103ed5780631694505e1461041857806318160ddd1461044357806323b872dd1461046e57806327a14fc2146104ab5780632d838119146104d4576102d4565b8063024022f7146102d9578063035ae135146103025780630492f0551461032b57806306fdde0314610356578063095ea7b3146103815780630ddc0976146103be576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b5061030060048036038101906102fb9190614242565b610bd2565b005b34801561030e57600080fd5b5061032960048036038101906103249190614242565b610c77565b005b34801561033757600080fd5b50610340610d1c565b60405161034d91906142a8565b60405180910390f35b34801561036257600080fd5b5061036b610d22565b604051610378919061435c565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190614408565b610db4565b6040516103b59190614463565b60405180910390f35b3480156103ca57600080fd5b506103d3610dd2565b6040516103e495949392919061447e565b60405180910390f35b3480156103f957600080fd5b50610402610df6565b60405161040f91906142a8565b60405180910390f35b34801561042457600080fd5b5061042d610e00565b60405161043a9190614530565b60405180910390f35b34801561044f57600080fd5b50610458610e26565b60405161046591906142a8565b60405180910390f35b34801561047a57600080fd5b506104956004803603810190610490919061454b565b610e30565b6040516104a29190614463565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd919061459e565b610f09565b005b3480156104e057600080fd5b506104fb60048036038101906104f6919061459e565b610fb7565b60405161050891906142a8565b60405180910390f35b34801561051d57600080fd5b50610526611025565b60405161053391906145e7565b60405180910390f35b34801561054857600080fd5b5061055161103c565b60405161055e91906142a8565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190614408565b61104c565b60405161059b9190614463565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c6919061459e565b6110ff565b005b3480156105d957600080fd5b506105f460048036038101906105ef919061462e565b6111ed565b60405161060191906142a8565b60405180910390f35b34801561061657600080fd5b5061061f611271565b60405161062c919061467d565b60405180910390f35b34801561064157600080fd5b5061064a611297565b6040516106579190614463565b60405180910390f35b34801561066c57600080fd5b5061068760048036038101906106829190614698565b6112aa565b6040516106949190614463565b60405180910390f35b3480156106a957600080fd5b506106b2611300565b6040516106c09291906146c5565b60405180910390f35b3480156106d557600080fd5b506106de611312565b6040516106eb91906142a8565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190614698565b611318565b60405161072891906142a8565b60405180910390f35b34801561073d57600080fd5b50610746611369565b005b34801561075457600080fd5b5061076f600480360381019061076a9190614242565b6114bc565b005b34801561077d57600080fd5b50610786611561565b604051610793919061467d565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be919061459e565b611587565b005b3480156107d157600080fd5b506107da611635565b6040516107e7919061467d565b60405180910390f35b3480156107fc57600080fd5b506108176004803603810190610812919061482c565b61165b565b005b34801561082557600080fd5b50610840600480360381019061083b919061459e565b6116fe565b60405161084d91906142a8565b60405180910390f35b34801561086257600080fd5b5061087d6004803603810190610878919061459e565b611941565b005b34801561088b57600080fd5b506108946119e0565b6040516108a1919061467d565b60405180910390f35b3480156108b657600080fd5b506108bf611a09565b6040516108cc919061467d565b60405180910390f35b3480156108e157600080fd5b506108ea611a2f565b6040516108f791906142a8565b60405180910390f35b34801561090c57600080fd5b50610915611a35565b604051610922919061435c565b60405180910390f35b34801561093757600080fd5b50610952600480360381019061094d919061482c565b611ac7565b005b34801561096057600080fd5b5061097b60048036038101906109769190614408565b611b6a565b6040516109889190614463565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b39190614408565b611c37565b6040516109c59190614463565b60405180910390f35b3480156109da57600080fd5b506109f560048036038101906109f09190614242565b611c55565b005b348015610a0357600080fd5b50610a0c611cfa565b005b348015610a1a57600080fd5b50610a356004803603810190610a309190614875565b612000565b005b348015610a4357600080fd5b50610a4c6120e9565b604051610a5991906142a8565b60405180910390f35b348015610a6e57600080fd5b50610a896004803603810190610a8491906148a2565b6120ef565b005b348015610a9757600080fd5b50610ab26004803603810190610aad91906148e2565b61220a565b005b348015610ac057600080fd5b50610adb6004803603810190610ad691906149b3565b6122d8565b005b348015610ae957600080fd5b50610b046004803603810190610aff91906148a2565b612440565b604051610b1191906142a8565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c9190614698565b6124c7565b604051610b4e9190614463565b60405180910390f35b348015610b6357600080fd5b50610b7e6004803603810190610b799190614a34565b61251d565b005b348015610b8c57600080fd5b50610ba76004803603810190610ba29190614698565b61261f565b005b348015610bb557600080fd5b50610bd06004803603810190610bcb919061459e565b6127e0565b005b610bda61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90614ac0565b60405180910390fd5b610c7382826000612896565b5050565b610c7f61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390614ac0565b60405180910390fd5b610d1882826001612941565b5050565b600e5481565b6060600a8054610d3190614b0f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5d90614b0f565b8015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b5050505050905090565b6000610dc8610dc161288e565b84846129ec565b6001905092915050565b60158060000154908060010154908060020154908060030154908060040154905085565b6000600954905090565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b6000610e3d848484612bb5565b610efe84610e4961288e565b610ef9856040518060600160405280602881526020016159e660289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610eaf61288e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134be9092919063ffffffff16565b6129ec565b600190509392505050565b610f1161288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9590614ac0565b60405180910390fd5b633b9aca0081610fae9190614b6f565b600f8190555050565b6000600854821115610ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff590614c3b565b60405180910390fd5b6000611008613522565b905061101d818461354d90919063ffffffff16565b915050919050565b6000600c60009054906101000a900460ff16905090565b600061104730611318565b905090565b60006110f561105961288e565b846110f0856003600061106a61288e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359790919063ffffffff16565b6129ec565b6001905092915050565b600061110961288e565b90506000611116836135f5565b5050505050905061116f81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461365190919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111c78160085461365190919063ffffffff16565b6008819055506111e28360095461359790919063ffffffff16565b600981905550505050565b6000600754831115611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b90614ca7565b60405180910390fd5b81611254576000611244846135f5565b505050505090508091505061126b565b600061125f846135f5565b50505050915050809150505b92915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60159054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601a8060000154908060010154905082565b600f5481565b6000611362600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb7565b9050919050565b61137161288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590614ac0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114c461288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154890614ac0565b60405180910390fd5b61155d82826001612896565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61158f61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161390614ac0565b60405180910390fd5b633b9aca008161162c9190614b6f565b60108190555050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61166361288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790614ac0565b60405180910390fd5b6116fb81600161369b565b50565b600080600267ffffffffffffffff81111561171c5761171b6146ee565b5b60405190808252806020026020018201604052801561174a5781602001602082028036833780820191505090505b509050308160008151811061176257611761614cc7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182d9190614d0b565b8160018151811061184157611840614cc7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b81526004016118d8929190614df6565b600060405180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061191e9190614efe565b60018151811061193157611930614cc7565b5b6020026020010151915050919050565b61194961288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd90614ac0565b60405180910390fd5b8060118190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b6060600b8054611a4490614b0f565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7090614b0f565b8015611abd5780601f10611a9257610100808354040283529160200191611abd565b820191906000526020600020905b815481529060010190602001808311611aa057829003601f168201915b5050505050905090565b611acf61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5390614ac0565b60405180910390fd5b611b6781600061369b565b50565b6000611c2d611b7761288e565b84611c2885604051806060016040528060258152602001615a0e6025913960036000611ba161288e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134be9092919063ffffffff16565b6129ec565b6001905092915050565b6000611c4b611c4461288e565b8484612bb5565b6001905092915050565b611c5d61288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190614ac0565b60405180910390fd5b611cf682826000612941565b5050565b611d0261288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8690614ac0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1790614fb9565b60405180910390fd5b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb19190614d0b565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5e9190614d0b565b6040518363ffffffff1660e01b8152600401611f7b929190614fd9565b6020604051808303816000875af1158015611f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbe9190614d0b565b600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61200861288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90614ac0565b60405180910390fd5b80600d60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516120de9190614463565b60405180910390a150565b60105481565b6120f761288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b90614ac0565b60405180910390fd5b81601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b61221261288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461229f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229690614ac0565b60405180910390fd5b84601560000181905550836015600101819055508160156003018190555082601560020181905550806015600401819055505050505050565b6000600560006122e661288e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236490615074565b60405180910390fd5b8282905085859050146123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90615106565b60405180910390fd5b5b84849050811015612439576124256123cc61288e565b8686848181106123df576123de614cc7565b5b90506020020160208101906123f49190614698565b633b9aca0086868681811061240c5761240b614cc7565b5b9050602002013561241d9190614b6f565b600080613792565b6001816124329190615126565b90506123b6565b5050505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61252561288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a990614ac0565b60405180910390fd5b60646125c7828461359790919063ffffffff16565b14612607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fe906151c8565b60405180910390fd5b81601a6000018190555080601a600101819055505050565b61262761288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90614ac0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a9061525a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6127e861288e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286c90614ac0565b60405180910390fd5b633b9aca00816128859190614b6f565b600e8190555050565b600033905090565b60005b8383905081101561293b5760008484838181106128b9576128b8614cc7565b5b90506020020160208101906128ce9190614698565b905082600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806129339061527a565b915050612899565b50505050565b60005b838390508110156129e657600084848381811061296457612963614cc7565b5b90506020020160208101906129799190614698565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806129de9061527a565b915050612944565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5290615334565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac1906153c6565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612ba891906142a8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1b90615458565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a906154ea565b60405180910390fd5b60008111612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd9061557c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5e906155e8565b60405180910390fd5b600080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612e0e5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612e4d5750612e1d6119e0565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612e8c5750612e5c6119e0565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b90506000612eab84612e9d87611318565b61359790919063ffffffff16565b9050612eb56119e0565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612f235750612ef36119e0565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612f7d5750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561306657600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156130265750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305c9061567a565b60405180910390fd5b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061310b5750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561319b57600e54841115613155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314c9061570c565b60405180910390fd5b600f5481111561319a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131919061579e565b60405180910390fd5b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156132465750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b806132f05750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156132ef5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b5b1561330257600192506133016137d7565b5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156133ae5750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156134045750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561345a5750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156134a95760009150600f548111156134a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349f9061579e565b60405180910390fd5b5b6134b68686868587613792565b505050505050565b6000838311158290613506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fd919061435c565b60405180910390fd5b506000838561351591906157be565b9050809150509392505050565b600080600061352f61382d565b91509150613546818361354d90919063ffffffff16565b9250505090565b600061358f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061387a565b905092915050565b60008082846135a69190615126565b9050838110156135eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e29061583e565b60405180910390fd5b8091505092915050565b600080600080600080600080600061360c8a6138dd565b925092509250600080600061362a8d8686613625613522565b613937565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600061369383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506134be565b905092915050565b60005b825181101561378d5760008382815181106136bc576136bb614cc7565b5b602002602001015190508215613729576001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613779565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b5080806137859061527a565b91505061369e565b505050565b816014806101000a81548160ff02191690831515021790555080601460156101000a81548160ff0219169083151502179055506137d08585856139c0565b5050505050565b60006137e230611318565b905060105481101580156138035750600d60149054906101000a900460ff16155b801561381b5750600d60159054906101000a900460ff165b1561382a5761382981613b8b565b5b50565b600080600060085490506000600754905061385560075460085461354d90919063ffffffff16565b82101561386d57600854600754935093505050613876565b81819350935050505b9091565b600080831182906138c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b8919061435c565b60405180910390fd5b50600083856138d0919061588d565b9050809150509392505050565b6000806000806138ec85613d05565b905060006138f986613d74565b9050600061392282613914858a61365190919063ffffffff16565b61365190919063ffffffff16565b90508083839550955095505050509193909250565b6000806000806139508589613e1590919063ffffffff16565b905060006139678689613e1590919063ffffffff16565b9050600061397e8789613e1590919063ffffffff16565b905060006139a782613999858761365190919063ffffffff16565b61365190919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000806000806000806139d2876135f5565b955095509550955095509550613a3086600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461365190919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ac585600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359790919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b1181613e8f565b613b1b8483613f4c565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613b7891906142a8565b60405180910390a3505050505050505050565b6001600d60146101000a81548160ff021916908315150217905550613baf81613f86565b60004790506000613be16064613bd3601a6000015485613e1590919063ffffffff16565b61354d90919063ffffffff16565b90506000613c106064613c02601a6001015486613e1590919063ffffffff16565b61354d90919063ffffffff16565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613c7a573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613ce3573d6000803e3d6000fd5b505050506000600d60146101000a81548160ff02191690831515021790555050565b6000806000905060148054906101000a900460ff1615613d46576015600001549050601460159054906101000a900460ff1615613d455760156002015490505b5b613d6c6064613d5e8386613e1590919063ffffffff16565b61354d90919063ffffffff16565b915050919050565b6000806000905060148054906101000a900460ff1615613de7576015600101549050601460159054906101000a900460ff1615613de65760156003015490506000613dbe846116fe565b90506011548110613de457613de16015600401548361359790919063ffffffff16565b91505b505b5b613e0d6064613dff8386613e1590919063ffffffff16565b61354d90919063ffffffff16565b915050919050565b6000808303613e275760009050613e89565b60008284613e359190614b6f565b9050828482613e44919061588d565b14613e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e7b90615930565b60405180910390fd5b809150505b92915050565b6000613e99613522565b90506000613eb08284613e1590919063ffffffff16565b9050613f0481600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359790919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613f618260085461365190919063ffffffff16565b600881905550613f7c8160095461359790919063ffffffff16565b6009819055505050565b6000600267ffffffffffffffff811115613fa357613fa26146ee565b5b604051908082528060200260200182016040528015613fd15781602001602082028036833780820191505090505b5090503081600081518110613fe957613fe8614cc7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140b49190614d0b565b816001815181106140c8576140c7614cc7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061412f30600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129ec565b600c60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161419395949392919061598b565b600060405180830381600087803b1580156141ad57600080fd5b505af11580156141c1573d6000803e3d6000fd5b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112614202576142016141dd565b5b8235905067ffffffffffffffff81111561421f5761421e6141e2565b5b60208301915083602082028301111561423b5761423a6141e7565b5b9250929050565b60008060208385031215614259576142586141d3565b5b600083013567ffffffffffffffff811115614277576142766141d8565b5b614283858286016141ec565b92509250509250929050565b6000819050919050565b6142a28161428f565b82525050565b60006020820190506142bd6000830184614299565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142fd5780820151818401526020810190506142e2565b8381111561430c576000848401525b50505050565b6000601f19601f8301169050919050565b600061432e826142c3565b61433881856142ce565b93506143488185602086016142df565b61435181614312565b840191505092915050565b600060208201905081810360008301526143768184614323565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143a98261437e565b9050919050565b6143b98161439e565b81146143c457600080fd5b50565b6000813590506143d6816143b0565b92915050565b6143e58161428f565b81146143f057600080fd5b50565b600081359050614402816143dc565b92915050565b6000806040838503121561441f5761441e6141d3565b5b600061442d858286016143c7565b925050602061443e858286016143f3565b9150509250929050565b60008115159050919050565b61445d81614448565b82525050565b60006020820190506144786000830184614454565b92915050565b600060a0820190506144936000830188614299565b6144a06020830187614299565b6144ad6040830186614299565b6144ba6060830185614299565b6144c76080830184614299565b9695505050505050565b6000819050919050565b60006144f66144f16144ec8461437e565b6144d1565b61437e565b9050919050565b6000614508826144db565b9050919050565b600061451a826144fd565b9050919050565b61452a8161450f565b82525050565b60006020820190506145456000830184614521565b92915050565b600080600060608486031215614564576145636141d3565b5b6000614572868287016143c7565b9350506020614583868287016143c7565b9250506040614594868287016143f3565b9150509250925092565b6000602082840312156145b4576145b36141d3565b5b60006145c2848285016143f3565b91505092915050565b600060ff82169050919050565b6145e1816145cb565b82525050565b60006020820190506145fc60008301846145d8565b92915050565b61460b81614448565b811461461657600080fd5b50565b60008135905061462881614602565b92915050565b60008060408385031215614645576146446141d3565b5b6000614653858286016143f3565b925050602061466485828601614619565b9150509250929050565b6146778161439e565b82525050565b6000602082019050614692600083018461466e565b92915050565b6000602082840312156146ae576146ad6141d3565b5b60006146bc848285016143c7565b91505092915050565b60006040820190506146da6000830185614299565b6146e76020830184614299565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61472682614312565b810181811067ffffffffffffffff82111715614745576147446146ee565b5b80604052505050565b60006147586141c9565b9050614764828261471d565b919050565b600067ffffffffffffffff821115614784576147836146ee565b5b602082029050602081019050919050565b60006147a86147a384614769565b61474e565b905080838252602082019050602084028301858111156147cb576147ca6141e7565b5b835b818110156147f457806147e088826143c7565b8452602084019350506020810190506147cd565b5050509392505050565b600082601f830112614813576148126141dd565b5b8135614823848260208601614795565b91505092915050565b600060208284031215614842576148416141d3565b5b600082013567ffffffffffffffff8111156148605761485f6141d8565b5b61486c848285016147fe565b91505092915050565b60006020828403121561488b5761488a6141d3565b5b600061489984828501614619565b91505092915050565b600080604083850312156148b9576148b86141d3565b5b60006148c7858286016143c7565b92505060206148d8858286016143c7565b9150509250929050565b600080600080600060a086880312156148fe576148fd6141d3565b5b600061490c888289016143f3565b955050602061491d888289016143f3565b945050604061492e888289016143f3565b935050606061493f888289016143f3565b9250506080614950888289016143f3565b9150509295509295909350565b60008083601f840112614973576149726141dd565b5b8235905067ffffffffffffffff8111156149905761498f6141e2565b5b6020830191508360208202830111156149ac576149ab6141e7565b5b9250929050565b600080600080604085870312156149cd576149cc6141d3565b5b600085013567ffffffffffffffff8111156149eb576149ea6141d8565b5b6149f7878288016141ec565b9450945050602085013567ffffffffffffffff811115614a1a57614a196141d8565b5b614a268782880161495d565b925092505092959194509250565b60008060408385031215614a4b57614a4a6141d3565b5b6000614a59858286016143f3565b9250506020614a6a858286016143f3565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614aaa6020836142ce565b9150614ab582614a74565b602082019050919050565b60006020820190508181036000830152614ad981614a9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b2757607f821691505b602082108103614b3a57614b39614ae0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b7a8261428f565b9150614b858361428f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bbe57614bbd614b40565b5b828202905092915050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614c25602a836142ce565b9150614c3082614bc9565b604082019050919050565b60006020820190508181036000830152614c5481614c18565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614c91601f836142ce565b9150614c9c82614c5b565b602082019050919050565b60006020820190508181036000830152614cc081614c84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614d05816143b0565b92915050565b600060208284031215614d2157614d206141d3565b5b6000614d2f84828501614cf6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614d6d8161439e565b82525050565b6000614d7f8383614d64565b60208301905092915050565b6000602082019050919050565b6000614da382614d38565b614dad8185614d43565b9350614db883614d54565b8060005b83811015614de9578151614dd08882614d73565b9750614ddb83614d8b565b925050600181019050614dbc565b5085935050505092915050565b6000604082019050614e0b6000830185614299565b8181036020830152614e1d8184614d98565b90509392505050565b600067ffffffffffffffff821115614e4157614e406146ee565b5b602082029050602081019050919050565b600081519050614e61816143dc565b92915050565b6000614e7a614e7584614e26565b61474e565b90508083825260208201905060208402830185811115614e9d57614e9c6141e7565b5b835b81811015614ec65780614eb28882614e52565b845260208401935050602081019050614e9f565b5050509392505050565b600082601f830112614ee557614ee46141dd565b5b8151614ef5848260208601614e67565b91505092915050565b600060208284031215614f1457614f136141d3565b5b600082015167ffffffffffffffff811115614f3257614f316141d8565b5b614f3e84828501614ed0565b91505092915050565b7f556e69737761705632506169722068617320616c7265616479206265656e207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fa36022836142ce565b9150614fae82614f47565b604082019050919050565b60006020820190508181036000830152614fd281614f96565b9050919050565b6000604082019050614fee600083018561466e565b614ffb602083018461466e565b9392505050565b7f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60008201527f756465642066726f6d2066656500000000000000000000000000000000000000602082015250565b600061505e602d836142ce565b915061506982615002565b604082019050919050565b6000602082019050818103600083015261508d81615051565b9050919050565b7f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260008201527f65207468652073616d6500000000000000000000000000000000000000000000602082015250565b60006150f0602a836142ce565b91506150fb82615094565b604082019050919050565b6000602082019050818103600083015261511f816150e3565b9050919050565b60006151318261428f565b915061513c8361428f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561517157615170614b40565b5b828201905092915050565b7f4665652070657263656e74616765206d75737420657175616c20313030000000600082015250565b60006151b2601d836142ce565b91506151bd8261517c565b602082019050919050565b600060208201905081810360008301526151e1816151a5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006152446026836142ce565b915061524f826151e8565b604082019050919050565b6000602082019050818103600083015261527381615237565b9050919050565b60006152858261428f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036152b7576152b6614b40565b5b600182019050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061531e6024836142ce565b9150615329826152c2565b604082019050919050565b6000602082019050818103600083015261534d81615311565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006153b06022836142ce565b91506153bb82615354565b604082019050919050565b600060208201905081810360008301526153df816153a3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006154426025836142ce565b915061544d826153e6565b604082019050919050565b6000602082019050818103600083015261547181615435565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006154d46023836142ce565b91506154df82615478565b604082019050919050565b60006020820190508181036000830152615503816154c7565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006155666029836142ce565b91506155718261550a565b604082019050919050565b6000602082019050818103600083015261559581615559565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e207365740000600082015250565b60006155d2601e836142ce565b91506155dd8261559c565b602082019050919050565b60006020820190508181036000830152615601816155c5565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b6000615664602f836142ce565b915061566f82615608565b604082019050919050565b6000602082019050818103600083015261569381615657565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b60006156f66028836142ce565b91506157018261569a565b604082019050919050565b60006020820190508181036000830152615725816156e9565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b60006157886025836142ce565b91506157938261572c565b604082019050919050565b600060208201905081810360008301526157b78161577b565b9050919050565b60006157c98261428f565b91506157d48361428f565b9250828210156157e7576157e6614b40565b5b828203905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615828601b836142ce565b9150615833826157f2565b602082019050919050565b600060208201905081810360008301526158578161581b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158988261428f565b91506158a38361428f565b9250826158b3576158b261585e565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061591a6021836142ce565b9150615925826158be565b604082019050919050565b600060208201905081810360008301526159498161590d565b9050919050565b6000819050919050565b600061597561597061596b84615950565b6144d1565b61428f565b9050919050565b6159858161595a565b82525050565b600060a0820190506159a06000830188614299565b6159ad602083018761597c565b81810360408301526159bf8186614d98565b90506159ce606083018561466e565b6159db6080830184614299565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220559928ecc4108f6ce8e5bd5902cf6e659befb1599c093e08d3d6722a3b5cc17664736f6c634300080d0033

Deployed Bytecode Sourcemap

17353:17717:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23561:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23687:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18713:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19966:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20818:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19582:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;21811:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18477:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20243:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20987:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24947:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23173:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20152:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26986:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21308:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22432:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22729:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18590:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18666:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30624:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19611:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;18773:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20346:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16195:148;;;;;;;;;;;;;:::i;:::-;;23434:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18974:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25877:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19132:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26357:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30346:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23949:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15559:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19056:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18911:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20057:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26493:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21534:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20492:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23816:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24063:256;;;;;;;;;;;;;:::i;:::-;;27112:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18836:68;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26061:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25088:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21906:518;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20667:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26240:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25525:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16498:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24816:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23561:118;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23641:30:::1;23654:9;;23665:5;23641:12;:30::i;:::-;23561:118:::0;;:::o;23687:121::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23766:34:::1;23784:9;;23795:4;23766:17;:34::i;:::-;23687:121:::0;;:::o;18713:53::-;;;;:::o;19966:83::-;20003:13;20036:5;20029:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19966:83;:::o;20818:161::-;20893:4;20910:39;20919:12;:10;:12::i;:::-;20933:7;20942:6;20910:8;:39::i;:::-;20967:4;20960:11;;20818:161;;;;:::o;19582:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21811:87::-;21853:7;21880:10;;21873:17;;21811:87;:::o;18477:106::-;;;;;;;;;;;;;:::o;20243:95::-;20296:7;20323;;20316:14;;20243:95;:::o;20987:313::-;21085:4;21102:36;21112:6;21120:9;21131:6;21102:9;:36::i;:::-;21149:121;21158:6;21166:12;:10;:12::i;:::-;21180:89;21218:6;21180:89;;;;;;;;;;;;;;;;;:11;:19;21192:6;21180:19;;;;;;;;;;;;;;;:33;21200:12;:10;:12::i;:::-;21180:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;21149:8;:121::i;:::-;21288:4;21281:11;;20987:313;;;;;:::o;24947:135::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25069:5:::1;25051:15;:23;;;;:::i;:::-;25032:16;:42;;;;24947:135:::0;:::o;23173:253::-;23239:7;23278;;23267;:18;;23259:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23343:19;23366:10;:8;:10::i;:::-;23343:33;;23394:24;23406:11;23394:7;:11;;:24;;;;:::i;:::-;23387:31;;;23173:253;;;:::o;20152:83::-;20193:5;20218:9;;;;;;;;;;;20211:16;;20152:83;:::o;26986:115::-;27042:7;27069:24;27087:4;27069:9;:24::i;:::-;27062:31;;26986:115;:::o;21308:218::-;21396:4;21413:83;21422:12;:10;:12::i;:::-;21436:7;21445:50;21484:10;21445:11;:25;21457:12;:10;:12::i;:::-;21445:25;;;;;;;;;;;;;;;:34;21471:7;21445:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;21413:8;:83::i;:::-;21514:4;21507:11;;21308:218;;;;:::o;22432:289::-;22484:14;22501:12;:10;:12::i;:::-;22484:29;;22525:15;22549:19;22560:7;22549:10;:19::i;:::-;22524:44;;;;;;;22597:28;22617:7;22597;:15;22605:6;22597:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;22579:7;:15;22587:6;22579:15;;;;;;;;;;;;;;;:46;;;;22646:20;22658:7;22646;;:11;;:20;;;;:::i;:::-;22636:7;:30;;;;22690:23;22705:7;22690:10;;:14;;:23;;;;:::i;:::-;22677:10;:36;;;;22473:248;;22432:289;:::o;22729:436::-;22819:7;22858;;22847;:18;;22839:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22917:17;22912:246;;22952:15;22976:19;22987:7;22976:10;:19::i;:::-;22951:44;;;;;;;23017:7;23010:14;;;;;22912:246;23059:23;23090:19;23101:7;23090:10;:19::i;:::-;23057:52;;;;;;;23131:15;23124:22;;;22729:436;;;;;:::o;18590:41::-;;;;;;;;;;;;;:::o;18666:40::-;;;;;;;;;;;;;:::o;30624:123::-;30688:4;30712:18;:27;30731:7;30712:27;;;;;;;;;;;;;;;;;;;;;;;;;30705:34;;30624:123;;;:::o;19611:32::-;;;;;;;;;;;;;;:::o;18773:56::-;;;;:::o;20346:138::-;20412:7;20439:37;20459:7;:16;20467:7;20459:16;;;;;;;;;;;;;;;;20439:19;:37::i;:::-;20432:44;;20346:138;;;:::o;16195:148::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16302:1:::1;16265:40;;16286:6;::::0;::::1;;;;;;;;16265:40;;;;;;;;;;;;16333:1;16316:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;16195:148::o:0;23434:119::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23516:29:::1;23529:9;;23540:4;23516:12;:29::i;:::-;23434:119:::0;;:::o;18974:75::-;;;;;;;;;;;;;:::o;25877:176::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26040:5:::1;26007:30;:38;;;;:::i;:::-;25975:29;:70;;;;25877:176:::0;:::o;19132:70::-;;;;;;;;;;;;;:::o;26357:128::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26441:36:::1;26461:9;26472:4;26441:19;:36::i;:::-;26357:128:::0;:::o;30346:272::-;30406:4;30424:21;30462:1;30448:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30424:40;;30493:4;30475;30480:1;30475:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;30519:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30509:4;30514:1;30509:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;30559:15;;;;;;;;;;;:29;;;30589:11;30602:4;30559:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30608:1;30559:51;;;;;;;;:::i;:::-;;;;;;;;30552:58;;;30346:272;;;:::o;23949:108::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24041:8:::1;24025:13;:24;;;;23949:108:::0;:::o;15559:79::-;15597:7;15624:6;;;;;;;;;;;15617:13;;15559:79;:::o;19056:69::-;;;;;;;;;;;;;:::o;18911:47::-;;;;:::o;20057:87::-;20096:13;20129:7;20122:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20057:87;:::o;26493:131::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26579:37:::1;26599:9;26610:5;26579:19;:37::i;:::-;26493:131:::0;:::o;21534:269::-;21627:4;21644:129;21653:12;:10;:12::i;:::-;21667:7;21676:96;21715:15;21676:96;;;;;;;;;;;;;;;;;:11;:25;21688:12;:10;:12::i;:::-;21676:25;;;;;;;;;;;;;;;:34;21702:7;21676:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;21644:8;:129::i;:::-;21791:4;21784:11;;21534:269;;;;:::o;20492:167::-;20570:4;20587:42;20597:12;:10;:12::i;:::-;20611:9;20622:6;20587:9;:42::i;:::-;20647:4;20640:11;;20492:167;;;;:::o;23816:125::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23898:35:::1;23916:9;;23927:5;23898:17;:35::i;:::-;23816:125:::0;;:::o;24063:256::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24150:1:::1;24125:27;;:13;;;;;;;;;;;:27;;;24117:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24235:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24217:55;;;24281:4;24288:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24217:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24201:13;;:110;;;;;;;;;;;;;;;;;;24063:256::o:0;27112:171::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27213:8:::1;27189:21;;:32;;;;;;;;;;;;;;;;;;27237:38;27266:8;27237:38;;;;;;:::i;:::-;;;;;;;;27112:171:::0;:::o;18836:68::-;;;;:::o;26061:171::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26175:16:::1;26157:15;;:34;;;;;;;;;;;;;;;;;;26214:10;26202:9;;:22;;;;;;;;;;;;;;;;;;26061:171:::0;;:::o;25088:429::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25288:13:::1;25261:7;:24;;:40;;;;25338:12;25312:7;:23;;:38;;;;25388:16;25361:7;:24;;:43;;;;25443:17;25415:7;:25;;:45;;;;25494:15;25471:7;:20;;:38;;;;25088:429:::0;;;;;:::o;21906:518::-;22003:16;22042:18;:32;22061:12;:10;:12::i;:::-;22042:32;;;;;;;;;;;;;;;;;;;;;;;;;22034:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;22164:7;;:14;;22143:10;;:17;;:35;22135:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;22236:181;22253:10;;:17;;22242:8;:28;22236:181;;;22286:91;22301:12;:10;:12::i;:::-;22315:10;;22326:8;22315:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22357:5;22337:7;;22345:8;22337:17;;;;;;;:::i;:::-;;;;;;;;:25;;;;:::i;:::-;22364:5;22371;22286:14;:91::i;:::-;22404:1;22392:13;;;;;:::i;:::-;;;22236:181;;;21992:432;21906:518;;;;:::o;20667:143::-;20748:7;20775:11;:18;20787:5;20775:18;;;;;;;;;;;;;;;:27;20794:7;20775:27;;;;;;;;;;;;;;;;20768:34;;20667:143;;;;:::o;26240:109::-;26301:4;26325:10;:16;26336:4;26325:16;;;;;;;;;;;;;;;;;;;;;;;;;26318:23;;26240:109;;;:::o;25525:344::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25694:3:::1;25646:44;25673:16;25646:22;:26;;:44;;;;:::i;:::-;:51;25638:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;25780:22;25742:12;:35;;:60;;;;25845:16;25813:12;:29;;:48;;;;25525:344:::0;;:::o;16498:244::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16607:1:::1;16587:22;;:8;:22;;::::0;16579:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16697:8;16668:38;;16689:6;::::0;::::1;;;;;;;;16668:38;;;;;;;;;;;;16726:8;16717:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;16498:244:::0;:::o;24816:123::-;15781:12;:10;:12::i;:::-;15771:22;;:6;;;;;;;;;;:22;;;15763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24926:5:::1;24911:12;:20;;;;:::i;:::-;24895:13;:36;;;;24816:123:::0;:::o;8051:98::-;8104:7;8131:10;8124:17;;8051:98;:::o;24572:236::-;24659:9;24654:147;24678:9;;:16;;24674:1;:20;24654:147;;;24716:12;24731:9;;24741:1;24731:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24716:27;;24785:4;24758:18;:24;24777:4;24758:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;24701:100;24696:3;;;;;:::i;:::-;;;;24654:147;;;;24572:236;;;:::o;24325:239::-;24417:9;24412:145;24436:9;;:16;;24432:1;:20;24412:145;;;24474:12;24489:9;;24499:1;24489:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;24474:27;;24541:4;24516:16;:22;24533:4;24516:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24459:98;24454:3;;;;;:::i;:::-;;;;24412:145;;;;24325:239;;;:::o;30755:337::-;30865:1;30848:19;;:5;:19;;;30840:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30946:1;30927:21;;:7;:21;;;30919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31030:6;31000:11;:18;31012:5;31000:18;;;;;;;;;;;;;;;:27;31019:7;31000:27;;;;;;;;;;;;;;;:36;;;;31068:7;31052:32;;31061:5;31052:32;;;31077:6;31052:32;;;;;;:::i;:::-;;;;;;;;30755:337;;;:::o;31100:1702::-;31204:1;31188:18;;:4;:18;;;31180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31281:1;31267:16;;:2;:16;;;31259:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31351:1;31342:6;:10;31334:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31442:1;31417:27;;:13;;;;;;;;;;;:27;;;31409:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;31489:11;31519:13;31536:18;:24;31555:4;31536:24;;;;;;;;;;;;;;;;;;;;;;;;;31535:25;:52;;;;;31565:18;:22;31584:2;31565:22;;;;;;;;;;;;;;;;;;;;;;;;;31564:23;31535:52;:71;;;;;31599:7;:5;:7::i;:::-;31591:15;;:4;:15;;;;31535:71;:88;;;;;31616:7;:5;:7::i;:::-;31610:13;;:2;:13;;;;31535:88;31519:104;;31634:21;31658:25;31676:6;31658:13;31668:2;31658:9;:13::i;:::-;:17;;:25;;;;:::i;:::-;31634:49;;31794:7;:5;:7::i;:::-;31786:15;;:4;:15;;;;:32;;;;;31811:7;:5;:7::i;:::-;31805:13;;:2;:13;;;;31786:32;:52;;;;;31828:10;;;;;;;;;;;31822:16;;:2;:16;;;;31786:52;31783:180;;;31864:10;:16;31875:4;31864:16;;;;;;;;;;;;;;;;;;;;;;;;;31863:17;:36;;;;;31885:10;:14;31896:2;31885:14;;;;;;;;;;;;;;;;;;;;;;;;;31884:15;31863:36;31855:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;31783:180;31984:13;;;;;;;;;;;31976:21;;:4;:21;;;:47;;;;32001:16;:22;32018:4;32001:22;;;;;;;;;;;;;;;;;;;;;;;;;31976:47;31973:257;;;32058:13;;32048:6;:23;;32040:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32160:16;;32143:13;:33;;32135:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;31973:257;32251:13;;;;;;;;;;;32243:21;;:4;:21;;;;:44;;;;;32274:13;;;;;;;;;;;32268:19;;:2;:19;;;32243:44;:97;;;;32293:16;:22;32310:4;32293:22;;;;;;;;;;;;;;;;;;;;;;;;;32292:23;:47;;;;;32319:16;:20;32336:2;32319:20;;;;;;;;;;;;;;;;;;;;;;;;;32292:47;32243:97;32240:242;;;32436:4;32427:13;;32455:15;:13;:15::i;:::-;32240:242;32503:13;;;;;;;;;;;32495:21;;:4;:21;;;;:44;;;;;32526:13;;;;;;;;;;;32520:19;;:2;:19;;;;32495:44;:71;;;;;32544:16;:22;32561:4;32544:22;;;;;;;;;;;;;;;;;;;;;;;;;32543:23;32495:71;:96;;;;;32571:16;:20;32588:2;32571:20;;;;;;;;;;;;;;;;;;;;;;;;;32570:21;32495:96;32492:242;;;32619:5;32608:16;;32664;;32647:13;:33;;32639:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;32492:242;32744:50;32759:4;32765:2;32769:6;32777:8;32787:6;32744:14;:50::i;:::-;31169:1633;;;31100:1702;;;:::o;4382:192::-;4468:7;4501:1;4496;:6;;4504:12;4488:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4528:9;4544:1;4540;:5;;;;:::i;:::-;4528:17;;4565:1;4558:8;;;4382:192;;;;;:::o;28685:163::-;28726:7;28747:15;28764;28783:19;:17;:19::i;:::-;28746:56;;;;28820:20;28832:7;28820;:11;;:20;;;;:::i;:::-;28813:27;;;;28685:163;:::o;5780:132::-;5838:7;5865:39;5869:1;5872;5865:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5858:46;;5780:132;;;;:::o;3479:181::-;3537:7;3557:9;3573:1;3569;:5;;;;:::i;:::-;3557:17;;3598:1;3593;:6;;3585:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3651:1;3644:8;;;3479:181;;;;:::o;27483:419::-;27542:7;27551;27560;27569;27578;27587;27608:23;27633:12;27647:18;27669:20;27681:7;27669:11;:20::i;:::-;27607:82;;;;;;27701:15;27718:23;27743:12;27759:50;27771:7;27780:4;27786:10;27798;:8;:10::i;:::-;27759:11;:50::i;:::-;27700:109;;;;;;27828:7;27837:15;27854:4;27860:15;27877:4;27883:10;27820:74;;;;;;;;;;;;;;;;;;27483:419;;;;;;;:::o;3943:136::-;4001:7;4028:43;4032:1;4035;4028:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4021:50;;3943:136;;;;:::o;26632:346::-;26727:9;26722:249;26746:9;:16;26742:1;:20;26722:249;;;26784:12;26799:9;26809:1;26799:12;;;;;;;;:::i;:::-;;;;;;;;26784:27;;26829:7;26826:134;;;26876:4;26857:10;:16;26868:4;26857:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;26826:134;;;26928:10;:16;26939:4;26928:16;;;;;;;;;;;;;;;;26921:23;;;;;;;;;;;26826:134;26769:202;26764:3;;;;;:::i;:::-;;;;26722:249;;;;26632:346;;:::o;34320:235::-;34455:8;34442:10;;:21;;;;;;;;;;;;;;;;;;34486:6;34474:9;;:18;;;;;;;;;;;;;;;;;;34503:44;34521:6;34529:9;34540:6;34503:17;:44::i;:::-;34320:235;;;;;:::o;32810:340::-;32854:28;32885:24;32903:4;32885:9;:24::i;:::-;32854:55;;32948:29;;32924:20;:53;;:74;;;;;32982:16;;;;;;;;;;;32981:17;32924:74;:99;;;;;33002:21;;;;;;;;;;;32924:99;32920:223;;;33093:38;33110:20;33093:16;:38::i;:::-;32920:223;32843:307;32810:340::o;28856:256::-;28906:7;28915;28935:15;28953:7;;28935:25;;28971:15;28989:7;;28971:25;;29021:20;29033:7;;29021;;:11;;:20;;;;:::i;:::-;29011:7;:30;29007:61;;;29051:7;;29060;;29043:25;;;;;;;;29007:61;29087:7;29096;29079:25;;;;;;28856:256;;;:::o;6408:278::-;6494:7;6526:1;6522;:5;6529:12;6514:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6553:9;6569:1;6565;:5;;;;:::i;:::-;6553:17;;6677:1;6670:8;;;6408:278;;;;;:::o;27910:330::-;27970:7;27979;27988;28008:12;28023:24;28039:7;28023:15;:24::i;:::-;28008:39;;28058:18;28079:30;28101:7;28079:21;:30::i;:::-;28058:51;;28120:23;28146:33;28168:10;28146:17;28158:4;28146:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;28120:59;;28198:15;28215:4;28221:10;28190:42;;;;;;;;;27910:330;;;;;:::o;28248:429::-;28363:7;28372;28381;28401:15;28419:24;28431:11;28419:7;:11;;:24;;;;:::i;:::-;28401:42;;28454:12;28469:21;28478:11;28469:4;:8;;:21;;;;:::i;:::-;28454:36;;28501:18;28522:27;28537:11;28522:10;:14;;:27;;;;:::i;:::-;28501:48;;28560:23;28586:33;28608:10;28586:17;28598:4;28586:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;28560:59;;28638:7;28647:15;28664:4;28630:39;;;;;;;;;;28248:429;;;;;;;;:::o;34563:502::-;34662:15;34679:23;34704:12;34718:23;34743:12;34757:18;34779:19;34790:7;34779:10;:19::i;:::-;34661:137;;;;;;;;;;;;34827:28;34847:7;34827;:15;34835:6;34827:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;34809:7;:15;34817:6;34809:15;;;;;;;;;;;;;;;:46;;;;34887:39;34910:15;34887:7;:18;34895:9;34887:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;34866:7;:18;34874:9;34866:18;;;;;;;;;;;;;;;:60;;;;34937:26;34952:10;34937:14;:26::i;:::-;34974:23;34986:4;34992;34974:11;:23::i;:::-;35030:9;35013:44;;35022:6;35013:44;;;35041:15;35013:44;;;;;;:::i;:::-;;;;;;;;34650:415;;;;;;34563:502;;;:::o;33158:488::-;17714:4;17695:16;;:23;;;;;;;;;;;;;;;;;;33245:38:::1;33262:20;33245:16;:38::i;:::-;33294:22;33319:21;33294:46;;33351:22;33376:64;33436:3;33376:55;33395:12;:35;;;33376:14;:18;;:55;;;;:::i;:::-;:59;;:64;;;;:::i;:::-;33351:89;;33451:16;33470:58;33524:3;33470:49;33489:12;:29;;;33470:14;:18;;:49;;;;:::i;:::-;:53;;:58;;;;:::i;:::-;33451:77;;33547:15;;;;;;;;;;;33539:33;;:49;33573:14;33539:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;33607:9;;;;;;;;;;;33599:27;;:37;33627:8;33599:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;33234:412;;;17760:5:::0;17741:16;;:24;;;;;;;;;;;;;;;;;;33158:488;:::o;29365:368::-;29429:7;29449:21;29473:1;29449:25;;29488:10;;;;;;;;;;29485:186;;;29531:7;:24;;;29515:40;;29573:9;;;;;;;;;;;29570:90;;;29619:7;:25;;;29603:41;;29570:90;29485:186;29688:37;29719:5;29688:26;29700:13;29688:7;:11;;:26;;;;:::i;:::-;:30;;:37;;;;:::i;:::-;29681:44;;;29365:368;;;:::o;29741:597::-;29811:7;29831:25;29859:1;29831:29;;29874:10;;;;;;;;;;29871:401;;;29921:7;:23;;;29901:43;;29962:9;;;;;;;;;;;29959:302;;;30012:7;:24;;;29992:44;;30055:13;30071:20;30083:7;30071:11;:20::i;:::-;30055:36;;30125:13;;30113:8;:25;30110:136;;30183:43;30205:7;:20;;;30183:17;:21;;:43;;;;:::i;:::-;30163:63;;30110:136;29973:288;29959:302;29871:401;30289:41;30324:5;30289:30;30301:17;30289:7;:11;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;30282:48;;;29741:597;;;:::o;4833:471::-;4891:7;5141:1;5136;:6;5132:47;;5166:1;5159:8;;;;5132:47;5191:9;5207:1;5203;:5;;;;:::i;:::-;5191:17;;5236:1;5231;5227;:5;;;;:::i;:::-;:10;5219:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;5295:1;5288:8;;;4833:471;;;;;:::o;29120:237::-;29183:19;29206:10;:8;:10::i;:::-;29183:33;;29227:18;29248:27;29263:11;29248:10;:14;;:27;;;;:::i;:::-;29227:48;;29311:38;29338:10;29311:7;:22;29327:4;29311:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;29286:7;:22;29302:4;29286:22;;;;;;;;;;;;;;;:63;;;;29172:185;;29120:237;:::o;27328:147::-;27406:17;27418:4;27406:7;;:11;;:17;;;;:::i;:::-;27396:7;:27;;;;27447:20;27462:4;27447:10;;:14;;:20;;;;:::i;:::-;27434:10;:33;;;;27328:147;;:::o;33654:585::-;33780:21;33818:1;33804:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33780:40;;33849:4;33831;33836:1;33831:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;33875:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33865:4;33870:1;33865:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;33908:62;33925:4;33940:15;;;;;;;;;;;33958:11;33908:8;:62::i;:::-;34007:15;;;;;;;;;;;:66;;;34088:11;34114:1;34158:4;34185;34205:15;34007:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33709:530;33654:585;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1294:559::-;1380:6;1388;1437:2;1425:9;1416:7;1412:23;1408:32;1405:119;;;1443:79;;:::i;:::-;1405:119;1591:1;1580:9;1576:17;1563:31;1621:18;1613:6;1610:30;1607:117;;;1643:79;;:::i;:::-;1607:117;1756:80;1828:7;1819:6;1808:9;1804:22;1756:80;:::i;:::-;1738:98;;;;1534:312;1294:559;;;;;:::o;1859:77::-;1896:7;1925:5;1914:16;;1859:77;;;:::o;1942:118::-;2029:24;2047:5;2029:24;:::i;:::-;2024:3;2017:37;1942:118;;:::o;2066:222::-;2159:4;2197:2;2186:9;2182:18;2174:26;;2210:71;2278:1;2267:9;2263:17;2254:6;2210:71;:::i;:::-;2066:222;;;;:::o;2294:99::-;2346:6;2380:5;2374:12;2364:22;;2294:99;;;:::o;2399:169::-;2483:11;2517:6;2512:3;2505:19;2557:4;2552:3;2548:14;2533:29;;2399:169;;;;:::o;2574:307::-;2642:1;2652:113;2666:6;2663:1;2660:13;2652:113;;;2751:1;2746:3;2742:11;2736:18;2732:1;2727:3;2723:11;2716:39;2688:2;2685:1;2681:10;2676:15;;2652:113;;;2783:6;2780:1;2777:13;2774:101;;;2863:1;2854:6;2849:3;2845:16;2838:27;2774:101;2623:258;2574:307;;;:::o;2887:102::-;2928:6;2979:2;2975:7;2970:2;2963:5;2959:14;2955:28;2945:38;;2887:102;;;:::o;2995:364::-;3083:3;3111:39;3144:5;3111:39;:::i;:::-;3166:71;3230:6;3225:3;3166:71;:::i;:::-;3159:78;;3246:52;3291:6;3286:3;3279:4;3272:5;3268:16;3246:52;:::i;:::-;3323:29;3345:6;3323:29;:::i;:::-;3318:3;3314:39;3307:46;;3087:272;2995:364;;;;:::o;3365:313::-;3478:4;3516:2;3505:9;3501:18;3493:26;;3565:9;3559:4;3555:20;3551:1;3540:9;3536:17;3529:47;3593:78;3666:4;3657:6;3593:78;:::i;:::-;3585:86;;3365:313;;;;:::o;3684:126::-;3721:7;3761:42;3754:5;3750:54;3739:65;;3684:126;;;:::o;3816:96::-;3853:7;3882:24;3900:5;3882:24;:::i;:::-;3871:35;;3816:96;;;:::o;3918:122::-;3991:24;4009:5;3991:24;:::i;:::-;3984:5;3981:35;3971:63;;4030:1;4027;4020:12;3971:63;3918:122;:::o;4046:139::-;4092:5;4130:6;4117:20;4108:29;;4146:33;4173:5;4146:33;:::i;:::-;4046:139;;;;:::o;4191:122::-;4264:24;4282:5;4264:24;:::i;:::-;4257:5;4254:35;4244:63;;4303:1;4300;4293:12;4244:63;4191:122;:::o;4319:139::-;4365:5;4403:6;4390:20;4381:29;;4419:33;4446:5;4419:33;:::i;:::-;4319:139;;;;:::o;4464:474::-;4532:6;4540;4589:2;4577:9;4568:7;4564:23;4560:32;4557:119;;;4595:79;;:::i;:::-;4557:119;4715:1;4740:53;4785:7;4776:6;4765:9;4761:22;4740:53;:::i;:::-;4730:63;;4686:117;4842:2;4868:53;4913:7;4904:6;4893:9;4889:22;4868:53;:::i;:::-;4858:63;;4813:118;4464:474;;;;;:::o;4944:90::-;4978:7;5021:5;5014:13;5007:21;4996:32;;4944:90;;;:::o;5040:109::-;5121:21;5136:5;5121:21;:::i;:::-;5116:3;5109:34;5040:109;;:::o;5155:210::-;5242:4;5280:2;5269:9;5265:18;5257:26;;5293:65;5355:1;5344:9;5340:17;5331:6;5293:65;:::i;:::-;5155:210;;;;:::o;5371:664::-;5576:4;5614:3;5603:9;5599:19;5591:27;;5628:71;5696:1;5685:9;5681:17;5672:6;5628:71;:::i;:::-;5709:72;5777:2;5766:9;5762:18;5753:6;5709:72;:::i;:::-;5791;5859:2;5848:9;5844:18;5835:6;5791:72;:::i;:::-;5873;5941:2;5930:9;5926:18;5917:6;5873:72;:::i;:::-;5955:73;6023:3;6012:9;6008:19;5999:6;5955:73;:::i;:::-;5371:664;;;;;;;;:::o;6041:60::-;6069:3;6090:5;6083:12;;6041:60;;;:::o;6107:142::-;6157:9;6190:53;6208:34;6217:24;6235:5;6217:24;:::i;:::-;6208:34;:::i;:::-;6190:53;:::i;:::-;6177:66;;6107:142;;;:::o;6255:126::-;6305:9;6338:37;6369:5;6338:37;:::i;:::-;6325:50;;6255:126;;;:::o;6387:152::-;6463:9;6496:37;6527:5;6496:37;:::i;:::-;6483:50;;6387:152;;;:::o;6545:183::-;6658:63;6715:5;6658:63;:::i;:::-;6653:3;6646:76;6545:183;;:::o;6734:274::-;6853:4;6891:2;6880:9;6876:18;6868:26;;6904:97;6998:1;6987:9;6983:17;6974:6;6904:97;:::i;:::-;6734:274;;;;:::o;7014:619::-;7091:6;7099;7107;7156:2;7144:9;7135:7;7131:23;7127:32;7124:119;;;7162:79;;:::i;:::-;7124:119;7282:1;7307:53;7352:7;7343:6;7332:9;7328:22;7307:53;:::i;:::-;7297:63;;7253:117;7409:2;7435:53;7480:7;7471:6;7460:9;7456:22;7435:53;:::i;:::-;7425:63;;7380:118;7537:2;7563:53;7608:7;7599:6;7588:9;7584:22;7563:53;:::i;:::-;7553:63;;7508:118;7014:619;;;;;:::o;7639:329::-;7698:6;7747:2;7735:9;7726:7;7722:23;7718:32;7715:119;;;7753:79;;:::i;:::-;7715:119;7873:1;7898:53;7943:7;7934:6;7923:9;7919:22;7898:53;:::i;:::-;7888:63;;7844:117;7639:329;;;;:::o;7974:86::-;8009:7;8049:4;8042:5;8038:16;8027:27;;7974:86;;;:::o;8066:112::-;8149:22;8165:5;8149:22;:::i;:::-;8144:3;8137:35;8066:112;;:::o;8184:214::-;8273:4;8311:2;8300:9;8296:18;8288:26;;8324:67;8388:1;8377:9;8373:17;8364:6;8324:67;:::i;:::-;8184:214;;;;:::o;8404:116::-;8474:21;8489:5;8474:21;:::i;:::-;8467:5;8464:32;8454:60;;8510:1;8507;8500:12;8454:60;8404:116;:::o;8526:133::-;8569:5;8607:6;8594:20;8585:29;;8623:30;8647:5;8623:30;:::i;:::-;8526:133;;;;:::o;8665:468::-;8730:6;8738;8787:2;8775:9;8766:7;8762:23;8758:32;8755:119;;;8793:79;;:::i;:::-;8755:119;8913:1;8938:53;8983:7;8974:6;8963:9;8959:22;8938:53;:::i;:::-;8928:63;;8884:117;9040:2;9066:50;9108:7;9099:6;9088:9;9084:22;9066:50;:::i;:::-;9056:60;;9011:115;8665:468;;;;;:::o;9139:118::-;9226:24;9244:5;9226:24;:::i;:::-;9221:3;9214:37;9139:118;;:::o;9263:222::-;9356:4;9394:2;9383:9;9379:18;9371:26;;9407:71;9475:1;9464:9;9460:17;9451:6;9407:71;:::i;:::-;9263:222;;;;:::o;9491:329::-;9550:6;9599:2;9587:9;9578:7;9574:23;9570:32;9567:119;;;9605:79;;:::i;:::-;9567:119;9725:1;9750:53;9795:7;9786:6;9775:9;9771:22;9750:53;:::i;:::-;9740:63;;9696:117;9491:329;;;;:::o;9826:332::-;9947:4;9985:2;9974:9;9970:18;9962:26;;9998:71;10066:1;10055:9;10051:17;10042:6;9998:71;:::i;:::-;10079:72;10147:2;10136:9;10132:18;10123:6;10079:72;:::i;:::-;9826:332;;;;;:::o;10164:180::-;10212:77;10209:1;10202:88;10309:4;10306:1;10299:15;10333:4;10330:1;10323:15;10350:281;10433:27;10455:4;10433:27;:::i;:::-;10425:6;10421:40;10563:6;10551:10;10548:22;10527:18;10515:10;10512:34;10509:62;10506:88;;;10574:18;;:::i;:::-;10506:88;10614:10;10610:2;10603:22;10393:238;10350:281;;:::o;10637:129::-;10671:6;10698:20;;:::i;:::-;10688:30;;10727:33;10755:4;10747:6;10727:33;:::i;:::-;10637:129;;;:::o;10772:311::-;10849:4;10939:18;10931:6;10928:30;10925:56;;;10961:18;;:::i;:::-;10925:56;11011:4;11003:6;10999:17;10991:25;;11071:4;11065;11061:15;11053:23;;10772:311;;;:::o;11106:710::-;11202:5;11227:81;11243:64;11300:6;11243:64;:::i;:::-;11227:81;:::i;:::-;11218:90;;11328:5;11357:6;11350:5;11343:21;11391:4;11384:5;11380:16;11373:23;;11444:4;11436:6;11432:17;11424:6;11420:30;11473:3;11465:6;11462:15;11459:122;;;11492:79;;:::i;:::-;11459:122;11607:6;11590:220;11624:6;11619:3;11616:15;11590:220;;;11699:3;11728:37;11761:3;11749:10;11728:37;:::i;:::-;11723:3;11716:50;11795:4;11790:3;11786:14;11779:21;;11666:144;11650:4;11645:3;11641:14;11634:21;;11590:220;;;11594:21;11208:608;;11106:710;;;;;:::o;11839:370::-;11910:5;11959:3;11952:4;11944:6;11940:17;11936:27;11926:122;;11967:79;;:::i;:::-;11926:122;12084:6;12071:20;12109:94;12199:3;12191:6;12184:4;12176:6;12172:17;12109:94;:::i;:::-;12100:103;;11916:293;11839:370;;;;:::o;12215:539::-;12299:6;12348:2;12336:9;12327:7;12323:23;12319:32;12316:119;;;12354:79;;:::i;:::-;12316:119;12502:1;12491:9;12487:17;12474:31;12532:18;12524:6;12521:30;12518:117;;;12554:79;;:::i;:::-;12518:117;12659:78;12729:7;12720:6;12709:9;12705:22;12659:78;:::i;:::-;12649:88;;12445:302;12215:539;;;;:::o;12760:323::-;12816:6;12865:2;12853:9;12844:7;12840:23;12836:32;12833:119;;;12871:79;;:::i;:::-;12833:119;12991:1;13016:50;13058:7;13049:6;13038:9;13034:22;13016:50;:::i;:::-;13006:60;;12962:114;12760:323;;;;:::o;13089:474::-;13157:6;13165;13214:2;13202:9;13193:7;13189:23;13185:32;13182:119;;;13220:79;;:::i;:::-;13182:119;13340:1;13365:53;13410:7;13401:6;13390:9;13386:22;13365:53;:::i;:::-;13355:63;;13311:117;13467:2;13493:53;13538:7;13529:6;13518:9;13514:22;13493:53;:::i;:::-;13483:63;;13438:118;13089:474;;;;;:::o;13569:911::-;13664:6;13672;13680;13688;13696;13745:3;13733:9;13724:7;13720:23;13716:33;13713:120;;;13752:79;;:::i;:::-;13713:120;13872:1;13897:53;13942:7;13933:6;13922:9;13918:22;13897:53;:::i;:::-;13887:63;;13843:117;13999:2;14025:53;14070:7;14061:6;14050:9;14046:22;14025:53;:::i;:::-;14015:63;;13970:118;14127:2;14153:53;14198:7;14189:6;14178:9;14174:22;14153:53;:::i;:::-;14143:63;;14098:118;14255:2;14281:53;14326:7;14317:6;14306:9;14302:22;14281:53;:::i;:::-;14271:63;;14226:118;14383:3;14410:53;14455:7;14446:6;14435:9;14431:22;14410:53;:::i;:::-;14400:63;;14354:119;13569:911;;;;;;;;:::o;14503:568::-;14576:8;14586:6;14636:3;14629:4;14621:6;14617:17;14613:27;14603:122;;14644:79;;:::i;:::-;14603:122;14757:6;14744:20;14734:30;;14787:18;14779:6;14776:30;14773:117;;;14809:79;;:::i;:::-;14773:117;14923:4;14915:6;14911:17;14899:29;;14977:3;14969:4;14961:6;14957:17;14947:8;14943:32;14940:41;14937:128;;;14984:79;;:::i;:::-;14937:128;14503:568;;;;;:::o;15077:934::-;15199:6;15207;15215;15223;15272:2;15260:9;15251:7;15247:23;15243:32;15240:119;;;15278:79;;:::i;:::-;15240:119;15426:1;15415:9;15411:17;15398:31;15456:18;15448:6;15445:30;15442:117;;;15478:79;;:::i;:::-;15442:117;15591:80;15663:7;15654:6;15643:9;15639:22;15591:80;:::i;:::-;15573:98;;;;15369:312;15748:2;15737:9;15733:18;15720:32;15779:18;15771:6;15768:30;15765:117;;;15801:79;;:::i;:::-;15765:117;15914:80;15986:7;15977:6;15966:9;15962:22;15914:80;:::i;:::-;15896:98;;;;15691:313;15077:934;;;;;;;:::o;16017:474::-;16085:6;16093;16142:2;16130:9;16121:7;16117:23;16113:32;16110:119;;;16148:79;;:::i;:::-;16110:119;16268:1;16293:53;16338:7;16329:6;16318:9;16314:22;16293:53;:::i;:::-;16283:63;;16239:117;16395:2;16421:53;16466:7;16457:6;16446:9;16442:22;16421:53;:::i;:::-;16411:63;;16366:118;16017:474;;;;;:::o;16497:182::-;16637:34;16633:1;16625:6;16621:14;16614:58;16497:182;:::o;16685:366::-;16827:3;16848:67;16912:2;16907:3;16848:67;:::i;:::-;16841:74;;16924:93;17013:3;16924:93;:::i;:::-;17042:2;17037:3;17033:12;17026:19;;16685:366;;;:::o;17057:419::-;17223:4;17261:2;17250:9;17246:18;17238:26;;17310:9;17304:4;17300:20;17296:1;17285:9;17281:17;17274:47;17338:131;17464:4;17338:131;:::i;:::-;17330:139;;17057:419;;;:::o;17482:180::-;17530:77;17527:1;17520:88;17627:4;17624:1;17617:15;17651:4;17648:1;17641:15;17668:320;17712:6;17749:1;17743:4;17739:12;17729:22;;17796:1;17790:4;17786:12;17817:18;17807:81;;17873:4;17865:6;17861:17;17851:27;;17807:81;17935:2;17927:6;17924:14;17904:18;17901:38;17898:84;;17954:18;;:::i;:::-;17898:84;17719:269;17668:320;;;:::o;17994:180::-;18042:77;18039:1;18032:88;18139:4;18136:1;18129:15;18163:4;18160:1;18153:15;18180:348;18220:7;18243:20;18261:1;18243:20;:::i;:::-;18238:25;;18277:20;18295:1;18277:20;:::i;:::-;18272:25;;18465:1;18397:66;18393:74;18390:1;18387:81;18382:1;18375:9;18368:17;18364:105;18361:131;;;18472:18;;:::i;:::-;18361:131;18520:1;18517;18513:9;18502:20;;18180:348;;;;:::o;18534:229::-;18674:34;18670:1;18662:6;18658:14;18651:58;18743:12;18738:2;18730:6;18726:15;18719:37;18534:229;:::o;18769:366::-;18911:3;18932:67;18996:2;18991:3;18932:67;:::i;:::-;18925:74;;19008:93;19097:3;19008:93;:::i;:::-;19126:2;19121:3;19117:12;19110:19;;18769:366;;;:::o;19141:419::-;19307:4;19345:2;19334:9;19330:18;19322:26;;19394:9;19388:4;19384:20;19380:1;19369:9;19365:17;19358:47;19422:131;19548:4;19422:131;:::i;:::-;19414:139;;19141:419;;;:::o;19566:181::-;19706:33;19702:1;19694:6;19690:14;19683:57;19566:181;:::o;19753:366::-;19895:3;19916:67;19980:2;19975:3;19916:67;:::i;:::-;19909:74;;19992:93;20081:3;19992:93;:::i;:::-;20110:2;20105:3;20101:12;20094:19;;19753:366;;;:::o;20125:419::-;20291:4;20329:2;20318:9;20314:18;20306:26;;20378:9;20372:4;20368:20;20364:1;20353:9;20349:17;20342:47;20406:131;20532:4;20406:131;:::i;:::-;20398:139;;20125:419;;;:::o;20550:180::-;20598:77;20595:1;20588:88;20695:4;20692:1;20685:15;20719:4;20716:1;20709:15;20736:143;20793:5;20824:6;20818:13;20809:22;;20840:33;20867:5;20840:33;:::i;:::-;20736:143;;;;:::o;20885:351::-;20955:6;21004:2;20992:9;20983:7;20979:23;20975:32;20972:119;;;21010:79;;:::i;:::-;20972:119;21130:1;21155:64;21211:7;21202:6;21191:9;21187:22;21155:64;:::i;:::-;21145:74;;21101:128;20885:351;;;;:::o;21242:114::-;21309:6;21343:5;21337:12;21327:22;;21242:114;;;:::o;21362:184::-;21461:11;21495:6;21490:3;21483:19;21535:4;21530:3;21526:14;21511:29;;21362:184;;;;:::o;21552:132::-;21619:4;21642:3;21634:11;;21672:4;21667:3;21663:14;21655:22;;21552:132;;;:::o;21690:108::-;21767:24;21785:5;21767:24;:::i;:::-;21762:3;21755:37;21690:108;;:::o;21804:179::-;21873:10;21894:46;21936:3;21928:6;21894:46;:::i;:::-;21972:4;21967:3;21963:14;21949:28;;21804:179;;;;:::o;21989:113::-;22059:4;22091;22086:3;22082:14;22074:22;;21989:113;;;:::o;22138:732::-;22257:3;22286:54;22334:5;22286:54;:::i;:::-;22356:86;22435:6;22430:3;22356:86;:::i;:::-;22349:93;;22466:56;22516:5;22466:56;:::i;:::-;22545:7;22576:1;22561:284;22586:6;22583:1;22580:13;22561:284;;;22662:6;22656:13;22689:63;22748:3;22733:13;22689:63;:::i;:::-;22682:70;;22775:60;22828:6;22775:60;:::i;:::-;22765:70;;22621:224;22608:1;22605;22601:9;22596:14;;22561:284;;;22565:14;22861:3;22854:10;;22262:608;;;22138:732;;;;:::o;22876:483::-;23047:4;23085:2;23074:9;23070:18;23062:26;;23098:71;23166:1;23155:9;23151:17;23142:6;23098:71;:::i;:::-;23216:9;23210:4;23206:20;23201:2;23190:9;23186:18;23179:48;23244:108;23347:4;23338:6;23244:108;:::i;:::-;23236:116;;22876:483;;;;;:::o;23365:311::-;23442:4;23532:18;23524:6;23521:30;23518:56;;;23554:18;;:::i;:::-;23518:56;23604:4;23596:6;23592:17;23584:25;;23664:4;23658;23654:15;23646:23;;23365:311;;;:::o;23682:143::-;23739:5;23770:6;23764:13;23755:22;;23786:33;23813:5;23786:33;:::i;:::-;23682:143;;;;:::o;23848:732::-;23955:5;23980:81;23996:64;24053:6;23996:64;:::i;:::-;23980:81;:::i;:::-;23971:90;;24081:5;24110:6;24103:5;24096:21;24144:4;24137:5;24133:16;24126:23;;24197:4;24189:6;24185:17;24177:6;24173:30;24226:3;24218:6;24215:15;24212:122;;;24245:79;;:::i;:::-;24212:122;24360:6;24343:231;24377:6;24372:3;24369:15;24343:231;;;24452:3;24481:48;24525:3;24513:10;24481:48;:::i;:::-;24476:3;24469:61;24559:4;24554:3;24550:14;24543:21;;24419:155;24403:4;24398:3;24394:14;24387:21;;24343:231;;;24347:21;23961:619;;23848:732;;;;;:::o;24603:385::-;24685:5;24734:3;24727:4;24719:6;24715:17;24711:27;24701:122;;24742:79;;:::i;:::-;24701:122;24852:6;24846:13;24877:105;24978:3;24970:6;24963:4;24955:6;24951:17;24877:105;:::i;:::-;24868:114;;24691:297;24603:385;;;;:::o;24994:554::-;25089:6;25138:2;25126:9;25117:7;25113:23;25109:32;25106:119;;;25144:79;;:::i;:::-;25106:119;25285:1;25274:9;25270:17;25264:24;25315:18;25307:6;25304:30;25301:117;;;25337:79;;:::i;:::-;25301:117;25442:89;25523:7;25514:6;25503:9;25499:22;25442:89;:::i;:::-;25432:99;;25235:306;24994:554;;;;:::o;25554:221::-;25694:34;25690:1;25682:6;25678:14;25671:58;25763:4;25758:2;25750:6;25746:15;25739:29;25554:221;:::o;25781:366::-;25923:3;25944:67;26008:2;26003:3;25944:67;:::i;:::-;25937:74;;26020:93;26109:3;26020:93;:::i;:::-;26138:2;26133:3;26129:12;26122:19;;25781:366;;;:::o;26153:419::-;26319:4;26357:2;26346:9;26342:18;26334:26;;26406:9;26400:4;26396:20;26392:1;26381:9;26377:17;26370:47;26434:131;26560:4;26434:131;:::i;:::-;26426:139;;26153:419;;;:::o;26578:332::-;26699:4;26737:2;26726:9;26722:18;26714:26;;26750:71;26818:1;26807:9;26803:17;26794:6;26750:71;:::i;:::-;26831:72;26899:2;26888:9;26884:18;26875:6;26831:72;:::i;:::-;26578:332;;;;;:::o;26916:232::-;27056:34;27052:1;27044:6;27040:14;27033:58;27125:15;27120:2;27112:6;27108:15;27101:40;26916:232;:::o;27154:366::-;27296:3;27317:67;27381:2;27376:3;27317:67;:::i;:::-;27310:74;;27393:93;27482:3;27393:93;:::i;:::-;27511:2;27506:3;27502:12;27495:19;;27154:366;;;:::o;27526:419::-;27692:4;27730:2;27719:9;27715:18;27707:26;;27779:9;27773:4;27769:20;27765:1;27754:9;27750:17;27743:47;27807:131;27933:4;27807:131;:::i;:::-;27799:139;;27526:419;;;:::o;27951:229::-;28091:34;28087:1;28079:6;28075:14;28068:58;28160:12;28155:2;28147:6;28143:15;28136:37;27951:229;:::o;28186:366::-;28328:3;28349:67;28413:2;28408:3;28349:67;:::i;:::-;28342:74;;28425:93;28514:3;28425:93;:::i;:::-;28543:2;28538:3;28534:12;28527:19;;28186:366;;;:::o;28558:419::-;28724:4;28762:2;28751:9;28747:18;28739:26;;28811:9;28805:4;28801:20;28797:1;28786:9;28782:17;28775:47;28839:131;28965:4;28839:131;:::i;:::-;28831:139;;28558:419;;;:::o;28983:305::-;29023:3;29042:20;29060:1;29042:20;:::i;:::-;29037:25;;29076:20;29094:1;29076:20;:::i;:::-;29071:25;;29230:1;29162:66;29158:74;29155:1;29152:81;29149:107;;;29236:18;;:::i;:::-;29149:107;29280:1;29277;29273:9;29266:16;;28983:305;;;;:::o;29294:179::-;29434:31;29430:1;29422:6;29418:14;29411:55;29294:179;:::o;29479:366::-;29621:3;29642:67;29706:2;29701:3;29642:67;:::i;:::-;29635:74;;29718:93;29807:3;29718:93;:::i;:::-;29836:2;29831:3;29827:12;29820:19;;29479:366;;;:::o;29851:419::-;30017:4;30055:2;30044:9;30040:18;30032:26;;30104:9;30098:4;30094:20;30090:1;30079:9;30075:17;30068:47;30132:131;30258:4;30132:131;:::i;:::-;30124:139;;29851:419;;;:::o;30276:225::-;30416:34;30412:1;30404:6;30400:14;30393:58;30485:8;30480:2;30472:6;30468:15;30461:33;30276:225;:::o;30507:366::-;30649:3;30670:67;30734:2;30729:3;30670:67;:::i;:::-;30663:74;;30746:93;30835:3;30746:93;:::i;:::-;30864:2;30859:3;30855:12;30848:19;;30507:366;;;:::o;30879:419::-;31045:4;31083:2;31072:9;31068:18;31060:26;;31132:9;31126:4;31122:20;31118:1;31107:9;31103:17;31096:47;31160:131;31286:4;31160:131;:::i;:::-;31152:139;;30879:419;;;:::o;31304:233::-;31343:3;31366:24;31384:5;31366:24;:::i;:::-;31357:33;;31412:66;31405:5;31402:77;31399:103;;31482:18;;:::i;:::-;31399:103;31529:1;31522:5;31518:13;31511:20;;31304:233;;;:::o;31543:223::-;31683:34;31679:1;31671:6;31667:14;31660:58;31752:6;31747:2;31739:6;31735:15;31728:31;31543:223;:::o;31772:366::-;31914:3;31935:67;31999:2;31994:3;31935:67;:::i;:::-;31928:74;;32011:93;32100:3;32011:93;:::i;:::-;32129:2;32124:3;32120:12;32113:19;;31772:366;;;:::o;32144:419::-;32310:4;32348:2;32337:9;32333:18;32325:26;;32397:9;32391:4;32387:20;32383:1;32372:9;32368:17;32361:47;32425:131;32551:4;32425:131;:::i;:::-;32417:139;;32144:419;;;:::o;32569:221::-;32709:34;32705:1;32697:6;32693:14;32686:58;32778:4;32773:2;32765:6;32761:15;32754:29;32569:221;:::o;32796:366::-;32938:3;32959:67;33023:2;33018:3;32959:67;:::i;:::-;32952:74;;33035:93;33124:3;33035:93;:::i;:::-;33153:2;33148:3;33144:12;33137:19;;32796:366;;;:::o;33168:419::-;33334:4;33372:2;33361:9;33357:18;33349:26;;33421:9;33415:4;33411:20;33407:1;33396:9;33392:17;33385:47;33449:131;33575:4;33449:131;:::i;:::-;33441:139;;33168:419;;;:::o;33593:224::-;33733:34;33729:1;33721:6;33717:14;33710:58;33802:7;33797:2;33789:6;33785:15;33778:32;33593:224;:::o;33823:366::-;33965:3;33986:67;34050:2;34045:3;33986:67;:::i;:::-;33979:74;;34062:93;34151:3;34062:93;:::i;:::-;34180:2;34175:3;34171:12;34164:19;;33823:366;;;:::o;34195:419::-;34361:4;34399:2;34388:9;34384:18;34376:26;;34448:9;34442:4;34438:20;34434:1;34423:9;34419:17;34412:47;34476:131;34602:4;34476:131;:::i;:::-;34468:139;;34195:419;;;:::o;34620:222::-;34760:34;34756:1;34748:6;34744:14;34737:58;34829:5;34824:2;34816:6;34812:15;34805:30;34620:222;:::o;34848:366::-;34990:3;35011:67;35075:2;35070:3;35011:67;:::i;:::-;35004:74;;35087:93;35176:3;35087:93;:::i;:::-;35205:2;35200:3;35196:12;35189:19;;34848:366;;;:::o;35220:419::-;35386:4;35424:2;35413:9;35409:18;35401:26;;35473:9;35467:4;35463:20;35459:1;35448:9;35444:17;35437:47;35501:131;35627:4;35501:131;:::i;:::-;35493:139;;35220:419;;;:::o;35645:228::-;35785:34;35781:1;35773:6;35769:14;35762:58;35854:11;35849:2;35841:6;35837:15;35830:36;35645:228;:::o;35879:366::-;36021:3;36042:67;36106:2;36101:3;36042:67;:::i;:::-;36035:74;;36118:93;36207:3;36118:93;:::i;:::-;36236:2;36231:3;36227:12;36220:19;;35879:366;;;:::o;36251:419::-;36417:4;36455:2;36444:9;36440:18;36432:26;;36504:9;36498:4;36494:20;36490:1;36479:9;36475:17;36468:47;36532:131;36658:4;36532:131;:::i;:::-;36524:139;;36251:419;;;:::o;36676:180::-;36816:32;36812:1;36804:6;36800:14;36793:56;36676:180;:::o;36862:366::-;37004:3;37025:67;37089:2;37084:3;37025:67;:::i;:::-;37018:74;;37101:93;37190:3;37101:93;:::i;:::-;37219:2;37214:3;37210:12;37203:19;;36862:366;;;:::o;37234:419::-;37400:4;37438:2;37427:9;37423:18;37415:26;;37487:9;37481:4;37477:20;37473:1;37462:9;37458:17;37451:47;37515:131;37641:4;37515:131;:::i;:::-;37507:139;;37234:419;;;:::o;37659:234::-;37799:34;37795:1;37787:6;37783:14;37776:58;37868:17;37863:2;37855:6;37851:15;37844:42;37659:234;:::o;37899:366::-;38041:3;38062:67;38126:2;38121:3;38062:67;:::i;:::-;38055:74;;38138:93;38227:3;38138:93;:::i;:::-;38256:2;38251:3;38247:12;38240:19;;37899:366;;;:::o;38271:419::-;38437:4;38475:2;38464:9;38460:18;38452:26;;38524:9;38518:4;38514:20;38510:1;38499:9;38495:17;38488:47;38552:131;38678:4;38552:131;:::i;:::-;38544:139;;38271:419;;;:::o;38696:227::-;38836:34;38832:1;38824:6;38820:14;38813:58;38905:10;38900:2;38892:6;38888:15;38881:35;38696:227;:::o;38929:366::-;39071:3;39092:67;39156:2;39151:3;39092:67;:::i;:::-;39085:74;;39168:93;39257:3;39168:93;:::i;:::-;39286:2;39281:3;39277:12;39270:19;;38929:366;;;:::o;39301:419::-;39467:4;39505:2;39494:9;39490:18;39482:26;;39554:9;39548:4;39544:20;39540:1;39529:9;39525:17;39518:47;39582:131;39708:4;39582:131;:::i;:::-;39574:139;;39301:419;;;:::o;39726:224::-;39866:34;39862:1;39854:6;39850:14;39843:58;39935:7;39930:2;39922:6;39918:15;39911:32;39726:224;:::o;39956:366::-;40098:3;40119:67;40183:2;40178:3;40119:67;:::i;:::-;40112:74;;40195:93;40284:3;40195:93;:::i;:::-;40313:2;40308:3;40304:12;40297:19;;39956:366;;;:::o;40328:419::-;40494:4;40532:2;40521:9;40517:18;40509:26;;40581:9;40575:4;40571:20;40567:1;40556:9;40552:17;40545:47;40609:131;40735:4;40609:131;:::i;:::-;40601:139;;40328:419;;;:::o;40753:191::-;40793:4;40813:20;40831:1;40813:20;:::i;:::-;40808:25;;40847:20;40865:1;40847:20;:::i;:::-;40842:25;;40886:1;40883;40880:8;40877:34;;;40891:18;;:::i;:::-;40877:34;40936:1;40933;40929:9;40921:17;;40753:191;;;;:::o;40950:177::-;41090:29;41086:1;41078:6;41074:14;41067:53;40950:177;:::o;41133:366::-;41275:3;41296:67;41360:2;41355:3;41296:67;:::i;:::-;41289:74;;41372:93;41461:3;41372:93;:::i;:::-;41490:2;41485:3;41481:12;41474:19;;41133:366;;;:::o;41505:419::-;41671:4;41709:2;41698:9;41694:18;41686:26;;41758:9;41752:4;41748:20;41744:1;41733:9;41729:17;41722:47;41786:131;41912:4;41786:131;:::i;:::-;41778:139;;41505:419;;;:::o;41930:180::-;41978:77;41975:1;41968:88;42075:4;42072:1;42065:15;42099:4;42096:1;42089:15;42116:185;42156:1;42173:20;42191:1;42173:20;:::i;:::-;42168:25;;42207:20;42225:1;42207:20;:::i;:::-;42202:25;;42246:1;42236:35;;42251:18;;:::i;:::-;42236:35;42293:1;42290;42286:9;42281:14;;42116:185;;;;:::o;42307:220::-;42447:34;42443:1;42435:6;42431:14;42424:58;42516:3;42511:2;42503:6;42499:15;42492:28;42307:220;:::o;42533:366::-;42675:3;42696:67;42760:2;42755:3;42696:67;:::i;:::-;42689:74;;42772:93;42861:3;42772:93;:::i;:::-;42890:2;42885:3;42881:12;42874:19;;42533:366;;;:::o;42905:419::-;43071:4;43109:2;43098:9;43094:18;43086:26;;43158:9;43152:4;43148:20;43144:1;43133:9;43129:17;43122:47;43186:131;43312:4;43186:131;:::i;:::-;43178:139;;42905:419;;;:::o;43330:85::-;43375:7;43404:5;43393:16;;43330:85;;;:::o;43421:158::-;43479:9;43512:61;43530:42;43539:32;43565:5;43539:32;:::i;:::-;43530:42;:::i;:::-;43512:61;:::i;:::-;43499:74;;43421:158;;;:::o;43585:147::-;43680:45;43719:5;43680:45;:::i;:::-;43675:3;43668:58;43585:147;;:::o;43738:831::-;44001:4;44039:3;44028:9;44024:19;44016:27;;44053:71;44121:1;44110:9;44106:17;44097:6;44053:71;:::i;:::-;44134:80;44210:2;44199:9;44195:18;44186:6;44134:80;:::i;:::-;44261:9;44255:4;44251:20;44246:2;44235:9;44231:18;44224:48;44289:108;44392:4;44383:6;44289:108;:::i;:::-;44281:116;;44407:72;44475:2;44464:9;44460:18;44451:6;44407:72;:::i;:::-;44489:73;44557:3;44546:9;44542:19;44533:6;44489:73;:::i;:::-;43738:831;;;;;;;;:::o

Swarm Source

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