Contract 0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e 1

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x113601045b57f830e1b27f44fa79132e61651814622a358f4598e87aa627c57eClose Trade Mark...204595542021-10-21 17:51:3713 hrs 13 mins ago0xff44611abc5c62ff3c8c61f67769330c9a466a93 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.06861692
0xcf269363a22f28f13b6a714335e1bee904555ace299f02c8f4b2b784059b0f90Execute Nft Orde...204504372021-10-21 12:00:1119 hrs 4 mins ago0xb4b8ec403167bbbeb3b432b813479a97ee041259 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.03939218
0x3908f0fd5d1cfbb06f8b225fef76a18234fe6193dda2c78178a7f2fc11637058Execute Nft Orde...204495862021-10-21 11:26:2919 hrs 38 mins ago0xb4b8ec403167bbbeb3b432b813479a97ee041259 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.03939218
0xff6dee26f8292860181e099801e481510e21fde01a39b8d83ec2b07e05313d92Execute Nft Orde...204495752021-10-21 11:26:0719 hrs 38 mins ago0xb4b8ec403167bbbeb3b432b813479a97ee041259 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.03939218
0x30f18c2f99f0e4c6276be5483be0e6a708572682534c620a6b59431d9b3cc3dbExecute Nft Orde...204495642021-10-21 11:25:4519 hrs 39 mins ago0xb4b8ec403167bbbeb3b432b813479a97ee041259 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.03939218
0x20afee8ffcd02b4887c67213373aa730fbf30cce78048e5b1d4757867770f8d9Execute Nft Orde...204495532021-10-21 11:25:2319 hrs 39 mins ago0xb4b8ec403167bbbeb3b432b813479a97ee041259 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.03939218
0x23b0869d78c54df0c9ec4d5079f7996f06cdd1e44f3f012a48bb7eb30e9c7ecdExecute Nft Orde...204495432021-10-21 11:25:0319 hrs 39 mins ago0xb4b8ec403167bbbeb3b432b813479a97ee041259 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.03939218
0x788f84327b67fc16dccf0e4c552b92e40599e8d11d31d791fbc5a40029cdf20dExecute Nft Orde...204495382021-10-21 11:24:5319 hrs 40 mins ago0xb4b8ec403167bbbeb3b432b813479a97ee041259 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.03939218
0xc6437efa5c3369deab752be3505cc1012a38d783f2acb588115a12b571305c21Close Trade Mark...204453122021-10-21 8:35:4122 hrs 29 mins ago0xa97f7992d0a9d5b27ad75cee2d56e836a75caa9d IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.06793292
0x11779322839c0087bb9f85235f370cd12a35c544e4379e7e221d2ee2f395a292Close Trade Mark...204450122021-10-21 8:25:1722 hrs 39 mins ago0xe6c4591b6f51d80b8558c4d3cd68b6ce0fe030cb IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.06861948
0xd4227dc5c5cb1a257f2365825aabfe0c86e81bc94614c27608557e9aec257496Update Tp204345742021-10-21 1:38:541 day 5 hrs ago0x38e904ac044a31f698d96b97e05e23a045ae43fb IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.00086476
0xd2f8e832a2fbc3509816f19aec4569b816712585712cc1b1fb2087b05f40fcffExecute Nft Orde...204187452021-10-20 14:51:511 day 16 hrs ago0xb4b8ec403167bbbeb3b432b813479a97ee041259 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.03939218
0x3a65f90ca769b3ed046f3416f694369bdd78359e7ca3e2a19672628e7bfc7b15Close Trade Mark...204180772021-10-20 14:26:591 day 16 hrs ago0x1a91489dd8f74bde7b217c6c68185e38c6748f7f IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.06861692
0x6192b5fd88a40d4a6cf82ab499872141ca5a430718d9f800a946e8724528cc1fClose Trade Mark...204150412021-10-20 12:29:291 day 18 hrs ago0x70a0dc82798924c833ae7c78339a5c2cae909c32 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.06224892
0xfb1d08189a68303f57e7fc1875c8fd26be6575eabbf8cf444092b4d8e08a483aClose Trade Mark...203475902021-10-18 13:19:393 days 17 hrs ago0x02aee0ce756fa0157294ff3ff48c1dd02adccf04 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.06145244
0x6900914703d98510693114c0fda0e477383b95d6110b10adf33e6c3d082b905aClose Trade Mark...203428022021-10-18 9:51:343 days 21 hrs ago0xf32bfc9cee9869285795e70a8755a9e06c590484 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.0694134
0xba9ee8a52a04369b58efdcb9fe94d103668282578b0738e74bdfbe69d6e920b4Execute Nft Orde...203419922021-10-18 9:18:483 days 21 hrs ago0x7a5f3afd8807fa9a68bb93121e524146a7cb5dd6 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.05168388
0xc14257eb0ab2794d46a39a21847b08005a3097c3b3d67e8c4289a7b58b68fff5Execute Nft Orde...203419832021-10-18 9:18:303 days 21 hrs ago0x7a5f3afd8807fa9a68bb93121e524146a7cb5dd6 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.05168388
0x3747c95a2477cd331d44ad822190ded9f3b0c6aa1e89fb1c82aac2cd7708f510Execute Nft Orde...203419742021-10-18 9:18:123 days 21 hrs ago0x7a5f3afd8807fa9a68bb93121e524146a7cb5dd6 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.05168388
0xcd39fa2b8c8b528becac02d292c1ca29faa481021d20fdd482d3b3093aaf989aUpdate Tp203419722021-10-18 9:18:083 days 21 hrs ago0xf32bfc9cee9869285795e70a8755a9e06c590484 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.0146668
0xa992d6f58d323c76b089820780ce1a788ebb29c3999102a8b6194ad50ed09549Update Tp202921182021-10-16 22:46:585 days 8 hrs ago0xb67ffd9d41c06489d108c925c328fff30f3aee9b IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.00215068
0xdbd4eeb9e82a9d4201bc5c7543f40dcbfa6ed2ca2f2f0f35e91386856653133cClose Trade Mark...202842872021-10-16 17:35:585 days 13 hrs ago0xc9a30725312b2d137caffdf2c707826cb641c206 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.06861692
0xa5e9790e3a73342a3f2025ae6a9ba3f4f555e2ee85402b719d568e4b8df917bbClose Trade Mark...202842502021-10-16 17:34:445 days 13 hrs ago0xc9a30725312b2d137caffdf2c707826cb641c206 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.0694134
0x962386831d13d949790f4f0cb11fb887d8a47a1e692c8c3c3b13e85837afee4fExecute Nft Orde...202772052021-10-16 12:29:155 days 18 hrs ago0x2cb48c21b55ed3fde0e14ed31bdd4a6ccf749f7e IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.00117984
0xf2b30067531719c8dfcb05553e52b2c5c05167c4dea641712a414ae7639413bdExecute Nft Orde...202764892021-10-16 11:57:315 days 19 hrs ago0x7a5f3afd8807fa9a68bb93121e524146a7cb5dd6 IN  0xb28d7cea60db2da4d3afd19fa8b8f14a7487745e0 MATIC0.0022122
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GFarmTradingV4

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-24
*/

// File: @uniswap\v2-core\contracts\interfaces\IUniswapV2Pair.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: @openzeppelin\contracts\math\SafeMath.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin\contracts\math\SignedSafeMath.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @title SignedSafeMath
 * @dev Signed math operations with safety checks that revert on error.
 */
library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;

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

        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two signed integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

        return c;
    }

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

        return c;
    }
}

// File: contracts\GFarmTradingV4.sol

pragma solidity ^0.6.0;

interface GFarmPoolInterfaceV4{
    function increaseAccTokensPerLp(uint _amount) external;
}

interface LinkToken{
    function transferFrom(address _from, address _to, uint256 _value) external returns(bool);
}

interface TokenInterfaceV4{
    function burn(address from, uint256 amount) external;
    function mint(address to, uint256 amount) external;
}

interface NftInterfaceV4{
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

interface PriceAggregatorInterfaceV4{
    // order types (aggregator): 
    // 0: open market, 1: close market, 2: open limit, 3: close limit
    function getPrice(uint _pairIndex, uint _orderType) external returns(uint);
    function canOpenTrade(uint _pairIndex, uint _positionSizeToken, uint _leverage) view external returns(bool);
    function increaseOpenInterest(uint _pairIndex, uint _positionSizeToken, uint _leverage) external;
    function decreaseOpenInterest(uint _pairIndex, uint _positionSizeToken, uint _leverage) external;
    function isPaused() external view returns(bool);
    function maxTradesPerBlock() external view returns(uint);
    function maxGainP() external view returns(uint);
    function minPosUsd() external view returns(uint);
    function maxPosTokenP() external view returns(uint);
    function maxPosTokenIncreaseP() external view returns(uint);
    function nftSuccessTimelock() external view returns(uint);
    function govOpenFeeP() external view returns(uint);
    function devOpenFeeP() external view returns(uint);
    function lpCloseFeeP() external view returns(uint);
    function nftLiqFeeP() external view returns(uint);
    function lpLiqFeeP() external view returns(uint);
    function nftLimitOrderFeeP() external view returns(uint);
    function minLimitOrderSlippageP() external view returns(uint);
    function referralP() external view returns(uint);
    function spreadReductionsP(uint i) external view returns(uint);
    function nftLinkFee() external view returns(uint);
    function getSpreadP(uint p) external view returns(uint);
}

contract GFarmTradingV4{

    using SafeMath for uint;
    using SignedSafeMath for int;

    // Contracts
    GFarmPoolInterfaceV4 public pool;
    PriceAggregatorInterfaceV4 public priceAggregator;
    TokenInterfaceV4 public token;
    NftInterfaceV4[5] public nft;
    IUniswapV2Pair public lp; // GFARM2/DAI
    LinkToken constant linkToken = LinkToken(0xb0897686c545045aFc77CF20eC7A532E3120E0F1);

    // Constants
    uint constant PRECISION = 1e10;
    uint constant LIQUIDATION_P = 90; // -90%
    uint constant MAX_SL_P = 80; // -80%
    uint constant MAX_TRADES_PER_PAIR = 3;
    uint constant MAX_PENDING_ORDERS = 5;
    uint constant LIMIT_TIMELOCK = 30;

    // Trading variables
    uint public tokensBurned; // 1e18
    uint public tokensMinted; // 1e18
    uint public nftRewards; // 1e18
    uint public devFees; // 1e18
    uint public govFees; // 1e18

    // Gov & dev funds
    address public govFund;
    address public immutable devFund;

    // Structs
    struct Trader{
        uint leverageUnlocked;
        address referral;
        uint referralRewardsTotal;
    }
    struct Trade{
        address trader;
        uint pairIndex;
        uint userTradesIndex;
        uint positionSizeToken; // 1e18
        uint positionSizeUsd; // 1e18
        uint openPrice; // PRECISION
        uint spreadReductionP;
        bool buy;
        uint leverage;
        uint tp; // PRECISION
        uint sl; // PRECISION
        uint tpLastUpdated; // blocks
        uint slLastUpdated; // blocks
    }
    struct OpenLimitOrder{
        address trader;
        uint pairIndex;
        uint positionSizeToken;
        uint spreadReductionP;
        bool buy;
        uint leverage;
        uint tp;
        uint sl;
        uint minPrice; // PRECISION
        uint maxPrice; // PRECISION
        uint block;
    }
    struct PendingMarketOrder{
        Trade trade;
        uint block;
        uint wantedPrice;
        uint slippageP;
    }
    struct PendingNftOrder{
        address nftHolder;
        uint nftId;
        address trader;
        uint pairIndex;
        uint userTradesIndex;
        uint orderType; // 1 = take profit, 2 = stop loss, 3 = liquidation, 4 = limit open
    }

    // Traders mappings
    mapping(address => Trader) public traders;
    mapping(address => mapping(uint => Trade[MAX_TRADES_PER_PAIR])) public userTrades;
    mapping(address => mapping(uint => uint)) public userTradesCount;
    mapping(address => mapping(uint => uint)) public userOpenLimitOrderId;
    mapping(address => mapping(uint => uint)) public pairTradersId;
    mapping(address => uint[]) public pendingOrderIds;
    mapping(address => mapping(uint => uint)) public pendingMarketOpenCount;
    mapping(address => mapping(uint => uint)) public pendingMarketCloseCount;

    // Pending orders mappings
    mapping(uint => PendingMarketOrder) reqID_pendingMarketOrder;
    mapping(uint => PendingNftOrder) public reqID_pendingNftOrder;

    // List of open trades & limit orders
    OpenLimitOrder[] public openLimitOrders;
    mapping(uint => address[]) public pairTraders; // List open trades

    // Restrictions & Timelocks
    mapping(uint => uint) public tradesPerBlock;
    mapping(uint => uint) public nftLastSuccess;

    // Events
    event TradeOpenedMarket(
        address indexed trader,
        uint indexed pairIndex,
        uint userTradesIndex,
        bool buy,
        uint leverage,
        uint price,
        uint positionSizeToken,
        uint positionSizeUsd
    );
    event TradeCanceledMarket(
        address indexed trader,
        uint pairIndex,
        uint wantedPrice,
        uint slippageP,
        uint openPrice
    );
    event TradeClosedMarket(
        address indexed trader,
        uint indexed pairIndex,
        uint userTradesIndex,
        uint price,
        bool buy,
        uint positionSizeToken,
        uint leverage,
        int pnlToken,
        uint tokenPriceUsd
    );
    event TradeLimitExecuted(
        address indexed trader,
        uint indexed pairIndex,
        uint userTradesIndex,
        address indexed nftHolder,
        uint orderType, // 1: tp, 2: sl, 3: liq, 4: open
        uint price,
        bool buy,
        uint leverage,
        uint positionSizeToken,
        int pnlToken,
        uint rewardToken,
        uint tokenPriceUsd
    );
    event TpSlUpdated(
        address indexed trader,
        uint indexed pairIndex,
        uint userTradesIndex,
        bool tp,
        uint value
    );
    event TradeLimitOpened(
        address indexed trader,
        uint indexed pairIndex
    );
    event TradeLimitCanceled(
        address indexed trader,
        uint indexed pairIndex
    );
    event ChainlinkCallbackFailed();
    event AddressUpdated(string name, address value);

    constructor(address _gov, address _dev, NftInterfaceV4[5] memory _nft) public{
        require(_gov != address(0));
        require(_dev != address(0));
        require(address(_nft[0]) != address(0));
        require(address(_nft[1]) != address(0));
        require(address(_nft[2]) != address(0));
        require(address(_nft[3]) != address(0));
        require(address(_nft[4]) != address(0));
        govFund = _gov;
        devFund = _dev;
        nft = _nft;
    }

    // GOV => UPDATE VARIABLES & MANAGE PAIRS

    // 0. Modifiers
    modifier onlyGov(){
        require(msg.sender == govFund, "GOV");
        _;
    }

    // Set addresses
    function setGovFund(address _gov) external onlyGov{
        require(_gov != address(0));
        govFund = _gov;
        emit AddressUpdated("govFund", _gov);
    }
    function setToken(address _token) external onlyGov{
        require(token == TokenInterfaceV4(0) && _token != address(0));
        token = TokenInterfaceV4(_token);
        emit AddressUpdated("token", _token);
    }
    function setLp(address _lp) external onlyGov{
        require(lp == IUniswapV2Pair(0) && _lp != address(0));
        lp = IUniswapV2Pair(_lp);
        emit AddressUpdated("lp", _lp);
    }
    function setPool(address _pool) external onlyGov{
        require(pool == GFarmPoolInterfaceV4(0) && _pool != address(0));
        pool = GFarmPoolInterfaceV4(_pool);
        emit AddressUpdated("pool", _pool);
    }    
    function setPriceAggregator(address _aggregator) external onlyGov{
        require(_aggregator != address(0));
        priceAggregator = PriceAggregatorInterfaceV4(_aggregator);
        emit AddressUpdated("priceAggregator", _aggregator);
    }

    // USEFUL TRADING FUNCTIONS

    // Trades % PnL based on price movement (PRECISION)
    function currentPercentProfit(
        uint openPrice,
        uint currentPrice,
        bool buy,
        uint leverage) private view returns(int p){

        p = buy ? (int(currentPrice).sub(int(openPrice))).mul(100*int(PRECISION)).mul(int(leverage)).div(int(openPrice))
            : (int(currentPrice).sub(int(openPrice))).mul(-100*int(PRECISION)).mul(int(leverage)).div(int(openPrice));

        p = p < int(PRECISION).mul(-100) ? int(PRECISION).mul(-100) : p;
        p = p > int(priceAggregator.maxGainP()).mul(int(PRECISION)) ? int(priceAggregator.maxGainP()).mul(int(PRECISION)) : p;
    }

    // Position size token
    function positionSizeToken(
        uint initialTokenPos,
        uint posUsd) private view returns(uint currentPosToken){
        currentPosToken = posUsd.mul(PRECISION).div(tokenPriceUsd());

        // Position size increase % limited
        uint maxNewPos = initialTokenPos.add(initialTokenPos.mul(priceAggregator.maxPosTokenIncreaseP()).div(100));
        currentPosToken = currentPosToken > maxNewPos ? maxNewPos : currentPosToken;
    }

    // Find empty spot to store trade in userTrades[trader][pairIndex][...]
    function firstEmptyUserTradesIndex(address trader, uint pairIndex) private view returns(uint index){
        for(uint i = 0; i < MAX_TRADES_PER_PAIR; i++){
            if(userTrades[trader][pairIndex][i].leverage == 0){
                index = i;
                break;
            }
        }
    }

    // Get position size - gov and dev fees + store the fees
    function handleOpenFees(uint _positionSizeToken) private returns(uint posToken_minusFees, uint posUsd_minusFees){
        uint govFee = _positionSizeToken.mul(priceAggregator.govOpenFeeP()).div(100*PRECISION);
        uint devFee = _positionSizeToken.mul(priceAggregator.devOpenFeeP()).div(100*PRECISION);
        posToken_minusFees = _positionSizeToken.sub(govFee).sub(devFee);
        posUsd_minusFees = posToken_minusFees.mul(tokenPriceUsd()).div(PRECISION);
        govFees = govFees.add(govFee);
        devFees = devFees.add(devFee);
    }

    // After a trade is opened
    function registerTrade(Trade memory trade) private{
        if(trade.buy){
            trade.tp = trade.tp > 0 ? trade.openPrice.add(trade.openPrice.mul(trade.tp).div(trade.leverage).div(PRECISION*100)) : 0;
            trade.sl = trade.sl > 0 ? trade.openPrice.sub(trade.openPrice.mul(trade.sl).div(trade.leverage).div(PRECISION*100)) : 0;
        }else{
            trade.tp = trade.tp > 0 ? trade.openPrice.sub(trade.openPrice.mul(trade.tp).div(trade.leverage).div(PRECISION*100)) : 0;
            trade.sl = trade.sl > 0 ? trade.openPrice.add(trade.openPrice.mul(trade.sl).div(trade.leverage).div(PRECISION*100)) : 0;
        }

        userTrades[trade.trader][trade.pairIndex][trade.userTradesIndex] = trade;
        userTradesCount[trade.trader][trade.pairIndex]++;

        if(userTradesCount[trade.trader][trade.pairIndex] == 1){
            pairTradersId[trade.trader][trade.pairIndex] = pairTraders[trade.pairIndex].length;
            pairTraders[trade.pairIndex].push(trade.trader);
        }

        priceAggregator.increaseOpenInterest(trade.pairIndex, trade.positionSizeToken, trade.leverage);
        traders[trade.trader].leverageUnlocked = traders[trade.trader].leverageUnlocked == 0 ? 100 : 150;
        tradesPerBlock[block.number]++;
    }

    // Unregister trade from mappings & arrays
    function unregisterTrade(
        address trader,
        uint pairIndex,
        uint userTradesIndex) private{
        Trade storage t = userTrades[trader][pairIndex][userTradesIndex];
        uint _pairTradersId = pairTradersId[trader][pairIndex];

        // Reduce open interest
        priceAggregator.decreaseOpenInterest(pairIndex, t.positionSizeToken, t.leverage);

        // Delete from pairTraders array
        if(userTradesCount[trader][pairIndex] == 1){
            address[] storage p = pairTraders[pairIndex];
            p[_pairTradersId] = p[p.length-1];
            pairTradersId[p[_pairTradersId]][pairIndex] = _pairTradersId;
            delete pairTradersId[trader][pairIndex];
            p.pop();
        }

        // Delete from userTrades array (leaves hole => same userTradesIndex)
        delete userTrades[trader][pairIndex][userTradesIndex];
        userTradesCount[trader][pairIndex]--;

        tradesPerBlock[block.number]++;
    }

    // Unregister pending market order
    function unregisterPendingMarketOrder(bool _open, address _trader, uint _pairIndex, uint _order) private{
        uint[] storage orderIds = pendingOrderIds[_trader];
        for(uint i = 0; i < orderIds.length; i++){
            if(orderIds[i] == _order){
                if(_open){ 
                    pendingMarketOpenCount[_trader][_pairIndex]--;
                }else{
                    pendingMarketCloseCount[_trader][_pairIndex]--;
                }

                orderIds[i] = orderIds[orderIds.length-1];
                orderIds.pop();

                break;
            }
        }

        delete reqID_pendingMarketOrder[_order];
    }

    // Unregister limit order
    function unregisterLimitOrder(address _trader, uint _pairIndex) private{
        // Copy last order to deleted order => update id of this limit order
        uint id = userOpenLimitOrderId[_trader][_pairIndex];
        openLimitOrders[id] = openLimitOrders[openLimitOrders.length-1];
        userOpenLimitOrderId[openLimitOrders[id].trader][openLimitOrders[id].pairIndex] = id;

        // Remove
        delete userOpenLimitOrderId[_trader][_pairIndex];
        openLimitOrders.pop();
    }

    // Send tokens to trader and his referral
    // + reward liquidity providers
    function handleTokensBack(
        int _percentProfit,
        address _trader,
        uint _tokensBack,
        uint _amountNftToken,
        uint _lpFee
    ) private{
        pool.increaseAccTokensPerLp(_lpFee);

        if(_tokensBack >= _amountNftToken.add(_lpFee)
        && _percentProfit > int(LIQUIDATION_P*PRECISION).mul(-1)){
            _tokensBack = _tokensBack.sub(_lpFee).sub(_amountNftToken);

            if(traders[_trader].referral == address(0)){
                uint referralBurn = _tokensBack.mul(priceAggregator.referralP()).div(PRECISION*100);

                token.mint(_trader, _tokensBack.sub(referralBurn));
                tokensMinted += _tokensBack - referralBurn;
            }else{
                uint referralTokens = _tokensBack.mul(priceAggregator.referralP()).div(PRECISION*200);
                uint userTokens = _tokensBack.sub(referralTokens);

                token.mint(_trader, userTokens);
                token.mint(traders[_trader].referral, referralTokens);

                Trader storage referralUser = traders[traders[_trader].referral];
                referralUser.referralRewardsTotal += referralTokens;

                tokensMinted += _tokensBack;
            }
        }
    }

    // Get reserves LP (1e18)
    function reservesLp() private view returns(uint, uint){
        (uint112 reserves0, uint112 reserves1, ) = lp.getReserves();
        if(lp.token0() == address(token)){
            return (reserves0, reserves1);
        }else{
            return (reserves1, reserves0);
        }
    }

    // Get Token price in USD (PRECISION)
    function tokenPriceUsd() public view returns(uint){
        (uint reserveToken, uint reserveUsd) = reservesLp();
        return reserveUsd.mul(PRECISION).div(reserveToken);
    }

    // EXTERNAL TRADING FUNCTIONS

    // 0. Modifiers
    modifier notContract(){
        require(tx.origin == msg.sender);
        _;
    }
    modifier onlyPriceAggregator(){
        require(msg.sender == address(priceAggregator));
        _;
    }

    function hasOpenLimitOrder(address _trader, uint _pairIndex) public view returns(bool){
        if(openLimitOrders.length == 0){ return false; }

        uint pendingOrderId = userOpenLimitOrderId[_trader][_pairIndex];
        return openLimitOrders[pendingOrderId].trader == _trader && 
               openLimitOrders[pendingOrderId].pairIndex == _pairIndex;
    }

    // Open a new trade at current pair price
    function openTrade(
        uint _pairIndex,
        bool _buy,
        uint _positionSizeToken, // 1e18
        uint _leverage,
        uint _spreadReductionId, // 1,2,3,4,5 (nft type => 0 = none)
        uint _price,     // PRECISION
        uint _slippageP, // PRECISION
        uint _tpP,       // PRECISION
        uint _slP,       // PRECISION
        bool _limit,
        address _referral
        ) external notContract{

        uint pairTotalOrders = userTradesCount[msg.sender][_pairIndex] + pendingMarketOpenCount[msg.sender][_pairIndex];
        pairTotalOrders = hasOpenLimitOrder(msg.sender, _pairIndex) ? pairTotalOrders + 1 : pairTotalOrders;

        require(tradesPerBlock[block.number] < priceAggregator.maxTradesPerBlock(), "MAX_TRADES_PER_BLOCK");
        require(!priceAggregator.isPaused(), "PAUSED");
        require(priceAggregator.canOpenTrade(_pairIndex, _positionSizeToken, _leverage), "MAX_OPEN_INTEREST");
        require(pairTotalOrders < MAX_TRADES_PER_PAIR, "MAX_TRADES_PER_PAIR");
        require(pendingOrderIds[msg.sender].length < MAX_PENDING_ORDERS, "MAX_PENDING_ORDERS");
        (uint reserveToken, ) = reservesLp();
        require(_positionSizeToken >= priceAggregator.minPosUsd().mul(1e18*PRECISION).div(tokenPriceUsd())
            && _positionSizeToken <= reserveToken.mul(priceAggregator.maxPosTokenP()).div(100*PRECISION),
            "WRONG_POS");
        require(_leverage >= 5 && _leverage <= 150, "WRONG_LEVERAGE");
        require(_leverage <= 50 || _leverage <= traders[msg.sender].leverageUnlocked, "LEVERAGE_NOT_UNLOCKED");
        require(_spreadReductionId == 0 || nft[_spreadReductionId-1].balanceOf(msg.sender) >= 1,
            "NO_CORRESPONDING_NFT_SPREAD_REDUCTION");
        require(_slP < MAX_SL_P*PRECISION, "WRONG_SL");

        if(!_limit){
            uint order = priceAggregator.getPrice(_pairIndex, 0);
            pendingOrderIds[msg.sender].push(order);

            reqID_pendingMarketOrder[order].block = block.number;
            reqID_pendingMarketOrder[order].wantedPrice = _price;
            reqID_pendingMarketOrder[order].slippageP = _slippageP;
            reqID_pendingMarketOrder[order].trade.trader = msg.sender;
            reqID_pendingMarketOrder[order].trade.pairIndex = _pairIndex;
            reqID_pendingMarketOrder[order].trade.buy = _buy;
            reqID_pendingMarketOrder[order].trade.leverage = _leverage;
            reqID_pendingMarketOrder[order].trade.sl = _slP; // percentage pnl
            reqID_pendingMarketOrder[order].trade.tp = _tpP; // percentage pnl
            reqID_pendingMarketOrder[order].trade.spreadReductionP = 
            _spreadReductionId > 0 ? priceAggregator.spreadReductionsP(_spreadReductionId-1) : 0;  
            reqID_pendingMarketOrder[order].trade.positionSizeToken = _positionSizeToken;

            pendingMarketOpenCount[msg.sender][_pairIndex]++;
        }else{
            require(!hasOpenLimitOrder(msg.sender, _pairIndex), "LIMIT_ALREADY_OPEN");
            require(_slippageP >= priceAggregator.minLimitOrderSlippageP(), "SLIPPAGE_TOO_SMALL");

            openLimitOrders.push(OpenLimitOrder(
                msg.sender,
                _pairIndex,
                _positionSizeToken,
                _spreadReductionId > 0 ? priceAggregator.spreadReductionsP(_spreadReductionId-1) : 0,
                _buy,
                _leverage,
                _tpP, // percentage pnl
                _slP, // percentage pnl
                _buy ? _price.sub(_price.mul(_slippageP).div(PRECISION*100)) : _price,
                _buy ? _price : _price.add(_price.mul(_slippageP).div(PRECISION*100)),
                block.number
            ));

            userOpenLimitOrderId[msg.sender][_pairIndex] = openLimitOrders.length-1;

            emit TradeLimitOpened(msg.sender, _pairIndex);
        }

        token.burn(msg.sender, _positionSizeToken);
        tokensBurned += _positionSizeToken;

        if(_referral != address(0) && traders[msg.sender].referral == address(0)
        && _referral != msg.sender){
            traders[msg.sender].referral = _referral;
        }
    }

    function openTradeMarketCallback(
        uint _order,
        uint _price,
        uint _spreadP) external onlyPriceAggregator{
        
        PendingMarketOrder storage o = reqID_pendingMarketOrder[_order];
        if(o.block == 0){ return; }

        uint finalSpreadP = _spreadP.sub(_spreadP.mul(o.trade.spreadReductionP).div(100));

        uint openPrice = o.trade.buy ? _price.add(_price.mul(finalSpreadP).div(100*PRECISION))
                                          : _price.sub(_price.mul(finalSpreadP).div(100*PRECISION));

        uint maxSlippage = o.wantedPrice.mul(o.slippageP).div(100*PRECISION);

        (uint positionSizeToken_minusFees, uint positionSizeUsd_minusFees) = handleOpenFees(o.trade.positionSizeToken);

        if(o.trade.buy && openPrice > o.wantedPrice.add(maxSlippage)
        || !o.trade.buy && openPrice < o.wantedPrice.sub(maxSlippage)){

            token.mint(o.trade.trader, positionSizeToken_minusFees);
            tokensMinted += positionSizeToken_minusFees;

            emit TradeCanceledMarket(
                o.trade.trader,
                o.trade.pairIndex,
                o.wantedPrice,
                o.slippageP,
                openPrice
            );

        }else{
            uint userTradesIndex = firstEmptyUserTradesIndex(o.trade.trader, o.trade.pairIndex);

            registerTrade(Trade(
                o.trade.trader,
                o.trade.pairIndex,
                userTradesIndex,
                positionSizeToken_minusFees,
                positionSizeUsd_minusFees,
                openPrice,
                o.trade.spreadReductionP,
                o.trade.buy,
                o.trade.leverage,
                o.trade.tp,
                o.trade.sl,
                0,
                0
            ));

            emit TradeOpenedMarket(
                o.trade.trader,
                o.trade.pairIndex,
                userTradesIndex,
                o.trade.buy,
                o.trade.leverage,
                openPrice,
                positionSizeToken_minusFees,
                positionSizeUsd_minusFees
            );
        }

        unregisterPendingMarketOrder(true, o.trade.trader, o.trade.pairIndex, _order);
    }

    // Cancel open limit order
    function cancelOpenLimitOrder(uint _pairIndex) external{
        require(hasOpenLimitOrder(msg.sender, _pairIndex), "NO_LIMIT");

        uint id = userOpenLimitOrderId[msg.sender][_pairIndex];
        require(block.number.sub(openLimitOrders[id].block) >= LIMIT_TIMELOCK, "LIMIT_TIMELOCK");

        token.mint(msg.sender, openLimitOrders[id].positionSizeToken);
        tokensMinted += openLimitOrders[id].positionSizeToken;

        unregisterLimitOrder(msg.sender, _pairIndex);

        emit TradeLimitCanceled(msg.sender, _pairIndex);
    }

    // Update stop loss for an open trade
    // Set to 0 to remove
    // If long and sl is above current price => can be closed instantly
    // If short and sl is below current price => can be closed instantly
    // Can be set in profit = stop profit
    // must be above -STOP_LOSS_P profit => if liq at -90% => above -80%
    // otherwise can set at -89% and earn 11% of position size while at -90% liquidation earns 0 to trader
    function updateSl(uint _pairIndex, uint _userTradesIndex, uint _newSl) external notContract{
        Trade storage t = userTrades[msg.sender][_pairIndex][_userTradesIndex];
        require(t.leverage > 0, "NO_TRADE");
        require(_newSl == 0 || t.buy && _newSl > t.openPrice.sub(t.openPrice.mul(MAX_SL_P).div(100*t.leverage)) ||
                !t.buy && _newSl < t.openPrice.add(t.openPrice.mul(MAX_SL_P).div(100*t.leverage)), "SL_TOO_BIG");
        require(block.number.sub(t.slLastUpdated) >= LIMIT_TIMELOCK, "LIMIT_TIMELOCK");
        t.sl = _newSl;
        t.slLastUpdated = block.number;
        emit TpSlUpdated(msg.sender, _pairIndex, _userTradesIndex, false, _newSl);
    }

    // Update take profit for an open trade
    // Set to 0 to remove
    // Can be set in loss (for example exit long on a bounce even if in loss)
    // If long and tp is below current price => can be closed instantly
    // If short and tp is above current price => can be closed instantly
    function updateTp(uint _pairIndex, uint _userTradesIndex, uint _newTp) external notContract{
        Trade storage t = userTrades[msg.sender][_pairIndex][_userTradesIndex];
        require(t.leverage > 0, "NO_TRADE");
        require(block.number.sub(t.tpLastUpdated) >= LIMIT_TIMELOCK, "LIMIT_TIMELOCK");
        t.tp = _newTp;
        t.tpLastUpdated = block.number;
        emit TpSlUpdated(msg.sender, _pairIndex, _userTradesIndex, true, _newTp);
    }

    // Close open trade at current price
    function closeTradeMarket(uint _pairIndex, uint _userTradesIndex) external notContract{
        require(tradesPerBlock[block.number] < priceAggregator.maxTradesPerBlock(), "MAX_TRADES_PER_BLOCK");
        require(pendingMarketCloseCount[msg.sender][_pairIndex] < userTradesCount[msg.sender][_pairIndex],
        "TOO_MANY_CLOSE_REQUESTS");
        require(pendingOrderIds[msg.sender].length < MAX_PENDING_ORDERS, "MAX_PENDING_ORDERS");
        require(userTrades[msg.sender][_pairIndex][_userTradesIndex].leverage > 0, "NO_TRADE");

        uint order = priceAggregator.getPrice(_pairIndex, 1);
        pendingOrderIds[msg.sender].push(order);

        PendingMarketOrder storage o = reqID_pendingMarketOrder[order];
        o.block = block.number;
        o.trade.trader = msg.sender;
        o.trade.pairIndex = _pairIndex;
        o.trade.userTradesIndex = _userTradesIndex;

        pendingMarketCloseCount[msg.sender][_pairIndex]++;
    }

    function closeTradeMarketCallback(
        uint _order,
        uint _price) external onlyPriceAggregator{
        
        PendingMarketOrder storage o = reqID_pendingMarketOrder[_order];
        Trade storage pendingTrade = userTrades[o.trade.trader][o.trade.pairIndex][o.trade.userTradesIndex];

        if(o.block == 0){ return; }

        if(pendingTrade.leverage > 0){
            uint posToken = positionSizeToken(
                pendingTrade.positionSizeToken,
                pendingTrade.positionSizeUsd
            );

            int percentProfit = currentPercentProfit(
                pendingTrade.openPrice,
                _price,
                pendingTrade.buy,
                pendingTrade.leverage
            );

            int pnl = int(posToken).mul(percentProfit).div(int(100*PRECISION));

            handleTokensBack(
                percentProfit,
                pendingTrade.trader,
                pnl >= 0 ? posToken.add(uint(pnl)) : posToken.sub(uint(pnl.mul(-1))),
                0,
                posToken.mul(priceAggregator.lpCloseFeeP()).div(100*PRECISION)
            );

            emit TradeClosedMarket(
                pendingTrade.trader,
                pendingTrade.pairIndex,
                pendingTrade.userTradesIndex,
                _price,
                pendingTrade.buy,
                posToken,
                pendingTrade.leverage,
                pnl,
                tokenPriceUsd()
            );

            unregisterTrade(
                pendingTrade.trader,
                pendingTrade.pairIndex,
                pendingTrade.userTradesIndex
            );
        }
        
        unregisterPendingMarketOrder(false, o.trade.trader, o.trade.pairIndex, _order);
    }

    // Try to execute a TP, SL, Liquidation, or limit long/short (only done by NFT holders)
    // order types: 1 = take profit, 2 = stop loss, 3 = liquidation, 4 = open trade
    // if open trade => _userTradesIndex can be anything (not used)
    function executeNftOrder(uint _orderType, address _a, uint _pairIndex, uint _userTradesIndex, uint _nftId, uint _nftType) external notContract{
        require(_orderType >= 1 && _orderType <= 4, "WRONG_ORDER_TYPE");
        require(_nftType > 0 && _nftType < 6, "WRONG_NFT_TYPE");
        require(msg.sender == govFund || nft[_nftType-1].ownerOf(_nftId) == msg.sender, "NO_NFT");
        require(block.number >= nftLastSuccess[_nftId].add(priceAggregator.nftSuccessTimelock()), "SUCCESS_TIMELOCK");

        linkToken.transferFrom(msg.sender, address(priceAggregator), priceAggregator.nftLinkFee());
        uint order;

        if(_orderType == 4){
            require(hasOpenLimitOrder(_a, _pairIndex), "NO_LIMIT");
            order = priceAggregator.getPrice(_pairIndex, 2);
        }else{
            require(userTrades[_a][_pairIndex][_userTradesIndex].leverage > 0, "NO_TRADE");
            require(_orderType != 1 || userTrades[_a][_pairIndex][_userTradesIndex].tp > 0, "NO_TP");
            require(_orderType != 2 || userTrades[_a][_pairIndex][_userTradesIndex].sl > 0, "NO_SL");
            order = priceAggregator.getPrice(_pairIndex, 3);
        }

        PendingNftOrder storage n = reqID_pendingNftOrder[order];
        n.nftHolder = msg.sender;
        n.nftId =  _nftId; 
        n.trader =  _a; 
        n.pairIndex =  _pairIndex;
        n.userTradesIndex = _userTradesIndex;
        n.orderType = _orderType;
    }

    function executeNftOpenOrderCallback(
        uint _order,
        uint _price,
        uint _spreadP
    ) external onlyPriceAggregator{
        PendingNftOrder storage nftOrder = reqID_pendingNftOrder[_order];
        if(nftOrder.trader == address(0)){ return; }

        if(hasOpenLimitOrder(nftOrder.trader, nftOrder.pairIndex) && !priceAggregator.isPaused()
        && block.number >= nftLastSuccess[nftOrder.nftId].add(priceAggregator.nftSuccessTimelock())){
            OpenLimitOrder storage o = openLimitOrders[userOpenLimitOrderId[nftOrder.trader][nftOrder.pairIndex]];

            if(priceAggregator.canOpenTrade(nftOrder.pairIndex, o.positionSizeToken, o.leverage)){
                uint finalSpreadP = _spreadP.sub(_spreadP.mul(o.spreadReductionP).div(100));
                uint openPrice = o.buy  ? _price.add(_price.mul(finalSpreadP).div(100*PRECISION))
                                        : _price.sub(_price.mul(finalSpreadP).div(100*PRECISION));

                if(openPrice >= o.minPrice && openPrice <= o.maxPrice){
                    uint amountNftToken = o.positionSizeToken.mul(priceAggregator.nftLimitOrderFeeP()).div(100*PRECISION);
                    (uint positionSizeToken_minusFees, uint positionSizeUsd_minusFees) = handleOpenFees(o.positionSizeToken.sub(amountNftToken));
                    uint userTradesIndex = firstEmptyUserTradesIndex(o.trader, o.pairIndex);

                    registerTrade(Trade(
                        o.trader,
                        o.pairIndex,
                        userTradesIndex,
                        positionSizeToken_minusFees,
                        positionSizeUsd_minusFees,
                        openPrice,
                        o.spreadReductionP,
                        o.buy,
                        o.leverage,
                        o.tp,
                        o.sl,
                        0,
                        0
                    ));

                    token.mint(nftOrder.nftHolder, amountNftToken);
                    nftLastSuccess[nftOrder.nftId] = block.number;
                    nftRewards += amountNftToken;

                    emit TradeLimitExecuted(
                        o.trader,
                        o.pairIndex,
                        userTradesIndex,
                        nftOrder.nftHolder,
                        4,
                        openPrice,
                        o.buy,
                        o.leverage,
                        positionSizeToken_minusFees,
                        0,
                        amountNftToken,
                        tokenPriceUsd()
                    );

                    unregisterLimitOrder(o.trader, o.pairIndex);
                }
            }
        }
        delete reqID_pendingNftOrder[_order];
    }

    function executeNftCloseOrderCallback(
        uint _order,
        uint _price) external onlyPriceAggregator{
        
        uint amountNftToken;
        if(reqID_pendingNftOrder[_order].trader == address(0)){ return; }

        Trade storage t = userTrades[reqID_pendingNftOrder[_order].trader][reqID_pendingNftOrder[_order].pairIndex][reqID_pendingNftOrder[_order].userTradesIndex];

        if(t.leverage > 0 && block.number >= nftLastSuccess[reqID_pendingNftOrder[_order].nftId].add(priceAggregator.nftSuccessTimelock())){ 
            int percentProfit = currentPercentProfit(
                t.openPrice,
                _price,
                t.buy,
                t.leverage
            );

            uint posToken = positionSizeToken(t.positionSizeToken, t.positionSizeUsd);

            // TP or SL
            if((reqID_pendingNftOrder[_order].orderType == 1 && t.tp > 0 && t.buy && _price >= t.tp)
            || (reqID_pendingNftOrder[_order].orderType == 1 && t.tp > 0 && !t.buy && _price <= t.tp)
            || (reqID_pendingNftOrder[_order].orderType == 2 && t.sl > 0 && t.buy && _price <= t.sl)
            || (reqID_pendingNftOrder[_order].orderType == 2 && t.sl > 0 && !t.buy && _price >= t.sl)){
               amountNftToken = posToken.mul(priceAggregator.nftLimitOrderFeeP()).div(100*PRECISION);
            }
            
            // Liquidation
            if(reqID_pendingNftOrder[_order].orderType == 3 && percentProfit <= int(LIQUIDATION_P*PRECISION).mul(-1)){
                amountNftToken = posToken.mul(priceAggregator.nftLiqFeeP()).div(100);
            }

            if(amountNftToken > 0){
                int pnl = int(posToken).mul(percentProfit).div(int(100*PRECISION));

                handleTokensBack(
                    percentProfit,
                    t.trader,
                    pnl >= 0 ? posToken.add(uint(pnl)) : posToken.sub(uint(pnl.mul(-1))),
                    amountNftToken,
                    reqID_pendingNftOrder[_order].orderType == 3 ? posToken.mul(priceAggregator.lpLiqFeeP()).div(100)
                    : posToken.mul(priceAggregator.lpCloseFeeP()).div(100*PRECISION)
                );

                emit TradeLimitExecuted(
                    t.trader,
                    t.pairIndex,
                    t.userTradesIndex,
                    reqID_pendingNftOrder[_order].nftHolder,
                    reqID_pendingNftOrder[_order].orderType,
                    _price,
                    t.buy,
                    t.leverage,
                    posToken,
                    pnl,
                    amountNftToken,
                    tokenPriceUsd()
                );

                unregisterTrade(
                    t.trader,
                    t.pairIndex,
                    t.userTradesIndex
                );

                token.mint(reqID_pendingNftOrder[_order].nftHolder, amountNftToken);
                nftLastSuccess[reqID_pendingNftOrder[_order].nftId] = block.number;
                nftRewards += amountNftToken;
            }
        }

        delete reqID_pendingNftOrder[_order];
    }

    // Security functions if market order callback not executed by chainlink nodes after 50 blocks
    function marketOrderCallbackFailed(uint _order) external{
        PendingMarketOrder storage o = reqID_pendingMarketOrder[_order];
        require(o.block > 0 && block.number >= o.block.add(50), "WAIT_50_BLOCKS");
        require(o.trade.trader == msg.sender, "NOT_YOUR_ORDER");

        Trade storage t = userTrades[msg.sender][o.trade.pairIndex][o.trade.userTradesIndex];
        bool openOrder = o.trade.leverage > 0;
        bool tradeOpen = t.leverage > 0;
        uint posToken = openOrder ? o.trade.positionSizeToken : t.positionSizeToken;

        // Close market order
        if(openOrder || tradeOpen){
            if(!openOrder){
                unregisterTrade(
                    msg.sender,
                    o.trade.pairIndex,
                    o.trade.userTradesIndex
                );
            }
            token.mint(msg.sender, posToken);
            tokensMinted += posToken;
        }

        unregisterPendingMarketOrder(openOrder, msg.sender, o.trade.pairIndex, _order);

        emit ChainlinkCallbackFailed();
    }

    // Claim fees
    function claimFees() external onlyGov{
        uint dFees = devFees;
        uint gFees = govFees;
        devFees = 0;
        govFees = 0;
        token.mint(devFund, dFees);
        token.mint(govFund, gFees);
        tokensMinted += dFees + gFees;
    }

    // UI VIEW FUNCTIONS (READ-ONLY)
    function pairTradersArray(uint _pairIndex) external view returns(address[] memory){
        return pairTraders[_pairIndex];
    }
    function openLimitOrdersCount() external view returns(uint){
        return openLimitOrders.length;
    }
    function pendingOrderIdsCount() external view returns(uint){
        return pendingOrderIds[msg.sender].length;
    }
    function reqID_pendingMarketOrder_get(uint order) external view returns(uint,uint,uint,address,uint,uint,uint,uint,bool,uint,uint,uint){
        PendingMarketOrder storage o = reqID_pendingMarketOrder[order];
        return (
            o.block,
            o.wantedPrice,
            o.slippageP,
            o.trade.trader,
            o.trade.pairIndex,
            o.trade.userTradesIndex,
            o.trade.positionSizeToken,
            o.trade.spreadReductionP,
            o.trade.buy,
            o.trade.leverage,
            o.trade.tp,
            o.trade.sl
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_gov","type":"address"},{"internalType":"address","name":"_dev","type":"address"},{"internalType":"contract NftInterfaceV4[5]","name":"_nft","type":"address[5]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"value","type":"address"}],"name":"AddressUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"ChainlinkCallbackFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"indexed":false,"internalType":"bool","name":"tp","type":"bool"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TpSlUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wantedPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippageP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"openPrice","type":"uint256"}],"name":"TradeCanceledMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"leverage","type":"uint256"},{"indexed":false,"internalType":"int256","name":"pnlToken","type":"int256"},{"indexed":false,"internalType":"uint256","name":"tokenPriceUsd","type":"uint256"}],"name":"TradeClosedMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"TradeLimitCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"nftHolder","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"leverage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"indexed":false,"internalType":"int256","name":"pnlToken","type":"int256"},{"indexed":false,"internalType":"uint256","name":"rewardToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenPriceUsd","type":"uint256"}],"name":"TradeLimitExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"TradeLimitOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"leverage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionSizeUsd","type":"uint256"}],"name":"TradeOpenedMarket","type":"event"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"cancelOpenLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_userTradesIndex","type":"uint256"}],"name":"closeTradeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"closeTradeMarketCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"executeNftCloseOrderCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_spreadP","type":"uint256"}],"name":"executeNftOpenOrderCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderType","type":"uint256"},{"internalType":"address","name":"_a","type":"address"},{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_nftType","type":"uint256"}],"name":"executeNftOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"govFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"govFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trader","type":"address"},{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"hasOpenLimitOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lp","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"}],"name":"marketOrderCallbackFailed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nft","outputs":[{"internalType":"contract NftInterfaceV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftLastSuccess","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"openLimitOrders","outputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"internalType":"uint256","name":"spreadReductionP","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"uint256","name":"block","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openLimitOrdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"bool","name":"_buy","type":"bool"},{"internalType":"uint256","name":"_positionSizeToken","type":"uint256"},{"internalType":"uint256","name":"_leverage","type":"uint256"},{"internalType":"uint256","name":"_spreadReductionId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_slippageP","type":"uint256"},{"internalType":"uint256","name":"_tpP","type":"uint256"},{"internalType":"uint256","name":"_slP","type":"uint256"},{"internalType":"bool","name":"_limit","type":"bool"},{"internalType":"address","name":"_referral","type":"address"}],"name":"openTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_spreadP","type":"uint256"}],"name":"openTradeMarketCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairTraders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"pairTradersArray","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairTradersId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingMarketCloseCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingMarketOpenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingOrderIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOrderIdsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"contract GFarmPoolInterfaceV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceAggregator","outputs":[{"internalType":"contract PriceAggregatorInterfaceV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"order","type":"uint256"}],"name":"reqID_pendingMarketOrder_get","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reqID_pendingNftOrder","outputs":[{"internalType":"address","name":"nftHolder","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"orderType","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGovFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"setLp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"setPriceAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract TokenInterfaceV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"traders","outputs":[{"internalType":"uint256","name":"leverageUnlocked","type":"uint256"},{"internalType":"address","name":"referral","type":"address"},{"internalType":"uint256","name":"referralRewardsTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradesPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"_newSl","type":"uint256"}],"name":"updateSl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"_newTp","type":"uint256"}],"name":"updateTp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userOpenLimitOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userTrades","outputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"internalType":"uint256","name":"positionSizeUsd","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"uint256","name":"spreadReductionP","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"},{"internalType":"uint256","name":"tpLastUpdated","type":"uint256"},{"internalType":"uint256","name":"slLastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userTradesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b5060405162005f7f38038062005f7f833981810160405260e08110156200003757600080fd5b508051602082015190916040016001600160a01b0383166200005857600080fd5b6001600160a01b0382166200006c57600080fd5b80516001600160a01b03166200008157600080fd5b60208101516001600160a01b03166200009957600080fd5b60408101516001600160a01b0316620000b157600080fd5b60608101516001600160a01b0316620000c957600080fd5b60808101516001600160a01b0316620000e157600080fd5b600e80546001600160a01b0319166001600160a01b038516179055606082901b6001600160601b0319166080526200011d600382600562000127565b50505050620001a5565b826005810192821562000172579160200282015b828111156200017257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200013b565b506200018092915062000184565b5090565b5b80821115620001805780546001600160a01b031916815560010162000185565b60805160601c615db7620001c860003980610d25528061328b5250615db76000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806390929bbb11610167578063d174a84d116100ce578063edd67fbe11610087578063edd67fbe1461099f578063f4c2baa9146109c8578063f57e6d2f146109ee578063f9309b2014610a1a578063fa7fffba14610a3d578063fc0c546a14610a81576102a0565b8063d174a84d1461091e578063d294f0931461093b578063d8defd1514610943578063e3cbe3a71461096c578063e7873b581461098f578063ecba583b14610997576102a0565b80639d0214cb116101205780639d0214cb14610840578063a2a3c0cb1461085d578063aa3b7d7714610880578063b7682d541461089d578063bcc9f1d3146108c9578063be73fb99146108f5576102a0565b806390929bbb146106e057806392a88fa2146107035780639620ca4f1461074f578063972182291461078f57806399794d35146107ac5780639c8912f114610814576102a0565b80634415b3691161020b5780635fbfe8cc116101c45780635fbfe8cc146105aa5780636de9f32b146106175780637be9dd731461061f5780637c74f1af14610689578063865f12e8146106af5780638e66f5fb146106b7576102a0565b80634415b369146105055780634437152a146105315780635070e837146105575780635249be251461057d57806352e5398f146105855780635ad9f993146105a2576102a0565b80633078fff51161025d5780633078fff514610460578063313c06a01461046857806332149592146104705780633ba91ea6146104ed57806340b3e5c4146104f55780634390d2a8146104fd576102a0565b80630224e9a7146102a55780630a997a7f146102bf5780630ca958c6146102eb578063144fa6d71461037157806316f0115b14610399578063306868a5146103bd575b600080fd5b6102ad610a89565b60408051918252519081900360200190f35b6102ad600480360360408110156102d557600080fd5b506001600160a01b038135169060200135610a8f565b6103086004803603602081101561030157600080fd5b5035610aac565b604080519c8d5260208d019b909b528b8b01999099526001600160a01b0390971660608b015260808a019590955260a089019390935260c088019190915260e0870152151561010086015261012085015261014084015261016083015251908190036101800190f35b6103976004803603602081101561038757600080fd5b50356001600160a01b0316610b18565b005b6103a1610be5565b604080516001600160a01b039092168252519081900360200190f35b6103ef600480360360608110156103d357600080fd5b506001600160a01b038135169060208101359060400135610bf4565b604080516001600160a01b03909e168e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c0890192909252151560e088015261010087015261012086015261014085015261016084015261018083015251908190036101a00190f35b6103a1610c83565b6103a1610c92565b61048d6004803603602081101561048657600080fd5b5035610ca1565b604080516001600160a01b03909c168c5260208c019a909a528a8a019890985260608a0196909652931515608089015260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b6102ad610d17565b6102ad610d1d565b6103a1610d23565b6102ad6004803603604081101561051b57600080fd5b506001600160a01b038135169060200135610d47565b6103976004803603602081101561054757600080fd5b50356001600160a01b0316610d64565b6103976004803603602081101561056d57600080fd5b50356001600160a01b0316610e30565b6102ad610ef0565b6102ad6004803603602081101561059b57600080fd5b5035610f22565b6102ad610f34565b6105c7600480360360208110156105c057600080fd5b5035610f3a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106035781810151838201526020016105eb565b505050509050019250505060405180910390f35b6102ad610fa6565b610397600480360361016081101561063657600080fd5b50803590602081013515159060408101359060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012081013515159061014001356001600160a01b0316610fac565b6103976004803603602081101561069f57600080fd5b50356001600160a01b0316611e5e565b6103a1611f16565b610397600480360360608110156106cd57600080fd5b5080359060208101359060400135611f25565b610397600480360360408110156106f657600080fd5b508035906020013561251d565b6107296004803603602081101561071957600080fd5b50356001600160a01b0316612796565b604080519384526001600160a01b03909216602084015282820152519081900360600190f35b61077b6004803603604081101561076557600080fd5b506001600160a01b0381351690602001356127c0565b604080519115158252519081900360200190f35b610397600480360360208110156107a557600080fd5b5035612855565b6107c9600480360360208110156107c257600080fd5b5035612a5b565b60405180876001600160a01b03168152602001868152602001856001600160a01b03168152602001848152602001838152602001828152602001965050505050505060405180910390f35b6102ad6004803603604081101561082a57600080fd5b506001600160a01b038135169060200135612a9c565b6103a16004803603602081101561085657600080fd5b5035612ab9565b6103976004803603604081101561087357600080fd5b5080359060200135612ad6565b6102ad6004803603602081101561089657600080fd5b5035612de5565b6102ad600480360360408110156108b357600080fd5b506001600160a01b038135169060200135612df7565b6102ad600480360360408110156108df57600080fd5b506001600160a01b038135169060200135612e14565b6103976004803603606081101561090b57600080fd5b5080359060208101359060400135612e42565b6103976004803603602081101561093457600080fd5b5035613044565b610397613219565b6103976004803603606081101561095957600080fd5b508035906020810135906040013561337d565b6103a16004803603604081101561098257600080fd5b50803590602001356134ac565b6102ad6134e1565b6102ad6134e7565b610397600480360360608110156109b557600080fd5b50803590602081013590604001356134fa565b610397600480360360208110156109de57600080fd5b50356001600160a01b031661386d565b6102ad60048036036040811015610a0457600080fd5b506001600160a01b038135169060200135613937565b61039760048036036040811015610a3057600080fd5b5080359060200135613954565b610397600480360360c0811015610a5357600080fd5b508035906001600160a01b036020820135169060408101359060608101359060808101359060a0013561400c565b6103a16146a3565b600c5481565b601160209081526000928352604080842090915290825290205481565b6000908152601760205260409020600d810154600e820154600f83015483546001850154600286015460038701546006880154600789015460088a015460098b0154600a909b0154999b989a97996001600160a01b0390971698959794969395929460ff909216939092565b600e546001600160a01b03163314610b5d576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6002546001600160a01b0316158015610b7e57506001600160a01b03811615155b610b8757600080fd5b600280546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600582820152643a37b5b2b760d91b606083015251600080516020615d178339815191529181900360800190a150565b6000546001600160a01b031681565b60106020528260005260406000206020528160005260406000208160038110610c1957fe5b600d020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01546001600160a01b03909b169e50989c50969a50949893979296919560ff909116949390928d565b6001546001600160a01b031681565b6008546001600160a01b031681565b60198181548110610cae57fe5b60009182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a01546001600160a01b039099169a5096989597949660ff9094169592949193909290918b565b600d5481565b60195490565b7f000000000000000000000000000000000000000000000000000000000000000081565b601360209081526000928352604080842090915290825290205481565b600e546001600160a01b03163314610da9576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6000546001600160a01b0316158015610dca57506001600160a01b03811615155b610dd357600080fd5b600080546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600482820152631c1bdbdb60e21b606083015251600080516020615d178339815191529181900360800190a150565b600e546001600160a01b03163314610e75576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6001600160a01b038116610e8857600080fd5b600180546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600f828201526e383934b1b2a0b3b3b932b3b0ba37b960891b606083015251600080516020615d178339815191529181900360800190a150565b6000806000610efd6146b2565b9092509050610f1b82610f15836402540be4006147eb565b9061484b565b9250505090565b601b6020526000908152604090205481565b600b5481565b6000818152601a6020908152604091829020805483518184028101840190945280845260609392830182828015610f9a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f7c575b50505050509050919050565b600a5481565b323314610fb857600080fd5b600060156000336001600160a01b03166001600160a01b0316815260200190815260200160002060008d81526020019081526020016000205460116000336001600160a01b03166001600160a01b0316815260200190815260200160002060008e815260200190815260200160002054019050611035338d6127c0565b61103f5780611044565b806001015b9050600160009054906101000a90046001600160a01b03166001600160a01b031663796d82d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109457600080fd5b505afa1580156110a8573d6000803e3d6000fd5b505050506040513d60208110156110be57600080fd5b5051436000908152601b602052604090205410611119576040805162461bcd60e51b81526020600482015260146024820152734d41585f5452414445535f5045525f424c4f434b60601b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561116757600080fd5b505afa15801561117b573d6000803e3d6000fd5b505050506040513d602081101561119157600080fd5b5051156111ce576040805162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015290519081900360640190fd5b60015460408051630fa5fd3360e21b8152600481018f9052602481018d9052604481018c905290516001600160a01b0390921691633e97f4cc91606480820192602092909190829003018186803b15801561122857600080fd5b505afa15801561123c573d6000803e3d6000fd5b505050506040513d602081101561125257600080fd5b5051611299576040805162461bcd60e51b815260206004820152601160248201527013505617d3d4115397d2539511549154d5607a1b604482015290519081900360640190fd5b600381106112e4576040805162461bcd60e51b815260206004820152601360248201527226a0ac2faa2920a222a9afa822a92fa820a4a960691b604482015290519081900360640190fd5b3360009081526014602052604090205460051161133d576040805162461bcd60e51b81526020600482015260126024820152714d41585f50454e44494e475f4f524445525360701b604482015290519081900360640190fd5b60006113476146b2565b5090506113e8611355610ef0565b610f156402540be400670de0b6b3a764000002600160009054906101000a90046001600160a01b03166001600160a01b0316633707402d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113b657600080fd5b505afa1580156113ca573d6000803e3d6000fd5b505050506040513d60208110156113e057600080fd5b5051906147eb565b8b1015801561148657506114826402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b0316633e0947506040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b505afa158015611463573d6000803e3d6000fd5b505050506040513d602081101561147957600080fd5b505184906147eb565b8b11155b6114c3576040805162461bcd60e51b815260206004820152600960248201526857524f4e475f504f5360b81b604482015290519081900360640190fd5b60058a101580156114d5575060968a11155b611517576040805162461bcd60e51b815260206004820152600e60248201526d57524f4e475f4c4556455241474560901b604482015290519081900360640190fd5b60328a1115806115365750336000908152600f60205260409020548a11155b61157f576040805162461bcd60e51b815260206004820152601560248201527413115591549051d157d393d517d5539313d0d2d151605a1b604482015290519081900360640190fd5b88158061161257506001600360018b036005811061159957fe5b0154604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156115e357600080fd5b505afa1580156115f7573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b505110155b61164d5760405162461bcd60e51b8152600401808060200182810382526025815260200180615cb06025913960400191505060405180910390fd5b64ba43b740008510611691576040805162461bcd60e51b815260206004820152600860248201526715d493d391d7d4d360c21b604482015290519081900360640190fd5b836119cf576000600160009054906101000a90046001600160a01b03166001600160a01b0316635cf4ee918f60006040518363ffffffff1660e01b81526004018083815260200182815260200192505050602060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b505050506040513d602081101561172657600080fd5b8101908080519060200190929190505050905060146000336001600160a01b03166001600160a01b031681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150554360176000838152602001908152602001600020600d01819055508860176000838152602001908152602001600020600e01819055508760176000838152602001908152602001600020600f0181905550336017600083815260200190815260200160002060000160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508d60176000838152602001908152602001600020600001600101819055508c6017600083815260200190815260200160002060000160070160006101000a81548160ff0219169083151502179055508a60176000838152602001908152602001600020600001600801819055508560176000838152602001908152602001600020600001600a018190555086601760008381526020019081526020016000206000016009018190555060008a116118cc576000611948565b600154604080516301ed708560e51b81526000198d01600482015290516001600160a01b0390921691633dae10a091602480820192602092909190829003018186803b15801561191b57600080fd5b505afa15801561192f573d6000803e3d6000fd5b505050506040513d602081101561194557600080fd5b50515b60176000838152602001908152602001600020600001600601819055508b601760008381526020019081526020016000206000016003018190555060156000336001600160a01b03166001600160a01b0316815260200190815260200160002060008f81526020019081526020016000206000815480929190600101919050555050611d65565b6119d9338e6127c0565b15611a20576040805162461bcd60e51b81526020600482015260126024820152712624a6a4aa2fa0a62922a0a22cafa7a822a760711b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b0316638066b6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6e57600080fd5b505afa158015611a82573d6000803e3d6000fd5b505050506040513d6020811015611a9857600080fd5b5051871015611ae3576040805162461bcd60e51b815260206004820152601260248201527114d31254141051d157d513d3d7d4d350531360721b604482015290519081900360640190fd5b6019604051806101600160405280336001600160a01b031681526020018f81526020018d815260200160008c11611b1b576000611b97565b600154604080516301ed708560e51b81526000198f01600482015290516001600160a01b0390921691633dae10a091602480820192602092909190829003018186803b158015611b6a57600080fd5b505afa158015611b7e573d6000803e3d6000fd5b505050506040513d6020811015611b9457600080fd5b50515b81526020018e151581526020018c81526020018881526020018781526020018e611bc1578a611bde565b611bde611bd764e8d4a51000610f158e8e6147eb565b8c906148b2565b81526020018e611c0a57611c05611bfe64e8d4a51000610f158e8e6147eb565b8c9061490f565b611c0c565b8a5b81526020014381525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155505060016019805490500360126000336001600160a01b03166001600160a01b0316815260200190815260200160002060008f8152602001908152602001600020819055508c336001600160a01b03167feaaaf7281dc4957604e1a8e78a272fd4e4816b7e6b596da1272759f0d20ff90f60405160405180910390a35b60025460408051632770a7eb60e21b8152336004820152602481018e905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b158015611db857600080fd5b505af1158015611dcc573d6000803e3d6000fd5b5050600980548e01905550506001600160a01b03831615801590611e095750336000908152600f60205260409020600101546001600160a01b0316155b8015611e1e57506001600160a01b0383163314155b15611e4f57336000908152600f6020526040902060010180546001600160a01b0319166001600160a01b0385161790555b50505050505050505050505050565b600e546001600160a01b03163314611ea3576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6001600160a01b038116611eb657600080fd5b600e80546001600160a01b0383166001600160a01b031990911681179091556040805160208101929092528082526007828201526619dbdd919d5b9960ca1b606083015251600080516020615d178339815191529181900360800190a150565b600e546001600160a01b031681565b6001546001600160a01b03163314611f3c57600080fd5b600083815260186020526040902060028101546001600160a01b0316611f625750612518565b60028101546003820154611f7f916001600160a01b0316906127c0565b80156120025750600160009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b158015611fd457600080fd5b505afa158015611fe8573d6000803e3d6000fd5b505050506040513d6020811015611ffe57600080fd5b5051155b8015612099575060015460408051631f1a496960e31b81529051612095926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b15801561204f57600080fd5b505afa158015612063573d6000803e3d6000fd5b505050506040513d602081101561207957600080fd5b505160018301546000908152601c60205260409020549061490f565b4310155b156124d45760028101546001600160a01b03166000908152601260209081526040808320600385015484529091528120546019805490919081106120d957fe5b600091825260209182902060015460038601546002600b90940290920192830154600584015460408051630fa5fd3360e21b8152600481019590955260248501929092526044840152519294506001600160a01b031692633e97f4cc92606480840193829003018186803b15801561215057600080fd5b505afa158015612164573d6000803e3d6000fd5b505050506040513d602081101561217a57600080fd5b5051156124d25760006121a96121a26064610f158560030154886147eb90919063ffffffff16565b85906148b2565b600483015490915060009060ff166121dd576121d86121d164e8d4a51000610f1589866147eb565b87906148b2565b6121fa565b6121fa6121f364e8d4a51000610f1589866147eb565b879061490f565b905082600801548110158015612214575082600901548111155b156124cf576001546040805163151cd11960e21b815290516000926122a49264e8d4a5100092610f15926001600160a01b0316916354734464916004808301926020929190829003018186803b15801561226d57600080fd5b505afa158015612281573d6000803e3d6000fd5b505050506040513d602081101561229757600080fd5b50516002880154906147eb565b90506000806122c86122c38488600201546148b290919063ffffffff16565b614969565b875460018901549294509092506000916122eb916001600160a01b031690614af2565b604080516101a08101825289546001600160a01b0316815260018a01546020820152908101829052606081018590526080810184905260a08101879052600389015460c0820152600489015460ff16151560e08201526005890154610100820152600689015461012082015260078901546101408201526000610160820181905261018082015290915061237e90614b54565b6002548854604080516340c10f1960e01b81526001600160a01b03928316600482015260248101889052905191909216916340c10f1991604480830192600092919082900301818387803b1580156123d557600080fd5b505af11580156123e9573d6000803e3d6000fd5b5050506001808a01546000908152601c60205260408120439055600b8054880190558a54918a01548a546004808d015460058e01546001600160a01b039687169750939592909216937f4997fc0bb946a4e6e79304b9c968707039bef86d736eec4722b4037643ec7c599388938d9260ff90911691908c908e61246a610ef0565b60408051998a5260208a0198909852888801969096529315156060880152608087019290925260a086015260c085015260e084015261010083015251908190036101200190a4865460018801546124ca916001600160a01b031690614f31565b505050505b50505b505b50600083815260186020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101829055600501555b505050565b6001546001600160a01b0316331461253457600080fd5b600082815260176020908152604080832080546001600160a01b031684526010835281842060018201548552909252822060028201549192916003811061257757fe5b600d0201905081600d015460001415612591575050612792565b60088101541561276f5760006125af8260030154836004015461513d565b905060006125d88360050154868560070160009054906101000a900460ff1686600801546151cc565b905060006125f564e8d4a510006125ef8585615338565b906153e1565b84549091506126bc9083906001600160a01b03166000841215612626576126216121d185600019615338565b612630565b612630868561490f565b6001546040805163c5a1688360e01b815290516000926126b79264e8d4a5100092610f15926001600160a01b03169163c5a16883916004808301926020929190829003018186803b15801561268457600080fd5b505afa158015612698573d6000803e3d6000fd5b505050506040513d60208110156126ae57600080fd5b50518b906147eb565b615499565b600184015484546002860154600787015460088801546001600160a01b03909316927f6ce8945d44159181cfc3762a669007398b2fd9dec15e3f3f2756e5db43f1134092918b9160ff90911690899088612714610ef0565b604080519788526020880196909652931515868601526060860192909252608085015260a084015260c0830152519081900360e00190a383546001850154600286015461276b926001600160a01b031691906157d7565b5050505b8154600183015461278f916000916001600160a01b039091169087615ab5565b50505b5050565b600f6020526000908152604090208054600182015460029092015490916001600160a01b03169083565b6019546000906127d25750600061284f565b6001600160a01b0383166000818152601260209081526040808320868452909152902054601980549192918390811061280757fe5b60009182526020909120600b90910201546001600160a01b031614801561284b5750826019828154811061283757fe5b90600052602060002090600b020160010154145b9150505b92915050565b6000818152601760205260409020600d810154158015906128855750600d81015461288190603261490f565b4310155b6128c7576040805162461bcd60e51b815260206004820152600e60248201526d574149545f35305f424c4f434b5360901b604482015290519081900360640190fd5b80546001600160a01b03163314612916576040805162461bcd60e51b815260206004820152600e60248201526d2727aa2faca7aaa92fa7a92222a960911b604482015290519081900360640190fd5b33600090815260106020908152604080832060018501548452909152812060028301546003811061294357fe5b600d0201905060008083600001600801541190506000808360080154119050600082612973578360030154612979565b60038501545b905082806129845750815b15612a1757826129a357600185015460028601546129a39133916157d7565b600254604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b1580156129f657600080fd5b505af1158015612a0a573d6000803e3d6000fd5b5050600a80548401905550505b612a2a8333876000016001015489615ab5565b6040517ffac3b699d715ff5c4a679632ef0165c940345c58cdc891f65c643528a57143bb90600090a1505050505050565b6018602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909186565b601560209081526000928352604080842090915290825290205481565b60038160058110612ac657fe5b01546001600160a01b0316905081565b323314612ae257600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b031663796d82d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612b3057600080fd5b505afa158015612b44573d6000803e3d6000fd5b505050506040513d6020811015612b5a57600080fd5b5051436000908152601b602052604090205410612bb5576040805162461bcd60e51b81526020600482015260146024820152734d41585f5452414445535f5045525f424c4f434b60601b604482015290519081900360640190fd5b3360008181526011602090815260408083208684528252808320549383526016825280832086845290915290205410612c2f576040805162461bcd60e51b8152602060048201526017602482015276544f4f5f4d414e595f434c4f53455f524551554553545360481b604482015290519081900360640190fd5b33600090815260146020526040902054600511612c88576040805162461bcd60e51b81526020600482015260126024820152714d41585f50454e44494e475f4f524445525360701b604482015290519081900360640190fd5b33600090815260106020908152604080832085845290915281208260038110612cad57fe5b600d02016008015411612cf2576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b6001805460408051635cf4ee9160e01b8152600481018690526024810193909352516000926001600160a01b0390921691635cf4ee9191604480830192602092919082900301818787803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b505050506040513d6020811015612d7357600080fd5b5051336000818152601460209081526040808320805460018181018355918552838520018690559483526017825280832043600d82015580546001600160a01b031916851781558086018990556002019690965591815260168252848120958152949052919092208054909101905550565b601c6020526000908152604090205481565b601660209081526000928352604080842090915290825290205481565b60146020528160005260406000208181548110612e2d57fe5b90600052602060002001600091509150505481565b323314612e4e57600080fd5b33600090815260106020908152604080832086845290915281208360038110612e7357fe5b600d020190506000816008015411612ebd576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b811580612f085750600781015460ff168015612f085750612f05612efa8260080154606402610f15605085600501546147eb90919063ffffffff16565b6005830154906148b2565b82115b80612f525750600781015460ff16158015612f525750612f4f612f448260080154606402610f15605085600501546147eb90919063ffffffff16565b60058301549061490f565b82105b612f90576040805162461bcd60e51b815260206004820152600a602482015269534c5f544f4f5f42494760b01b604482015290519081900360640190fd5b601e612fa982600c0154436148b290919063ffffffff16565b1015612fed576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b600a810182905543600c82015560408051848152600060208201528082018490529051859133917f908a0c7e7b17ef90bcf82c3eb6d116aefc9c1527fe9653587001beb4874493369181900360600190a350505050565b61304e33826127c0565b61308a576040805162461bcd60e51b81526020600482015260086024820152671393d7d31253525560c21b604482015290519081900360640190fd5b33600090815260126020908152604080832084845290915290205460198054601e916130db91849081106130ba57fe5b90600052602060002090600b0201600a0154436148b290919063ffffffff16565b101561311f576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b600254601980546001600160a01b03909216916340c10f199133918590811061314457fe5b90600052602060002090600b0201600201546040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561319c57600080fd5b505af11580156131b0573d6000803e3d6000fd5b50505050601981815481106131c157fe5b600091825260209091206002600b909202010154600a805490910190556131e83383614f31565b604051829033907f79f3edbebc9a6de9a328c00e60f2354f26bac1c27fe608fda2df3a49d9c1988090600090a35050565b600e546001600160a01b0316331461325e576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b600c8054600d805460009384905590839055600254604080516340c10f1960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820186905291519495939491909216926340c10f19926044808201939182900301818387803b1580156132e557600080fd5b505af11580156132f9573d6000803e3d6000fd5b5050600254600e54604080516340c10f1960e01b81526001600160a01b0392831660048201526024810187905290519190921693506340c10f199250604480830192600092919082900301818387803b15801561335557600080fd5b505af1158015613369573d6000803e3d6000fd5b5050600a8054939094019092019092555050565b32331461338957600080fd5b336000908152601060209081526040808320868452909152812083600381106133ae57fe5b600d0201905060008160080154116133f8576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b601e61341182600b0154436148b290919063ffffffff16565b1015613455576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b6009810182905543600b82015560408051848152600160208201528082018490529051859133917f908a0c7e7b17ef90bcf82c3eb6d116aefc9c1527fe9653587001beb4874493369181900360600190a350505050565b601a60205281600052604060002081815481106134c557fe5b6000918252602090912001546001600160a01b03169150829050565b60095481565b3360009081526014602052604090205490565b6001546001600160a01b0316331461351157600080fd5b6000838152601760205260409020600d81015461352e5750612518565b60006135596135526064610f158560000160060154876147eb90919063ffffffff16565b84906148b2565b600783015490915060009060ff1661358d5761358861358164e8d4a51000610f1588866147eb565b86906148b2565b6135aa565b6135aa6135a364e8d4a51000610f1588866147eb565b869061490f565b905060006135d56402540be400606402610f1586600f015487600e01546147eb90919063ffffffff16565b90506000806135ea8660000160030154614969565b6007880154919350915060ff1680156136105750600e86015461360d908461490f565b84115b806136385750600786015460ff161580156136385750600e86015461363590846148b2565b84105b1561371b576002548654604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909216916340c10f1991604480830192600092919082900301818387803b15801561369457600080fd5b505af11580156136a8573d6000803e3d6000fd5b5050600a805485019055505085546001870154600e880154600f8901546040805193845260208401929092528282015260608201879052516001600160a01b03909216917fe070f0177a9a4ef1d0e045638177e84b9e643b2dea722cdd65bd6217b7d16e8e9181900360800190a2613846565b8554600187015460009161373a916001600160a01b0390911690614af2565b604080516101a08101825289546001600160a01b0316815260018a01546020820152908101829052606081018590526080810184905260a08101879052600689015460c0820152600789015460ff16151560e082015260088901546101008201526009890154610120820152600a890154610140820152600061016082018190526101808201529091506137cd90614b54565b60018701548754600789015460088a01546040805186815260ff9093161515602084015282810191909152606082018990526080820187905260a08201869052516001600160a01b03909216917f9e94bdd5d609e3ae9924e86c2457237dc7e9a23c6b3f361523c83935f41445e39181900360c00190a3505b8554600187810154613862926001600160a01b0316908c615ab5565b505050505050505050565b600e546001600160a01b031633146138b2576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6008546001600160a01b03161580156138d357506001600160a01b03811615155b6138dc57600080fd5b600880546001600160a01b0383166001600160a01b031990911681179091556040805160208101929092528082526002828201526106c760f41b606083015251600080516020615d178339815191529181900360800190a150565b601260209081526000928352604080842090915290825290205481565b6001546001600160a01b0316331461396b57600080fd5b6000828152601860205260408120600201546001600160a01b03166139905750612792565b600083815260186020818152604080842060028101546001600160a01b03168552601083528185206003808301548752908452918520888652939092526004909101549081106139dc57fe5b600d0201905060008160080154118015613a8c575060015460408051631f1a496960e31b81529051613a88926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b158015613a3757600080fd5b505afa158015613a4b573d6000803e3d6000fd5b505050506040513d6020811015613a6157600080fd5b50516000868152601860209081526040808320600101548352601c9091529020549061490f565b4310155b156124d457600581015460078201546008830154600092613ab4929091879160ff16906151cc565b90506000613aca8360030154846004015461513d565b6000878152601860205260409020600501549091506001148015613af2575060008360090154115b8015613b025750600783015460ff165b8015613b12575082600901548510155b80613b5e57506000868152601860205260409020600501546001148015613b3d575060008360090154115b8015613b4e5750600783015460ff16155b8015613b5e575082600901548511155b80613ba957506000868152601860205260409020600501546002148015613b895750600083600a0154115b8015613b995750600783015460ff165b8015613ba9575082600a01548511155b80613bf557506000868152601860205260409020600501546002148015613bd45750600083600a0154115b8015613be55750600783015460ff16155b8015613bf5575082600a01548510155b15613c5a57613c576402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663547344646040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b93505b6000868152601860205260409020600501546003148015613c8b5750613c8764d18c2e2800600019615338565b8213155b15613ce957613ce66064610f15600160009054906101000a90046001600160a01b03166001600160a01b0316633562a9b16040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b93505b8315613fc3576000613d0464e8d4a510006125ef8486615338565b8454909150613e459084906001600160a01b03166000841215613d3557613d3061358185600019615338565b613d3f565b613d3f858561490f565b60008b8152601860205260409020600501548990600314613def57613dea6402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663c5a168836040518163ffffffff1660e01b815260040160206040518083038186803b158015613db757600080fd5b505afa158015613dcb573d6000803e3d6000fd5b505050506040513d6020811015613de157600080fd5b50518a906147eb565b6126b7565b6126b76064610f15600160009054906101000a90046001600160a01b03166001600160a01b03166332056b976040518163ffffffff1660e01b815260040160206040518083038186803b158015613db757600080fd5b60008781526018602052604090208054600186015486546002880154600590940154600789015460088a01546001600160a01b03958616969495909316937f4997fc0bb946a4e6e79304b9c968707039bef86d736eec4722b4037643ec7c59939092918d9160ff909116908a8a8f613ebb610ef0565b60408051998a5260208a0198909852888801969096529315156060880152608087019290925260a086015260c085015260e084015261010083015251908190036101200190a4835460018501546002860154613f21926001600160a01b031691906157d7565b6002546000888152601860205260408082205481516340c10f1960e01b81526001600160a01b039182166004820152602481018a905291519316926340c10f199260448084019391929182900301818387803b158015613f8057600080fd5b505af1158015613f94573d6000803e3d6000fd5b5050506000888152601860209081526040808320600101548352601c90915290204390555050600b8054850190555b5050506000928352505060186020526040812080546001600160a01b03199081168255600182018390556002820180549091169055600381018290556004810182905560050155565b32331461401857600080fd5b6001861015801561402a575060048611155b61406e576040805162461bcd60e51b815260206004820152601060248201526f57524f4e475f4f524445525f5459504560801b604482015290519081900360640190fd5b60008111801561407e5750600681105b6140c0576040805162461bcd60e51b815260206004820152600e60248201526d57524f4e475f4e46545f5459504560901b604482015290519081900360640190fd5b600e546001600160a01b031633148061416857503360036000198301600581106140e657fe5b0154604080516331a9108f60e11b81526004810186905290516001600160a01b0390921691636352211e91602480820192602092909190829003018186803b15801561413157600080fd5b505afa158015614145573d6000803e3d6000fd5b505050506040513d602081101561415b57600080fd5b50516001600160a01b0316145b6141a2576040805162461bcd60e51b81526020600482015260066024820152651393d7d3919560d21b604482015290519081900360640190fd5b60015460408051631f1a496960e31b81529051614229926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b1580156141e857600080fd5b505afa1580156141fc573d6000803e3d6000fd5b505050506040513d602081101561421257600080fd5b50516000848152601c60205260409020549061490f565b431015614270576040805162461bcd60e51b815260206004820152601060248201526f535543434553535f54494d454c4f434b60801b604482015290519081900360640190fd5b60015460408051637a5a2d2f60e01b8152905173b0897686c545045afc77cf20ec7a532e3120e0f1926323b872dd9233926001600160a01b03909216918291637a5a2d2f916004808301926020929190829003018186803b1580156142d457600080fd5b505afa1580156142e8573d6000803e3d6000fd5b505050506040513d60208110156142fe57600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526044820152905160648083019260209291908290030181600087803b15801561435657600080fd5b505af115801561436a573d6000803e3d6000fd5b505050506040513d602081101561438057600080fd5b5060009050600487141561445c5761439886866127c0565b6143d4576040805162461bcd60e51b81526020600482015260086024820152671393d7d31253525560c21b604482015290519081900360640190fd5b60015460408051635cf4ee9160e01b8152600481018890526002602482015290516001600160a01b0390921691635cf4ee91916044808201926020929091908290030181600087803b15801561442957600080fd5b505af115801561443d573d6000803e3d6000fd5b505050506040513d602081101561445357600080fd5b5051905061464b565b6001600160a01b03861660009081526010602090815260408083208884529091528120856003811061448a57fe5b600d020160080154116144cf576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b86600114158061451257506001600160a01b03861660009081526010602090815260408083208884529091528120856003811061450857fe5b600d020160090154115b61454b576040805162461bcd60e51b815260206004820152600560248201526404e4f5f54560dc1b604482015290519081900360640190fd5b86600214158061458e57506001600160a01b03861660009081526010602090815260408083208884529091528120856003811061458457fe5b600d0201600a0154115b6145c7576040805162461bcd60e51b81526020600482015260056024820152641393d7d4d360da1b604482015290519081900360640190fd5b60015460408051635cf4ee9160e01b8152600481018890526003602482015290516001600160a01b0390921691635cf4ee91916044808201926020929091908290030181600087803b15801561461c57600080fd5b505af1158015614630573d6000803e3d6000fd5b505050506040513d602081101561464657600080fd5b505190505b60009081526018602052604090208054336001600160a01b031991821617825560018201939093556002810180549093166001600160a01b039690961695909517909155506003830191909155600482015560050155565b6002546001600160a01b031681565b600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561470657600080fd5b505afa15801561471a573d6000803e3d6000fd5b505050506040513d606081101561473057600080fd5b50805160209182015160025460085460408051630dfe168160e01b815290519497509295506001600160a01b0391821694911692630dfe1681926004808201939291829003018186803b15801561478657600080fd5b505afa15801561479a573d6000803e3d6000fd5b505050506040513d60208110156147b057600080fd5b50516001600160a01b031614156147d6576001600160701b0391821693501690506147e7565b6001600160701b0390811693501690505b9091565b6000826147fa5750600061284f565b8282028284828161480757fe5b04146148445760405162461bcd60e51b8152600401808060200182810382526021815260200180615cf66021913960400191505060405180910390fd5b9392505050565b60008082116148a1576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816148aa57fe5b049392505050565b600082821115614909576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015614844576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060006149fe6402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663efb533376040518163ffffffff1660e01b815260040160206040518083038186803b1580156149cb57600080fd5b505afa1580156149df573d6000803e3d6000fd5b505050506040513d60208110156149f557600080fd5b505187906147eb565b90506000614a926402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b0316637dfcb8c76040518163ffffffff1660e01b815260040160206040518083038186803b158015614a5f57600080fd5b505afa158015614a73573d6000803e3d6000fd5b505050506040513d6020811015614a8957600080fd5b505188906147eb565b9050614aa881614aa287856148b2565b906148b2565b9350614ac56402540be400610f15614abe610ef0565b87906147eb565b600d54909350614ad5908361490f565b600d55600c54614ae5908261490f565b600c819055505050915091565b6000805b6003811015614b4d576001600160a01b038416600090815260106020908152604080832086845290915290208160038110614b2d57fe5b600d02016008015460001415614b4557809150614b4d565b600101614af6565b5092915050565b8060e0015115614c1257600081610120015111614b72576000614bb1565b614bb1614ba66402540be400606402610f15846101000151610f158661012001518760a001516147eb90919063ffffffff16565b60a08301519061490f565b610120820152610140810151614bc8576000614c07565b614c07614bfc6402540be400606402610f15846101000151610f158661014001518760a001516147eb90919063ffffffff16565b60a0830151906148b2565b610140820152614cac565b600081610120015111614c26576000614c5a565b614c5a614bfc6402540be400606402610f15846101000151610f158661012001518760a001516147eb90919063ffffffff16565b610120820152610140810151614c71576000614ca5565b614ca5614ba66402540be400606402610f15846101000151610f158661014001518760a001516147eb90919063ffffffff16565b6101408201525b80516001600160a01b03166000908152601060209081526040808320828501518452909152908190209082015182919060038110614ce657fe5b8251600d919091029190910180546001600160a01b0319166001600160a01b039283161781556020808401516001808401919091556040808601516002850155606086015160038501556080860151600485015560a0860151600585015560c0860151600685015560e086015160078501805460ff191691151591909117905561010086015160088501556101208601516009850155610140860151600a850155610160860151600b85015561018090950151600c9093019290925584518316600090815260118083528582208784018051845290845286832080548601905587519095168252825284812093518152929052919020541415614e4f57602081810180516000908152601a80845260408083205486516001600160a01b039081168552601387528285208651865287528285209190915593518352908452812084518154600181018355918352939091200180546001600160a01b031916929091169190911790555b6001546020820151606083015161010084015160408051631aa22acd60e11b8152600481019490945260248401929092526044830152516001600160a01b0390921691633544559a9160648082019260009290919082900301818387803b158015614eb957600080fd5b505af1158015614ecd573d6000803e3d6000fd5b505082516001600160a01b03166000908152600f6020526040902054159150614ef99050576096614efc565b60645b90516001600160a01b03166000908152600f6020908152604080832060ff909416909355438252601b90522080546001019055565b6001600160a01b0382166000908152601260209081526040808320848452909152902054601980546000198101908110614f6757fe5b90600052602060002090600b020160198281548110614f8257fe5b6000918252602082208354600b9092020180546001600160a01b0319166001600160a01b03909216919091178155600180840154908201556002808401549082015560038084015490820155600480840154908201805460ff909216151560ff199092169190911790556005808401549082015560068084015490820155600780840154908201556008808401549082015560098084015490820155600a9283015492019190915560198054839260129290918490811061503f57fe5b60009182526020808320600b909202909101546001600160a01b031683528201929092526040018120601980549192918590811061507957fe5b600091825260208083206001600b90930201919091015483528281019390935260409182018120939093556001600160a01b03861683526012825280832085845290915281205560198054806150cb57fe5b600082815260208120600b6000199093019283020180546001600160a01b031916815560018101829055600281018290556003810182905560048101805460ff191690556005810182905560068101829055600781018290556008810182905560098101829055600a01559055505050565b600061515961514a610ef0565b610f15846402540be4006147eb565b905060006151bd6151b66064610f15600160009054906101000a90046001600160a01b03166001600160a01b0316635faef0066040518163ffffffff1660e01b815260040160206040518083038186803b158015614a5f57600080fd5b859061490f565b9050808211614844578161284b565b6000826151f8576151f3856125ef846151ed64e8d4a50fff19818a86615c4a565b90615338565b615211565b615211856125ef846151ed64e8d4a51000818a86615c4a565b90506152246402540be400606319615338565b81126152305780615241565b6152416402540be400606319615338565b90506152cc6402540be400600160009054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561529a57600080fd5b505afa1580156152ae573d6000803e3d6000fd5b505050506040513d60208110156152c457600080fd5b505190615338565b81136152d8578061532f565b61532f6402540be400600160009054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561529a57600080fd5b95945050505050565b6000826153475750600061284f565b8260001914801561535b5750600160ff1b82145b156153975760405162461bcd60e51b8152600401808060200182810382526027815260200180615d376027913960400191505060405180910390fd5b828202828482816153a457fe5b05146148445760405162461bcd60e51b8152600401808060200182810382526027815260200180615d376027913960400191505060405180910390fd5b600081615435576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b816000191480156154495750600160ff1b83145b156154855760405162461bcd60e51b8152600401808060200182810382526021815260200180615cd56021913960400191505060405180910390fd5b600082848161549057fe5b05949350505050565b6000805460408051633104b73f60e21b81526004810185905290516001600160a01b039092169263c412dcfc9260248084019382900301818387803b1580156154e157600080fd5b505af11580156154f5573d6000803e3d6000fd5b5050505061550c818361490f90919063ffffffff16565b831015801561552a575061552764d18c2e2800600019615338565b85135b156157d05761553d82614aa285846148b2565b6001600160a01b038581166000908152600f602052604090206001015491945016615646576001546040805163846fe25560e01b815290516000926155b69264e8d4a5100092610f15926001600160a01b03169163846fe255916004808301926020929190829003018186803b1580156149cb57600080fd5b6002549091506001600160a01b03166340c10f19866155d587856148b2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561561b57600080fd5b505af115801561562f573d6000803e3d6000fd5b5050600a8054938703909301909255506157d09050565b6001546040805163846fe25560e01b8152905160009261569b926501d1a94a200092610f15926001600160a01b03169163846fe255916004808301926020929190829003018186803b1580156149cb57600080fd5b905060006156a985836148b2565b600254604080516340c10f1960e01b81526001600160a01b038a811660048301526024820185905291519394509116916340c10f199160448082019260009290919082900301818387803b15801561570057600080fd5b505af1158015615714573d6000803e3d6000fd5b50506002546001600160a01b038981166000908152600f60205260408082206001015481516340c10f1960e01b815290841660048201526024810189905290519290931694506340c10f19935060448084019391929182900301818387803b15801561577f57600080fd5b505af1158015615793573d6000803e3d6000fd5b5050506001600160a01b038088166000908152600f60205260408082206001015490921681522060020180549093019092555050600a8054840190555b5050505050565b6001600160a01b03831660009081526010602090815260408083208584529091528120826003811061580557fe5b6001600160a01b03868116600090815260136020908152604080832089845290915280822054600154600d959095029590950160038101546008820154835162b4e89160e21b8152600481018c905260248101929092526044820152915190965093909216926302d3a24492606480820193929182900301818387803b15801561588e57600080fd5b505af11580156158a2573d6000803e3d6000fd5b505050506001600160a01b0385166000908152601160209081526040808320878452909152902054600114156159d5576000848152601a602052604090208054819060001981019081106158f257fe5b9060005260206000200160009054906101000a90046001600160a01b031681838154811061591c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816013600083858154811061595b57fe5b60009182526020808320909101546001600160a01b03908116845283820194909452604092830182208a83528152828220949094559189168252601383528082208883529092529081205580548190806159b157fe5b600082815260209020810160001990810180546001600160a01b0319169055019055505b6001600160a01b038516600090815260106020908152604080832087845290915290208360038110615a0357fe5b600d020180546001600160a01b031916815560006001808301829055600283018290556003830182905560048301829055600583018290556006830182905560078301805460ff191690556008830182905560098301829055600a8301829055600b8301829055600c9092018190556001600160a01b039690961686526011602090815260408088209688529581528587208054600019019055438752601b9052939094208054909301909255505050565b6001600160a01b0383166000908152601460205260408120905b8154811015615bbc5782828281548110615ae557fe5b90600052602060002001541415615bb4578515615b2c576001600160a01b038516600090815260156020908152604080832087845290915290208054600019019055615b58565b6001600160a01b0385166000908152601660209081526040808320878452909152902080546000190190555b815482906000198101908110615b6a57fe5b9060005260206000200154828281548110615b8157fe5b906000526020600020018190555081805480615b9957fe5b60019003818190600052602060002001600090559055615bbc565b600101615acf565b5050600090815260176020526040812080546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006810182905560078101805460ff191690556008810182905560098101829055600a8101829055600b8101829055600c8101829055600d8101829055600e8101829055600f0155505050565b6000818303818312801590615c5f5750838113155b80615c745750600083128015615c7457508381135b6148445760405162461bcd60e51b8152600401808060200182810382526024815260200180615d5e6024913960400191505060405180910390fdfe4e4f5f434f52524553504f4e44494e475f4e46545f5350524541445f524544554354494f4e5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77943e9d45a11aaae5d87503e3bc248665d9807856e5cf2bdb4a988bee444227815369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77a2646970667358221220eaa69de5a7d1367e8078de9fd21c3d22bd29e1d8590bab2970827c5ec47ae6ac64736f6c634300060c0033000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d000000000000000000000000f9a4c522e327935bd1f5a338c121e14e4cc1f89800000000000000000000000077cd42b925e1a82f41d852d6be727cfc88fddbbc0000000000000000000000003378ad81d09de23725ee9b9270635c97ed60192100000000000000000000000002e2c5825c1a3b69c0417706dbe1327c2af3e6c20000000000000000000000002d266a94469d05c9e06d52a4d0d9c23b157767c2

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d000000000000000000000000f9a4c522e327935bd1f5a338c121e14e4cc1f89800000000000000000000000077cd42b925e1a82f41d852d6be727cfc88fddbbc0000000000000000000000003378ad81d09de23725ee9b9270635c97ed60192100000000000000000000000002e2c5825c1a3b69c0417706dbe1327c2af3e6c20000000000000000000000002d266a94469d05c9e06d52a4d0d9c23b157767c2

