ETH Price: $2,880.10 (-5.61%)
Gas: 2 Gwei

Token

GemAI (GAI)
 

Overview

Max Total Supply

10,000,000 GAI

Holders

112

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
10,923.29280623995953435 GAI

Value
$0.00
0x1d181e7bc93bf1a1a71f44bdfb0665baabed5448
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:
GemAI

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-07
*/

// SPDX-License-Identifier: MIT
 
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/7f6a1666fac8ecff5dd467d0938069bc221ea9e0/contracts/utils/math/SafeMath.sol
 
pragma solidity ^0.8.0;
 
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
 
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }
 
    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }
 
    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }
 
    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }
 
    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }
 
    /**
     * @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) {
        return a + b;
    }
 
    /**
     * @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 a - b;
    }
 
    /**
     * @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) {
        return a * b;
    }
 
    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }
 
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }
 
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }
 
    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards 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).
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }
 
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
 
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol
 
 
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
 
pragma solidity ^0.8.0;
 
/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
 
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
 
 
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
 
pragma solidity ^0.8.0;
 
 
/**
 * @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.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }
 
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
 
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
 
    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }
 
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
// File: gai.sol
 
 
 
pragma solidity ^0.8.7;
 
 
 
/**
 * @dev Interfaces
 */
 
interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}
 
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
 
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);
    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);
    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);
    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);
    function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)
        external
        payable
        returns (uint256[] memory amounts);
    function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline)
        external
        returns (uint256[] memory amounts);
    function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)
        external
        returns (uint256[] memory amounts);
    function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline)
        external
        payable
        returns (uint256[] memory amounts);
 
    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);
    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external pure returns (uint256 amountOut);
    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) external pure returns (uint256 amountIn);
    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);
    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}
 
