Contract 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81

Contract Overview

Balance:
0.000075600000000003 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc970bc6783c19db473cad235cde01d8c07c7ccc5049d2acda8643edee6a90f9fBurn Funds78000832021-04-08 14:00:21167 days 12 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00023015
0x297e655ec82fb75944fa2015fe6db25e18e4f91c304e4e7b09b49b5d7efb3fdeBurn Fund By Pla...78000702021-04-08 13:59:42167 days 12 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00247504
0x6cf2e18df41a67193e4c007263a3d8a91239142938a87a860dbedbf4a4f031dcBurn Fund By Pla...78000352021-04-08 13:57:57167 days 12 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00069366
0x70a085993cdcecdbb2d27637124bb64919454cec254dbe44731370a06bfb0ffcWithdraw77926532021-04-08 7:48:51167 days 18 hrs ago0x12addaf3ae8b9168b3e3eb910cc45feb89e38609 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00160853
0xea141dad832ac6b987a252d6a9fce3d378eb987e22966ded2a964b91af7cd9ceBuy Xid XBN77924422021-04-08 7:38:18167 days 19 hrs ago0x12addaf3ae8b9168b3e3eb910cc45feb89e38609 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d8110 BNB0.00184435
0x126c2c1a01f081a40452f22da44c52e381c60a97a57a57deeea418890a70d724Buy Xid XBN77924222021-04-08 7:37:18167 days 19 hrs ago0xb39407f22dc0fe082cfb3efa6ad822b1a8269785 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810.0001 BNB0.00169435
0xdea1b3ac33abfb0d972feef3ecf036d8af3c16adf6a23126c5c1329a0a3cea6cBuy Xid XBN77924062021-04-08 7:36:30167 days 19 hrs ago0xb39407f22dc0fe082cfb3efa6ad822b1a8269785 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810.0001 BNB0.00184435
0x851a4d6ee14d5efdde177afc69169c9cc7bb357585674401a387c28e74b1b55bBurn Funds77923592021-04-08 7:34:09167 days 19 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00141905
0x74a0f19efc77219716c7a80326e6ae8c3fb8811081eb89eef91146ff876fdf6aBurn Funds77923492021-04-08 7:33:39167 days 19 hrs ago0xb39407f22dc0fe082cfb3efa6ad822b1a8269785 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00022467
0x601847726e61730df8208102da47ac717bc6f5bbdedf11becccab9bc05987d29Withdraw77913832021-04-08 6:45:21167 days 20 hrs ago0xb39407f22dc0fe082cfb3efa6ad822b1a8269785 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00179881
0xf9f5f49543e296398bf413d31f552d67a84d609246547e1472c3520fb9099348Withdraw77913172021-04-08 6:42:03167 days 20 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00056601
0x2fd0658242f62569ffac52777848075c4e9a3b84525814af3833f7e76d135d68Withdraw77891112021-04-08 4:51:45167 days 21 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00193938
0x056a3960598a16b21ae4103de5089d96b3ed6cfe525a7c1d06291a72bb5abf9fBuy Xid XBN77889672021-04-08 4:44:33167 days 22 hrs ago0xb39407f22dc0fe082cfb3efa6ad822b1a8269785 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810.0001 BNB0.00344241
0x5e23d80e73b556f00df4f274fb3b38ebde36b8ef311bbef08889171140af6484Buy Xid XBN77889102021-04-08 4:41:42167 days 22 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810.0001 BNB0.00414933
0x89082bec37d02c0a5e7032c229dffd9a84be4259cc0f4fec7971d69f3caf6afbActivate77887672021-04-08 4:34:33167 days 22 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810 BNB0.00282084
0xfbf8f21b7f0c0c7acc92a671deb3a380dee545d9d2dd6dd3c7d8b313abdfbcd80x6080604077886962021-04-08 4:31:00167 days 22 hrs ago0x9d1ed5ec71f39d8d64bcb34ec039813426f94c10 IN  Contract Creation0 BNB0.1031683
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x297e655ec82fb75944fa2015fe6db25e18e4f91c304e4e7b09b49b5d7efb3fde78000702021-04-08 13:59:42167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10.000162 BNB
0x297e655ec82fb75944fa2015fe6db25e18e4f91c304e4e7b09b49b5d7efb3fde78000702021-04-08 13:59:42167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x297e655ec82fb75944fa2015fe6db25e18e4f91c304e4e7b09b49b5d7efb3fde78000702021-04-08 13:59:42167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xebb6301820199de2f9463a1e06fa894c054d70010 BNB
0x297e655ec82fb75944fa2015fe6db25e18e4f91c304e4e7b09b49b5d7efb3fde78000702021-04-08 13:59:42167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10.000018 BNB
0x297e655ec82fb75944fa2015fe6db25e18e4f91c304e4e7b09b49b5d7efb3fde78000702021-04-08 13:59:42167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x297e655ec82fb75944fa2015fe6db25e18e4f91c304e4e7b09b49b5d7efb3fde78000702021-04-08 13:59:42167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xebb6301820199de2f9463a1e06fa894c054d70010 BNB
0x6cf2e18df41a67193e4c007263a3d8a91239142938a87a860dbedbf4a4f031dc78000352021-04-08 13:57:57167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x6cf2e18df41a67193e4c007263a3d8a91239142938a87a860dbedbf4a4f031dc78000352021-04-08 13:57:57167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x6cf2e18df41a67193e4c007263a3d8a91239142938a87a860dbedbf4a4f031dc78000352021-04-08 13:57:57167 days 12 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xebb6301820199de2f9463a1e06fa894c054d70010 BNB
0x70a085993cdcecdbb2d27637124bb64919454cec254dbe44731370a06bfb0ffc77926532021-04-08 7:48:51167 days 18 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d810x12addaf3ae8b9168b3e3eb910cc45feb89e386098.1 BNB
0x70a085993cdcecdbb2d27637124bb64919454cec254dbe44731370a06bfb0ffc77926532021-04-08 7:48:51167 days 18 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10.9 BNB
0x70a085993cdcecdbb2d27637124bb64919454cec254dbe44731370a06bfb0ffc77926532021-04-08 7:48:51167 days 18 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x70a085993cdcecdbb2d27637124bb64919454cec254dbe44731370a06bfb0ffc77926532021-04-08 7:48:51167 days 18 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xebb6301820199de2f9463a1e06fa894c054d70010 BNB
0xea141dad832ac6b987a252d6a9fce3d378eb987e22966ded2a964b91af7cd9ce77924422021-04-08 7:38:18167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d11 BNB
0xea141dad832ac6b987a252d6a9fce3d378eb987e22966ded2a964b91af7cd9ce77924422021-04-08 7:38:18167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0xea141dad832ac6b987a252d6a9fce3d378eb987e22966ded2a964b91af7cd9ce77924422021-04-08 7:38:18167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xebb6301820199de2f9463a1e06fa894c054d70010 BNB
0x126c2c1a01f081a40452f22da44c52e381c60a97a57a57deeea418890a70d72477924222021-04-08 7:37:18167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10.00001 BNB
0x126c2c1a01f081a40452f22da44c52e381c60a97a57a57deeea418890a70d72477924222021-04-08 7:37:18167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x126c2c1a01f081a40452f22da44c52e381c60a97a57a57deeea418890a70d72477924222021-04-08 7:37:18167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xebb6301820199de2f9463a1e06fa894c054d70010 BNB
0xdea1b3ac33abfb0d972feef3ecf036d8af3c16adf6a23126c5c1329a0a3cea6c77924062021-04-08 7:36:30167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10.00001 BNB
0xdea1b3ac33abfb0d972feef3ecf036d8af3c16adf6a23126c5c1329a0a3cea6c77924062021-04-08 7:36:30167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0xdea1b3ac33abfb0d972feef3ecf036d8af3c16adf6a23126c5c1329a0a3cea6c77924062021-04-08 7:36:30167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xebb6301820199de2f9463a1e06fa894c054d70010 BNB
0x851a4d6ee14d5efdde177afc69169c9cc7bb357585674401a387c28e74b1b55b77923592021-04-08 7:34:09167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10.000009 BNB
0x851a4d6ee14d5efdde177afc69169c9cc7bb357585674401a387c28e74b1b55b77923592021-04-08 7:34:09167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x851a4d6ee14d5efdde177afc69169c9cc7bb357585674401a387c28e74b1b55b77923592021-04-08 7:34:09167 days 19 hrs ago 0xceebdc2f6ba2d23e8f6f0e8a5fa9dc0a7dbb1d81 0xebb6301820199de2f9463a1e06fa894c054d70010 BNB
[ Download CSV Export 
Loading
This contract contains unverified libraries: Utils

Contract Source Code Verified (Exact Match)

Contract Name:
FomoLotto

Compiler Version
v0.6.8+commit.0bbfe453

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-04-08
*/

// File: contracts/games/FomoLotto/library/SafeMath.sol

pragma solidity >=0.6.8;

/**
 * @title SafeMath v0.1.9
 * @dev Math operations with safety checks that throw on error
 * change notes:  original SafeMath library from OpenZeppelin modified by Inventor
 * - added sqrt
 * - added sq
 * - added pwr
 * - changed asserts to requires with error log outputs
 * - removed div, its useless
 */
library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b)
    internal
    pure
    returns (uint256 c)
    {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b, "SafeMath mul failed");
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b)
    internal
    pure
    returns (uint256)
    {
        require(b <= a, "SafeMath sub failed");
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b)
    internal
    pure
    returns (uint256 c)
    {
        c = a + b;
        require(c >= a, "SafeMath add failed");
        return c;
    }

    /**
     * @dev gives square root of given x.
     */
    function sqrt(uint256 x)
    internal
    pure
    returns (uint256 y)
    {
        uint256 z = ((add(x,1)) / 2);
        y = x;
        while (z < y)
        {
            y = z;
            z = ((add((x / z),z)) / 2);
        }
    }

    /**
     * @dev gives square. multiplies x by x
     */
    function sq(uint256 x)
    internal
    pure
    returns (uint256)
    {
        return (mul(x,x));
    }

    /**
     * @dev x to the power of y
     */
    function pwr(uint256 x, uint256 y)
    internal
    pure
    returns (uint256)
    {
        if (x==0)
            return (0);
        else if (y==0)
            return (1);
        else
        {
            uint256 z = x;
            for (uint256 i=1; i < y; i++)
                z = mul(z,x);
            return (z);
        }
    }
}

// File: contracts/games/FomoLotto/library/KeysCalcLong.sol

pragma solidity >=0.6.8;


library KeysCalcLong {
    using SafeMath for *;
    /**
     * @dev calculates number of keys received given X eth
     * @param _curEth current amount of eth in contract
     * @param _newEth eth being spent
     * @return amount of ticket purchased
     */
    function keysRec(uint256 _curEth, uint256 _newEth)
    internal
    pure
    returns (uint256)
    {
        return(keys((_curEth).add(_newEth)).sub(keys(_curEth)));
    }

    /**
     * @dev calculates amount of eth received if you sold X keys
     * @param _curKeys current amount of keys that exist
     * @param _sellKeys amount of keys you wish to sell
     * @return amount of eth received
     */
    function ethRec(uint256 _curKeys, uint256 _sellKeys)
    internal
    pure
    returns (uint256)
    {
        return((eth(_curKeys)).sub(eth(_curKeys.sub(_sellKeys))));
    }

    /**
     * @dev calculates how many keys would exist with given an amount of eth
     * @param _eth eth "in contract"
     * @return number of keys that would exist
     */
    function keys(uint256 _eth)
    internal
    pure
    returns(uint256)
    {
        return ((((((_eth).mul(1000000000000000000)).mul(312500000000000000000000000)).add(5624988281256103515625000000000000000000000000000000000000000000)).sqrt()).sub(74999921875000000000000000000000)) / (156250000);
    }

    /**
     * @dev calculates how much eth would be in contract given a number of keys
     * @param _keys number of keys "in contract"
     * @return eth that would exists
     */
    function eth(uint256 _keys)
    internal
    pure
    returns(uint256)
    {
        return ((78125000).mul(_keys.sq()).add(((149999843750000).mul(_keys.mul(1000000000000000000))) / (2))) / ((1000000000000000000).sq());
    }
}

// File: contracts/games/FomoLotto/library/Datasets.sol

pragma solidity >=0.6.8;

library Datasets {
    struct Player {
        uint256 win;    // winnings vault
        uint256 gen;    // general vault
        uint256 lrnd;   // last round played
        uint256 lastActivityDate;
        string lastActivityName;
    }

    struct PlayerRounds {
        uint256 eth;    // eth player has added to round (used for eth limiter)
        uint256 keys;   // keys
        uint256 mask;   // player mask
        uint256 ico;    // ICO phase investment
    }

    struct Round {
        address addr;   // address of player in lead
        uint256 end;    // time ends/ended
        bool ended;     // has round end function been ran
        uint256 strt;   // time round started
        uint256 keys;   // keys
        uint256 eth;    // total eth in
        uint256 pot;    // eth to pot (during round) / final amount paid to winner (after round ends)
        uint256 mask;   // global mask
    }
}

// File: contracts/games/FomoLotto/library/Utils.sol

pragma solidity >=0.6.8;


interface IERC20 {
    function withdraw(uint) external;

    function approve(address spender, uint256 amount) external returns (bool);

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

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

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

}

interface IPancakeRouter02 {
    function WETH() external pure returns (address);

    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 Util functions
/// @author hiddenmikasa
library Utils {
    using SafeMath for uint256;

    // The Ether token address is set as the constant 0x00 for backwards
    // compatibility
    address private constant DEFAULT_BNB_ADDR = address(0);

    /// @notice Approves a token transfer
    /// @param _assetId The address of the token to approve
    /// @param _spender The address of the spender to approve
    /// @param _amount The number of tokens to approve
    function approveTokenTransfer(
        address _assetId,
        address _spender,
        uint256 _amount
    )
    public
    {
        _validateContractAddress(_assetId);

        // Some tokens have an `approve` which returns a boolean and some do not.
        // The ERC20 interface cannot be used here because it requires specifying
        // an explicit return value, and an EVM exception would be raised when calling
        // a token with the mismatched return value.
        bytes memory payload = abi.encodeWithSignature(
            "approve(address,uint256)",
            _spender,
            _amount
        );
        bytes memory returnData = _callContract(_assetId, payload);
        // Ensure that the asset transfer succeeded
        _validateContractCallResult(returnData);
    }

    function swapTokensForBNB(
        address routerAddress,
        address primaryToken,
        uint256 amountIn,
        address payable recipient
    ) public {
        uint256 deadline = block.timestamp.add(360);
        IPancakeRouter02 router = IPancakeRouter02(routerAddress);

        address[] memory path = new address[](2);
        path[0] = address(primaryToken);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountIn,
            0,
            path,
            address(recipient),
            deadline
        );
    }