-----Decoded View---------------
Arg [0] : _gov (address): 0xc66fbe50dd33c9aadd65707f7088d597c86fe00f
Arg [1] : _dev (address): 0xd39a38bd2d2d552f3908ff698a5530aa397fb92d
Arg [2] : _nft (address[5]): 0xf9a4c522e327935bd1f5a338c121e14e4cc1f898,0x77cd42b925e1a82f41d852d6be727cfc88fddbbc,0x3378ad81d09de23725ee9b9270635c97ed601921,0x02e2c5825c1a3b69c0417706dbe1327c2af3e6c2,0x2d266a94469d05c9e06d52a4d0d9c23b157767c2

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f
Arg [1] : 000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d
Arg [2] : 000000000000000000000000f9a4c522e327935bd1f5a338c121e14e4cc1f898
Arg [3] : 00000000000000000000000077cd42b925e1a82f41d852d6be727cfc88fddbbc
Arg [4] : 0000000000000000000000003378ad81d09de23725ee9b9270635c97ed601921
Arg [5] : 00000000000000000000000002e2c5825c1a3b69c0417706dbe1327c2af3e6c2
Arg [6] : 0000000000000000000000002d266a94469d05c9e06d52a4d0d9c23b157767c2


Deployed ByteCode Sourcemap