interface IUniswapV2Router02 is IUniswapV2Router01{
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint256 amountETH);
 
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}
 
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
 
    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
 
    /**
     * @dev Moves `amount` tokens from `from` to `to` 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 from,
        address to,
        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 Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);
 
    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);
}
 
contract GemAI is Context, IERC20, IERC20Metadata, Ownable {
    receive() external payable {}
 
    event SendNative(bool _wallet);
 
    using SafeMath for uint256;
 
    mapping(address => uint256) private _balances;
 
    mapping(address => mapping(address => uint256)) private _allowances;
 
    uint256 _totalSupply;
    string private _name;
    string private _symbol;
    uint8 private _decimals;
 
    // fees & addresses
    mapping (string => uint256) txShares;
 
    mapping (address => bool) public fExempt;
    mapping (address => bool) public txLimitExempt;
 
    address public taxAddress1 = msg.sender;
    uint256 public MAX_BUY_AMOUNT = 100_000 ether;
 
    // taxes for differnet levels
 
    struct TokenShare {
        uint256 forMarketing;
        uint256 forDev;
    }
 
    struct TxLimit {
        uint256 buyLimit;
        uint256 sellLimit;
        uint256 cd;
        bool inactive;
        mapping(address => uint256) buys;
        mapping(address => uint256) sells;
        mapping(address => uint256) lastTx;
    }
 
    TxLimit txLimits;
 
    struct SwapToken {
        uint256 swapTokensAt;
        uint256 lastSwap;
        uint256 swapDelay;
        uint256 minToSend;
    }
 
    SwapToken public swapTokens;
 
    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
 
    constructor() {
        _name = "GemAI";
        _symbol = "GAI";
        _decimals = 18;
        _totalSupply = 10_000_000 * (10 ** decimals());
 
        fExempt[msg.sender] = true;
        txLimitExempt[msg.sender] = true;
        fExempt[address(this)] = true;
        txLimitExempt[address(this)] = true;
        fExempt[taxAddress1] = true;
        txLimitExempt[taxAddress1] = true;

        /**
            Set default buy/sell tx fees (no tax on transfers)
            - marketing, dev
        */
        txShares["marketingBuy"] = 200;
        txShares["devBuy"] = 200;
 
        txShares["marketingSell"] = 1500;
        txShares["devSell"] = 1500;
 
        /**
            Set default tx limits
            - Cooldown, buy limit, sell limit
        */
        txLimits.cd = 5 minutes;
        txLimits.buyLimit = 1 ether;
        txLimits.sellLimit = 1 ether;
 
        swapTokens.swapTokensAt = _totalSupply.div(1500); // 0.1%
        swapTokens.minToSend = 1 ether;
        swapTokens.swapDelay = 5 minutes;
 
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _totalSupply);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint256).max);
 
        approve(address(uniswapV2Router), _totalSupply);
        fExempt[address(uniswapV2Router)] = true;
 
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }
 
    /**
        Sets buy/sell transaction fees
    */
    event Shares(
        uint256 _marketingBuy,
        uint256 _devBuy,
        uint256 _marketingSell,
        uint256 _devSell
    );
 
    function setShares(
        uint256 _marketingBuy,
        uint256 _devBuy,
        uint256 _marketingSell,
        uint256 _devSell
    ) external onlyOwner {
        require(_marketingBuy <= 800, "Marketing fee is too high!");
        require(_devBuy <= 800, "Dev fee is too high!");
        require(_marketingSell <= 800, "Marketing fee is too high!");
        require(_devSell <= 800, "Dev fee is too high!");
 
        txShares["marketingBuy"] = _marketingBuy;
        txShares["devBuy"] = _devBuy;
 
        txShares["marketingSell"] = _marketingSell;
        txShares["devSell"] = _devSell;
 
        emit Shares(
            _marketingBuy,
            _devBuy,
            _marketingSell,
            _devSell
        );
    }
 
    /**
        Returns buy/sell transaction fees
    */
    function getShares() public view returns(
        uint256 marketingBuy,
        uint256 devBuy,
        uint256 marketingSell,
        uint256 devSell
    ) {
        return (
            txShares["marketingBuy"],
            txShares["devBuy"],
            txShares["marketingSell"],
            txShares["devSell"]
        );
    }
 
    /**
        Sets the tax collector contracts
    */
    function setTaxAddress(address _taxAddress) external onlyOwner {
        taxAddress1 = _taxAddress;
    }
 
    /**
        Sets the tax free trading for the specific address
    */
    function setExempt(address _address, bool _value) external onlyOwner {
        fExempt[_address] = _value;
    }
 
    /**
        Sets the limit free trading for the specific address
    */
    function setTxLimitExempt(address _address, bool _value) external onlyOwner {
        txLimitExempt[_address] = _value;
    }
 
    /**
        Sets the sell/buy limits & cd period
    */
    function setTxLimits(uint256 _buyLimit, uint256 _sellLimit, uint256 _cd, bool _inactive) external onlyOwner {
        require(_buyLimit >= _totalSupply.div(200), "Buy transaction limit is too low!"); // 0.5%
        require(_sellLimit >= _totalSupply.div(200), "Sell transaction limit is too low!"); // 0.25%
        require(_cd <= 5 minutes, "Cooldown should be 5 minutes or less!");
 
        txLimits.buyLimit = _buyLimit;
        txLimits.sellLimit = _sellLimit;
        txLimits.cd = _cd;
        txLimits.inactive = _inactive;
    }
 
    /**
        Sell tokens at
    */
    function setSwapTokens(uint256 _swapTokensAt, uint256 _lastSwap, uint256 _delay, uint256 _minToSend) external onlyOwner {
        swapTokens.swapTokensAt = _swapTokensAt;
        swapTokens.lastSwap = _lastSwap;
        swapTokens.swapDelay = _delay;
        swapTokens.minToSend = _minToSend;
    }
 
    /**
        Returns the sell/buy limits & cd period
    */
    // function getTxLimits() public view returns(uint256 buyLimit, uint256 sellLimit, uint256 cd, bool inactive) {
    //     return (txLimits.buyLimit, txLimits.sellLimit, txLimits.cd, txLimits.inactive);
    // }
 
    /**
        Checks the BUY transaction limits for the specific user with the sent amount
    */
    function checkBuyTxLimit(address _sender, uint256 _amount) internal view {
        require(
            txLimits.inactive == true ||
            txLimitExempt[_sender] == true ||
            txLimits.buys[_sender].add(_amount) < txLimits.buyLimit ||
            (txLimits.buys[_sender].add(_amount) >= 75_000 ether && txLimits.buys[_sender].add(_amount) <= 80_000 ether) ||
            (txLimits.buys[_sender].add(_amount) > txLimits.buyLimit &&
            txLimits.lastTx[_sender].add(txLimits.cd) < block.timestamp),
            "Buy transaction limit reached!"
        );
    }
 
    /**
        Checks the SELL transaction limits for the specific user with the sent amount
    */
    function checkSellTxLimit(address _sender, uint256 _amount) internal view {
        require(
            txLimits.inactive == true ||
            txLimitExempt[_sender] == true ||
            txLimits.sells[_sender].add(_amount) < txLimits.sellLimit ||
            (txLimits.sells[_sender].add(_amount) > txLimits.sellLimit &&
            txLimits.lastTx[_sender].add(txLimits.cd) < block.timestamp),
            "Sell transaction limit reached!"
        );
    }
 
    /**
        Saves the recent buy/sell transactions
        The function used by _transfer() when the cd/tx limit is active
    */
    function setRecentTx(bool _isSell, address _sender, uint256 _amount) internal {
        if(txLimits.lastTx[_sender].add(txLimits.cd) < block.timestamp) {
            _isSell ? txLimits.sells[_sender] = _amount : txLimits.buys[_sender] = _amount;
        } else {
            _isSell ? txLimits.sells[_sender] += _amount : txLimits.buys[_sender] += _amount;
        }
 
        txLimits.lastTx[_sender] = block.timestamp;
    }
 
    /**
        Returns the recent buys, sells and the last transaction for the specific wallet
    */
    function getRecentTx(address _address) public view returns(uint256 buys, uint256 sells, uint256 lastTx) {
        return (txLimits.buys[_address], txLimits.sells[_address], txLimits.lastTx[_address]);
    }
 
    /**
        Automatic swap
    */
 
    function swapTokensForNative(uint256 _amount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), _amount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
 
    function manualSwapTokensForNative(uint256 _amount) external onlyOwner {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), _amount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
 
    function manualSendNative() external onlyOwner {
        uint256 contractNativeBalance = address(this).balance;
        sendNativeTokens(contractNativeBalance);
    }
 
    function withdrawAnyToken(address payable _to, IERC20 _token) public onlyOwner {
        _token.transfer(_to, _token.balanceOf(address(this)));
    }
 
    function sendNativeTokens(uint256 _amount) private {
        payable(taxAddress1).transfer(_amount);
    }
 
   /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }
 
    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
 
    function decimals() public view virtual override returns (uint8) {
        return _decimals;
    }
 
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }
 
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
 
    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }
 
    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
 
    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }
 
    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }
 
    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }
 
    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }
 
        return true;
    }
 
    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
 
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
 
        uint256 marketingShare;
        uint256 devShare;
 
        bool hasTax = true;
 
        // BUY
        if(from == uniswapV2Pair) {
            checkBuyTxLimit(to, amount);
 
            setRecentTx(false, to, amount);
 
            marketingShare = txShares["marketingBuy"];
            devShare = txShares["devBuy"];
        }
        // SELL
        else if(to == uniswapV2Pair) {
            checkSellTxLimit(from, amount);
 
            setRecentTx(true, from, amount);
 
            marketingShare = txShares["marketingSell"];
            devShare = txShares["devSell"];
        }
 
        unchecked {
            _balances[from] = fromBalance - amount;
        }
 
        if(fExempt[to] || fExempt[from]) {
            hasTax = false;
        }
 
        if(hasTax && (to == uniswapV2Pair || from == uniswapV2Pair)) {
            TokenShare memory TokenShares;
            TokenShares.forMarketing = amount.mul(marketingShare).div(10000);
            TokenShares.forDev = amount.mul(devShare).div(10000);
 
            uint256 totalFees =
                TokenShares.forMarketing
                .add(TokenShares.forDev);
 
            amount = amount.sub(totalFees);
 
            _balances[address(this)] += totalFees; // dev, marketing fees
            emit Transfer(from, address(this), totalFees);
 
            // If active we do swap
            uint256 contractTokenBalance = _balances[address(this)];
 
            if (
                contractTokenBalance > swapTokens.swapTokensAt &&
                block.timestamp > swapTokens.lastSwap + swapTokens.swapDelay &&
                to == uniswapV2Pair
            ) {
 
                // Random tokens between 0 - 10000
                uint256 randomTokens = (uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender))) % 20000) * 10**18;

                if(contractTokenBalance > (swapTokens.swapTokensAt.add(randomTokens)).mul(1500).div(10000)) {
                    swapTokensForNative(swapTokens.swapTokensAt.add(randomTokens));
                }
 
                swapTokens.lastSwap = block.timestamp;
 
                if(address(this).balance > swapTokens.minToSend) {
                    sendNativeTokens(address(this).balance);
                 }
            }
        }
 
        _balances[to] += amount;
        emit Transfer(from, to, amount);
    }
 
    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
 
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
 
    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }
 
    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
 
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }
 
        emit Transfer(account, address(0), amount);
    }
 
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }
}

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":"bool","name":"_wallet","type":"bool"}],"name":"SendNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_marketingBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_devBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_marketingSell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_devSell","type":"uint256"}],"name":"Shares","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":"MAX_BUY_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRecentTx","outputs":[{"internalType":"uint256","name":"buys","type":"uint256"},{"internalType":"uint256","name":"sells","type":"uint256"},{"internalType":"uint256","name":"lastTx","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getShares","outputs":[{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"devBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"devSell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSendNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manualSwapTokensForNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingBuy","type":"uint256"},{"internalType":"uint256","name":"_devBuy","type":"uint256"},{"internalType":"uint256","name":"_marketingSell","type":"uint256"},{"internalType":"uint256","name":"_devSell","type":"uint256"}],"name":"setShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapTokensAt","type":"uint256"},{"internalType":"uint256","name":"_lastSwap","type":"uint256"},{"internalType":"uint256","name":"_delay","type":"uint256"},{"internalType":"uint256","name":"_minToSend","type":"uint256"}],"name":"setSwapTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxAddress","type":"address"}],"name":"setTaxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyLimit","type":"uint256"},{"internalType":"uint256","name":"_sellLimit","type":"uint256"},{"internalType":"uint256","name":"_cd","type":"uint256"},{"internalType":"bool","name":"_inactive","type":"bool"}],"name":"setTxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokens","outputs":[{"internalType":"uint256","name":"swapTokensAt","type":"uint256"},{"internalType":"uint256","name":"lastSwap","type":"uint256"},{"internalType":"uint256","name":"swapDelay","type":"uint256"},{"internalType":"uint256","name":"minToSend","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxAddress1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"","type":"address"}],"name":"txLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"withdrawAnyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405233600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555069152d02c7e14af6800000600b553480156200006057600080fd5b5062000081620000756200094060201b60201c565b6200094860201b60201c565b6040518060400160405280600581526020017f47656d414900000000000000000000000000000000000000000000000000000081525060049081620000c7919062000eb9565b506040518060400160405280600381526020017f4741490000000000000000000000000000000000000000000000000000000000815250600590816200010e919062000eb9565b506012600660006101000a81548160ff021916908360ff1602179055506200013b62000a0c60201b60201c565b600a62000149919062001130565b6298968062000159919062001181565b6003819055506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060c86007604051620003c59062001227565b90815260200160405180910390208190555060c86007604051620003e9906200128e565b9081526020016040518091039020819055506105dc60076040516200040e90620012f5565b9081526020016040518091039020819055506105dc600760405162000433906200135c565b90815260200160405180910390208190555061012c600c60020181905550670de0b6b3a7640000600c60000181905550670de0b6b3a7640000600c60010181905550620004936105dc60035462000a2360201b6200161e1790919060201c565b601360000181905550670de0b6b3a764000060136003018190555061012c6013600201819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d905080601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200054b30601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035462000a3b60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000597573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005bd9190620013dd565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200064b9190620013dd565b6040518363ffffffff1660e01b81526004016200066a92919062001420565b6020604051808303816000875af11580156200068a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006b09190620013dd565b601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620007919291906200145e565b6020604051808303816000875af1158015620007b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d79190620014c8565b506200080e601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035462000c0c60201b60201c565b50600160086000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600354600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600354604051620009319190620014fa565b60405180910390a350620016bf565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600660009054906101000a900460ff16905090565b6000818362000a33919062001546565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000aad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000aa49062001605565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000b1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b16906200169d565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000bff9190620014fa565b60405180910390a3505050565b60008062000c1f6200094060201b60201c565b905062000c3481858562000a3b60201b60201c565b600191505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000cc157607f821691505b60208210810362000cd75762000cd662000c79565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000d417fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d02565b62000d4d868362000d02565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d9a62000d9462000d8e8462000d65565b62000d6f565b62000d65565b9050919050565b6000819050919050565b62000db68362000d79565b62000dce62000dc58262000da1565b84845462000d0f565b825550505050565b600090565b62000de562000dd6565b62000df281848462000dab565b505050565b5b8181101562000e1a5762000e0e60008262000ddb565b60018101905062000df8565b5050565b601f82111562000e695762000e338162000cdd565b62000e3e8462000cf2565b8101602085101562000e4e578190505b62000e6662000e5d8562000cf2565b83018262000df7565b50505b505050565b600082821c905092915050565b600062000e8e6000198460080262000e6e565b1980831691505092915050565b600062000ea9838362000e7b565b9150826002028217905092915050565b62000ec48262000c3f565b67ffffffffffffffff81111562000ee05762000edf62000c4a565b5b62000eec825462000ca8565b62000ef982828562000e1e565b600060209050601f83116001811462000f31576000841562000f1c578287015190505b62000f28858262000e9b565b86555062000f98565b601f19841662000f418662000cdd565b60005b8281101562000f6b5784890151825560018201915060208501945060208101905062000f44565b8683101562000f8b578489015162000f87601f89168262000e7b565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200102e5780860481111562001006576200100562000fa0565b5b6001851615620010165780820291505b8081029050620010268562000fcf565b945062000fe6565b94509492505050565b6000826200104957600190506200111c565b816200105957600090506200111c565b81600181146200107257600281146200107d57620010b3565b60019150506200111c565b60ff84111562001092576200109162000fa0565b5b8360020a915084821115620010ac57620010ab62000fa0565b5b506200111c565b5060208310610133831016604e8410600b8410161715620010ed5782820a905083811115620010e757620010e662000fa0565b5b6200111c565b620010fc848484600162000fdc565b9250905081840481111562001116576200111562000fa0565b5b81810290505b9392505050565b600060ff82169050919050565b60006200113d8262000d65565b91506200114a8362001123565b9250620011797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001037565b905092915050565b60006200118e8262000d65565b91506200119b8362000d65565b9250828202620011ab8162000d65565b91508282048414831517620011c557620011c462000fa0565b5b5092915050565b600081905092915050565b7f6d61726b6574696e674275790000000000000000000000000000000000000000600082015250565b60006200120f600c83620011cc565b91506200121c82620011d7565b600c82019050919050565b6000620012348262001200565b9150819050919050565b7f6465764275790000000000000000000000000000000000000000000000000000600082015250565b600062001276600683620011cc565b915062001283826200123e565b600682019050919050565b60006200129b8262001267565b9150819050919050565b7f6d61726b6574696e6753656c6c00000000000000000000000000000000000000600082015250565b6000620012dd600d83620011cc565b9150620012ea82620012a5565b600d82019050919050565b60006200130282620012ce565b9150819050919050565b7f64657653656c6c00000000000000000000000000000000000000000000000000600082015250565b600062001344600783620011cc565b915062001351826200130c565b600782019050919050565b6000620013698262001335565b9150819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620013a58262001378565b9050919050565b620013b78162001398565b8114620013c357600080fd5b50565b600081519050620013d781620013ac565b92915050565b600060208284031215620013f657620013f562001373565b5b60006200140684828501620013c6565b91505092915050565b6200141a8162001398565b82525050565b60006040820190506200143760008301856200140f565b6200144660208301846200140f565b9392505050565b620014588162000d65565b82525050565b60006040820190506200147560008301856200140f565b6200148460208301846200144d565b9392505050565b60008115159050919050565b620014a2816200148b565b8114620014ae57600080fd5b50565b600081519050620014c28162001497565b92915050565b600060208284031215620014e157620014e062001373565b5b6000620014f184828501620014b1565b91505092915050565b60006020820190506200151160008301846200144d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620015538262000d65565b9150620015608362000d65565b92508262001573576200157262001517565b5b828204905092915050565b600082825260208201905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000620015ed6024836200157e565b9150620015fa826200158f565b604082019050919050565b600060208201905081810360008301526200162081620015de565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000620016856022836200157e565b9150620016928262001627565b604082019050919050565b60006020820190508181036000830152620016b88162001676565b9050919050565b6143d080620016cf6000396000f3fe6080604052600436106101f15760003560e01c80636745297e1161010d5780639fde54f5116100a0578063b4e7dfa21161006f578063b4e7dfa214610720578063d73fe0aa1461074b578063dd62ed3e14610779578063f03b6ffc146107b6578063f2fde38b146107df576101f8565b80639fde54f514610654578063a1883d261461067d578063a457c2d7146106a6578063a9059cbb146106e3576101f8565b806388d9f5ea116100dc57806388d9f5ea146105aa5780638d7a8ba7146105d55780638da5cb5b146105fe57806395d89b4114610629576101f8565b80636745297e146104ff57806370a0823114610528578063715018a61461056557806373d002241461057c576101f8565b80633950935111610185578063526731e611610154578063526731e61461044757806361b97324146104705780636519aa241461049957806365fe6fcc146104c2576101f8565b8063395093511461039f57806342966c68146103dc57806349bd5a5e1461040557806349d3c13514610430576101f8565b806318160ddd116101c157806318160ddd146102cf57806323b872dd146102fa578063313ce56714610337578063361f4fb414610362576101f8565b806220a403146101fd57806306fdde031461023c578063095ea7b3146102675780631694505e146102a4576101f8565b366101f857005b600080fd5b34801561020957600080fd5b50610224600480360381019061021f9190612dc9565b610808565b60405161023393929190612e0f565b60405180910390f35b34801561024857600080fd5b506102516108e3565b60405161025e9190612ed6565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190612f24565b610975565b60405161029b9190612f7f565b60405180910390f35b3480156102b057600080fd5b506102b9610998565b6040516102c69190612ff9565b60405180910390f35b3480156102db57600080fd5b506102e46109be565b6040516102f19190613014565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c919061302f565b6109c8565b60405161032e9190612f7f565b60405180910390f35b34801561034357600080fd5b5061034c6109f7565b604051610359919061309e565b60405180910390f35b34801561036e57600080fd5b5061038960048036038101906103849190612dc9565b610a0e565b6040516103969190612f7f565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c19190612f24565b610a2e565b6040516103d39190612f7f565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906130b9565b610a65565b005b34801561041157600080fd5b5061041a610a79565b60405161042791906130f5565b60405180910390f35b34801561043c57600080fd5b50610445610a9f565b005b34801561045357600080fd5b5061046e6004803603810190610469919061318c565b610ab8565b005b34801561047c57600080fd5b50610497600480360381019061049291906131cc565b610bbc565b005b3480156104a557600080fd5b506104c060048036038101906104bb91906130b9565b610bf2565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190612dc9565b610e3d565b6040516104f69190612f7f565b60405180910390f35b34801561050b57600080fd5b506105266004803603810190610521919061325f565b610e5d565b005b34801561053457600080fd5b5061054f600480360381019061054a9190612dc9565b610f9b565b60405161055c9190613014565b60405180910390f35b34801561057157600080fd5b5061057a610fe4565b005b34801561058857600080fd5b50610591610ff8565b6040516105a194939291906132c6565b60405180910390f35b3480156105b657600080fd5b506105bf611016565b6040516105cc9190613014565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f7919061330b565b61101c565b005b34801561060a57600080fd5b5061061361107f565b60405161062091906130f5565b60405180910390f35b34801561063557600080fd5b5061063e6110a8565b60405161064b9190612ed6565b60405180910390f35b34801561066057600080fd5b5061067b6004803603810190610676919061330b565b61113a565b005b34801561068957600080fd5b506106a4600480360381019061069f9190612dc9565b61119d565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190612f24565b6111e9565b6040516106da9190612f7f565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190612f24565b611260565b6040516107179190612f7f565b60405180910390f35b34801561072c57600080fd5b50610735611283565b60405161074291906130f5565b60405180910390f35b34801561075757600080fd5b506107606112a9565b60405161077094939291906132c6565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b919061334b565b611331565b6040516107ad9190613014565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d891906131cc565b6113b8565b005b3480156107eb57600080fd5b5061080660048036038101906108019190612dc9565b61159b565b005b6000806000600c60040160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60050160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60060160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250925092509193909250565b6060600480546108f2906133ba565b80601f016020809104026020016040519081016040528092919081815260200182805461091e906133ba565b801561096b5780601f106109405761010080835404028352916020019161096b565b820191906000526020600020905b81548152906001019060200180831161094e57829003601f168201915b5050505050905090565b600080610980611634565b905061098d81858561163c565b600191505092915050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b6000806109d3611634565b90506109e0858285611805565b6109eb858585611891565b60019150509392505050565b6000600660009054906101000a900460ff16905090565b60096020528060005260406000206000915054906101000a900460ff1681565b600080610a39611634565b9050610a5a818585610a4b8589611331565b610a55919061341a565b61163c565b600191505092915050565b610a76610a70611634565b826120c4565b50565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aa761227b565b6000479050610ab5816122f9565b50565b610ac061227b565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b1691906130f5565b602060405180830381865afa158015610b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b579190613463565b6040518363ffffffff1660e01b8152600401610b749291906134b1565b6020604051808303816000875af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb791906134ef565b505050565b610bc461227b565b8360136000018190555082601360010181905550816013600201819055508060136003018190555050505050565b610bfa61227b565b6000600267ffffffffffffffff811115610c1757610c1661351c565b5b604051908082528060200260200182016040528015610c455781602001602082028036833780820191505090505b5090503081600081518110610c5d57610c5c61354b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d28919061358f565b81600181518110610d3c57610d3b61354b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610da330601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461163c565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401610e079594939291906136b5565b600060405180830381600087803b158015610e2157600080fd5b505af1158015610e35573d6000803e3d6000fd5b505050505050565b60086020528060005260406000206000915054906101000a900460ff1681565b610e6561227b565b610e7b60c860035461161e90919063ffffffff16565b841015610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490613781565b60405180910390fd5b610ed360c860035461161e90919063ffffffff16565b831015610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c90613813565b60405180910390fd5b61012c821115610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f51906138a5565b60405180910390fd5b83600c6000018190555082600c6001018190555081600c6002018190555080600c60030160006101000a81548160ff02191690831515021790555050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fec61227b565b610ff66000612365565b565b60138060000154908060010154908060020154908060030154905084565b600b5481565b61102461227b565b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546110b7906133ba565b80601f01602080910402602001604051908101604052809291908181526020018280546110e3906133ba565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b61114261227b565b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6111a561227b565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111f4611634565b905060006112028286611331565b905083811015611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613937565b60405180910390fd5b611254828686840361163c565b60019250505092915050565b60008061126b611634565b9050611278818585611891565b600191505092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060076040516112bd906139ae565b90815260200160405180910390205460076040516112da90613a0f565b90815260200160405180910390205460076040516112f790613a70565b908152602001604051809103902054600760405161131490613ad1565b908152602001604051809103902054935093509350935090919293565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113c061227b565b610320841115611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90613b32565b60405180910390fd5b61032083111561144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190613b9e565b60405180910390fd5b61032082111561148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690613b32565b60405180910390fd5b6103208111156114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90613b9e565b60405180910390fd5b8360076040516114e3906139ae565b90815260200160405180910390208190555082600760405161150490613a0f565b90815260200160405180910390208190555081600760405161152590613a70565b90815260200160405180910390208190555080600760405161154690613ad1565b9081526020016040518091039020819055507f8e53f02bf55e86feff3ee41c4949ebe67a91c971ac6ed57ea3f4f6ed0ecadfb98484848460405161158d94939291906132c6565b60405180910390a150505050565b6115a361227b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990613c30565b60405180910390fd5b61161b81612365565b50565b6000818361162c9190613c7f565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290613d22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190613db4565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117f89190613014565b60405180910390a3505050565b60006118118484611331565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461188b578181101561187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490613e20565b60405180910390fd5b61188a848484840361163c565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790613eb2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690613f44565b60405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90613fd6565b60405180910390fd5b600080600060019050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603611aad57611a5e8686612429565b611a6a600087876126de565b6007604051611a78906139ae565b90815260200160405180910390205492506007604051611a9790613a0f565b9081526020016040518091039020549150611b58565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611b5757611b0c87866128e5565b611b18600188876126de565b6007604051611b2690613a70565b90815260200160405180910390205492506007604051611b4590613ad1565b90815260200160405180910390205491505b5b848403600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611c3f5750600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611c4957600090505b808015611cfb5750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480611cfa5750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b5b1561200057611d08612d4c565b611d2f612710611d218689612ac790919063ffffffff16565b61161e90919063ffffffff16565b816000018181525050611d5f612710611d518589612ac790919063ffffffff16565b61161e90919063ffffffff16565b8160200181815250506000611d8582602001518360000151612add90919063ffffffff16565b9050611d9a8188612af390919063ffffffff16565b965080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611deb919061341a565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e4f9190613014565b60405180910390a36000600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060136000015481118015611ec35750601360020154601360010154611ec0919061341a565b42115b8015611f1c5750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611ffc576000670de0b6b3a7640000614e204233604051602001611f4292919061405f565b6040516020818303038152906040528051906020012060001c611f65919061408b565b611f6f91906140bc565b9050611fb1612710611fa36105dc611f9585601360000154612add90919063ffffffff16565b612ac790919063ffffffff16565b61161e90919063ffffffff16565b821115611fd957611fd8611fd382601360000154612add90919063ffffffff16565b612b09565b5b42601360010181905550601360030154471115611ffa57611ff9476122f9565b5b505b5050505b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204f919061341a565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516120b39190613014565b60405180910390a350505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212a90614170565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614202565b60405180910390fd5b818103600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161226e9190613014565b60405180910390a3505050565b612283611634565b73ffffffffffffffffffffffffffffffffffffffff166122a161107f565b73ffffffffffffffffffffffffffffffffffffffff16146122f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ee9061426e565b60405180910390fd5b565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612361573d6000803e3d6000fd5b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60011515600c60030160009054906101000a900460ff161515148061249e575060011515600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b806125015750600c600001546124ff82600c60040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b105b806125d45750690fe1c215e8f838e0000061256782600c60040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b101580156125d357506910f0cf064dd5920000006125d082600c60040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b11155b5b8061269b5750600c6000015461263582600c60040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b11801561269a575042612698600c60020154600c60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b105b5b6126da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d1906142da565b60405180910390fd5b5050565b42612739600c60020154600c60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b10156127dc578261278f5780600c60040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190556127d6565b80600c60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555b50612899565b8261283e5780600c60040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612833919061341a565b925050819055612897565b80600c60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612890919061341a565b9250508190555b505b42600c60060160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60011515600c60030160009054906101000a900460ff161515148061295a575060011515600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b806129bd5750600c600101546129bb82600c60050160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b105b80612a845750600c60010154612a1e82600c60050160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b118015612a83575042612a81600c60020154600c60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b105b5b612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90614346565b60405180910390fd5b5050565b60008183612ad591906140bc565b905092915050565b60008183612aeb919061341a565b905092915050565b60008183612b019190614366565b905092915050565b6000600267ffffffffffffffff811115612b2657612b2561351c565b5b604051908082528060200260200182016040528015612b545781602001602082028036833780820191505090505b5090503081600081518110612b6c57612b6b61354b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c37919061358f565b81600181518110612c4b57612c4a61354b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612cb230601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461163c565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612d169594939291906136b5565b600060405180830381600087803b158015612d3057600080fd5b505af1158015612d44573d6000803e3d6000fd5b505050505050565b604051806040016040528060008152602001600081525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d9682612d6b565b9050919050565b612da681612d8b565b8114612db157600080fd5b50565b600081359050612dc381612d9d565b92915050565b600060208284031215612ddf57612dde612d66565b5b6000612ded84828501612db4565b91505092915050565b6000819050919050565b612e0981612df6565b82525050565b6000606082019050612e246000830186612e00565b612e316020830185612e00565b612e3e6040830184612e00565b949350505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e80578082015181840152602081019050612e65565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ea882612e46565b612eb28185612e51565b9350612ec2818560208601612e62565b612ecb81612e8c565b840191505092915050565b60006020820190508181036000830152612ef08184612e9d565b905092915050565b612f0181612df6565b8114612f0c57600080fd5b50565b600081359050612f1e81612ef8565b92915050565b60008060408385031215612f3b57612f3a612d66565b5b6000612f4985828601612db4565b9250506020612f5a85828601612f0f565b9150509250929050565b60008115159050919050565b612f7981612f64565b82525050565b6000602082019050612f946000830184612f70565b92915050565b6000819050919050565b6000612fbf612fba612fb584612d6b565b612f9a565b612d6b565b9050919050565b6000612fd182612fa4565b9050919050565b6000612fe382612fc6565b9050919050565b612ff381612fd8565b82525050565b600060208201905061300e6000830184612fea565b92915050565b60006020820190506130296000830184612e00565b92915050565b60008060006060848603121561304857613047612d66565b5b600061305686828701612db4565b935050602061306786828701612db4565b925050604061307886828701612f0f565b9150509250925092565b600060ff82169050919050565b61309881613082565b82525050565b60006020820190506130b3600083018461308f565b92915050565b6000602082840312156130cf576130ce612d66565b5b60006130dd84828501612f0f565b91505092915050565b6130ef81612d8b565b82525050565b600060208201905061310a60008301846130e6565b92915050565b600061311b82612d6b565b9050919050565b61312b81613110565b811461313657600080fd5b50565b60008135905061314881613122565b92915050565b600061315982612d8b565b9050919050565b6131698161314e565b811461317457600080fd5b50565b60008135905061318681613160565b92915050565b600080604083850312156131a3576131a2612d66565b5b60006131b185828601613139565b92505060206131c285828601613177565b9150509250929050565b600080600080608085870312156131e6576131e5612d66565b5b60006131f487828801612f0f565b945050602061320587828801612f0f565b935050604061321687828801612f0f565b925050606061322787828801612f0f565b91505092959194509250565b61323c81612f64565b811461324757600080fd5b50565b60008135905061325981613233565b92915050565b6000806000806080858703121561327957613278612d66565b5b600061328787828801612f0f565b945050602061329887828801612f0f565b93505060406132a987828801612f0f565b92505060606132ba8782880161324a565b91505092959194509250565b60006080820190506132db6000830187612e00565b6132e86020830186612e00565b6132f56040830185612e00565b6133026060830184612e00565b95945050505050565b6000806040838503121561332257613321612d66565b5b600061333085828601612db4565b92505060206133418582860161324a565b9150509250929050565b6000806040838503121561336257613361612d66565b5b600061337085828601612db4565b925050602061338185828601612db4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133d257607f821691505b6020821081036133e5576133e461338b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061342582612df6565b915061343083612df6565b9250828201905080821115613448576134476133eb565b5b92915050565b60008151905061345d81612ef8565b92915050565b60006020828403121561347957613478612d66565b5b60006134878482850161344e565b91505092915050565b600061349b82612fc6565b9050919050565b6134ab81613490565b82525050565b60006040820190506134c660008301856134a2565b6134d36020830184612e00565b9392505050565b6000815190506134e981613233565b92915050565b60006020828403121561350557613504612d66565b5b6000613513848285016134da565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061358981612d9d565b92915050565b6000602082840312156135a5576135a4612d66565b5b60006135b38482850161357a565b91505092915050565b6000819050919050565b60006135e16135dc6135d7846135bc565b612f9a565b612df6565b9050919050565b6135f1816135c6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61362c81612d8b565b82525050565b600061363e8383613623565b60208301905092915050565b6000602082019050919050565b6000613662826135f7565b61366c8185613602565b935061367783613613565b8060005b838110156136a857815161368f8882613632565b975061369a8361364a565b92505060018101905061367b565b5085935050505092915050565b600060a0820190506136ca6000830188612e00565b6136d760208301876135e8565b81810360408301526136e98186613657565b90506136f860608301856130e6565b6137056080830184612e00565b9695505050505050565b7f427579207472616e73616374696f6e206c696d697420697320746f6f206c6f7760008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b600061376b602183612e51565b91506137768261370f565b604082019050919050565b6000602082019050818103600083015261379a8161375e565b9050919050565b7f53656c6c207472616e73616374696f6e206c696d697420697320746f6f206c6f60008201527f7721000000000000000000000000000000000000000000000000000000000000602082015250565b60006137fd602283612e51565b9150613808826137a1565b604082019050919050565b6000602082019050818103600083015261382c816137f0565b9050919050565b7f436f6f6c646f776e2073686f756c642062652035206d696e75746573206f722060008201527f6c65737321000000000000000000000000000000000000000000000000000000602082015250565b600061388f602583612e51565b915061389a82613833565b604082019050919050565b600060208201905081810360008301526138be81613882565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613921602583612e51565b915061392c826138c5565b604082019050919050565b6000602082019050818103600083015261395081613914565b9050919050565b600081905092915050565b7f6d61726b6574696e674275790000000000000000000000000000000000000000600082015250565b6000613998600c83613957565b91506139a382613962565b600c82019050919050565b60006139b98261398b565b9150819050919050565b7f6465764275790000000000000000000000000000000000000000000000000000600082015250565b60006139f9600683613957565b9150613a04826139c3565b600682019050919050565b6000613a1a826139ec565b9150819050919050565b7f6d61726b6574696e6753656c6c00000000000000000000000000000000000000600082015250565b6000613a5a600d83613957565b9150613a6582613a24565b600d82019050919050565b6000613a7b82613a4d565b9150819050919050565b7f64657653656c6c00000000000000000000000000000000000000000000000000600082015250565b6000613abb600783613957565b9150613ac682613a85565b600782019050919050565b6000613adc82613aae565b9150819050919050565b7f4d61726b6574696e672066656520697320746f6f206869676821000000000000600082015250565b6000613b1c601a83612e51565b9150613b2782613ae6565b602082019050919050565b60006020820190508181036000830152613b4b81613b0f565b9050919050565b7f4465762066656520697320746f6f206869676821000000000000000000000000600082015250565b6000613b88601483612e51565b9150613b9382613b52565b602082019050919050565b60006020820190508181036000830152613bb781613b7b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c1a602683612e51565b9150613c2582613bbe565b604082019050919050565b60006020820190508181036000830152613c4981613c0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c8a82612df6565b9150613c9583612df6565b925082613ca557613ca4613c50565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d0c602483612e51565b9150613d1782613cb0565b604082019050919050565b60006020820190508181036000830152613d3b81613cff565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d9e602283612e51565b9150613da982613d42565b604082019050919050565b60006020820190508181036000830152613dcd81613d91565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613e0a601d83612e51565b9150613e1582613dd4565b602082019050919050565b60006020820190508181036000830152613e3981613dfd565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613e9c602583612e51565b9150613ea782613e40565b604082019050919050565b60006020820190508181036000830152613ecb81613e8f565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f2e602383612e51565b9150613f3982613ed2565b604082019050919050565b60006020820190508181036000830152613f5d81613f21565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613fc0602683612e51565b9150613fcb82613f64565b604082019050919050565b60006020820190508181036000830152613fef81613fb3565b9050919050565b6000819050919050565b61401161400c82612df6565b613ff6565b82525050565b60008160601b9050919050565b600061402f82614017565b9050919050565b600061404182614024565b9050919050565b61405961405482612d8b565b614036565b82525050565b600061406b8285614000565b60208201915061407b8284614048565b6014820191508190509392505050565b600061409682612df6565b91506140a183612df6565b9250826140b1576140b0613c50565b5b828206905092915050565b60006140c782612df6565b91506140d283612df6565b92508282026140e081612df6565b915082820484148315176140f7576140f66133eb565b5b5092915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061415a602183612e51565b9150614165826140fe565b604082019050919050565b600060208201905081810360008301526141898161414d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006141ec602283612e51565b91506141f782614190565b604082019050919050565b6000602082019050818103600083015261421b816141df565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614258602083612e51565b915061426382614222565b602082019050919050565b600060208201905081810360008301526142878161424b565b9050919050565b7f427579207472616e73616374696f6e206c696d69742072656163686564210000600082015250565b60006142c4601e83612e51565b91506142cf8261428e565b602082019050919050565b600060208201905081810360008301526142f3816142b7565b9050919050565b7f53656c6c207472616e73616374696f6e206c696d697420726561636865642100600082015250565b6000614330601f83612e51565b915061433b826142fa565b602082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b600061437182612df6565b915061437c83612df6565b9250828203905081811115614394576143936133eb565b5b9291505056fea2646970667358221220641dc0960ee2ecc98fb8d4fb90ff1d9b7ceb4bb6284ee6a5cf7f90cf102c10f164736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101f15760003560e01c80636745297e1161010d5780639fde54f5116100a0578063b4e7dfa21161006f578063b4e7dfa214610720578063d73fe0aa1461074b578063dd62ed3e14610779578063f03b6ffc146107b6578063f2fde38b146107df576101f8565b80639fde54f514610654578063a1883d261461067d578063a457c2d7146106a6578063a9059cbb146106e3576101f8565b806388d9f5ea116100dc57806388d9f5ea146105aa5780638d7a8ba7146105d55780638da5cb5b146105fe57806395d89b4114610629576101f8565b80636745297e146104ff57806370a0823114610528578063715018a61461056557806373d002241461057c576101f8565b80633950935111610185578063526731e611610154578063526731e61461044757806361b97324146104705780636519aa241461049957806365fe6fcc146104c2576101f8565b8063395093511461039f57806342966c68146103dc57806349bd5a5e1461040557806349d3c13514610430576101f8565b806318160ddd116101c157806318160ddd146102cf57806323b872dd146102fa578063313ce56714610337578063361f4fb414610362576101f8565b806220a403146101fd57806306fdde031461023c578063095ea7b3146102675780631694505e146102a4576101f8565b366101f857005b600080fd5b34801561020957600080fd5b50610224600480360381019061021f9190612dc9565b610808565b60405161023393929190612e0f565b60405180910390f35b34801561024857600080fd5b506102516108e3565b60405161025e9190612ed6565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190612f24565b610975565b60405161029b9190612f7f565b60405180910390f35b3480156102b057600080fd5b506102b9610998565b6040516102c69190612ff9565b60405180910390f35b3480156102db57600080fd5b506102e46109be565b6040516102f19190613014565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c919061302f565b6109c8565b60405161032e9190612f7f565b60405180910390f35b34801561034357600080fd5b5061034c6109f7565b604051610359919061309e565b60405180910390f35b34801561036e57600080fd5b5061038960048036038101906103849190612dc9565b610a0e565b6040516103969190612f7f565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c19190612f24565b610a2e565b6040516103d39190612f7f565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906130b9565b610a65565b005b34801561041157600080fd5b5061041a610a79565b60405161042791906130f5565b60405180910390f35b34801561043c57600080fd5b50610445610a9f565b005b34801561045357600080fd5b5061046e6004803603810190610469919061318c565b610ab8565b005b34801561047c57600080fd5b50610497600480360381019061049291906131cc565b610bbc565b005b3480156104a557600080fd5b506104c060048036038101906104bb91906130b9565b610bf2565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190612dc9565b610e3d565b6040516104f69190612f7f565b60405180910390f35b34801561050b57600080fd5b506105266004803603810190610521919061325f565b610e5d565b005b34801561053457600080fd5b5061054f600480360381019061054a9190612dc9565b610f9b565b60405161055c9190613014565b60405180910390f35b34801561057157600080fd5b5061057a610fe4565b005b34801561058857600080fd5b50610591610ff8565b6040516105a194939291906132c6565b60405180910390f35b3480156105b657600080fd5b506105bf611016565b6040516105cc9190613014565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f7919061330b565b61101c565b005b34801561060a57600080fd5b5061061361107f565b60405161062091906130f5565b60405180910390f35b34801561063557600080fd5b5061063e6110a8565b60405161064b9190612ed6565b60405180910390f35b34801561066057600080fd5b5061067b6004803603810190610676919061330b565b61113a565b005b34801561068957600080fd5b506106a4600480360381019061069f9190612dc9565b61119d565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190612f24565b6111e9565b6040516106da9190612f7f565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190612f24565b611260565b6040516107179190612f7f565b60405180910390f35b34801561072c57600080fd5b50610735611283565b60405161074291906130f5565b60405180910390f35b34801561075757600080fd5b506107606112a9565b60405161077094939291906132c6565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b919061334b565b611331565b6040516107ad9190613014565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d891906131cc565b6113b8565b005b3480156107eb57600080fd5b5061080660048036038101906108019190612dc9565b61159b565b005b6000806000600c60040160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60050160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60060160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250925092509193909250565b6060600480546108f2906133ba565b80601f016020809104026020016040519081016040528092919081815260200182805461091e906133ba565b801561096b5780601f106109405761010080835404028352916020019161096b565b820191906000526020600020905b81548152906001019060200180831161094e57829003601f168201915b5050505050905090565b600080610980611634565b905061098d81858561163c565b600191505092915050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b6000806109d3611634565b90506109e0858285611805565b6109eb858585611891565b60019150509392505050565b6000600660009054906101000a900460ff16905090565b60096020528060005260406000206000915054906101000a900460ff1681565b600080610a39611634565b9050610a5a818585610a4b8589611331565b610a55919061341a565b61163c565b600191505092915050565b610a76610a70611634565b826120c4565b50565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aa761227b565b6000479050610ab5816122f9565b50565b610ac061227b565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b1691906130f5565b602060405180830381865afa158015610b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b579190613463565b6040518363ffffffff1660e01b8152600401610b749291906134b1565b6020604051808303816000875af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb791906134ef565b505050565b610bc461227b565b8360136000018190555082601360010181905550816013600201819055508060136003018190555050505050565b610bfa61227b565b6000600267ffffffffffffffff811115610c1757610c1661351c565b5b604051908082528060200260200182016040528015610c455781602001602082028036833780820191505090505b5090503081600081518110610c5d57610c5c61354b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d28919061358f565b81600181518110610d3c57610d3b61354b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610da330601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461163c565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401610e079594939291906136b5565b600060405180830381600087803b158015610e2157600080fd5b505af1158015610e35573d6000803e3d6000fd5b505050505050565b60086020528060005260406000206000915054906101000a900460ff1681565b610e6561227b565b610e7b60c860035461161e90919063ffffffff16565b841015610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490613781565b60405180910390fd5b610ed360c860035461161e90919063ffffffff16565b831015610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c90613813565b60405180910390fd5b61012c821115610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f51906138a5565b60405180910390fd5b83600c6000018190555082600c6001018190555081600c6002018190555080600c60030160006101000a81548160ff02191690831515021790555050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fec61227b565b610ff66000612365565b565b60138060000154908060010154908060020154908060030154905084565b600b5481565b61102461227b565b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546110b7906133ba565b80601f01602080910402602001604051908101604052809291908181526020018280546110e3906133ba565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b61114261227b565b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6111a561227b565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111f4611634565b905060006112028286611331565b905083811015611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613937565b60405180910390fd5b611254828686840361163c565b60019250505092915050565b60008061126b611634565b9050611278818585611891565b600191505092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060076040516112bd906139ae565b90815260200160405180910390205460076040516112da90613a0f565b90815260200160405180910390205460076040516112f790613a70565b908152602001604051809103902054600760405161131490613ad1565b908152602001604051809103902054935093509350935090919293565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113c061227b565b610320841115611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90613b32565b60405180910390fd5b61032083111561144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190613b9e565b60405180910390fd5b61032082111561148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690613b32565b60405180910390fd5b6103208111156114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90613b9e565b60405180910390fd5b8360076040516114e3906139ae565b90815260200160405180910390208190555082600760405161150490613a0f565b90815260200160405180910390208190555081600760405161152590613a70565b90815260200160405180910390208190555080600760405161154690613ad1565b9081526020016040518091039020819055507f8e53f02bf55e86feff3ee41c4949ebe67a91c971ac6ed57ea3f4f6ed0ecadfb98484848460405161158d94939291906132c6565b60405180910390a150505050565b6115a361227b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990613c30565b60405180910390fd5b61161b81612365565b50565b6000818361162c9190613c7f565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290613d22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190613db4565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117f89190613014565b60405180910390a3505050565b60006118118484611331565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461188b578181101561187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490613e20565b60405180910390fd5b61188a848484840361163c565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790613eb2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690613f44565b60405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90613fd6565b60405180910390fd5b600080600060019050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603611aad57611a5e8686612429565b611a6a600087876126de565b6007604051611a78906139ae565b90815260200160405180910390205492506007604051611a9790613a0f565b9081526020016040518091039020549150611b58565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611b5757611b0c87866128e5565b611b18600188876126de565b6007604051611b2690613a70565b90815260200160405180910390205492506007604051611b4590613ad1565b90815260200160405180910390205491505b5b848403600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611c3f5750600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611c4957600090505b808015611cfb5750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480611cfa5750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b5b1561200057611d08612d4c565b611d2f612710611d218689612ac790919063ffffffff16565b61161e90919063ffffffff16565b816000018181525050611d5f612710611d518589612ac790919063ffffffff16565b61161e90919063ffffffff16565b8160200181815250506000611d8582602001518360000151612add90919063ffffffff16565b9050611d9a8188612af390919063ffffffff16565b965080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611deb919061341a565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e4f9190613014565b60405180910390a36000600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060136000015481118015611ec35750601360020154601360010154611ec0919061341a565b42115b8015611f1c5750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611ffc576000670de0b6b3a7640000614e204233604051602001611f4292919061405f565b6040516020818303038152906040528051906020012060001c611f65919061408b565b611f6f91906140bc565b9050611fb1612710611fa36105dc611f9585601360000154612add90919063ffffffff16565b612ac790919063ffffffff16565b61161e90919063ffffffff16565b821115611fd957611fd8611fd382601360000154612add90919063ffffffff16565b612b09565b5b42601360010181905550601360030154471115611ffa57611ff9476122f9565b5b505b5050505b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204f919061341a565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516120b39190613014565b60405180910390a350505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212a90614170565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614202565b60405180910390fd5b818103600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161226e9190613014565b60405180910390a3505050565b612283611634565b73ffffffffffffffffffffffffffffffffffffffff166122a161107f565b73ffffffffffffffffffffffffffffffffffffffff16146122f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ee9061426e565b60405180910390fd5b565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612361573d6000803e3d6000fd5b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60011515600c60030160009054906101000a900460ff161515148061249e575060011515600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b806125015750600c600001546124ff82600c60040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b105b806125d45750690fe1c215e8f838e0000061256782600c60040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b101580156125d357506910f0cf064dd5920000006125d082600c60040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b11155b5b8061269b5750600c6000015461263582600c60040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b11801561269a575042612698600c60020154600c60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b105b5b6126da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d1906142da565b60405180910390fd5b5050565b42612739600c60020154600c60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b10156127dc578261278f5780600c60040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190556127d6565b80600c60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555b50612899565b8261283e5780600c60040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612833919061341a565b925050819055612897565b80600c60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612890919061341a565b9250508190555b505b42600c60060160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60011515600c60030160009054906101000a900460ff161515148061295a575060011515600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b806129bd5750600c600101546129bb82600c60050160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b105b80612a845750600c60010154612a1e82600c60050160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b118015612a83575042612a81600c60020154600c60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612add90919063ffffffff16565b105b5b612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90614346565b60405180910390fd5b5050565b60008183612ad591906140bc565b905092915050565b60008183612aeb919061341a565b905092915050565b60008183612b019190614366565b905092915050565b6000600267ffffffffffffffff811115612b2657612b2561351c565b5b604051908082528060200260200182016040528015612b545781602001602082028036833780820191505090505b5090503081600081518110612b6c57612b6b61354b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c37919061358f565b81600181518110612c4b57612c4a61354b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612cb230601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461163c565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612d169594939291906136b5565b600060405180830381600087803b158015612d3057600080fd5b505af1158015612d44573d6000803e3d6000fd5b505050505050565b604051806040016040528060008152602001600081525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d9682612d6b565b9050919050565b612da681612d8b565b8114612db157600080fd5b50565b600081359050612dc381612d9d565b92915050565b600060208284031215612ddf57612dde612d66565b5b6000612ded84828501612db4565b91505092915050565b6000819050919050565b612e0981612df6565b82525050565b6000606082019050612e246000830186612e00565b612e316020830185612e00565b612e3e6040830184612e00565b949350505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e80578082015181840152602081019050612e65565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ea882612e46565b612eb28185612e51565b9350612ec2818560208601612e62565b612ecb81612e8c565b840191505092915050565b60006020820190508181036000830152612ef08184612e9d565b905092915050565b612f0181612df6565b8114612f0c57600080fd5b50565b600081359050612f1e81612ef8565b92915050565b60008060408385031215612f3b57612f3a612d66565b5b6000612f4985828601612db4565b9250506020612f5a85828601612f0f565b9150509250929050565b60008115159050919050565b612f7981612f64565b82525050565b6000602082019050612f946000830184612f70565b92915050565b6000819050919050565b6000612fbf612fba612fb584612d6b565b612f9a565b612d6b565b9050919050565b6000612fd182612fa4565b9050919050565b6000612fe382612fc6565b9050919050565b612ff381612fd8565b82525050565b600060208201905061300e6000830184612fea565b92915050565b60006020820190506130296000830184612e00565b92915050565b60008060006060848603121561304857613047612d66565b5b600061305686828701612db4565b935050602061306786828701612db4565b925050604061307886828701612f0f565b9150509250925092565b600060ff82169050919050565b61309881613082565b82525050565b60006020820190506130b3600083018461308f565b92915050565b6000602082840312156130cf576130ce612d66565b5b60006130dd84828501612f0f565b91505092915050565b6130ef81612d8b565b82525050565b600060208201905061310a60008301846130e6565b92915050565b600061311b82612d6b565b9050919050565b61312b81613110565b811461313657600080fd5b50565b60008135905061314881613122565b92915050565b600061315982612d8b565b9050919050565b6131698161314e565b811461317457600080fd5b50565b60008135905061318681613160565b92915050565b600080604083850312156131a3576131a2612d66565b5b60006131b185828601613139565b92505060206131c285828601613177565b9150509250929050565b600080600080608085870312156131e6576131e5612d66565b5b60006131f487828801612f0f565b945050602061320587828801612f0f565b935050604061321687828801612f0f565b925050606061322787828801612f0f565b91505092959194509250565b61323c81612f64565b811461324757600080fd5b50565b60008135905061325981613233565b92915050565b6000806000806080858703121561327957613278612d66565b5b600061328787828801612f0f565b945050602061329887828801612f0f565b93505060406132a987828801612f0f565b92505060606132ba8782880161324a565b91505092959194509250565b60006080820190506132db6000830187612e00565b6132e86020830186612e00565b6132f56040830185612e00565b6133026060830184612e00565b95945050505050565b6000806040838503121561332257613321612d66565b5b600061333085828601612db4565b92505060206133418582860161324a565b9150509250929050565b6000806040838503121561336257613361612d66565b5b600061337085828601612db4565b925050602061338185828601612db4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133d257607f821691505b6020821081036133e5576133e461338b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061342582612df6565b915061343083612df6565b9250828201905080821115613448576134476133eb565b5b92915050565b60008151905061345d81612ef8565b92915050565b60006020828403121561347957613478612d66565b5b60006134878482850161344e565b91505092915050565b600061349b82612fc6565b9050919050565b6134ab81613490565b82525050565b60006040820190506134c660008301856134a2565b6134d36020830184612e00565b9392505050565b6000815190506134e981613233565b92915050565b60006020828403121561350557613504612d66565b5b6000613513848285016134da565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061358981612d9d565b92915050565b6000602082840312156135a5576135a4612d66565b5b60006135b38482850161357a565b91505092915050565b6000819050919050565b60006135e16135dc6135d7846135bc565b612f9a565b612df6565b9050919050565b6135f1816135c6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61362c81612d8b565b82525050565b600061363e8383613623565b60208301905092915050565b6000602082019050919050565b6000613662826135f7565b61366c8185613602565b935061367783613613565b8060005b838110156136a857815161368f8882613632565b975061369a8361364a565b92505060018101905061367b565b5085935050505092915050565b600060a0820190506136ca6000830188612e00565b6136d760208301876135e8565b81810360408301526136e98186613657565b90506136f860608301856130e6565b6137056080830184612e00565b9695505050505050565b7f427579207472616e73616374696f6e206c696d697420697320746f6f206c6f7760008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b600061376b602183612e51565b91506137768261370f565b604082019050919050565b6000602082019050818103600083015261379a8161375e565b9050919050565b7f53656c6c207472616e73616374696f6e206c696d697420697320746f6f206c6f60008201527f7721000000000000000000000000000000000000000000000000000000000000602082015250565b60006137fd602283612e51565b9150613808826137a1565b604082019050919050565b6000602082019050818103600083015261382c816137f0565b9050919050565b7f436f6f6c646f776e2073686f756c642062652035206d696e75746573206f722060008201527f6c65737321000000000000000000000000000000000000000000000000000000602082015250565b600061388f602583612e51565b915061389a82613833565b604082019050919050565b600060208201905081810360008301526138be81613882565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613921602583612e51565b915061392c826138c5565b604082019050919050565b6000602082019050818103600083015261395081613914565b9050919050565b600081905092915050565b7f6d61726b6574696e674275790000000000000000000000000000000000000000600082015250565b6000613998600c83613957565b91506139a382613962565b600c82019050919050565b60006139b98261398b565b9150819050919050565b7f6465764275790000000000000000000000000000000000000000000000000000600082015250565b60006139f9600683613957565b9150613a04826139c3565b600682019050919050565b6000613a1a826139ec565b9150819050919050565b7f6d61726b6574696e6753656c6c00000000000000000000000000000000000000600082015250565b6000613a5a600d83613957565b9150613a6582613a24565b600d82019050919050565b6000613a7b82613a4d565b9150819050919050565b7f64657653656c6c00000000000000000000000000000000000000000000000000600082015250565b6000613abb600783613957565b9150613ac682613a85565b600782019050919050565b6000613adc82613aae565b9150819050919050565b7f4d61726b6574696e672066656520697320746f6f206869676821000000000000600082015250565b6000613b1c601a83612e51565b9150613b2782613ae6565b602082019050919050565b60006020820190508181036000830152613b4b81613b0f565b9050919050565b7f4465762066656520697320746f6f206869676821000000000000000000000000600082015250565b6000613b88601483612e51565b9150613b9382613b52565b602082019050919050565b60006020820190508181036000830152613bb781613b7b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c1a602683612e51565b9150613c2582613bbe565b604082019050919050565b60006020820190508181036000830152613c4981613c0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c8a82612df6565b9150613c9583612df6565b925082613ca557613ca4613c50565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d0c602483612e51565b9150613d1782613cb0565b604082019050919050565b60006020820190508181036000830152613d3b81613cff565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d9e602283612e51565b9150613da982613d42565b604082019050919050565b60006020820190508181036000830152613dcd81613d91565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613e0a601d83612e51565b9150613e1582613dd4565b602082019050919050565b60006020820190508181036000830152613e3981613dfd565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613e9c602583612e51565b9150613ea782613e40565b604082019050919050565b60006020820190508181036000830152613ecb81613e8f565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f2e602383612e51565b9150613f3982613ed2565b604082019050919050565b60006020820190508181036000830152613f5d81613f21565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613fc0602683612e51565b9150613fcb82613f64565b604082019050919050565b60006020820190508181036000830152613fef81613fb3565b9050919050565b6000819050919050565b61401161400c82612df6565b613ff6565b82525050565b60008160601b9050919050565b600061402f82614017565b9050919050565b600061404182614024565b9050919050565b61405961405482612d8b565b614036565b82525050565b600061406b8285614000565b60208201915061407b8284614048565b6014820191508190509392505050565b600061409682612df6565b91506140a183612df6565b9250826140b1576140b0613c50565b5b828206905092915050565b60006140c782612df6565b91506140d283612df6565b92508282026140e081612df6565b915082820484148315176140f7576140f66133eb565b5b5092915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061415a602183612e51565b9150614165826140fe565b604082019050919050565b600060208201905081810360008301526141898161414d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006141ec602283612e51565b91506141f782614190565b604082019050919050565b6000602082019050818103600083015261421b816141df565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614258602083612e51565b915061426382614222565b602082019050919050565b600060208201905081810360008301526142878161424b565b9050919050565b7f427579207472616e73616374696f6e206c696d69742072656163686564210000600082015250565b60006142c4601e83612e51565b91506142cf8261428e565b602082019050919050565b600060208201905081810360008301526142f3816142b7565b9050919050565b7f53656c6c207472616e73616374696f6e206c696d697420726561636865642100600082015250565b6000614330601f83612e51565b915061433b826142fa565b602082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b600061437182612df6565b915061437c83612df6565b9250828203905081811115614394576143936133eb565b5b9291505056fea2646970667358221220641dc0960ee2ecc98fb8d4fb90ff1d9b7ceb4bb6284ee6a5cf7f90cf102c10f164736f6c63430008120033

Deployed Bytecode Sourcemap

18262:20333:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26601:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;28338:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29960:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19569:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28780:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30742:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28671:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18808:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31447:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38501:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19617:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27822:169;;;;;;;;;;;;;:::i;:::-;;28000:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24025:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27334:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18761:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23428:547;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28897:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10116:103;;;;;;;;;;;;;:::i;:::-;;19532:27;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;18910:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23229:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9466:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28558:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23027:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22834:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32189:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29231:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18864:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22421:345;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;29488:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21595:757;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10375:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26601:208;26660:12;26674:13;26689:14;26724:8;:13;;:23;26738:8;26724:23;;;;;;;;;;;;;;;;26749:8;:14;;:24;26764:8;26749:24;;;;;;;;;;;;;;;;26775:8;:15;;:25;26791:8;26775:25;;;;;;;;;;;;;;;;26716:85;;;;;;26601:208;;;;;:::o;28338:100::-;28392:13;28425:5;28418:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28338:100;:::o;29960:201::-;30043:4;30060:13;30076:12;:10;:12::i;:::-;30060:28;;30099:32;30108:5;30115:7;30124:6;30099:8;:32::i;:::-;30149:4;30142:11;;;29960:201;;;;:::o;19569:41::-;;;;;;;;;;;;;:::o;28780:108::-;28841:7;28868:12;;28861:19;;28780:108;:::o;30742:295::-;30873:4;30890:15;30908:12;:10;:12::i;:::-;30890:30;;30931:38;30947:4;30953:7;30962:6;30931:15;:38::i;:::-;30980:27;30990:4;30996:2;31000:6;30980:9;:27::i;:::-;31025:4;31018:11;;;30742:295;;;;;:::o;28671:100::-;28729:5;28754:9;;;;;;;;;;;28747:16;;28671:100;:::o;18808:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;31447:238::-;31535:4;31552:13;31568:12;:10;:12::i;:::-;31552:28;;31591:64;31600:5;31607:7;31644:10;31616:25;31626:5;31633:7;31616:9;:25::i;:::-;:38;;;;:::i;:::-;31591:8;:64::i;:::-;31673:4;31666:11;;;31447:238;;;;:::o;38501:91::-;38557:27;38563:12;:10;:12::i;:::-;38577:6;38557:5;:27::i;:::-;38501:91;:::o;19617:28::-;;;;;;;;;;;;;:::o;27822:169::-;9351:13;:11;:13::i;:::-;27880:29:::1;27912:21;27880:53;;27944:39;27961:21;27944:16;:39::i;:::-;27869:122;27822:169::o:0;28000:151::-;9351:13;:11;:13::i;:::-;28090:6:::1;:15;;;28106:3;28111:6;:16;;;28136:4;28111:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28090:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28000:151:::0;;:::o;24025:304::-;9351:13;:11;:13::i;:::-;24182::::1;24156:10;:23;;:39;;;;24228:9;24206:10;:19;;:31;;;;24271:6;24248:10;:20;;:29;;;;24311:10;24288;:20;;:33;;;;24025:304:::0;;;;:::o;27334:479::-;9351:13;:11;:13::i;:::-;27416:21:::1;27454:1;27440:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27416:40;;27485:4;27467;27472:1;27467:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;27511:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27501:4;27506:1;27501:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;27544:58;27561:4;27576:15;;;;;;;;;;;27594:7;27544:8;:58::i;:::-;27613:15;;;;;;;;;;;:66;;;27694:7;27716:1;27732:4;27759;27779:15;27613:192;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27405:408;27334:479:::0;:::o;18761:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;23428:547::-;9351:13;:11;:13::i;:::-;23568:21:::1;23585:3;23568:12;;:16;;:21;;;;:::i;:::-;23555:9;:34;;23547:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;23668:21;23685:3;23668:12;;:16;;:21;;;;:::i;:::-;23654:10;:35;;23646:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;23763:9;23756:3;:16;;23748:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;23848:9;23828:8;:17;;:29;;;;23889:10;23868:8;:18;;:31;;;;23924:3;23910:8;:11;;:17;;;;23958:9;23938:8;:17;;;:29;;;;;;;;;;;;;;;;;;23428:547:::0;;;;:::o;28897:127::-;28971:7;28998:9;:18;29008:7;28998:18;;;;;;;;;;;;;;;;28991:25;;28897:127;;;:::o;10116:103::-;9351:13;:11;:13::i;:::-;10181:30:::1;10208:1;10181:18;:30::i;:::-;10116:103::o:0;19532:27::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;18910:45::-;;;;:::o;23229:127::-;9351:13;:11;:13::i;:::-;23342:6:::1;23316:13;:23;23330:8;23316:23;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;23229:127:::0;;:::o;9466:87::-;9512:7;9539:6;;;;;;;;;;;9532:13;;9466:87;:::o;28558:104::-;28614:13;28647:7;28640:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28558:104;:::o;23027:114::-;9351:13;:11;:13::i;:::-;23127:6:::1;23107:7;:17;23115:8;23107:17;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;23027:114:::0;;:::o;22834:107::-;9351:13;:11;:13::i;:::-;22922:11:::1;22908;;:25;;;;;;;;;;;;;;;;;;22834:107:::0;:::o;32189:437::-;32282:4;32299:13;32315:12;:10;:12::i;:::-;32299:28;;32338:24;32365:25;32375:5;32382:7;32365:9;:25::i;:::-;32338:52;;32429:15;32409:16;:35;;32401:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32522:60;32531:5;32538:7;32566:15;32547:16;:34;32522:8;:60::i;:::-;32614:4;32607:11;;;;32189:437;;;;:::o;29231:193::-;29310:4;29327:13;29343:12;:10;:12::i;:::-;29327:28;;29366;29376:5;29383:2;29387:6;29366:9;:28::i;:::-;29412:4;29405:11;;;29231:193;;;;:::o;18864:39::-;;;;;;;;;;;;;:::o;22421:345::-;22472:20;22503:14;22528:21;22560:15;22616:8;:24;;;;;:::i;:::-;;;;;;;;;;;;;;22655:8;:18;;;;;:::i;:::-;;;;;;;;;;;;;;22688:8;:25;;;;;:::i;:::-;;;;;;;;;;;;;;22728:8;:19;;;;;:::i;:::-;;;;;;;;;;;;;;22594:164;;;;;;;;22421:345;;;;:::o;29488:151::-;29577:7;29604:11;:18;29616:5;29604:18;;;;;;;;;;;;;;;:27;29623:7;29604:27;;;;;;;;;;;;;;;;29597:34;;29488:151;;;;:::o;21595:757::-;9351:13;:11;:13::i;:::-;21794:3:::1;21777:13;:20;;21769:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;21858:3;21847:7;:14;;21839:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;21923:3;21905:14;:21;;21897:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;21988:3;21976:8;:15;;21968:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;22057:13;22030:8;:24;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;;22102:7;22081:8;:18;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;;22151:14;22123:8;:25;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;22198:8;22176;:19;;;;;:::i;:::-;;;;;;;;;;;;;:30;;;;22225:119;22246:13;22274:7;22296:14;22325:8;22225:119;;;;;;;;;:::i;:::-;;;;;;;;21595:757:::0;;;;:::o;10375:201::-;9351:13;:11;:13::i;:::-;10484:1:::1;10464:22;;:8;:22;;::::0;10456:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10540:28;10559:8;10540:18;:28::i;:::-;10375:201:::0;:::o;4059:98::-;4117:7;4148:1;4144;:5;;;;:::i;:::-;4137:12;;4059:98;;;;:::o;7953:::-;8006:7;8033:10;8026:17;;7953:98;:::o;36370:381::-;36523:1;36506:19;;:5;:19;;;36498:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36604:1;36585:21;;:7;:21;;;36577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36689:6;36659:11;:18;36671:5;36659:18;;;;;;;;;;;;;;;:27;36678:7;36659:27;;;;;;;;;;;;;;;:36;;;;36727:7;36711:32;;36720:5;36711:32;;;36736:6;36711:32;;;;;;:::i;:::-;;;;;;;;36370:381;;;:::o;37043:453::-;37178:24;37205:25;37215:5;37222:7;37205:9;:25::i;:::-;37178:52;;37265:17;37245:16;:37;37241:248;;37327:6;37307:16;:26;;37299:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37411:51;37420:5;37427:7;37455:6;37436:16;:25;37411:8;:51::i;:::-;37241:248;37167:329;37043:453;;;:::o;33106:2825::-;33253:1;33237:18;;:4;:18;;;33229:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33330:1;33316:16;;:2;:16;;;33308:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33386:19;33408:9;:15;33418:4;33408:15;;;;;;;;;;;;;;;;33386:37;;33457:6;33442:11;:21;;33434:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;33520:22;33553:16;33583:11;33597:4;33583:18;;33642:13;;;;;;;;;;;33634:21;;:4;:21;;;33631:498;;33672:27;33688:2;33692:6;33672:15;:27::i;:::-;33717:30;33729:5;33736:2;33740:6;33717:11;:30::i;:::-;33782:8;:24;;;;;:::i;:::-;;;;;;;;;;;;;;33765:41;;33832:8;:18;;;;;:::i;:::-;;;;;;;;;;;;;;33821:29;;33631:498;;;33903:13;;;;;;;;;;;33897:19;;:2;:19;;;33894:235;;33933:30;33950:4;33956:6;33933:16;:30::i;:::-;33981:31;33993:4;33999;34005:6;33981:11;:31::i;:::-;34047:8;:25;;;;;:::i;:::-;;;;;;;;;;;;;;34030:42;;34098:8;:19;;;;;:::i;:::-;;;;;;;;;;;;;;34087:30;;33894:235;33631:498;34199:6;34185:11;:20;34167:9;:15;34177:4;34167:15;;;;;;;;;;;;;;;:38;;;;34233:7;:11;34241:2;34233:11;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;34248:7;:13;34256:4;34248:13;;;;;;;;;;;;;;;;;;;;;;;;;34233:28;34230:74;;;34287:5;34278:14;;34230:74;34320:6;:56;;;;;34337:13;;;;;;;;;;;34331:19;;:2;:19;;;:44;;;;34362:13;;;;;;;;;;;34354:21;;:4;:21;;;34331:44;34320:56;34317:1528;;;34393:29;;:::i;:::-;34464:37;34495:5;34464:26;34475:14;34464:6;:10;;:26;;;;:::i;:::-;:30;;:37;;;;:::i;:::-;34437:11;:24;;:64;;;;;34537:31;34562:5;34537:20;34548:8;34537:6;:10;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;34516:11;:18;;:52;;;;;34586:17;34623:66;34670:11;:18;;;34623:11;:24;;;:46;;:66;;;;:::i;:::-;34586:103;;34716:21;34727:9;34716:6;:10;;:21;;;;:::i;:::-;34707:30;;34783:9;34755;:24;34773:4;34755:24;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;34858:4;34835:40;;34844:4;34835:40;;;34865:9;34835:40;;;;;;:::i;:::-;;;;;;;;34930:28;34961:9;:24;34979:4;34961:24;;;;;;;;;;;;;;;;34930:55;;35048:10;:23;;;35025:20;:46;:127;;;;;35132:10;:20;;;35110:10;:19;;;:42;;;;:::i;:::-;35092:15;:60;35025:127;:167;;;;;35179:13;;;;;;;;;;;35173:19;;:2;:19;;;35025:167;35003:831;;;35282:20;35383:6;35374:5;35341:15;35358:10;35324:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35314:56;;;;;;35306:65;;:73;;;;:::i;:::-;35305:84;;;;:::i;:::-;35282:107;;35436:64;35494:5;35436:53;35484:4;35437:41;35465:12;35437:10;:23;;;:27;;:41;;;;:::i;:::-;35436:47;;:53;;;;:::i;:::-;:57;;:64;;;;:::i;:::-;35413:20;:87;35410:197;;;35525:62;35545:41;35573:12;35545:10;:23;;;:27;;:41;;;;:::i;:::-;35525:19;:62::i;:::-;35410:197;35650:15;35628:10;:19;;:37;;;;35714:10;:20;;;35690:21;:44;35687:132;;;35759:39;35776:21;35759:16;:39::i;:::-;35687:132;35208:626;35003:831;34378:1467;;;34317:1528;35875:6;35858:9;:13;35868:2;35858:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;35912:2;35897:26;;35906:4;35897:26;;;35916:6;35897:26;;;;;;:::i;:::-;;;;;;;;33218:2713;;;;33106:2825;;;:::o;37830:554::-;37933:1;37914:21;;:7;:21;;;37906:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37987:22;38012:9;:18;38022:7;38012:18;;;;;;;;;;;;;;;;37987:43;;38067:6;38049:14;:24;;38041:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38186:6;38169:14;:23;38148:9;:18;38158:7;38148:18;;;;;;;;;;;;;;;:44;;;;38303:6;38287:12;;:22;;;;;;;;;;;38365:1;38339:37;;38348:7;38339:37;;;38369:6;38339:37;;;;;;:::i;:::-;;;;;;;;37895:489;37830:554;;:::o;9632:132::-;9707:12;:10;:12::i;:::-;9696:23;;:7;:5;:7::i;:::-;:23;;;9688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9632:132::o;28160:108::-;28230:11;;;;;;;;;;;28222:29;;:38;28252:7;28222:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28160:108;:::o;10737:191::-;10811:16;10830:6;;;;;;;;;;;10811:25;;10856:8;10847:6;;:17;;;;;;;;;;;;;;;;;;10911:8;10880:40;;10901:8;10880:40;;;;;;;;;;;;10800:128;10737:191;:::o;24729:591::-;24856:4;24835:25;;:8;:17;;;;;;;;;;;;:25;;;:72;;;;24903:4;24877:30;;:13;:22;24891:7;24877:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;24835:72;:144;;;;24962:8;:17;;;24924:35;24951:7;24924:8;:13;;:22;24938:7;24924:22;;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;:55;24835:144;:269;;;;25036:12;24997:35;25024:7;24997:8;:13;;:22;25011:7;24997:22;;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;:51;;:106;;;;;25091:12;25052:35;25079:7;25052:8;:13;;:22;25066:7;25052:22;;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;:51;;24997:106;24835:269;:419;;;;25160:8;:17;;;25122:35;25149:7;25122:8;:13;;:22;25136:7;25122:22;;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;:55;:131;;;;;25238:15;25194:41;25223:8;:11;;;25194:8;:15;;:24;25210:7;25194:24;;;;;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;:59;25122:131;24835:419;24813:499;;;;;;;;;;;;:::i;:::-;;;;;;;;;24729:591;;:::o;26052:434::-;26188:15;26144:41;26173:8;:11;;;26144:8;:15;;:24;26160:7;26144:24;;;;;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;:59;26141:282;;;26220:7;:78;;26291:7;26266:8;:13;;:22;26280:7;26266:22;;;;;;;;;;;;;;;:32;;;26220:78;;;26256:7;26230:8;:14;;:23;26245:7;26230:23;;;;;;;;;;;;;;;:33;;;26220:78;;26141:282;;;26331:7;:80;;26404:7;26378:8;:13;;:22;26392:7;26378:22;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;26331:80;;;26368:7;26341:8;:14;;:23;26356:7;26341:23;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;26331:80;;26141:282;26463:15;26436:8;:15;;:24;26452:7;26436:24;;;;;;;;;;;;;;;:42;;;;26052:434;;;:::o;25433:472::-;25561:4;25540:25;;:8;:17;;;;;;;;;;;;:25;;;:72;;;;25608:4;25582:30;;:13;:22;25596:7;25582:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;25540:72;:146;;;;25668:8;:18;;;25629:36;25657:7;25629:8;:14;;:23;25644:7;25629:23;;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;:57;25540:146;:298;;;;25743:8;:18;;;25704:36;25732:7;25704:8;:14;;:23;25719:7;25704:23;;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;:57;:133;;;;;25822:15;25778:41;25807:8;:11;;;25778:8;:15;;:24;25794:7;25778:24;;;;;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;:59;25704:133;25540:298;25518:379;;;;;;;;;;;;:::i;:::-;;;;;;;;;25433:472;;:::o;3659:98::-;3717:7;3748:1;3744;:5;;;;:::i;:::-;3737:12;;3659:98;;;;:::o;2919:::-;2977:7;3008:1;3004;:5;;;;:::i;:::-;2997:12;;2919:98;;;;:::o;3301:::-;3359:7;3390:1;3386;:5;;;;:::i;:::-;3379:12;;3301:98;;;;:::o;26862:463::-;26928:21;26966:1;26952:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26928:40;;26997:4;26979;26984:1;26979:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;27023:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27013:4;27018:1;27013:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;27056:58;27073:4;27088:15;;;;;;;;;;;27106:7;27056:8;:58::i;:::-;27125:15;;;;;;;;;;;:66;;;27206:7;27228:1;27244:4;27271;27291:15;27125:192;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26917:408;26862:463;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:442::-;1532:4;1570:2;1559:9;1555:18;1547:26;;1583:71;1651:1;1640:9;1636:17;1627:6;1583:71;:::i;:::-;1664:72;1732:2;1721:9;1717:18;1708:6;1664:72;:::i;:::-;1746;1814:2;1803:9;1799:18;1790:6;1746:72;:::i;:::-;1383:442;;;;;;:::o;1831:99::-;1883:6;1917:5;1911:12;1901:22;;1831:99;;;:::o;1936:169::-;2020:11;2054:6;2049:3;2042:19;2094:4;2089:3;2085:14;2070:29;;1936:169;;;;:::o;2111:246::-;2192:1;2202:113;2216:6;2213:1;2210:13;2202:113;;;2301:1;2296:3;2292:11;2286:18;2282:1;2277:3;2273:11;2266:39;2238:2;2235:1;2231:10;2226:15;;2202:113;;;2349:1;2340:6;2335:3;2331:16;2324:27;2173:184;2111:246;;;:::o;2363:102::-;2404:6;2455:2;2451:7;2446:2;2439:5;2435:14;2431:28;2421:38;;2363:102;;;:::o;2471:377::-;2559:3;2587:39;2620:5;2587:39;:::i;:::-;2642:71;2706:6;2701:3;2642:71;:::i;:::-;2635:78;;2722:65;2780:6;2775:3;2768:4;2761:5;2757:16;2722:65;:::i;:::-;2812:29;2834:6;2812:29;:::i;:::-;2807:3;2803:39;2796:46;;2563:285;2471:377;;;;:::o;2854:313::-;2967:4;3005:2;2994:9;2990:18;2982:26;;3054:9;3048:4;3044:20;3040:1;3029:9;3025:17;3018:47;3082:78;3155:4;3146:6;3082:78;:::i;:::-;3074:86;;2854:313;;;;:::o;3173:122::-;3246:24;3264:5;3246:24;:::i;:::-;3239:5;3236:35;3226:63;;3285:1;3282;3275:12;3226:63;3173:122;:::o;3301:139::-;3347:5;3385:6;3372:20;3363:29;;3401:33;3428:5;3401:33;:::i;:::-;3301:139;;;;:::o;3446:474::-;3514:6;3522;3571:2;3559:9;3550:7;3546:23;3542:32;3539:119;;;3577:79;;:::i;:::-;3539:119;3697:1;3722:53;3767:7;3758:6;3747:9;3743:22;3722:53;:::i;:::-;3712:63;;3668:117;3824:2;3850:53;3895:7;3886:6;3875:9;3871:22;3850:53;:::i;:::-;3840:63;;3795:118;3446:474;;;;;:::o;3926:90::-;3960:7;4003:5;3996:13;3989:21;3978:32;;3926:90;;;:::o;4022:109::-;4103:21;4118:5;4103:21;:::i;:::-;4098:3;4091:34;4022:109;;:::o;4137:210::-;4224:4;4262:2;4251:9;4247:18;4239:26;;4275:65;4337:1;4326:9;4322:17;4313:6;4275:65;:::i;:::-;4137:210;;;;:::o;4353:60::-;4381:3;4402:5;4395:12;;4353:60;;;:::o;4419:142::-;4469:9;4502:53;4520:34;4529:24;4547:5;4529:24;:::i;:::-;4520:34;:::i;:::-;4502:53;:::i;:::-;4489:66;;4419:142;;;:::o;4567:126::-;4617:9;4650:37;4681:5;4650:37;:::i;:::-;4637:50;;4567:126;;;:::o;4699:152::-;4775:9;4808:37;4839:5;4808:37;:::i;:::-;4795:50;;4699:152;;;:::o;4857:183::-;4970:63;5027:5;4970:63;:::i;:::-;4965:3;4958:76;4857:183;;:::o;5046:274::-;5165:4;5203:2;5192:9;5188:18;5180:26;;5216:97;5310:1;5299:9;5295:17;5286:6;5216:97;:::i;:::-;5046:274;;;;:::o;5326:222::-;5419:4;5457:2;5446:9;5442:18;5434:26;;5470:71;5538:1;5527:9;5523:17;5514:6;5470:71;:::i;:::-;5326:222;;;;:::o;5554:619::-;5631:6;5639;5647;5696:2;5684:9;5675:7;5671:23;5667:32;5664:119;;;5702:79;;:::i;:::-;5664:119;5822:1;5847:53;5892:7;5883:6;5872:9;5868:22;5847:53;:::i;:::-;5837:63;;5793:117;5949:2;5975:53;6020:7;6011:6;6000:9;5996:22;5975:53;:::i;:::-;5965:63;;5920:118;6077:2;6103:53;6148:7;6139:6;6128:9;6124:22;6103:53;:::i;:::-;6093:63;;6048:118;5554:619;;;;;:::o;6179:86::-;6214:7;6254:4;6247:5;6243:16;6232:27;;6179:86;;;:::o;6271:112::-;6354:22;6370:5;6354:22;:::i;:::-;6349:3;6342:35;6271:112;;:::o;6389:214::-;6478:4;6516:2;6505:9;6501:18;6493:26;;6529:67;6593:1;6582:9;6578:17;6569:6;6529:67;:::i;:::-;6389:214;;;;:::o;6609:329::-;6668:6;6717:2;6705:9;6696:7;6692:23;6688:32;6685:119;;;6723:79;;:::i;:::-;6685:119;6843:1;6868:53;6913:7;6904:6;6893:9;6889:22;6868:53;:::i;:::-;6858:63;;6814:117;6609:329;;;;:::o;6944:118::-;7031:24;7049:5;7031:24;:::i;:::-;7026:3;7019:37;6944:118;;:::o;7068:222::-;7161:4;7199:2;7188:9;7184:18;7176:26;;7212:71;7280:1;7269:9;7265:17;7256:6;7212:71;:::i;:::-;7068:222;;;;:::o;7296:104::-;7341:7;7370:24;7388:5;7370:24;:::i;:::-;7359:35;;7296:104;;;:::o;7406:138::-;7487:32;7513:5;7487:32;:::i;:::-;7480:5;7477:43;7467:71;;7534:1;7531;7524:12;7467:71;7406:138;:::o;7550:155::-;7604:5;7642:6;7629:20;7620:29;;7658:41;7693:5;7658:41;:::i;:::-;7550:155;;;;:::o;7711:110::-;7762:7;7791:24;7809:5;7791:24;:::i;:::-;7780:35;;7711:110;;;:::o;7827:150::-;7914:38;7946:5;7914:38;:::i;:::-;7907:5;7904:49;7894:77;;7967:1;7964;7957:12;7894:77;7827:150;:::o;7983:167::-;8043:5;8081:6;8068:20;8059:29;;8097:47;8138:5;8097:47;:::i;:::-;7983:167;;;;:::o;8156:518::-;8246:6;8254;8303:2;8291:9;8282:7;8278:23;8274:32;8271:119;;;8309:79;;:::i;:::-;8271:119;8429:1;8454:61;8507:7;8498:6;8487:9;8483:22;8454:61;:::i;:::-;8444:71;;8400:125;8564:2;8590:67;8649:7;8640:6;8629:9;8625:22;8590:67;:::i;:::-;8580:77;;8535:132;8156:518;;;;;:::o;8680:765::-;8766:6;8774;8782;8790;8839:3;8827:9;8818:7;8814:23;8810:33;8807:120;;;8846:79;;:::i;:::-;8807:120;8966:1;8991:53;9036:7;9027:6;9016:9;9012:22;8991:53;:::i;:::-;8981:63;;8937:117;9093:2;9119:53;9164:7;9155:6;9144:9;9140:22;9119:53;:::i;:::-;9109:63;;9064:118;9221:2;9247:53;9292:7;9283:6;9272:9;9268:22;9247:53;:::i;:::-;9237:63;;9192:118;9349:2;9375:53;9420:7;9411:6;9400:9;9396:22;9375:53;:::i;:::-;9365:63;;9320:118;8680:765;;;;;;;:::o;9451:116::-;9521:21;9536:5;9521:21;:::i;:::-;9514:5;9511:32;9501:60;;9557:1;9554;9547:12;9501:60;9451:116;:::o;9573:133::-;9616:5;9654:6;9641:20;9632:29;;9670:30;9694:5;9670:30;:::i;:::-;9573:133;;;;:::o;9712:759::-;9795:6;9803;9811;9819;9868:3;9856:9;9847:7;9843:23;9839:33;9836:120;;;9875:79;;:::i;:::-;9836:120;9995:1;10020:53;10065:7;10056:6;10045:9;10041:22;10020:53;:::i;:::-;10010:63;;9966:117;10122:2;10148:53;10193:7;10184:6;10173:9;10169:22;10148:53;:::i;:::-;10138:63;;10093:118;10250:2;10276:53;10321:7;10312:6;10301:9;10297:22;10276:53;:::i;:::-;10266:63;;10221:118;10378:2;10404:50;10446:7;10437:6;10426:9;10422:22;10404:50;:::i;:::-;10394:60;;10349:115;9712:759;;;;;;;:::o;10477:553::-;10654:4;10692:3;10681:9;10677:19;10669:27;;10706:71;10774:1;10763:9;10759:17;10750:6;10706:71;:::i;:::-;10787:72;10855:2;10844:9;10840:18;10831:6;10787:72;:::i;:::-;10869;10937:2;10926:9;10922:18;10913:6;10869:72;:::i;:::-;10951;11019:2;11008:9;11004:18;10995:6;10951:72;:::i;:::-;10477:553;;;;;;;:::o;11036:468::-;11101:6;11109;11158:2;11146:9;11137:7;11133:23;11129:32;11126:119;;;11164:79;;:::i;:::-;11126:119;11284:1;11309:53;11354:7;11345:6;11334:9;11330:22;11309:53;:::i;:::-;11299:63;;11255:117;11411:2;11437:50;11479:7;11470:6;11459:9;11455:22;11437:50;:::i;:::-;11427:60;;11382:115;11036:468;;;;;:::o;11510:474::-;11578:6;11586;11635:2;11623:9;11614:7;11610:23;11606:32;11603:119;;;11641:79;;:::i;:::-;11603:119;11761:1;11786:53;11831:7;11822:6;11811:9;11807:22;11786:53;:::i;:::-;11776:63;;11732:117;11888:2;11914:53;11959:7;11950:6;11939:9;11935:22;11914:53;:::i;:::-;11904:63;;11859:118;11510:474;;;;;:::o;11990:180::-;12038:77;12035:1;12028:88;12135:4;12132:1;12125:15;12159:4;12156:1;12149:15;12176:320;12220:6;12257:1;12251:4;12247:12;12237:22;;12304:1;12298:4;12294:12;12325:18;12315:81;;12381:4;12373:6;12369:17;12359:27;;12315:81;12443:2;12435:6;12432:14;12412:18;12409:38;12406:84;;12462:18;;:::i;:::-;12406:84;12227:269;12176:320;;;:::o;12502:180::-;12550:77;12547:1;12540:88;12647:4;12644:1;12637:15;12671:4;12668:1;12661:15;12688:191;12728:3;12747:20;12765:1;12747:20;:::i;:::-;12742:25;;12781:20;12799:1;12781:20;:::i;:::-;12776:25;;12824:1;12821;12817:9;12810:16;;12845:3;12842:1;12839:10;12836:36;;;12852:18;;:::i;:::-;12836:36;12688:191;;;;:::o;12885:143::-;12942:5;12973:6;12967:13;12958:22;;12989:33;13016:5;12989:33;:::i;:::-;12885:143;;;;:::o;13034:351::-;13104:6;13153:2;13141:9;13132:7;13128:23;13124:32;13121:119;;;13159:79;;:::i;:::-;13121:119;13279:1;13304:64;13360:7;13351:6;13340:9;13336:22;13304:64;:::i;:::-;13294:74;;13250:128;13034:351;;;;:::o;13391:134::-;13449:9;13482:37;13513:5;13482:37;:::i;:::-;13469:50;;13391:134;;;:::o;13531:147::-;13626:45;13665:5;13626:45;:::i;:::-;13621:3;13614:58;13531:147;;:::o;13684:348::-;13813:4;13851:2;13840:9;13836:18;13828:26;;13864:79;13940:1;13929:9;13925:17;13916:6;13864:79;:::i;:::-;13953:72;14021:2;14010:9;14006:18;13997:6;13953:72;:::i;:::-;13684:348;;;;;:::o;14038:137::-;14092:5;14123:6;14117:13;14108:22;;14139:30;14163:5;14139:30;:::i;:::-;14038:137;;;;:::o;14181:345::-;14248:6;14297:2;14285:9;14276:7;14272:23;14268:32;14265:119;;;14303:79;;:::i;:::-;14265:119;14423:1;14448:61;14501:7;14492:6;14481:9;14477:22;14448:61;:::i;:::-;14438:71;;14394:125;14181:345;;;;:::o;14532:180::-;14580:77;14577:1;14570:88;14677:4;14674:1;14667:15;14701:4;14698:1;14691:15;14718:180;14766:77;14763:1;14756:88;14863:4;14860:1;14853:15;14887:4;14884:1;14877:15;14904:143;14961:5;14992:6;14986:13;14977:22;;15008:33;15035:5;15008:33;:::i;:::-;14904:143;;;;:::o;15053:351::-;15123:6;15172:2;15160:9;15151:7;15147:23;15143:32;15140:119;;;15178:79;;:::i;:::-;15140:119;15298:1;15323:64;15379:7;15370:6;15359:9;15355:22;15323:64;:::i;:::-;15313:74;;15269:128;15053:351;;;;:::o;15410:85::-;15455:7;15484:5;15473:16;;15410:85;;;:::o;15501:158::-;15559:9;15592:61;15610:42;15619:32;15645:5;15619:32;:::i;:::-;15610:42;:::i;:::-;15592:61;:::i;:::-;15579:74;;15501:158;;;:::o;15665:147::-;15760:45;15799:5;15760:45;:::i;:::-;15755:3;15748:58;15665:147;;:::o;15818:114::-;15885:6;15919:5;15913:12;15903:22;;15818:114;;;:::o;15938:184::-;16037:11;16071:6;16066:3;16059:19;16111:4;16106:3;16102:14;16087:29;;15938:184;;;;:::o;16128:132::-;16195:4;16218:3;16210:11;;16248:4;16243:3;16239:14;16231:22;;16128:132;;;:::o;16266:108::-;16343:24;16361:5;16343:24;:::i;:::-;16338:3;16331:37;16266:108;;:::o;16380:179::-;16449:10;16470:46;16512:3;16504:6;16470:46;:::i;:::-;16548:4;16543:3;16539:14;16525:28;;16380:179;;;;:::o;16565:113::-;16635:4;16667;16662:3;16658:14;16650:22;;16565:113;;;:::o;16714:732::-;16833:3;16862:54;16910:5;16862:54;:::i;:::-;16932:86;17011:6;17006:3;16932:86;:::i;:::-;16925:93;;17042:56;17092:5;17042:56;:::i;:::-;17121:7;17152:1;17137:284;17162:6;17159:1;17156:13;17137:284;;;17238:6;17232:13;17265:63;17324:3;17309:13;17265:63;:::i;:::-;17258:70;;17351:60;17404:6;17351:60;:::i;:::-;17341:70;;17197:224;17184:1;17181;17177:9;17172:14;;17137:284;;;17141:14;17437:3;17430:10;;16838:608;;;16714:732;;;;:::o;17452:831::-;17715:4;17753:3;17742:9;17738:19;17730:27;;17767:71;17835:1;17824:9;17820:17;17811:6;17767:71;:::i;:::-;17848:80;17924:2;17913:9;17909:18;17900:6;17848:80;:::i;:::-;17975:9;17969:4;17965:20;17960:2;17949:9;17945:18;17938:48;18003:108;18106:4;18097:6;18003:108;:::i;:::-;17995:116;;18121:72;18189:2;18178:9;18174:18;18165:6;18121:72;:::i;:::-;18203:73;18271:3;18260:9;18256:19;18247:6;18203:73;:::i;:::-;17452:831;;;;;;;;:::o;18289:220::-;18429:34;18425:1;18417:6;18413:14;18406:58;18498:3;18493:2;18485:6;18481:15;18474:28;18289:220;:::o;18515:366::-;18657:3;18678:67;18742:2;18737:3;18678:67;:::i;:::-;18671:74;;18754:93;18843:3;18754:93;:::i;:::-;18872:2;18867:3;18863:12;18856:19;;18515:366;;;:::o;18887:419::-;19053:4;19091:2;19080:9;19076:18;19068:26;;19140:9;19134:4;19130:20;19126:1;19115:9;19111:17;19104:47;19168:131;19294:4;19168:131;:::i;:::-;19160:139;;18887:419;;;:::o;19312:221::-;19452:34;19448:1;19440:6;19436:14;19429:58;19521:4;19516:2;19508:6;19504:15;19497:29;19312:221;:::o;19539:366::-;19681:3;19702:67;19766:2;19761:3;19702:67;:::i;:::-;19695:74;;19778:93;19867:3;19778:93;:::i;:::-;19896:2;19891:3;19887:12;19880:19;;19539:366;;;:::o;19911:419::-;20077:4;20115:2;20104:9;20100:18;20092:26;;20164:9;20158:4;20154:20;20150:1;20139:9;20135:17;20128:47;20192:131;20318:4;20192:131;:::i;:::-;20184:139;;19911:419;;;:::o;20336:224::-;20476:34;20472:1;20464:6;20460:14;20453:58;20545:7;20540:2;20532:6;20528:15;20521:32;20336:224;:::o;20566:366::-;20708:3;20729:67;20793:2;20788:3;20729:67;:::i;:::-;20722:74;;20805:93;20894:3;20805:93;:::i;:::-;20923:2;20918:3;20914:12;20907:19;;20566:366;;;:::o;20938:419::-;21104:4;21142:2;21131:9;21127:18;21119:26;;21191:9;21185:4;21181:20;21177:1;21166:9;21162:17;21155:47;21219:131;21345:4;21219:131;:::i;:::-;21211:139;;20938:419;;;:::o;21363:224::-;21503:34;21499:1;21491:6;21487:14;21480:58;21572:7;21567:2;21559:6;21555:15;21548:32;21363:224;:::o;21593:366::-;21735:3;21756:67;21820:2;21815:3;21756:67;:::i;:::-;21749:74;;21832:93;21921:3;21832:93;:::i;:::-;21950:2;21945:3;21941:12;21934:19;;21593:366;;;:::o;21965:419::-;22131:4;22169:2;22158:9;22154:18;22146:26;;22218:9;22212:4;22208:20;22204:1;22193:9;22189:17;22182:47;22246:131;22372:4;22246:131;:::i;:::-;22238:139;;21965:419;;;:::o;22390:148::-;22492:11;22529:3;22514:18;;22390:148;;;;:::o;22544:162::-;22684:14;22680:1;22672:6;22668:14;22661:38;22544:162;:::o;22712:402::-;22872:3;22893:85;22975:2;22970:3;22893:85;:::i;:::-;22886:92;;22987:93;23076:3;22987:93;:::i;:::-;23105:2;23100:3;23096:12;23089:19;;22712:402;;;:::o;23120:381::-;23305:3;23327:148;23471:3;23327:148;:::i;:::-;23320:155;;23492:3;23485:10;;23120:381;;;:::o;23507:156::-;23647:8;23643:1;23635:6;23631:14;23624:32;23507:156;:::o;23669:400::-;23829:3;23850:84;23932:1;23927:3;23850:84;:::i;:::-;23843:91;;23943:93;24032:3;23943:93;:::i;:::-;24061:1;24056:3;24052:11;24045:18;;23669:400;;;:::o;24075:381::-;24260:3;24282:148;24426:3;24282:148;:::i;:::-;24275:155;;24447:3;24440:10;;24075:381;;;:::o;24462:163::-;24602:15;24598:1;24590:6;24586:14;24579:39;24462:163;:::o;24631:402::-;24791:3;24812:85;24894:2;24889:3;24812:85;:::i;:::-;24805:92;;24906:93;24995:3;24906:93;:::i;:::-;25024:2;25019:3;25015:12;25008:19;;24631:402;;;:::o;25039:381::-;25224:3;25246:148;25390:3;25246:148;:::i;:::-;25239:155;;25411:3;25404:10;;25039:381;;;:::o;25426:157::-;25566:9;25562:1;25554:6;25550:14;25543:33;25426:157;:::o;25589:400::-;25749:3;25770:84;25852:1;25847:3;25770:84;:::i;:::-;25763:91;;25863:93;25952:3;25863:93;:::i;:::-;25981:1;25976:3;25972:11;25965:18;;25589:400;;;:::o;25995:381::-;26180:3;26202:148;26346:3;26202:148;:::i;:::-;26195:155;;26367:3;26360:10;;25995:381;;;:::o;26382:176::-;26522:28;26518:1;26510:6;26506:14;26499:52;26382:176;:::o;26564:366::-;26706:3;26727:67;26791:2;26786:3;26727:67;:::i;:::-;26720:74;;26803:93;26892:3;26803:93;:::i;:::-;26921:2;26916:3;26912:12;26905:19;;26564:366;;;:::o;26936:419::-;27102:4;27140:2;27129:9;27125:18;27117:26;;27189:9;27183:4;27179:20;27175:1;27164:9;27160:17;27153:47;27217:131;27343:4;27217:131;:::i;:::-;27209:139;;26936:419;;;:::o;27361:170::-;27501:22;27497:1;27489:6;27485:14;27478:46;27361:170;:::o;27537:366::-;27679:3;27700:67;27764:2;27759:3;27700:67;:::i;:::-;27693:74;;27776:93;27865:3;27776:93;:::i;:::-;27894:2;27889:3;27885:12;27878:19;;27537:366;;;:::o;27909:419::-;28075:4;28113:2;28102:9;28098:18;28090:26;;28162:9;28156:4;28152:20;28148:1;28137:9;28133:17;28126:47;28190:131;28316:4;28190:131;:::i;:::-;28182:139;;27909:419;;;:::o;28334:225::-;28474:34;28470:1;28462:6;28458:14;28451:58;28543:8;28538:2;28530:6;28526:15;28519:33;28334:225;:::o;28565:366::-;28707:3;28728:67;28792:2;28787:3;28728:67;:::i;:::-;28721:74;;28804:93;28893:3;28804:93;:::i;:::-;28922:2;28917:3;28913:12;28906:19;;28565:366;;;:::o;28937:419::-;29103:4;29141:2;29130:9;29126:18;29118:26;;29190:9;29184:4;29180:20;29176:1;29165:9;29161:17;29154:47;29218:131;29344:4;29218:131;:::i;:::-;29210:139;;28937:419;;;:::o;29362:180::-;29410:77;29407:1;29400:88;29507:4;29504:1;29497:15;29531:4;29528:1;29521:15;29548:185;29588:1;29605:20;29623:1;29605:20;:::i;:::-;29600:25;;29639:20;29657:1;29639:20;:::i;:::-;29634:25;;29678:1;29668:35;;29683:18;;:::i;:::-;29668:35;29725:1;29722;29718:9;29713:14;;29548:185;;;;:::o;29739:223::-;29879:34;29875:1;29867:6;29863:14;29856:58;29948:6;29943:2;29935:6;29931:15;29924:31;29739:223;:::o;29968:366::-;30110:3;30131:67;30195:2;30190:3;30131:67;:::i;:::-;30124:74;;30207:93;30296:3;30207:93;:::i;:::-;30325:2;30320:3;30316:12;30309:19;;29968:366;;;:::o;30340:419::-;30506:4;30544:2;30533:9;30529:18;30521:26;;30593:9;30587:4;30583:20;30579:1;30568:9;30564:17;30557:47;30621:131;30747:4;30621:131;:::i;:::-;30613:139;;30340:419;;;:::o;30765:221::-;30905:34;30901:1;30893:6;30889:14;30882:58;30974:4;30969:2;30961:6;30957:15;30950:29;30765:221;:::o;30992:366::-;31134:3;31155:67;31219:2;31214:3;31155:67;:::i;:::-;31148:74;;31231:93;31320:3;31231:93;:::i;:::-;31349:2;31344:3;31340:12;31333:19;;30992:366;;;:::o;31364:419::-;31530:4;31568:2;31557:9;31553:18;31545:26;;31617:9;31611:4;31607:20;31603:1;31592:9;31588:17;31581:47;31645:131;31771:4;31645:131;:::i;:::-;31637:139;;31364:419;;;:::o;31789:179::-;31929:31;31925:1;31917:6;31913:14;31906:55;31789:179;:::o;31974:366::-;32116:3;32137:67;32201:2;32196:3;32137:67;:::i;:::-;32130:74;;32213:93;32302:3;32213:93;:::i;:::-;32331:2;32326:3;32322:12;32315:19;;31974:366;;;:::o;32346:419::-;32512:4;32550:2;32539:9;32535:18;32527:26;;32599:9;32593:4;32589:20;32585:1;32574:9;32570:17;32563:47;32627:131;32753:4;32627:131;:::i;:::-;32619:139;;32346:419;;;:::o;32771:224::-;32911:34;32907:1;32899:6;32895:14;32888:58;32980:7;32975:2;32967:6;32963:15;32956:32;32771:224;:::o;33001:366::-;33143:3;33164:67;33228:2;33223:3;33164:67;:::i;:::-;33157:74;;33240:93;33329:3;33240:93;:::i;:::-;33358:2;33353:3;33349:12;33342:19;;33001:366;;;:::o;33373:419::-;33539:4;33577:2;33566:9;33562:18;33554:26;;33626:9;33620:4;33616:20;33612:1;33601:9;33597:17;33590:47;33654:131;33780:4;33654:131;:::i;:::-;33646:139;;33373:419;;;:::o;33798:222::-;33938:34;33934:1;33926:6;33922:14;33915:58;34007:5;34002:2;33994:6;33990:15;33983:30;33798:222;:::o;34026:366::-;34168:3;34189:67;34253:2;34248:3;34189:67;:::i;:::-;34182:74;;34265:93;34354:3;34265:93;:::i;:::-;34383:2;34378:3;34374:12;34367:19;;34026:366;;;:::o;34398:419::-;34564:4;34602:2;34591:9;34587:18;34579:26;;34651:9;34645:4;34641:20;34637:1;34626:9;34622:17;34615:47;34679:131;34805:4;34679:131;:::i;:::-;34671:139;;34398:419;;;:::o;34823:225::-;34963:34;34959:1;34951:6;34947:14;34940:58;35032:8;35027:2;35019:6;35015:15;35008:33;34823:225;:::o;35054:366::-;35196:3;35217:67;35281:2;35276:3;35217:67;:::i;:::-;35210:74;;35293:93;35382:3;35293:93;:::i;:::-;35411:2;35406:3;35402:12;35395:19;;35054:366;;;:::o;35426:419::-;35592:4;35630:2;35619:9;35615:18;35607:26;;35679:9;35673:4;35669:20;35665:1;35654:9;35650:17;35643:47;35707:131;35833:4;35707:131;:::i;:::-;35699:139;;35426:419;;;:::o;35851:79::-;35890:7;35919:5;35908:16;;35851:79;;;:::o;35936:157::-;36041:45;36061:24;36079:5;36061:24;:::i;:::-;36041:45;:::i;:::-;36036:3;36029:58;35936:157;;:::o;36099:94::-;36132:8;36180:5;36176:2;36172:14;36151:35;;36099:94;;;:::o;36199:::-;36238:7;36267:20;36281:5;36267:20;:::i;:::-;36256:31;;36199:94;;;:::o;36299:100::-;36338:7;36367:26;36387:5;36367:26;:::i;:::-;36356:37;;36299:100;;;:::o;36405:157::-;36510:45;36530:24;36548:5;36530:24;:::i;:::-;36510:45;:::i;:::-;36505:3;36498:58;36405:157;;:::o;36568:397::-;36708:3;36723:75;36794:3;36785:6;36723:75;:::i;:::-;36823:2;36818:3;36814:12;36807:19;;36836:75;36907:3;36898:6;36836:75;:::i;:::-;36936:2;36931:3;36927:12;36920:19;;36956:3;36949:10;;36568:397;;;;;:::o;36971:176::-;37003:1;37020:20;37038:1;37020:20;:::i;:::-;37015:25;;37054:20;37072:1;37054:20;:::i;:::-;37049:25;;37093:1;37083:35;;37098:18;;:::i;:::-;37083:35;37139:1;37136;37132:9;37127:14;;36971:176;;;;:::o;37153:410::-;37193:7;37216:20;37234:1;37216:20;:::i;:::-;37211:25;;37250:20;37268:1;37250:20;:::i;:::-;37245:25;;37305:1;37302;37298:9;37327:30;37345:11;37327:30;:::i;:::-;37316:41;;37506:1;37497:7;37493:15;37490:1;37487:22;37467:1;37460:9;37440:83;37417:139;;37536:18;;:::i;:::-;37417:139;37201:362;37153:410;;;;:::o;37569:220::-;37709:34;37705:1;37697:6;37693:14;37686:58;37778:3;37773:2;37765:6;37761:15;37754:28;37569:220;:::o;37795:366::-;37937:3;37958:67;38022:2;38017:3;37958:67;:::i;:::-;37951:74;;38034:93;38123:3;38034:93;:::i;:::-;38152:2;38147:3;38143:12;38136:19;;37795:366;;;:::o;38167:419::-;38333:4;38371:2;38360:9;38356:18;38348:26;;38420:9;38414:4;38410:20;38406:1;38395:9;38391:17;38384:47;38448:131;38574:4;38448:131;:::i;:::-;38440:139;;38167:419;;;:::o;38592:221::-;38732:34;38728:1;38720:6;38716:14;38709:58;38801:4;38796:2;38788:6;38784:15;38777:29;38592:221;:::o;38819:366::-;38961:3;38982:67;39046:2;39041:3;38982:67;:::i;:::-;38975:74;;39058:93;39147:3;39058:93;:::i;:::-;39176:2;39171:3;39167:12;39160:19;;38819:366;;;:::o;39191:419::-;39357:4;39395:2;39384:9;39380:18;39372:26;;39444:9;39438:4;39434:20;39430:1;39419:9;39415:17;39408:47;39472:131;39598:4;39472:131;:::i;:::-;39464:139;;39191:419;;;:::o;39616:182::-;39756:34;39752:1;39744:6;39740:14;39733:58;39616:182;:::o;39804:366::-;39946:3;39967:67;40031:2;40026:3;39967:67;:::i;:::-;39960:74;;40043:93;40132:3;40043:93;:::i;:::-;40161:2;40156:3;40152:12;40145:19;;39804:366;;;:::o;40176:419::-;40342:4;40380:2;40369:9;40365:18;40357:26;;40429:9;40423:4;40419:20;40415:1;40404:9;40400:17;40393:47;40457:131;40583:4;40457:131;:::i;:::-;40449:139;;40176:419;;;:::o;40601:180::-;40741:32;40737:1;40729:6;40725:14;40718:56;40601:180;:::o;40787:366::-;40929:3;40950:67;41014:2;41009:3;40950:67;:::i;:::-;40943:74;;41026:93;41115:3;41026:93;:::i;:::-;41144:2;41139:3;41135:12;41128:19;;40787:366;;;:::o;41159:419::-;41325:4;41363:2;41352:9;41348:18;41340:26;;41412:9;41406:4;41402:20;41398:1;41387:9;41383:17;41376:47;41440:131;41566:4;41440:131;:::i;:::-;41432:139;;41159:419;;;:::o;41584:181::-;41724:33;41720:1;41712:6;41708:14;41701:57;41584:181;:::o;41771:366::-;41913:3;41934:67;41998:2;41993:3;41934:67;:::i;:::-;41927:74;;42010:93;42099:3;42010:93;:::i;:::-;42128:2;42123:3;42119:12;42112:19;;41771:366;;;:::o;42143:419::-;42309:4;42347:2;42336:9;42332:18;42324:26;;42396:9;42390:4;42386:20;42382:1;42371:9;42367:17;42360:47;42424:131;42550:4;42424:131;:::i;:::-;42416:139;;42143:419;;;:::o;42568:194::-;42608:4;42628:20;42646:1;42628:20;:::i;:::-;42623:25;;42662:20;42680:1;42662:20;:::i;:::-;42657:25;;42706:1;42703;42699:9;42691:17;;42730:1;42724:4;42721:11;42718:37;;;42735:18;;:::i;:::-;42718:37;42568:194;;;;:::o

Swarm Source

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