    function swapBNBForTokens(
        address routerAddress,
        address primaryToken,
        uint256 amountSent,
        address recipient
    ) public {
        IPancakeRouter02 router = IPancakeRouter02(routerAddress);

        // generate the pancake pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(primaryToken);

        // buy xbn
        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : amountSent}(
            0, // accept any amount of BNB
            path,
            address(recipient),
            block.timestamp + 360
        );
    }

    function chargeXBNFee(
        address routerAddress,
        address primaryToken,
        uint256 taxFeePercentXBN,
        uint256 cappedDeductedBNBFromEarning,
        address airdropFund,
        uint256 depositedBNBValue,
        bool skipTaxCheck
    ) public returns (uint256) {
        // amount sent
        uint256 amountSent = depositedBNBValue;

        if (!skipTaxCheck) {
            // charge fee
            uint256 taxChargedInBNB = uint256(depositedBNBValue).mul(taxFeePercentXBN).div(100);
            if (taxChargedInBNB > cappedDeductedBNBFromEarning) {
                taxChargedInBNB = cappedDeductedBNBFromEarning;
            }
            amountSent = taxChargedInBNB;
        }

        // amount xbn before swap
//        uint256 currentXBNBalance = IERC20(primaryToken).balanceOf((address(this)));

        swapBNBForTokens(address(routerAddress), address(primaryToken), amountSent, address(airdropFund));

//        uint256 balanceAfterSwap = IERC20(primaryToken).balanceOf((address(this)));
//        uint256 delta = balanceAfterSwap.sub(currentXBNBalance);

//        // transfer to airdropFund
//        IERC20(primaryToken).transfer(
//            airdropFund,
//            delta
//        );

        return amountSent;
    }

    /// @notice Transfers tokens into the contract
    /// @param _user The address to transfer the tokens from
    /// @param _assetId The address of the token to transfer
    /// @param _amount The number of tokens to transfer
    /// this may not match `_amount`, for example, tokens which have a
    /// proportion burnt on transfer will have a different amount received.
    function transferTokensIn(
        address _user,
        address _assetId,
        uint256 _amount
    )
    public
    {
        _validateContractAddress(_assetId);

        uint256 initialBalance = tokenBalance(_assetId);

        // Some tokens have a `transferFrom` which returns a boolean and some do not.
        // The ERC20 interface cannot be used here because it requires specifying
        // an explicit return value, and an EVM exception would be raised when calling
        // a token with the mismatched return value.
        bytes memory payload = abi.encodeWithSignature(
            "transferFrom(address,address,uint256)",
            _user,
            address(this),
            _amount
        );
        bytes memory returnData = _callContract(_assetId, payload);
        // Ensure that the asset transfer succeeded
        _validateContractCallResult(returnData);

        uint256 finalBalance = tokenBalance(_assetId);
        uint256 transferredAmount = finalBalance.sub(initialBalance);
    }

    /// @notice Transfers tokens from the contract to a user
    /// @param _receivingAddress The address to transfer the tokens to
    /// @param _assetId The address of the token to transfer
    /// @param _amount The number of tokens to transfer
    function transferTokensOut(
        address _receivingAddress,
        address _assetId,
        uint256 _amount
    )
    public
    {
        _validateContractAddress(_assetId);

        // Some tokens have a `transfer` which returns a boolean and some do not.
        // The ERC20 interface cannot be used here because it requires specifying
        // an explicit return value, and an EVM exception would be raised when calling
        // a token with the mismatched return value.
        bytes memory payload = abi.encodeWithSignature(
            "transfer(address,uint256)",
            _receivingAddress,
            _amount
        );
        bytes memory returnData = _callContract(_assetId, payload);

        // Ensure that the asset transfer succeeded
        _validateContractCallResult(returnData);
    }

    /// @notice Returns the number of tokens owned by this contract
    /// @param _assetId The address of the token to query
    function externalBalance(address _assetId) public view returns (uint256) {
        if (_assetId == DEFAULT_BNB_ADDR) {
            return address(this).balance;
        }
        return tokenBalance(_assetId);
    }

    /// @notice Returns the number of tokens owned by this contract.
    /// @dev This will not work for Ether tokens, use `externalBalance` for
    /// Ether tokens.
    /// @param _assetId The address of the token to query
    function tokenBalance(address _assetId) public view returns (uint256) {
        return IERC20(_assetId).balanceOf(address(this));
    }


    /// @dev A thin wrapper around the native `call` function, to
    /// validate that the contract `call` must be successful.
    /// See https://solidity.readthedocs.io/en/v0.5.1/050-breaking-changes.html
    /// for details on constructing the `_payload`
    /// @param _contract Address of the contract to call
    /// @param _payload The data to call the contract with
    /// @return The data returned from the contract call
    function _callContract(
        address _contract,
        bytes memory _payload
    )
    private
    returns (bytes memory)
    {
        bool success;
        bytes memory returnData;

        (success, returnData) = _contract.call(_payload);
        require(success, "Contract call failed");

        return returnData;
    }

    /// @dev Converts data of type `bytes` into its corresponding `uint256` value
    /// @param _data The data in bytes
    /// @return The corresponding `uint256` value
    function _getUint256FromBytes(
        bytes memory _data
    )
    private
    pure
    returns (uint256)
    {
        uint256 parsed;
        assembly {parsed := mload(add(_data, 32))}
        return parsed;
    }

    /// @dev Fix for ERC-20 tokens that do not have proper return type
    /// See: https://github.com/ethereum/solidity/issues/4116
    /// https://medium.com/loopring-protocol/an-incompatibility-in-smart-contract-threatening-dapp-ecosystem-72b8ca5db4da
    /// https://github.com/sec-bit/badERC20Fix/blob/master/badERC20Fix.sol
    /// @param _data The data returned from a transfer call
    function _validateContractCallResult(bytes memory _data) private pure {
        require(
            _data.length == 0 ||
            (_data.length == 32 && _getUint256FromBytes(_data) != 0),
            "Invalid contract call result"
        );
    }

    /// @dev Ensure that the address is a deployed contract
    /// @param _contract The address to check
    function _validateContractAddress(address _contract) private view {
        assembly {
            if iszero(extcodesize(_contract)) {revert(0, 0)}
        }
    }
}

// File: contracts/games/FomoLotto/library/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () public {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: contracts/games/FomoLotto/FomoLotto.sol

pragma solidity >=0.6.8;
pragma experimental ABIEncoderV2;






