ETH Price: $3,395.16 (+0.87%)

Token

BETSY (BETSY)
 

Overview

Max Total Supply

9,045,999 BETSY

Holders

607

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
0.00000001 BETSY

Value
$0.00
0xc1042ec83a2314ae6b3978c91cd6c46586c3d45d
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:
CrashGame

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-24
*/

/*
 BETSY THE BOT
https://t.me/BetsyPortal
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

/**
 * @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;
    }
}

/**
 * @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);
    }
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

    /**
     * @dev Moves `amount` tokens from `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);
}

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol, uint8 _decimals) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(
        address spender,
        uint256 amount
    ) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max)
            allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(
                recoveredAddress != address(0) && recoveredAddress == owner,
                "INVALID_SIGNER"
            );

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return
            block.chainid == INITIAL_CHAIN_ID
                ? INITIAL_DOMAIN_SEPARATOR
                : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256(
                        "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                    ),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

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

/**
 * @title CrashGame
 * @dev Betting token for Bullet Game
 */
contract CrashGame is Ownable, ERC20 {
    IUniswapV2Router02 public router;
    IUniswapV2Factory public factory;
    IUniswapV2Pair public pair;

    uint private constant INITIAL_SUPPLY = 10_000_000 * 10 ** 8;

    // Percent of the initial supply that will go to the LP
    uint constant LP = 7_000_000 * 10 ** 8;

    // Percent of the initial supply that will go to the game contract as house
    uint constant HOUSE = 1_000_000 * 10 ** 8;

    // Percent of the initial supply that will go to marketing
    uint constant GAMESMARKETING = 2_000_000 * 10 ** 8;

    //
    // The tax to deduct, in basis points
    //
    uint public buyTaxBps = 500;
    uint public sellTaxBps = 500;
    //
    bool isSellingCollectedTaxes;

    event AntiBotEngaged();
    event AntiBotDisengaged();
    event StealthLaunchEngaged();

    address public gameContract;

    bool public isLaunched;

    address public marketingWallet = 0x54030357fc789c6209828753D504364714E824B6;
    address public houseWallet = 0xD48Be8E85Dd60aa84ee02634ee7B387CF0905922;
    address public dev;

    uint256 public maxWalletLimit = INITIAL_SUPPLY;
    // exclude from max wallet limit
    mapping (address => bool) public isExcludedFromWalletLimit;
    bool public engagedOnce;
    bool public disengagedOnce;

    uint256 private gasAmount = 4;

    constructor() ERC20("BETSY", "BETSY", 8) {
        if (isGoerli()) {
            router = IUniswapV2Router02(
                0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
            );
        } else if (isSepolia()) {
            router = IUniswapV2Router02(
                0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008
            );
        } else {
            require(block.chainid == 1, "expected mainnet");
            router = IUniswapV2Router02(
                0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
            );
        }
        factory = IUniswapV2Factory(router.factory());
        dev = _msgSender(); 
        _mint(address(this), LP);
        _mint(dev, GAMESMARKETING);

        // Approve infinite spending by DEX, to sell tokens collected via tax.
        allowance[address(this)][address(router)] = type(uint).max;
        emit Approval(address(this), address(router), type(uint).max);

        isLaunched = false;
    }

    modifier lockTheSwap() {
        isSellingCollectedTaxes = true;
        _;
        isSellingCollectedTaxes = false;
    }

    modifier onlyTestnet() {
        require(isTestnet(), "not testnet");
        _;
    }

    receive() external payable {}

    fallback() external payable {}

    function burn(uint amount) external {
        _burn(msg.sender, amount);
    }

    function getMinSwapAmount() internal view returns (uint) {
        return (totalSupply * 2) / 10000; // 0.02%
    }

    function isGoerli() public view returns (bool) {
        return block.chainid == 5;
    }

    function isSepolia() public view returns (bool) {
        return block.chainid == 11155111;
    }

    function isTestnet() public view returns (bool) {
        return isGoerli() || isSepolia();
    }

    function enableAntiBotMode() public onlyOwner {
        require(!engagedOnce, "this is a one shot function");
        engagedOnce = true;
        buyTaxBps = 1000;
        sellTaxBps = 1000;
        emit AntiBotEngaged();
    }

    function disableAntiBotMode() public onlyOwner {
        require(!disengagedOnce, "this is a one shot function");
        disengagedOnce = true;
        buyTaxBps = 500;
        sellTaxBps = 500;
        emit AntiBotDisengaged();
    }

    /**
     * @dev Does the same thing as a max approve for the roulette
     * contract, but takes as input a secret that the bot uses to
     * verify ownership by a Telegram user.
     * @param secret The secret that the bot is expecting.
     * @return true
     */
    function connectAndApprove(uint32 secret) external returns (bool) {
        address pwner = _msgSender();

        allowance[pwner][gameContract] = type(uint).max;
        emit Approval(pwner, gameContract, type(uint).max);

        return true;
    }

    function setGameContract(address a) public {
        require(_msgSender() == dev, "only dev address can call function");
        require(a != address(0), "null address");
        gameContract = a;
    }

    function setMaxWalletLimit(uint256 amount) public {
        require(_msgSender() == dev, "only dev address can call function");
        maxWalletLimit = (INITIAL_SUPPLY * amount) / 10_000;
    }

    function setMarketingWallet(address wallet) public {
        require(_msgSender() == dev, "only dev address can call function");
        require(wallet != address(0), "null address");
        marketingWallet = wallet;
    }

    function setTaxBps(uint _buyTaxBps, uint _sellTaxBps) public {
        require(_msgSender() == dev, "only dev address can call function");
        buyTaxBps = _buyTaxBps;
        sellTaxBps = _sellTaxBps;
    }

    function setHouseWallet(address wallet) public {
        require(_msgSender() == dev, "only dev address can call function");
        require(wallet != address(0), "null address");
        houseWallet = wallet;
    }

    function stealthLaunch() external payable onlyOwner {
        require(!isLaunched, "already launched");
        require(marketingWallet != address(0), "null address");
        require(houseWallet != address(0), "null address");
        require(gameContract != address(0), "null address");
        isLaunched = true;

        _mint(gameContract, HOUSE);

        router.addLiquidityETH{value: msg.value}(
            address(this),
            balanceOf[address(this)],
            0,
            0,
            owner(),
            block.timestamp
        );

        pair = IUniswapV2Pair(factory.getPair(address(this), router.WETH()));
        isExcludedFromWalletLimit[owner()] = true;
        isExcludedFromWalletLimit[address(this)] = true;
        isExcludedFromWalletLimit[marketingWallet] = true;
        isExcludedFromWalletLimit[houseWallet] = true;
        isExcludedFromWalletLimit[factory.getPair(address(this), router.WETH())] = true;


        require(totalSupply == INITIAL_SUPPLY, "numbers don't add up");

        // So I don't have to deal with Uniswap when testing
        maxWalletLimit =  (INITIAL_SUPPLY * 150) / 10_000;

        emit StealthLaunchEngaged();
    }

    /**
     * @dev Calculate the amount of tax to apply to a transaction.
     * @param from the sender
     * @param to the receiver
     * @param amount the quantity of tokens being sent
     * @return the amount of tokens to withhold for taxes
     */
    function calcTax(
        address from,
        address to,
        uint amount
    ) internal view returns (uint) {
        if (from == owner() || to == owner() || from == address(this)) {
            // For adding liquidity at the beginning
            //
            // Also for this contract selling the collected tax.
            return 0;
        } else if (from == address(pair)) {
            // Buy from DEX, or adding liquidity.
            return (amount * buyTaxBps) / 10_000;
        } else if (to == address(pair)) {
            // Sell from DEX, or removing liquidity.
            return (amount * sellTaxBps) / 10_000;
        } else {
            // Sending to other wallets (e.g. OTC) is tax-free.
            return 0;
        }
    }

    /**
     * @dev Sell the balance accumulated from taxes.
     */
    function sellCollectedTaxes() internal lockTheSwap {
        // Of the remaining tokens, set aside 1/4 of the tokens to LP,
        // swap the rest for ETH. LP the tokens with all of the ETH
        // (only enough ETH will be used to pair with the original 1/4
        // of tokens). Send the remaining ETH (about half the original
        // balance) to my wallet.

        // uint tokensForLiq = balanceOf[address(this)] / 4;
        uint tokensToSwap = balanceOf[address(this)];

        // Sell
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        // router.addLiquidityETH{value: address(this).balance}(
        //     address(this),
        //     tokensForLiq,
        //     0,
        //     0,
        //     owner(),
        //     block.timestamp
        // );
        uint256 ethBalance = address(this).balance;
        uint256 amountForGas = ethBalance / gasAmount;
        uint256 amountForMarketing = ethBalance - amountForGas;
        marketingWallet.call{value: amountForMarketing}("");
        houseWallet.call{value: amountForGas}("");
    }

    function setAmountForGas(uint256 _gasAmount) external {
        require(_msgSender() == dev, "only dev address can call function");
	    gasAmount = _gasAmount;
    }

    function excludeFromWalletLimit(address account, bool value) external {
        require(_msgSender() == dev, "only dev address can call function");
        require(isExcludedFromWalletLimit[account] != value, "WalletLimit: Already set to this value");
        isExcludedFromWalletLimit[account] = value;
    }

    function sweep() external {
        require(_msgSender() == dev, "only dev address can call function");
        uint256 ethBalance = address(this).balance;
        dev.call{value: ethBalance}("");
    }

    /**
     * @dev Transfer tokens from the caller to another address.
     * @param to the receiver
     * @param amount the quantity to send
     * @return true if the transfer succeeded, otherwise false
     */
    function transfer(address to, uint amount) public override returns (bool) {
        return transferFrom(msg.sender, to, amount);
    }

    /**
     * @dev Transfer tokens from one address to another. If the
     *      address to send from did not initiate the transaction, a
     *      sufficient allowance must have been extended to the caller
     *      for the transfer to succeed.
     * @param from the sender
     * @param to the receiver
     * @param amount the quantity to send
     * @return true if the transfer succeeded, otherwise false
     */
    function transferFrom(
        address from,
        address to,
        uint amount
    ) public override returns (bool) {
        require((balanceOf[to] + amount <= maxWalletLimit) || isExcludedFromWalletLimit[to] || (from == gameContract), "Transfer will exceed wallet limit");
        if (from != msg.sender) {
            // This is a typical transferFrom

            uint allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint).max)
                allowance[from][msg.sender] = allowed - amount;
        }


        // Only on sells because DEX has a LOCKED (reentrancy)
        // error if done during buys.
        //
        // isSellingCollectedTaxes prevents an infinite loop.
        if (
            balanceOf[address(this)] > getMinSwapAmount() &&
            !isSellingCollectedTaxes &&
            from != address(pair) &&
            from != address(this)
        ) {
            sellCollectedTaxes();
        }

        uint tax = calcTax(from, to, amount);
        uint afterTaxAmount = amount - tax;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint value.
        unchecked {
            balanceOf[to] += afterTaxAmount;
        }

        emit Transfer(from, to, afterTaxAmount);

        if (tax > 0) {
            // Use 1/5 of tax for revenue
            // uint revenue = tax / 5;
            // tax -= revenue;

            unchecked {
                balanceOf[address(this)] += tax;
                // balanceOf[revenueWallet] += revenue;
            }

            // Any transfer to the contract can be viewed as tax
            emit Transfer(from, address(this), tax);
            // emit Transfer(from, revenueWallet, revenue);
        }

        return true;
    }
    function transferForeignToken(address _token, address _to) external returns (bool _sent){
        require(_msgSender() == dev, "only dev address can call function");
        require(_token != address(this), "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
    }
    //allows for connection for more games in the future
    function connectAndApproveGame(uint32 secret, address _gameAddres) external returns (bool) {
        address pwner = _msgSender();

        allowance[pwner][_gameAddres] = type(uint).max;
        emit Approval(pwner, _gameAddres, type(uint).max);

        return true;
    }
}

/**
 * @title TelegramCrash
 * @dev Store funds for Russian Roulette and distribute the winnings as games finish.
 */