15077:37284:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15912:19;;;:::i;:::-;;;;;;;;;;;;;;;;17533:64;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17533:64:0;;;;;;;;:::i;51752:606::-;;;;;;;;;;;;;;;;-1:-1:-1;51752:606:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51752:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20888:220;;;;;;;;;;;;;;;;-1:-1:-1;20888:220:0;-1:-1:-1;;;;;20888:220:0;;:::i;:::-;;15194:32;;;:::i;:::-;;;;-1:-1:-1;;;;;15194:32:0;;;;;;;;;;;;;;17445:81;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17445:81:0;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17445:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15233:49;;;:::i;15360:24::-;;;:::i;18176:39::-;;;;;;;;;;;;;;;;-1:-1:-1;18176:39:0;;:::i;:::-;;;;-1:-1:-1;;;;;18176:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15946:19;;;:::i;51514:107::-;;;:::i;16035:32::-;;;:::i;17680:62::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17680:62:0;;;;;;;;:::i;21312:220::-;;;;;;;;;;;;;;;;-1:-1:-1;21312:220:0;-1:-1:-1;;;;;21312:220:0;;:::i;21542:248::-;;;;;;;;;;;;;;;;-1:-1:-1;21542:248:0;-1:-1:-1;;;;;21542:248:0;;:::i;29368:181::-;;;:::i;18329:43::-;;;;;;;;;;;;;;;;-1:-1:-1;18329:43:0;;:::i;15875:22::-;;;:::i;51377:131::-;;;;;;;;;;;;;;;;-1:-1:-1;51377:131:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15836:24;;;:::i;30248:4203::-;;;;;;;;;;;;;;;;-1:-1:-1;30248:4203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30248:4203:0;;:::i;20714:168::-;;;;;;;;;;;;;;;;-1:-1:-1;20714:168:0;-1:-1:-1;;;;;20714:168:0;;:::i;16006:22::-;;;:::i;43793:2867::-;;;;;;;;;;;;;;;;-1:-1:-1;43793:2867:0;;;;;;;;;;;;:::i;40271:1797::-;;;;;;;;;;;;;;;;-1:-1:-1;40271:1797:0;;;;;;;:::i;17397:41::-;;;;;;;;;;;;;;;;-1:-1:-1;17397:41:0;-1:-1:-1;;;;;17397:41:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;17397:41:0;;;;;;;;;;;;;;;;;;;;29822:371;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29822:371:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49961:1078;;;;;;;;;;;;;;;;-1:-1:-1;49961:1078:0;;:::i;18063:61::-;;;;;;;;;;;;;;;;-1:-1:-1;18063:61:0;;:::i;:::-;;;;;-1:-1:-1;;;;;18063:61:0;;;;;;;;;;;-1:-1:-1;;;;;18063:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17805:71;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17805:71:0;;;;;;;;:::i;15325:28::-;;;;;;;;;;;;;;;;-1:-1:-1;15325:28:0;;:::i;39303:960::-;;;;;;;;;;;;;;;;-1:-1:-1;39303:960:0;;;;;;;:::i;18379:43::-;;;;;;;;;;;;;;;;-1:-1:-1;18379:43:0;;:::i;17883:72::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17883:72:0;;;;;;;;:::i;17749:49::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17749:49:0;;;;;;;;:::i;37789:695::-;;;;;;;;;;;;;;;;-1:-1:-1;37789:695:0;;;;;;;;;;;;:::i;36782:557::-;;;;;;;;;;;;;;;;-1:-1:-1;36782:557:0;;:::i;51066:265::-;;;:::i;38790:463::-;;;;;;;;;;;;;;;;-1:-1:-1;38790:463:0;;;;;;;;;;;;:::i;18222:45::-;;;;;;;;;;;;;;;;-1:-1:-1;18222:45:0;;;;;;;:::i;15797:24::-;;;:::i;51627:119::-;;;:::i;34459:2283::-;;;;;;;;;;;;;;;;-1:-1:-1;34459:2283:0;;;;;;;;;;;;:::i;21114:192::-;;;;;;;;;;;;;;;;-1:-1:-1;21114:192:0;-1:-1:-1;;;;;21114:192:0;;:::i;17604:69::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17604:69:0;;;;;;;;:::i;46668:3185::-;;;;;;;;;;;;;;;;-1:-1:-1;46668:3185:0;;;;;;;:::i;42323:1462::-;;;;;;;;;;;;;;;;-1:-1:-1;42323:1462:0;;;-1:-1:-1;;;;;42323:1462:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15289:29::-;;;:::i;15912:19::-;;;;:::o;17533:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;51752:606::-;51824:4;51929:31;;;:24;:31;;;;;51993:7;;;;52015:13;;;;52043:11;;;;52069:14;;;52098:17;;;52130:23;;;;52168:25;;;;52208:24;;;;52247:11;;;;52273:16;;;;52304:10;;;;52329;;;;;51993:7;;52015:13;;52043:11;;-1:-1:-1;;;;;52069:14:0;;;;52098:17;;52130:23;;52168:25;;52208:24;;52247:11;;;;;52273:16;;51752:606::o;20888:220::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;20957:5:::1;::::0;-1:-1:-1;;;;;20957:5:0::1;:28:::0;:52;::::1;;;-1:-1:-1::0;;;;;;20989:20:0;::::1;::::0;::::1;20957:52;20949:61;;;::::0;::::1;;21021:5;:32:::0;;-1:-1:-1;;;;;21021:32:0;::::1;-1:-1:-1::0;;;;;;21021:32:0;;::::1;::::0;::::1;::::0;;;21069:31:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;21069:31:0;;;;;-1:-1:-1;;;;;;;;;;;21069:31:0;;;;;;;::::1;20888:220:::0;:::o;15194:32::-;;;-1:-1:-1;;;;;15194:32:0;;:::o;17445:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17445:81:0;;;;-1:-1:-1;17445:81:0;;-1:-1:-1;17445:81:0;;-1:-1:-1;17445:81:0;;;;;;;;;;;;;;;;;:::o;15233:49::-;;;-1:-1:-1;;;;;15233:49:0;;:::o;15360:24::-;;;-1:-1:-1;;;;;15360:24:0;;:::o;18176:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18176:39:0;;;;-1:-1:-1;18176:39:0;;;;;;;;;;;;;;;;;;;;:::o;15946:19::-;;;;:::o;51514:107::-;51591:15;:22;51514:107;:::o;16035:32::-;;;:::o;17680:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21312:220::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;21408:1:::1;21379:4:::0;-1:-1:-1;;;;;21379:4:0::1;:31:::0;:54;::::1;;;-1:-1:-1::0;;;;;;21414:19:0;::::1;::::0;::::1;21379:54;21371:63;;;::::0;::::1;;21445:4;:34:::0;;-1:-1:-1;;;;;21445:34:0;::::1;-1:-1:-1::0;;;;;;21445:34:0;;::::1;::::0;::::1;::::0;;;21495:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;21495:29:0;;;;;-1:-1:-1;;;;;;;;;;;21495:29:0;;;;;;;::::1;21312:220:::0;:::o;21542:248::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21626:25:0;::::1;21618:34;;;::::0;::::1;;21663:15;:57:::0;;-1:-1:-1;;;;;21663:57:0;::::1;-1:-1:-1::0;;;;;;21663:57:0;;::::1;::::0;::::1;::::0;;;21736:46:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;21736:46:0;;;;;-1:-1:-1;;;;;;;;;;;21736:46:0;;;;;;;::::1;21542:248:::0;:::o;29368:181::-;29413:4;29430:17;29449:15;29468:12;:10;:12::i;:::-;29429:51;;-1:-1:-1;29429:51:0;-1:-1:-1;29498:43:0;29429:51;29498:25;29429:51;15542:4;29498:14;:25::i;:::-;:29;;:43::i;:::-;29491:50;;;;29368:181;:::o;18329:43::-;;;;;;;;;;;;;:::o;15875:22::-;;;;:::o;51377:131::-;51477:23;;;;:11;:23;;;;;;;;;51470:30;;;;;;;;;;;;;;;;;51442:16;;51470:30;;;51477:23;51470:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51470:30:0;;;;;;;;;;;;;;;;;;;;;;;51377:131;;;:::o;15836:24::-;;;;:::o;30248:4203::-;29656:9;29669:10;29656:23;29648:32;;;;;;30700:20:::1;30765:22;:34;30788:10;-1:-1:-1::0;;;;;30765:34:0::1;-1:-1:-1::0;;;;;30765:34:0::1;;;;;;;;;;;;:46;30800:10;30765:46;;;;;;;;;;;;30723:15;:27;30739:10;-1:-1:-1::0;;;;;30723:27:0::1;-1:-1:-1::0;;;;;30723:27:0::1;;;;;;;;;;;;:39;30751:10;30723:39;;;;;;;;;;;;:88;30700:111;;30840:41;30858:10;30870;30840:17;:41::i;:::-;:81;;30906:15;30840:81;;;30884:15;30902:1;30884:19;30840:81;30822:99;;30973:15;;;;;;;;;-1:-1:-1::0;;;;;30973:15:0::1;-1:-1:-1::0;;;;;30973:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30973:35:0;30957:12:::1;30942:28;::::0;;;:14:::1;30973:35;30942:28:::0;;;;;:66:::1;30934:99;;;::::0;;-1:-1:-1;;;30934:99:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30934:99:0;;;;;;;;;;;;;::::1;;31053:15;;;;;;;;;-1:-1:-1::0;;;;;31053:15:0::1;-1:-1:-1::0;;;;;31053:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31053:26:0;31052:27:::1;31044:46;;;::::0;;-1:-1:-1;;;31044:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31044:46:0;;;;;;;;;;;;;::::1;;31109:15;::::0;:71:::1;::::0;;-1:-1:-1;;;31109:71:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31109:15:0;;::::1;::::0;:28:::1;::::0;:71;;;;;::::1;::::0;;;;;;;;;:15;:71;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31109:71:0;31101:101:::1;;;::::0;;-1:-1:-1;;;31101:101:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31101:101:0;;;;;;;;;;;;;::::1;;15678:1;31221:15;:37;31213:69;;;::::0;;-1:-1:-1;;;31213:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31213:69:0;;;;;;;;;;;;;::::1;;31317:10;31301:27;::::0;;;:15:::1;:27;::::0;;;;:34;15721:1:::1;-1:-1:-1::0;31293:86:0::1;;;::::0;;-1:-1:-1;;;31293:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31293:86:0;;;;;;;;;;;;;::::1;;31391:17;31414:12;:10;:12::i;:::-;31390:36;;;31467:68;31519:15;:13;:15::i;:::-;31467:47;15542:4;31499;:14;31467:15;;;;;;;;;-1:-1:-1::0;;;;;31467:15:0::1;-1:-1:-1::0;;;;;31467:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31467:27:0;;:31:::1;:47::i;:68::-;31445:18;:90;;:196;;;;;31574:67;15542:4;31627:3;:13;31574:48;31591:15;;;;;;;;;-1:-1:-1::0;;;;;31591:15:0::1;-1:-1:-1::0;;;;;31591:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31591:30:0;31574:12;;:16:::1;:48::i;:67::-;31552:18;:89;;31445:196;31437:231;;;::::0;;-1:-1:-1;;;31437:231:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31437:231:0;;;;;;;;;;;;;::::1;;31700:1;31687:9;:14;;:34;;;;;31718:3;31705:9;:16;;31687:34;31679:61;;;::::0;;-1:-1:-1;;;31679:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31679:61:0;;;;;;;;;;;;;::::1;;31772:2;31759:9;:15;;:68;;;-1:-1:-1::0;31799:10:0::1;31791:19;::::0;;;:7:::1;:19;::::0;;;;:36;31778:49;::::1;;31759:68;31751:102;;;::::0;;-1:-1:-1;;;31751:102:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31751:102:0;;;;;;;;;;;;;::::1;;31872:23:::0;;;:79:::1;;;31950:1;31899:3;31922:1;31903:18;:20;31899:25;;;;;;;;::::0;:47:::1;::::0;;-1:-1:-1;;;31899:47:0;;31935:10:::1;31899:47;::::0;::::1;::::0;;;-1:-1:-1;;;;;31899:25:0;;::::1;::::0;:35:::1;::::0;:47;;;;;::::1;::::0;;;;;;;;;:25;:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31899:47:0;:52:::1;;31872:79;31864:142;;;;-1:-1:-1::0;;;31864:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32032:18:::0;32025:25;::::1;32017:46;;;::::0;;-1:-1:-1;;;32017:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32017:46:0;;;;;;;;;;;;;::::1;;32080:6;32076:2080;;32102:10;32115:15;;;;;;;;;-1:-1:-1::0;;;;;32115:15:0::1;-1:-1:-1::0;;;;;32115:24:0::1;;32140:10;32152:1;32115:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;32102:52;;32169:15;:27;32185:10;-1:-1:-1::0;;;;;32169:27:0::1;-1:-1:-1::0;;;;;32169:27:0::1;;;;;;;;;;;;32202:5;32169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32265:12;32225:24;:31;32250:5;32225:31;;;;;;;;;;;:37;;:52;;;;32338:6;32292:24;:31;32317:5;32292:31;;;;;;;;;;;:43;;:52;;;;32403:10;32359:24;:31;32384:5;32359:31;;;;;;;;;;;:41;;:54;;;;32475:10;32428:24;:31;32453:5;32428:31;;;;;;;;;;;:37;;:44;;;:57;;;;;-1:-1:-1::0;;;;;32428:57:0::1;;;;;-1:-1:-1::0;;;;;32428:57:0::1;;;;;;32550:10;32500:24;:31;32525:5;32500:31;;;;;;;;;;;:37;;:47;;:60;;;;32619:4;32575:24;:31;32600:5;32575:31;;;;;;;;;;;:37;;:41;;;:48;;;;;;;;;;;;;;;;;;32687:9;32638:24;:31;32663:5;32638:31;;;;;;;;;;;:37;;:46;;:58;;;;32754:4;32711:24;:31;32736:5;32711:31;;;;;;;;;;;:37;;:40;;:47;;;;32834:4;32791:24;:31;32816:5;32791:31;;;;;;;;;;;:37;;:40;;:47;;;;32963:1;32942:18;:22;:84;;33025:1;32942:84;;;32967:15;::::0;:55:::1;::::0;;-1:-1:-1;;;32967:55:0;;-1:-1:-1;;33001:20:0;;32967:55:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;32967:15:0;;::::1;::::0;:33:::1;::::0;:55;;;;;::::1;::::0;;;;;;;;;:15;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32967:55:0;32942:84:::1;32871:24;:31;32896:5;32871:31;;;;;;;;;;;:37;;:54;;:155;;;;33101:18;33043:24;:31;33068:5;33043:31;;;;;;;;;;;:37;;:55;;:76;;;;33136:22;:34;33159:10;-1:-1:-1::0;;;;;33136:34:0::1;-1:-1:-1::0;;;;;33136:34:0::1;;;;;;;;;;;;:46;33171:10;33136:46;;;;;;;;;;;;:48;;;;;;;;;;;;;32076:2080;;;;33224:41;33242:10;33254;33224:17;:41::i;:::-;33223:42;33215:73;;;::::0;;-1:-1:-1;;;33215:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33215:73:0;;;;;;;;;;;;;::::1;;33325:15;;;;;;;;;-1:-1:-1::0;;;;;33325:15:0::1;-1:-1:-1::0;;;;;33325:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33325:40:0;33311:54;::::1;;33303:85;;;::::0;;-1:-1:-1;;;33303:85:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33303:85:0;;;;;;;;;;;;;::::1;;33405:15;33426:567;;;;;;;;33459:10;-1:-1:-1::0;;;;;33426:567:0::1;;;;;33488:10;33426:567;;;;33517:18;33426:567;;;;33575:1;33554:18;:22;:84;;33637:1;33554:84;;;33579:15;::::0;:55:::1;::::0;;-1:-1:-1;;;33579:55:0;;-1:-1:-1;;33613:20:0;;33579:55:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;33579:15:0;;::::1;::::0;:33:::1;::::0;:55;;;;;::::1;::::0;;;;;;;;;:15;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33579:55:0;33554:84:::1;33426:567;;;;33657:4;33426:567;;;;;;33680:9;33426:567;;;;33708:4;33426:567;;;;33749:4;33426:567;;;;33790:4;:69;;33853:6;33790:69;;;33797:53;33808:41;33835:13:::0;33808:22:::1;:6:::0;33819:10;33808::::1;:22::i;:41::-;33797:6:::0;;:10:::1;:53::i;:::-;33426:567;;;;33878:4;:69;;33894:53;33905:41;33932:13:::0;33905:22:::1;:6:::0;33916:10;33905::::1;:22::i;:41::-;33894:6:::0;;:10:::1;:53::i;:::-;33878:69;;;33885:6;33878:69;33426:567;;;;33966:12;33426:567;;::::0;33405:589:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;33405:589:0::1;;;;;-1:-1:-1::0;;;;;33405:589:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34081:1;34058:15;:22;;;;:24;34011:20;:32;34032:10;-1:-1:-1::0;;;;;34011:32:0::1;-1:-1:-1::0;;;;;34011:32:0::1;;;;;;;;;;;;:44;34044:10;34011:44;;;;;;;;;;;:71;;;;34133:10;34121;-1:-1:-1::0;;;;;34104:40:0::1;;;;;;;;;;;32076:2080;34168:5;::::0;:42:::1;::::0;;-1:-1:-1;;;34168:42:0;;34179:10:::1;34168:42;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;34168:5:0;;::::1;::::0;:10:::1;::::0;:42;;;;;:5:::1;::::0;:42;;;;;;;;:5;;:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34221:12:0::1;:34:::0;;;::::1;::::0;;-1:-1:-1;;;;;;;34271:23:0;::::1;::::0;;::::1;::::0;:69:::1;;-1:-1:-1::0;34306:10:0::1;34338:1;34298:19:::0;;;:7:::1;:19;::::0;;;;:28:::1;;::::0;-1:-1:-1;;;;;34298:28:0::1;:42:::0;34271:69:::1;:105;;;;-1:-1:-1::0;;;;;;34353:23:0;::::1;34366:10;34353:23;;34271:105;34268:176;;;34400:10;34392:19;::::0;;;:7:::1;:19;::::0;;;;:28:::1;;:40:::0;;-1:-1:-1;;;;;;34392:40:0::1;-1:-1:-1::0;;;;;34392:40:0;::::1;;::::0;;34268:176:::1;29691:1;;30248:4203:::0;;;;;;;;;;;:::o;20714:168::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20783:18:0;::::1;20775:27;;;::::0;::::1;;20813:7;:14:::0;;-1:-1:-1;;;;;20813:14:0;::::1;-1:-1:-1::0;;;;;;20813:14:0;;::::1;::::0;::::1;::::0;;;20843:31:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;20843:31:0;;;;;-1:-1:-1;;;;;;;;;;;20843:31:0;;;;;;;::::1;20714:168:::0;:::o;16006:22::-;;;-1:-1:-1;;;;;16006:22:0;;:::o;43793:2867::-;29777:15;;-1:-1:-1;;;;;29777:15:0;29755:10;:38;29747:47;;;;;;43944:32:::1;43979:29:::0;;;:21:::1;:29;::::0;;;;44022:15:::1;::::0;::::1;::::0;-1:-1:-1;;;;;44022:15:0::1;44019:44;;44054:7;;;44019:44;44096:15;::::0;::::1;::::0;44113:18:::1;::::0;::::1;::::0;44078:54:::1;::::0;-1:-1:-1;;;;;44096:15:0::1;::::0;44078:17:::1;:54::i;:::-;:85;;;;;44137:15;;;;;;;;;-1:-1:-1::0;;;;;44137:15:0::1;-1:-1:-1::0;;;;;44137:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44137:26:0;44136:27:::1;44078:85;:186;;;;-1:-1:-1::0;44227:15:0::1;::::0;:36:::1;::::0;;-1:-1:-1;;;44227:36:0;;;;44192:72:::1;::::0;-1:-1:-1;;;;;44227:15:0::1;::::0;:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44227:36:0;44207:14:::1;::::0;::::1;::::0;44192:30:::1;::::0;;;:14:::1;44227:36;44192:30:::0;;;;;;:34:::1;:72::i;:::-;44176:12;:88;;44078:186;44075:2531;;;44344:15;::::0;::::1;::::0;-1:-1:-1;;;;;44344:15:0::1;44280:24;44323:37:::0;;;:20:::1;:37;::::0;;;;;;;44361:18:::1;::::0;::::1;::::0;44323:57;;;;;;;;44307:15:::1;:74:::0;;:15;;44323:57;44307:74;::::1;;;;;;::::0;;;::::1;::::0;;;;44401:15:::1;::::0;44430:18:::1;::::0;::::1;::::0;44450:19:::1;44307:74;::::0;;::::1;::::0;;::::1;44450:19:::0;;::::1;::::0;44471:10:::1;::::0;::::1;::::0;44401:81:::1;::::0;;-1:-1:-1;;;44401:81:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;44307:74;;-1:-1:-1;;;;;;44401:15:0::1;::::0;:28:::1;::::0;:81;;;;;;;;;;:15;:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44401:81:0;44398:2197:::1;;;44502:17;44522:55;44535:41;44572:3;44535:32;44548:1;:18;;;44535:8;:12;;:32;;;;:::i;:41::-;44522:8:::0;;:12:::1;:55::i;:::-;44613:5;::::0;::::1;::::0;44502:75;;-1:-1:-1;44596:14:0::1;::::0;44613:5:::1;;:163;;44721:55;44732:43;44761:13:::0;44732:24:::1;:6:::0;44743:12;44732:10:::1;:24::i;:43::-;44721:6:::0;;:10:::1;:55::i;:::-;44613:163;;;44622:55;44633:43;44662:13:::0;44633:24:::1;:6:::0;44644:12;44633:10:::1;:24::i;:43::-;44622:6:::0;;:10:::1;:55::i;:::-;44596:180;;44813:1;:10;;;44800:9;:23;;:50;;;;;44840:1;:10;;;44827:9;:23;;44800:50;44797:1783;;;44920:15;::::0;:35:::1;::::0;;-1:-1:-1;;;44920:35:0;;;;44874:19:::1;::::0;44896:79:::1;::::0;44961:13;;44896:60:::1;::::0;-1:-1:-1;;;;;44920:15:0::1;::::0;:33:::1;::::0;:35:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44920:35:0;44896:19:::1;::::0;::::1;::::0;;:23:::1;:60::i;:79::-;44874:101;;44999:32;45033:30:::0;45067:55:::1;45082:39;45106:14;45082:1;:19;;;:23;;:39;;;;:::i;:::-;45067:14;:55::i;:::-;45194:8:::0;;;45204:11;::::1;::::0;44998:124;;-1:-1:-1;44998:124:0;;-1:-1:-1;45145:20:0::1;::::0;45168:48:::1;::::0;-1:-1:-1;;;;;45194:8:0::1;::::0;45168:25:::1;:48::i;:::-;45255:517;::::0;;::::1;::::0;::::1;::::0;;45287:8;;-1:-1:-1;;;;;45287:8:0::1;45255:517:::0;;45287:8;45322:11;::::1;::::0;45255:517:::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;45544:18:::1;::::0;::::1;::::0;45255:517;;;;45589:5:::1;::::0;::::1;::::0;::::1;;45255:517;;::::0;;;;45621:10:::1;::::0;::::1;::::0;45287:8:::1;45255:517:::0;;;45658:4:::1;::::0;::::1;::::0;45255:517;;;;45689:4:::1;::::0;::::1;::::0;45255:517;;;;-1:-1:-1;45255:517:0;;;;;;;;;;45145:71;;-1:-1:-1;45241:532:0::1;::::0;:13:::1;:532::i;:::-;45798:5;::::0;45809:18;;45798:46:::1;::::0;;-1:-1:-1;;;45798:46:0;;-1:-1:-1;;;;;45809:18:0;;::::1;45798:46;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:10:::1;::::0;:46;;;;;:5:::1;::::0;:46;;;;;;;:5;;:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;45882:14:0::1;::::0;;::::1;::::0;45867:30:::1;::::0;;;:14:::1;:30;::::0;;;;45900:12:::1;45867:45:::0;;45935:10:::1;:28:::0;;;::::1;::::0;;46153:18;;46073:11;;::::1;::::0;46038:8;;46198:1:::1;46262:5:::0;;::::1;::::0;46294:10:::1;::::0;::::1;::::0;-1:-1:-1;;;;;46153:18:0;;::::1;::::0;-1:-1:-1;46073:11:0;;46038:8;;;::::1;::::0;45993:499:::1;::::0;46111:15;;46226:9;;46262:5:::1;::::0;;::::1;::::0;46294:10;46331:27;;45949:14;46454:15:::1;:13;:15::i;:::-;45993:499;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;46538:8:::0;;;46548:11;::::1;::::0;46517:43:::1;::::0;-1:-1:-1;;;;;46538:8:0::1;::::0;46517:20:::1;:43::i;:::-;44797:1783;;;;;44398:2197;;;44075:2531;;-1:-1:-1::0;46623:29:0::1;::::0;;;:21:::1;:29;::::0;;;;46616:36;;-1:-1:-1;;;;;;46616:36:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;29805:1:::1;43793:2867:::0;;;:::o;40271:1797::-;29777:15;;-1:-1:-1;;;;;29777:15:0;29755:10;:38;29747:47;;;;;;40399:28:::1;40430:32:::0;;;:24:::1;:32;::::0;;;;;;;40513:14;;-1:-1:-1;;;;;40513:14:0::1;40502:26:::0;;:10:::1;:26:::0;;;;;40513:14;40529:17;::::1;::::0;40502:45;;;;;;;40548:23:::1;::::0;::::1;::::0;40430:32;;40399:28;40502:70:::1;::::0;::::1;;;;;;;;40473:99;;40588:1;:7;;;40599:1;40588:12;40585:27;;;40603:7;;;;40585:27;40627:21;::::0;::::1;::::0;:25;40624:1338:::1;;40668:13;40684:128;40720:12;:30;;;40769:12;:28;;;40684:17;:128::i;:::-;40668:144;;40829:17;40849:176;40888:12;:22;;;40929:6;40954:12;:16;;;;;;;;;;;;40989:12;:21;;;40849:20;:176::i;:::-;40829:196:::0;-1:-1:-1;41042:7:0::1;41052:56;41093:13:::0;41052:32:::1;41056:8:::0;40829:196;41052:17:::1;:32::i;:::-;:36:::0;::::1;:56::i;:::-;41192:19:::0;;41042:66;;-1:-1:-1;41125:289:0::1;::::0;41160:13;;-1:-1:-1;;;;;41192:19:0::1;;41230:8:::0;::::1;;:68;;41267:31;41285:11;:3:::0;-1:-1:-1;;41285:7:0::1;:11::i;41267:31::-;41230:68;;;41241:23;:8:::0;41259:3;41241:12:::1;:23::i;:::-;41350:15;::::0;:29:::1;::::0;;-1:-1:-1;;;41350:29:0;;;;41317:1:::1;::::0;41337:62:::1;::::0;41385:13;;41337:43:::1;::::0;-1:-1:-1;;;;;41350:15:0::1;::::0;:27:::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41350:29:0;41337:8;;:12:::1;:43::i;:62::-;41125:16;:289::i;:::-;41510:22;::::0;::::1;::::0;41472:19;;41551:28:::1;::::0;::::1;::::0;41623:16:::1;::::0;::::1;::::0;41685:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;41472:19:0;;::::1;::::0;41436:341:::1;::::0;41551:28;41598:6;;41623:16:::1;::::0;;::::1;::::0;41658:8;;41725:3;41747:15:::1;:13;:15::i;:::-;41436:341;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;41828:19:::0;;;41866:22;::::1;::::0;41907:28:::1;::::0;::::1;::::0;41794:156:::1;::::0;-1:-1:-1;;;;;41828:19:0::1;::::0;41866:22;41794:15:::1;:156::i;:::-;40624:1338;;;;42018:14:::0;;;42034:17;::::1;::::0;41982:78:::1;::::0;42011:5:::1;::::0;-1:-1:-1;;;;;42018:14:0;;::::1;::::0;42053:6;41982:28:::1;:78::i;:::-;29805:1;;;40271:1797:::0;;:::o;17397:41::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17397:41:0;;;:::o;29822:371::-;29922:15;:22;29903:4;;29919:48;;-1:-1:-1;29959:5:0;29952:12;;29919:48;-1:-1:-1;;;;;30001:29:0;;29979:19;30001:29;;;:20;:29;;;;;;;;:41;;;;;;;;;30060:15;:31;;30001:41;;:29;:41;;30060:31;;;;;;;;;;;;;;;;;;;:38;-1:-1:-1;;;;;30060:38:0;:49;:125;;;;;30175:10;30130:15;30146:14;30130:31;;;;;;;;;;;;;;;;;;:41;;;:55;30060:125;30053:132;;;29822:371;;;;;:::o;49961:1078::-;50028:28;50059:32;;;:24;:32;;;;;50110:7;;;;:11;;;;:46;;-1:-1:-1;50141:7:0;;;;:15;;50153:2;50141:11;:15::i;:::-;50125:12;:31;;50110:46;50102:73;;;;;-1:-1:-1;;;50102:73:0;;;;;;;;;;;;-1:-1:-1;;;50102:73:0;;;;;;;;;;;;;;;50194:14;;-1:-1:-1;;;;;50194:14:0;50212:10;50194:28;50186:55;;;;;-1:-1:-1;;;50186:55:0;;;;;;;;;;;;-1:-1:-1;;;50186:55:0;;;;;;;;;;;;;;;50283:10;50254:15;50272:22;;;:10;:22;;;;;;;;50295:17;;;;50272:41;;;;;;;50314:23;;;;50272:66;;;;;;;;;;50254:84;;50349:14;50385:1;50366;:7;;:16;;;:20;50349:37;;50397:14;50427:1;50414;:10;;;:14;50397:31;;50439:13;50455:9;:59;;50495:1;:19;;;50455:59;;;50467:25;;;;50455:59;50439:75;;50561:9;:22;;;;50574:9;50561:22;50558:340;;;50603:9;50599:202;;50703:17;;;;50743:23;;;;50632:153;;50670:10;;50632:15;:153::i;:::-;50815:5;;:32;;;-1:-1:-1;;;50815:32:0;;50826:10;50815:32;;;;;;;;;;;;-1:-1:-1;;;;;50815:5:0;;;;:10;;:32;;;;;:5;;:32;;;;;;;;:5;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50862:12:0;:24;;;;;;-1:-1:-1;;50558:340:0;50910:78;50939:9;50950:10;50962:1;:7;;:17;;;50981:6;50910:28;:78::i;:::-;51006:25;;;;;;;49961:1078;;;;;;:::o;18063:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18063:61:0;;;;;;;;;;;;;:::o;17805:71::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;15325:28::-;;;;;;;;;;;;-1:-1:-1;;;;;15325:28:0;;-1:-1:-1;15325:28:0;:::o;39303:960::-;29656:9;29669:10;29656:23;29648:32;;;;;;39439:15:::1;;;;;;;;;-1:-1:-1::0;;;;;39439:15:0::1;-1:-1:-1::0;;;;;39439:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39439:35:0;39423:12:::1;39408:28;::::0;;;:14:::1;39439:35;39408:28:::0;;;;;:66:::1;39400:99;;;::::0;;-1:-1:-1;;;39400:99:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39400:99:0;;;;;;;;;;;;;::::1;;39584:10;39568:27;::::0;;;:15:::1;:27;::::0;;;;;;;:39;;;;;;;;;39518:35;;;:23:::1;:35:::0;;;;;:47;;;;;;;;;:89:::1;39510:134;;;::::0;;-1:-1:-1;;;39510:134:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39510:134:0;;;;;;;;;;;;;::::1;;39679:10;39663:27;::::0;;;:15:::1;:27;::::0;;;;:34;15721:1:::1;-1:-1:-1::0;39655:86:0::1;;;::::0;;-1:-1:-1;;;39655:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39655:86:0;;;;;;;;;;;;;::::1;;39771:10;39824:1;39760:22:::0;;;:10:::1;:22;::::0;;;;;;;:34;;;;;;;;39795:16;39760:52:::1;::::0;::::1;;;;;;;;:61;;;:65;39752:86;;;::::0;;-1:-1:-1;;;39752:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39752:86:0;;;;;;;;;;;;;::::1;;39864:15;::::0;;:39:::1;::::0;;-1:-1:-1;;;39864:39:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;39851:10:::1;::::0;-1:-1:-1;;;;;39864:15:0;;::::1;::::0;:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;39851:10;39864:15;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39864:39:0;39930:10:::1;39914:27;::::0;;;:15:::1;39864:39;39914:27:::0;;;;;;;:39;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;39997:31;;;:24:::1;:31:::0;;;;;40049:12:::1;40039:7;::::0;::::1;:22:::0;40072:27;;-1:-1:-1;;;;;;40072:27:0::1;::::0;::::1;::::0;;40110:17;;::::1;:30:::0;;;40151:23:::1;;:42:::0;;;;40206:35;;;:23:::1;:35:::0;;;;;:47;;;;;;;;;;:49;;;;::::1;::::0;;-1:-1:-1;39303:960:0:o;18379:43::-;;;;;;;;;;;;;:::o;17883:72::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;17749:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37789:695::-;29656:9;29669:10;29656:23;29648:32;;;;;;37920:10:::1;37891:15;37909:22:::0;;;:10:::1;:22;::::0;;;;;;;:34;;;;;;;;37944:16;37909:52:::1;::::0;::::1;;;;;;;;37891:70;;37993:1;37980;:10;;;:14;37972:35;;;::::0;;-1:-1:-1;;;37972:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37972:35:0;;;;;;;;;;;;;::::1;;38026:11:::0;;;:95:::1;;-1:-1:-1::0;38041:5:0::1;::::0;::::1;::::0;::::1;;:80:::0;::::1;;;;38059:62;38075:45;38109:1;:10;;;38105:3;:14;38075:25;15625:2;38075:1;:11;;;:15;;:25;;;;:::i;:45::-;38059:11;::::0;::::1;::::0;;:15:::1;:62::i;:::-;38050:6;:71;38041:80;38026:197;;;-1:-1:-1::0;38143:5:0::1;::::0;::::1;::::0;::::1;;38142:6;:81:::0;::::1;;;;38161:62;38177:45;38211:1;:10;;;38207:3;:14;38177:25;15625:2;38177:1;:11;;;:15;;:25;;;;:::i;:45::-;38161:11;::::0;::::1;::::0;;:15:::1;:62::i;:::-;38152:6;:71;38142:81;38018:220;;;::::0;;-1:-1:-1;;;38018:220:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38018:220:0;;;;;;;;;;;;;::::1;;15760:2;38257:33;38274:1;:15;;;38257:12;:16;;:33;;;;:::i;:::-;:51;;38249:78;;;::::0;;-1:-1:-1;;;38249:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38249:78:0;;;;;;;;;;;;;::::1;;38338:4;::::0;::::1;:13:::0;;;38380:12:::1;38362:15;::::0;::::1;:30:::0;38408:68:::1;::::0;;;;;-1:-1:-1;38408:68:0::1;::::0;::::1;::::0;;;;;;;;;38432:10;;38420::::1;::::0;38408:68:::1;::::0;;;;;;;::::1;29691:1;37789:695:::0;;;:::o;36782:557::-;36856:41;36874:10;36886;36856:17;:41::i;:::-;36848:62;;;;;-1:-1:-1;;;36848:62:0;;;;;;;;;;;;-1:-1:-1;;;36848:62:0;;;;;;;;;;;;;;;36954:10;36923:7;36933:32;;;:20;:32;;;;;;;;:44;;;;;;;;;37013:15;:19;;15760:2;;36996:43;;36933:44;;37013:19;;;;;;;;;;;;;;;;:25;;;36996:12;:16;;:43;;;;:::i;:::-;:61;;36988:88;;;;;-1:-1:-1;;;36988:88:0;;;;;;;;;;;;-1:-1:-1;;;36988:88:0;;;;;;;;;;;;;;;37089:5;;37112:15;:19;;-1:-1:-1;;;;;37089:5:0;;;;:10;;37100;;37128:2;;37112:19;;;;;;;;;;;;;;;;:37;;;37089:61;;;;;;;;;;;;;-1:-1:-1;;;;;37089:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37177:15;37193:2;37177:19;;;;;;;;;;;;;;;;:37;:19;;;;;:37;;37161:12;:53;;;;;;;37227:44;37248:10;37260;37227:20;:44::i;:::-;37289:42;;37320:10;;37308;;37289:42;;;;;36782:557;;:::o;51066:265::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;51127:7:::1;::::0;;51158::::1;::::0;;51114:10:::1;51176:11:::0;;;;51198;;;;51220:5:::1;::::0;:26:::1;::::0;;-1:-1:-1;;;51220:26:0;;-1:-1:-1;;;;;51231:7:0::1;51220:26:::0;::::1;;::::0;::::1;::::0;;;;;;;;;51127:7;;51158;;51220:5;;;::::1;::::0;:10:::1;::::0;:26;;;;;;;;;;;51114:10;51220:5;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51257:5:0::1;::::0;51268:7:::1;::::0;51257:26:::1;::::0;;-1:-1:-1;;;51257:26:0;;-1:-1:-1;;;;;51268:7:0;;::::1;51257:26;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;-1:-1:-1;51257:10:0::1;::::0;-1:-1:-1;51257:26:0;;;;;:5:::1;::::0;:26;;;;;;;:5;;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51294:12:0::1;:29:::0;;51310:13;;;::::1;51294:29:::0;;::::1;::::0;;;-1:-1:-1;;51066:265:0:o;38790:463::-;29656:9;29669:10;29656:23;29648:32;;;;;;38921:10:::1;38892:15;38910:22:::0;;;:10:::1;:22;::::0;;;;;;;:34;;;;;;;;38945:16;38910:52:::1;::::0;::::1;;;;;;;;38892:70;;38994:1;38981;:10;;;:14;38973:35;;;::::0;;-1:-1:-1;;;38973:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38973:35:0;;;;;;;;;;;;;::::1;;15760:2;39027:33;39044:1;:15;;;39027:12;:16;;:33;;;;:::i;:::-;:51;;39019:78;;;::::0;;-1:-1:-1;;;39019:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39019:78:0;;;;;;;;;;;;;::::1;;39108:4;::::0;::::1;:13:::0;;;39150:12:::1;39132:15;::::0;::::1;:30:::0;39178:67:::1;::::0;;;;;39232:4:::1;39178:67;::::0;::::1;::::0;;;;;;;;;39202:10;;39190::::1;::::0;39178:67:::1;::::0;;;;;;;::::1;29691:1;38790:463:::0;;;:::o;18222:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18222:45:0;;-1:-1:-1;18222:45:0;;-1:-1:-1;18222:45:0:o;15797:24::-;;;;:::o;51627:119::-;51720:10;51681:4;51704:27;;;:15;:27;;;;;:34;51627:119;:::o;34459:2283::-;29777:15;;-1:-1:-1;;;;;29777:15:0;29755:10;:38;29747:47;;;;;;34610:28:::1;34641:32:::0;;;:24:::1;:32;::::0;;;;34687:7:::1;::::0;::::1;::::0;34684:27:::1;;34702:7;;;34684:27;34723:17;34743:61;34756:47;34799:3;34756:38;34769:1;:7;;:24;;;34756:8;:12;;:38;;;;:::i;:47::-;34743:8:::0;;:12:::1;:61::i;:::-;34834:11;::::0;::::1;::::0;34723:81;;-1:-1:-1;34817:14:0::1;::::0;34834:11:::1;;:170;;34949:55;34960:43;34989:13:::0;34960:24:::1;:6:::0;34971:12;34960:10:::1;:24::i;:43::-;34949:6:::0;;:10:::1;:55::i;:::-;34834:170;;;34848:55;34859:43;34888:13:::0;34859:24:::1;:6:::0;34870:12;34859:10:::1;:24::i;:43::-;34848:6:::0;;:10:::1;:55::i;:::-;34817:187;;35017:16;35036:49;15542:4;35071:3;:13;35036:30;35054:1;:11;;;35036:1;:13;;;:17;;:30;;;;:::i;:49::-;35017:68;;35099:32;35133:30:::0;35167:41:::1;35182:1;:7;;:25;;;35167:14;:41::i;:::-;35224:11;::::0;::::1;::::0;35098:110;;-1:-1:-1;35098:110:0;-1:-1:-1;35224:11:0::1;;:57:::0;::::1;;;-1:-1:-1::0;35251:13:0::1;::::0;::::1;::::0;:30:::1;::::0;35269:11;35251:17:::1;:30::i;:::-;35239:9;:42;35224:57;:128;;;-1:-1:-1::0;35295:11:0::1;::::0;::::1;::::0;::::1;;35294:12;:58:::0;::::1;;;-1:-1:-1::0;35322:13:0::1;::::0;::::1;::::0;:30:::1;::::0;35340:11;35322:17:::1;:30::i;:::-;35310:9;:42;35294:58;35221:1424;;;35370:5;::::0;35381:14;;35370:55:::1;::::0;;-1:-1:-1;;;35370:55:0;;-1:-1:-1;;;;;35381:14:0;;::::1;35370:55;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:10:::1;::::0;:55;;;;;:5:::1;::::0;:55;;;;;;;:5;;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35440:12:0::1;:43:::0;;;::::1;::::0;;-1:-1:-1;;35543:14:0;;-1:-1:-1;35576:17:0;::::1;::::0;35612:13:::1;::::0;::::1;::::0;35644:11:::1;::::0;::::1;::::0;35505:193:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35543:14:0;;::::1;::::0;35505:193:::1;::::0;;;;;;;::::1;35221:1424;;;35780:14:::0;;;35796:17;::::1;::::0;35731:20:::1;::::0;35754:60:::1;::::0;-1:-1:-1;;;;;35780:14:0;;::::1;::::0;35754:25:::1;:60::i;:::-;35845:447;::::0;;::::1;::::0;::::1;::::0;;35869:14;;-1:-1:-1;;;;;35869:14:0::1;35845:447:::0;;35869:14;35902:17;::::1;::::0;35845:447:::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;36090:24:::1;::::0;::::1;::::0;35845:447;;;;36133:11:::1;::::0;::::1;::::0;::::1;;35845:447;;::::0;;;;36163:16:::1;::::0;::::1;::::0;35869:14:::1;35845:447:::0;;;36198:10:::1;::::0;::::1;::::0;35845:447;;;;36227:10:::1;::::0;::::1;::::0;35845:447;;;;-1:-1:-1;35845:447:0;;;;;;;;;;35731:83;;-1:-1:-1;35831:462:0::1;::::0;:13:::1;:462::i;:::-;36384:17;::::0;::::1;::::0;36351:14;;36454:11:::1;::::0;::::1;::::0;36484:16:::1;::::0;::::1;::::0;36315:318:::1;::::0;;;;;36454:11:::1;::::0;;::::1;36315:318;;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36351:14:0;;::::1;::::0;36315:318:::1;::::0;;;;;;;::::1;35221:1424;;36692:14:::0;;36686:4:::1;36708:17:::0;;::::1;::::0;36657:77:::1;::::0;-1:-1:-1;;;;;36692:14:0::1;::::0;36727:6;36657:28:::1;:77::i;:::-;29805:1;;;;;;34459:2283:::0;;;:::o;21114:192::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;21177:2:::1;::::0;-1:-1:-1;;;;;21177:2:0::1;:23:::0;:44;::::1;;;-1:-1:-1::0;;;;;;21204:17:0;::::1;::::0;::::1;21177:44;21169:53;;;::::0;::::1;;21233:2;:24:::0;;-1:-1:-1;;;;;21233:24:0;::::1;-1:-1:-1::0;;;;;;21233:24:0;;::::1;::::0;::::1;::::0;;;21273:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;21273:25:0;;;;;-1:-1:-1;;;;;;;;;;;21273:25:0;;;;;;;::::1;21114:192:::0;:::o;17604:69::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;46668:3185::-;29777:15;;-1:-1:-1;;;;;29777:15:0;29755:10;:38;29747:47;;;;;;46800:19:::1;46833:29:::0;;;:21:::1;:29;::::0;;;;:36:::1;;::::0;-1:-1:-1;;;;;46833:36:0::1;46830:65;;46886:7;;;46830:65;46907:15;46936:29:::0;;;:21:::1;:29;::::0;;;;;;;:36:::1;::::0;::::1;::::0;-1:-1:-1;;;;;46936:36:0::1;46925:48:::0;;:10:::1;:48:::0;;;;;46974:39:::1;::::0;;::::1;::::0;46925:89;;;;;;;;47015:29;;;;;;;:45:::1;::::0;;::::1;::::0;;46925:136;::::1;;;;;;;;46907:154;;47090:1;47077;:10;;;:14;:127;;;;-1:-1:-1::0;47167:15:0::1;::::0;:36:::1;::::0;;-1:-1:-1;;;47167:36:0;;;;47111:93:::1;::::0;-1:-1:-1;;;;;47167:15:0::1;::::0;:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47167:36:0;47111:51:::1;47126:29:::0;;;:21:::1;47167:36;47126:29:::0;;;;;;;:35:::1;;::::0;47111:51;;:14:::1;:51:::0;;;;;;;:55:::1;:93::i;:::-;47095:12;:109;;47077:127;47074:2723;;;47280:11;::::0;::::1;::::0;47335:5:::1;::::0;::::1;::::0;47359:10:::1;::::0;::::1;::::0;47221:17:::1;::::0;47241:143:::1;::::0;47280:11;;47310:6;;47335:5:::1;;::::0;47241:20:::1;:143::i;:::-;47221:163;;47401:13;47417:57;47435:1;:19;;;47456:1;:17;;;47417;:57::i;:::-;47520:29;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;47401:73;;-1:-1:-1;47563:1:0::1;47520:44;:56:::0;::::1;;;;47575:1;47568;:4;;;:8;47520:56;:65;;;;-1:-1:-1::0;47580:5:0::1;::::0;::::1;::::0;::::1;;47520:65;:83;;;;;47599:1;:4;;;47589:6;:14;;47520:83;47519:188;;;-1:-1:-1::0;47622:29:0::1;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;47665:1:::1;47622:44;:56:::0;::::1;;;;47677:1;47670;:4;;;:8;47622:56;:66;;;;-1:-1:-1::0;47683:5:0::1;::::0;::::1;::::0;::::1;;47682:6;47622:66;:84;;;;;47702:1;:4;;;47692:6;:14;;47622:84;47519:290;;;-1:-1:-1::0;47725:29:0::1;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;47768:1:::1;47725:44;:56:::0;::::1;;;;47780:1;47773;:4;;;:8;47725:56;:65;;;;-1:-1:-1::0;47785:5:0::1;::::0;::::1;::::0;::::1;;47725:65;:83;;;;;47804:1;:4;;;47794:6;:14;;47725:83;47519:393;;;-1:-1:-1::0;47827:29:0::1;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;47870:1:::1;47827:44;:56:::0;::::1;;;;47882:1;47875;:4;;;:8;47827:56;:66;;;;-1:-1:-1::0;47888:5:0::1;::::0;::::1;::::0;::::1;;47887:6;47827:66;:84;;;;;47907:1;:4;;;47897:6;:14;;47827:84;47516:516;;;47948:68;15542:4;48002:3;:13;47948:49;47961:15;;;;;;;;;-1:-1:-1::0;;;;;47961:15:0::1;-1:-1:-1::0;;;;;47961:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;47948:68;47931:85;;47516:516;48091:29;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;48134:1:::1;48091:44;:101:::0;::::1;;;-1:-1:-1::0;48156:36:0::1;48160:23:::0;-1:-1:-1;;48156:32:0::1;:36::i;:::-;48139:13;:53;;48091:101;48088:208;;;48229:51;48276:3;48229:42;48242:15;;;;;;;;;-1:-1:-1::0;;;;;48242:15:0::1;-1:-1:-1::0;;;;;48242:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;48229:51;48212:68;;48088:208;48315:18:::0;;48312:1474:::1;;48353:7;48363:56;48404:13:::0;48363:32:::1;48367:8:::0;48381:13;48363:17:::1;:32::i;:56::-;48515:8:::0;;48353:66;;-1:-1:-1;48440:436:0::1;::::0;48479:13;;-1:-1:-1;;;;;48515:8:0::1;;48546::::0;::::1;;:68;;48583:31;48601:11;:3:::0;-1:-1:-1;;48601:7:0::1;:11::i;48583:31::-;48546:68;;;48557:23;:8:::0;48575:3;48557:12:::1;:23::i;:::-;48674:29;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;48637:14;;48717:1:::1;48674:44;:183;;48795:62;15542:4;48843:3;:13;48795:43;48808:15;;;;;;;;;-1:-1:-1::0;;;;;48808:15:0::1;-1:-1:-1::0;;;;;48808:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48808:29:0;48795:8;;:12:::1;:43::i;:62::-;48674:183;;;48721:50;48767:3;48721:41;48734:15;;;;;;;;;-1:-1:-1::0;;;;;48734:15:0::1;-1:-1:-1::0;;;;;48734:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;48440:436;49048:29;::::0;;;:21:::1;:29;::::0;;;;:39;;;48974:11;::::1;::::0;48943:8;;49008:17:::1;::::0;::::1;::::0;49110:39:::1;::::0;;::::1;::::0;49201:5:::1;::::0;::::1;::::0;49229:10:::1;::::0;::::1;::::0;-1:-1:-1;;;;;49048:39:0;;::::1;::::0;48974:11;;48943:8;;::::1;::::0;48902:488:::1;::::0;49008:17;;49110:39;49172:6;;49201:5:::1;::::0;;::::1;::::0;49262:8;49293:3;49319:14;49356:15:::1;:13;:15::i;:::-;48902:488;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;49449:8:::0;;;49480:11;::::1;::::0;49514:17:::1;::::0;::::1;::::0;49411:139:::1;::::0;-1:-1:-1;;;;;49449:8:0::1;::::0;49480:11;49411:15:::1;:139::i;:::-;49571:5;::::0;::::1;49582:29:::0;;;:21:::1;:29;::::0;;;;;:39;49571:67;;-1:-1:-1;;;49571:67:0;;-1:-1:-1;;;;;49582:39:0;;::::1;49571:67;::::0;::::1;::::0;;;;;;;;;:5;::::1;::::0;:10:::1;::::0;:67;;;;;:5;;:67;;;;;;:5;;:67;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;49657:51:0::1;49672:29:::0;;;:21:::1;:29;::::0;;;;;;;:35:::1;;::::0;49657:51;;:14:::1;:51:::0;;;;;49711:12:::1;49657:66:::0;;-1:-1:-1;;49742:10:0::1;:28:::0;;;::::1;::::0;;48312:1474:::1;-1:-1:-1::0;;;49816:29:0::1;::::0;;;-1:-1:-1;;49816:21:0::1;:29;::::0;;;;49809:36;;-1:-1:-1;;;;;;49809:36:0;;::::1;::::0;;-1:-1:-1;49809:36:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;46668:3185::o;42323:1462::-;29656:9;29669:10;29656:23;29648:32;;;;;;42498:1:::1;42484:10;:15;;:34;;;;;42517:1;42503:10;:15;;42484:34;42476:63;;;::::0;;-1:-1:-1;;;42476:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42476:63:0;;;;;;;;;;;;;::::1;;42569:1;42558:8;:12;:28;;;;;42585:1;42574:8;:12;42558:28;42550:55;;;::::0;;-1:-1:-1;;;42550:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42550:55:0;;;;;;;;;;;;;::::1;;42638:7;::::0;-1:-1:-1;;;;;42638:7:0::1;42624:10;:21;::::0;:70:::1;;-1:-1:-1::0;42684:10:0::1;42649:3;-1:-1:-1::0;;42653:10:0;;42649:15:::1;::::0;::::1;;;;;;::::0;:31:::1;::::0;;-1:-1:-1;;;42649:31:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;42649:15:0;;::::1;::::0;:23:::1;::::0;:31;;;;;::::1;::::0;;;;;;;;;:15;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42649:31:0;-1:-1:-1;;;;;42649:45:0::1;;42624:70;42616:89;;;::::0;;-1:-1:-1;;;42616:89:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42616:89:0;;;;;;;;;;;;;::::1;;42767:15;::::0;:36:::1;::::0;;-1:-1:-1;;;42767:36:0;;;;42740:64:::1;::::0;-1:-1:-1;;;;;42767:15:0::1;::::0;:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42767:36:0;42740:22:::1;::::0;;;:14:::1;42767:36;42740:22:::0;;;;;;:26:::1;:64::i;:::-;42724:12;:80;;42716:109;;;::::0;;-1:-1:-1;;;42716:109:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42716:109:0;;;;;;;;;;;;;::::1;;42881:15;::::0;42899:28:::1;::::0;;-1:-1:-1;;;42899:28:0;;;;15446:42:::1;::::0;42838:22:::1;::::0;42861:10:::1;::::0;-1:-1:-1;;;;;42881:15:0;;::::1;::::0;;;42899:26:::1;::::0;:28:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;42881:15;42899:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42899:28:0;42838:90:::1;::::0;;-1:-1:-1;;;;;;42838:90:0::1;::::0;;;;;;-1:-1:-1;;;;;42838:90:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;;;42899:28:::1;::::0;42838:90;;;;;;;-1:-1:-1;42838:90:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42939:10:0::1;::::0;-1:-1:-1;42979:1:0::1;42965:15:::0;::::1;42962:539;;;43004:33;43022:2;43026:10;43004:17;:33::i;:::-;42996:54;;;::::0;;-1:-1:-1;;;42996:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42996:54:0;;;;;;;;;;;;;::::1;;43073:15;::::0;:39:::1;::::0;;-1:-1:-1;;;43073:39:0;;::::1;::::0;::::1;::::0;;;43110:1:::1;43073:39:::0;;;;;;-1:-1:-1;;;;;43073:15:0;;::::1;::::0;:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:15:::1;::::0;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43073:39:0;;-1:-1:-1;42962:539:0::1;;;-1:-1:-1::0;;;;;43151:14:0;::::1;43207:1;43151:14:::0;;;:10:::1;:14;::::0;;;;;;;:26;;;;;;;;43178:16;43151:44:::1;::::0;::::1;;;;;;;;:53;;;:57;43143:78;;;::::0;;-1:-1:-1;;;43143:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43143:78:0;;;;;;;;;;;;;::::1;;43244:10;43258:1;43244:15;;:70;;;-1:-1:-1::0;;;;;;43263:14:0;::::1;43313:1;43263:14:::0;;;:10:::1;:14;::::0;;;;;;;:26;;;;;;;;43290:16;43263:44:::1;::::0;::::1;;;;;;;;:47;;;:51;43244:70;43236:88;;;::::0;;-1:-1:-1;;;43236:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43236:88:0;;;;;;;;;;;;;::::1;;43347:10;43361:1;43347:15;;:70;;;-1:-1:-1::0;;;;;;43366:14:0;::::1;43416:1;43366:14:::0;;;:10:::1;:14;::::0;;;;;;;:26;;;;;;;;43393:16;43366:44:::1;::::0;::::1;;;;;;;;:47;;;:51;43347:70;43339:88;;;::::0;;-1:-1:-1;;;43339:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43339:88:0;;;;;;;;;;;;;::::1;;43450:15;::::0;:39:::1;::::0;;-1:-1:-1;;;43450:39:0;;::::1;::::0;::::1;::::0;;;43487:1:::1;43450:39:::0;;;;;;-1:-1:-1;;;;;43450:15:0;;::::1;::::0;:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:15:::1;::::0;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43450:39:0;;-1:-1:-1;42962:539:0::1;43513:25;43541:28:::0;;;:21:::1;:28;::::0;;;;43580:24;;43594:10:::1;-1:-1:-1::0;;;;;;43580:24:0;;::::1;;::::0;;-1:-1:-1;43615:7:0;::::1;:17:::0;;;;43644:8:::1;::::0;::::1;:14:::0;;;;::::1;-1:-1:-1::0;;;;;43644:14:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;43670:11:0::1;::::0;::::1;:25:::0;;;;43706:17:::1;::::0;::::1;:36:::0;43753:11:::1;;:24:::0;42323:1462::o;15289:29::-;;;-1:-1:-1;;;;;15289:29:0;;:::o;29026:291::-;29069:4;29075;29092:17;29111;29134:2;;;;;;;;;-1:-1:-1;;;;;29134:2:0;-1:-1:-1;;;;;29134:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29134:16:0;;;;;;;29187:5;;29164:2;;29134:16;29164:11;;-1:-1:-1;;;29164:11:0;;;;29134:16;;-1:-1:-1;29134:16:0;;-1:-1:-1;;;;;;29187:5:0;;;;29164:2;;;:9;;:11;;;;;29134:16;29164:11;;;;;;:2;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29164:11:0;-1:-1:-1;;;;;29164:29:0;;29161:149;;;-1:-1:-1;;;;;29209:29:0;;;;-1:-1:-1;29209:29:0;;-1:-1:-1;29209:29:0;;29161:149;-1:-1:-1;;;;;29269:29:0;;;;-1:-1:-1;29269:29:0;;-1:-1:-1;29026:291:0;;;:::o;6254:220::-;6312:7;6336:6;6332:20;;-1:-1:-1;6351:1:0;6344:8;;6332:20;6375:5;;;6379:1;6375;:5;:1;6399:5;;;;;:10;6391:56;;;;-1:-1:-1;;;6391:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6465:1;6254:220;-1:-1:-1;;;6254:220:0:o;6952:153::-;7010:7;7042:1;7038;:5;7030:44;;;;;-1:-1:-1;;;7030:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7096:1;7092;:5;;;;;;;6952:153;-1:-1:-1;;;6952:153:0:o;5837:158::-;5895:7;5928:1;5923;:6;;5915:49;;;;;-1:-1:-1;;;5915:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5982:5:0;;;5837:158::o;5375:179::-;5433:7;5465:5;;;5489:6;;;;5481:46;;;;;-1:-1:-1;;;5481:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;23449:552;23514:23;23539:21;23572:11;23586:72;15542:4;23644:3;:13;23586:53;23609:15;;;;;;;;;-1:-1:-1;;;;;23609:15:0;-1:-1:-1;;;;;23609:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23609:29:0;23586:18;;:22;:53::i;:72::-;23572:86;;23669:11;23683:72;15542:4;23741:3;:13;23683:53;23706:15;;;;;;;;;-1:-1:-1;;;;;23706:15:0;-1:-1:-1;;;;;23706:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23706:29:0;23683:18;;:22;:53::i;:72::-;23669:86;-1:-1:-1;23787:42:0;23669:86;23787:30;:18;23810:6;23787:22;:30::i;:::-;:34;;:42::i;:::-;23766:63;;23859:54;15542:4;23859:39;23882:15;:13;:15::i;:::-;23859:18;;:22;:39::i;:54::-;23934:7;;23840:73;;-1:-1:-1;23934:19:0;;23946:6;23934:11;:19::i;:::-;23924:7;:29;23974:7;;:19;;23986:6;23974:11;:19::i;:::-;23964:7;:29;;;;23449:552;;;;;:::o;23073:306::-;23161:10;;23183:189;15678:1;23199;:23;23183:189;;;-1:-1:-1;;;;;23246:18:0;;;;;;:10;:18;;;;;;;;:29;;;;;;;;23276:1;23246:32;;;;;;;;;;:41;;;23291:1;23246:46;23243:118;;;23320:1;23312:9;;23340:5;;23243:118;23224:3;;23183:189;;;;23073:306;;;;:::o;24041:1282::-;24105:5;:9;;;24102:577;;;24152:1;24141:5;:8;;;:12;:108;;24248:1;24141:108;;;24156:89;24176:68;15542:4;24240:3;24230:13;24176:49;24210:5;:14;;;24176:29;24196:5;:8;;;24176:5;:15;;;:19;;:29;;;;:::i;:68::-;24156:15;;;;;:19;:89::i;:::-;24130:8;;;:119;24275:8;;;;:108;;24382:1;24275:108;;;24290:89;24310:68;15542:4;24374:3;24364:13;24310:49;24344:5;:14;;;24310:29;24330:5;:8;;;24310:5;:15;;;:19;;:29;;;;:::i;:68::-;24290:15;;;;;:19;:89::i;:::-;24264:8;;;:119;24102:577;;;24436:1;24425:5;:8;;;:12;:108;;24532:1;24425:108;;;24440:89;24460:68;15542:4;24524:3;24514:13;24460:49;24494:5;:14;;;24460:29;24480:5;:8;;;24460:5;:15;;;:19;;:29;;;;:::i;24440:89::-;24414:8;;;:119;24559:8;;;;:108;;24666:1;24559:108;;;24574:89;24594:68;15542:4;24658:3;24648:13;24594:49;24628:5;:14;;;24594:29;24614:5;:8;;;24594:5;:15;;;:19;;:29;;;;:::i;24574:89::-;24548:8;;;:119;24102:577;24702:12;;-1:-1:-1;;;;;24691:24:0;;;;;:10;:24;;;;;;;;24716:15;;;;24691:41;;;;;;;;;24733:21;;;;24758:5;;24691:41;:64;;;;;;;:72;;:64;;;;;;;;;:72;;-1:-1:-1;;;;;;24691:72:0;-1:-1:-1;;;;;24691:72:0;;;;;;;;;;;-1:-1:-1;24691:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24691:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24790:12;;24774:29;;-1:-1:-1;24774:29:0;;;:15;:29;;;;;;24804:15;;;;;24774:46;;;;;;;;:48;;;;;;24854:12;;24838:29;;;;;;;;;;24868:15;;24838:46;;;;;;;;;:51;24835:226;;;24964:15;;;;;;24952:28;;;;:11;:28;;;;;;;:35;24919:12;;-1:-1:-1;;;;;24905:27:0;;;;;:13;:27;;;;;24933:15;;24905:44;;;;;;;:82;;;;25014:15;;25002:28;;;;;;;25036:12;;25002:47;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25002:47:0;;;;;;;;;;;24835:226;25073:15;;25110;;;;25127:23;;;;25073:15;25152:14;;;25073:94;;;-1:-1:-1;;;25073:94:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25073:15:0;;;;:36;;:94;;;;;:15;;:94;;;;;;;;:15;;:94;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25227:12:0;;-1:-1:-1;;;;;25219:21:0;;;;;:7;:21;;;;;:38;:43;;-1:-1:-1;25219:55:0;;-1:-1:-1;25219:55:0;25271:3;25219:55;;;25265:3;25219:55;25186:12;;-1:-1:-1;;;;;25178:21:0;;;;;:7;:21;;;;;;;;:96;;;;;;;25300:12;25285:28;;:14;:28;;;:30;;;;;;24041:1282::o;27129:500::-;-1:-1:-1;;;;;27299:29:0;;27289:7;27299:29;;;:20;:29;;;;;;;;:41;;;;;;;;;27373:15;27389:22;;-1:-1:-1;;27389:24:0;;;27373:41;;;;;;;;;;;;;;;;27351:15;27367:2;27351:19;;;;;;;;;;;;;;;:63;;:19;;;;;:63;;-1:-1:-1;;;;;;27351:63:0;-1:-1:-1;;;;;27351:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27351:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27446:15;:19;;27507:2;;27425:20;;27351:19;;27507:2;;27446:19;;;;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;;;27446:26:0;27425:48;;;;;;;;;;;;27474:15;:19;;27425:48;;27446:19;27490:2;;27474:19;;;;;;;;;;;;;;:29;:19;;;;;:29;;;;;27425:79;;;;;;;;;;;;;;;:84;;;;-1:-1:-1;;;;;27548:29:0;;;;:20;:29;;;;;:41;;;;;;;;27541:48;27600:15;:21;;;;;;;;;;;;;;;-1:-1:-1;;27600:21:0;;;;;;;;;-1:-1:-1;;;;;;27600:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27600:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27129:500:0:o;22536:452::-;22638:20;22688:42;22714:15;:13;:15::i;:::-;22688:21;:6;15542:4;22688:10;:21::i;:42::-;22670:60;;22788:14;22805:89;22825:68;22889:3;22825:59;22845:15;;;;;;;;;-1:-1:-1;;;;;22845:15:0;-1:-1:-1;;;;;22845:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22825:68;22805:15;;:19;:89::i;:::-;22788:106;;22941:9;22923:15;:27;:57;;22965:15;22923:57;;21890:610;22038:5;22061:3;:227;;22185:103;22277:9;22185:83;22258:8;22185:64;-1:-1:-1;;22185:64:0;22190:12;22277:9;22186:21;:37::i;:::-;22185:43;;:64::i;:103::-;22061:227;;;22067:102;22158:9;22067:82;22139:8;22067:63;22111:18;22067:63;22072:12;22158:9;22068:21;:37::i;22067:102::-;22057:231;-1:-1:-1;22309:24:0;15542:4;-1:-1:-1;;22309:18:0;:24::i;:::-;22305:1;:28;:59;;22363:1;22305:59;;;22336:24;15542:4;-1:-1:-1;;22336:18:0;:24::i;:::-;22301:63;;22383:51;15542:4;22387:15;;;;;;;;;-1:-1:-1;;;;;22387:15:0;-1:-1:-1;;;;;22387:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22387:26:0;;22383:35;:51::i;:::-;22379:1;:55;:113;;22491:1;22379:113;;;22437:51;15542:4;22441:15;;;;;;;;;-1:-1:-1;;;;;22441:15:0;-1:-1:-1;;;;;22441:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22437:51;22375:117;21890:610;-1:-1:-1;;;;;21890:610:0:o;10579:568::-;10635:6;10879;10875:47;;-1:-1:-1;10909:1:0;10902:8;;10875:47;10944:1;-1:-1:-1;;10944:7:0;:27;;;;;-1:-1:-1;;;10955:1:0;:16;10944:27;10942:30;10934:82;;;;-1:-1:-1;;;10934:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11040:5;;;11044:1;11040;:5;:1;11064:5;;;;;:10;11056:62;;;;-1:-1:-1;;;11056:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11621:271;11677:6;11704;11696:51;;;;;-1:-1:-1;;;11696:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11768:1;-1:-1:-1;;11768:7:0;:27;;;;;-1:-1:-1;;;11779:1:0;:16;11768:27;11766:30;11758:76;;;;-1:-1:-1;;;11758:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11847:8;11862:1;11858;:5;;;;;;;11621:271;-1:-1:-1;;;;11621:271:0:o;27721:1266::-;27907:4;;;:35;;;-1:-1:-1;;;27907:35:0;;;;;;;;;;-1:-1:-1;;;;;27907:4:0;;;;:27;;:35;;;;;;;;;;:4;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27973:27;27993:6;27973:15;:19;;:27;;;;:::i;:::-;27958:11;:42;;:108;;;;-1:-1:-1;28030:36:0;28034:23;-1:-1:-1;;28030:32:0;:36::i;:::-;28013:14;:53;27958:108;27955:1025;;;28096:44;28124:15;28096:23;:11;28112:6;28096:15;:23::i;:44::-;-1:-1:-1;;;;;28160:16:0;;;28197:1;28160:16;;;:7;:16;;;;;:25;;;28082:58;;-1:-1:-1;28160:25:0;28157:812;;28255:15;;:27;;;-1:-1:-1;;;28255:27:0;;;;28219:17;;28239:63;;28288:13;;28239:44;;-1:-1:-1;;;;;28255:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;28239:63;28323:5;;28219:83;;-1:-1:-1;;;;;;28323:5:0;:10;28334:7;28343:29;:11;28219:83;28343:15;:29::i;:::-;28323:50;;;;;;;;;;;;;-1:-1:-1;;;;;28323:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28392:12:0;:42;;28408:26;;;28392:42;;;;;;-1:-1:-1;28157:812:0;;-1:-1:-1;28157:812:0;;28511:15;;:27;;;-1:-1:-1;;;28511:27:0;;;;28473:19;;28495:63;;28544:13;;28495:44;;-1:-1:-1;;;;;28511:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;28495:63;28473:85;-1:-1:-1;28577:15:0;28595:31;:11;28473:85;28595:15;:31::i;:::-;28647:5;;:31;;;-1:-1:-1;;;28647:31:0;;-1:-1:-1;;;;;28647:31:0;;;;;;;;;;;;;;;28577:49;;-1:-1:-1;28647:5:0;;;:10;;:31;;;;;:5;;:31;;;;;;;;:5;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28697:5:0;;-1:-1:-1;;;;;28708:16:0;;;28697:5;28708:16;;;:7;:16;;;;;;28697:5;28708:25;;28697:53;;-1:-1:-1;;;28697:53:0;;28708:25;;;28697:53;;;;;;;;;;;;:5;;;;;-1:-1:-1;28697:10:0;;-1:-1:-1;28697:53:0;;;;;:5;;:53;;;;;;:5;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;28809:16:0;;;28771:27;28809:16;;;28801:7;28809:16;;;;;;:25;;;;;;28801:34;;;28854:33;;:51;;;;;;;;-1:-1:-1;;28926:12:0;:27;;;;;;28157:812;27721:1266;;;;;:::o;25379:990::-;-1:-1:-1;;;;;25522:18:0;;25504:15;25522:18;;;:10;:18;;;;;;;;:29;;;;;;;;25552:15;25522:46;;;;;;;-1:-1:-1;;;;;25601:21:0;;;25579:19;25601:21;;;:13;:21;;;;;;;;:32;;;;;;;;;;25679:15;;25522:46;;;;;;;;;25727:19;;;;25748:10;;;;25679:80;;-1:-1:-1;;;25679:80:0;;;;;;;;;;;;;;;;;;;;;25522:46;;-1:-1:-1;25679:15:0;;;;;:36;;:80;;;;;25579:19;25679:80;;;;;;25579:19;25679:15;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;25817:23:0;;;;;;:15;:23;;;;;;;;:34;;;;;;;;;25855:1;25817:39;25814:313;;;25872:19;25894:22;;;:11;:22;;;;;25953:8;;25894:22;;-1:-1:-1;;25953:10:0;;;25951:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25951:13:0;25931:1;25933:14;25931:17;;;;;;;;;;;;;;;;:33;;;;;-1:-1:-1;;;;;25931:33:0;;;;;-1:-1:-1;;;;;25931:33:0;;;;;;26025:14;25979:13;:32;25993:1;25995:14;25993:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25993:17:0;;;25979:32;;;;;;;;;;;;;;;:43;;;;;;;;:60;;;;26061:21;;;;;:13;:21;;;;;:32;;;;;;;;;26054:39;26108:7;;:1;;:7;;;;;;;;;;;;;;-1:-1:-1;;26108:7:0;;;;;-1:-1:-1;;;;;;26108:7:0;;;;;;-1:-1:-1;25814:313:0;-1:-1:-1;;;;;26225:18:0;;;;;;:10;:18;;;;;;;;:29;;;;;;;;26255:15;26225:46;;;;;;;;;;26218:53;;-1:-1:-1;;;;;;26218:53:0;;;26225:46;26218:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26218:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26282:23:0;;;;;;:15;:23;;;;;;;;:34;;;;;;;;;:36;;-1:-1:-1;;26282:36:0;;;26346:12;26331:28;;:14;:28;;;;;;:30;;;;;;;;-1:-1:-1;;;25379:990:0:o;26417:673::-;-1:-1:-1;;;;;26558:24:0;;26532:23;26558:24;;;:15;:24;;;;;;26593:438;26613:15;;26609:19;;26593:438;;;26667:6;26652:8;26661:1;26652:11;;;;;;;;;;;;;;;;:21;26649:371;;;26696:5;26693:191;;;-1:-1:-1;;;;;26726:31:0;;;;;;:22;:31;;;;;;;;:43;;;;;;;;:45;;-1:-1:-1;;26726:45:0;;;26693:191;;;-1:-1:-1;;;;;26818:32:0;;;;;;:23;:32;;;;;;;;:44;;;;;;;;:46;;-1:-1:-1;;26818:46:0;;;26693:191;26927:15;;26918:8;;-1:-1:-1;;26927:17:0;;;26918:27;;;;;;;;;;;;;;26904:8;26913:1;26904:11;;;;;;;;;;;;;;;:41;;;;26964:8;:14;;;;;;;;;;;;;;;;;;;;;;;;26999:5;;26649:371;26630:3;;26593:438;;;-1:-1:-1;;27050:32:0;;;;:24;:32;;;;;27043:39;;-1:-1:-1;;;;;;27043:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27043:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26417:673:0:o;12143:218::-;12199:6;12229:5;;;12254:6;;;;;;:16;;;12269:1;12264;:6;;12254:16;12253:38;;;;12280:1;12276;:5;:14;;;;;12289:1;12285;:5;12276:14;12245:87;;;;-1:-1:-1;;;12245:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://eaa69de5a7d1367e8078de9fd21c3d22bd29e1d8590bab2970827c5ec47ae6ac
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.