contract FomoLotto is ReentrancyGuard {
    using SafeMath for *;
    using KeysCalcLong for uint256;

    string constant public name = "FomoLotto";

    // config
    uint256 public rndInit_ = 1 hours;         // round timer starts at this
    uint256 public rndInc_ = 10 seconds;       // every full key purchased adds this much to the timer
    uint256 public rndMax_ = 24 hours;         // max length a round timer can be
    uint256 public burnFundFee = 5;     // represent the key proceeds allocation percentage to the dev fund
    uint256 public initialBurnFee = 5;  // represent the key proceeds allocation percentage that will be burn

    uint256 public playerFees = 53;  // represent the key proceeds allocation percentage to current players
    uint256 public potWinnerShare = 80;  // represent the pot allocation percentage to winner

    IERC20 public primaryToken_; // primary token accepted for FomoLotto
    IPancakeRouter02 public router_;      // pancake router

    uint256 public rID_;      // round id number / total rounds that have happened
    uint256 public burnFund_; // burn fund
    address public owner_;

    mapping(address => bool) whitelist_; // tokens that are whitelisted for FomoLotto
    mapping(address => Datasets.Player) public plyr_;   // (pID => data) player data
    mapping(address => mapping(uint256 => Datasets.PlayerRounds)) public plyrRnds_;
    mapping(uint256 => Datasets.Round) public round_;   // (rID => data) round data

    //    FomoLottoConsumer consumer;
    address payable airdropFund;
    uint256 public taxFeePercentXBN = 10;
    uint256 cappedDeductedBNBFromEarning = 50 ether;

    constructor()
    public
    {
        owner_ = msg.sender;
    }

    fallback() external payable {}

    modifier onlyOwner() {
        require(msg.sender == owner_, 'Error: Only owner can handle this operation ;)');
        _;
    }

    // modifiers
    /**
     * @dev used to make sure no one can interact with contract until it has
     * been activated.
     */
    modifier isActivated() {
        require(activated_ == true, "its not ready yet");
        _;
    }

    /**
     * @dev prevents contracts from interacting with FomoLotto
     */
    modifier isHuman() {
        require(tx.origin == msg.sender, "sorry humans only");
        _;
    }

    /**
     * @dev sets boundaries for incoming tx
     */
    modifier isWithinLimits(uint256 _value) {
        requireIsWithinLimits(_value);
        _;
    }

    function requireIsWithinLimits(uint256 _value) pure private {
        require(_value >= 1000000000, "min 0.000000001");
        // 0.000000001
        require(_value <= 100000000000000000000000, "max 100000");
        // 100000
    }

    // external functions

    /**
     * @dev sets the uniswap router for FomoLotto
     */
    function setRouter(address _routerAddress) public onlyOwner {
        router_ = IPancakeRouter02(_routerAddress);
    }

    /**
     * @dev sets the primary token used for FomoLotto purchases
     */
    function setPrimaryToken(address _primaryTokenAddress) public onlyOwner {
        primaryToken_ = IERC20(_primaryTokenAddress);
        addWhitelist(_primaryTokenAddress);
    }

    /**
     * @dev sets share of the pot the winner takes home
     */
    function setPotWinnerShare(uint256 _potWinnerShare) public onlyOwner {
        require(msg.sender == owner_, "only owner");
        require(_potWinnerShare >= 80, "min 80");
        // 80%
        require(_potWinnerShare <= 100, "max 100");
        // 100%
        potWinnerShare = _potWinnerShare;
    }

    /**
     * @dev whitelist BEP20 token for FomoLotto
     */
    function addWhitelist(address _tokenContract) public onlyOwner {
        require(msg.sender == owner_, "only owner");

        Utils.approveTokenTransfer(_tokenContract, address(router_), 2 ** 256 - 1);
        Utils.approveTokenTransfer(_tokenContract, address(this), 2 ** 256 - 1);
        whitelist_[_tokenContract] = true;
    }

    /**
     * @dev converts all incoming coins to keys.
     * _initialBurnFee amount will be locked in the contract instead of burnt to support non Burnable BEP20 tokens
     */
    function buyXidXBN(uint256 _amountIn, bool useBNB)
    isActivated()
    isHuman()
    external
    payable
    nonReentrant
    {
        // calculate burn amount
        // setup local rID
        uint256 _rID = rID_;
        uint256 _initialBurnFee = initialBurnFee;
        if (round_[_rID].pot > 500000000000000000000) {// 500 BNB
            _initialBurnFee = initialBurnFee / 2;
        }

        uint256 _burnAmount = (_amountIn.mul(_initialBurnFee)).div(100);

        uint256 value = 0;

        if (useBNB == true) {
            require(msg.value > 0, 'Error: invalid amount');

            // update _amountIn
            value = (uint256(msg.value)).sub(_burnAmount);
        } else {
            require(_amountIn > 0, 'Error: invalid amount');

            // transfer bep20 tokens to contract
            Utils.transferTokensIn(msg.sender, address(primaryToken_), _amountIn);

            // update _amountIn
            _amountIn = _amountIn.sub(_burnAmount);

            uint256 bnbBalanceBefore = address(this).balance;

            Utils.swapTokensForBNB(address(router_), address(primaryToken_), _amountIn, address(this));

            uint256 bnbBalanceAfter = address(this).balance;
            value = bnbBalanceAfter.sub(bnbBalanceBefore);
        }

        // charge fee
        uint256 chargedAmount = chargeXBNFee(value, false);

        value = value.sub(chargedAmount);

        // check again its within limits, if not revert
        requireIsWithinLimits(value);

        // buy core
        buyCore(msg.sender, value);
    }

    /**
     * @dev essentially the same as buy, but instead of you sending ether
     * from your wallet, it uses your unwithdrawn earnings.
     * @param _eth amount of earnings to use (remainder returned to gen vault)
     */
    function reLoadXid(uint256 _eth)
    isActivated()
    isHuman()
    isWithinLimits(_eth)
    nonReentrant
    external
    {
        // reload core
        reLoadCore(msg.sender, _eth);
    }

    /**
     * @dev withdraws all of your earnings.
     */
    function withdraw()
    isActivated()
    isHuman()
    nonReentrant
    external
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // setup temp var for player eth
        uint256 _eth;

        // check to see if round has ended and no one has run round end yet
        if (_now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].addr != address(0))
        {
            // end the round (distributes pot)
            round_[_rID].ended = true;
        }

        // get their earnings
        _eth = withdrawEarnings(msg.sender);

        (bool success,) = msg.sender.call{value : _eth}(new bytes(0));
        require(success, 'safeTransferETH: BNB transfer failed');
    }

    // views

    function isWhitelisted(address _tokenContract) public view returns (bool) {
        return whitelist_[_tokenContract];
    }

    function viewRouter() public view returns (address) {
        return address(router_);
    }

    /**
     * @dev return the price buyer will pay for next 1 individual key.
     * @return price for next key bought (in wei format)
     */
    function getBuyPrice()
    public
    view
    returns (uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // are we in a round?
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].addr == address(0))))
            return ((round_[_rID].keys.add(1000000000000000000)).ethRec(1000000000000000000));
        else // rounds over.  need price for new round
            return (75000000000000);
        // init
    }

    /**
     * @dev returns time left
     * @return time left in seconds
     */
    function getTimeLeft()
    public
    view
    returns (uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        if (_now < round_[_rID].end)
            if (_now > round_[_rID].strt)
                return ((round_[_rID].end).sub(_now));
            else
                return ((round_[_rID].strt).sub(_now));
        else
            return (0);
    }

    /**
     * @dev returns player earnings per vaults
     * @return winnings vault
     * @return general vault
     */
    function getPlayerVaults(address _pID)
    public
    view
    returns (uint256, uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        // if round has ended.  but round end has not been run (so contract has not distributed winnings)
        if (now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].addr != address(0))
        {
            // if player is winner
            if (round_[_rID].addr == _pID)
            {
                return
                (
                (plyr_[_pID].win).add(((round_[_rID].pot).mul(potWinnerShare)) / 100),
                (plyr_[_pID].gen).add(getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask))
                );
                // if player is not the winner
            } else {
                return
                (
                plyr_[_pID].win,
                (plyr_[_pID].gen).add(getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask))
                );
            }

            // if round is still going on, or round has ended and round end has been ran
        } else {
            return
            (
            plyr_[_pID].win,
            (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd))
            );
        }
    }

    /**
     * solidity hates stack limits.  this lets us avoid that hate
     */
    function getPlayerVaultsHelper(address _pID, uint256 _rID)
    private
    view
    returns (uint256)
    {
        return (((((round_[_rID].mask)).mul(plyrRnds_[_pID][_rID].keys)) / 1000000000000000000));
    }

    /**
     * @dev returns all current round info needed for front end
     * @return round id
     * @return total keys for round
     * @return time round ends
     * @return time round started
     * @return current pot
     * @return total bnb spent
     * @return current lead address
     */
    function getCurrentRoundInfo()
    public
    view
    returns (uint256, uint256, uint256, uint256, uint256, uint256, address)
    {
        // setup local rID
        uint256 _rID = rID_;

        return
        (
        _rID, //1
        round_[_rID].keys, //2
        round_[_rID].end, //3
        round_[_rID].strt, //4
        round_[_rID].pot, //5
        round_[_rID].eth, //6
        round_[_rID].addr               //7
        );
    }

    /**
     * @dev returns player info based on address.  if no address is given, it will
     * use msg.sender
     * @param _addr address of the player you want to lookup
     * @return keys owned (current round)
     * @return winnings vault
     * @return general vault
	 * @return player round eth
     */
    function getPlayerInfoByAddress(address _addr)
    public
    view
    returns (uint256, uint256, uint256, uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        if (_addr == address(0))
        {
            _addr == msg.sender;
        }

        return
        (
        plyrRnds_[_addr][_rID].keys, //0
        plyr_[_addr].win, //1
        (plyr_[_addr].gen).add(calcUnMaskedEarnings(_addr, plyr_[_addr].lrnd)), //2
        plyrRnds_[_addr][_rID].eth                                              //3
        );
    }


    /**
     * @dev logic runs whenever a buy order is executed.  determines how to handle
     * incoming eth depending on if we are in an active round or not
     */
    function buyCore(address _pID, uint256 value)
    private
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // if round is active
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].addr == address(0))))
        {
            // call core
            core(_rID, _pID, value);

            // if round is not active
        } else {
            // check to see if end round needs to be ran
            if (_now > round_[_rID].end && round_[_rID].ended == false)
            {
                // end the round (distributes pot) & start new round
                round_[_rID].ended = true;
                endRound();
            }

            // put eth in players vault
            plyr_[_pID].gen = plyr_[_pID].gen.add(value);
        }
    }

    /**
     * @dev logic runs whenever a reload order is executed.  determines how to handle
     * incoming eth depending on if we are in an active round or not
     */
    function reLoadCore(address _pID, uint256 _eth)
    private
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // if round is active
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].addr == address(0))))
        {
            // get earnings from all vaults and return unused to gen vault
            // because we use a custom safemath library.  this will throw if player
            // tried to spend more eth than they have.
            plyr_[_pID].gen = withdrawEarnings(_pID).sub(_eth);

            // call core
            core(_rID, _pID, _eth);

            // if round is not active and end round needs to be ran
        } else if (_now > round_[_rID].end && round_[_rID].ended == false) {
            // end the round (distributes pot) & start new round
            round_[_rID].ended = true;
            endRound();

        }
    }

    /**
     * @dev this is the core logic for any buy/reload that happens while a round
     * is live.
     */
    function core(uint256 _rID, address _pID, uint256 _eth)
    private
    {
        // if player is new to round
        if (plyrRnds_[_pID][_rID].keys == 0)
            managePlayer(_pID);

        // if eth left is greater than min eth allowed
        if (_eth > 1000000000)
        {

            // mint the new keys
            uint256 _keys = (round_[_rID].eth).keysRec(_eth);

            // if they bought at least 1 whole key
            if (_keys >= 1000000000000000000)
            {
                updateTimer(_keys, _rID);

                // set new leaders
                if (round_[_rID].addr != _pID)
                    round_[_rID].addr = _pID;
            }

            // update player
            plyrRnds_[_pID][_rID].keys = _keys.add(plyrRnds_[_pID][_rID].keys);
            plyrRnds_[_pID][_rID].eth = _eth.add(plyrRnds_[_pID][_rID].eth);

            // update round
            round_[_rID].keys = _keys.add(round_[_rID].keys);
            round_[_rID].eth = _eth.add(round_[_rID].eth);

            // distribute eth
            distributeExternal(_eth);
            distributeInternal(_rID, _pID, _eth, _keys);
        }
    }

    // calculators

    /**
     * @dev calculates unmasked earnings (just calculates, does not update mask)
     * @return earnings in wei format
     */
    function calcUnMaskedEarnings(address _pID, uint256 _rIDlast)
    private
    view
    returns (uint256)
    {
        return ((((round_[_rIDlast].mask).mul(plyrRnds_[_pID][_rIDlast].keys)) / (1000000000000000000)).sub(plyrRnds_[_pID][_rIDlast].mask));
    }

    /**
     * @dev returns the amount of keys you would get given an amount of eth.
     * @param _rID round ID you want price for
     * @param _eth amount of eth sent in
     * @return keys received
     */
    function calcKeysReceived(uint256 _rID, uint256 _eth)
    public
    view
    returns (uint256)
    {
        // grab time
        uint256 _now = now;

        // are we in a round?
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].addr == address(0))))
            return ((round_[_rID].eth).keysRec(_eth));
        else // rounds over.  need keys for new round
            return ((_eth).keys());
    }

    /**
     * @dev returns current eth price for X keys.
     * @param _keys number of keys desired (in 18 decimal format)
     * @return amount of eth needed to send
     */
    function iWantXKeys(uint256 _keys)
    public
    view
    returns (uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // are we in a round?
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].addr == address(0))))
            return ((round_[_rID].keys.add(_keys)).ethRec(_keys));
        else // rounds over.  need price for new round
            return ((_keys).eth());
    }


    // tools

    /**
     * @dev decides if round end needs to be run & new round started.  and if
     * player unmasked earnings from previously played rounds need to be moved.
     */
    function managePlayer(address _pID)
    private
    {
        // if player has played a previous round, move their unmasked earnings
        // from that round to gen vault.
        if (plyr_[_pID].lrnd != 0)
            updateGenVault(_pID, plyr_[_pID].lrnd);

        // update player's last round played
        plyr_[_pID].lrnd = rID_;
    }

    /**
     * @dev ends the round. manages paying out winner/splitting up pot
     */
    function endRound()
    private
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab our winning player and team id's
        address _winPID = round_[_rID].addr;

        // grab our pot amount
        uint256 _pot = round_[_rID].pot;

        // calculate our winner share, community rewards, gen share,
        // and amount reserved for next pot
        uint256 _win = (_pot.mul(potWinnerShare)) / 100;
        uint256 _res = _pot.sub(_win);

        // pay our winner
        plyr_[_winPID].win = _win.add(plyr_[_winPID].win);

        // start next round
        rID_++;
        _rID++;
        round_[_rID].strt = now;
        round_[_rID].end = now.add(rndInit_);
        round_[_rID].pot = _res;
    }


    function adminEndRound() public onlyOwner {
        endRound();
    }

    /**
     * @dev moves any unmasked earnings to gen vault.  updates earnings mask
     */
    function updateGenVault(address _pID, uint256 _rIDlast)
    private
    {
        uint256 _earnings = calcUnMaskedEarnings(_pID, _rIDlast);
        if (_earnings > 0)
        {
            // put in gen vault
            plyr_[_pID].gen = _earnings.add(plyr_[_pID].gen);
            // zero out their earnings by updating mask
            plyrRnds_[_pID][_rIDlast].mask = _earnings.add(plyrRnds_[_pID][_rIDlast].mask);
        }
    }

    /**
     * @dev updates round timer based on number of whole keys bought.
     */
    function updateTimer(uint256 _keys, uint256 _rID)
    private
    {
        // grab time
        uint256 _now = now;

        // calculate time based on number of keys bought
        uint256 _newTime;
        if (_now > round_[_rID].end && round_[_rID].addr == address(0)) // new round
            _newTime = (((_keys) / (1000000000000000000)).mul(rndInc_)).add(_now);
        else
            _newTime = (((_keys) / (1000000000000000000)).mul(rndInc_)).add(round_[_rID].end);

        // compare to max and set new end time
        if (_newTime < (rndMax_).add(_now))
            round_[_rID].end = _newTime;
        else
            round_[_rID].end = rndMax_.add(_now);
    }

    /**
     * @dev distributes eth based on fees to com
     */
    function distributeExternal(uint256 _eth)
    private
    {
        uint256 _com = _eth.div(20);
        burnFund_ = burnFund_.add(_com);
    }

    /**
     * @dev distributes eth based on fees to gen and pot
     */
    function distributeInternal(uint256 _rID, address _pID, uint256 _eth, uint256 _keys)
    private
    {
        // calculate gen share
        uint256 _gen = (_eth.mul(playerFees)) / 100;

        // update eth balance (eth = eth - com share)
        _eth = _eth.sub((_eth.mul(burnFundFee)) / 100);

        // calculate pot
        uint256 _pot = _eth.sub(_gen);

        // distribute gen share (thats what updateMasks() does) and adjust
        // balances for dust.
        uint256 _dust = updateMasks(_rID, _pID, _gen, _keys);
        if (_dust > 0)
            _gen = _gen.sub(_dust);

        // add eth to pot
        round_[_rID].pot = _pot.add(_dust).add(round_[_rID].pot);
    }

    /**
     * @dev updates masks for round and player when keys are bought
     * @return dust left over
     */
    function updateMasks(uint256 _rID, address _pID, uint256 _gen, uint256 _keys)
    private
    returns (uint256)
    {
        /* MASKING NOTES
            earnings masks are a tricky thing for people to wrap their minds around.
            the basic thing to understand here.  is were going to have a global
            tracker based on profit per share for each round, that increases in
            relevant proportion to the increase in share supply.

            the player will have an additional mask that basically says "based
            on the rounds mask, my shares, and how much i've already withdrawn,
            how much is still owed to me?"
        */

        // calc profit per key & round mask based on this buy:  (dust goes to pot)
        uint256 _ppt = (_gen.mul(1000000000000000000)) / (round_[_rID].keys);
        round_[_rID].mask = _ppt.add(round_[_rID].mask);

        // calculate player earning from their own buy (only based on the keys
        // they just bought).  & update player earnings mask
        uint256 _pearn = (_ppt.mul(_keys)) / (1000000000000000000);
        plyrRnds_[_pID][_rID].mask = (((round_[_rID].mask.mul(_keys)) / (1000000000000000000)).sub(_pearn)).add(plyrRnds_[_pID][_rID].mask);

        // calculate & return dust
        return (_gen.sub((_ppt.mul(round_[_rID].keys)) / (1000000000000000000)));
    }

    /**
     * @dev adds up unmasked earnings, & vault earnings, sets them all to 0
     * @return earnings in wei format
     */
    function withdrawEarnings(address _pID)
    private
    returns (uint256)
    {
        // update gen vault
        updateGenVault(_pID, plyr_[_pID].lrnd);

        // from vaults
        uint256 _earnings = (plyr_[_pID].win).add(plyr_[_pID].gen);
        if (_earnings > 0)
        {
            plyr_[_pID].win = 0;
            plyr_[_pID].gen = 0;

            // charge fee
            uint256 chargedAmount = chargeXBNFee(_earnings, false);
            _earnings = _earnings.sub(chargedAmount);
        }

        return (_earnings);
    }

    // security

    /** upon contract deploy, it will be deactivated.  this is a one time
     * use function that will activate the contract.  we do this so devs
     * have time to set things up on the web end
     **/
    bool public activated_ = false;

    function activate(address _primaryToken, address _routerAddress, address payable airdropFundAddress)
    public
    {
        // only owner can activate
        require(
            msg.sender == owner_,
            "only owner just can activate"
        );

        // can only be ran once
        require(activated_ == false, "fomolotto already activated");

        // Add router
        setRouter(_routerAddress);

        // add to whitelist
        addWhitelist(_primaryToken);

        // set primary token
        setPrimaryToken(_primaryToken);

        // set airdropFund
        setAirdropFund(airdropFundAddress);

        // activate the contract
        activated_ = true;

        // lets start first round
        rID_ = 1;
        round_[1].strt = now;
        round_[1].end = now + rndInit_;
    }

    // innovative protocol
    function configRound(
        uint256 _rndInit_,
        uint256 _rndInc_,
        uint256 _rndMax_,
        uint256 _burnFundFee,
        uint256 _initialBurnFee
    ) public onlyOwner {
        rndInc_ = _rndInit_;
        rndInc_ = _rndInc_;
        rndMax_ = _rndMax_;
        burnFundFee = _burnFundFee;
        initialBurnFee = _initialBurnFee;
    }

    function setPlayerFees(
        uint256 _playerFees
    ) public onlyOwner {
        playerFees = _playerFees;
    }

    function setAirdropFund(address payable value) public onlyOwner {
        airdropFund = value;
    }

    function setXBNTaxFees(uint256 taxPercent, uint256 cappedDeductedBNB) public onlyOwner {
        taxFeePercentXBN = taxPercent;
        cappedDeductedBNBFromEarning = cappedDeductedBNB;
    }

    function emergencyWithdraw() public onlyOwner {
        (bool sent,) = (address(msg.sender)).call{value : address(this).balance}("");
        require(sent, 'Error: Cannot withdraw to the foundation address');

        IERC20(primaryToken_).transfer(
            msg.sender,
            IERC20(primaryToken_).balanceOf(address(this))
        );
    }

    function chargeXBNFee(uint256 amountSent, bool skipTaxCheck) private returns (uint256){
        return Utils.chargeXBNFee(
            address(router_),
            address(primaryToken_),
            taxFeePercentXBN,
            cappedDeductedBNBFromEarning,
            airdropFund,
            amountSent,
            skipTaxCheck
        );
    }

    function burnFunds()
    public
    onlyOwner
    {
        if (burnFund_ > 0) {
            chargeXBNFee(burnFund_, true);
            burnFund_ = 0;
        }
    }

    function burnFundByPlayerAddress(address playerAddress) public onlyOwner {
        uint256 _eth = withdrawEarnings(playerAddress);
        chargeXBNFee(_eth, true);
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_primaryToken","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"address payable","name":"airdropFundAddress","type":"address"}],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activated_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminEndRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"burnFundByPlayerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFund_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"bool","name":"useBNB","type":"bool"}],"name":"buyXidXBN","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rID","type":"uint256"},{"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"calcKeysReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rndInit_","type":"uint256"},{"internalType":"uint256","name":"_rndInc_","type":"uint256"},{"internalType":"uint256","name":"_rndMax_","type":"uint256"},{"internalType":"uint256","name":"_burnFundFee","type":"uint256"},{"internalType":"uint256","name":"_initialBurnFee","type":"uint256"}],"name":"configRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBuyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRoundInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getPlayerInfoByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pID","type":"address"}],"name":"getPlayerVaults","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keys","type":"uint256"}],"name":"iWantXKeys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"playerFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"plyrRnds_","outputs":[{"internalType":"uint256","name":"eth","type":"uint256"},{"internalType":"uint256","name":"keys","type":"uint256"},{"internalType":"uint256","name":"mask","type":"uint256"},{"internalType":"uint256","name":"ico","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"plyr_","outputs":[{"internalType":"uint256","name":"win","type":"uint256"},{"internalType":"uint256","name":"gen","type":"uint256"},{"internalType":"uint256","name":"lrnd","type":"uint256"},{"internalType":"uint256","name":"lastActivityDate","type":"uint256"},{"internalType":"string","name":"lastActivityName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potWinnerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryToken_","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rID_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"reLoadXid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rndInc_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rndInit_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rndMax_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round_","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bool","name":"ended","type":"bool"},{"internalType":"uint256","name":"strt","type":"uint256"},{"internalType":"uint256","name":"keys","type":"uint256"},{"internalType":"uint256","name":"eth","type":"uint256"},{"internalType":"uint256","name":"pot","type":"uint256"},{"internalType":"uint256","name":"mask","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router_","outputs":[{"internalType":"contract IPancakeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"value","type":"address"}],"name":"setAirdropFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_playerFees","type":"uint256"}],"name":"setPlayerFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_potWinnerShare","type":"uint256"}],"name":"setPotWinnerShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_primaryTokenAddress","type":"address"}],"name":"setPrimaryToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxPercent","type":"uint256"},{"internalType":"uint256","name":"cappedDeductedBNB","type":"uint256"}],"name":"setXBNTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"taxFeePercentXBN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610e10600155600a6002556201518060035560056004556005805560356006556050600755600a6012556802b5e3af16b18800006013556000601460006101000a81548160ff02191690831515021790555034801561006257600080fd5b50600160008190555033600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506158a080620000bc6000396000f3fe6080604052600436106102605760003560e01c80638b68cd9d11610144578063cf808000116100b6578063e79dc6d61161007a578063e79dc6d6146108a9578063ee0b5d8b146108d4578063f203adc014610914578063f265dd001461093f578063f80f5dd51461097d578063fc8e0b40146109a657610261565b8063cf808000146107d4578063d53b267914610811578063db2e21bc1461083c578063e1bfd68114610853578063e76630791461087e57610261565b8063c0d7865511610108578063c0d78655146106ae578063c33073ce146106d7578063c68b0cd414610702578063c7e284b814610743578063cb7028c11461076e578063ce89c80c1461079757610261565b80638b68cd9d146105fc578063922f8d8314610627578063ae2539bc14610652578063be405bd81461067b578063bfba7c831461069257610261565b80633ccfd60b116101dd578063592ed93c116101a1578063592ed93c1461050c578063624ae5c0146105355780636408406f14610560578063666a7c9b14610589578063747dff42146105a0578063863a5e65146105d157610261565b80633ccfd60b146104345780633ee6d9331461044b5780633f06f94114610476578063452b381d146104a15780634f1cb291146104e157610261565b8063183f981111610224578063183f98111461033657806319d7943a1461036157806324c33d331461038a578063266e2ce2146103ce5780633af32abf146103f757610261565b8063018a25e814610263578063045ec5631461028e57806306fdde03146102b9578063086fbe86146102e4578063119b90cd1461030d57610261565b5b005b34801561026f57600080fd5b506102786109cf565b604051610285919061555c565b60405180910390f35b34801561029a57600080fd5b506102a3610b0d565b6040516102b0919061555c565b60405180910390f35b3480156102c557600080fd5b506102ce610b13565b6040516102db919061531a565b60405180910390f35b3480156102f057600080fd5b5061030b6004803603810190610306919061485f565b610b4c565b005b34801561031957600080fd5b50610334600480360381019061032f9190614888565b610c20565b005b34801561034257600080fd5b5061034b610d8e565b604051610358919061555c565b60405180910390f35b34801561036d57600080fd5b506103886004803603810190610383919061493c565b610d94565b005b34801561039657600080fd5b506103b160048036038101906103ac919061493c565b610ec6565b6040516103c598979695949392919061524b565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906149ca565b610f3b565b005b34801561040357600080fd5b5061041e60048036038101906104199190614836565b610fdd565b60405161042b91906152c9565b60405180910390f35b34801561044057600080fd5b50610449611033565b005b34801561045757600080fd5b50610460611355565b60405161046d919061555c565b60405180910390f35b34801561048257600080fd5b5061048b61135b565b604051610498919061555c565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c391906148d7565b611361565b6040516104d894939291906155a0565b60405180910390f35b3480156104ed57600080fd5b506104f661139e565b6040516105039190615093565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190614836565b6113c8565b005b34801561054157600080fd5b5061054a611475565b604051610557919061555c565b60405180910390f35b34801561056c57600080fd5b5061058760048036038101906105829190614836565b61147b565b005b34801561059557600080fd5b5061059e611558565b005b3480156105ac57600080fd5b506105b561160c565b6040516105c8979695949392919061563f565b60405180910390f35b3480156105dd57600080fd5b506105e66116e0565b6040516105f391906152ff565b60405180910390f35b34801561060857600080fd5b50610611611706565b60405161061e919061555c565b60405180910390f35b34801561063357600080fd5b5061063c61170c565b604051610649919061555c565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190614a06565b611712565b005b34801561068757600080fd5b506106906117cc565b005b6106ac60048036038101906106a7919061498e565b611866565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190614836565b611c56565b005b3480156106e357600080fd5b506106ec611d2a565b6040516106f9919061555c565b60405180910390f35b34801561070e57600080fd5b5061072960048036038101906107249190614836565b611d30565b60405161073a9594939291906155e5565b60405180910390f35b34801561074f57600080fd5b50610758611dfe565b604051610765919061555c565b60405180910390f35b34801561077a57600080fd5b506107956004803603810190610790919061493c565b611eb5565b005b3480156107a357600080fd5b506107be60048036038101906107b991906149ca565b612067565b6040516107cb919061555c565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f6919061493c565b61217f565b604051610808919061555c565b60405180910390f35b34801561081d57600080fd5b506108266122b1565b60405161083391906152c9565b60405180910390f35b34801561084857600080fd5b506108516122c4565b005b34801561085f57600080fd5b5061086861255d565b60405161087591906152e4565b60405180910390f35b34801561088a57600080fd5b50610893612583565b6040516108a09190615093565b60405180910390f35b3480156108b557600080fd5b506108be6125a9565b6040516108cb919061555c565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f69190614836565b6125af565b60405161090b94939291906155a0565b60405180910390f35b34801561092057600080fd5b50610929612757565b604051610936919061555c565b60405180910390f35b34801561094b57600080fd5b5061096660048036038101906109619190614836565b61275d565b604051610974929190615577565b60405180910390f35b34801561098957600080fd5b506109a4600480360381019061099f9190614836565b612be5565b005b3480156109b257600080fd5b506109cd60048036038101906109c8919061493c565b612e98565b005b600080600a5490506000429050601060008381526020019081526020016000206003015481118015610aa55750601060008381526020019081526020016000206001015481111580610aa45750601060008381526020019081526020016000206001015481118015610aa35750600073ffffffffffffffffffffffffffffffffffffffff166010600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b5b5b15610afe57610af5670de0b6b3a7640000610ae7670de0b6b3a76400006010600087815260200190815260200160002060040154612f3290919063ffffffff16565b612f8590919063ffffffff16565b92505050610b0a565b6544364c5bb000925050505b90565b60025481565b6040518060400160405280600981526020017f466f6d6f4c6f74746f000000000000000000000000000000000000000000000081525081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd39061537c565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca7906153bc565b60405180910390fd5b60001515601460009054906101000a900460ff16151514610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd906154bc565b60405180910390fd5b610d0f82611c56565b610d1883612be5565b610d218361147b565b610d2a81610b4c565b6001601460006101000a81548160ff0219169083151502179055506001600a81905550426010600060018152602001908152602001600020600301819055506001544201601060006001815260200190815260200160002060010181905550505050565b60065481565b60011515601460009054906101000a900460ff16151514610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de1906154dc565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f9061539c565b60405180910390fd5b80610e6281612fc4565b60026000541415610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906154fc565b60405180910390fd5b6002600081905550610eba338361305b565b60016000819055505050565b60106020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040154908060050154908060060154908060070154905088565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc29061537c565b60405180910390fd5b81601281905550806013819055505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60011515601460009054906101000a900460ff16151514611089576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611080906154dc565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee9061539c565b60405180910390fd5b6002600054141561113d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611134906154fc565b60405180910390fd5b60026000819055506000600a5490506000429050600060106000848152602001908152602001600020600101548211801561119f5750600015156010600085815260200190815260200160002060020160009054906101000a900460ff161515145b801561120e5750600073ffffffffffffffffffffffffffffffffffffffff166010600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156112435760016010600085815260200190815260200160002060020160006101000a81548160ff0219169083151502179055505b61124c33613236565b905060003373ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111801561128057600080fd5b506040519080825280601f01601f1916602001820160405280156112b35781602001600182028036833780820191505090505b506040516112c19190615067565b60006040518083038185875af1925050503d80600081146112fe576040519150601f19603f3d011682016040523d82523d6000602084013e611303565b606091505b5050905080611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133e906153dc565b60405180910390fd5b505050506001600081905550565b60015481565b60125481565b600f602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154905084565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f9061537c565b60405180910390fd5b600061146382613236565b90506114708160016133e7565b505050565b600a5481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115029061537c565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061155581612be5565b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061537c565b60405180910390fd5b6000600b54111561160a57611600600b5460016133e7565b506000600b819055505b565b600080600080600080600080600a54905080601060008381526020019081526020016000206004015460106000848152602001908152602001600020600101546010600085815260200190815260200160002060030154601060008681526020019081526020016000206006015460106000878152602001908152602001600020600501546010600088815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1697509750975097509750975097505090919293949596565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b600b5481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117999061537c565b60405180910390fd5b84600281905550836002819055508260038190555081600481905550806005819055505050505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118539061537c565b60405180910390fd5b6118646134ee565b565b60011515601460009054906101000a900460ff161515146118bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b3906154dc565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461192a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119219061539c565b60405180910390fd5b60026000541415611970576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611967906154fc565b60405180910390fd5b60026000819055506000600a54905060006005549050681b1ae4d6e2ef500000601060008481526020019081526020016000206006015411156119bd576002600554816119b957fe5b0490505b60006119e560646119d784886136a690919063ffffffff16565b61371390919063ffffffff16565b90506000809050600115158515151415611a565760003411611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a339061547c565b60405180910390fd5b611a4f823461372c90919063ffffffff16565b9050611c0e565b60008611611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a909061547c565b60405180910390fd5b73ebb6301820199de2f9463a1e06fa894c054d700163741a41c333600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16896040518463ffffffff1660e01b8152600401611af6939291906150c9565b60006040518083038186803b158015611b0e57600080fd5b505af4158015611b22573d6000803e3d6000fd5b50505050611b39828761372c90919063ffffffff16565b9550600047905073ebb6301820199de2f9463a1e06fa894c054d70016310432ec9600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a306040518563ffffffff1660e01b8152600401611bc19493929190615197565b60006040518083038186803b158015611bd957600080fd5b505af4158015611bed573d6000803e3d6000fd5b505050506000479050611c09828261372c90919063ffffffff16565b925050505b6000611c1b8260006133e7565b9050611c30818361372c90919063ffffffff16565b9150611c3b82612fc4565b611c45338361377c565b505050505060016000819055505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd9061537c565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60055481565b600e602052806000526040600020600091509050806000015490806001015490806002015490806003015490806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611df45780601f10611dc957610100808354040283529160200191611df4565b820191906000526020600020905b815481529060010190602001808311611dd757829003601f168201915b5050505050905085565b600080600a54905060004290506010600083815260200190815260200160002060010154811015611eab576010600083815260200190815260200160002060030154811115611e7957611e7081601060008581526020019081526020016000206001015461372c90919063ffffffff16565b92505050611eb2565b611ea281601060008581526020019081526020016000206003015461372c90919063ffffffff16565b92505050611eb2565b6000925050505b90565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c9061537c565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc9061541c565b60405180910390fd5b6050811015612019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120109061535c565b60405180910390fd5b606481111561205d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120549061533c565b60405180910390fd5b8060078190555050565b600080429050601060008581526020019081526020016000206003015481118015612136575060106000858152602001908152602001600020600101548111158061213557506010600085815260200190815260200160002060010154811180156121345750600073ffffffffffffffffffffffffffffffffffffffff166010600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b5b5b1561216c5761216483601060008781526020019081526020016000206005015461399190919063ffffffff16565b915050612179565b612175836139d0565b9150505b92915050565b600080600a5490506000429050601060008381526020019081526020016000206003015481118015612255575060106000838152602001908152602001600020600101548111158061225457506010600083815260200190815260200160002060010154811180156122535750600073ffffffffffffffffffffffffffffffffffffffff166010600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b5b5b1561229e5761229584612287866010600087815260200190815260200160002060040154612f3290919063ffffffff16565b612f8590919063ffffffff16565b925050506122ac565b6122a784613a74565b925050505b919050565b601460009054906101000a900460ff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b9061537c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161237a9061507e565b60006040518083038185875af1925050503d80600081146123b7576040519150601f19603f3d011682016040523d82523d6000602084013e6123bc565b606091505b5050905080612400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f79061551c565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161249a91906150ae565b60206040518083038186803b1580156124b257600080fd5b505afa1580156124c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ea9190614965565b6040518363ffffffff1660e01b8152600401612507929190615100565b602060405180830381600087803b15801561252157600080fd5b505af1158015612535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125599190614913565b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b6000806000806000600a549050600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060010154600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546126f36126a289600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154613b03565b600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612f3290919063ffffffff16565b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600001549450945094509450509193509193565b60075481565b6000806000600a5490506010600082815260200190815260200160002060010154421180156127b35750600015156010600083815260200190815260200160002060020160009054906101000a900460ff161515145b80156128225750600073ffffffffffffffffffffffffffffffffffffffff166010600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15612af7578373ffffffffffffffffffffffffffffffffffffffff166010600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129e75761291a60646128c160075460106000868152602001908152602001600020600601546136a690919063ffffffff16565b816128c857fe5b04600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612f3290919063ffffffff16565b6129dd61298c600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206002015461297e8886613bff565b61372c90919063ffffffff16565b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612f3290919063ffffffff16565b9250925050612be0565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612aed612a9c600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154612a8e8886613bff565b61372c90919063ffffffff16565b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612f3290919063ffffffff16565b9250925050612be0565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612bda612b8986600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154613b03565b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612f3290919063ffffffff16565b92509250505b915091565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6c9061537c565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfc9061541c565b60405180910390fd5b73ebb6301820199de2f9463a1e06fa894c054d70016352a23bbb82600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518463ffffffff1660e01b8152600401612d8293929190615160565b60006040518083038186803b158015612d9a57600080fd5b505af4158015612dae573d6000803e3d6000fd5b5050505073ebb6301820199de2f9463a1e06fa894c054d70016352a23bbb82307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518463ffffffff1660e01b8152600401612e0d93929190615129565b60006040518083038186803b158015612e2557600080fd5b505af4158015612e39573d6000803e3d6000fd5b505050506001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1f9061537c565b60405180910390fd5b8060068190555050565b6000818301905082811015612f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f739061549c565b60405180910390fd5b80905092915050565b6000612fbc612fa5612fa0848661372c90919063ffffffff16565b613a74565b612fae85613a74565b61372c90919063ffffffff16565b905092915050565b633b9aca0081101561300b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613002906153fc565b60405180910390fd5b69152d02c7e14af6800000811115613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304f9061553c565b60405180910390fd5b50565b6000600a5490506000429050601060008381526020019081526020016000206003015481118015613130575060106000838152602001908152602001600020600101548111158061312f575060106000838152602001908152602001600020600101548111801561312e5750600073ffffffffffffffffffffffffffffffffffffffff166010600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b5b5b156131a6576131508361314286613236565b61372c90919063ffffffff16565b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506131a1828585613c96565b613230565b6010600083815260200190815260200160002060010154811180156131f25750600015156010600084815260200190815260200160002060020160009054906101000a900460ff161515145b1561322f5760016010600084815260200190815260200160002060020160006101000a81548160ff02191690831515021790555061322e6134ee565b5b5b50505050565b600061328482600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461402a565b600061331d600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612f3290919063ffffffff16565b905060008111156133de576000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555060006133c58260006133e7565b90506133da818361372c90919063ffffffff16565b9150505b80915050919050565b600073ebb6301820199de2f9463a1e06fa894c054d700163ed6de617600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601254601354601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689896040518863ffffffff1660e01b815260040161349697969594939291906151dc565b60206040518083038186803b1580156134ae57600080fd5b505af41580156134c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e69190614965565b905092915050565b6000600a54905060006010600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006010600084815260200190815260200160002060060154905060006064613564600754846136a690919063ffffffff16565b8161356b57fe5b0490506000613583828461372c90919063ffffffff16565b90506135da600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483612f3290919063ffffffff16565b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600a60008154809291906001019190505550848060010195505042601060008781526020019081526020016000206003018190555061366a60015442612f3290919063ffffffff16565b60106000878152602001908152602001600020600101819055508060106000878152602001908152602001600020600601819055505050505050565b6000808314156136b9576000905061370d565b8183029050818382816136c857fe5b0414613709576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137009061543c565b60405180910390fd5b8090505b92915050565b60008082848161371f57fe5b0490508091505092915050565b600082821115613771576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137689061545c565b60405180910390fd5b818303905092915050565b6000600a54905060004290506010600083815260200190815260200160002060030154811180156138515750601060008381526020019081526020016000206001015481111580613850575060106000838152602001908152602001600020600101548111801561384f5750600073ffffffffffffffffffffffffffffffffffffffff166010600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b5b5b1561386657613861828585613c96565b61398b565b6010600083815260200190815260200160002060010154811180156138b25750600015156010600084815260200190815260200160002060020160009054906101000a900460ff161515145b156138ef5760016010600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055506138ee6134ee565b5b61394483600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612f3290919063ffffffff16565b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b50505050565b60006139c861399f846139d0565b6139ba6139b58587612f3290919063ffffffff16565b6139d0565b61372c90919063ffffffff16565b905092915050565b60006309502f90613a656d03b2a1d15167e7c5699bfde00000613a57613a527a0dac7055469777a6122ee4310dd6c14410500f2904840000000000613a446b01027e72f1f1281308800000613a36670de0b6b3a76400008b6136a690919063ffffffff16565b6136a690919063ffffffff16565b612f3290919063ffffffff16565b61419f565b61372c90919063ffffffff16565b81613a6c57fe5b049050919050565b6000613a87670de0b6b3a76400006141f2565b613af46002613abf613aaa670de0b6b3a7640000876136a690919063ffffffff16565b65886c8f6730706136a690919063ffffffff16565b81613ac657fe5b04613ae6613ad3866141f2565b6304a817c86136a690919063ffffffff16565b612f3290919063ffffffff16565b81613afb57fe5b049050919050565b6000613bf7600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060020154670de0b6b3a7640000613be1600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206001015460106000888152602001908152602001600020600701546136a690919063ffffffff16565b81613be857fe5b0461372c90919063ffffffff16565b905092915050565b6000670de0b6b3a7640000613c86600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206001015460106000868152602001908152602001600020600701546136a690919063ffffffff16565b81613c8d57fe5b04905092915050565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600101541415613cfc57613cfb82614205565b5b633b9aca00811115614025576000613d3382601060008781526020019081526020016000206005015461399190919063ffffffff16565b9050670de0b6b3a76400008110613e0e57613d4e81856142e8565b8273ffffffffffffffffffffffffffffffffffffffff166010600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e0d57826010600086815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b613e74600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206001015482612f3290919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010181905550613f31600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206000015483612f3290919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060000181905550613fb1601060008681526020019081526020016000206004015482612f3290919063ffffffff16565b6010600086815260200190815260200160002060040181905550613ff4601060008681526020019081526020016000206005015483612f3290919063ffffffff16565b60106000868152602001908152602001600020600501819055506140178261447d565b614023848484846144b4565b505b505050565b60006140368383613b03565b9050600081111561419a57614096600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015482612f3290919063ffffffff16565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550614142600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206002015482612f3290919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600201819055505b505050565b60008060026141af846001612f32565b816141b657fe5b0490508291505b818110156141ec5780915060026141dd8285816141d657fe5b0483612f32565b816141e457fe5b0490506141bd565b50919050565b60006141fe82836136a6565b9050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541461429c5761429b81600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461402a565b5b600a54600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555050565b600042905060006010600084815260200190815260200160002060010154821180156143765750600073ffffffffffffffffffffffffffffffffffffffff166010600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156143ba576143b3826143a5600254670de0b6b3a7640000888161439657fe5b046136a690919063ffffffff16565b612f3290919063ffffffff16565b905061440b565b61440860106000858152602001908152602001600020600101546143fa600254670de0b6b3a764000088816143eb57fe5b046136a690919063ffffffff16565b612f3290919063ffffffff16565b90505b61442082600354612f3290919063ffffffff16565b81101561444757806010600085815260200190815260200160002060010181905550614477565b61445c82600354612f3290919063ffffffff16565b60106000858152602001908152602001600020600101819055505b50505050565b600061449360148361371390919063ffffffff16565b90506144aa81600b54612f3290919063ffffffff16565b600b819055505050565b600060646144cd600654856136a690919063ffffffff16565b816144d457fe5b04905061450860646144f1600454866136a690919063ffffffff16565b816144f857fe5b048461372c90919063ffffffff16565b9250600061451f828561372c90919063ffffffff16565b9050600061452f878785876145ae565b905060008111156145505761454d818461372c90919063ffffffff16565b92505b61458b601060008981526020019081526020016000206006015461457d8385612f3290919063ffffffff16565b612f3290919063ffffffff16565b601060008981526020019081526020016000206006018190555050505050505050565b60008060106000878152602001908152602001600020600401546145e3670de0b6b3a7640000866136a690919063ffffffff16565b816145ea57fe5b049050614616601060008881526020019081526020016000206007015482612f3290919063ffffffff16565b60106000888152602001908152602001600020600701819055506000670de0b6b3a764000061464e85846136a690919063ffffffff16565b8161465557fe5b049050614709600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020600201546146fb83670de0b6b3a76400006146e589601060008f8152602001908152602001600020600701546136a690919063ffffffff16565b816146ec57fe5b0461372c90919063ffffffff16565b612f3290919063ffffffff16565b600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020600201819055506147ac670de0b6b3a7640000614795601060008b815260200190815260200160002060040154856136a690919063ffffffff16565b8161479c57fe5b048661372c90919063ffffffff16565b92505050949350505050565b6000813590506147c78161580e565b92915050565b6000813590506147dc81615825565b92915050565b6000813590506147f18161583c565b92915050565b6000815190506148068161583c565b92915050565b60008135905061481b81615853565b92915050565b60008151905061483081615853565b92915050565b60006020828403121561484857600080fd5b6000614856848285016147b8565b91505092915050565b60006020828403121561487157600080fd5b600061487f848285016147cd565b91505092915050565b60008060006060848603121561489d57600080fd5b60006148ab868287016147b8565b93505060206148bc868287016147b8565b92505060406148cd868287016147cd565b9150509250925092565b600080604083850312156148ea57600080fd5b60006148f8858286016147b8565b92505060206149098582860161480c565b9150509250929050565b60006020828403121561492557600080fd5b6000614933848285016147f7565b91505092915050565b60006020828403121561494e57600080fd5b600061495c8482850161480c565b91505092915050565b60006020828403121561497757600080fd5b600061498584828501614821565b91505092915050565b600080604083850312156149a157600080fd5b60006149af8582860161480c565b92505060206149c0858286016147e2565b9150509250929050565b600080604083850312156149dd57600080fd5b60006149eb8582860161480c565b92505060206149fc8582860161480c565b9150509250929050565b600080600080600060a08688031215614a1e57600080fd5b6000614a2c8882890161480c565b9550506020614a3d8882890161480c565b9450506040614a4e8882890161480c565b9350506060614a5f8882890161480c565b9250506080614a708882890161480c565b9150509295509295909350565b614a868161573a565b82525050565b614a958161573a565b82525050565b614aa4816156f2565b82525050565b614ab3816156e0565b82525050565b614ac2816156e0565b82525050565b614ad181615704565b82525050565b614ae081615704565b82525050565b6000614af1826156ae565b614afb81856156c4565b9350614b0b8185602086016157ca565b80840191505092915050565b614b208161574c565b82525050565b614b2f81615770565b82525050565b614b3e81615794565b82525050565b6000614b4f826156b9565b614b5981856156cf565b9350614b698185602086016157ca565b614b72816157fd565b840191505092915050565b6000614b8a6007836156cf565b91507f6d617820313030000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bca6006836156cf565b91507f6d696e20383000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c0a602e836156cf565b91507f4572726f723a204f6e6c79206f776e65722063616e2068616e646c652074686960008301527f73206f7065726174696f6e203b290000000000000000000000000000000000006020830152604082019050919050565b6000614c706011836156cf565b91507f736f7272792068756d616e73206f6e6c790000000000000000000000000000006000830152602082019050919050565b6000614cb0601c836156cf565b91507f6f6e6c79206f776e6572206a7573742063616e206163746976617465000000006000830152602082019050919050565b6000614cf06024836156cf565b91507f736166655472616e736665724554483a20424e42207472616e7366657220666160008301527f696c6564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d56600f836156cf565b91507f6d696e20302e30303030303030303100000000000000000000000000000000006000830152602082019050919050565b6000614d96600a836156cf565b91507f6f6e6c79206f776e6572000000000000000000000000000000000000000000006000830152602082019050919050565b6000614dd66013836156cf565b91507f536166654d617468206d756c206661696c6564000000000000000000000000006000830152602082019050919050565b6000614e166000836156c4565b9150600082019050919050565b6000614e306013836156cf565b91507f536166654d61746820737562206661696c6564000000000000000000000000006000830152602082019050919050565b6000614e706015836156cf565b91507f4572726f723a20696e76616c696420616d6f756e7400000000000000000000006000830152602082019050919050565b6000614eb06013836156cf565b91507f536166654d61746820616464206661696c6564000000000000000000000000006000830152602082019050919050565b6000614ef0601b836156cf565b91507f666f6d6f6c6f74746f20616c72656164792061637469766174656400000000006000830152602082019050919050565b6000614f306011836156cf565b91507f697473206e6f74207265616479207965740000000000000000000000000000006000830152602082019050919050565b6000614f70601f836156cf565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000614fb06030836156cf565b91507f4572726f723a2043616e6e6f7420776974686472617720746f2074686520666f60008301527f756e646174696f6e2061646472657373000000000000000000000000000000006020830152604082019050919050565b6000615016600a836156cf565b91507f6d617820313030303030000000000000000000000000000000000000000000006000830152602082019050919050565b61505281615730565b82525050565b61506181615730565b82525050565b60006150738284614ae6565b915081905092915050565b600061508982614e09565b9150819050919050565b60006020820190506150a86000830184614aaa565b92915050565b60006020820190506150c36000830184614a7d565b92915050565b60006060820190506150de6000830186614a8c565b6150eb6020830185614ab9565b6150f86040830184615058565b949350505050565b60006040820190506151156000830185614a7d565b6151226020830184615049565b9392505050565b600060608201905061513e6000830186614ab9565b61514b6020830185614a8c565b6151586040830184614b35565b949350505050565b60006060820190506151756000830186614ab9565b6151826020830185614ab9565b61518f6040830184614b35565b949350505050565b60006080820190506151ac6000830187614ab9565b6151b96020830186614ab9565b6151c66040830185615058565b6151d36060830184614a9b565b95945050505050565b600060e0820190506151f1600083018a614ab9565b6151fe6020830189614ab9565b61520b6040830188615058565b6152186060830187615058565b6152256080830186614a8c565b61523260a0830185615058565b61523f60c0830184614ad7565b98975050505050505050565b600061010082019050615261600083018b614aaa565b61526e602083018a615049565b61527b6040830189614ac8565b6152886060830188615049565b6152956080830187615049565b6152a260a0830186615049565b6152af60c0830185615049565b6152bc60e0830184615049565b9998505050505050505050565b60006020820190506152de6000830184614ac8565b92915050565b60006020820190506152f96000830184614b17565b92915050565b60006020820190506153146000830184614b26565b92915050565b600060208201905081810360008301526153348184614b44565b905092915050565b6000602082019050818103600083015261535581614b7d565b9050919050565b6000602082019050818103600083015261537581614bbd565b9050919050565b6000602082019050818103600083015261539581614bfd565b9050919050565b600060208201905081810360008301526153b581614c63565b9050919050565b600060208201905081810360008301526153d581614ca3565b9050919050565b600060208201905081810360008301526153f581614ce3565b9050919050565b6000602082019050818103600083015261541581614d49565b9050919050565b6000602082019050818103600083015261543581614d89565b9050919050565b6000602082019050818103600083015261545581614dc9565b9050919050565b6000602082019050818103600083015261547581614e23565b9050919050565b6000602082019050818103600083015261549581614e63565b9050919050565b600060208201905081810360008301526154b581614ea3565b9050919050565b600060208201905081810360008301526154d581614ee3565b9050919050565b600060208201905081810360008301526154f581614f23565b9050919050565b6000602082019050818103600083015261551581614f63565b9050919050565b6000602082019050818103600083015261553581614fa3565b9050919050565b6000602082019050818103600083015261555581615009565b9050919050565b60006020820190506155716000830184615049565b92915050565b600060408201905061558c6000830185615049565b6155996020830184615049565b9392505050565b60006080820190506155b56000830187615049565b6155c26020830186615049565b6155cf6040830185615049565b6155dc6060830184615049565b95945050505050565b600060a0820190506155fa6000830188615049565b6156076020830187615049565b6156146040830186615049565b6156216060830185615049565b81810360808301526156338184614b44565b90509695505050505050565b600060e082019050615654600083018a615049565b6156616020830189615049565b61566e6040830188615049565b61567b6060830187615049565b6156886080830186615049565b61569560a0830185615049565b6156a260c0830184614aaa565b98975050505050505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006156eb82615710565b9050919050565b60006156fd82615710565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615745826157a6565b9050919050565b60006157578261575e565b9050919050565b600061576982615710565b9050919050565b600061577b82615782565b9050919050565b600061578d82615710565b9050919050565b600061579f82615730565b9050919050565b60006157b1826157b8565b9050919050565b60006157c382615710565b9050919050565b60005b838110156157e85780820151818401526020810190506157cd565b838111156157f7576000848401525b50505050565b6000601f19601f8301169050919050565b615817816156e0565b811461582257600080fd5b50565b61582e816156f2565b811461583957600080fd5b50565b61584581615704565b811461585057600080fd5b50565b61585c81615730565b811461586757600080fd5b5056fea264697066735822122064a525e146fe1eea33622f0eeb2d76c8744c157f206415f19b0facabceee063764736f6c63430006080033

Library Used



Deployed ByteCode Sourcemap

19576:26717:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27181:565;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27181:565:0;;;:::i;:::-;;;;;;;;;;;;;;;;19830:35;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19830:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;19687:41;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19687:41:0;;;:::i;:::-;;;;;;;;;;;;;;;;44889:102;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44889:102:0;;;;;;;;;;;;;;;;:::i;:::-;;43503:846;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43503:846:0;;;;;;;;;;;;;;;;:::i;:::-;;20239:30;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20239:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;25711:201;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25711:201:0;;;;;;;;;;;;;;;;:::i;:::-;;20998:48;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20998:48:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;44999:194;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44999:194:0;;;;;;;;;;;;;;;;:::i;:::-;;26797:126;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26797:126:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25983:790;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25983:790:0;;;:::i;:::-;;19752:33;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19752:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;21158:36;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21158:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;20913:78;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20913:78:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26931:94;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26931:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;46117:173;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46117:173:0;;;;;;;;;;;;;;;;:::i;:::-;;20582:19;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20582:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;22679:180;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22679:180:0;;;;;;;;;;;;;;;;:::i;:::-;;45935:174;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45935:174:0;;;:::i;:::-;;30357:463;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30357:463:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;20519:31;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20519:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;19934:33;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19934:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;20666:24;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20666:24:0;;;:::i;:::-;;;;;;;;;;;;;;;;44385:368;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44385:368:0;;;;;;;;;;;;;;;;:::i;:::-;;38582:71;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38582:71:0;;;:::i;:::-;;23858:1611;;;;;;;;;;;;;;;;:::i;:::-;;22467:121;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22467:121:0;;;;;;;;;;;;;;;;:::i;:::-;;20126:33;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20126:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;20827:48;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20827:48:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;27840:445;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27840:445:0;;;:::i;:::-;;;;;;;;;;;;;;;;22942:311;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22942:311:0;;;;;;;;;;;;;;;;:::i;:::-;;35956:477;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35956:477:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36622:531;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36622:531:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43464:30;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43464:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;45201:357;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45201:357:0;;;:::i;:::-;;20445:27;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20445:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;20710:21;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20710:21:0;;;:::i;:::-;;;;;;;;;;;;;;;;20017:30;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20017:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;31149:566;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31149:566:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20348:34;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20348:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;28420:1310;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28420:1310:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;23328:338;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23328:338:0;;;;;;;;;;;;;;;;:::i;:::-;;44761:120;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44761:120:0;;;;;;;;;;;;;;;;:::i;:::-;;27181:565;27240:7;27293:12;27308:4;;27293:19;;27347:12;27362:3;27347:18;;27420:6;:12;27427:4;27420:12;;;;;;;;;;;:17;;;27413:4;:24;:118;;;;;27450:6;:12;27457:4;27450:12;;;;;;;;;;;:16;;;27442:4;:24;;:88;;;;27478:6;:12;27485:4;27478:12;;;;;;;;;;;:16;;;27471:4;:23;:58;;;;;27527:1;27498:31;;:6;:12;27505:4;27498:12;;;;;;;;;;;:17;;;;;;;;;;;;:31;;;27471:58;27442:88;27413:118;27409:312;;;27554:72;27606:19;27555:42;27577:19;27555:6;:12;27562:4;27555:12;;;;;;;;;;;:17;;;:21;;:42;;;;:::i;:::-;27554:51;;:72;;;;:::i;:::-;27546:81;;;;;;27409:312;27706:14;27698:23;;;;27181:565;;:::o;19830:35::-;;;;:::o;19687:41::-;;;;;;;;;;;;;;;;;;;:::o;44889:102::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;44978:5:::1;44964:11;;:19;;;;;;;;;;;;;;;;;;44889:102:::0;:::o;43503:846::-;43704:6;;;;;;;;;;;43690:20;;:10;:20;;;43668:98;;;;;;;;;;;;;;;;;;;;;;43834:5;43820:19;;:10;;;;;;;;;;;:19;;;43812:59;;;;;;;;;;;;;;;;;;;;;;43907:25;43917:14;43907:9;:25::i;:::-;43974:27;43987:13;43974:12;:27::i;:::-;44044:30;44060:13;44044:15;:30::i;:::-;44115:34;44130:18;44115:14;:34::i;:::-;44209:4;44196:10;;:17;;;;;;;;;;;;;;;;;;44268:1;44261:4;:8;;;;44297:3;44280:6;:9;44287:1;44280:9;;;;;;;;;;;:14;;:20;;;;44333:8;;44327:3;:14;44311:6;:9;44318:1;44311:9;;;;;;;;;;;:13;;:30;;;;43503:846;;;:::o;20239:30::-;;;;:::o;25711:201::-;21705:4;21691:18;;:10;;;;;;;;;;;:18;;;21683:48;;;;;;;;;;;;;;;;;;;;;;21892:10:::1;21879:23;;:9;:23;;;21871:53;;;;;;;;;;;;;;;;;;;;;;25798:4:::2;22066:29;22088:6;22066:21;:29::i;:::-;18498:1:::3;19102:7;;:19;;19094:63;;;;;;;;;;;;;;;;;;;;;;18498:1;19235:7;:18;;;;25876:28:::4;25887:10;25899:4;25876:10;:28::i;:::-;18454:1:::3;19414:7;:22;;;;21935:1:::2;25711:201:::0;:::o;20998:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44999:194::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;45116:10:::1;45097:16;:29;;;;45168:17;45137:28;:48;;;;44999:194:::0;;:::o;26797:126::-;26865:4;26889:10;:26;26900:14;26889:26;;;;;;;;;;;;;;;;;;;;;;;;;26882:33;;26797:126;;;:::o;25983:790::-;21705:4;21691:18;;:10;;;;;;;;;;;:18;;;21683:48;;;;;;;;;;;;;;;;;;;;;;21892:10:::1;21879:23;;:9;:23;;;21871:53;;;;;;;;;;;;;;;;;;;;;;18498:1:::2;19102:7;;:19;;19094:63;;;;;;;;;;;;;;;;;;;;;;18498:1;19235:7;:18;;;;26113:12:::3;26128:4;;26113:19;;26167:12;26182:3;26167:18;;26240:12;26353:6;:12;26360:4;26353:12;;;;;;;;;;;:16;;;26346:4;:23;:54;;;;;26395:5;26373:27;;:6;:12;26380:4;26373:12;;;;;;;;;;;:18;;;;;;;;;;;;:27;;;26346:54;:89;;;;;26433:1;26404:31;;:6;:12;26411:4;26404:12;;;;;;;;;;;:17;;;;;;;;;;;;:31;;;;26346:89;26342:204;;;26530:4;26509:6;:12;26516:4;26509:12;;;;;;;;;;;:18;;;:25;;;;;;;;;;;;;;;;;;26342:204;26596:28;26613:10;26596:16;:28::i;:::-;26589:35;;26638:12;26655:10;:15;;26679:4;26695:1;26685:12;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::3;2:2;26685:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;26685:12:0;;;;26655:43;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;26637:61:0;;;26717:7;26709:56;;;;;;;;;;;;;;;;;;;;;;19266:1;;;;18454::::2;19414:7;:22;;;;25983:790::o:0;19752:33::-;;;;:::o;21158:36::-;;;;:::o;20913:78::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26931:94::-;26974:7;27009;;;;;;;;;;;26994:23;;26931:94;:::o;46117:173::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;46201:12:::1;46216:31;46233:13;46216:16;:31::i;:::-;46201:46;;46258:24;46271:4;46277;46258:12;:24::i;:::-;;21494:1;46117:173:::0;:::o;20582:19::-;;;;:::o;22679:180::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;22785:20:::1;22762:13;;:44;;;;;;;;;;;;;;;;;;22817:34;22830:20;22817:12;:34::i;:::-;22679:180:::0;:::o;45935:174::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;46015:1:::1;46003:9;;:13;45999:103;;;46033:29;46046:9;;46057:4;46033:12;:29::i;:::-;;46089:1;46077:9;:13;;;;45999:103;45935:174::o:0;30357:463::-;30424:7;30433;30442;30451;30460;30469;30478;30531:12;30546:4;;30531:19;;30590:4;30609:6;:12;30616:4;30609:12;;;;;;;;;;;:17;;;30641:6;:12;30648:4;30641:12;;;;;;;;;;;:16;;;30672:6;:12;30679:4;30672:12;;;;;;;;;;;:17;;;30704:6;:12;30711:4;30704:12;;;;;;;;;;;:16;;;30735:6;:12;30742:4;30735:12;;;;;;;;;;;:16;;;30766:6;:12;30773:4;30766:12;;;;;;;;;;;:17;;;;;;;;;;;;30563:249;;;;;;;;;;;;;;;30357:463;;;;;;;:::o;20519:31::-;;;;;;;;;;;;;:::o;19934:33::-;;;;:::o;20666:24::-;;;;:::o;44385:368::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;44598:9:::1;44588:7;:19;;;;44628:8;44618:7;:18;;;;44657:8;44647:7;:18;;;;44690:12;44676:11;:26;;;;44730:15;44713:14;:32;;;;44385:368:::0;;;;;:::o;38582:71::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;38635:10:::1;:8;:10::i;:::-;38582:71::o:0;23858:1611::-;21705:4;21691:18;;:10;;;;;;;;;;;:18;;;21683:48;;;;;;;;;;;;;;;;;;;;;;21892:10:::1;21879:23;;:9;:23;;;21871:53;;;;;;;;;;;;;;;;;;;;;;18498:1:::2;19102:7;;:19;;19094:63;;;;;;;;;;;;;;;;;;;;;;18498:1;19235:7;:18;;;;24066:12:::3;24081:4;;24066:19;;24096:23;24122:14;;24096:40;;24170:21;24151:6;:12;24158:4;24151:12;;;;;;;;;;;:16;;;:40;24147:119;;;24253:1;24236:14;;:18;;;;;;24218:36;;24147:119;24278:19;24300:41;24337:3;24301:30;24315:15;24301:9;:13;;:30;;;;:::i;:::-;24300:36;;:41;;;;:::i;:::-;24278:63;;24354:13;24370:1:::0;24354:17:::3;;24398:4;24388:14;;:6;:14;;;24384:789;;;24439:1;24427:9;:13;24419:47;;;;;;;;;;;;;;;;;;;;;;24524:37;24549:11;24533:9;24524:24;;:37;;;;:::i;:::-;24516:45;;24384:789;;;24614:1;24602:9;:13;24594:47;;;;;;;;;;;;;;;;;;;;;;24708:5;:22;24731:10;24751:13;;;;;;;;;;;24767:9;24708:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::3;2:2;24708:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::3;77:16;74:1;67:27;5:2;24708:69:0;;;;24839:26;24853:11;24839:9;:13;;:26;;;;:::i;:::-;24827:38;;24882:24;24909:21;24882:48;;24947:5;:22;24978:7;;;;;;;;;;;24996:13;;;;;;;;;;;25012:9;25031:4;24947:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::3;2:2;24947:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::3;77:16;74:1;67:27;5:2;24947:90:0;;;;25054:23;25080:21;25054:47;;25124:37;25144:16;25124:15;:19;;:37;;;;:::i;:::-;25116:45;;24384:789;;;25208:21;25232:26;25245:5;25252;25232:12;:26::i;:::-;25208:50;;25279:24;25289:13;25279:5;:9;;:24;;;;:::i;:::-;25271:32;;25373:28;25395:5;25373:21;:28::i;:::-;25435:26;25443:10;25455:5;25435:7;:26::i;:::-;19266:1;;;;;18454::::2;19414:7;:22;;;;23858:1611:::0;;:::o;22467:121::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;22565:14:::1;22538:7;;:42;;;;;;;;;;;;;;;;;;22467:121:::0;:::o;20126:33::-;;;;:::o;20827:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27840:445::-;27899:7;27952:12;27967:4;;27952:19;;28006:12;28021:3;28006:18;;28048:6;:12;28055:4;28048:12;;;;;;;;;;;:16;;;28041:4;:23;28037:240;;;28090:6;:12;28097:4;28090:12;;;;;;;;;;;:17;;;28083:4;:24;28079:159;;;28134:28;28157:4;28135:6;:12;28142:4;28135:12;;;;;;;;;;;:16;;;28134:22;;:28;;;;:::i;:::-;28126:37;;;;;;28079:159;28208:29;28232:4;28209:6;:12;28216:4;28209:12;;;;;;;;;;;:17;;;28208:23;;:29;;;;:::i;:::-;28200:38;;;;;;28037:240;28275:1;28267:10;;;;27840:445;;:::o;22942:311::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;23044:6:::1;;;;;;;;;;;23030:20;;:10;:20;;;23022:43;;;;;;;;;;;;;;;;;;;;;;23103:2;23084:15;:21;;23076:40;;;;;;;;;;;;;;;;;;;;;;23170:3;23151:15;:22;;23143:42;;;;;;;;;;;;;;;;;;;;;;23230:15;23213:14;:32;;;;22942:311:::0;:::o;35956:477::-;36046:7;36093:12;36108:3;36093:18;;36166:6;:12;36173:4;36166:12;;;;;;;;;;;:17;;;36159:4;:24;:118;;;;;36196:6;:12;36203:4;36196:12;;;;;;;;;;;:16;;;36188:4;:24;;:88;;;;36224:6;:12;36231:4;36224:12;;;;;;;;;;;:16;;;36217:4;:23;:58;;;;;36273:1;36244:31;;:6;:12;36251:4;36244:12;;;;;;;;;;;:17;;;;;;;;;;;;:31;;;36217:58;36188:88;36159:118;36155:270;;;36300:32;36327:4;36301:6;:12;36308:4;36301:12;;;;;;;;;;;:16;;;36300:26;;:32;;;;:::i;:::-;36292:41;;;;;36155:270;36411:13;36412:4;36411:11;:13::i;:::-;36403:22;;;35956:477;;;;;:::o;36622:531::-;36693:7;36746:12;36761:4;;36746:19;;36800:12;36815:3;36800:18;;36873:6;:12;36880:4;36873:12;;;;;;;;;;;:17;;;36866:4;:24;:118;;;;;36903:6;:12;36910:4;36903:12;;;;;;;;;;;:16;;;36895:4;:24;;:88;;;;36931:6;:12;36938:4;36931:12;;;;;;;;;;;:16;;;36924:4;:23;:58;;;;;36980:1;36951:31;;:6;:12;36958:4;36951:12;;;;;;;;;;;:17;;;;;;;;;;;;:31;;;36924:58;36895:88;36866:118;36862:283;;;37007:44;37045:5;37008:28;37030:5;37008:6;:12;37015:4;37008:12;;;;;;;;;;;:17;;;:21;;:28;;;;:::i;:::-;37007:37;;:44;;;;:::i;:::-;36999:53;;;;;;36862:283;37131:13;37132:5;37131:11;:13::i;:::-;37123:22;;;;36622:531;;;;:::o;43464:30::-;;;;;;;;;;;;;:::o;45201:357::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;45259:9:::1;45282:10;45273:26;;45308:21;45273:61;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;45258:76:0;;;45353:4;45345:65;;;;;;;;;;;;;;;;;;;;;;45430:13;;;;;;;;;;;45423:30;;;45468:10;45500:13;;;;;;;;;;;45493:31;;;45533:4;45493:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;45493:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;45493:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45493:46:0;;;;;;;;;45423:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;45423:127:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;45423:127:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45423:127:0;;;;;;;;;;21494:1;45201:357::o:0;20445:27::-;;;;;;;;;;;;;:::o;20710:21::-;;;;;;;;;;;;;:::o;20017:30::-;;;;:::o;31149:566::-;31232:7;31241;31250;31259;31312:12;31327:4;;31312:19;;31463:9;:16;31473:5;31463:16;;;;;;;;;;;;;;;:22;31480:4;31463:22;;;;;;;;;;;:27;;;31505:5;:12;31511:5;31505:12;;;;;;;;;;;;;;;:16;;;31536:70;31559:46;31580:5;31587;:12;31593:5;31587:12;;;;;;;;;;;;;;;:17;;;31559:20;:46::i;:::-;31537:5;:12;31543:5;31537:12;;;;;;;;;;;;;;;:16;;;31536:22;;:70;;;;:::i;:::-;31621:9;:16;31631:5;31621:16;;;;;;;;;;;;;;;:22;31638:4;31621:22;;;;;;;;;;;:26;;;31436:271;;;;;;;;;31149:566;;;;;:::o;20348:34::-;;;;:::o;28420:1310::-;28495:7;28504;28557:12;28572:4;;28557:19;;28706:6;:12;28713:4;28706:12;;;;;;;;;;;:16;;;28700:3;:22;:53;;;;;28748:5;28726:27;;:6;:12;28733:4;28726:12;;;;;;;;;;;:18;;;;;;;;;;;;:27;;;28700:53;:88;;;;;28786:1;28757:31;;:6;:12;28764:4;28757:12;;;;;;;;;;;:17;;;;;;;;;;;;:31;;;;28700:88;28696:1027;;;28875:4;28854:25;;:6;:12;28861:4;28854:12;;;;;;;;;;;:17;;;;;;;;;;;;:25;;;28850:590;;;28956:69;29021:3;28979:38;29002:14;;28980:6;:12;28987:4;28980:12;;;;;;;;;;;:16;;;28979:22;;:38;;;;:::i;:::-;28978:46;;;;;;28957:5;:11;28963:4;28957:11;;;;;;;;;;;;;;;:15;;;28956:21;;:69;;;;:::i;:::-;29044:88;29066:65;29104:9;:15;29114:4;29104:15;;;;;;;;;;;;;;;:21;29120:4;29104:21;;;;;;;;;;;:26;;;29066:33;29088:4;29094;29066:21;:33::i;:::-;:37;;:65;;;;:::i;:::-;29045:5;:11;29051:4;29045:11;;;;;;;;;;;;;;;:15;;;29044:21;;:88;;;;:::i;:::-;28913:238;;;;;;;28850:590;29283:5;:11;29289:4;29283:11;;;;;;;;;;;;;;;:15;;;29317:88;29339:65;29377:9;:15;29387:4;29377:15;;;;;;;;;;;;;;;:21;29393:4;29377:21;;;;;;;;;;;:26;;;29339:33;29361:4;29367;29339:21;:33::i;:::-;:37;;:65;;;;:::i;:::-;29318:5;:11;29324:4;29318:11;;;;;;;;;;;;;;;:15;;;29317:21;;:88;;;;:::i;:::-;29240:184;;;;;;;28696:1027;29599:5;:11;29605:4;29599:11;;;;;;;;;;;;;;;:15;;;29629:67;29651:44;29672:4;29678:5;:11;29684:4;29678:11;;;;;;;;;;;;;;;:16;;;29651:20;:44::i;:::-;29630:5;:11;29636:4;29630:11;;;;;;;;;;;;;;;:15;;;29629:21;;:67;;;;:::i;:::-;29564:147;;;;;28420:1310;;;;:::o;23328:338::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;23424:6:::1;;;;;;;;;;;23410:20;;:10;:20;;;23402:43;;;;;;;;;;;;;;;;;;;;;;23458:5;:26;23485:14;23509:7;;;;;;;;;;;23519:12;23458:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23458:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23458:74:0;;;;23543:5;:26;23570:14;23594:4;23601:12;23543:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23543:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23543:71:0;;;;23654:4;23625:10;:26;23636:14;23625:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;23328:338:::0;:::o;44761:120::-;21426:6;;;;;;;;;;;21412:20;;:10;:20;;;21404:79;;;;;;;;;;;;;;;;;;;;;;44862:11:::1;44849:10;:24;;;;44761:120:::0;:::o;1503:185::-;1576:9;1611:1;1607;:5;1603:9;;1636:1;1631;:6;;1623:38;;;;;;;;;;;;;;;;;;;;;;1679:1;1672:8;;1503:185;;;;:::o;3392:181::-;3483:7;3515:49;3535:28;3539:23;3552:9;3539:8;:12;;:23;;;;:::i;:::-;3535:3;:28::i;:::-;3516:13;3520:8;3516:3;:13::i;:::-;3515:19;;:49;;;;:::i;:::-;3508:57;;3392:181;;;;:::o;22123:238::-;22212:10;22202:6;:20;;22194:48;;;;;;;;;;;;;;;;;;;;;;22295:24;22285:6;:34;;22277:57;;;;;;;;;;;;;;;;;;;;;;22123:238;:::o;32980:1002::-;33085:12;33100:4;;33085:19;;33139:12;33154:3;33139:18;;33212:6;:12;33219:4;33212:12;;;;;;;;;;;:17;;;33205:4;:24;:118;;;;;33242:6;:12;33249:4;33242:12;;;;;;;;;;;:16;;;33234:4;:24;;:88;;;;33270:6;:12;33277:4;33270:12;;;;;;;;;;;:16;;;33263:4;:23;:58;;;;;33319:1;33290:31;;:6;:12;33297:4;33290:12;;;;;;;;;;;:17;;;;;;;;;;;;:31;;;33263:58;33234:88;33205:118;33201:774;;;33584:32;33611:4;33584:22;33601:4;33584:16;:22::i;:::-;:26;;:32;;;;:::i;:::-;33566:5;:11;33572:4;33566:11;;;;;;;;;;;;;;;:15;;:50;;;;33659:22;33664:4;33670;33676;33659;:22::i;:::-;33201:774;;;33781:6;:12;33788:4;33781:12;;;;;;;;;;;:16;;;33774:4;:23;:54;;;;;33823:5;33801:27;;:6;:12;33808:4;33801:12;;;;;;;;;;;:18;;;;;;;;;;;;:27;;;33774:54;33770:205;;;33932:4;33911:6;:12;33918:4;33911:12;;;;;;;;;;;:18;;;:25;;;;;;;;;;;;;;;;;;33951:10;:8;:10::i;:::-;33770:205;33201:774;32980:1002;;;;:::o;42664:564::-;42731:7;42785:38;42800:4;42806:5;:11;42812:4;42806:11;;;;;;;;;;;;;;;:16;;;42785:14;:38::i;:::-;42860:17;42880:38;42902:5;:11;42908:4;42902:11;;;;;;;;;;;;;;;:15;;;42881:5;:11;42887:4;42881:11;;;;;;;;;;;;;;;:15;;;42880:21;;:38;;;;:::i;:::-;42860:58;;42945:1;42933:9;:13;42929:261;;;42990:1;42972:5;:11;42978:4;42972:11;;;;;;;;;;;;;;;:15;;:19;;;;43024:1;43006:5;:11;43012:4;43006:11;;;;;;;;;;;;;;;:15;;:19;;;;43069:21;43093:30;43106:9;43117:5;43093:12;:30::i;:::-;43069:54;;43150:28;43164:13;43150:9;:13;;:28;;;;:::i;:::-;43138:40;;42929:261;;43210:9;43202:18;;;42664:564;;;:::o;45566:361::-;45644:7;45670:5;:18;45711:7;;;;;;;;;;;45742:13;;;;;;;;;;;45771:16;;45802:28;;45845:11;;;;;;;;;;;45871:10;45896:12;45670:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45670:249:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45670:249:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45670:249:0;;;;;;;;;45663:256;;45566:361;;;;:::o;37810:762::-;37887:12;37902:4;;37887:19;;37969:15;37987:6;:12;37994:4;37987:12;;;;;;;;;;;:17;;;;;;;;;;;;37969:35;;38049:12;38064:6;:12;38071:4;38064:12;;;;;;;;;;;:16;;;38049:31;;38208:12;38252:3;38224:24;38233:14;;38224:4;:8;;:24;;;;:::i;:::-;38223:32;;;;;;38208:47;;38266:12;38281:14;38290:4;38281;:8;;:14;;;;:::i;:::-;38266:29;;38356:28;38365:5;:14;38371:7;38365:14;;;;;;;;;;;;;;;:18;;;38356:4;:8;;:28;;;;:::i;:::-;38335:5;:14;38341:7;38335:14;;;;;;;;;;;;;;;:18;;:49;;;;38426:4;;:6;;;;;;;;;;;;;38443;;;;;;;38480:3;38460:6;:12;38467:4;38460:12;;;;;;;;;;;:17;;:23;;;;38513:17;38521:8;;38513:3;:7;;:17;;;;:::i;:::-;38494:6;:12;38501:4;38494:12;;;;;;;;;;;:16;;:36;;;;38560:4;38541:6;:12;38548:4;38541:12;;;;;;;;;;;:16;;:23;;;;37810:762;;;;;:::o;507:246::-;580:9;616:1;611;:6;607:47;;;641:1;634:8;;;;607:47;672:1;668;:5;664:9;;701:1;696;692;:5;;;;;;:10;684:42;;;;;;;;;;;;;;;;;;;;;;744:1;737:8;;507:246;;;;;:::o;848:288::-;906:7;1005:9;1021:1;1017;:5;;;;;;1005:17;;1127:1;1120:8;;;848:288;;;;:::o;1261:167::-;1334:7;1372:1;1367;:6;;1359:38;;;;;;;;;;;;;;;;;;;;;;1419:1;1415;:5;1408:12;;1261:167;;;;:::o;31897:900::-;32000:12;32015:4;;32000:19;;32054:12;32069:3;32054:18;;32127:6;:12;32134:4;32127:12;;;;;;;;;;;:17;;;32120:4;:24;:118;;;;;32157:6;:12;32164:4;32157:12;;;;;;;;;;;:16;;;32149:4;:24;;:88;;;;32185:6;:12;32192:4;32185:12;;;;;;;;;;;:16;;;32178:4;:23;:58;;;;;32234:1;32205:31;;:6;:12;32212:4;32205:12;;;;;;;;;;;:17;;;;;;;;;;;;:31;;;32178:58;32149:88;32120:118;32116:674;;;32290:23;32295:4;32301;32307:5;32290:4;:23::i;:::-;32116:674;;;32456:6;:12;32463:4;32456:12;;;;;;;;;;;:16;;;32449:4;:23;:54;;;;;32498:5;32476:27;;:6;:12;32483:4;32476:12;;;;;;;;;;;:18;;;;;;;;;;;;:27;;;32449:54;32445:232;;;32628:4;32607:6;:12;32614:4;32607:12;;;;;;;;;;;:18;;;:25;;;;;;;;;;;;;;;;;;32651:10;:8;:10::i;:::-;32445:232;32752:26;32772:5;32752;:11;32758:4;32752:11;;;;;;;;;;;;;;;:15;;;:19;;:26;;;;:::i;:::-;32734:5;:11;32740:4;32734:11;;;;;;;;;;;;;;;:15;;:44;;;;32116:674;31897:900;;;;:::o;2969:177::-;3058:7;3090:47;3123:13;3128:7;3123:4;:13::i;:::-;3090:28;3095:22;3109:7;3096;3095:13;;:22;;;;:::i;:::-;3090:4;:28::i;:::-;:32;;:47;;;;:::i;:::-;3083:55;;2969:177;;;;:::o;3763:308::-;3828:7;4053:9;3861:187;4015:32;3862:147;3863:138;3936:64;3864:66;3902:27;3865:31;3876:19;3866:4;3865:10;;:31;;;;:::i;:::-;3864:37;;:66;;;;:::i;:::-;3863:72;;:138;;;;:::i;:::-;3862:145;:147::i;:::-;3861:153;;:187;;;;:::i;:::-;3860:203;;;;;;3853:210;;3763:308;;;:::o;4266:231::-;4331:7;4462:26;4463:19;4462:24;:26::i;:::-;4364:93;4454:1;4396:53;4418:30;4428:19;4418:5;:9;;:30;;;;:::i;:::-;4397:15;4396:21;;:53;;;;:::i;:::-;4395:61;;;;;;4364:26;4379:10;:5;:8;:10::i;:::-;4365:8;4364:14;;:26;;;;:::i;:::-;:30;;:93;;;;:::i;:::-;4363:126;;;;;;4356:133;;4266:231;;;:::o;35468:264::-;35567:7;35600:123;35692:9;:15;35702:4;35692:15;;;;;;;;;;;;;;;:25;35708:8;35692:25;;;;;;;;;;;:30;;;35666:19;35602:59;35630:9;:15;35640:4;35630:15;;;;;;;;;;;;;;;:25;35646:8;35630:25;;;;;;;;;;;:30;;;35603:6;:16;35610:8;35603:16;;;;;;;;;;;:21;;;35602:27;;:59;;;;:::i;:::-;35601:85;;;;;;35600:91;;:123;;;;:::i;:::-;35592:132;;35468:264;;;;:::o;29823:217::-;29919:7;30011:19;29954:53;29980:9;:15;29990:4;29980:15;;;;;;;;;;;;;;;:21;29996:4;29980:21;;;;;;;;;;;:26;;;29956:6;:12;29963:4;29956:12;;;;;;;;;;;:17;;;29954:25;;:53;;;;:::i;:::-;29953:77;;;;;;29944:88;;29823:217;;;;:::o;34107:1192::-;34264:1;34234:9;:15;34244:4;34234:15;;;;;;;;;;;;;;;:21;34250:4;34234:21;;;;;;;;;;;:26;;;:31;34230:68;;;34280:18;34293:4;34280:12;:18::i;:::-;34230:68;34378:10;34371:4;:17;34367:925;;;34450:13;34466:32;34493:4;34467:6;:12;34474:4;34467:12;;;;;;;;;;;:16;;;34466:26;;:32;;;;:::i;:::-;34450:48;;34580:19;34571:5;:28;34567:239;;34633:24;34645:5;34652:4;34633:11;:24::i;:::-;34739:4;34718:25;;:6;:12;34725:4;34718:12;;;;;;;;;;;:17;;;;;;;;;;;;:25;;;34714:76;;34786:4;34766:6;:12;34773:4;34766:12;;;;;;;;;;;:17;;;:24;;;;;;;;;;;;;;;;;;34714:76;34567:239;34881:37;34891:9;:15;34901:4;34891:15;;;;;;;;;;;;;;;:21;34907:4;34891:21;;;;;;;;;;;:26;;;34881:5;:9;;:37;;;;:::i;:::-;34852:9;:15;34862:4;34852:15;;;;;;;;;;;;;;;:21;34868:4;34852:21;;;;;;;;;;;:26;;:66;;;;34961:35;34970:9;:15;34980:4;34970:15;;;;;;;;;;;;;;;:21;34986:4;34970:21;;;;;;;;;;;:25;;;34961:4;:8;;:35;;;;:::i;:::-;34933:9;:15;34943:4;34933:15;;;;;;;;;;;;;;;:21;34949:4;34933:21;;;;;;;;;;;:25;;:63;;;;35062:28;35072:6;:12;35079:4;35072:12;;;;;;;;;;;:17;;;35062:5;:9;;:28;;;;:::i;:::-;35042:6;:12;35049:4;35042:12;;;;;;;;;;;:17;;:48;;;;35124:26;35133:6;:12;35140:4;35133:12;;;;;;;;;;;:16;;;35124:4;:8;;:26;;;;:::i;:::-;35105:6;:12;35112:4;35105:12;;;;;;;;;;;:16;;:45;;;;35198:24;35217:4;35198:18;:24::i;:::-;35237:43;35256:4;35262;35268;35274:5;35237:18;:43::i;:::-;34367:925;;34107:1192;;;:::o;38757:445::-;38842:17;38862:36;38883:4;38889:8;38862:20;:36::i;:::-;38842:56;;38925:1;38913:9;:13;38909:286;;;39003:30;39017:5;:11;39023:4;39017:11;;;;;;;;;;;;;;;:15;;;39003:9;:13;;:30;;;;:::i;:::-;38985:5;:11;38991:4;38985:11;;;;;;;;;;;;;;;:15;;:48;;;;39138:45;39152:9;:15;39162:4;39152:15;;;;;;;;;;;;;;;:25;39168:8;39152:25;;;;;;;;;;;:30;;;39138:9;:13;;:45;;;;:::i;:::-;39105:9;:15;39115:4;39105:15;;;;;;;;;;;;;;;:25;39121:8;39105:25;;;;;;;;;;;:30;;:78;;;;38909:286;38757:445;;;:::o;1757:248::-;1820:9;1847;1873:1;1861:8;1865:1;1867;1861:3;:8::i;:::-;1860:14;;;;;;1847:28;;1890:1;1886:5;;1902:96;1913:1;1909;:5;1902:96;;;1944:1;1940:5;;1984:1;1966:14;1975:1;1971;:5;;;;;;1978:1;1966:3;:14::i;:::-;1965:20;;;;;;1960:26;;1902:96;;;1757:248;;;;:::o;2076:111::-;2137:7;2170:8;2174:1;2176;2170:3;:8::i;:::-;2162:17;;2076:111;;;:::o;37357:355::-;37568:1;37548:5;:11;37554:4;37548:11;;;;;;;;;;;;;;;:16;;;:21;37544:78;;37584:38;37599:4;37605:5;:11;37611:4;37605:11;;;;;;;;;;;;;;;:16;;;37584:14;:38::i;:::-;37544:78;37700:4;;37681:5;:11;37687:4;37681:11;;;;;;;;;;;;;;;:16;;:23;;;;37357:355;:::o;39299:696::-;39400:12;39415:3;39400:18;;39489:16;39527:6;:12;39534:4;39527:12;;;;;;;;;;;:16;;;39520:4;:23;:58;;;;;39576:1;39547:31;;:6;:12;39554:4;39547:12;;;;;;;;;;;:17;;;;;;;;;;;;:31;;;39520:58;39516:269;;;39617:58;39670:4;39618:46;39656:7;;39630:19;39620:5;39619:31;;;;;;39618:37;;:46;;;;:::i;:::-;39617:52;;:58;;;;:::i;:::-;39606:69;;39516:269;;;39715:70;39768:6;:12;39775:4;39768:12;;;;;;;;;;;:16;;;39716:46;39754:7;;39728:19;39718:5;39717:31;;;;;;39716:37;;:46;;;;:::i;:::-;39715:52;;:70;;;;:::i;:::-;39704:81;;39516:269;39861:19;39875:4;39862:7;;39861:13;;:19;;;;:::i;:::-;39850:8;:30;39846:141;;;39914:8;39895:6;:12;39902:4;39895:12;;;;;;;;;;;:16;;:27;;;;39846:141;;;39970:17;39982:4;39970:7;;:11;;:17;;;;:::i;:::-;39951:6;:12;39958:4;39951:12;;;;;;;;;;;:16;;:36;;;;39846:141;39299:696;;;;:::o;40071:148::-;40142:12;40157;40166:2;40157:4;:8;;:12;;;;:::i;:::-;40142:27;;40192:19;40206:4;40192:9;;:13;;:19;;;;:::i;:::-;40180:9;:31;;;;40071:148;;:::o;40303:708::-;40449:12;40489:3;40465:20;40474:10;;40465:4;:8;;:20;;;;:::i;:::-;40464:28;;;;;;40449:43;;40567:39;40602:3;40577:21;40586:11;;40577:4;:8;;:21;;;;:::i;:::-;40576:29;;;;;;40567:4;:8;;:39;;;;:::i;:::-;40560:46;;40645:12;40660:14;40669:4;40660;:8;;:14;;;;:::i;:::-;40645:29;;40794:13;40810:36;40822:4;40828;40834;40840:5;40810:11;:36::i;:::-;40794:52;;40869:1;40861:5;:9;40857:50;;;40892:15;40901:5;40892:4;:8;;:15;;;;:::i;:::-;40885:22;;40857:50;40966:37;40986:6;:12;40993:4;40986:12;;;;;;;;;;;:16;;;40966:15;40975:5;40966:4;:8;;:15;;;;:::i;:::-;:19;;:37;;;;:::i;:::-;40947:6;:12;40954:4;40947:12;;;;;;;;;;;:16;;:56;;;;40303:708;;;;;;;:::o;41137:1385::-;41242:7;41912:12;41962:6;:12;41969:4;41962:12;;;;;;;;;;;:17;;;41928:29;41937:19;41928:4;:8;;:29;;;;:::i;:::-;41927:53;;;;;;41912:68;;42011:27;42020:6;:12;42027:4;42020:12;;;;;;;;;;;:17;;;42011:4;:8;;:27;;;;:::i;:::-;41991:6;:12;41998:4;41991:12;;;;;;;;;;;:17;;:47;;;;42193:14;42231:19;42211:15;42220:5;42211:4;:8;;:15;;;;:::i;:::-;42210:41;;;;;;42193:58;;42291:102;42366:9;:15;42376:4;42366:15;;;;;;;;;;;;;;;:21;42382:4;42366:21;;;;;;;;;;;:26;;;42292:68;42353:6;42327:19;42294:28;42316:5;42294:6;:12;42301:4;42294:12;;;;;;;;;;;:17;;;:21;;:28;;;;:::i;:::-;42293:54;;;;;;42292:60;;:68;;;;:::i;:::-;42291:74;;:102;;;;:::i;:::-;42262:9;:15;42272:4;42262:15;;;;;;;;;;;;;;;:21;42278:4;42262:21;;;;;;;;;;;:26;;:131;;;;42450:63;42492:19;42460:27;42469:6;:12;42476:4;42469:12;;;;;;;;;;;:17;;;42460:4;:8;;:27;;;;:::i;:::-;42459:53;;;;;;42450:4;:8;;:63;;;;:::i;:::-;42442:72;;;;41137:1385;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:146;;230:6;217:20;208:29;;242:41;277:5;242:41;;;202:86;;;;;295:124;;372:6;359:20;350:29;;384:30;408:5;384:30;;;344:75;;;;;426:128;;507:6;501:13;492:22;;519:30;543:5;519:30;;;486:68;;;;;561:130;;641:6;628:20;619:29;;653:33;680:5;653:33;;;613:78;;;;;698:134;;782:6;776:13;767:22;;794:33;821:5;794:33;;;761:71;;;;;839:241;;943:2;931:9;922:7;918:23;914:32;911:2;;;959:1;956;949:12;911:2;994:1;1011:53;1056:7;1047:6;1036:9;1032:22;1011:53;;;1001:63;;973:97;905:175;;;;;1087:257;;1199:2;1187:9;1178:7;1174:23;1170:32;1167:2;;;1215:1;1212;1205:12;1167:2;1250:1;1267:61;1320:7;1311:6;1300:9;1296:22;1267:61;;;1257:71;;1229:105;1161:183;;;;;1351:507;;;;1497:2;1485:9;1476:7;1472:23;1468:32;1465:2;;;1513:1;1510;1503:12;1465:2;1548:1;1565:53;1610:7;1601:6;1590:9;1586:22;1565:53;;;1555:63;;1527:97;1655:2;1673:53;1718:7;1709:6;1698:9;1694:22;1673:53;;;1663:63;;1634:98;1763:2;1781:61;1834:7;1825:6;1814:9;1810:22;1781:61;;;1771:71;;1742:106;1459:399;;;;;;1865:366;;;1986:2;1974:9;1965:7;1961:23;1957:32;1954:2;;;2002:1;1999;1992:12;1954:2;2037:1;2054:53;2099:7;2090:6;2079:9;2075:22;2054:53;;;2044:63;;2016:97;2144:2;2162:53;2207:7;2198:6;2187:9;2183:22;2162:53;;;2152:63;;2123:98;1948:283;;;;;;2238:257;;2350:2;2338:9;2329:7;2325:23;2321:32;2318:2;;;2366:1;2363;2356:12;2318:2;2401:1;2418:61;2471:7;2462:6;2451:9;2447:22;2418:61;;;2408:71;;2380:105;2312:183;;;;;2502:241;;2606:2;2594:9;2585:7;2581:23;2577:32;2574:2;;;2622:1;2619;2612:12;2574:2;2657:1;2674:53;2719:7;2710:6;2699:9;2695:22;2674:53;;;2664:63;;2636:97;2568:175;;;;;2750:263;;2865:2;2853:9;2844:7;2840:23;2836:32;2833:2;;;2881:1;2878;2871:12;2833:2;2916:1;2933:64;2989:7;2980:6;2969:9;2965:22;2933:64;;;2923:74;;2895:108;2827:186;;;;;3020:360;;;3138:2;3126:9;3117:7;3113:23;3109:32;3106:2;;;3154:1;3151;3144:12;3106:2;3189:1;3206:53;3251:7;3242:6;3231:9;3227:22;3206:53;;;3196:63;;3168:97;3296:2;3314:50;3356:7;3347:6;3336:9;3332:22;3314:50;;;3304:60;;3275:95;3100:280;;;;;;3387:366;;;3508:2;3496:9;3487:7;3483:23;3479:32;3476:2;;;3524:1;3521;3514:12;3476:2;3559:1;3576:53;3621:7;3612:6;3601:9;3597:22;3576:53;;;3566:63;;3538:97;3666:2;3684:53;3729:7;3720:6;3709:9;3705:22;3684:53;;;3674:63;;3645:98;3470:283;;;;;;3760:743;;;;;;3932:3;3920:9;3911:7;3907:23;3903:33;3900:2;;;3949:1;3946;3939:12;3900:2;3984:1;4001:53;4046:7;4037:6;4026:9;4022:22;4001:53;;;3991:63;;3963:97;4091:2;4109:53;4154:7;4145:6;4134:9;4130:22;4109:53;;;4099:63;;4070:98;4199:2;4217:53;4262:7;4253:6;4242:9;4238:22;4217:53;;;4207:63;;4178:98;4307:2;4325:53;4370:7;4361:6;4350:9;4346:22;4325:53;;;4315:63;;4286:98;4415:3;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;;;4424:63;;4394:99;3894:609;;;;;;;;;4510:142;4601:45;4640:5;4601:45;;;4596:3;4589:58;4583:69;;;4659:150;4758:45;4797:5;4758:45;;;4753:3;4746:58;4740:69;;;4816:145;4923:32;4949:5;4923:32;;;4918:3;4911:45;4905:56;;;4968:113;5051:24;5069:5;5051:24;;;5046:3;5039:37;5033:48;;;5088:121;5179:24;5197:5;5179:24;;;5174:3;5167:37;5161:48;;;5216:104;5293:21;5308:5;5293:21;;;5288:3;5281:34;5275:45;;;5327:112;5412:21;5427:5;5412:21;;;5407:3;5400:34;5394:45;;;5446:356;;5574:38;5606:5;5574:38;;;5624:88;5705:6;5700:3;5624:88;;;5617:95;;5717:52;5762:6;5757:3;5750:4;5743:5;5739:16;5717:52;;;5790:6;5785:3;5781:16;5774:23;;5554:248;;;;;;5809:154;5906:51;5951:5;5906:51;;;5901:3;5894:64;5888:75;;;5970:174;6077:61;6132:5;6077:61;;;6072:3;6065:74;6059:85;;;6151:304;6327:122;6443:5;6327:122;;;6322:3;6315:135;6309:146;;;6462:347;;6574:39;6607:5;6574:39;;;6625:71;6689:6;6684:3;6625:71;;;6618:78;;6701:52;6746:6;6741:3;6734:4;6727:5;6723:16;6701:52;;;6774:29;6796:6;6774:29;;;6769:3;6765:39;6758:46;;6554:255;;;;;;6817:306;;6977:66;7041:1;7036:3;6977:66;;;6970:73;;7076:9;7072:1;7067:3;7063:11;7056:30;7114:2;7109:3;7105:12;7098:19;;6963:160;;;;7132:305;;7292:66;7356:1;7351:3;7292:66;;;7285:73;;7391:8;7387:1;7382:3;7378:11;7371:29;7428:2;7423:3;7419:12;7412:19;;7278:159;;;;7446:383;;7606:67;7670:2;7665:3;7606:67;;;7599:74;;7706:34;7702:1;7697:3;7693:11;7686:55;7775:16;7770:2;7765:3;7761:12;7754:38;7820:2;7815:3;7811:12;7804:19;;7592:237;;;;7838:317;;7998:67;8062:2;8057:3;7998:67;;;7991:74;;8098:19;8094:1;8089:3;8085:11;8078:40;8146:2;8141:3;8137:12;8130:19;;7984:171;;;;8164:328;;8324:67;8388:2;8383:3;8324:67;;;8317:74;;8424:30;8420:1;8415:3;8411:11;8404:51;8483:2;8478:3;8474:12;8467:19;;8310:182;;;;8501:373;;8661:67;8725:2;8720:3;8661:67;;;8654:74;;8761:34;8757:1;8752:3;8748:11;8741:55;8830:6;8825:2;8820:3;8816:12;8809:28;8865:2;8860:3;8856:12;8849:19;;8647:227;;;;8883:315;;9043:67;9107:2;9102:3;9043:67;;;9036:74;;9143:17;9139:1;9134:3;9130:11;9123:38;9189:2;9184:3;9180:12;9173:19;;9029:169;;;;9207:310;;9367:67;9431:2;9426:3;9367:67;;;9360:74;;9467:12;9463:1;9458:3;9454:11;9447:33;9508:2;9503:3;9499:12;9492:19;;9353:164;;;;9526:319;;9686:67;9750:2;9745:3;9686:67;;;9679:74;;9786:21;9782:1;9777:3;9773:11;9766:42;9836:2;9831:3;9827:12;9820:19;;9672:173;;;;9854:296;;10031:83;10112:1;10107:3;10031:83;;;10024:90;;10142:1;10137:3;10133:11;10126:18;;10017:133;;;;10159:319;;10319:67;10383:2;10378:3;10319:67;;;10312:74;;10419:21;10415:1;10410:3;10406:11;10399:42;10469:2;10464:3;10460:12;10453:19;;10305:173;;;;10487:321;;10647:67;10711:2;10706:3;10647:67;;;10640:74;;10747:23;10743:1;10738:3;10734:11;10727:44;10799:2;10794:3;10790:12;10783:19;;10633:175;;;;10817:319;;10977:67;11041:2;11036:3;10977:67;;;10970:74;;11077:21;11073:1;11068:3;11064:11;11057:42;11127:2;11122:3;11118:12;11111:19;;10963:173;;;;11145:327;;11305:67;11369:2;11364:3;11305:67;;;11298:74;;11405:29;11401:1;11396:3;11392:11;11385:50;11463:2;11458:3;11454:12;11447:19;;11291:181;;;;11481:317;;11641:67;11705:2;11700:3;11641:67;;;11634:74;;11741:19;11737:1;11732:3;11728:11;11721:40;11789:2;11784:3;11780:12;11773:19;;11627:171;;;;11807:331;;11967:67;12031:2;12026:3;11967:67;;;11960:74;;12067:33;12063:1;12058:3;12054:11;12047:54;12129:2;12124:3;12120:12;12113:19;;11953:185;;;;12147:385;;12307:67;12371:2;12366:3;12307:67;;;12300:74;;12407:34;12403:1;12398:3;12394:11;12387:55;12476:18;12471:2;12466:3;12462:12;12455:40;12523:2;12518:3;12514:12;12507:19;;12293:239;;;;12541:310;;12701:67;12765:2;12760:3;12701:67;;;12694:74;;12801:12;12797:1;12792:3;12788:11;12781:33;12842:2;12837:3;12833:12;12826:19;;12687:164;;;;12859:113;12942:24;12960:5;12942:24;;;12937:3;12930:37;12924:48;;;12979:121;13070:24;13088:5;13070:24;;;13065:3;13058:37;13052:48;;;13107:271;;13260:93;13349:3;13340:6;13260:93;;;13253:100;;13370:3;13363:10;;13241:137;;;;;13385:379;;13592:147;13735:3;13592:147;;;13585:154;;13756:3;13749:10;;13573:191;;;;13771:222;;13898:2;13887:9;13883:18;13875:26;;13912:71;13980:1;13969:9;13965:17;13956:6;13912:71;;;13869:124;;;;;14000:238;;14135:2;14124:9;14120:18;14112:26;;14149:79;14225:1;14214:9;14210:17;14201:6;14149:79;;;14106:132;;;;;14245:492;;14444:2;14433:9;14429:18;14421:26;;14458:87;14542:1;14531:9;14527:17;14518:6;14458:87;;;14556:80;14632:2;14621:9;14617:18;14608:6;14556:80;;;14647;14723:2;14712:9;14708:18;14699:6;14647:80;;;14415:322;;;;;;;14744:349;;14907:2;14896:9;14892:18;14884:26;;14921:79;14997:1;14986:9;14982:17;14973:6;14921:79;;;15011:72;15079:2;15068:9;15064:18;15055:6;15011:72;;;14878:215;;;;;;15100:662;;15384:2;15373:9;15369:18;15361:26;;15398:79;15474:1;15463:9;15459:17;15450:6;15398:79;;;15488:88;15572:2;15561:9;15557:18;15548:6;15488:88;;;15587:165;15748:2;15737:9;15733:18;15724:6;15587:165;;;15355:407;;;;;;;15769:646;;16045:2;16034:9;16030:18;16022:26;;16059:79;16135:1;16124:9;16120:17;16111:6;16059:79;;;16149:80;16225:2;16214:9;16210:18;16201:6;16149:80;;;16240:165;16401:2;16390:9;16386:18;16377:6;16240:165;;;16016:399;;;;;;;16422:628;;16657:3;16646:9;16642:19;16634:27;;16672:79;16748:1;16737:9;16733:17;16724:6;16672:79;;;16762:80;16838:2;16827:9;16823:18;16814:6;16762:80;;;16853;16929:2;16918:9;16914:18;16905:6;16853:80;;;16944:96;17036:2;17025:9;17021:18;17012:6;16944:96;;;16628:422;;;;;;;;17057:960;;17362:3;17351:9;17347:19;17339:27;;17377:79;17453:1;17442:9;17438:17;17429:6;17377:79;;;17467:80;17543:2;17532:9;17528:18;17519:6;17467:80;;;17558;17634:2;17623:9;17619:18;17610:6;17558:80;;;17649;17725:2;17714:9;17710:18;17701:6;17649:80;;;17740:89;17824:3;17813:9;17809:19;17800:6;17740:89;;;17840:81;17916:3;17905:9;17901:19;17892:6;17840:81;;;17932:75;18002:3;17991:9;17987:19;17978:6;17932:75;;;17333:684;;;;;;;;;;;18024:992;;18341:3;18330:9;18326:19;18318:27;;18356:71;18424:1;18413:9;18409:17;18400:6;18356:71;;;18438:72;18506:2;18495:9;18491:18;18482:6;18438:72;;;18521:66;18583:2;18572:9;18568:18;18559:6;18521:66;;;18598:72;18666:2;18655:9;18651:18;18642:6;18598:72;;;18681:73;18749:3;18738:9;18734:19;18725:6;18681:73;;;18765;18833:3;18822:9;18818:19;18809:6;18765:73;;;18849;18917:3;18906:9;18902:19;18893:6;18849:73;;;18933;19001:3;18990:9;18986:19;18977:6;18933:73;;;18312:704;;;;;;;;;;;;19023:210;;19144:2;19133:9;19129:18;19121:26;;19158:65;19220:1;19209:9;19205:17;19196:6;19158:65;;;19115:118;;;;;19240:250;;19381:2;19370:9;19366:18;19358:26;;19395:85;19477:1;19466:9;19462:17;19453:6;19395:85;;;19352:138;;;;;19497:270;;19648:2;19637:9;19633:18;19625:26;;19662:95;19754:1;19743:9;19739:17;19730:6;19662:95;;;19619:148;;;;;19774:310;;19921:2;19910:9;19906:18;19898:26;;19971:9;19965:4;19961:20;19957:1;19946:9;19942:17;19935:47;19996:78;20069:4;20060:6;19996:78;;;19988:86;;19892:192;;;;;20091:416;;20291:2;20280:9;20276:18;20268:26;;20341:9;20335:4;20331:20;20327:1;20316:9;20312:17;20305:47;20366:131;20492:4;20366:131;;;20358:139;;20262:245;;;;20514:416;;20714:2;20703:9;20699:18;20691:26;;20764:9;20758:4;20754:20;20750:1;20739:9;20735:17;20728:47;20789:131;20915:4;20789:131;;;20781:139;;20685:245;;;;20937:416;;21137:2;21126:9;21122:18;21114:26;;21187:9;21181:4;21177:20;21173:1;21162:9;21158:17;21151:47;21212:131;21338:4;21212:131;;;21204:139;;21108:245;;;;21360:416;;21560:2;21549:9;21545:18;21537:26;;21610:9;21604:4;21600:20;21596:1;21585:9;21581:17;21574:47;21635:131;21761:4;21635:131;;;21627:139;;21531:245;;;;21783:416;;21983:2;21972:9;21968:18;21960:26;;22033:9;22027:4;22023:20;22019:1;22008:9;22004:17;21997:47;22058:131;22184:4;22058:131;;;22050:139;;21954:245;;;;22206:416;;22406:2;22395:9;22391:18;22383:26;;22456:9;22450:4;22446:20;22442:1;22431:9;22427:17;22420:47;22481:131;22607:4;22481:131;;;22473:139;;22377:245;;;;22629:416;;22829:2;22818:9;22814:18;22806:26;;22879:9;22873:4;22869:20;22865:1;22854:9;22850:17;22843:47;22904:131;23030:4;22904:131;;;22896:139;;22800:245;;;;23052:416;;23252:2;23241:9;23237:18;23229:26;;23302:9;23296:4;23292:20;23288:1;23277:9;23273:17;23266:47;23327:131;23453:4;23327:131;;;23319:139;;23223:245;;;;23475:416;;23675:2;23664:9;23660:18;23652:26;;23725:9;23719:4;23715:20;23711:1;23700:9;23696:17;23689:47;23750:131;23876:4;23750:131;;;23742:139;;23646:245;;;;23898:416;;24098:2;24087:9;24083:18;24075:26;;24148:9;24142:4;24138:20;24134:1;24123:9;24119:17;24112:47;24173:131;24299:4;24173:131;;;24165:139;;24069:245;;;;24321:416;;24521:2;24510:9;24506:18;24498:26;;24571:9;24565:4;24561:20;24557:1;24546:9;24542:17;24535:47;24596:131;24722:4;24596:131;;;24588:139;;24492:245;;;;24744:416;;24944:2;24933:9;24929:18;24921:26;;24994:9;24988:4;24984:20;24980:1;24969:9;24965:17;24958:47;25019:131;25145:4;25019:131;;;25011:139;;24915:245;;;;25167:416;;25367:2;25356:9;25352:18;25344:26;;25417:9;25411:4;25407:20;25403:1;25392:9;25388:17;25381:47;25442:131;25568:4;25442:131;;;25434:139;;25338:245;;;;25590:416;;25790:2;25779:9;25775:18;25767:26;;25840:9;25834:4;25830:20;25826:1;25815:9;25811:17;25804:47;25865:131;25991:4;25865:131;;;25857:139;;25761:245;;;;26013:416;;26213:2;26202:9;26198:18;26190:26;;26263:9;26257:4;26253:20;26249:1;26238:9;26234:17;26227:47;26288:131;26414:4;26288:131;;;26280:139;;26184:245;;;;26436:416;;26636:2;26625:9;26621:18;26613:26;;26686:9;26680:4;26676:20;26672:1;26661:9;26657:17;26650:47;26711:131;26837:4;26711:131;;;26703:139;;26607:245;;;;26859:416;;27059:2;27048:9;27044:18;27036:26;;27109:9;27103:4;27099:20;27095:1;27084:9;27080:17;27073:47;27134:131;27260:4;27134:131;;;27126:139;;27030:245;;;;27282:222;;27409:2;27398:9;27394:18;27386:26;;27423:71;27491:1;27480:9;27476:17;27467:6;27423:71;;;27380:124;;;;;27511:333;;27666:2;27655:9;27651:18;27643:26;;27680:71;27748:1;27737:9;27733:17;27724:6;27680:71;;;27762:72;27830:2;27819:9;27815:18;27806:6;27762:72;;;27637:207;;;;;;27851:556;;28062:3;28051:9;28047:19;28039:27;;28077:71;28145:1;28134:9;28130:17;28121:6;28077:71;;;28159:72;28227:2;28216:9;28212:18;28203:6;28159:72;;;28242;28310:2;28299:9;28295:18;28286:6;28242:72;;;28325;28393:2;28382:9;28378:18;28369:6;28325:72;;;28033:374;;;;;;;;28414:756;;28673:3;28662:9;28658:19;28650:27;;28688:71;28756:1;28745:9;28741:17;28732:6;28688:71;;;28770:72;28838:2;28827:9;28823:18;28814:6;28770:72;;;28853;28921:2;28910:9;28906:18;28897:6;28853:72;;;28936;29004:2;28993:9;28989:18;28980:6;28936:72;;;29057:9;29051:4;29047:20;29041:3;29030:9;29026:19;29019:49;29082:78;29155:4;29146:6;29082:78;;;29074:86;;28644:526;;;;;;;;;29177:892;;29472:3;29461:9;29457:19;29449:27;;29487:71;29555:1;29544:9;29540:17;29531:6;29487:71;;;29569:72;29637:2;29626:9;29622:18;29613:6;29569:72;;;29652;29720:2;29709:9;29705:18;29696:6;29652:72;;;29735;29803:2;29792:9;29788:18;29779:6;29735:72;;;29818:73;29886:3;29875:9;29871:19;29862:6;29818:73;;;29902;29970:3;29959:9;29955:19;29946:6;29902:73;;;29986;30054:3;30043:9;30039:19;30030:6;29986:73;;;29443:626;;;;;;;;;;;30076:121;;30169:5;30163:12;30153:22;;30134:63;;;;30204:122;;30298:5;30292:12;30282:22;;30263:63;;;;30334:144;;30469:3;30454:18;;30447:31;;;;;30487:163;;30602:6;30597:3;30590:19;30639:4;30634:3;30630:14;30615:29;;30583:67;;;;;30658:91;;30720:24;30738:5;30720:24;;;30709:35;;30703:46;;;;30756:99;;30826:24;30844:5;30826:24;;;30815:35;;30809:46;;;;30862:85;;30935:5;30928:13;30921:21;30910:32;;30904:43;;;;30954:121;;31027:42;31020:5;31016:54;31005:65;;30999:76;;;;31082:72;;31144:5;31133:16;;31127:27;;;;31161:129;;31248:37;31279:5;31248:37;;;31235:50;;31229:61;;;;31297:149;;31390:51;31435:5;31390:51;;;31377:64;;31371:75;;;;31453:122;;31546:24;31564:5;31546:24;;;31533:37;;31527:48;;;;31582:169;;31685:61;31740:5;31685:61;;;31672:74;;31666:85;;;;31758:132;;31861:24;31879:5;31861:24;;;31848:37;;31842:48;;;;31897:193;;32061:24;32079:5;32061:24;;;32048:37;;32042:48;;;;32097:121;;32176:37;32207:5;32176:37;;;32163:50;;32157:61;;;;32225:108;;32304:24;32322:5;32304:24;;;32291:37;;32285:48;;;;32341:268;32406:1;32413:101;32427:6;32424:1;32421:13;32413:101;;;32503:1;32498:3;32494:11;32488:18;32484:1;32479:3;32475:11;32468:39;32449:2;32446:1;32442:10;32437:15;;32413:101;;;32529:6;32526:1;32523:13;32520:2;;;32594:1;32585:6;32580:3;32576:16;32569:27;32520:2;32390:219;;;;;32617:97;;32705:2;32701:7;32696:2;32689:5;32685:14;32681:28;32671:38;;32665:49;;;;32722:117;32791:24;32809:5;32791:24;;;32784:5;32781:35;32771:2;;32830:1;32827;32820:12;32771:2;32765:74;;32846:133;32923:32;32949:5;32923:32;;;32916:5;32913:43;32903:2;;32970:1;32967;32960:12;32903:2;32897:82;;32986:111;33052:21;33067:5;33052:21;;;33045:5;33042:32;33032:2;;33088:1;33085;33078:12;33032:2;33026:71;;33104:117;33173:24;33191:5;33173:24;;;33166:5;33163:35;33153:2;;33212:1;33209;33202:12;33153:2;33147:74;

Swarm Source

ipfs://64a525e146fe1eea33622f0eeb2d76c8744c157f206415f19b0facabceee0637
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading