Contract 0xd8617402c71078993e6bd4498df0727e5cae384d

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xcd3d5e104f349df3f0bbfe4fe6309f626806584f2a13f3af859ef9ecb9ed3ee40xbec321a4264314422022-05-23 12:09:1830 secs ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003179662513.750000013
0x713c76e70020b1480198ef66e391563b06993db0a1dc6dc2784a125b42f8c9050xbec321a4264314412022-05-23 12:09:1335 secs ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0004868414994.499999998
0x5a54c724d97b3f35cc7902a1999483052a948900c311c0e1d3b53b7db18b27f40xbec321a4264314392022-05-23 12:09:0345 secs ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0006359325027.50000003
0x66166fc943676c0af7cb59425741b878d0f61145ed33439f3d368bc627a2d3ad0xbec321a4264314372022-05-23 12:08:5355 secs ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.002467418129.1
0x80c6bf0eeb155ca10ed32d374ae8d55ca116a209b98d9a6e83c93f9a562f1d500xbec321a4264314362022-05-23 12:08:481 min ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00538996885163.567700011
0x230bd971f42a1902515c63a2a5e1a41b1b9c6ea94f1929f6ad96605b8a3feb1e0xbec321a4264314342022-05-23 12:08:381 min ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00581752139168.610128335
0x3594020d8c71c6ede4d2dda50b93768512a18e9b81f4057b415bf4af8d575d930xbec321a4264314322022-05-23 12:08:281 min ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00758382039370.091409283
0xbe3698d5362f5ad9739a07a47308babb26942f1ee8b97a3b0c7c71482379a81a0xbec321a4264314302022-05-23 12:08:181 min ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00613517114570.091409283
0x81e9ebb0c03c01acfd5f48b2e52d3da849c2fc3438fbecb36f0478dcd91ac5d50xbec321a4264314292022-05-23 12:08:131 min ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00613601224270.091409282
0xa35535af3531f77d444a53f64060613883735237724ad79832647b5cac2aa46e0xbec321a4264314272022-05-23 12:08:031 min ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00758382039270.09140928
0x360fbec6d3f0146dd7d0f402b8bf887dc871dc622f4c3596b6b41bf33941379c0xbec321a4264314262022-05-23 12:07:581 min ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00799090026270.499442093
0x1631b736c0163c90f4caa2dcce881829ebd35287693c6ecbb0ea423b42c3a65a0xbec321a4264314242022-05-23 12:07:482 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00765229273570.732091061
0x2cf7d1e57a4407f20e08ef1fc52e9f528a9993f2613c83b6cc59619229bd52700xbec321a4264314242022-05-23 12:07:482 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00765229273570.732091061
0xa5124257cd7697104a47996149507316e1080dffef69c22d470233b08fa96a110xbec321a4264314222022-05-23 12:07:372 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.00758297929570.091409277
0x5064f245ffe4182a509e1bd748ec18c0ee83404c7ecf3e3d11dec8f287457f270xbec321a4264313592022-05-23 12:02:207 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003282412513.750000013
0x42ea158aef153182b5932b2a990655a03b9da71c9ab85ff1e00ff0993dd281440xbec321a4264313582022-05-23 12:02:157 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003282412513.750000013
0xfb02debc3e3b3ef18aa7a37c576e5570f10718e3be0abab64c009b91315a3a990xbec321a4264313562022-05-23 12:02:057 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003179962513.750000013
0xd6d4245d2ee117e03b301374adc6c0ede76c789d27efe97362415a8ef446591a0xbec321a4264313552022-05-23 12:02:007 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003179962513.750000013
0x8d4c33d40c24c2013531009626c7f9d898af8846345e757663f073fb0d1decff0xbec321a4264313532022-05-23 12:01:507 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003179962513.750000013
0x7db7bedf88be002b1ff44e3ebec55f4e6881c24fc3435556f32114f6d15e2f820xbec321a4264313512022-05-23 12:01:408 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003179962513.750000013
0xf5d3918b45c1612db386b614e1c0556db24959a2081c109b45cf373605506c1d0xbec321a4264313502022-05-23 12:01:358 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0004250512513.750000013
0x44cb51d18117241c8d24760de6da8b4e6c410c2bf87544f49a2b9b954f76999b0xbec321a4264313472022-05-23 12:01:208 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0004250512513.750000013
0x098cfcaa5a869daf1df924909c39df14d87ede69346a2dd38454cad27869e1480xbec321a4264313452022-05-23 12:01:108 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003282862513.750000015
0xc7fd4a37b3789710ce03d5d5c55beaf61a3bc59dbb2c161932aa7ed7d87741390xbec321a4264313442022-05-23 12:01:058 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0003282862513.750000015
0xa13893e5d8053d47e7e56797cd744169cf936153ca84f4a4d7666753fb6e602d0xbec321a4264313422022-05-23 12:00:558 mins ago0x089a12e2a5b8731698c70af7d43c1d5998a4549d IN  0xd8617402c71078993e6bd4498df0727e5cae384d0 MATIC0.0004250512513.750000015
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x8bfe39e64B32CF86B1eAB96406A67EbfA0521EDe

Contract Name:
DexilonTest_v11

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-04-21
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

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

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

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

    function decimals() external view returns (uint16);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

/**
 * @dev Partial interface for a Chainlink Aggregator.
 */
interface AggregatorV3Interface {
    // latestRoundData should raise "No data present"
    // if he do not have data to report, instead of returning unset values
    // which could be misinterpreted as actual reported values.
    function latestRoundData()
        external
        view
        returns (
            uint160 roundId,
            int answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint160 answeredInRound
        );
}

contract DexilonTest_v11 {
    using SafeERC20 for IERC20;
    
    struct userAssetParameters {
        string assetName;
        int256 assetBalance;
        uint256 assetLockedBalance;
        uint256 assetPrice;
        uint16 assetLeverage;
    }

    struct tradingArrayIndexed {
        bool isBuy;
        uint32 makerIndex;
        uint32 takerIndex;
        uint32 assetIndex;
        uint256 assetAmount;
        uint256 assetRate;
        uint256 tradeFee;
        uint16 makerLeverage;
        uint16 takerLeverage;
        string tradeId;
    }

    struct tradingArray {
        bool isBuy;
        address makerAddress;
        address takerAddress;
        string assetName;
        uint256 assetAmount;
        uint256 assetRate;
        uint256 tradeFee;
        uint16 makerLeverage;
        uint16 takerLeverage;
        string tradeId;
    }

    struct FeesArray {
        address userAddress;
        int feeAmount;
    }

    mapping(address => uint256) internal usersAvailableBalances;
    mapping(address => mapping (string => userAssetParameters)) internal usersAssetsData;
    
    mapping(address => uint256) public usersIndex;
    mapping(uint256 => address) public indexedAddresses;
    
    mapping(string => bool) internal checkAsset;

    uint256 public usersCount;
    string[] internal assetsNames;
    
    address payable public owner;
    
    
    event Deposit(
        address indexed depositor,
        uint256 amountUSDC,
        uint256 timestamp
    );
    
    event Withdraw(
        address indexed user,
        uint256 amountUSDC,
        uint256 timestamp
    );
    
    event Trade(
        bool isBuy,
        address indexed maker,
        address indexed taker,
        string asset,
        uint256 assetAmount,
        uint256 assetRate,
        uint256 tradeFee,
        uint16 makerLeverage,
        uint16 takerLeverage,
        string tradeId,
        uint256 timestamp
    );
    
    uint8 internal constant DECIMALS_USDC = 6;
    uint8 internal constant DECIMALS_BTC = 18;
    
    int internal constant BTC_UNIT_FACTOR = int(10**DECIMALS_BTC);
    int internal constant ROUNDING_FACTOR = int(10**(DECIMALS_BTC-DECIMALS_USDC));
    
    // Chainlink price feed for BTC/USD
    AggregatorV3Interface internal btcToUsdPriceFeed = AggregatorV3Interface(0x007A22900a3B98143368Bd5906f8E17e9867581b);
    // Chainlink price feed for USDC/USD
    AggregatorV3Interface internal usdcToUsdPriceFeed = AggregatorV3Interface(0x572dDec9087154dC5dfBB1546Bb62713147e0Ab0);
    
    // USDC test token (Mumbai Testnet)
    IERC20 internal depositToken = IERC20(0x7592A72A46D3165Dcc7BF0802D70812Af19471B3); 
    
    constructor(address USDC_address) {
        owner = payable(msg.sender);
        // Base stable coin
        depositToken = IERC20(USDC_address);
        // Supported assets
        assetsNames = ['BTC', 'ETH', 'SOL', 'ADA', 'NEAR', 'MATIC', 'LUNA', 'DOGE'];
        
        for (uint16 i=0; i<assetsNames.length; i++) {
            checkAsset[assetsNames[i]] = true;
        }
        // Initiating user index
        usersIndex[owner] = 0;
        indexedAddresses[0] = owner;
        usersCount = 1;
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    function addNewSupportedAsset(string memory _newAssetName) public onlyOwner returns (bool) {

        require(checkAsset[_newAssetName] == false, "Asset already exists!");

        assetsNames.push(_newAssetName);
        checkAsset[_newAssetName] = true;
        return true;
    }

    /**
    * @notice Convert btc to usdc by Chainlink market price
    */
    function btcToUsdcMarketConvert(int assetAmount) public view returns (int) {
        (, int signedBtcToUsdPrice, , , ) = btcToUsdPriceFeed.latestRoundData();
        (, int signedUsdcToUsdPrice, , , ) = usdcToUsdPriceFeed.latestRoundData();
        
        return (signedBtcToUsdPrice*assetAmount/signedUsdcToUsdPrice)/int(10**(DECIMALS_BTC - DECIMALS_USDC));
    }

    /**
     * @dev Deposit token into contract and open user account
     * @param amountUSDC Amount of token in smallest units
     */
    function deposit(uint256 amountUSDC) public {
        depositToken.safeTransferFrom(msg.sender, address(this), amountUSDC);
        
        usersAvailableBalances[msg.sender] += amountUSDC * uint(ROUNDING_FACTOR);

        /// indexing users
        if (usersIndex[msg.sender] == 0 && msg.sender != owner) {
            usersIndex[msg.sender] = usersCount;
            indexedAddresses[usersCount] = msg.sender;
            usersCount += 1;
        }

        emit Deposit(msg.sender, amountUSDC, block.timestamp);
    }
    
    /// @notice calculate total locked balance for all assets
    function calculateTotalLocked(address userAddress) internal view returns(uint256 totalLocked) {
        totalLocked = 0;
        for (uint16 i=0; i < assetsNames.length; i++) {
            totalLocked += usersAssetsData[userAddress][assetsNames[i]].assetLockedBalance;
        }
    }

    /**
     * @dev Read all balances for the user
     * @param user Address of the user is the id of account
     */
    function getUserBalances(address user) public view 
        returns (uint256 , uint256 , userAssetParameters[] memory ) 
    {
        uint256 availableBalance = usersAvailableBalances[user] / uint(ROUNDING_FACTOR);
        uint256 lockedBalance = calculateTotalLocked(user) / uint(ROUNDING_FACTOR);

        userAssetParameters[] memory userAssets = new userAssetParameters[](assetsNames.length);

        for (uint256 i=0; i < assetsNames.length; i++) {
            userAssets[i] = _setOutputDecimalsForAsset(usersAssetsData[user][assetsNames[i]]);
        }

        return (availableBalance, lockedBalance, userAssets);

    }

    /**
     * @dev convert locked balance and asset price to USDC decimals
     * @param assetData struct userAssetParameters for current asset of the user
     */
    function _setOutputDecimalsForAsset(userAssetParameters memory assetData) internal pure returns (userAssetParameters memory assetDataModified) {
        // struct userAssetParameters {
        // 0 string assetName;
        // 1 int256 assetBalance;
        // 2 uint256 assetLockedBalance;
        // 3 uint256 assetPrice;
        // 4 uint16 assetLeverage; }
        assetDataModified.assetName = assetData.assetName;
        assetDataModified.assetBalance = assetData.assetBalance; // BTC decimals
        assetDataModified.assetLockedBalance = assetData.assetLockedBalance / uint(ROUNDING_FACTOR); // USDC decimals
        assetDataModified.assetPrice = assetData.assetPrice / uint(ROUNDING_FACTOR); // USDC decimals
        assetDataModified.assetLeverage = assetData.assetLeverage; 
    }

    /**
     * @dev transfer amount to the user
     * @param userAddress transfer to this address 
     * @param amountUSDC amount of the deposited token in smallest units
     */
    function withdraw(address userAddress, uint256 amountUSDC) public onlyOwner {
        
        require(usersAvailableBalances[userAddress] >= amountUSDC * uint(ROUNDING_FACTOR), 'Insufficient balance!');

        depositToken.safeTransfer(userAddress, amountUSDC);
        usersAvailableBalances[userAddress] -= amountUSDC * uint(ROUNDING_FACTOR);
        
        emit Withdraw(userAddress, amountUSDC, block.timestamp);
    }

    /// @dev development ONLY
    function withdrawAll() public onlyOwner {
        depositToken.safeTransfer(owner, depositToken.balanceOf(address(this)));
        
        if (address(this).balance > 0) {
            owner.transfer(address(this).balance);
        }
    }

    /// @dev development ONLY
    function resetUserAccount(address userAddress, 
                              uint256 userAvailableBalance,
                              uint256 userLockedBalance,
                              string memory asset,
                              int256 userAssetBalance,
                              uint16 leverage) public onlyOwner {
        usersAvailableBalances[userAddress] = userAvailableBalance;
        
        userAssetParameters memory zeroParameters;
        zeroParameters.assetName = '';
        zeroParameters.assetBalance = 0;
        zeroParameters.assetLockedBalance = 0;
        zeroParameters.assetPrice = 0;
        zeroParameters.assetLeverage = 1;

        for (uint16 i=0; i<assetsNames.length; i++) {
            usersAssetsData[userAddress][assetsNames[i]] = zeroParameters;
            usersAssetsData[userAddress][assetsNames[i]].assetName = assetsNames[i];
            usersAssetsData[userAddress][assetsNames[i]].assetLeverage = leverage;
        }

        usersAssetsData[userAddress][asset].assetBalance = userAssetBalance;
        usersAssetsData[userAddress][asset].assetLockedBalance = userLockedBalance;
        if (userAssetBalance != 0){
            usersAssetsData[userAddress][asset].assetPrice = uint((int(userLockedBalance * leverage)  * BTC_UNIT_FACTOR) / 
            abs(userAssetBalance));}

    }
       
    /**
    * @dev trade between a maker and a taker
    * @param isBuy true if this is a buy order trade, false if a sell order trade
    * @param maker the address of the user who created the order
    * @param taker the address of the user who accepted the order
    * @param asset string id of the supported asset ('BTC','ETH','XRP','SOL')
    * @param assetAmount the amount of the asset in Wei (smallest unit)
    * @param assetRate price of 1 asset coin in the smallest unit of USDC
    * @param tradeFee absolute fee amount in the smallest unit of USDC from taker to maker
    * @param makerLeverage leverage of the maker for the asset
    * @param takerLeverage leverage of the taker for the asset
    * @param tradeId incoming id of the trade as as string
    **/
    function trade(
        bool isBuy,
        address maker,
        address taker,
        string memory asset,
        uint256 assetAmount,
        uint256 assetRate,
        uint256 tradeFee,
        uint16 makerLeverage,
        uint16 takerLeverage,
        string memory tradeId
    ) public onlyOwner {
        
        require(checkAsset[asset], string(abi.encodePacked('Unknown Asset! TradeId:', tradeId)));

        updateUserLeverage(maker, asset, makerLeverage, tradeId);
        updateUserLeverage(taker, asset, takerLeverage, tradeId);
        
        updateUserBalances(maker, asset, (isBuy ? int(1) : int(-1))*int(assetAmount), int(assetRate), int(tradeFee), tradeId);
        updateUserBalances(taker, asset, (isBuy ? int(-1) : int(1))*int(assetAmount), int(assetRate), -int(tradeFee), tradeId);
        
        emit Trade(isBuy, maker, taker, asset, assetAmount, assetRate, tradeFee, makerLeverage, takerLeverage, tradeId, block.timestamp);
    }
    
    /**
    * @dev update the balances of one of the traders
    * @param user user address whose balances are updated
    * @param asset string id of the supported asset ('BTC','ETH','XRP','SOL')
    * @param assetAmount the amount of the asset in Wei (smallest unit)
    * @param assetRate price of 1 asset coin in the smallest unit of USDC
    * @param tradeFee absolute fee amount in the smallest unit of USDC
    * @param tradeId incoming id of the trade as as string
    **/
    function updateUserBalances(
        address user,
        string memory asset,
        int assetAmount,
        int assetRate,
        int tradeFee,
        string memory tradeId
    ) internal {
        int assetBalance = usersAssetsData[user][asset].assetBalance;
        int lockedBalance = int(usersAssetsData[user][asset].assetLockedBalance);
        int assetPrice = int(usersAssetsData[user][asset].assetPrice);
        int leverage = int(uint256(usersAssetsData[user][asset].assetLeverage)) * BTC_UNIT_FACTOR;
        int availableBalance = int(usersAvailableBalances[user]) + tradeFee * ROUNDING_FACTOR;

        if(bytes(usersAssetsData[user][asset].assetName).length == 0){
            usersAssetsData[user][asset].assetName = asset;}

        assetRate = assetRate * ROUNDING_FACTOR;

        require(assetRate > 0, string(abi.encodePacked('Zero Rate! TradeId:', tradeId)));
        
        if (((assetAmount > 0 && assetBalance < 0) || 
              (assetAmount < 0 && assetBalance > 0)) &&
                abs(assetAmount) > abs(assetBalance)) {
            
            availableBalance = availableBalance  
                + abs(assetBalance)*assetPrice/(leverage) 
                - assetBalance*(assetPrice - assetRate)/(BTC_UNIT_FACTOR);
            lockedBalance = lockedBalance - abs(assetBalance*assetPrice/(leverage));
            assetAmount = assetAmount + assetBalance;
            assetBalance = 0;
        }
        
                
        if (assetBalance == 0  
                || (assetBalance < 0 && assetAmount < 0) 
                || (assetBalance > 0 && assetAmount > 0)) {

            availableBalance = availableBalance
                - abs(assetAmount*assetRate/(leverage));
            lockedBalance = lockedBalance + abs(assetAmount*assetRate/(leverage));
            assetPrice = (assetBalance*assetPrice + assetAmount*assetRate) / (assetBalance + assetAmount);

        } else {
            // (assetBalance > 0 && assetAmount < 0)
            // (assetBalance < 0 && assetAmount > 0)
            availableBalance = availableBalance 
                + abs(assetAmount)*assetPrice/(leverage)
                + assetAmount*(assetPrice - assetRate)/(BTC_UNIT_FACTOR);
            lockedBalance = lockedBalance - abs(assetAmount*assetPrice/(leverage));
        }
        
        require(availableBalance >= 0, string(abi.encodePacked('Insufficient balance! TradeId:', tradeId)));
        require(lockedBalance >= 0, string(abi.encodePacked('LockedBalance < 0! TradeId:', tradeId)));
        
        usersAvailableBalances[user] = uint256(availableBalance);
        usersAssetsData[user][asset].assetLockedBalance = uint256(lockedBalance);
        usersAssetsData[user][asset].assetPrice = uint256(assetPrice);
        usersAssetsData[user][asset].assetBalance = assetBalance + assetAmount;
    }

    /**
    * @dev update available balance and asset locked balance for new leverage
    * @param user user address whose balances are updated
    * @param asset string id of the supported asset ('BTC','ETH','XRP','SOL')
    * @param assetLeverage leverage of the user for the asset
    * @param tradeId incoming id of the trade as as string
    **/
    function updateUserLeverage(
        address user,
        string memory asset,
        uint16 assetLeverage,
        string memory tradeId
    ) internal {

        int newAvailableBalance;  
        int newLockedBalance;
                
        require(assetLeverage > 0, string(abi.encodePacked('Zero Leverage! TradeId:', tradeId)));

        if (usersAssetsData[user][asset].assetLockedBalance == 0) {
            usersAssetsData[user][asset].assetLeverage = assetLeverage;
        }

        if (usersAssetsData[user][asset].assetLeverage != assetLeverage){

            newLockedBalance = ((int(usersAssetsData[user][asset].assetPrice) 
                * abs(int(usersAssetsData[user][asset].assetBalance))) / int(uint256(assetLeverage))) / BTC_UNIT_FACTOR;
            newAvailableBalance = int(usersAvailableBalances[user]) 
                - (newLockedBalance - int(usersAssetsData[user][asset].assetLockedBalance));

            require(newAvailableBalance >= 0, string(abi.encodePacked('Insufficient balance! TradeId:', tradeId))); 

            usersAvailableBalances[user] = uint256(newAvailableBalance);
            usersAssetsData[user][asset].assetLockedBalance = uint256(newLockedBalance);
            usersAssetsData[user][asset].assetLeverage = assetLeverage;
        }
    }

    // struct tradingArrayIndexed {
    //     bool isBuy;
    //     uint32 makerIndex;
    //     uint32 takerIndex;
    //     uint32 assetIndex;
    //     uint256 assetAmount;
    //     uint256 assetRate;
    //     uint256 tradeFee;
    //     uint16 makerLeverage;
    //     uint16 takerLeverage;
    //     string tradeId;
    // } 

    /**
    * @dev Batch trading with indexes for users
    * @param batchTradingArray array of structs tradingArrayIndexed
    **/
    function batchTradeIndexed(tradingArrayIndexed[] memory batchTradingArray) public onlyOwner {

        uint256 max = batchTradingArray.length;

        for (uint256 i=0; i < max; i++) {
            trade(
                batchTradingArray[i].isBuy,
                indexedAddresses[batchTradingArray[i].makerIndex],
                indexedAddresses[batchTradingArray[i].takerIndex],
                assetsNames[batchTradingArray[i].assetIndex],
                batchTradingArray[i].assetAmount,
                batchTradingArray[i].assetRate,
                batchTradingArray[i].tradeFee,
                batchTradingArray[i].makerLeverage,
                batchTradingArray[i].takerLeverage,
                batchTradingArray[i].tradeId
                );
        }
    }

    // struct tradingArray {
    //     bool isBuy;
    //     address makerAddress;
    //     address takerAddress;
    //     string assetName;
    //     uint256 assetAmount;
    //     uint256 assetRate;
    //     uint256 tradeFee;
    //     uint16 makerLeverage;
    //     uint16 takerLeverage;
    //     string tradeId;
    // }
    /**
    * @dev Batch trading with addresses
    * @param batchTradingArray array of structs tradingArray
    **/
    function batchTrade(tradingArray[] memory batchTradingArray) public onlyOwner {

        uint256 max = batchTradingArray.length;

        for (uint256 i=0; i < max; i++) {
            trade(
                batchTradingArray[i].isBuy,
                batchTradingArray[i].makerAddress,
                batchTradingArray[i].takerAddress,
                batchTradingArray[i].assetName,
                batchTradingArray[i].assetAmount,
                batchTradingArray[i].assetRate,
                batchTradingArray[i].tradeFee,
                batchTradingArray[i].makerLeverage,
                batchTradingArray[i].takerLeverage,
                batchTradingArray[i].tradeId
                );
        }
    }

    /**
    * @notice Batch pay funding rate fees
    * @dev feeAmount should have 18 decimals
    * @param batchFees array of structs feesArray (userAddress, feeAmount)
    **/
    function batchFundingRateFees(FeesArray[] memory batchFees) public onlyOwner {

        uint256 max = batchFees.length;

        for (uint256 i=0; i < max; i++) {
            if (batchFees[i].feeAmount < 0 ) {

                require(usersAvailableBalances[batchFees[i].userAddress] >= uint(-batchFees[i].feeAmount), 
                        "Not enough balance!");
                usersAvailableBalances[batchFees[i].userAddress] -= uint(-batchFees[i].feeAmount);

            } else {

                usersAvailableBalances[batchFees[i].userAddress] += uint(batchFees[i].feeAmount);

            }
        }
    }

    function abs(int x) private pure returns (int) {
        return x >= 0 ? x : -x;
    }

}

Contract ABI

[{"inputs":[{"internalType":"address","name":"USDC_address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUSDC","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isBuy","type":"bool"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":true,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"string","name":"asset","type":"string"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradeFee","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"indexed":false,"internalType":"string","name":"tradeId","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUSDC","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"string","name":"_newAssetName","type":"string"}],"name":"addNewSupportedAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"int256","name":"feeAmount","type":"int256"}],"internalType":"struct DexilonTest_v11.FeesArray[]","name":"batchFees","type":"tuple[]"}],"name":"batchFundingRateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"address","name":"makerAddress","type":"address"},{"internalType":"address","name":"takerAddress","type":"address"},{"internalType":"string","name":"assetName","type":"string"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"internalType":"struct DexilonTest_v11.tradingArray[]","name":"batchTradingArray","type":"tuple[]"}],"name":"batchTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"uint32","name":"makerIndex","type":"uint32"},{"internalType":"uint32","name":"takerIndex","type":"uint32"},{"internalType":"uint32","name":"assetIndex","type":"uint32"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"internalType":"struct DexilonTest_v11.tradingArrayIndexed[]","name":"batchTradingArray","type":"tuple[]"}],"name":"batchTradeIndexed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"assetAmount","type":"int256"}],"name":"btcToUsdcMarketConvert","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountUSDC","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"int256","name":"assetBalance","type":"int256"},{"internalType":"uint256","name":"assetLockedBalance","type":"uint256"},{"internalType":"uint256","name":"assetPrice","type":"uint256"},{"internalType":"uint16","name":"assetLeverage","type":"uint16"}],"internalType":"struct DexilonTest_v11.userAssetParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indexedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"userAvailableBalance","type":"uint256"},{"internalType":"uint256","name":"userLockedBalance","type":"uint256"},{"internalType":"string","name":"asset","type":"string"},{"internalType":"int256","name":"userAssetBalance","type":"int256"},{"internalType":"uint16","name":"leverage","type":"uint16"}],"name":"resetUserAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"string","name":"asset","type":"string"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"name":"trade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amountUSDC","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600880546001600160a01b0319908116727a22900a3b98143368bd5906f8e17e9867581b1790915560098054821673572ddec9087154dc5dfbb1546bb62713147e0ab0179055600a8054909116737592a72a46d3165dcc7bf0802d70812af19471b31790553480156200007657600080fd5b50604051620036963803806200369683398101604081905262000099916200041b565b60078054336001600160a01b031991821617909155600a80549091166001600160a01b0383161790556040805161014081018252600361010082018181526242544360e81b6101208401528252825180840184528181526208aa8960eb1b60208083019190915280840191909152835180850185528281526214d3d360ea1b8183015283850152835180850185529182526241444160e81b828201526060830191909152825180840184526004808252632722a0a960e11b8284015260808401919091528351808501855260058152644d4154494360d81b8184015260a084015283518085018552818152634c554e4160e01b8184015260c08401528351808501909452835263444f474560e01b9083015260e0810191909152620001c3906006906008620002b2565b5060005b60065461ffff8216101562000242576001600460068361ffff1681548110620001f457620001f46200044d565b906000526020600020016040516200020d9190620004a0565b908152604051908190036020019020805491151560ff1990921691909117905580620002398162000544565b915050620001c7565b5050600780546001600160a01b0390811660009081526002602090815260408220829055925490805260039092527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff80546001600160a01b03191692909116919091179055600160055562000575565b82805482825590600052602060002090810192821562000304579160200282015b82811115620003045782518051620002f391849160209091019062000316565b5091602001919060010190620002d3565b5062000312929150620003a1565b5090565b828054620003249062000463565b90600052602060002090601f01602090048101928262000348576000855562000393565b82601f106200036357805160ff191683800117855562000393565b8280016001018555821562000393579182015b828111156200039357825182559160200191906001019062000376565b5062000312929150620003c2565b8082111562000312576000620003b88282620003d9565b50600101620003a1565b5b80821115620003125760008155600101620003c3565b508054620003e79062000463565b6000825580601f10620003f8575050565b601f016020900490600052602060002090810190620004189190620003c2565b50565b6000602082840312156200042e57600080fd5b81516001600160a01b03811681146200044657600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200047857607f821691505b602082108114156200049a57634e487b7160e01b600052602260045260246000fd5b50919050565b600080835481600182811c915080831680620004bd57607f831692505b6020808410821415620004de57634e487b7160e01b86526022600452602486fd5b818015620004f55760018114620005075762000536565b60ff1986168952848901965062000536565b60008a81526020902060005b868110156200052e5781548b82015290850190830162000513565b505084890196505b509498975050505050505050565b600061ffff808316818114156200056b57634e487b7160e01b600052601160045260246000fd5b6001019392505050565b61311180620005856000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638e2f229f11610097578063bec321a411610066578063bec321a414610225578063c845d9b714610238578063e4de0f5a1461024b578063f3fef3a31461025e57600080fd5b80638e2f229f146101ad578063abd3f612146101cd578063b6b55f25146101ef578063bb7661b71461020257600080fd5b80637022002b116100d35780637022002b1461016c578063853828b61461017f5780638a82fac5146101875780638da5cb5b1461019a57600080fd5b80632972a248146100fa57806363c7b3dc1461010f5780636ba13a8214610155575b600080fd5b61010d6101083660046123a3565b610271565b005b61013861011d36600461251f565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015e60055481565b60405190815260200161014c565b61010d61017a366004612558565b6104e5565b61010d610833565b61010d6101953660046125d4565b610915565b600754610138906001600160a01b031681565b61015e6101bb3660046126aa565b60026020526000908152604090205481565b6101e06101db3660046126aa565b610a6b565b60405161014c9392919061271f565b61010d6101fd36600461251f565b610ca7565b6102156102103660046127c6565b610dba565b604051901515815260200161014c565b61010d6102333660046127fb565b610ebb565b61010d610246366004612976565b610f7e565b61015e61025936600461251f565b61117d565b61010d61026c366004612a2a565b6112bc565b6007546001600160a01b0316331461028857600080fd5b805160005b818110156104e0576104ce8382815181106102aa576102aa612a56565b602002602001015160000151600360008685815181106102cc576102cc612a56565b60200260200101516020015163ffffffff16815260200190815260200160002060009054906101000a90046001600160a01b03166003600087868151811061031657610316612a56565b60200260200101516040015163ffffffff16815260200190815260200160002060009054906101000a90046001600160a01b0316600687868151811061035e5761035e612a56565b60200260200101516060015163ffffffff168154811061038057610380612a56565b90600052602060002001805461039590612a6c565b80601f01602080910402602001604051908101604052809291908181526020018280546103c190612a6c565b801561040e5780601f106103e35761010080835404028352916020019161040e565b820191906000526020600020905b8154815290600101906020018083116103f157829003601f168201915b505050505087868151811061042557610425612a56565b60200260200101516080015188878151811061044357610443612a56565b602002602001015160a0015189888151811061046157610461612a56565b602002602001015160c001518a898151811061047f5761047f612a56565b602002602001015160e001518b8a8151811061049d5761049d612a56565b602002602001015161010001518c8b815181106104bc576104bc612a56565b60200260200101516101200151610915565b806104d881612ab7565b91505061028d565b505050565b6007546001600160a01b031633146104fc57600080fd5b6001600160a01b038616600090815260208190526040902085905561051f6120f5565b60408051602080820183526000808352918452830181905290820181905260608201819052600160808301525b60065461ffff8216101561072b576001600160a01b0388166000908152600160205260409020600680548492919061ffff851690811061058e5761058e612a56565b906000526020600020016040516105a59190612ad2565b908152602001604051809103902060008201518160000190805190602001906105cf929190612128565b506020820151600182015560408201516002820155606082015160038201556080909101516004909101805461ffff191661ffff928316179055600680549091831690811061062057610620612a56565b90600052602060002001600160008a6001600160a01b03166001600160a01b0316815260200190815260200160002060068361ffff168154811061066657610666612a56565b9060005260206000200160405161067d9190612ad2565b908152602001604051809103902060000190805461069a90612a6c565b6106a59291906121ac565b506001600160a01b0388166000908152600160205260409020600680548592919061ffff85169081106106da576106da612a56565b906000526020600020016040516106f19190612ad2565b908152604051908190036020019020600401805461ffff9290921661ffff199092169190911790558061072381612b6e565b91505061054c565b506001600160a01b038716600090815260016020526040908190209051849190610756908790612b90565b9081526020016040518091039020600101819055508460016000896001600160a01b03166001600160a01b031681526020019081526020016000208560405161079f9190612b90565b90815260405190819003602001902060020155821561082a576107c1836113ff565b6107cd6012600a612c90565b6107db61ffff851688612c9f565b6107e59190612cbe565b6107ef9190612d59565b6001600160a01b038816600090815260016020526040908190209051610816908790612b90565b908152604051908190036020019020600301555b50505050505050565b6007546001600160a01b0316331461084a57600080fd5b600754600a546040516370a0823160e01b81523060048201526108d2926001600160a01b039081169216906370a0823190602401602060405180830381865afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190612d87565b600a546001600160a01b0316919061141f565b4715610913576007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610911573d6000803e3d6000fd5b505b565b6007546001600160a01b0316331461092c57600080fd5b60048760405161093c9190612b90565b908152604051602091819003820181205460ff169161095d91849101612da0565b604051602081830303815290604052906109935760405162461bcd60e51b815260040161098a9190612de5565b60405180910390fd5b506109a089888584611482565b6109ac88888484611482565b6109d48988888d6109bf576000196109c2565b60015b6109cc9190612cbe565b8888866117a7565b610a048888888d6109e65760016109ea565b6000195b6109f49190612cbe565b886109fe89612df8565b866117a7565b876001600160a01b0316896001600160a01b03167fa725452d7afd3dff5a0c9925ebcf78f3eafb33c3f2460f8f7d2c057897e020fa8c8a8a8a8a8a8a8a42604051610a5799989796959493929190612e15565b60405180910390a350505050505050505050565b600080606081610a7d60066012612e83565b610a8890600a612c90565b6001600160a01b038616600090815260208190526040902054610aab9190612ea6565b90506000610abb60066012612e83565b610ac690600a612c90565b610acf87611d5b565b610ad99190612ea6565b60065490915060009067ffffffffffffffff811115610afa57610afa61223c565b604051908082528060200260200182016040528015610b3357816020015b610b206120f5565b815260200190600190039081610b185790505b50905060005b600654811015610c99576001600160a01b038816600090815260016020526040902060068054610c6992919084908110610b7557610b75612a56565b90600052602060002001604051610b8c9190612ad2565b90815260200160405180910390206040518060a0016040529081600082018054610bb590612a6c565b80601f0160208091040260200160405190810160405280929190818152602001828054610be190612a6c565b8015610c2e5780601f10610c0357610100808354040283529160200191610c2e565b820191906000526020600020905b815481529060010190602001808311610c1157829003601f168201915b505050918352505060018201546020820152600282015460408201526003820154606082015260049091015461ffff16608090910152611deb565b828281518110610c7b57610c7b612a56565b60200260200101819052508080610c9190612ab7565b915050610b39565b509196909550909350915050565b600a54610cbf906001600160a01b0316333084611e6b565b610ccb60066012612e83565b610cd690600a612c90565b610ce09082612c9f565b3360009081526020819052604081208054909190610cff908490612eba565b909155505033600090815260026020526040902054158015610d2c57506007546001600160a01b03163314155b15610d7d57600580543360008181526002602090815260408083208590559382526003905291822080546001600160a01b031916909117905581546001929190610d77908490612eba565b90915550505b6040805182815242602082015233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a250565b6007546000906001600160a01b03163314610dd457600080fd5b600482604051610de49190612b90565b9081526040519081900360200190205460ff1615610e3c5760405162461bcd60e51b8152602060048201526015602482015274417373657420616c7265616479206578697374732160581b604482015260640161098a565b600680546001810182556000919091528251610e7f917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01906020850190612128565b506001600483604051610e929190612b90565b908152604051908190036020019020805491151560ff199092169190911790555060015b919050565b6007546001600160a01b03163314610ed257600080fd5b805160005b818110156104e057610f6c838281518110610ef457610ef4612a56565b602002602001015160000151848381518110610f1257610f12612a56565b602002602001015160200151858481518110610f3057610f30612a56565b602002602001015160400151868581518110610f4e57610f4e612a56565b60200260200101516060015187868151811061042557610425612a56565b80610f7681612ab7565b915050610ed7565b6007546001600160a01b03163314610f9557600080fd5b805160005b818110156104e0576000838281518110610fb657610fb6612a56565b60200260200101516020015112156110f757828181518110610fda57610fda612a56565b602002602001015160200151610fef90612df8565b60008085848151811061100457611004612a56565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000205410156110755760405162461bcd60e51b81526020600482015260136024820152724e6f7420656e6f7567682062616c616e63652160681b604482015260640161098a565b82818151811061108757611087612a56565b60200260200101516020015161109c90612df8565b6000808584815181106110b1576110b1612a56565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546110ec9190612ed2565b9091555061116b9050565b82818151811061110957611109612a56565b60200260200101516020015160008085848151811061112a5761112a612a56565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546111659190612eba565b90915550505b8061117581612ab7565b915050610f9a565b600080600860009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156111d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f79190612ee9565b5050509150506000600960009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190612ee9565b5050509150506006601261128a9190612e83565b61129590600a612c90565b816112a08685612cbe565b6112aa9190612d59565b6112b49190612d59565b949350505050565b6007546001600160a01b031633146112d357600080fd5b6112df60066012612e83565b6112ea90600a612c90565b6112f49082612c9f565b6001600160a01b03831660009081526020819052604090205410156113535760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e742062616c616e63652160581b604482015260640161098a565b600a5461136a906001600160a01b0316838361141f565b61137660066012612e83565b61138190600a612c90565b61138b9082612c9f565b6001600160a01b038316600090815260208190526040812080549091906113b3908490612ed2565b9091555050604080518281524260208201526001600160a01b038416917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a25050565b6000808212156114175761141282612df8565b611419565b815b92915050565b6040516001600160a01b0383166024820152604481018290526104e090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ea9565b60008060008461ffff16118360405160200161149e9190612f41565b604051602081830303815290604052906114cb5760405162461bcd60e51b815260040161098a9190612de5565b506001600160a01b0386166000908152600160205260409081902090516114f3908790612b90565b90815260200160405180910390206002015460001415611560576001600160a01b038616600090815260016020526040908190209051859190611537908890612b90565b908152604051908190036020019020600401805461ffff9290921661ffff199092169190911790555b6001600160a01b03861660009081526001602052604090819020905161ffff8616919061158e908890612b90565b9081526040519081900360200190206004015461ffff161461179f576115b66012600a612c90565b6001600160a01b03871660009081526001602052604090819020905161ffff8716916115fe916115e7908a90612b90565b9081526020016040518091039020600101546113ff565b6001600160a01b038916600090815260016020526040908190209051611625908a90612b90565b9081526020016040518091039020600301546116419190612cbe565b61164b9190612d59565b6116559190612d59565b6001600160a01b03871660009081526001602052604090819020905191925090611680908790612b90565b9081526020016040518091039020600201548161169d9190612f79565b6001600160a01b0387166000908152602081905260409020546116c09190612f79565b91506000821215836040516020016116d89190612fb8565b604051602081830303815290604052906117055760405162461bcd60e51b815260040161098a9190612de5565b506001600160a01b038616600090815260208181526040808320859055600190915290819020905182919061173b908890612b90565b9081526040805160209281900383018120600201939093556001600160a01b0389166000908152600190925290208591611776908890612b90565b908152604051908190036020019020600401805461ffff9290921661ffff199092169190911790555b505050505050565b6001600160a01b03861660009081526001602052604080822090516117cd908890612b90565b9081526020016040518091039020600101549050600060016000896001600160a01b03166001600160a01b03168152602001908152602001600020876040516118169190612b90565b9081526040805160209281900383018120600201546001600160a01b038c1660009081526001909452918320919350611850908a90612b90565b90815260405190819003602001902060030154905060006118736012600a612c90565b6001600160a01b038b1660009081526001602052604090819020905161189a908c90612b90565b908152604051908190036020019020600401546118bb919061ffff16612cbe565b905060006118cb60066012612e83565b6118d690600a612c90565b6118e09088612cbe565b6001600160a01b038c166000908152602081905260409020546119039190612ffd565b6001600160a01b038c166000908152600160205260409081902090519192509061192e908c90612b90565b908152604051908190036020019020805461194890612a6c565b151590506119a0576001600160a01b038b166000908152600160205260409081902090518b919061197a908390612b90565b9081526020016040518091039020600001908051906020019061199e929190612128565b505b6119ac60066012612e83565b6119b790600a612c90565b6119c19089612cbe565b975060008813866040516020016119d8919061303e565b60405160208183030381529060405290611a055760405162461bcd60e51b815260040161098a9190612de5565b50600089138015611a165750600085125b80611a2c5750600089128015611a2c5750600085135b8015611a475750611a3c856113ff565b611a458a6113ff565b135b15611ae557611a586012600a612c90565b611a628985612f79565b611a6c9087612cbe565b611a769190612d59565b8284611a81886113ff565b611a8b9190612cbe565b611a959190612d59565b611a9f9083612ffd565b611aa99190612f79565b9050611ac882611ab98588612cbe565b611ac39190612d59565b6113ff565b611ad29085612f79565b9350611ade858a612ffd565b9850600094505b841580611afd5750600085128015611afd5750600089125b80611b135750600085138015611b135750600089135b15611b8557611b2682611ab98a8c612cbe565b611b309082612f79565b9050611b4082611ab98a8c612cbe565b611b4a9085612ffd565b9350611b568986612ffd565b611b60898b612cbe565b611b6a8588612cbe565b611b749190612ffd565b611b7e9190612d59565b9250611bff565b611b916012600a612c90565b611b9b8985612f79565b611ba5908b612cbe565b611baf9190612d59565b8284611bba8c6113ff565b611bc49190612cbe565b611bce9190612d59565b611bd89083612ffd565b611be29190612ffd565b9050611bf282611ab9858c612cbe565b611bfc9085612f79565b93505b600081121586604051602001611c159190612fb8565b60405160208183030381529060405290611c425760405162461bcd60e51b815260040161098a9190612de5565b50600084121586604051602001611c599190613079565b60405160208183030381529060405290611c865760405162461bcd60e51b815260040161098a9190612de5565b506001600160a01b038b166000908152602081815260408083208490556001909152908190209051859190611cbc908d90612b90565b9081526040805160209281900383018120600201939093556001600160a01b038e166000908152600190925290208491611cf7908d90612b90565b90815260405190819003602001902060030155611d148986612ffd565b6001600160a01b038c16600090815260016020526040908190209051611d3b908d90612b90565b908152604051908190036020019020600101555050505050505050505050565b6000805b60065461ffff82161015611de5576001600160a01b03831660009081526001602052604090206006805461ffff8416908110611d9d57611d9d612a56565b90600052602060002001604051611db49190612ad2565b90815260200160405180910390206002015482611dd19190612eba565b915080611ddd81612b6e565b915050611d5f565b50919050565b611df36120f5565b8151815260208083015190820152611e0d60066012612e83565b611e1890600a612c90565b8260400151611e279190612ea6565b6040820152611e3860066012612e83565b611e4390600a612c90565b8260600151611e529190612ea6565b606082015260809182015161ffff169181019190915290565b6040516001600160a01b0380851660248301528316604482015260648101829052611ea39085906323b872dd60e01b9060840161144b565b50505050565b6000611efe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f7b9092919063ffffffff16565b8051909150156104e05780806020019051810190611f1c91906130be565b6104e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161098a565b6060611f8a8484600085611f94565b90505b9392505050565b606082471015611ff55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161098a565b843b6120435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161098a565b600080866001600160a01b0316858760405161205f9190612b90565b60006040518083038185875af1925050503d806000811461209c576040519150601f19603f3d011682016040523d82523d6000602084013e6120a1565b606091505b50915091506120b18282866120bc565b979650505050505050565b606083156120cb575081611f8d565b8251156120db5782518084602001fd5b8160405162461bcd60e51b815260040161098a9190612de5565b6040518060a0016040528060608152602001600081526020016000815260200160008152602001600061ffff1681525090565b82805461213490612a6c565b90600052602060002090601f016020900481019282612156576000855561219c565b82601f1061216f57805160ff191683800117855561219c565b8280016001018555821561219c579182015b8281111561219c578251825591602001919060010190612181565b506121a8929150612227565b5090565b8280546121b890612a6c565b90600052602060002090601f0160209004810192826121da576000855561219c565b82601f106121eb578054855561219c565b8280016001018555821561219c57600052602060002091601f016020900482015b8281111561219c57825482559160010191906001019061220c565b5b808211156121a85760008155600101612228565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff811182821017156122765761227661223c565b60405290565b6040805190810167ffffffffffffffff811182821017156122765761227661223c565b604051601f8201601f1916810167ffffffffffffffff811182821017156122c8576122c861223c565b604052919050565b600067ffffffffffffffff8211156122ea576122ea61223c565b5060051b60200190565b801515811461091157600080fd5b8035610eb6816122f4565b803563ffffffff81168114610eb657600080fd5b803561ffff81168114610eb657600080fd5b600082601f83011261234457600080fd5b813567ffffffffffffffff81111561235e5761235e61223c565b612371601f8201601f191660200161229f565b81815284602083860101111561238657600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156123b657600080fd5b823567ffffffffffffffff808211156123ce57600080fd5b818501915085601f8301126123e257600080fd5b81356123f56123f0826122d0565b61229f565b81815260059190911b8301840190848101908883111561241457600080fd5b8585015b83811015612512578035858111156124305760008081fd5b8601610140818c03601f19018113156124495760008081fd5b612451612252565b61245c8a8401612302565b8152604061246b81850161230d565b8b830152606061247c81860161230d565b828401526080915061248f82860161230d565b818401525060a0808501358284015260c0915081850135818401525060e0808501358284015261010091506124c5828601612321565b908301526101206124d7858201612321565b838301529284013592898411156124f057600091508182fd5b6124fe8f8d86880101612333565b908301525085525050918601918601612418565b5098975050505050505050565b60006020828403121561253157600080fd5b5035919050565b6001600160a01b038116811461091157600080fd5b8035610eb681612538565b60008060008060008060c0878903121561257157600080fd5b863561257c81612538565b95506020870135945060408701359350606087013567ffffffffffffffff8111156125a657600080fd5b6125b289828a01612333565b935050608087013591506125c860a08801612321565b90509295509295509295565b6000806000806000806000806000806101408b8d0312156125f457600080fd5b6125fd8b612302565b995061260b60208c0161254d565b985061261960408c0161254d565b975060608b013567ffffffffffffffff8082111561263657600080fd5b6126428e838f01612333565b985060808d0135975060a08d0135965060c08d0135955061266560e08e01612321565b94506126746101008e01612321565b93506101208d013591508082111561268b57600080fd5b506126988d828e01612333565b9150509295989b9194979a5092959850565b6000602082840312156126bc57600080fd5b8135611f8d81612538565b60005b838110156126e25781810151838201526020016126ca565b83811115611ea35750506000910152565b6000815180845261270b8160208601602086016126c7565b601f01601f19169290920160200192915050565b600060608083018684526020868186015260408381870152828751808552608094508488019150848160051b890101848a0160005b838110156127b457607f198b8403018552815160a0815181865261277a828701826126f3565b838b0151878c0152898401518a8801528c8401518d880152928b015161ffff16958b01959095525094870194925090860190600101612754565b50909c9b505050505050505050505050565b6000602082840312156127d857600080fd5b813567ffffffffffffffff8111156127ef57600080fd5b6112b484828501612333565b6000602080838503121561280e57600080fd5b823567ffffffffffffffff8082111561282657600080fd5b818501915085601f83011261283a57600080fd5b81356128486123f0826122d0565b81815260059190911b8301840190848101908883111561286757600080fd5b8585015b838110156125125780358581111561288257600080fd5b8601610140818c03601f190181131561289a57600080fd5b6128a2612252565b6128ad8a8401612302565b81526128bb6040840161254d565b8a8201526128cb6060840161254d565b6040820152608080840135898111156128e45760008081fd5b6128f28f8d83880101612333565b60608401525060a0808501358284015260c0915081850135818401525060e080850135828401526101009150612929828601612321565b9083015261012061293b858201612321565b8383015292840135928984111561295457600091508182fd5b6129628f8d86880101612333565b90830152508552505091860191860161286b565b6000602080838503121561298957600080fd5b823567ffffffffffffffff8111156129a057600080fd5b8301601f810185136129b157600080fd5b80356129bf6123f0826122d0565b81815260069190911b820183019083810190878311156129de57600080fd5b928401925b828410156120b157604084890312156129fc5760008081fd5b612a0461227c565b8435612a0f81612538565b815284860135868201528252604090930192908401906129e3565b60008060408385031215612a3d57600080fd5b8235612a4881612538565b946020939093013593505050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680612a8057607f821691505b60208210811415611de557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612acb57612acb612aa1565b5060010190565b600080835481600182811c915080831680612aee57607f831692505b6020808410821415612b0e57634e487b7160e01b86526022600452602486fd5b818015612b225760018114612b3357612b60565b60ff19861689528489019650612b60565b60008a81526020902060005b86811015612b585781548b820152908501908301612b3f565b505084890196505b509498975050505050505050565b600061ffff80831681811415612b8657612b86612aa1565b6001019392505050565b60008251612ba28184602087016126c7565b9190910192915050565b600181815b80851115612be7578160001904821115612bcd57612bcd612aa1565b80851615612bda57918102915b93841c9390800290612bb1565b509250929050565b600082612bfe57506001611419565b81612c0b57506000611419565b8160018114612c215760028114612c2b57612c47565b6001915050611419565b60ff841115612c3c57612c3c612aa1565b50506001821b611419565b5060208310610133831016604e8410600b8410161715612c6a575081810a611419565b612c748383612bac565b8060001904821115612c8857612c88612aa1565b029392505050565b6000611f8d60ff841683612bef565b6000816000190483118215151615612cb957612cb9612aa1565b500290565b60006001600160ff1b0381841382841380821686840486111615612ce457612ce4612aa1565b600160ff1b6000871282811687830589121615612d0357612d03612aa1565b60008712925087820587128484161615612d1f57612d1f612aa1565b87850587128184161615612d3557612d35612aa1565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b600082612d6857612d68612d43565b600160ff1b821460001984141615612d8257612d82612aa1565b500590565b600060208284031215612d9957600080fd5b5051919050565b7f556e6b6e6f776e2041737365742120547261646549643a000000000000000000815260008251612dd88160178501602087016126c7565b9190910160170192915050565b602081526000611f8d60208301846126f3565b6000600160ff1b821415612e0e57612e0e612aa1565b5060000390565b60006101208b15158352806020840152612e318184018c6126f3565b905089604084015288606084015287608084015261ffff80881660a085015280871660c08501525082810360e0840152612e6b81866126f3565b915050826101008301529a9950505050505050505050565b600060ff821660ff841680821015612e9d57612e9d612aa1565b90039392505050565b600082612eb557612eb5612d43565b500490565b60008219821115612ecd57612ecd612aa1565b500190565b600082821015612ee457612ee4612aa1565b500390565b600080600080600060a08688031215612f0157600080fd5b8551612f0c81612538565b809550506020860151935060408601519250606086015191506080860151612f3381612538565b809150509295509295909350565b7f5a65726f204c657665726167652120547261646549643a000000000000000000815260008251612dd88160178501602087016126c7565b60008083128015600160ff1b850184121615612f9757612f97612aa1565b6001600160ff1b0384018313811615612fb257612fb2612aa1565b50500390565b7f496e73756666696369656e742062616c616e63652120547261646549643a0000815260008251612ff081601e8501602087016126c7565b91909101601e0192915050565b600080821280156001600160ff1b038490038513161561301f5761301f612aa1565b600160ff1b839003841281161561303857613038612aa1565b50500190565b722d32b937902930ba3290902a3930b232a4b21d60691b81526000825161306c8160138501602087016126c7565b9190910160130192915050565b7f4c6f636b656442616c616e6365203c20302120547261646549643a00000000008152600082516130b181601b8501602087016126c7565b91909101601b0192915050565b6000602082840312156130d057600080fd5b8151611f8d816122f456fea264697066735822122065cdfd7cde1f41e9b0140f4d6939f2734beedf92add5141baed74f06afc3cb3064736f6c634300080a00330000000000000000000000007592a72a46d3165dcc7bf0802d70812af19471b3