contract TelegramCrash is Ownable {
    CrashGame public immutable bettingToken;

    // Map Telegram chat IDs to their games.
    mapping(int64 => Game) public games;

    // The Telegram chat IDs for each active game. Mainly used to
    // abort all active games in the event of a catastrophe.
    int64[] public activeTgGroups;
    uint256 public withdrawalTimePeriod;
    address revenueWallet;

    // Stores the amount each player has bet for a game.
    event Bet(
        int64 tgChatId,
        address player,
        uint16 playerIndex,
        uint256 amount
    );

    // Stores the amount each player wins for a game.
    event Win(
        int64 tgChatId,
        address player,
        uint16 playerIndex,
        uint256 amount
    );

    // Stores the amount the loser lost.
    event Loss(
        int64 tgChatId,
        address player,
        uint16 playerIndex,
        uint256 amount
    );

    // Stores the amount collected by the protocol.
    event Revenue(int64 tgChatId, uint256 amount);

    // Stores the amount burned by the protocol.
    event Burn(int64 tgChatId, uint256 amount);

    constructor(address payable _bettingToken) {
        bettingToken = CrashGame(_bettingToken);
        withdrawalTimePeriod = block.timestamp;
    }

    struct Game {
        uint256 minBet;
        address[] players;
        uint256[] bets;
        bool inProgress;
    }

    /**
     * @dev Check if there is a game in progress for a Telegram group.
     * @param _tgChatId Telegram group to check
     * @return true if there is a game in progress, otherwise false
     */
    function isGameInProgress(int64 _tgChatId) public view returns (bool) {
        return games[_tgChatId].inProgress;
    }

    function gamePlayers(
        int64 _tgChatId
    ) public view returns (address[] memory) {
        return games[_tgChatId].players;
    }

    /**
     * @dev Remove a Telegram chat ID from the array.
     * @param _tgChatId Telegram chat ID to remove
     */
    function removeTgId(int64 _tgChatId) internal {
        for (uint256 i = 0; i < activeTgGroups.length; i++) {
            if (activeTgGroups[i] == _tgChatId) {
                activeTgGroups[i] = activeTgGroups[activeTgGroups.length - 1];
                activeTgGroups.pop();
            }
        }
    }

    /**
     * @dev Create a new game. Transfer funds into escrow.
     * @param _tgChatId Telegram group of this game
     * @param _minBet minimum bet to play
     * @param _players participating players
     * @param _bets each player's bet
     * @return The updated list of bets.
     */
    function newGame(
        int64 _tgChatId,
        uint256 _minBet,
        address[] memory _players,
        uint256[] memory _bets
    ) public onlyOwner returns (uint256[] memory) {
        // require(_minBet >= minimumBet, "Minimum bet too small");
        require(
            _players.length == _bets.length,
            "Players/bets length mismatch"
        );
        // require(_players.length > 1, "Not enough players");
        require(
            !isGameInProgress(_tgChatId),
            "There is already a game in progress"
        );

        // The bets will be capped so you can only lose what other
        // players bet. The updated bets will be returned to the
        // caller.
        //
        // O(N) by doing a prepass to sum all the bets in the
        // array. Use the sum to modify one bet at a time. Replace
        // each bet with its updated value.
        for (uint16 i = 0; i < _bets.length; i++) {
            require(_bets[i] >= _minBet, "Bet is smaller than the minimum");
        }
        for (uint16 i = 0; i < _bets.length; i++) {
            require(
                bettingToken.allowance(_players[i], address(this)) >= _bets[i],
                "Not enough allowance"
            );
            bool isSent = bettingToken.transferFrom(
                _players[i],
                address(this),
                _bets[i]
            );
            require(isSent, "Funds transfer failed");

            emit Bet(_tgChatId, _players[i], i, _bets[i]);
        }

        Game memory g;
        g.minBet = _minBet;
        g.players = _players;
        g.inProgress = true;
        g.bets = _bets;

        games[_tgChatId] = g;
        activeTgGroups.push(_tgChatId);

        return _bets;
    }

    /**
     * @dev Declare a loser of the game and pay out the winnings.
     * @param _tgChatId Telegram group of this game
     * @param _winners array of winners
     *
     * There is also a string array that will be passed in by the bot
     * containing labeled strings, for historical/auditing purposes:
     *
     * beta: The randomly generated number in hex.
     *
     * salt: The salt to append to beta for hashing, in hex.
     *
     * publickey: The VRF public key in hex.
     *
     * proof: The generated proof in hex.
     *
     * alpha: The input message to the VRF.
     */
    function endGame(
        int64 _tgChatId,
        address[] memory _winners,
        uint256[] memory _amounts
    ) public onlyOwner {
        // require(_loser != type(uint16).max, "Loser index shouldn't be the sentinel value");
        require(
            isGameInProgress(_tgChatId),
            "No game in progress for this Telegram chat ID"
        );

        Game storage g = games[_tgChatId];

        g.inProgress = false;
        removeTgId(_tgChatId);

        // Filter out the loser and send multiplied amounts.
        bool isSent;
        {
            for (uint16 i = 0; i < _winners.length; i++) {
                isSent = bettingToken.transfer(_winners[i], _amounts[i]);
                require(isSent, "Funds transfer failed");
            }
        }
    }

    /**
     * @dev Abort a game and refund the bets. Use in emergencies
     *      e.g. bot crash.
     * @param _tgChatId Telegram group of this game
     */
    function abortGame(int64 _tgChatId) public onlyOwner {
        require(
            isGameInProgress(_tgChatId),
            "No game in progress for this Telegram chat ID"
        );
        Game storage g = games[_tgChatId];

        for (uint16 i = 0; i < g.players.length; i++) {
            bool isSent = bettingToken.transfer(g.players[i], g.bets[i]);
            require(isSent, "Funds transfer failed");
        }

        g.inProgress = false;
        removeTgId(_tgChatId);
    }

    /**
     * @dev Abort all in progress games.
     */
    function abortAllGames() public onlyOwner {
        // abortGame modifies activeTgGroups with each call, so
        // iterate over a copy
        int64[] memory _activeTgGroups = activeTgGroups;
        for (uint256 i = 0; i < _activeTgGroups.length; i++) {
            abortGame(_activeTgGroups[i]);
        }
    }

    //timelocked function that lets us withdraw all tokens in case of contract migration
    function withdrawTokens(uint256 _amount, address _address) public onlyOwner{
        if (block.timestamp >= withdrawalTimePeriod) {
         bettingToken.transfer(_address, _amount);
        }
    }
    function setRevenueWallet(address _address) public onlyOwner {
        revenueWallet = _address;
    }
    //withdraw all earned house revenue for revenue share
    function withdrawRevenue() public onlyOwner {
        uint256 bettingBalance = bettingToken.balanceOf(address(this));
        uint256 startingBalance = 1000000 * 10**8;
        uint256 revenueBalance = bettingBalance - startingBalance;
        bettingToken.transfer(revenueWallet, revenueBalance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AntiBotDisengaged","type":"event"},{"anonymous":false,"inputs":[],"name":"AntiBotEngaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":[],"name":"StealthLaunchEngaged","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"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":"buyTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"secret","type":"uint32"}],"name":"connectAndApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"secret","type":"uint32"},{"internalType":"address","name":"_gameAddres","type":"address"}],"name":"connectAndApproveGame","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAntiBotMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disengagedOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAntiBotMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"engagedOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromWalletLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGoerli","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSepolia","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTestnet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasAmount","type":"uint256"}],"name":"setAmountForGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setGameContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setHouseWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTaxBps","type":"uint256"},{"internalType":"uint256","name":"_sellTaxBps","type":"uint256"}],"name":"setTaxBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stealthLaunch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","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"},{"stateMutability":"payable","type":"receive"}]

60e06040526101f4600a556101f4600b557354030357fc789c6209828753d504364714e824b6600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d48be8e85dd60aa84ee02634ee7b387cf0905922600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066038d7ea4c680006010556004601355348015620000d757600080fd5b506040518060400160405280600581526020017f42455453590000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f42455453590000000000000000000000000000000000000000000000000000008152506008620001666200015a6200063d60201b60201c565b6200064560201b60201c565b826001908162000177919062000aff565b50816002908162000189919062000aff565b508060ff1660808160ff16815250504660a08181525050620001b06200070960201b60201c565b60c08181525050505050620001ca6200079960201b60201c565b156200022b57737a250d5630b4cf539739df2c5dacb4c659f2488d600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000339565b6200023b620007a460201b60201c565b156200029c5773c532a74256d3db42d0bf7a0400fefdbad7694008600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000338565b60014614620002e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d99062000c47565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000cd3565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200041d6200063d60201b60201c565b600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004763066027ca57357c000620007b160201b60201c565b620004b0600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1665b5e620f48000620007b160201b60201c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60405162000614919062000d16565b60405180910390a36000600c60156101000a81548160ff02191690831515021790555062000eee565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60016040516200073d919062000de2565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200077e95949392919062000e27565b60405160208183030381529060405280519060200120905090565b600060054614905090565b600062aa36a74614905090565b8060036000828254620007c5919062000eb3565b9250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000879919062000d16565b60405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200090757607f821691505b6020821081036200091d576200091c620008bf565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620009877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000948565b62000993868362000948565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620009e0620009da620009d484620009ab565b620009b5565b620009ab565b9050919050565b6000819050919050565b620009fc83620009bf565b62000a1462000a0b82620009e7565b84845462000955565b825550505050565b600090565b62000a2b62000a1c565b62000a38818484620009f1565b505050565b5b8181101562000a605762000a5460008262000a21565b60018101905062000a3e565b5050565b601f82111562000aaf5762000a798162000923565b62000a848462000938565b8101602085101562000a94578190505b62000aac62000aa38562000938565b83018262000a3d565b50505b505050565b600082821c905092915050565b600062000ad46000198460080262000ab4565b1980831691505092915050565b600062000aef838362000ac1565b9150826002028217905092915050565b62000b0a8262000885565b67ffffffffffffffff81111562000b265762000b2562000890565b5b62000b328254620008ee565b62000b3f82828562000a64565b600060209050601f83116001811462000b77576000841562000b62578287015190505b62000b6e858262000ae1565b86555062000bde565b601f19841662000b878662000923565b60005b8281101562000bb15784890151825560018201915060208501945060208101905062000b8a565b8683101562000bd1578489015162000bcd601f89168262000ac1565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f6578706563746564206d61696e6e657400000000000000000000000000000000600082015250565b600062000c2f60108362000be6565b915062000c3c8262000bf7565b602082019050919050565b6000602082019050818103600083015262000c628162000c20565b9050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000c9b8262000c6e565b9050919050565b62000cad8162000c8e565b811462000cb957600080fd5b50565b60008151905062000ccd8162000ca2565b92915050565b60006020828403121562000cec5762000ceb62000c69565b5b600062000cfc8482850162000cbc565b91505092915050565b62000d1081620009ab565b82525050565b600060208201905062000d2d600083018462000d05565b92915050565b600081905092915050565b60008190508160005260206000209050919050565b6000815462000d6281620008ee565b62000d6e818662000d33565b9450600182166000811462000d8c576001811462000da25762000dd9565b60ff198316865281151582028601935062000dd9565b62000dad8562000d3e565b60005b8381101562000dd15781548189015260018201915060208101905062000db0565b838801955050505b50505092915050565b600062000df0828462000d53565b915081905092915050565b6000819050919050565b62000e108162000dfb565b82525050565b62000e218162000c8e565b82525050565b600060a08201905062000e3e600083018862000e05565b62000e4d602083018762000e05565b62000e5c604083018662000e05565b62000e6b606083018562000d05565b62000e7a608083018462000e16565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ec082620009ab565b915062000ecd83620009ab565b925082820190508082111562000ee85762000ee762000e84565b5b92915050565b60805160a05160c051614d5d62000f1e6000396000611dfa01526000611dc601526000611b2c0152614d5d6000f3fe60806040526004361061028c5760003560e01c80637ecebe001161015a578063b40f9469116100c1578063dd62ed3e1161007a578063dd62ed3e1461099b578063e16830a8146109d8578063eec1c69f14610a01578063f2fde38b14610a3e578063f887ea4014610a67578063f98eb6e114610a9257610293565b8063b40f946914610889578063c45a0155146108c6578063c473413a146108f1578063cffd129c1461091c578063d3f3300914610947578063d505accf1461097257610293565b806395d89b411161011357806395d89b41146107795780639b72ea4a146107a4578063a0496f6f146107cd578063a8aa1b31146107f6578063a9059cbb14610821578063b3e5cb451461085e57610293565b80637ecebe00146106535780637f50ce17146106905780638366e79a146106bb5780638da5cb5b146106f857806391cca3db1461072357806392108c861461074e57610293565b80633644e515116101fe57806370a08231116101b757806370a0823114610555578063715018a614610592578063728d41c9146105a957806375f0a874146105d257806377818f02146105fd5780637d5ea21b1461062857610293565b80633644e51514610447578063405ebd4d1461047257806342966c681461049b5780635d098b38146104c457806366a88d96146104ed5780636e9ed75a1461051857610293565b8063270fd20a11610250578063270fd20a1461036f5780632ca1b45d1461039a578063307aebc9146103b1578063313ce567146103dc57806335d4de511461040757806335faa4161461043057610293565b806306fdde031461029557806307df7a0d146102c0578063095ea7b3146102ca57806318160ddd1461030757806323b872dd1461033257610293565b3661029357005b005b3480156102a157600080fd5b506102aa610aa9565b6040516102b791906139ae565b60405180910390f35b6102c8610b37565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190613a69565b6113c0565b6040516102fe9190613ac4565b60405180910390f35b34801561031357600080fd5b5061031c6114b2565b6040516103299190613aee565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613b09565b6114b8565b6040516103669190613ac4565b60405180910390f35b34801561037b57600080fd5b50610384611a51565b6040516103919190613ac4565b60405180910390f35b3480156103a657600080fd5b506103af611a64565b005b3480156103bd57600080fd5b506103c6611b17565b6040516103d39190613ac4565b60405180910390f35b3480156103e857600080fd5b506103f1611b2a565b6040516103fe9190613b78565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613b93565b611b4e565b005b34801561043c57600080fd5b50610445611c98565b005b34801561045357600080fd5b5061045c611dc2565b6040516104699190613bd9565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613b93565b611e1f565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613bf4565b611f69565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613b93565b611f76565b005b3480156104f957600080fd5b506105026120c0565b60405161050f9190613aee565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613c5d565b6120c6565b60405161054c9190613ac4565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613b93565b612204565b6040516105899190613aee565b60405180910390f35b34801561059e57600080fd5b506105a761221c565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613bf4565b612230565b005b3480156105de57600080fd5b506105e76122f0565b6040516105f49190613cac565b60405180910390f35b34801561060957600080fd5b50610612612316565b60405161061f9190613cac565b60405180910390f35b34801561063457600080fd5b5061063d61233c565b60405161064a9190613ac4565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190613b93565b61234f565b6040516106879190613aee565b60405180910390f35b34801561069c57600080fd5b506106a5612367565b6040516106b29190613ac4565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190613cc7565b612374565b6040516106ef9190613ac4565b60405180910390f35b34801561070457600080fd5b5061070d612580565b60405161071a9190613cac565b60405180910390f35b34801561072f57600080fd5b506107386125a9565b6040516107459190613cac565b60405180910390f35b34801561075a57600080fd5b506107636125cf565b6040516107709190613ac4565b60405180910390f35b34801561078557600080fd5b5061078e6125ed565b60405161079b91906139ae565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613bf4565b61267b565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613d07565b61271c565b005b34801561080257600080fd5b5061080b6127c5565b6040516108189190613da6565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190613a69565b6127eb565b6040516108559190613ac4565b60405180910390f35b34801561086a57600080fd5b50610873612800565b6040516108809190613ac4565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613b93565b61280b565b6040516108bd9190613ac4565b60405180910390f35b3480156108d257600080fd5b506108db61282b565b6040516108e89190613de2565b60405180910390f35b3480156108fd57600080fd5b50610906612851565b6040516109139190613aee565b60405180910390f35b34801561092857600080fd5b50610931612857565b60405161093e9190613aee565b60405180910390f35b34801561095357600080fd5b5061095c61285d565b6040516109699190613cac565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613e55565b612883565b005b3480156109a757600080fd5b506109c260048036038101906109bd9190613cc7565b612b7c565b6040516109cf9190613aee565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190613f23565b612ba1565b005b348015610a0d57600080fd5b50610a286004803603810190610a239190613f63565b612d25565b604051610a359190613ac4565b60405180910390f35b348015610a4a57600080fd5b50610a656004803603810190610a609190613b93565b612ea6565b005b348015610a7357600080fd5b50610a7c612f29565b604051610a899190613fb1565b60405180910390f35b348015610a9e57600080fd5b50610aa7612f4f565b005b60018054610ab690613ffb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290613ffb565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b505050505081565b610b3f613002565b600c60159054906101000a900460ff1615610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690614078565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c17906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca8906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906140e4565b60405180910390fd5b6001600c60156101000a81548160ff021916908315150217905550610d8f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16655af3107a4000613080565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7193430600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600080610e1a612580565b426040518863ffffffff1660e01b8152600401610e3c9695949392919061413f565b60606040518083038185885af1158015610e5a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e7f91906141b5565b505050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f52919061421d565b6040518363ffffffff1660e01b8152600401610f6f92919061424a565b602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061421d565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160116000610ffe612580565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561124d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611271919061421d565b6040518363ffffffff1660e01b815260040161128e92919061424a565b602060405180830381865afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf919061421d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555066038d7ea4c680006003541461136b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611362906142bf565b60405180910390fd5b612710609666038d7ea4c68000611382919061430e565b61138c919061437f565b6010819055507f0887e4063f397b46bca5f33853dd1a946a3b32547bf9cb3b3063bd9db9d8bdfe60405160405180910390a1565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114a09190613aee565b60405180910390a36001905092915050565b60035481565b600060105482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461150891906143b0565b11158061155e5750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806115b65750600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b6115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614456565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461175f576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461175d5782816116dc9190614476565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505b611767613150565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156117c15750600c60009054906101000a900460ff16155b801561181b5750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561185357503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561186157611860613173565b5b600061186e858585613543565b90506000818461187e9190614476565b905083600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118cf9190614476565b9250508190555080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119809190613aee565b60405180910390a36000821115611a445781600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a3b9190613aee565b60405180910390a35b6001925050509392505050565b601260019054906101000a900460ff1681565b611a6c613002565b601260009054906101000a900460ff1615611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab3906144f6565b60405180910390fd5b6001601260006101000a81548160ff0219169083151502179055506103e8600a819055506103e8600b819055507fa1f3078ed9e1e966576844270dda3bb31267ba7d982fc64933d94552630a436860405160405180910390a1565b600c60159054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b8f6136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b906140e4565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cd96136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2690614588565b60405180910390fd5b6000479050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051611d7a906145d9565b60006040518083038185875af1925050503d8060008114611db7576040519150601f19603f3d011682016040523d82523d6000602084013e611dbc565b606091505b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614611df857611df36136fe565b611e1a565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e606136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ead90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c906140e4565b60405180910390fd5b80600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f73338261378a565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fb76136f6565b73ffffffffffffffffffffffffffffffffffffffff161461200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906140e4565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b6000806120d16136f6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516121f19190613aee565b60405180910390a3600191505092915050565b60046020528060005260406000206000915090505481565b612224613002565b61222e600061385a565b565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122716136f6565b73ffffffffffffffffffffffffffffffffffffffff16146122c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122be90614588565b60405180910390fd5b6127108166038d7ea4c680006122dd919061430e565b6122e7919061437f565b60108190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900460ff1681565b60066020528060005260406000206000915090505481565b600062aa36a74614905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123b76136f6565b73ffffffffffffffffffffffffffffffffffffffff161461240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614588565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361247b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124729061463a565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124b69190613cac565b602060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f7919061465a565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401612534929190614687565b6020604051808303816000875af1158015612553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257791906146c5565b91505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006125d9612800565b806125e857506125e7612367565b5b905090565b600280546125fa90613ffb565b80601f016020809104026020016040519081016040528092919081815260200182805461262690613ffb565b80156126735780601f1061264857610100808354040283529160200191612673565b820191906000526020600020905b81548152906001019060200180831161265657829003601f168201915b505050505081565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126bc6136f6565b73ffffffffffffffffffffffffffffffffffffffff1614612712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270990614588565b60405180910390fd5b8060138190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661275d6136f6565b73ffffffffffffffffffffffffffffffffffffffff16146127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa90614588565b60405180910390fd5b81600a8190555080600b819055505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006127f83384846114b8565b905092915050565b600060054614905090565b60116020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600b5481565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b428410156128c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bd9061473e565b60405180910390fd5b600060016128d2611dc2565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600660008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b60405160200161295a9695949392919061475e565b60405160208183030381529060405280519060200120604051602001612981929190614837565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516129b7949392919061486e565b6020604051602081039080840390855afa1580156129d9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612a4d57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906148ff565b60405180910390fd5b85600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051612b6b9190613aee565b60405180910390a350505050505050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612be26136f6565b73ffffffffffffffffffffffffffffffffffffffff1614612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90614588565b60405180910390fd5b801515601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc190614991565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080612d306136f6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051612e949190613aee565b60405180910390a36001915050919050565b612eae613002565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1490614a23565b60405180910390fd5b612f268161385a565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612f57613002565b601260019054906101000a900460ff1615612fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9e906144f6565b60405180910390fd5b6001601260016101000a81548160ff0219169083151502179055506101f4600a819055506101f4600b819055507fc8c66e37e8b41bcc2deecfa7487ae0d5ed2fd626c0544a58c33ba95d90a47d4a60405160405180910390a1565b61300a6136f6565b73ffffffffffffffffffffffffffffffffffffffff16613028612580565b73ffffffffffffffffffffffffffffffffffffffff161461307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307590614a8f565b60405180910390fd5b565b806003600082825461309291906143b0565b9250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131449190613aee565b60405180910390a35050565b60006127106002600354613164919061430e565b61316e919061437f565b905090565b6001600c60006101000a81548160ff0219169083151502179055506000600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600267ffffffffffffffff8111156131ef576131ee614aaf565b5b60405190808252806020026020018201604052801561321d5781602001602082028036833780820191505090505b509050308160008151811061323557613234614ade565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613300919061421d565b8160018151811061331457613313614ade565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016133b2959493929190614bcb565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b5050505060004790506000601354826133f9919061437f565b9050600081836134099190614476565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613451906145d9565b60006040518083038185875af1925050503d806000811461348e576040519150601f19603f3d011682016040523d82523d6000602084013e613493565b606091505b505050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516134dc906145d9565b60006040518083038185875af1925050503d8060008114613519576040519150601f19603f3d011682016040523d82523d6000602084013e61351e565b606091505b50505050505050506000600c60006101000a81548160ff021916908315150217905550565b600061354d612580565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135b85750613589612580565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806135ee57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156135fc57600090506136ef565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361367357612710600a5483613662919061430e565b61366c919061437f565b90506136ef565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036136ea57612710600b54836136d9919061430e565b6136e3919061437f565b90506136ef565b600090505b9392505050565b600033905090565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60016040516137309190614cbd565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161376f959493929190614cd4565b60405160208183030381529060405280519060200120905090565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137d99190614476565b9250508190555080600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161384e9190613aee565b60405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561395857808201518184015260208101905061393d565b60008484015250505050565b6000601f19601f8301169050919050565b60006139808261391e565b61398a8185613929565b935061399a81856020860161393a565b6139a381613964565b840191505092915050565b600060208201905081810360008301526139c88184613975565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a00826139d5565b9050919050565b613a10816139f5565b8114613a1b57600080fd5b50565b600081359050613a2d81613a07565b92915050565b6000819050919050565b613a4681613a33565b8114613a5157600080fd5b50565b600081359050613a6381613a3d565b92915050565b60008060408385031215613a8057613a7f6139d0565b5b6000613a8e85828601613a1e565b9250506020613a9f85828601613a54565b9150509250929050565b60008115159050919050565b613abe81613aa9565b82525050565b6000602082019050613ad96000830184613ab5565b92915050565b613ae881613a33565b82525050565b6000602082019050613b036000830184613adf565b92915050565b600080600060608486031215613b2257613b216139d0565b5b6000613b3086828701613a1e565b9350506020613b4186828701613a1e565b9250506040613b5286828701613a54565b9150509250925092565b600060ff82169050919050565b613b7281613b5c565b82525050565b6000602082019050613b8d6000830184613b69565b92915050565b600060208284031215613ba957613ba86139d0565b5b6000613bb784828501613a1e565b91505092915050565b6000819050919050565b613bd381613bc0565b82525050565b6000602082019050613bee6000830184613bca565b92915050565b600060208284031215613c0a57613c096139d0565b5b6000613c1884828501613a54565b91505092915050565b600063ffffffff82169050919050565b613c3a81613c21565b8114613c4557600080fd5b50565b600081359050613c5781613c31565b92915050565b60008060408385031215613c7457613c736139d0565b5b6000613c8285828601613c48565b9250506020613c9385828601613a1e565b9150509250929050565b613ca6816139f5565b82525050565b6000602082019050613cc16000830184613c9d565b92915050565b60008060408385031215613cde57613cdd6139d0565b5b6000613cec85828601613a1e565b9250506020613cfd85828601613a1e565b9150509250929050565b60008060408385031215613d1e57613d1d6139d0565b5b6000613d2c85828601613a54565b9250506020613d3d85828601613a54565b9150509250929050565b6000819050919050565b6000613d6c613d67613d62846139d5565b613d47565b6139d5565b9050919050565b6000613d7e82613d51565b9050919050565b6000613d9082613d73565b9050919050565b613da081613d85565b82525050565b6000602082019050613dbb6000830184613d97565b92915050565b6000613dcc82613d73565b9050919050565b613ddc81613dc1565b82525050565b6000602082019050613df76000830184613dd3565b92915050565b613e0681613b5c565b8114613e1157600080fd5b50565b600081359050613e2381613dfd565b92915050565b613e3281613bc0565b8114613e3d57600080fd5b50565b600081359050613e4f81613e29565b92915050565b600080600080600080600060e0888a031215613e7457613e736139d0565b5b6000613e828a828b01613a1e565b9750506020613e938a828b01613a1e565b9650506040613ea48a828b01613a54565b9550506060613eb58a828b01613a54565b9450506080613ec68a828b01613e14565b93505060a0613ed78a828b01613e40565b92505060c0613ee88a828b01613e40565b91505092959891949750929550565b613f0081613aa9565b8114613f0b57600080fd5b50565b600081359050613f1d81613ef7565b92915050565b60008060408385031215613f3a57613f396139d0565b5b6000613f4885828601613a1e565b9250506020613f5985828601613f0e565b9150509250929050565b600060208284031215613f7957613f786139d0565b5b6000613f8784828501613c48565b91505092915050565b6000613f9b82613d73565b9050919050565b613fab81613f90565b82525050565b6000602082019050613fc66000830184613fa2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401357607f821691505b60208210810361402657614025613fcc565b5b50919050565b7f616c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000614062601083613929565b915061406d8261402c565b602082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b7f6e756c6c20616464726573730000000000000000000000000000000000000000600082015250565b60006140ce600c83613929565b91506140d982614098565b602082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b6000819050919050565b600061412961412461411f84614104565b613d47565b613a33565b9050919050565b6141398161410e565b82525050565b600060c0820190506141546000830189613c9d565b6141616020830188613adf565b61416e6040830187614130565b61417b6060830186614130565b6141886080830185613c9d565b61419560a0830184613adf565b979650505050505050565b6000815190506141af81613a3d565b92915050565b6000806000606084860312156141ce576141cd6139d0565b5b60006141dc868287016141a0565b93505060206141ed868287016141a0565b92505060406141fe868287016141a0565b9150509250925092565b60008151905061421781613a07565b92915050565b600060208284031215614233576142326139d0565b5b600061424184828501614208565b91505092915050565b600060408201905061425f6000830185613c9d565b61426c6020830184613c9d565b9392505050565b7f6e756d6265727320646f6e277420616464207570000000000000000000000000600082015250565b60006142a9601483613929565b91506142b482614273565b602082019050919050565b600060208201905081810360008301526142d88161429c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061431982613a33565b915061432483613a33565b925082820261433281613a33565b91508282048414831517614349576143486142df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061438a82613a33565b915061439583613a33565b9250826143a5576143a4614350565b5b828204905092915050565b60006143bb82613a33565b91506143c683613a33565b92508282019050808211156143de576143dd6142df565b5b92915050565b7f5472616e736665722077696c6c206578636565642077616c6c6574206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614440602183613929565b915061444b826143e4565b604082019050919050565b6000602082019050818103600083015261446f81614433565b9050919050565b600061448182613a33565b915061448c83613a33565b92508282039050818111156144a4576144a36142df565b5b92915050565b7f746869732069732061206f6e652073686f742066756e6374696f6e0000000000600082015250565b60006144e0601b83613929565b91506144eb826144aa565b602082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f6f6e6c792064657620616464726573732063616e2063616c6c2066756e63746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614572602283613929565b915061457d82614516565b604082019050919050565b600060208201905081810360008301526145a181614565565b9050919050565b600081905092915050565b50565b60006145c36000836145a8565b91506145ce826145b3565b600082019050919050565b60006145e4826145b6565b9150819050919050565b7f43616e2774207769746864726177206e617469766520746f6b656e7300000000600082015250565b6000614624601c83613929565b915061462f826145ee565b602082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b6000602082840312156146705761466f6139d0565b5b600061467e848285016141a0565b91505092915050565b600060408201905061469c6000830185613c9d565b6146a96020830184613adf565b9392505050565b6000815190506146bf81613ef7565b92915050565b6000602082840312156146db576146da6139d0565b5b60006146e9848285016146b0565b91505092915050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b6000614728601783613929565b9150614733826146f2565b602082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b600060c0820190506147736000830189613bca565b6147806020830188613c9d565b61478d6040830187613c9d565b61479a6060830186613adf565b6147a76080830185613adf565b6147b460a0830184613adf565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006148006002836147bf565b915061480b826147ca565b600282019050919050565b6000819050919050565b61483161482c82613bc0565b614816565b82525050565b6000614842826147f3565b915061484e8285614820565b60208201915061485e8284614820565b6020820191508190509392505050565b60006080820190506148836000830187613bca565b6148906020830186613b69565b61489d6040830185613bca565b6148aa6060830184613bca565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b60006148e9600e83613929565b91506148f4826148b3565b602082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b7f57616c6c65744c696d69743a20416c72656164792073657420746f207468697360008201527f2076616c75650000000000000000000000000000000000000000000000000000602082015250565b600061497b602683613929565b91506149868261491f565b604082019050919050565b600060208201905081810360008301526149aa8161496e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a0d602683613929565b9150614a18826149b1565b604082019050919050565b60006020820190508181036000830152614a3c81614a00565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a79602083613929565b9150614a8482614a43565b602082019050919050565b60006020820190508181036000830152614aa881614a6c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b42816139f5565b82525050565b6000614b548383614b39565b60208301905092915050565b6000602082019050919050565b6000614b7882614b0d565b614b828185614b18565b9350614b8d83614b29565b8060005b83811015614bbe578151614ba58882614b48565b9750614bb083614b60565b925050600181019050614b91565b5085935050505092915050565b600060a082019050614be06000830188613adf565b614bed6020830187614130565b8181036040830152614bff8186614b6d565b9050614c0e6060830185613c9d565b614c1b6080830184613adf565b9695505050505050565b60008190508160005260206000209050919050565b60008154614c4781613ffb565b614c5181866145a8565b94506001821660008114614c6c5760018114614c8157614cb4565b60ff1983168652811515820286019350614cb4565b614c8a85614c25565b60005b83811015614cac57815481890152600182019150602081019050614c8d565b838801955050505b50505092915050565b6000614cc98284614c3a565b915081905092915050565b600060a082019050614ce96000830188613bca565b614cf66020830187613bca565b614d036040830186613bca565b614d106060830185613adf565b614d1d6080830184613c9d565b969550505050505056fea26469706673582212206f888d78f7b6501cfeb06e48fb75d3a5b8871ba4e8dec6d60c517c111313a93a64736f6c63430008130033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80637ecebe001161015a578063b40f9469116100c1578063dd62ed3e1161007a578063dd62ed3e1461099b578063e16830a8146109d8578063eec1c69f14610a01578063f2fde38b14610a3e578063f887ea4014610a67578063f98eb6e114610a9257610293565b8063b40f946914610889578063c45a0155146108c6578063c473413a146108f1578063cffd129c1461091c578063d3f3300914610947578063d505accf1461097257610293565b806395d89b411161011357806395d89b41146107795780639b72ea4a146107a4578063a0496f6f146107cd578063a8aa1b31146107f6578063a9059cbb14610821578063b3e5cb451461085e57610293565b80637ecebe00146106535780637f50ce17146106905780638366e79a146106bb5780638da5cb5b146106f857806391cca3db1461072357806392108c861461074e57610293565b80633644e515116101fe57806370a08231116101b757806370a0823114610555578063715018a614610592578063728d41c9146105a957806375f0a874146105d257806377818f02146105fd5780637d5ea21b1461062857610293565b80633644e51514610447578063405ebd4d1461047257806342966c681461049b5780635d098b38146104c457806366a88d96146104ed5780636e9ed75a1461051857610293565b8063270fd20a11610250578063270fd20a1461036f5780632ca1b45d1461039a578063307aebc9146103b1578063313ce567146103dc57806335d4de511461040757806335faa4161461043057610293565b806306fdde031461029557806307df7a0d146102c0578063095ea7b3146102ca57806318160ddd1461030757806323b872dd1461033257610293565b3661029357005b005b3480156102a157600080fd5b506102aa610aa9565b6040516102b791906139ae565b60405180910390f35b6102c8610b37565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190613a69565b6113c0565b6040516102fe9190613ac4565b60405180910390f35b34801561031357600080fd5b5061031c6114b2565b6040516103299190613aee565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613b09565b6114b8565b6040516103669190613ac4565b60405180910390f35b34801561037b57600080fd5b50610384611a51565b6040516103919190613ac4565b60405180910390f35b3480156103a657600080fd5b506103af611a64565b005b3480156103bd57600080fd5b506103c6611b17565b6040516103d39190613ac4565b60405180910390f35b3480156103e857600080fd5b506103f1611b2a565b6040516103fe9190613b78565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613b93565b611b4e565b005b34801561043c57600080fd5b50610445611c98565b005b34801561045357600080fd5b5061045c611dc2565b6040516104699190613bd9565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613b93565b611e1f565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613bf4565b611f69565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613b93565b611f76565b005b3480156104f957600080fd5b506105026120c0565b60405161050f9190613aee565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613c5d565b6120c6565b60405161054c9190613ac4565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613b93565b612204565b6040516105899190613aee565b60405180910390f35b34801561059e57600080fd5b506105a761221c565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613bf4565b612230565b005b3480156105de57600080fd5b506105e76122f0565b6040516105f49190613cac565b60405180910390f35b34801561060957600080fd5b50610612612316565b60405161061f9190613cac565b60405180910390f35b34801561063457600080fd5b5061063d61233c565b60405161064a9190613ac4565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190613b93565b61234f565b6040516106879190613aee565b60405180910390f35b34801561069c57600080fd5b506106a5612367565b6040516106b29190613ac4565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190613cc7565b612374565b6040516106ef9190613ac4565b60405180910390f35b34801561070457600080fd5b5061070d612580565b60405161071a9190613cac565b60405180910390f35b34801561072f57600080fd5b506107386125a9565b6040516107459190613cac565b60405180910390f35b34801561075a57600080fd5b506107636125cf565b6040516107709190613ac4565b60405180910390f35b34801561078557600080fd5b5061078e6125ed565b60405161079b91906139ae565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613bf4565b61267b565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613d07565b61271c565b005b34801561080257600080fd5b5061080b6127c5565b6040516108189190613da6565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190613a69565b6127eb565b6040516108559190613ac4565b60405180910390f35b34801561086a57600080fd5b50610873612800565b6040516108809190613ac4565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613b93565b61280b565b6040516108bd9190613ac4565b60405180910390f35b3480156108d257600080fd5b506108db61282b565b6040516108e89190613de2565b60405180910390f35b3480156108fd57600080fd5b50610906612851565b6040516109139190613aee565b60405180910390f35b34801561092857600080fd5b50610931612857565b60405161093e9190613aee565b60405180910390f35b34801561095357600080fd5b5061095c61285d565b6040516109699190613cac565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613e55565b612883565b005b3480156109a757600080fd5b506109c260048036038101906109bd9190613cc7565b612b7c565b6040516109cf9190613aee565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190613f23565b612ba1565b005b348015610a0d57600080fd5b50610a286004803603810190610a239190613f63565b612d25565b604051610a359190613ac4565b60405180910390f35b348015610a4a57600080fd5b50610a656004803603810190610a609190613b93565b612ea6565b005b348015610a7357600080fd5b50610a7c612f29565b604051610a899190613fb1565b60405180910390f35b348015610a9e57600080fd5b50610aa7612f4f565b005b60018054610ab690613ffb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290613ffb565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b505050505081565b610b3f613002565b600c60159054906101000a900460ff1615610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690614078565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c17906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca8906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906140e4565b60405180910390fd5b6001600c60156101000a81548160ff021916908315150217905550610d8f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16655af3107a4000613080565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7193430600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600080610e1a612580565b426040518863ffffffff1660e01b8152600401610e3c9695949392919061413f565b60606040518083038185885af1158015610e5a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e7f91906141b5565b505050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f52919061421d565b6040518363ffffffff1660e01b8152600401610f6f92919061424a565b602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061421d565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160116000610ffe612580565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561124d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611271919061421d565b6040518363ffffffff1660e01b815260040161128e92919061424a565b602060405180830381865afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf919061421d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555066038d7ea4c680006003541461136b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611362906142bf565b60405180910390fd5b612710609666038d7ea4c68000611382919061430e565b61138c919061437f565b6010819055507f0887e4063f397b46bca5f33853dd1a946a3b32547bf9cb3b3063bd9db9d8bdfe60405160405180910390a1565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114a09190613aee565b60405180910390a36001905092915050565b60035481565b600060105482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461150891906143b0565b11158061155e5750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806115b65750600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b6115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614456565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461175f576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461175d5782816116dc9190614476565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505b611767613150565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156117c15750600c60009054906101000a900460ff16155b801561181b5750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561185357503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561186157611860613173565b5b600061186e858585613543565b90506000818461187e9190614476565b905083600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118cf9190614476565b9250508190555080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119809190613aee565b60405180910390a36000821115611a445781600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a3b9190613aee565b60405180910390a35b6001925050509392505050565b601260019054906101000a900460ff1681565b611a6c613002565b601260009054906101000a900460ff1615611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab3906144f6565b60405180910390fd5b6001601260006101000a81548160ff0219169083151502179055506103e8600a819055506103e8600b819055507fa1f3078ed9e1e966576844270dda3bb31267ba7d982fc64933d94552630a436860405160405180910390a1565b600c60159054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000881565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b8f6136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b906140e4565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cd96136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2690614588565b60405180910390fd5b6000479050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051611d7a906145d9565b60006040518083038185875af1925050503d8060008114611db7576040519150601f19603f3d011682016040523d82523d6000602084013e611dbc565b606091505b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000014614611df857611df36136fe565b611e1a565b7f3610d7de155c55024bd0ca70aad37e855d7bc8cdd0eb42df52884b90549a4b165b905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e606136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ead90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c906140e4565b60405180910390fd5b80600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f73338261378a565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fb76136f6565b73ffffffffffffffffffffffffffffffffffffffff161461200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906140e4565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b6000806120d16136f6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516121f19190613aee565b60405180910390a3600191505092915050565b60046020528060005260406000206000915090505481565b612224613002565b61222e600061385a565b565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122716136f6565b73ffffffffffffffffffffffffffffffffffffffff16146122c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122be90614588565b60405180910390fd5b6127108166038d7ea4c680006122dd919061430e565b6122e7919061437f565b60108190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900460ff1681565b60066020528060005260406000206000915090505481565b600062aa36a74614905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123b76136f6565b73ffffffffffffffffffffffffffffffffffffffff161461240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614588565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361247b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124729061463a565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124b69190613cac565b602060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f7919061465a565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401612534929190614687565b6020604051808303816000875af1158015612553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257791906146c5565b91505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006125d9612800565b806125e857506125e7612367565b5b905090565b600280546125fa90613ffb565b80601f016020809104026020016040519081016040528092919081815260200182805461262690613ffb565b80156126735780601f1061264857610100808354040283529160200191612673565b820191906000526020600020905b81548152906001019060200180831161265657829003601f168201915b505050505081565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126bc6136f6565b73ffffffffffffffffffffffffffffffffffffffff1614612712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270990614588565b60405180910390fd5b8060138190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661275d6136f6565b73ffffffffffffffffffffffffffffffffffffffff16146127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa90614588565b60405180910390fd5b81600a8190555080600b819055505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006127f83384846114b8565b905092915050565b600060054614905090565b60116020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600b5481565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b428410156128c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bd9061473e565b60405180910390fd5b600060016128d2611dc2565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600660008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b60405160200161295a9695949392919061475e565b60405160208183030381529060405280519060200120604051602001612981929190614837565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516129b7949392919061486e565b6020604051602081039080840390855afa1580156129d9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612a4d57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906148ff565b60405180910390fd5b85600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051612b6b9190613aee565b60405180910390a350505050505050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612be26136f6565b73ffffffffffffffffffffffffffffffffffffffff1614612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90614588565b60405180910390fd5b801515601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc190614991565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080612d306136f6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051612e949190613aee565b60405180910390a36001915050919050565b612eae613002565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1490614a23565b60405180910390fd5b612f268161385a565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612f57613002565b601260019054906101000a900460ff1615612fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9e906144f6565b60405180910390fd5b6001601260016101000a81548160ff0219169083151502179055506101f4600a819055506101f4600b819055507fc8c66e37e8b41bcc2deecfa7487ae0d5ed2fd626c0544a58c33ba95d90a47d4a60405160405180910390a1565b61300a6136f6565b73ffffffffffffffffffffffffffffffffffffffff16613028612580565b73ffffffffffffffffffffffffffffffffffffffff161461307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307590614a8f565b60405180910390fd5b565b806003600082825461309291906143b0565b9250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131449190613aee565b60405180910390a35050565b60006127106002600354613164919061430e565b61316e919061437f565b905090565b6001600c60006101000a81548160ff0219169083151502179055506000600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600267ffffffffffffffff8111156131ef576131ee614aaf565b5b60405190808252806020026020018201604052801561321d5781602001602082028036833780820191505090505b509050308160008151811061323557613234614ade565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613300919061421d565b8160018151811061331457613313614ade565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016133b2959493929190614bcb565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b5050505060004790506000601354826133f9919061437f565b9050600081836134099190614476565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613451906145d9565b60006040518083038185875af1925050503d806000811461348e576040519150601f19603f3d011682016040523d82523d6000602084013e613493565b606091505b505050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516134dc906145d9565b60006040518083038185875af1925050503d8060008114613519576040519150601f19603f3d011682016040523d82523d6000602084013e61351e565b606091505b50505050505050506000600c60006101000a81548160ff021916908315150217905550565b600061354d612580565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135b85750613589612580565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806135ee57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156135fc57600090506136ef565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361367357612710600a5483613662919061430e565b61366c919061437f565b90506136ef565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036136ea57612710600b54836136d9919061430e565b6136e3919061437f565b90506136ef565b600090505b9392505050565b600033905090565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60016040516137309190614cbd565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161376f959493929190614cd4565b60405160208183030381529060405280519060200120905090565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137d99190614476565b9250508190555080600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161384e9190613aee565b60405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561395857808201518184015260208101905061393d565b60008484015250505050565b6000601f19601f8301169050919050565b60006139808261391e565b61398a8185613929565b935061399a81856020860161393a565b6139a381613964565b840191505092915050565b600060208201905081810360008301526139c88184613975565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a00826139d5565b9050919050565b613a10816139f5565b8114613a1b57600080fd5b50565b600081359050613a2d81613a07565b92915050565b6000819050919050565b613a4681613a33565b8114613a5157600080fd5b50565b600081359050613a6381613a3d565b92915050565b60008060408385031215613a8057613a7f6139d0565b5b6000613a8e85828601613a1e565b9250506020613a9f85828601613a54565b9150509250929050565b60008115159050919050565b613abe81613aa9565b82525050565b6000602082019050613ad96000830184613ab5565b92915050565b613ae881613a33565b82525050565b6000602082019050613b036000830184613adf565b92915050565b600080600060608486031215613b2257613b216139d0565b5b6000613b3086828701613a1e565b9350506020613b4186828701613a1e565b9250506040613b5286828701613a54565b9150509250925092565b600060ff82169050919050565b613b7281613b5c565b82525050565b6000602082019050613b8d6000830184613b69565b92915050565b600060208284031215613ba957613ba86139d0565b5b6000613bb784828501613a1e565b91505092915050565b6000819050919050565b613bd381613bc0565b82525050565b6000602082019050613bee6000830184613bca565b92915050565b600060208284031215613c0a57613c096139d0565b5b6000613c1884828501613a54565b91505092915050565b600063ffffffff82169050919050565b613c3a81613c21565b8114613c4557600080fd5b50565b600081359050613c5781613c31565b92915050565b60008060408385031215613c7457613c736139d0565b5b6000613c8285828601613c48565b9250506020613c9385828601613a1e565b9150509250929050565b613ca6816139f5565b82525050565b6000602082019050613cc16000830184613c9d565b92915050565b60008060408385031215613cde57613cdd6139d0565b5b6000613cec85828601613a1e565b9250506020613cfd85828601613a1e565b9150509250929050565b60008060408385031215613d1e57613d1d6139d0565b5b6000613d2c85828601613a54565b9250506020613d3d85828601613a54565b9150509250929050565b6000819050919050565b6000613d6c613d67613d62846139d5565b613d47565b6139d5565b9050919050565b6000613d7e82613d51565b9050919050565b6000613d9082613d73565b9050919050565b613da081613d85565b82525050565b6000602082019050613dbb6000830184613d97565b92915050565b6000613dcc82613d73565b9050919050565b613ddc81613dc1565b82525050565b6000602082019050613df76000830184613dd3565b92915050565b613e0681613b5c565b8114613e1157600080fd5b50565b600081359050613e2381613dfd565b92915050565b613e3281613bc0565b8114613e3d57600080fd5b50565b600081359050613e4f81613e29565b92915050565b600080600080600080600060e0888a031215613e7457613e736139d0565b5b6000613e828a828b01613a1e565b9750506020613e938a828b01613a1e565b9650506040613ea48a828b01613a54565b9550506060613eb58a828b01613a54565b9450506080613ec68a828b01613e14565b93505060a0613ed78a828b01613e40565b92505060c0613ee88a828b01613e40565b91505092959891949750929550565b613f0081613aa9565b8114613f0b57600080fd5b50565b600081359050613f1d81613ef7565b92915050565b60008060408385031215613f3a57613f396139d0565b5b6000613f4885828601613a1e565b9250506020613f5985828601613f0e565b9150509250929050565b600060208284031215613f7957613f786139d0565b5b6000613f8784828501613c48565b91505092915050565b6000613f9b82613d73565b9050919050565b613fab81613f90565b82525050565b6000602082019050613fc66000830184613fa2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401357607f821691505b60208210810361402657614025613fcc565b5b50919050565b7f616c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000614062601083613929565b915061406d8261402c565b602082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b7f6e756c6c20616464726573730000000000000000000000000000000000000000600082015250565b60006140ce600c83613929565b91506140d982614098565b602082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b6000819050919050565b600061412961412461411f84614104565b613d47565b613a33565b9050919050565b6141398161410e565b82525050565b600060c0820190506141546000830189613c9d565b6141616020830188613adf565b61416e6040830187614130565b61417b6060830186614130565b6141886080830185613c9d565b61419560a0830184613adf565b979650505050505050565b6000815190506141af81613a3d565b92915050565b6000806000606084860312156141ce576141cd6139d0565b5b60006141dc868287016141a0565b93505060206141ed868287016141a0565b92505060406141fe868287016141a0565b9150509250925092565b60008151905061421781613a07565b92915050565b600060208284031215614233576142326139d0565b5b600061424184828501614208565b91505092915050565b600060408201905061425f6000830185613c9d565b61426c6020830184613c9d565b9392505050565b7f6e756d6265727320646f6e277420616464207570000000000000000000000000600082015250565b60006142a9601483613929565b91506142b482614273565b602082019050919050565b600060208201905081810360008301526142d88161429c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061431982613a33565b915061432483613a33565b925082820261433281613a33565b91508282048414831517614349576143486142df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061438a82613a33565b915061439583613a33565b9250826143a5576143a4614350565b5b828204905092915050565b60006143bb82613a33565b91506143c683613a33565b92508282019050808211156143de576143dd6142df565b5b92915050565b7f5472616e736665722077696c6c206578636565642077616c6c6574206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614440602183613929565b915061444b826143e4565b604082019050919050565b6000602082019050818103600083015261446f81614433565b9050919050565b600061448182613a33565b915061448c83613a33565b92508282039050818111156144a4576144a36142df565b5b92915050565b7f746869732069732061206f6e652073686f742066756e6374696f6e0000000000600082015250565b60006144e0601b83613929565b91506144eb826144aa565b602082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f6f6e6c792064657620616464726573732063616e2063616c6c2066756e63746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614572602283613929565b915061457d82614516565b604082019050919050565b600060208201905081810360008301526145a181614565565b9050919050565b600081905092915050565b50565b60006145c36000836145a8565b91506145ce826145b3565b600082019050919050565b60006145e4826145b6565b9150819050919050565b7f43616e2774207769746864726177206e617469766520746f6b656e7300000000600082015250565b6000614624601c83613929565b915061462f826145ee565b602082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b6000602082840312156146705761466f6139d0565b5b600061467e848285016141a0565b91505092915050565b600060408201905061469c6000830185613c9d565b6146a96020830184613adf565b9392505050565b6000815190506146bf81613ef7565b92915050565b6000602082840312156146db576146da6139d0565b5b60006146e9848285016146b0565b91505092915050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b6000614728601783613929565b9150614733826146f2565b602082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b600060c0820190506147736000830189613bca565b6147806020830188613c9d565b61478d6040830187613c9d565b61479a6060830186613adf565b6147a76080830185613adf565b6147b460a0830184613adf565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006148006002836147bf565b915061480b826147ca565b600282019050919050565b6000819050919050565b61483161482c82613bc0565b614816565b82525050565b6000614842826147f3565b915061484e8285614820565b60208201915061485e8284614820565b6020820191508190509392505050565b60006080820190506148836000830187613bca565b6148906020830186613b69565b61489d6040830185613bca565b6148aa6060830184613bca565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b60006148e9600e83613929565b91506148f4826148b3565b602082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b7f57616c6c65744c696d69743a20416c72656164792073657420746f207468697360008201527f2076616c75650000000000000000000000000000000000000000000000000000602082015250565b600061497b602683613929565b91506149868261491f565b604082019050919050565b600060208201905081810360008301526149aa8161496e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a0d602683613929565b9150614a18826149b1565b604082019050919050565b60006020820190508181036000830152614a3c81614a00565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a79602083613929565b9150614a8482614a43565b602082019050919050565b60006020820190508181036000830152614aa881614a6c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b42816139f5565b82525050565b6000614b548383614b39565b60208301905092915050565b6000602082019050919050565b6000614b7882614b0d565b614b828185614b18565b9350614b8d83614b29565b8060005b83811015614bbe578151614ba58882614b48565b9750614bb083614b60565b925050600181019050614b91565b5085935050505092915050565b600060a082019050614be06000830188613adf565b614bed6020830187614130565b8181036040830152614bff8186614b6d565b9050614c0e6060830185613c9d565b614c1b6080830184613adf565b9695505050505050565b60008190508160005260206000209050919050565b60008154614c4781613ffb565b614c5181866145a8565b94506001821660008114614c6c5760018114614c8157614cb4565b60ff1983168652811515820286019350614cb4565b614c8a85614c25565b60005b83811015614cac57815481890152600182019150602081019050614c8d565b838801955050505b50505092915050565b6000614cc98284614c3a565b915081905092915050565b600060a082019050614ce96000830188613bca565b614cf66020830187613bca565b614d036040830186613bca565b614d106060830185613adf565b614d1d6080830184613c9d565b969550505050505056fea26469706673582212206f888d78f7b6501cfeb06e48fb75d3a5b8871ba4e8dec6d60c517c111313a93a64736f6c63430008130033

Deployed Bytecode Sourcemap

22420:13190:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7464:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27736:1219;;;:::i;:::-;;8907:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32962:1904;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23718:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25599:233;;;;;;;;;;;;;:::i;:::-;;23314:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7520:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27509:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31947:206;;;;;;;;;;;;;:::i;:::-;;11979:226;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26633:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25073:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27052:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23532:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35326:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7782:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2746:103;;;;;;;;;;;;;:::i;:::-;;26847:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23345:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23427:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23688:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8208:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25385:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34872:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2098:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23505:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25492:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7491:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31449:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27287:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22542:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32382:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25286:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23623:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22503:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23066:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23100:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23278:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10395:1576;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7835:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31626:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26367:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3004:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22464:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25840:241;;;;;;;;;;;;;:::i;:::-;;7464:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27736:1219::-;1984:13;:11;:13::i;:::-;27808:10:::1;;;;;;;;;;;27807:11;27799:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;27885:1;27858:29;;:15;;;;;;;;;;;:29;;::::0;27850:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27946:1;27923:25;;:11;;;;;;;;;;;:25;;::::0;27915:50:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28008:1;27984:26;;:12;;;;;;;;;;;:26;;::::0;27976:51:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28051:4;28038:10;;:17;;;;;;;;;;;;;;;;;;28068:26;28074:12;;;;;;;;;;;22856:19;28068:5;:26::i;:::-;28107:6;;;;;;;;;;;:22;;;28137:9;28170:4;28190:9;:24;28208:4;28190:24;;;;;;;;;;;;;;;;28229:1;28245::::0;28261:7:::1;:5;:7::i;:::-;28283:15;28107:202;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28344:7;;;;;;;;;;;:15;;;28368:4;28375:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28344:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28322:4;;:68;;;;;;;;;;;;;;;;;;28438:4;28401:25;:34;28427:7;:5;:7::i;:::-;28401:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;28496:4;28453:25;:40;28487:4;28453:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;28556:4;28511:25;:42;28537:15;;;;;;;;;;;28511:42;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;28612:4;28571:25;:38;28597:11;;;;;;;;;;;28571:38;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;28702:4;28627:25;:72;28653:7;;;;;;;;;;;:15;;;28677:4;28684:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28653:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28627:72;;;;;;;;;;;;;;;;:79;;;;;;;;;;;;;;;;;;22616:20;28729:11;;:29;28721:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28901:6;28894:3;22616:20;28877;;;;:::i;:::-;28876:31;;;;:::i;:::-;28858:14;:49;;;;28925:22;;;;;;;;;;27736:1219::o:0;8907:242::-;9006:4;9056:6;9023:9;:21;9033:10;9023:21;;;;;;;;;;;;;;;:30;9045:7;9023:30;;;;;;;;;;;;;;;:39;;;;9101:7;9080:37;;9089:10;9080:37;;;9110:6;9080:37;;;;;;:::i;:::-;;;;;;;;9137:4;9130:11;;8907:242;;;;:::o;7747:26::-;;;;:::o;32962:1904::-;33082:4;33134:14;;33124:6;33108:9;:13;33118:2;33108:13;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;:40;;33107:75;;;;33153:25;:29;33179:2;33153:29;;;;;;;;;;;;;;;;;;;;;;;;;33107:75;:101;;;;33195:12;;;;;;;;;;;33187:20;;:4;:20;;;33107:101;33099:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;33269:10;33261:18;;:4;:18;;;33257:289;;33345:12;33360:9;:15;33370:4;33360:15;;;;;;;;;;;;;;;:27;33376:10;33360:27;;;;;;;;;;;;;;;;33345:42;;33455:14;33444:7;:25;33440:94;;33528:6;33518:7;:16;;;;:::i;:::-;33488:9;:15;33498:4;33488:15;;;;;;;;;;;;;;;:27;33504:10;33488:27;;;;;;;;;;;;;;;:46;;;;33440:94;33281:265;33257:289;33783:18;:16;:18::i;:::-;33756:9;:24;33774:4;33756:24;;;;;;;;;;;;;;;;:45;:86;;;;;33819:23;;;;;;;;;;;33818:24;33756:86;:124;;;;;33875:4;;;;;;;;;;;33859:21;;:4;:21;;;;33756:124;:162;;;;;33913:4;33897:21;;:4;:21;;;;33756:162;33738:239;;;33945:20;:18;:20::i;:::-;33738:239;33989:8;34000:25;34008:4;34014:2;34018:6;34000:7;:25::i;:::-;33989:36;;34036:19;34067:3;34058:6;:12;;;;:::i;:::-;34036:34;;34102:6;34083:9;:15;34093:4;34083:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;34273:14;34256:9;:13;34266:2;34256:13;;;;;;;;;;;;;;;;:31;;;;;;;;;;;34331:2;34316:34;;34325:4;34316:34;;;34335:14;34316:34;;;;;;:::i;:::-;;;;;;;;34373:1;34367:3;:7;34363:472;;;34565:3;34537:9;:24;34555:4;34537:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;34751:4;34728:34;;34737:4;34728:34;;;34758:3;34728:34;;;;;;:::i;:::-;;;;;;;;34363:472;34854:4;34847:11;;;;32962:1904;;;;;:::o;23718:26::-;;;;;;;;;;;;;:::o;25599:233::-;1984:13;:11;:13::i;:::-;25665:11:::1;;;;;;;;;;;25664:12;25656:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;25733:4;25719:11;;:18;;;;;;;;;;;;;;;;;;25760:4;25748:9;:16;;;;25788:4;25775:10;:17;;;;25808:16;;;;;;;;;;25599:233::o:0;23314:22::-;;;;;;;;;;;;;:::o;7520:31::-;;;:::o;27509:219::-;27591:3;;;;;;;;;;;27575:19;;:12;:10;:12::i;:::-;:19;;;27567:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27670:1;27652:20;;:6;:20;;;27644:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;27714:6;27700:11;;:20;;;;;;;;;;;;;;;;;;27509:219;:::o;31947:206::-;32008:3;;;;;;;;;;;31992:19;;:12;:10;:12::i;:::-;:19;;;31984:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32061:18;32082:21;32061:42;;32114:3;;;;;;;;;;;:8;;32130:10;32114:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31973:180;31947:206::o;11979:226::-;12036:7;12093:16;12076:13;:33;:121;;12173:24;:22;:24::i;:::-;12076:121;;;12129:24;12076:121;12056:141;;11979:226;:::o;26633:206::-;26711:3;;;;;;;;;;;26695:19;;:12;:10;:12::i;:::-;:19;;;26687:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26785:1;26772:15;;:1;:15;;;26764:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;26830:1;26815:12;;:16;;;;;;;;;;;;;;;;;;26633:206;:::o;25073:80::-;25120:25;25126:10;25138:6;25120:5;:25::i;:::-;25073:80;:::o;27052:227::-;27138:3;;;;;;;;;;;27122:19;;:12;:10;:12::i;:::-;:19;;;27114:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27217:1;27199:20;;:6;:20;;;27191:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;27265:6;27247:15;;:24;;;;;;;;;;;;;;;;;;27052:227;:::o;23532:46::-;;;;:::o;35326:281::-;35411:4;35428:13;35444:12;:10;:12::i;:::-;35428:28;;35501:14;35469:9;:16;35479:5;35469:16;;;;;;;;;;;;;;;:29;35486:11;35469:29;;;;;;;;;;;;;;;:46;;;;35547:11;35531:44;;35540:5;35531:44;;;35560:14;35531:44;;;;;;:::i;:::-;;;;;;;;35595:4;35588:11;;;35326:281;;;;:::o;7782:44::-;;;;;;;;;;;;;;;;;:::o;2746:103::-;1984:13;:11;:13::i;:::-;2811:30:::1;2838:1;2811:18;:30::i;:::-;2746:103::o:0;26847:197::-;26932:3;;;;;;;;;;;26916:19;;:12;:10;:12::i;:::-;:19;;;26908:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27030:6;27020;22616:20;27003:23;;;;:::i;:::-;27002:34;;;;:::i;:::-;26985:14;:51;;;;26847:197;:::o;23345:75::-;;;;;;;;;;;;;:::o;23427:71::-;;;;;;;;;;;;;:::o;23688:23::-;;;;;;;;;;;;;:::o;8208:41::-;;;;;;;;;;;;;;;;;:::o;25385:99::-;25427:4;25468:8;25451:13;:25;25444:32;;25385:99;:::o;34872:390::-;34949:10;34995:3;;;;;;;;;;;34979:19;;:12;:10;:12::i;:::-;:19;;;34971:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35074:4;35056:23;;:6;:23;;;35048:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35123:24;35157:6;35150:24;;;35183:4;35150:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35123:66;;35215:6;35208:23;;;35232:3;35237:16;35208:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35200:54;;34960:302;34872:390;;;;:::o;2098:87::-;2144:7;2171:6;;;;;;;;;;;2164:13;;2098:87;:::o;23505:18::-;;;;;;;;;;;;;:::o;25492:99::-;25534:4;25558:10;:8;:10::i;:::-;:25;;;;25572:11;:9;:11::i;:::-;25558:25;25551:32;;25492:99;:::o;7491:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31449:169::-;31538:3;;;;;;;;;;;31522:19;;:12;:10;:12::i;:::-;:19;;;31514:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31600:10;31588:9;:22;;;;31449:169;:::o;27287:214::-;27383:3;;;;;;;;;;;27367:19;;:12;:10;:12::i;:::-;:19;;;27359:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27448:10;27436:9;:22;;;;27482:11;27469:10;:24;;;;27287:214;;:::o;22542:26::-;;;;;;;;;;;;;:::o;32382:136::-;32450:4;32474:36;32487:10;32499:2;32503:6;32474:12;:36::i;:::-;32467:43;;32382:136;;;;:::o;25286:91::-;25327:4;25368:1;25351:13;:18;25344:25;;25286:91;:::o;23623:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;22503:32::-;;;;;;;;;;;;;:::o;23066:27::-;;;;:::o;23100:28::-;;;;:::o;23278:27::-;;;;;;;;;;;;;:::o;10395:1576::-;10623:15;10611:8;:27;;10603:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10836:24;10863:827;11003:18;:16;:18::i;:::-;11133:167;11335:5;11375:7;11417:5;11457:6;:13;11464:5;11457:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;11507:8;11088:458;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11048:525;;;;;;10923:673;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10891:724;;;;;;11634:1;11654;11674;10863:827;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10836:854;;11761:1;11733:30;;:16;:30;;;;:59;;;;;11787:5;11767:25;;:16;:25;;;11733:59;11707:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;11898:5;11859:9;:27;11869:16;11859:27;;;;;;;;;;;;;;;:36;11887:7;11859:36;;;;;;;;;;;;;;;:44;;;;10811:1104;11948:7;11932:31;;11941:5;11932:31;;;11957:5;11932:31;;;;;;:::i;:::-;;;;;;;;10395:1576;;;;;;;:::o;7835:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31626:313::-;31731:3;;;;;;;;;;;31715:19;;:12;:10;:12::i;:::-;:19;;;31707:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31830:5;31792:43;;:25;:34;31818:7;31792:34;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;31784:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;31926:5;31889:25;:34;31915:7;31889:34;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;31626:313;;:::o;26367:258::-;26427:4;26444:13;26460:12;:10;:12::i;:::-;26444:28;;26518:14;26485:9;:16;26495:5;26485:16;;;;;;;;;;;;;;;:30;26502:12;;;;;;;;;;;26485:30;;;;;;;;;;;;;;;:47;;;;26564:12;;;;;;;;;;;26548:45;;26557:5;26548:45;;;26578:14;26548:45;;;;;;:::i;:::-;;;;;;;;26613:4;26606:11;;;26367:258;;;:::o;3004:238::-;1984:13;:11;:13::i;:::-;3127:1:::1;3107:22;;:8;:22;;::::0;3085:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3206:28;3225:8;3206:18;:28::i;:::-;3004:238:::0;:::o;22464:32::-;;;;;;;;;;;;;:::o;25840:241::-;1984:13;:11;:13::i;:::-;25907:14:::1;;;;;;;;;;;25906:15;25898:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;25981:4;25964:14;;:21;;;;;;;;;;;;;;;;;;26008:3;25996:9;:15;;;;26035:3;26022:10;:16;;;;26054:19;;;;;;;;;;25840:241::o:0;2263:132::-;2338:12;:10;:12::i;:::-;2327:23;;:7;:5;:7::i;:::-;:23;;;2319:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2263:132::o;12918:335::-;13004:6;12989:11;;:21;;;;;;;:::i;:::-;;;;;;;;13178:6;13161:9;:13;13171:2;13161:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;13234:2;13213:32;;13230:1;13213:32;;;13238:6;13213:32;;;;;;:::i;:::-;;;;;;;;12918:335;;:::o;25161:117::-;25212:4;25256:5;25251:1;25237:11;;:15;;;;:::i;:::-;25236:25;;;;:::i;:::-;25229:32;;25161:117;:::o;30079:1362::-;24827:4;24801:23;;:30;;;;;;;;;;;;;;;;;;30525:17:::1;30545:9;:24;30563:4;30545:24;;;;;;;;;;;;;;;;30525:44;;30599:21;30637:1;30623:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30599:40;;30668:4;30650;30655:1;30650:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;30694:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30684:4;30689:1;30684:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;30718:6;;;;;;;;;;;:57;;;30790:12;30817:1;30833:4;30860;30880:15;30718:188;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31156:18;31177:21;31156:42;;31209:20;31245:9;;31232:10;:22;;;;:::i;:::-;31209:45;;31265:26;31307:12;31294:10;:25;;;;:::i;:::-;31265:54;;31330:15;;;;;;;;;;;:20;;31358:18;31330:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31392:11;;;;;;;;;;;:16;;31416:12;31392:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30130:1311;;;;;24880:5:::0;24854:23;;:31;;;;;;;;;;;;;;;;;;30079:1362::o;29226:773::-;29339:4;29368:7;:5;:7::i;:::-;29360:15;;:4;:15;;;:32;;;;29385:7;:5;:7::i;:::-;29379:13;;:2;:13;;;29360:32;:57;;;;29412:4;29396:21;;:4;:21;;;29360:57;29356:636;;;29577:1;29570:8;;;;29356:636;29616:4;;;;;;;;;;;29600:21;;:4;:21;;;29596:396;;29719:6;29706:9;;29697:6;:18;;;;:::i;:::-;29696:29;;;;:::i;:::-;29689:36;;;;29596:396;29761:4;;;;;;;;;;;29747:19;;:2;:19;;;29743:249;;29868:6;29854:10;;29845:6;:19;;;;:::i;:::-;29844:30;;;;:::i;:::-;29837:37;;;;29743:249;29979:1;29972:8;;29226:773;;;;;;:::o;782:98::-;835:7;862:10;855:17;;782:98;:::o;12213:505::-;12278:7;12379:143;12561:4;12545:22;;;;;;:::i;:::-;;;;;;;;12590:14;12627:13;12671:4;12346:349;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12318:392;;;;;;12298:412;;12213:505;:::o;13261:338::-;13353:6;13334:9;:15;13344:4;13334:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;13522:6;13507:11;;:21;;;;;;;;;;;13580:1;13557:34;;13566:4;13557:34;;;13584:6;13557:34;;;;;;:::i;:::-;;;;;;;;13261:338;;:::o;3402:191::-;3476:16;3495:6;;;;;;;;;;;3476:25;;3521:8;3512:6;;:17;;;;;;;;;;;;;;;;;;3576:8;3545:40;;3566:8;3545:40;;;;;;;;;;;;3465:128;3402:191;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:329::-;4912:6;4961:2;4949:9;4940:7;4936:23;4932:32;4929:119;;;4967:79;;:::i;:::-;4929:119;5087:1;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5058:117;4853:329;;;;:::o;5188:77::-;5225:7;5254:5;5243:16;;5188:77;;;:::o;5271:118::-;5358:24;5376:5;5358:24;:::i;:::-;5353:3;5346:37;5271:118;;:::o;5395:222::-;5488:4;5526:2;5515:9;5511:18;5503:26;;5539:71;5607:1;5596:9;5592:17;5583:6;5539:71;:::i;:::-;5395:222;;;;:::o;5623:329::-;5682:6;5731:2;5719:9;5710:7;5706:23;5702:32;5699:119;;;5737:79;;:::i;:::-;5699:119;5857:1;5882:53;5927:7;5918:6;5907:9;5903:22;5882:53;:::i;:::-;5872:63;;5828:117;5623:329;;;;:::o;5958:93::-;5994:7;6034:10;6027:5;6023:22;6012:33;;5958:93;;;:::o;6057:120::-;6129:23;6146:5;6129:23;:::i;:::-;6122:5;6119:34;6109:62;;6167:1;6164;6157:12;6109:62;6057:120;:::o;6183:137::-;6228:5;6266:6;6253:20;6244:29;;6282:32;6308:5;6282:32;:::i;:::-;6183:137;;;;:::o;6326:472::-;6393:6;6401;6450:2;6438:9;6429:7;6425:23;6421:32;6418:119;;;6456:79;;:::i;:::-;6418:119;6576:1;6601:52;6645:7;6636:6;6625:9;6621:22;6601:52;:::i;:::-;6591:62;;6547:116;6702:2;6728:53;6773:7;6764:6;6753:9;6749:22;6728:53;:::i;:::-;6718:63;;6673:118;6326:472;;;;;:::o;6804:118::-;6891:24;6909:5;6891:24;:::i;:::-;6886:3;6879:37;6804:118;;:::o;6928:222::-;7021:4;7059:2;7048:9;7044:18;7036:26;;7072:71;7140:1;7129:9;7125:17;7116:6;7072:71;:::i;:::-;6928:222;;;;:::o;7156:474::-;7224:6;7232;7281:2;7269:9;7260:7;7256:23;7252:32;7249:119;;;7287:79;;:::i;:::-;7249:119;7407:1;7432:53;7477:7;7468:6;7457:9;7453:22;7432:53;:::i;:::-;7422:63;;7378:117;7534:2;7560:53;7605:7;7596:6;7585:9;7581:22;7560:53;:::i;:::-;7550:63;;7505:118;7156:474;;;;;:::o;7636:::-;7704:6;7712;7761:2;7749:9;7740:7;7736:23;7732:32;7729:119;;;7767:79;;:::i;:::-;7729:119;7887:1;7912:53;7957:7;7948:6;7937:9;7933:22;7912:53;:::i;:::-;7902:63;;7858:117;8014:2;8040:53;8085:7;8076:6;8065:9;8061:22;8040:53;:::i;:::-;8030:63;;7985:118;7636:474;;;;;:::o;8116:60::-;8144:3;8165:5;8158:12;;8116:60;;;:::o;8182:142::-;8232:9;8265:53;8283:34;8292:24;8310:5;8292:24;:::i;:::-;8283:34;:::i;:::-;8265:53;:::i;:::-;8252:66;;8182:142;;;:::o;8330:126::-;8380:9;8413:37;8444:5;8413:37;:::i;:::-;8400:50;;8330:126;;;:::o;8462:148::-;8534:9;8567:37;8598:5;8567:37;:::i;:::-;8554:50;;8462:148;;;:::o;8616:175::-;8725:59;8778:5;8725:59;:::i;:::-;8720:3;8713:72;8616:175;;:::o;8797:266::-;8912:4;8950:2;8939:9;8935:18;8927:26;;8963:93;9053:1;9042:9;9038:17;9029:6;8963:93;:::i;:::-;8797:266;;;;:::o;9069:151::-;9144:9;9177:37;9208:5;9177:37;:::i;:::-;9164:50;;9069:151;;;:::o;9226:181::-;9338:62;9394:5;9338:62;:::i;:::-;9333:3;9326:75;9226:181;;:::o;9413:272::-;9531:4;9569:2;9558:9;9554:18;9546:26;;9582:96;9675:1;9664:9;9660:17;9651:6;9582:96;:::i;:::-;9413:272;;;;:::o;9691:118::-;9762:22;9778:5;9762:22;:::i;:::-;9755:5;9752:33;9742:61;;9799:1;9796;9789:12;9742:61;9691:118;:::o;9815:135::-;9859:5;9897:6;9884:20;9875:29;;9913:31;9938:5;9913:31;:::i;:::-;9815:135;;;;:::o;9956:122::-;10029:24;10047:5;10029:24;:::i;:::-;10022:5;10019:35;10009:63;;10068:1;10065;10058:12;10009:63;9956:122;:::o;10084:139::-;10130:5;10168:6;10155:20;10146:29;;10184:33;10211:5;10184:33;:::i;:::-;10084:139;;;;:::o;10229:1199::-;10340:6;10348;10356;10364;10372;10380;10388;10437:3;10425:9;10416:7;10412:23;10408:33;10405:120;;;10444:79;;:::i;:::-;10405:120;10564:1;10589:53;10634:7;10625:6;10614:9;10610:22;10589:53;:::i;:::-;10579:63;;10535:117;10691:2;10717:53;10762:7;10753:6;10742:9;10738:22;10717:53;:::i;:::-;10707:63;;10662:118;10819:2;10845:53;10890:7;10881:6;10870:9;10866:22;10845:53;:::i;:::-;10835:63;;10790:118;10947:2;10973:53;11018:7;11009:6;10998:9;10994:22;10973:53;:::i;:::-;10963:63;;10918:118;11075:3;11102:51;11145:7;11136:6;11125:9;11121:22;11102:51;:::i;:::-;11092:61;;11046:117;11202:3;11229:53;11274:7;11265:6;11254:9;11250:22;11229:53;:::i;:::-;11219:63;;11173:119;11331:3;11358:53;11403:7;11394:6;11383:9;11379:22;11358:53;:::i;:::-;11348:63;;11302:119;10229:1199;;;;;;;;;;:::o;11434:116::-;11504:21;11519:5;11504:21;:::i;:::-;11497:5;11494:32;11484:60;;11540:1;11537;11530:12;11484:60;11434:116;:::o;11556:133::-;11599:5;11637:6;11624:20;11615:29;;11653:30;11677:5;11653:30;:::i;:::-;11556:133;;;;:::o;11695:468::-;11760:6;11768;11817:2;11805:9;11796:7;11792:23;11788:32;11785:119;;;11823:79;;:::i;:::-;11785:119;11943:1;11968:53;12013:7;12004:6;11993:9;11989:22;11968:53;:::i;:::-;11958:63;;11914:117;12070:2;12096:50;12138:7;12129:6;12118:9;12114:22;12096:50;:::i;:::-;12086:60;;12041:115;11695:468;;;;;:::o;12169:327::-;12227:6;12276:2;12264:9;12255:7;12251:23;12247:32;12244:119;;;12282:79;;:::i;:::-;12244:119;12402:1;12427:52;12471:7;12462:6;12451:9;12447:22;12427:52;:::i;:::-;12417:62;;12373:116;12169:327;;;;:::o;12502:153::-;12579:9;12612:37;12643:5;12612:37;:::i;:::-;12599:50;;12502:153;;;:::o;12661:185::-;12775:64;12833:5;12775:64;:::i;:::-;12770:3;12763:77;12661:185;;:::o;12852:276::-;12972:4;13010:2;12999:9;12995:18;12987:26;;13023:98;13118:1;13107:9;13103:17;13094:6;13023:98;:::i;:::-;12852:276;;;;:::o;13134:180::-;13182:77;13179:1;13172:88;13279:4;13276:1;13269:15;13303:4;13300:1;13293:15;13320:320;13364:6;13401:1;13395:4;13391:12;13381:22;;13448:1;13442:4;13438:12;13469:18;13459:81;;13525:4;13517:6;13513:17;13503:27;;13459:81;13587:2;13579:6;13576:14;13556:18;13553:38;13550:84;;13606:18;;:::i;:::-;13550:84;13371:269;13320:320;;;:::o;13646:166::-;13786:18;13782:1;13774:6;13770:14;13763:42;13646:166;:::o;13818:366::-;13960:3;13981:67;14045:2;14040:3;13981:67;:::i;:::-;13974:74;;14057:93;14146:3;14057:93;:::i;:::-;14175:2;14170:3;14166:12;14159:19;;13818:366;;;:::o;14190:419::-;14356:4;14394:2;14383:9;14379:18;14371:26;;14443:9;14437:4;14433:20;14429:1;14418:9;14414:17;14407:47;14471:131;14597:4;14471:131;:::i;:::-;14463:139;;14190:419;;;:::o;14615:162::-;14755:14;14751:1;14743:6;14739:14;14732:38;14615:162;:::o;14783:366::-;14925:3;14946:67;15010:2;15005:3;14946:67;:::i;:::-;14939:74;;15022:93;15111:3;15022:93;:::i;:::-;15140:2;15135:3;15131:12;15124:19;;14783:366;;;:::o;15155:419::-;15321:4;15359:2;15348:9;15344:18;15336:26;;15408:9;15402:4;15398:20;15394:1;15383:9;15379:17;15372:47;15436:131;15562:4;15436:131;:::i;:::-;15428:139;;15155:419;;;:::o;15580:85::-;15625:7;15654:5;15643:16;;15580:85;;;:::o;15671:158::-;15729:9;15762:61;15780:42;15789:32;15815:5;15789:32;:::i;:::-;15780:42;:::i;:::-;15762:61;:::i;:::-;15749:74;;15671:158;;;:::o;15835:147::-;15930:45;15969:5;15930:45;:::i;:::-;15925:3;15918:58;15835:147;;:::o;15988:807::-;16237:4;16275:3;16264:9;16260:19;16252:27;;16289:71;16357:1;16346:9;16342:17;16333:6;16289:71;:::i;:::-;16370:72;16438:2;16427:9;16423:18;16414:6;16370:72;:::i;:::-;16452:80;16528:2;16517:9;16513:18;16504:6;16452:80;:::i;:::-;16542;16618:2;16607:9;16603:18;16594:6;16542:80;:::i;:::-;16632:73;16700:3;16689:9;16685:19;16676:6;16632:73;:::i;:::-;16715;16783:3;16772:9;16768:19;16759:6;16715:73;:::i;:::-;15988:807;;;;;;;;;:::o;16801:143::-;16858:5;16889:6;16883:13;16874:22;;16905:33;16932:5;16905:33;:::i;:::-;16801:143;;;;:::o;16950:663::-;17038:6;17046;17054;17103:2;17091:9;17082:7;17078:23;17074:32;17071:119;;;17109:79;;:::i;:::-;17071:119;17229:1;17254:64;17310:7;17301:6;17290:9;17286:22;17254:64;:::i;:::-;17244:74;;17200:128;17367:2;17393:64;17449:7;17440:6;17429:9;17425:22;17393:64;:::i;:::-;17383:74;;17338:129;17506:2;17532:64;17588:7;17579:6;17568:9;17564:22;17532:64;:::i;:::-;17522:74;;17477:129;16950:663;;;;;:::o;17619:143::-;17676:5;17707:6;17701:13;17692:22;;17723:33;17750:5;17723:33;:::i;:::-;17619:143;;;;:::o;17768:351::-;17838:6;17887:2;17875:9;17866:7;17862:23;17858:32;17855:119;;;17893:79;;:::i;:::-;17855:119;18013:1;18038:64;18094:7;18085:6;18074:9;18070:22;18038:64;:::i;:::-;18028:74;;17984:128;17768:351;;;;:::o;18125:332::-;18246:4;18284:2;18273:9;18269:18;18261:26;;18297:71;18365:1;18354:9;18350:17;18341:6;18297:71;:::i;:::-;18378:72;18446:2;18435:9;18431:18;18422:6;18378:72;:::i;:::-;18125:332;;;;;:::o;18463:170::-;18603:22;18599:1;18591:6;18587:14;18580:46;18463:170;:::o;18639:366::-;18781:3;18802:67;18866:2;18861:3;18802:67;:::i;:::-;18795:74;;18878:93;18967:3;18878:93;:::i;:::-;18996:2;18991:3;18987:12;18980:19;;18639:366;;;:::o;19011:419::-;19177:4;19215:2;19204:9;19200:18;19192:26;;19264:9;19258:4;19254:20;19250:1;19239:9;19235:17;19228:47;19292:131;19418:4;19292:131;:::i;:::-;19284:139;;19011:419;;;:::o;19436:180::-;19484:77;19481:1;19474:88;19581:4;19578:1;19571:15;19605:4;19602:1;19595:15;19622:410;19662:7;19685:20;19703:1;19685:20;:::i;:::-;19680:25;;19719:20;19737:1;19719:20;:::i;:::-;19714:25;;19774:1;19771;19767:9;19796:30;19814:11;19796:30;:::i;:::-;19785:41;;19975:1;19966:7;19962:15;19959:1;19956:22;19936:1;19929:9;19909:83;19886:139;;20005:18;;:::i;:::-;19886:139;19670:362;19622:410;;;;:::o;20038:180::-;20086:77;20083:1;20076:88;20183:4;20180:1;20173:15;20207:4;20204:1;20197:15;20224:185;20264:1;20281:20;20299:1;20281:20;:::i;:::-;20276:25;;20315:20;20333:1;20315:20;:::i;:::-;20310:25;;20354:1;20344:35;;20359:18;;:::i;:::-;20344:35;20401:1;20398;20394:9;20389:14;;20224:185;;;;:::o;20415:191::-;20455:3;20474:20;20492:1;20474:20;:::i;:::-;20469:25;;20508:20;20526:1;20508:20;:::i;:::-;20503:25;;20551:1;20548;20544:9;20537:16;;20572:3;20569:1;20566:10;20563:36;;;20579:18;;:::i;:::-;20563:36;20415:191;;;;:::o;20612:220::-;20752:34;20748:1;20740:6;20736:14;20729:58;20821:3;20816:2;20808:6;20804:15;20797:28;20612:220;:::o;20838:366::-;20980:3;21001:67;21065:2;21060:3;21001:67;:::i;:::-;20994:74;;21077:93;21166:3;21077:93;:::i;:::-;21195:2;21190:3;21186:12;21179:19;;20838:366;;;:::o;21210:419::-;21376:4;21414:2;21403:9;21399:18;21391:26;;21463:9;21457:4;21453:20;21449:1;21438:9;21434:17;21427:47;21491:131;21617:4;21491:131;:::i;:::-;21483:139;;21210:419;;;:::o;21635:194::-;21675:4;21695:20;21713:1;21695:20;:::i;:::-;21690:25;;21729:20;21747:1;21729:20;:::i;:::-;21724:25;;21773:1;21770;21766:9;21758:17;;21797:1;21791:4;21788:11;21785:37;;;21802:18;;:::i;:::-;21785:37;21635:194;;;;:::o;21835:177::-;21975:29;21971:1;21963:6;21959:14;21952:53;21835:177;:::o;22018:366::-;22160:3;22181:67;22245:2;22240:3;22181:67;:::i;:::-;22174:74;;22257:93;22346:3;22257:93;:::i;:::-;22375:2;22370:3;22366:12;22359:19;;22018:366;;;:::o;22390:419::-;22556:4;22594:2;22583:9;22579:18;22571:26;;22643:9;22637:4;22633:20;22629:1;22618:9;22614:17;22607:47;22671:131;22797:4;22671:131;:::i;:::-;22663:139;;22390:419;;;:::o;22815:221::-;22955:34;22951:1;22943:6;22939:14;22932:58;23024:4;23019:2;23011:6;23007:15;23000:29;22815:221;:::o;23042:366::-;23184:3;23205:67;23269:2;23264:3;23205:67;:::i;:::-;23198:74;;23281:93;23370:3;23281:93;:::i;:::-;23399:2;23394:3;23390:12;23383:19;;23042:366;;;:::o;23414:419::-;23580:4;23618:2;23607:9;23603:18;23595:26;;23667:9;23661:4;23657:20;23653:1;23642:9;23638:17;23631:47;23695:131;23821:4;23695:131;:::i;:::-;23687:139;;23414:419;;;:::o;23839:147::-;23940:11;23977:3;23962:18;;23839:147;;;;:::o;23992:114::-;;:::o;24112:398::-;24271:3;24292:83;24373:1;24368:3;24292:83;:::i;:::-;24285:90;;24384:93;24473:3;24384:93;:::i;:::-;24502:1;24497:3;24493:11;24486:18;;24112:398;;;:::o;24516:379::-;24700:3;24722:147;24865:3;24722:147;:::i;:::-;24715:154;;24886:3;24879:10;;24516:379;;;:::o;24901:178::-;25041:30;25037:1;25029:6;25025:14;25018:54;24901:178;:::o;25085:366::-;25227:3;25248:67;25312:2;25307:3;25248:67;:::i;:::-;25241:74;;25324:93;25413:3;25324:93;:::i;:::-;25442:2;25437:3;25433:12;25426:19;;25085:366;;;:::o;25457:419::-;25623:4;25661:2;25650:9;25646:18;25638:26;;25710:9;25704:4;25700:20;25696:1;25685:9;25681:17;25674:47;25738:131;25864:4;25738:131;:::i;:::-;25730:139;;25457:419;;;:::o;25882:351::-;25952:6;26001:2;25989:9;25980:7;25976:23;25972:32;25969:119;;;26007:79;;:::i;:::-;25969:119;26127:1;26152:64;26208:7;26199:6;26188:9;26184:22;26152:64;:::i;:::-;26142:74;;26098:128;25882:351;;;;:::o;26239:332::-;26360:4;26398:2;26387:9;26383:18;26375:26;;26411:71;26479:1;26468:9;26464:17;26455:6;26411:71;:::i;:::-;26492:72;26560:2;26549:9;26545:18;26536:6;26492:72;:::i;:::-;26239:332;;;;;:::o;26577:137::-;26631:5;26662:6;26656:13;26647:22;;26678:30;26702:5;26678:30;:::i;:::-;26577:137;;;;:::o;26720:345::-;26787:6;26836:2;26824:9;26815:7;26811:23;26807:32;26804:119;;;26842:79;;:::i;:::-;26804:119;26962:1;26987:61;27040:7;27031:6;27020:9;27016:22;26987:61;:::i;:::-;26977:71;;26933:125;26720:345;;;;:::o;27071:173::-;27211:25;27207:1;27199:6;27195:14;27188:49;27071:173;:::o;27250:366::-;27392:3;27413:67;27477:2;27472:3;27413:67;:::i;:::-;27406:74;;27489:93;27578:3;27489:93;:::i;:::-;27607:2;27602:3;27598:12;27591:19;;27250:366;;;:::o;27622:419::-;27788:4;27826:2;27815:9;27811:18;27803:26;;27875:9;27869:4;27865:20;27861:1;27850:9;27846:17;27839:47;27903:131;28029:4;27903:131;:::i;:::-;27895:139;;27622:419;;;:::o;28047:775::-;28280:4;28318:3;28307:9;28303:19;28295:27;;28332:71;28400:1;28389:9;28385:17;28376:6;28332:71;:::i;:::-;28413:72;28481:2;28470:9;28466:18;28457:6;28413:72;:::i;:::-;28495;28563:2;28552:9;28548:18;28539:6;28495:72;:::i;:::-;28577;28645:2;28634:9;28630:18;28621:6;28577:72;:::i;:::-;28659:73;28727:3;28716:9;28712:19;28703:6;28659:73;:::i;:::-;28742;28810:3;28799:9;28795:19;28786:6;28742:73;:::i;:::-;28047:775;;;;;;;;;:::o;28828:148::-;28930:11;28967:3;28952:18;;28828:148;;;;:::o;28982:214::-;29122:66;29118:1;29110:6;29106:14;29099:90;28982:214;:::o;29202:400::-;29362:3;29383:84;29465:1;29460:3;29383:84;:::i;:::-;29376:91;;29476:93;29565:3;29476:93;:::i;:::-;29594:1;29589:3;29585:11;29578:18;;29202:400;;;:::o;29608:79::-;29647:7;29676:5;29665:16;;29608:79;;;:::o;29693:157::-;29798:45;29818:24;29836:5;29818:24;:::i;:::-;29798:45;:::i;:::-;29793:3;29786:58;29693:157;;:::o;29856:663::-;30097:3;30119:148;30263:3;30119:148;:::i;:::-;30112:155;;30277:75;30348:3;30339:6;30277:75;:::i;:::-;30377:2;30372:3;30368:12;30361:19;;30390:75;30461:3;30452:6;30390:75;:::i;:::-;30490:2;30485:3;30481:12;30474:19;;30510:3;30503:10;;29856:663;;;;;:::o;30525:545::-;30698:4;30736:3;30725:9;30721:19;30713:27;;30750:71;30818:1;30807:9;30803:17;30794:6;30750:71;:::i;:::-;30831:68;30895:2;30884:9;30880:18;30871:6;30831:68;:::i;:::-;30909:72;30977:2;30966:9;30962:18;30953:6;30909:72;:::i;:::-;30991;31059:2;31048:9;31044:18;31035:6;30991:72;:::i;:::-;30525:545;;;;;;;:::o;31076:164::-;31216:16;31212:1;31204:6;31200:14;31193:40;31076:164;:::o;31246:366::-;31388:3;31409:67;31473:2;31468:3;31409:67;:::i;:::-;31402:74;;31485:93;31574:3;31485:93;:::i;:::-;31603:2;31598:3;31594:12;31587:19;;31246:366;;;:::o;31618:419::-;31784:4;31822:2;31811:9;31807:18;31799:26;;31871:9;31865:4;31861:20;31857:1;31846:9;31842:17;31835:47;31899:131;32025:4;31899:131;:::i;:::-;31891:139;;31618:419;;;:::o;32043:225::-;32183:34;32179:1;32171:6;32167:14;32160:58;32252:8;32247:2;32239:6;32235:15;32228:33;32043:225;:::o;32274:366::-;32416:3;32437:67;32501:2;32496:3;32437:67;:::i;:::-;32430:74;;32513:93;32602:3;32513:93;:::i;:::-;32631:2;32626:3;32622:12;32615:19;;32274:366;;;:::o;32646:419::-;32812:4;32850:2;32839:9;32835:18;32827:26;;32899:9;32893:4;32889:20;32885:1;32874:9;32870:17;32863:47;32927:131;33053:4;32927:131;:::i;:::-;32919:139;;32646:419;;;:::o;33071:225::-;33211:34;33207:1;33199:6;33195:14;33188:58;33280:8;33275:2;33267:6;33263:15;33256:33;33071:225;:::o;33302:366::-;33444:3;33465:67;33529:2;33524:3;33465:67;:::i;:::-;33458:74;;33541:93;33630:3;33541:93;:::i;:::-;33659:2;33654:3;33650:12;33643:19;;33302:366;;;:::o;33674:419::-;33840:4;33878:2;33867:9;33863:18;33855:26;;33927:9;33921:4;33917:20;33913:1;33902:9;33898:17;33891:47;33955:131;34081:4;33955:131;:::i;:::-;33947:139;;33674:419;;;:::o;34099:182::-;34239:34;34235:1;34227:6;34223:14;34216:58;34099:182;:::o;34287:366::-;34429:3;34450:67;34514:2;34509:3;34450:67;:::i;:::-;34443:74;;34526:93;34615:3;34526:93;:::i;:::-;34644:2;34639:3;34635:12;34628:19;;34287:366;;;:::o;34659:419::-;34825:4;34863:2;34852:9;34848:18;34840:26;;34912:9;34906:4;34902:20;34898:1;34887:9;34883:17;34876:47;34940:131;35066:4;34940:131;:::i;:::-;34932:139;;34659:419;;;:::o;35084:180::-;35132:77;35129:1;35122:88;35229:4;35226:1;35219:15;35253:4;35250:1;35243:15;35270:180;35318:77;35315:1;35308:88;35415:4;35412:1;35405:15;35439:4;35436:1;35429:15;35456:114;35523:6;35557:5;35551:12;35541:22;;35456:114;;;:::o;35576:184::-;35675:11;35709:6;35704:3;35697:19;35749:4;35744:3;35740:14;35725:29;;35576:184;;;;:::o;35766:132::-;35833:4;35856:3;35848:11;;35886:4;35881:3;35877:14;35869:22;;35766:132;;;:::o;35904:108::-;35981:24;35999:5;35981:24;:::i;:::-;35976:3;35969:37;35904:108;;:::o;36018:179::-;36087:10;36108:46;36150:3;36142:6;36108:46;:::i;:::-;36186:4;36181:3;36177:14;36163:28;;36018:179;;;;:::o;36203:113::-;36273:4;36305;36300:3;36296:14;36288:22;;36203:113;;;:::o;36352:732::-;36471:3;36500:54;36548:5;36500:54;:::i;:::-;36570:86;36649:6;36644:3;36570:86;:::i;:::-;36563:93;;36680:56;36730:5;36680:56;:::i;:::-;36759:7;36790:1;36775:284;36800:6;36797:1;36794:13;36775:284;;;36876:6;36870:13;36903:63;36962:3;36947:13;36903:63;:::i;:::-;36896:70;;36989:60;37042:6;36989:60;:::i;:::-;36979:70;;36835:224;36822:1;36819;36815:9;36810:14;;36775:284;;;36779:14;37075:3;37068:10;;36476:608;;;36352:732;;;;:::o;37090:831::-;37353:4;37391:3;37380:9;37376:19;37368:27;;37405:71;37473:1;37462:9;37458:17;37449:6;37405:71;:::i;:::-;37486:80;37562:2;37551:9;37547:18;37538:6;37486:80;:::i;:::-;37613:9;37607:4;37603:20;37598:2;37587:9;37583:18;37576:48;37641:108;37744:4;37735:6;37641:108;:::i;:::-;37633:116;;37759:72;37827:2;37816:9;37812:18;37803:6;37759:72;:::i;:::-;37841:73;37909:3;37898:9;37894:19;37885:6;37841:73;:::i;:::-;37090:831;;;;;;;;:::o;37927:144::-;37979:4;38002:3;37994:11;;38025:3;38022:1;38015:14;38059:4;38056:1;38046:18;38038:26;;37927:144;;;:::o;38099:878::-;38204:3;38241:5;38235:12;38270:36;38296:9;38270:36;:::i;:::-;38322:88;38403:6;38398:3;38322:88;:::i;:::-;38315:95;;38441:1;38430:9;38426:17;38457:1;38452:166;;;;38632:1;38627:344;;;;38419:552;;38452:166;38536:4;38532:9;38521;38517:25;38512:3;38505:38;38598:6;38591:14;38584:22;38576:6;38572:35;38567:3;38563:45;38556:52;;38452:166;;38627:344;38694:41;38729:5;38694:41;:::i;:::-;38757:1;38771:154;38785:6;38782:1;38779:13;38771:154;;;38859:7;38853:14;38849:1;38844:3;38840:11;38833:35;38909:1;38900:7;38896:15;38885:26;;38807:4;38804:1;38800:12;38795:17;;38771:154;;;38954:6;38949:3;38945:16;38938:23;;38634:337;;38419:552;;38208:769;;38099:878;;;;:::o;38983:273::-;39114:3;39136:94;39226:3;39217:6;39136:94;:::i;:::-;39129:101;;39247:3;39240:10;;38983:273;;;;:::o;39262:664::-;39467:4;39505:3;39494:9;39490:19;39482:27;;39519:71;39587:1;39576:9;39572:17;39563:6;39519:71;:::i;:::-;39600:72;39668:2;39657:9;39653:18;39644:6;39600:72;:::i;:::-;39682;39750:2;39739:9;39735:18;39726:6;39682:72;:::i;:::-;39764;39832:2;39821:9;39817:18;39808:6;39764:72;:::i;:::-;39846:73;39914:3;39903:9;39899:19;39890:6;39846:73;:::i;:::-;39262:664;;;;;;;;:::o

Swarm Source

ipfs://6f888d78f7b6501cfeb06e48fb75d3a5b8871ba4e8dec6d60c517c111313a93a
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.