Deployed ByteCode Sourcemap

13403:19572:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30046:791;;;;;;:::i;:::-;;:::i;:::-;;14611:51;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;14611:51:0;;;;;;-1:-1:-1;;;;;5092:32:1;;;5074:51;;5062:2;5047:18;14611:51:0;;;;;;;;14727:25;;;;;;;;;5282::1;;;5270:2;5255:18;14727:25:0;5136:177:1;21289:1373:0;;;;;;:::i;:::-;;:::i;21005:245::-;;;:::i;23464:986::-;;;;;;:::i;:::-;;:::i;14801:28::-;;;;;-1:-1:-1;;;;;14801:28:0;;;14559:45;;;;;;:::i;:::-;;;;;;;;;;;;;;18710:644;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;17681:534::-;;;;;;:::i;:::-;;:::i;16786:289::-;;;;;;:::i;:::-;;:::i;:::-;;;10427:14:1;;10420:22;10402:41;;10390:2;10375:18;16786:289:0;10262:187:1;31318:731:0;;;;;;:::i;:::-;;:::i;32240:634::-;;;;;;:::i;:::-;;:::i;17161:371::-;;;;;;:::i;:::-;;:::i;20531:435::-;;;;;;:::i;:::-;;:::i;30046:791::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;30165:24;;30151:11:::1;30202:628;30224:3;30220:1;:7;30202:628;;;30249:569;30273:17;30291:1;30273:20;;;;;;;;:::i;:::-;;;;;;;:26;;;30318:16;:49;30335:17;30353:1;30335:20;;;;;;;;:::i;:::-;;;;;;;:31;;;30318:49;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30318:49:0::1;30386:16;:49;30403:17;30421:1;30403:20;;;;;;;;:::i;:::-;;;;;;;:31;;;30386:49;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30386:49:0::1;30454:11;30466:17;30484:1;30466:20;;;;;;;;:::i;:::-;;;;;;;:31;;;30454:44;;;;;;;;;;:::i;:::-;;;;;;;;30249:569;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30517:17;30535:1;30517:20;;;;;;;;:::i;:::-;;;;;;;:32;;;30568:17;30586:1;30568:20;;;;;;;;:::i;:::-;;;;;;;:30;;;30617:17;30635:1;30617:20;;;;;;;;:::i;:::-;;;;;;;:29;;;30665:17;30683:1;30665:20;;;;;;;;:::i;:::-;;;;;;;:34;;;30718:17;30736:1;30718:20;;;;;;;;:::i;:::-;;;;;;;:34;;;30771:17;30789:1;30771:20;;;;;;;;:::i;:::-;;;;;;;:28;;;30249:5;:569::i;:::-;30229:3:::0;::::1;::::0;::::1;:::i;:::-;;;;30202:628;;;;30138:699;30046:791:::0;:::o;21289:1373::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;-1:-1:-1;;;;;21640:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;:58;;;21719:41:::1;;:::i;:::-;21771:29;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;21771:29:0;;;;;;21811:27;::::1;:31:::0;;;21853:33;;::::1;:37:::0;;;21901:25:::1;::::0;::::1;:29:::0;;;21972:1:::1;21941:28;::::0;::::1;:32:::0;21986:302:::1;22005:11;:18:::0;22003:20:::1;::::0;::::1;;21986:302;;;-1:-1:-1::0;;;;;22045:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;22074:11:::1;:14:::0;;22092;;22045:28;22074:11;:14:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;22045:44;;;;;;:::i;:::-;;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;22045:61:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;22045:61:0::1;;::::0;;::::1;;::::0;;22178:11:::1;:14:::0;;:11;;:14;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;22121:15;:28;22137:11;-1:-1:-1::0;;;;;22121:28:0::1;-1:-1:-1::0;;;;;22121:28:0::1;;;;;;;;;;;;22150:11;22162:1;22150:14;;;;;;;;;;:::i;:::-;;;;;;;;22121:44;;;;;;:::i;:::-;;;;;;;;;;;;;:54;;:71;;;;;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;22207:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;22236:11:::1;:14:::0;;22268:8;;22207:28;22236:11;:14:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;22207:44;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:58:::1;;:69:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;22207:69:0;;::::1;::::0;;;::::1;::::0;;22025:3;::::1;::::0;::::1;:::i;:::-;;;;21986:302;;;-1:-1:-1::0;;;;;;22300:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;:35;;22351:16;;22300:28;:35:::1;::::0;22329:5;;22300:35:::1;:::i;:::-;;;;;;;;;;;;;:48;;:67;;;;22435:17;22378:15;:28;22394:11;-1:-1:-1::0;;;;;22378:28:0::1;-1:-1:-1::0;;;;;22378:28:0::1;;;;;;;;;;;;22407:5;22378:35;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:54:::1;;:74:::0;22467:21;;22463:190:::1;;22629:21;22633:16;22629:3;:21::i;:::-;15581:16;15522:2;15581;:16;:::i;:::-;22563:28;;::::0;::::1;:17:::0;:28:::1;:::i;:::-;22559:52;;;;:::i;:::-;22558:92;;;;:::i;:::-;-1:-1:-1::0;;;;;22504:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;:35;;::::1;::::0;22533:5;;22504:35:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:46:::1;;:147:::0;22463:190:::1;21629:1033;21289:1373:::0;;;;;;:::o;21005:245::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;21082:5:::1;::::0;21089:12:::1;::::0;:37:::1;::::0;-1:-1:-1;;;21089:37:0;;21120:4:::1;21089:37;::::0;::::1;5074:51:1::0;21056:71:0::1;::::0;-1:-1:-1;;;;;21082:5:0;;::::1;::::0;21089:12:::1;::::0;:22:::1;::::0;5047:18:1;;21089:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21056:12;::::0;-1:-1:-1;;;;;21056:12:0::1;::::0;:71;:25:::1;:71::i;:::-;21152:21;:25:::0;21148:95:::1;;21194:5;::::0;:37:::1;::::0;-1:-1:-1;;;;;21194:5:0;;::::1;::::0;21209:21:::1;21194:37:::0;::::1;;;::::0;:5:::1;:37:::0;:5;:37;21209:21;21194:5;:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21148:95;21005:245::o:0;23464:986::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;23810:10:::1;23821:5;23810:17;;;;;;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;;::::0;23836:52:::1;::::0;23880:7;;23836:52:::1;;:::i;:::-;;;;;;;;;;;;;23802:88;;;;;-1:-1:-1::0;;;23802:88:0::1;;;;;;;;:::i;:::-;;;;;;;;;;23903:56;23922:5;23929;23936:13;23951:7;23903:18;:56::i;:::-;23970;23989:5;23996;24003:13;24018:7;23970:18;:56::i;:::-;24047:117;24066:5;24073;24111:11;24081:5;:24;;-1:-1:-1::0;;24081:24:0::1;;;24093:1;24081:24;24080:43;;;;:::i;:::-;24129:9;24145:8;24156:7;24047:18;:117::i;:::-;24175:118;24194:5;24201;24239:11;24209:5;:24;;24231:1;24209:24;;;-1:-1:-1::0;;24209:24:0::1;24208:43;;;;:::i;:::-;24257:9:::0;24269:14:::1;24274:8:::0;24269:14:::1;:::i;:::-;24285:7;24175:18;:118::i;:::-;24339:5;-1:-1:-1::0;;;;;24319:123:0::1;24332:5;-1:-1:-1::0;;;;;24319:123:0::1;;24325:5;24346;24353:11;24366:9;24377:8;24387:13;24402;24417:7;24426:15;24319:123;;;;;;;;;;;;;;:::i;:::-;;;;;;;;23464:986:::0;;;;;;;;;;:::o;18710:644::-;18780:7;;18800:28;18780:7;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;-1:-1:-1;;;;;18875:28:0;;:22;:28;;;;;;;;;;;:52;;;;:::i;:::-;18848:79;-1:-1:-1;18938:21:0;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;18962:26;18983:4;18962:20;:26::i;:::-;:50;;;;:::i;:::-;19093:11;:18;18938:74;;-1:-1:-1;19025:39:0;;19067:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;19025:87;;19130:9;19125:155;19147:11;:18;19143:22;;19125:155;;;-1:-1:-1;;;;;19230:21:0;;;;;;:15;:21;;;;;19252:11;:14;;19203:65;;19230:21;19252:11;19264:1;;19252:14;;;;;;:::i;:::-;;;;;;;;19230:37;;;;;;:::i;:::-;;;;;;;;;;;;;19203:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19203:65:0;;;-1:-1:-1;;19203:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;:65::i;:::-;19187:10;19198:1;19187:13;;;;;;;;:::i;:::-;;;;;;:81;;;;19167:3;;;;;:::i;:::-;;;;19125:155;;;-1:-1:-1;19300:16:0;;19318:13;;-1:-1:-1;19300:16:0;;-1:-1:-1;18710:644:0;-1:-1:-1;;18710:644:0:o;17681:534::-;17736:12;;:68;;-1:-1:-1;;;;;17736:12:0;17766:10;17786:4;17793:10;17736:29;:68::i;:::-;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;17863:34;;:10;:34;:::i;:::-;17848:10;17825:22;:34;;;;;;;;;;:72;;:34;;:22;:72;;;;;:::i;:::-;;;;-1:-1:-1;;17953:10:0;17942:22;;;;:10;:22;;;;;;:27;:50;;;;-1:-1:-1;17987:5:0;;-1:-1:-1;;;;;17987:5:0;17973:10;:19;;17942:50;17938:204;;;18034:10;;;18020;18009:22;;;;:10;:22;;;;;;;;:35;;;18059:28;;;:16;:28;;;;;:41;;-1:-1:-1;;;;;;18059:41:0;;;;;;18115:15;;18059:41;;18034:10;18009:22;18115:15;;18059:41;;18115:15;:::i;:::-;;;;-1:-1:-1;;17938:204:0;18159:48;;;22435:25:1;;;18191:15:0;22491:2:1;22476:18;;22469:34;18167:10:0;;18159:48;;22408:18:1;18159:48:0;;;;;;;17681:534;:::o;16786:289::-;16752:5;;16871:4;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;16898:10:::1;16909:13;16898:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;:34;16890:68;;;::::0;-1:-1:-1;;;16890:68:0;;22716:2:1;16890:68:0::1;::::0;::::1;22698:21:1::0;22755:2;22735:18;;;22728:30;-1:-1:-1;;;22774:18:1;;;22767:51;22835:18;;16890:68:0::1;22514:345:1::0;16890:68:0::1;16971:11;:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;16971:31:0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;17041:4;17013:10;17024:13;17013:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:32;;;::::1;;-1:-1:-1::0;;17013:32:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;17013:32:0;16769:1:::1;16786:289:::0;;;:::o;31318:731::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;31423:24;;31409:11:::1;31460:582;31482:3;31478:1;:7;31460:582;;;31507:523;31531:17;31549:1;31531:20;;;;;;;;:::i;:::-;;;;;;;:26;;;31576:17;31594:1;31576:20;;;;;;;;:::i;:::-;;;;;;;:33;;;31628:17;31646:1;31628:20;;;;;;;;:::i;:::-;;;;;;;:33;;;31680:17;31698:1;31680:20;;;;;;;;:::i;:::-;;;;;;;:30;;;31729:17;31747:1;31729:20;;;;;;;;:::i;31507:523::-;31487:3:::0;::::1;::::0;::::1;:::i;:::-;;;;31460:582;;32240:634:::0;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;32344:16;;32330:11:::1;32373:494;32395:3;32391:1;:7;32373:494;;;32449:1;32424:9;32434:1;32424:12;;;;;;;;:::i;:::-;;;;;;;:22;;;:26;32420:436;;;32540:9;32550:1;32540:12;;;;;;;;:::i;:::-;;;;;;;:22;;;32539:23;;;:::i;:::-;32482:22;:48:::0;32505:9:::1;32515:1;32505:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;32482:48:0::1;-1:-1:-1::0;;;;;32482:48:0::1;;;;;;;;;;;;;:81;;32474:139;;;::::0;-1:-1:-1;;;32474:139:0;;23066:2:1;32474:139:0::1;::::0;::::1;23048:21:1::0;23105:2;23085:18;;;23078:30;-1:-1:-1;;;23124:18:1;;;23117:49;23183:18;;32474:139:0::1;22864:343:1::0;32474:139:0::1;32690:9;32700:1;32690:12;;;;;;;;:::i;:::-;;;;;;;:22;;;32689:23;;;:::i;:::-;32632:22;:48:::0;32655:9:::1;32665:1;32655:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;32632:48:0::1;-1:-1:-1::0;;;;;32632:48:0::1;;;;;;;;;;;;;:81;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;32420:436:0::1;::::0;-1:-1:-1;32420:436:0::1;;32815:9;32825:1;32815:12;;;;;;;;:::i;:::-;;;;;;;:22;;;32758;:48:::0;32781:9:::1;32791:1;32781:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;32758:48:0::1;-1:-1:-1::0;;;;;32758:48:0::1;;;;;;;;;;;;;:80;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;32420:436:0::1;32400:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32373:494;;17161:371:::0;17231:3;17250:23;17283:17;;;;;;;;;-1:-1:-1;;;;;17283:17:0;-1:-1:-1;;;;;17283:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17247:71;;;;;;17332:24;17366:18;;;;;;;;;-1:-1:-1;;;;;17366:18:0;-1:-1:-1;;;;;17366:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17329:73;;;;;;15475:1;15522:2;17494:28;;;;:::i;:::-;17489:34;;:2;:34;:::i;:::-;17463:20;17431:31;17451:11;17431:19;:31;:::i;:::-;:52;;;;:::i;:::-;17430:94;;;;:::i;:::-;17423:101;17161:371;-1:-1:-1;;;;17161:371:0:o;20531:435::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;15654:26:::1;15475:1;15522:2;15654:26;:::i;:::-;15649:32;::::0;:2:::1;:32;:::i;:::-;20675:34;::::0;:10;:34:::1;:::i;:::-;-1:-1:-1::0;;;;;20636:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;;:73:::1;;20628:107;;;::::0;-1:-1:-1;;;20628:107:0;;24118:2:1;20628:107:0::1;::::0;::::1;24100:21:1::0;24157:2;24137:18;;;24130:30;-1:-1:-1;;;24176:18:1;;;24169:51;24237:18;;20628:107:0::1;23916:345:1::0;20628:107:0::1;20748:12;::::0;:50:::1;::::0;-1:-1:-1;;;;;20748:12:0::1;20774:11:::0;20787:10;20748:25:::1;:50::i;:::-;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;::::0;:2:::1;:32;:::i;:::-;20848:34;::::0;:10;:34:::1;:::i;:::-;-1:-1:-1::0;;;;;20809:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;:73;;:35;;:22;:73:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;20908:50:0::1;::::0;;22435:25:1;;;20942:15:0::1;22491:2:1::0;22476:18;;22469:34;-1:-1:-1;;;;;20908:50:0;::::1;::::0;::::1;::::0;22408:18:1;20908:50:0::1;;;;;;;20531:435:::0;;:::o;32882:88::-;32924:3;32952:1;32947;:6;;:15;;32960:2;32961:1;32960:2;:::i;:::-;32947:15;;;32956:1;32947:15;32940:22;32882:88;-1:-1:-1;;32882:88:0:o;9555:211::-;9699:58;;-1:-1:-1;;;;;24458:32:1;;9699:58:0;;;24440:51:1;24507:18;;;24500:34;;;9672:86:0;;9692:5;;-1:-1:-1;;;9722:23:0;24413:18:1;;9699:58:0;;;;-1:-1:-1;;9699:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9699:58:0;-1:-1:-1;;;;;;9699:58:0;;;;;;;;;;9672:19;:86::i;28221:1324::-;28394:23;28430:20;28503:1;28487:13;:17;;;28557:7;28513:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;28479:88;;;;;-1:-1:-1;;;28479:88:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;28584:21:0;;;;;;:15;:21;;;;;;;:28;;;;28606:5;;28584:28;:::i;:::-;;;;;;;;;;;;;:47;;;28635:1;28584:52;28580:143;;;-1:-1:-1;;;;;28653:21:0;;;;;;:15;:21;;;;;;;:28;;28698:13;;28653:21;:28;;28675:5;;28653:28;:::i;:::-;;;;;;;;;;;;;;:42;;:58;;;;;;;-1:-1:-1;;28653:58:0;;;;;;;;;28580:143;-1:-1:-1;;;;;28739:21:0;;;;;;:15;:21;;;;;;;:28;;:59;;;;:21;:28;;28761:5;;28739:28;:::i;:::-;;;;;;;;;;;;;;:42;;;;;:59;28735:803;;15581:16;15522:2;15581;:16;:::i;:::-;-1:-1:-1;;;;;28910:21:0;;;;;;:15;:21;;;;;;;:28;;28961:22;;;;28902:51;;28910:28;;28932:5;;28910:28;:::i;:::-;;;;;;;;;;;;;:41;;;28902:3;:51::i;:::-;-1:-1:-1;;;;;28841:21:0;;;;;;:15;:21;;;;;;;:28;;;;28863:5;;28841:28;:::i;:::-;;;;;;;;;;;;;:39;;;28837:116;;;;:::i;:::-;28836:148;;;;:::i;:::-;28835:168;;;;:::i;:::-;-1:-1:-1;;;;;29118:21:0;;;;;;:15;:21;;;;;;;:28;;28816:187;;-1:-1:-1;29118:21:0;:28;;29140:5;;29118:28;:::i;:::-;;;;;;;;;;;;;:47;;;29095:16;:71;;;;:::i;:::-;-1:-1:-1;;;;;29044:28:0;;:22;:28;;;;;;;;;;;29040:127;;;;:::i;:::-;29018:149;;29215:1;29192:19;:24;;29276:7;29225:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;29184:102;;;;;-1:-1:-1;;;29184:102:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;29304:28:0;;:22;:28;;;;;;;;;;;:59;;;29378:15;:21;;;;;;;:28;;29436:16;;29378:21;:28;;29400:5;;29378:28;:::i;:::-;;;;;;;;;;;;;;;;:47;;:75;;;;-1:-1:-1;;;;;29468:21:0;;;;;;:15;:21;;;;;29513:13;;29468:28;;29490:5;;29468:28;:::i;:::-;;;;;;;;;;;;;;:42;;:58;;;;;;;-1:-1:-1;;29468:58:0;;;;;;;;;28735:803;28381:1164;;28221:1324;;;;:::o;24952:2903::-;-1:-1:-1;;;;;25184:21:0;;25165:16;25184:21;;;:15;:21;;;;;;:28;;;;25206:5;;25184:28;:::i;:::-;;;;;;;;;;;;;:41;;;25165:60;;25236:17;25260:15;:21;25276:4;-1:-1:-1;;;;;25260:21:0;-1:-1:-1;;;;;25260:21:0;;;;;;;;;;;;25282:5;25260:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:47;;;-1:-1:-1;;;;;25340:21:0;;25319:14;25340:21;;;:15;:21;;;;;;25260:47;;-1:-1:-1;25340:28:0;;25362:5;;25340:28;:::i;:::-;;;;;;;;;;;;;;:39;;;;-1:-1:-1;25391:12:0;15581:16;15522:2;15581;:16;:::i;:::-;-1:-1:-1;;;;;25418:21:0;;;;;;:15;:21;;;;;;;:28;;;;25440:5;;25418:28;:::i;:::-;;;;;;;;;;;;;;:42;;;25406:74;;;25418:42;;25406:74;:::i;:::-;25391:89;-1:-1:-1;25491:20:0;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;25550:26;;:8;:26;:::i;:::-;-1:-1:-1;;;;;25518:28:0;;:22;:28;;;;;;;;;;;25514:62;;;;:::i;:::-;-1:-1:-1;;;;;25598:21:0;;;;;;:15;:21;;;;;;;:28;;25491:85;;-1:-1:-1;25598:21:0;:28;;25620:5;;25598:28;:::i;:::-;;;;;;;;;;;;;;25592:52;;;;;:::i;:::-;:57;25589:124;;-1:-1:-1;25589:124:0;;-1:-1:-1;;;;;25665:21:0;;;;;;:15;:21;;;;;;;:28;;25706:5;;25665:21;:28;;25706:5;;25665:28;:::i;:::-;;;;;;;;;;;;;:38;;:46;;;;;;;;;;;;:::i;:::-;;25589:124;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;25737:27;;:9;:27;:::i;:::-;25725:39;;25797:1;25785:9;:13;25847:7;25807:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;25777:80;;;;;-1:-1:-1;;;25777:80:0;;;;;;;;:::i;:::-;;25898:1;25884:11;:15;:35;;;;;25918:1;25903:12;:16;25884:35;25883:94;;;;25955:1;25941:11;:15;:35;;;;;25975:1;25960:12;:16;25941:35;25882:153;;;;;26018:17;26022:12;26018:3;:17::i;:::-;25999:16;26003:11;25999:3;:16::i;:::-;:36;25882:153;25878:544;;;15581:16;15522:2;15581;:16;:::i;:::-;26197:22;26210:9;26197:10;:22;:::i;:::-;26183:37;;:12;:37;:::i;:::-;:55;;;;:::i;:::-;26153:8;26141:10;26123:17;26127:12;26123:3;:17::i;:::-;:28;;;;:::i;:::-;:39;;;;:::i;:::-;26085:77;;:16;:77;:::i;:::-;:153;;;;:::i;:::-;26066:172;-1:-1:-1;26285:39:0;26314:8;26289:23;26302:10;26289:12;:23;:::i;:::-;:34;;;;:::i;:::-;26285:3;:39::i;:::-;26269:55;;:13;:55;:::i;:::-;26253:71;-1:-1:-1;26353:26:0;26367:12;26353:11;:26;:::i;:::-;26339:40;;26409:1;26394:16;;25878:544;26464:17;;;:77;;;26520:1;26505:12;:16;:35;;;;;26539:1;26525:11;:15;26505:35;26464:136;;;;26579:1;26564:12;:16;:35;;;;;26598:1;26584:11;:15;26564:35;26460:851;;;26674:37;26701:8;26678:21;26690:9;26678:11;:21;:::i;26674:37::-;26638:73;;:16;:73;:::i;:::-;26619:92;-1:-1:-1;26758:37:0;26785:8;26762:21;26774:9;26762:11;:21;:::i;26758:37::-;26742:53;;:13;:53;:::i;:::-;26726:69;-1:-1:-1;26876:26:0;26891:11;26876:12;:26;:::i;:::-;26850:21;26862:9;26850:11;:21;:::i;:::-;26824:23;26837:10;26824:12;:23;:::i;:::-;:47;;;;:::i;:::-;26823:80;;;;:::i;:::-;26810:93;;26460:851;;;15581:16;15522:2;15581;:16;:::i;:::-;27173:22;27186:9;27173:10;:22;:::i;:::-;27160:36;;:11;:36;:::i;:::-;:54;;;;:::i;:::-;27131:8;27119:10;27102:16;27106:11;27102:3;:16::i;:::-;:27;;;;:::i;:::-;:38;;;;:::i;:::-;27065:75;;:16;:75;:::i;:::-;:149;;;;:::i;:::-;27046:168;-1:-1:-1;27261:38:0;27289:8;27265:22;27277:10;27265:11;:22;:::i;27261:38::-;27245:54;;:13;:54;:::i;:::-;27229:70;;26460:851;27359:1;27339:16;:21;;27420:7;27369:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;27331:99;;;;;-1:-1:-1;;;27331:99:0;;;;;;;;:::i;:::-;;27466:1;27449:13;:18;;27524:7;27476:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;27441:93;;;;;-1:-1:-1;;;27441:93:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;27555:28:0;;:22;:28;;;;;;;;;;;:56;;;27622:15;:21;;;;;;;:28;;27680:13;;27622:21;:28;;27644:5;;27622:28;:::i;:::-;;;;;;;;;;;;;;;;:47;;:72;;;;-1:-1:-1;;;;;27705:21:0;;;;;;:15;:21;;;;;27755:10;;27705:28;;27727:5;;27705:28;:::i;:::-;;;;;;;;;;;;;;:39;;:61;27821:26;27836:11;27821:12;:26;:::i;:::-;-1:-1:-1;;;;;27777:21:0;;;;;;:15;:21;;;;;;;:28;;;;27799:5;;27777:28;:::i;:::-;;;;;;;;;;;;;;:41;;:70;-1:-1:-1;;;;;;;;;;;24952:2903:0:o;18290:289::-;18363:19;18426:8;18421:151;18442:11;:18;18438:22;;;;18421:151;;;-1:-1:-1;;;;;18497:28:0;;;;;;:15;:28;;;;;18526:11;:14;;;;;;;;;;;;:::i;:::-;;;;;;;;18497:44;;;;;;:::i;:::-;;;;;;;;;;;;;:63;;;18482:78;;;;;:::i;:::-;;-1:-1:-1;18462:3:0;;;;:::i;:::-;;;;18421:151;;;;18290:289;;;:::o;19531:806::-;19628:44;;:::i;:::-;19937:19;;19907:49;;20000:22;;;;;19967:30;;;:55;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;20088:9;:28;;;:52;;;;:::i;:::-;20049:36;;;:91;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;20199:9;:20;;;:44;;;;:::i;:::-;20168:28;;;:75;20305:23;;;;;20271:57;;:31;;;:57;;;;20168:17;19531:806::o;9774:248::-;9945:68;;-1:-1:-1;;;;;27140:15:1;;;9945:68:0;;;27122:34:1;27192:15;;27172:18;;;27165:43;27224:18;;;27217:34;;;9918:96:0;;9938:5;;-1:-1:-1;;;9968:27:0;27057:18:1;;9945:68:0;26882:375:1;9918:96:0;9774:248;;;;:::o;12128:716::-;12552:23;12578:69;12606:4;12578:69;;;;;;;;;;;;;;;;;12586:5;-1:-1:-1;;;;;12578:27:0;;;:69;;;;;:::i;:::-;12662:17;;12552:95;;-1:-1:-1;12662:21:0;12658:179;;12759:10;12748:30;;;;;;;;;;;;:::i;:::-;12740:85;;;;-1:-1:-1;;;12740:85:0;;27714:2:1;12740:85:0;;;27696:21:1;27753:2;27733:18;;;27726:30;27792:34;27772:18;;;27765:62;-1:-1:-1;;;27843:18:1;;;27836:40;27893:19;;12740:85:0;27512:406:1;4504:229:0;4641:12;4673:52;4695:6;4703:4;4709:1;4712:12;4673:21;:52::i;:::-;4666:59;;4504:229;;;;;;:::o;5624:510::-;5794:12;5852:5;5827:21;:30;;5819:81;;;;-1:-1:-1;;;5819:81:0;;28125:2:1;5819:81:0;;;28107:21:1;28164:2;28144:18;;;28137:30;28203:34;28183:18;;;28176:62;-1:-1:-1;;;28254:18:1;;;28247:36;28300:19;;5819:81:0;27923:402:1;5819:81:0;2021:20;;5911:60;;;;-1:-1:-1;;;5911:60:0;;28532:2:1;5911:60:0;;;28514:21:1;28571:2;28551:18;;;28544:30;28610:31;28590:18;;;28583:59;28659:18;;5911:60:0;28330:353:1;5911:60:0;5985:12;5999:23;6026:6;-1:-1:-1;;;;;6026:11:0;6045:5;6052:4;6026:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5984:73;;;;6075:51;6092:7;6101:10;6113:12;6075:16;:51::i;:::-;6068:58;5624:510;-1:-1:-1;;;;;;;5624:510:0:o;8310:712::-;8460:12;8489:7;8485:530;;;-1:-1:-1;8520:10:0;8513:17;;8485:530;8634:17;;:21;8630:374;;8832:10;8826:17;8893:15;8880:10;8876:2;8872:19;8865:44;8630:374;8975:12;8968:20;;-1:-1:-1;;;8968:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:255;218:2;212:9;260:6;248:19;;297:18;282:34;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:2;373:22;146:255;:::o;406:257::-;478:4;472:11;;;510:17;;557:18;542:34;;578:22;;;539:62;536:88;;;604:18;;:::i;668:275::-;739:2;733:9;804:2;785:13;;-1:-1:-1;;781:27:1;769:40;;839:18;824:34;;860:22;;;821:62;818:88;;;886:18;;:::i;:::-;922:2;915:22;668:275;;-1:-1:-1;668:275:1:o;948:202::-;1027:4;1060:18;1052:6;1049:30;1046:56;;;1082:18;;:::i;:::-;-1:-1:-1;1127:1:1;1123:14;1139:4;1119:25;;948:202::o;1155:118::-;1241:5;1234:13;1227:21;1220:5;1217:32;1207:60;;1263:1;1260;1253:12;1278:128;1343:20;;1372:28;1343:20;1372:28;:::i;1411:163::-;1478:20;;1538:10;1527:22;;1517:33;;1507:61;;1564:1;1561;1554:12;1579:159;1646:20;;1706:6;1695:18;;1685:29;;1675:57;;1728:1;1725;1718:12;1743:531;1786:5;1839:3;1832:4;1824:6;1820:17;1816:27;1806:55;;1857:1;1854;1847:12;1806:55;1893:6;1880:20;1919:18;1915:2;1912:26;1909:52;;;1941:18;;:::i;:::-;1985:55;2028:2;2009:13;;-1:-1:-1;;2005:27:1;2034:4;2001:38;1985:55;:::i;:::-;2065:2;2056:7;2049:19;2111:3;2104:4;2099:2;2091:6;2087:15;2083:26;2080:35;2077:55;;;2128:1;2125;2118:12;2077:55;2193:2;2186:4;2178:6;2174:17;2167:4;2158:7;2154:18;2141:55;2241:1;2216:16;;;2234:4;2212:27;2205:38;;;;2220:7;1743:531;-1:-1:-1;;;1743:531:1:o;2279:2459::-;2399:6;2430:2;2473;2461:9;2452:7;2448:23;2444:32;2441:52;;;2489:1;2486;2479:12;2441:52;2529:9;2516:23;2558:18;2599:2;2591:6;2588:14;2585:34;;;2615:1;2612;2605:12;2585:34;2653:6;2642:9;2638:22;2628:32;;2698:7;2691:4;2687:2;2683:13;2679:27;2669:55;;2720:1;2717;2710:12;2669:55;2756:2;2743:16;2779:79;2795:62;2854:2;2795:62;:::i;:::-;2779:79;:::i;:::-;2892:15;;;2974:1;2970:10;;;;2962:19;;2958:28;;;2923:12;;;;2998:19;;;2995:39;;;3030:1;3027;3020:12;2995:39;3062:2;3058;3054:11;3074:1634;3090:6;3085:3;3082:15;3074:1634;;;3176:3;3163:17;3212:2;3199:11;3196:19;3193:109;;;3256:1;3285:2;3281;3274:14;3193:109;3325:20;;3368:6;3398:16;;;-1:-1:-1;;3394:30:1;3390:39;-1:-1:-1;3387:129:1;;;3470:1;3499:2;3495;3488:14;3387:129;3542:22;;:::i;:::-;3591:28;3615:2;3611;3607:11;3591:28;:::i;:::-;3584:5;3577:43;3643:2;3681:30;3707:2;3703;3699:11;3681:30;:::i;:::-;3676:2;3669:5;3665:14;3658:54;3736:2;3774:31;3800:3;3796:2;3792:12;3774:31;:::i;:::-;3769:2;3762:5;3758:14;3751:55;3830:3;3819:14;;3870:31;3896:3;3892:2;3888:12;3870:31;:::i;:::-;3864:3;3857:5;3853:15;3846:56;;3926:3;3987;3983:2;3979:12;3966:26;3960:3;3953:5;3949:15;3942:51;4017:3;4006:14;;4078:3;4074:2;4070:12;4057:26;4051:3;4044:5;4040:15;4033:51;;4108:3;4169;4165:2;4161:12;4148:26;4142:3;4135:5;4131:15;4124:51;4199:3;4188:14;;4239:31;4265:3;4261:2;4257:12;4239:31;:::i;:::-;4222:15;;;4215:56;4295:3;4335:31;4353:12;;;4335:31;:::i;:::-;4318:15;;;4311:56;4409:11;;;4396:25;;4437:16;;;4434:109;;;4495:1;4484:12;;4525:3;4520;4513:16;4434:109;4580:54;4626:7;4621:2;4610:8;4606:2;4602:17;4598:26;4580:54;:::i;:::-;4563:15;;;4556:79;-1:-1:-1;4648:18:1;;-1:-1:-1;;4686:12:1;;;;3107;;3074:1634;;;-1:-1:-1;4727:5:1;2279:2459;-1:-1:-1;;;;;;;;2279:2459:1:o;4743:180::-;4802:6;4855:2;4843:9;4834:7;4830:23;4826:32;4823:52;;;4871:1;4868;4861:12;4823:52;-1:-1:-1;4894:23:1;;4743:180;-1:-1:-1;4743:180:1:o;5318:131::-;-1:-1:-1;;;;;5393:31:1;;5383:42;;5373:70;;5439:1;5436;5429:12;5454:134;5522:20;;5551:31;5522:20;5551:31;:::i;5593:735::-;5705:6;5713;5721;5729;5737;5745;5798:3;5786:9;5777:7;5773:23;5769:33;5766:53;;;5815:1;5812;5805:12;5766:53;5854:9;5841:23;5873:31;5898:5;5873:31;:::i;:::-;5923:5;-1:-1:-1;5975:2:1;5960:18;;5947:32;;-1:-1:-1;6026:2:1;6011:18;;5998:32;;-1:-1:-1;6081:2:1;6066:18;;6053:32;6108:18;6097:30;;6094:50;;;6140:1;6137;6130:12;6094:50;6163;6205:7;6196:6;6185:9;6181:22;6163:50;:::i;:::-;6153:60;;;6260:3;6249:9;6245:19;6232:33;6222:43;;6284:38;6317:3;6306:9;6302:19;6284:38;:::i;:::-;6274:48;;5593:735;;;;;;;;:::o;6333:1114::-;6488:6;6496;6504;6512;6520;6528;6536;6544;6552;6560;6613:3;6601:9;6592:7;6588:23;6584:33;6581:53;;;6630:1;6627;6620:12;6581:53;6653:26;6669:9;6653:26;:::i;:::-;6643:36;;6698:38;6732:2;6721:9;6717:18;6698:38;:::i;:::-;6688:48;;6755:38;6789:2;6778:9;6774:18;6755:38;:::i;:::-;6745:48;;6844:2;6833:9;6829:18;6816:32;6867:18;6908:2;6900:6;6897:14;6894:34;;;6924:1;6921;6914:12;6894:34;6947:50;6989:7;6980:6;6969:9;6965:22;6947:50;:::i;:::-;6937:60;;7044:3;7033:9;7029:19;7016:33;7006:43;;7096:3;7085:9;7081:19;7068:33;7058:43;;7148:3;7137:9;7133:19;7120:33;7110:43;;7172:38;7205:3;7194:9;7190:19;7172:38;:::i;:::-;7162:48;;7229:38;7262:3;7251:9;7247:19;7229:38;:::i;:::-;7219:48;;7320:3;7309:9;7305:19;7292:33;7276:49;;7350:2;7340:8;7337:16;7334:36;;;7366:1;7363;7356:12;7334:36;;7389:52;7433:7;7422:8;7411:9;7407:24;7389:52;:::i;:::-;7379:62;;;6333:1114;;;;;;;;;;;;;:::o;7676:247::-;7735:6;7788:2;7776:9;7767:7;7763:23;7759:32;7756:52;;;7804:1;7801;7794:12;7756:52;7843:9;7830:23;7862:31;7887:5;7862:31;:::i;7928:258::-;8000:1;8010:113;8024:6;8021:1;8018:13;8010:113;;;8100:11;;;8094:18;8081:11;;;8074:39;8046:2;8039:10;8010:113;;;8141:6;8138:1;8135:13;8132:48;;;-1:-1:-1;;8176:1:1;8158:16;;8151:27;7928:258::o;8191:::-;8233:3;8271:5;8265:12;8298:6;8293:3;8286:19;8314:63;8370:6;8363:4;8358:3;8354:14;8347:4;8340:5;8336:16;8314:63;:::i;:::-;8431:2;8410:15;-1:-1:-1;;8406:29:1;8397:39;;;;8438:4;8393:50;;8191:258;-1:-1:-1;;8191:258:1:o;8454:1476::-;8724:4;8753:2;8793;8782:9;8778:18;8823:6;8812:9;8805:25;8849:2;8887:6;8882:2;8871:9;8867:18;8860:34;8913:2;8951;8946;8935:9;8931:18;8924:30;8974:6;9009;9003:13;9040:6;9032;9025:22;9066:3;9056:13;;9100:2;9089:9;9085:18;9078:25;;9162:2;9152:6;9149:1;9145:14;9134:9;9130:30;9126:39;9200:2;9192:6;9188:15;9221:1;9231:670;9245:6;9242:1;9239:13;9231:670;;;9338:3;9334:8;9322:9;9314:6;9310:22;9306:37;9301:3;9294:50;9373:6;9367:13;9403:4;9446:2;9440:9;9477:2;9469:6;9462:18;9507:48;9551:2;9543:6;9539:15;9525:12;9507:48;:::i;:::-;9598:11;;;9592:18;9575:15;;;9568:43;9654:11;;;9648:18;9631:15;;;9624:43;9710:11;;;9704:18;9687:15;;;9680:43;9770:11;;;9764:18;9784:6;9760:31;9743:15;;;9736:56;;;;-1:-1:-1;9879:12:1;;;;9493:62;-1:-1:-1;9844:15:1;;;;9267:1;9260:9;9231:670;;;-1:-1:-1;9918:6:1;;8454:1476;-1:-1:-1;;;;;;;;;;;;8454:1476:1:o;9935:322::-;10004:6;10057:2;10045:9;10036:7;10032:23;10028:32;10025:52;;;10073:1;10070;10063:12;10025:52;10113:9;10100:23;10146:18;10138:6;10135:30;10132:50;;;10178:1;10175;10168:12;10132:50;10201;10243:7;10234:6;10223:9;10219:22;10201:50;:::i;10454:2452::-;10567:6;10598:2;10641;10629:9;10620:7;10616:23;10612:32;10609:52;;;10657:1;10654;10647:12;10609:52;10697:9;10684:23;10726:18;10767:2;10759:6;10756:14;10753:34;;;10783:1;10780;10773:12;10753:34;10821:6;10810:9;10806:22;10796:32;;10866:7;10859:4;10855:2;10851:13;10847:27;10837:55;;10888:1;10885;10878:12;10837:55;10924:2;10911:16;10947:79;10963:62;11022:2;10963:62;:::i;10947:79::-;11060:15;;;11142:1;11138:10;;;;11130:19;;11126:28;;;11091:12;;;;11166:19;;;11163:39;;;11198:1;11195;11188:12;11163:39;11230:2;11226;11222:11;11242:1634;11258:6;11253:3;11250:15;11242:1634;;;11344:3;11331:17;11380:2;11367:11;11364:19;11361:39;;;11396:1;11393;11386:12;11361:39;11423:20;;11466:6;11496:16;;;-1:-1:-1;;11492:30:1;11488:39;-1:-1:-1;11485:59:1;;;11540:1;11537;11530:12;11485:59;11570:22;;:::i;:::-;11619:28;11643:2;11639;11635:11;11619:28;:::i;:::-;11612:5;11605:43;11684:31;11711:2;11707;11703:11;11684:31;:::i;:::-;11679:2;11672:5;11668:14;11661:55;11752:31;11779:2;11775;11771:11;11752:31;:::i;:::-;11747:2;11740:5;11736:14;11729:55;11807:3;11860:2;11856;11852:11;11839:25;11893:2;11883:8;11880:16;11877:106;;;11937:1;11966:2;11962;11955:14;11877:106;12019:54;12065:7;12060:2;12049:8;12045:2;12041:17;12037:26;12019:54;:::i;:::-;12014:2;12007:5;12003:14;11996:78;;12097:3;12157:2;12153;12149:11;12136:25;12131:2;12124:5;12120:14;12113:49;12186:3;12175:14;;12246:3;12242:2;12238:12;12225:26;12220:2;12213:5;12209:14;12202:50;;12276:3;12337;12333:2;12329:12;12316:26;12310:3;12303:5;12299:15;12292:51;12367:3;12356:14;;12407:31;12433:3;12429:2;12425:12;12407:31;:::i;:::-;12390:15;;;12383:56;12463:3;12503:31;12521:12;;;12503:31;:::i;:::-;12486:15;;;12479:56;12577:11;;;12564:25;;12605:16;;;12602:109;;;12663:1;12652:12;;12693:3;12688;12681:16;12602:109;12748:54;12794:7;12789:2;12778:8;12774:2;12770:17;12766:26;12748:54;:::i;:::-;12731:15;;;12724:79;-1:-1:-1;12816:18:1;;-1:-1:-1;;12854:12:1;;;;11275;;11242:1634;;12911:1294;13021:6;13052:2;13095;13083:9;13074:7;13070:23;13066:32;13063:52;;;13111:1;13108;13101:12;13063:52;13151:9;13138:23;13184:18;13176:6;13173:30;13170:50;;;13216:1;13213;13206:12;13170:50;13239:22;;13292:4;13284:13;;13280:27;-1:-1:-1;13270:55:1;;13321:1;13318;13311:12;13270:55;13357:2;13344:16;13380:79;13396:62;13455:2;13396:62;:::i;13380:79::-;13493:15;;;13575:1;13571:10;;;;13563:19;;13559:28;;;13524:12;;;;13599:19;;;13596:39;;;13631:1;13628;13621:12;13596:39;13655:11;;;;13675:500;13691:6;13686:3;13683:15;13675:500;;;13773:4;13767:3;13758:7;13754:17;13750:28;13747:118;;;13819:1;13848:2;13844;13837:14;13747:118;13891:22;;:::i;:::-;13954:3;13941:17;13971:33;13996:7;13971:33;:::i;:::-;14017:22;;14088:12;;;14075:26;14059:14;;;14052:50;14115:18;;13717:4;13708:14;;;;14153:12;;;;13675:500;;14574:315;14642:6;14650;14703:2;14691:9;14682:7;14678:23;14674:32;14671:52;;;14719:1;14716;14709:12;14671:52;14758:9;14745:23;14777:31;14802:5;14777:31;:::i;:::-;14827:5;14879:2;14864:18;;;;14851:32;;-1:-1:-1;;;14574:315:1:o;14894:127::-;14955:10;14950:3;14946:20;14943:1;14936:31;14986:4;14983:1;14976:15;15010:4;15007:1;15000:15;15026:380;15105:1;15101:12;;;;15148;;;15169:61;;15223:4;15215:6;15211:17;15201:27;;15169:61;15276:2;15268:6;15265:14;15245:18;15242:38;15239:161;;;15322:10;15317:3;15313:20;15310:1;15303:31;15357:4;15354:1;15347:15;15385:4;15382:1;15375:15;15411:127;15472:10;15467:3;15463:20;15460:1;15453:31;15503:4;15500:1;15493:15;15527:4;15524:1;15517:15;15543:135;15582:3;-1:-1:-1;;15603:17:1;;15600:43;;;15623:18;;:::i;:::-;-1:-1:-1;15670:1:1;15659:13;;15543:135::o;15809:1099::-;15937:3;15966:1;15999:6;15993:13;16029:3;16051:1;16079:9;16075:2;16071:18;16061:28;;16139:2;16128:9;16124:18;16161;16151:61;;16205:4;16197:6;16193:17;16183:27;;16151:61;16231:2;16279;16271:6;16268:14;16248:18;16245:38;16242:165;;;-1:-1:-1;;;16306:33:1;;16362:4;16359:1;16352:15;16392:4;16313:3;16380:17;16242:165;16423:18;16450:104;;;;16568:1;16563:320;;;;16416:467;;16450:104;-1:-1:-1;;16483:24:1;;16471:37;;16528:16;;;;-1:-1:-1;16450:104:1;;16563:320;15756:1;15749:14;;;15793:4;15780:18;;16658:1;16672:165;16686:6;16683:1;16680:13;16672:165;;;16764:14;;16751:11;;;16744:35;16807:16;;;;16701:10;;16672:165;;;16676:3;;16866:6;16861:3;16857:16;16850:23;;16416:467;-1:-1:-1;16899:3:1;;15809:1099;-1:-1:-1;;;;;;;;15809:1099:1:o;16913:197::-;16951:3;16979:6;17020:2;17013:5;17009:14;17047:2;17038:7;17035:15;17032:41;;;17053:18;;:::i;:::-;17102:1;17089:15;;16913:197;-1:-1:-1;;;16913:197:1:o;17115:276::-;17246:3;17284:6;17278:13;17300:53;17346:6;17341:3;17334:4;17326:6;17322:17;17300:53;:::i;:::-;17369:16;;;;;17115:276;-1:-1:-1;;17115:276:1:o;17396:422::-;17485:1;17528:5;17485:1;17542:270;17563:7;17553:8;17550:21;17542:270;;;17622:4;17618:1;17614:6;17610:17;17604:4;17601:27;17598:53;;;17631:18;;:::i;:::-;17681:7;17671:8;17667:22;17664:55;;;17701:16;;;;17664:55;17780:22;;;;17740:15;;;;17542:270;;;17546:3;17396:422;;;;;:::o;17823:806::-;17872:5;17902:8;17892:80;;-1:-1:-1;17943:1:1;17957:5;;17892:80;17991:4;17981:76;;-1:-1:-1;18028:1:1;18042:5;;17981:76;18073:4;18091:1;18086:59;;;;18159:1;18154:130;;;;18066:218;;18086:59;18116:1;18107:10;;18130:5;;;18154:130;18191:3;18181:8;18178:17;18175:43;;;18198:18;;:::i;:::-;-1:-1:-1;;18254:1:1;18240:16;;18269:5;;18066:218;;18368:2;18358:8;18355:16;18349:3;18343:4;18340:13;18336:36;18330:2;18320:8;18317:16;18312:2;18306:4;18303:12;18299:35;18296:77;18293:159;;;-1:-1:-1;18405:19:1;;;18437:5;;18293:159;18484:34;18509:8;18503:4;18484:34;:::i;:::-;18554:6;18550:1;18546:6;18542:19;18533:7;18530:32;18527:58;;;18565:18;;:::i;:::-;18603:20;;17823:806;-1:-1:-1;;;17823:806:1:o;18634:140::-;18692:5;18721:47;18762:4;18752:8;18748:19;18742:4;18721:47;:::i;18779:168::-;18819:7;18885:1;18881;18877:6;18873:14;18870:1;18867:21;18862:1;18855:9;18848:17;18844:45;18841:71;;;18892:18;;:::i;:::-;-1:-1:-1;18932:9:1;;18779:168::o;18952:553::-;18991:7;-1:-1:-1;;;;;19061:9:1;;;19089;;;19114:11;;;19133:10;;;19127:17;;19110:35;19107:61;;;19148:18;;:::i;:::-;-1:-1:-1;;;19224:1:1;19217:9;;19242:11;;;19262;;;19255:19;;19238:37;19235:63;;;19278:18;;:::i;:::-;19324:1;19321;19317:9;19307:19;;19371:1;19367:2;19362:11;19359:1;19355:19;19350:2;19346;19342:11;19338:37;19335:63;;;19378:18;;:::i;:::-;19443:1;19439:2;19434:11;19431:1;19427:19;19422:2;19418;19414:11;19410:37;19407:63;;;19450:18;;:::i;:::-;-1:-1:-1;;;19490:9:1;;;;;18952:553;-1:-1:-1;;;18952:553:1:o;19510:127::-;19571:10;19566:3;19562:20;19559:1;19552:31;19602:4;19599:1;19592:15;19626:4;19623:1;19616:15;19642:193;19681:1;19707;19697:35;;19712:18;;:::i;:::-;-1:-1:-1;;;19748:18:1;;-1:-1:-1;;19768:13:1;;19744:38;19741:64;;;19785:18;;:::i;:::-;-1:-1:-1;19819:10:1;;19642:193::o;19840:184::-;19910:6;19963:2;19951:9;19942:7;19938:23;19934:32;19931:52;;;19979:1;19976;19969:12;19931:52;-1:-1:-1;20002:16:1;;19840:184;-1:-1:-1;19840:184:1:o;20029:442::-;20291:25;20286:3;20279:38;20261:3;20346:6;20340:13;20362:62;20417:6;20412:2;20407:3;20403:12;20396:4;20388:6;20384:17;20362:62;:::i;:::-;20444:16;;;;20462:2;20440:25;;20029:442;-1:-1:-1;;20029:442:1:o;20476:220::-;20625:2;20614:9;20607:21;20588:4;20645:45;20686:2;20675:9;20671:18;20663:6;20645:45;:::i;20701:136::-;20736:3;-1:-1:-1;;;20757:22:1;;20754:48;;;20782:18;;:::i;:::-;-1:-1:-1;20822:1:1;20818:13;;20701:136::o;20842:956::-;21188:4;21217:3;21261:6;21254:14;21247:22;21236:9;21229:41;21306:2;21301;21290:9;21286:18;21279:30;21332:45;21373:2;21362:9;21358:18;21350:6;21332:45;:::i;:::-;21318:59;;21413:6;21408:2;21397:9;21393:18;21386:34;21456:6;21451:2;21440:9;21436:18;21429:34;21500:6;21494:3;21483:9;21479:19;21472:35;21526:6;21581:2;21573:6;21569:15;21563:3;21552:9;21548:19;21541:44;21634:2;21626:6;21622:15;21616:3;21605:9;21601:19;21594:44;;21687:9;21679:6;21675:22;21669:3;21658:9;21654:19;21647:51;21715:33;21741:6;21733;21715:33;:::i;:::-;21707:41;;;21785:6;21779:3;21768:9;21764:19;21757:35;20842:956;;;;;;;;;;;;:::o;21803:195::-;21841:4;21878;21875:1;21871:12;21910:4;21907:1;21903:12;21935:3;21930;21927:12;21924:38;;;21942:18;;:::i;:::-;21979:13;;;21803:195;-1:-1:-1;;;21803:195:1:o;22003:120::-;22043:1;22069;22059:35;;22074:18;;:::i;:::-;-1:-1:-1;22108:9:1;;22003:120::o;22128:128::-;22168:3;22199:1;22195:6;22192:1;22189:13;22186:39;;;22205:18;;:::i;:::-;-1:-1:-1;22241:9:1;;22128:128::o;23212:125::-;23252:4;23280:1;23277;23274:8;23271:34;;;23285:18;;:::i;:::-;-1:-1:-1;23322:9:1;;23212:125::o;23342:569::-;23447:6;23455;23463;23471;23479;23532:3;23520:9;23511:7;23507:23;23503:33;23500:53;;;23549:1;23546;23539:12;23500:53;23581:9;23575:16;23600:31;23625:5;23600:31;:::i;:::-;23650:5;23640:15;;;23695:2;23684:9;23680:18;23674:25;23664:35;;23739:2;23728:9;23724:18;23718:25;23708:35;;23783:2;23772:9;23768:18;23762:25;23752:35;;23832:3;23821:9;23817:19;23811:26;23846:33;23871:7;23846:33;:::i;:::-;23898:7;23888:17;;;23342:569;;;;;;;;:::o;24545:442::-;24807:25;24802:3;24795:38;24777:3;24862:6;24856:13;24878:62;24933:6;24928:2;24923:3;24919:12;24912:4;24904:6;24900:17;24878:62;:::i;24992:267::-;25031:4;25060:9;;;25085:10;;-1:-1:-1;;;25104:19:1;;25097:27;;25081:44;25078:70;;;25128:18;;:::i;:::-;-1:-1:-1;;;;;25175:27:1;;25168:35;;25160:44;;25157:70;;;25207:18;;:::i;:::-;-1:-1:-1;;25244:9:1;;24992:267::o;25264:449::-;25526:32;25521:3;25514:45;25496:3;25588:6;25582:13;25604:62;25659:6;25654:2;25649:3;25645:12;25638:4;25630:6;25626:17;25604:62;:::i;:::-;25686:16;;;;25704:2;25682:25;;25264:449;-1:-1:-1;;25264:449:1:o;25718:265::-;25757:3;25785:9;;;25810:10;;-1:-1:-1;;;;;25829:27:1;;;25822:35;;25806:52;25803:78;;;25861:18;;:::i;:::-;-1:-1:-1;;;25908:19:1;;;25901:27;;25893:36;;25890:62;;;25932:18;;:::i;:::-;-1:-1:-1;;25968:9:1;;25718:265::o;25988:438::-;-1:-1:-1;;;26245:3:1;26238:34;26220:3;26301:6;26295:13;26317:62;26372:6;26367:2;26362:3;26358:12;26351:4;26343:6;26339:17;26317:62;:::i;:::-;26399:16;;;;26417:2;26395:25;;25988:438;-1:-1:-1;;25988:438:1:o;26431:446::-;26693:29;26688:3;26681:42;26663:3;26752:6;26746:13;26768:62;26823:6;26818:2;26813:3;26809:12;26802:4;26794:6;26790:17;26768:62;:::i;:::-;26850:16;;;;26868:2;26846:25;;26431:446;-1:-1:-1;;26431:446:1:o;27262:245::-;27329:6;27382:2;27370:9;27361:7;27357:23;27353:32;27350:52;;;27398:1;27395;27388:12;27350:52;27430:9;27424:16;27449:28;27471:5;27449:28;:::i

Swarm Source

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