Latest 25 from a total of 65,239 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Create Increase ... | 4087089 | 637 days ago | IN | 0.00003 ETH | 0.00000448 | ||||
| Create Decrease ... | 3438762 | 660 days ago | IN | 0.00003 ETH | 0.00000254 | ||||
| Create Increase ... | 3406920 | 661 days ago | IN | 0.00003 ETH | 0.00000697 | ||||
| Create Increase ... | 3391147 | 662 days ago | IN | 0.00003 ETH | 0.00001227 | ||||
| Create Increase ... | 3383474 | 662 days ago | IN | 0.00003 ETH | 0.00000401 | ||||
| Create Increase ... | 3372992 | 662 days ago | IN | 0.00003 ETH | 0.00000811 | ||||
| Create Increase ... | 3370805 | 662 days ago | IN | 0.0003 ETH | 0.00004315 | ||||
| Create Decrease ... | 3369315 | 662 days ago | IN | 0.0003 ETH | 0.00005783 | ||||
| Create Increase ... | 3369300 | 662 days ago | IN | 0.0003 ETH | 0.00006064 | ||||
| Create Decrease ... | 3369239 | 662 days ago | IN | 0.0003 ETH | 0.00005305 | ||||
| Create Increase ... | 3369230 | 662 days ago | IN | 0.0003 ETH | 0.00005567 | ||||
| Create Decrease ... | 3369057 | 662 days ago | IN | 0.0003 ETH | 0.00004964 | ||||
| Create Increase ... | 3369017 | 662 days ago | IN | 0.0003 ETH | 0.00004963 | ||||
| Create Decrease ... | 3368737 | 662 days ago | IN | 0.0003 ETH | 0.00004437 | ||||
| Create Increase ... | 3368724 | 662 days ago | IN | 0.0003 ETH | 0.0000479 | ||||
| Create Decrease ... | 3368691 | 662 days ago | IN | 0.0003 ETH | 0.00004938 | ||||
| Create Increase ... | 3368675 | 662 days ago | IN | 0.0003 ETH | 0.00005508 | ||||
| Create Decrease ... | 3368609 | 662 days ago | IN | 0.0003 ETH | 0.00006106 | ||||
| Create Increase ... | 3368600 | 662 days ago | IN | 0.0003 ETH | 0.00006543 | ||||
| Create Decrease ... | 3368557 | 662 days ago | IN | 0.0003 ETH | 0.00006713 | ||||
| Create Increase ... | 3368543 | 662 days ago | IN | 0.0003 ETH | 0.00007646 | ||||
| Create Increase ... | 3368508 | 662 days ago | IN | 0.0003 ETH | 0.00007234 | ||||
| Create Decrease ... | 3368459 | 662 days ago | IN | 0.0003 ETH | 0.00007148 | ||||
| Create Increase ... | 3368449 | 662 days ago | IN | 0.0003 ETH | 0.00007347 | ||||
| Create Decrease ... | 3368416 | 662 days ago | IN | 0.0003 ETH | 0.0000154 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 4087089 | 637 days ago | 0 ETH | ||||
| 4087089 | 637 days ago | 0 ETH | ||||
| 3438762 | 660 days ago | 0 ETH | ||||
| 3406920 | 661 days ago | 0 ETH | ||||
| 3406920 | 661 days ago | 0 ETH | ||||
| 3391147 | 662 days ago | 0 ETH | ||||
| 3391147 | 662 days ago | 0 ETH | ||||
| 3383474 | 662 days ago | 0 ETH | ||||
| 3383474 | 662 days ago | 0 ETH | ||||
| 3372992 | 662 days ago | 0 ETH | ||||
| 3372992 | 662 days ago | 0 ETH | ||||
| 3370806 | 662 days ago | 0 ETH | ||||
| 3370806 | 662 days ago | 0 ETH | ||||
| 3370806 | 662 days ago | 0.0003 ETH | ||||
| 3370806 | 662 days ago | 0 ETH | ||||
| 3370806 | 662 days ago | 0 ETH | ||||
| 3370806 | 662 days ago | 0 ETH | ||||
| 3370806 | 662 days ago | 0 ETH | ||||
| 3370806 | 662 days ago | 0 ETH | ||||
| 3370806 | 662 days ago | 0 ETH | ||||
| 3370805 | 662 days ago | 0 ETH | ||||
| 3370805 | 662 days ago | 0 ETH | ||||
| 3370805 | 662 days ago | 0 ETH | ||||
| 3369317 | 662 days ago | 0.0003 ETH | ||||
| 3369317 | 662 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OrderManager
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at lineascan.build/ on 2023-12-10
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function decimals() external view returns (uint8);
}
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender)+(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender)-(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
if (_status == _ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
interface IUtils {
function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise, uint256 _markPrice) external view returns (uint256, int256);
function getEntryBorrowingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (int256);
function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
function getBorrowingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryBorrowingRate) external view returns (uint256);
function getBuyUsdlFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSellUsdlFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, bool _increment) external view returns (uint256);
function getDelta(
address _indexToken,
uint256 _size,
uint256 _averagePrice,
uint256 _nextPrice,
bool _isLong,
uint256 _lastIncreasedTime
) external view returns (bool, uint256);
function getNextGlobalAveragePrice(
address _account,
address _collateralToken,
address _indexToken,
uint256 _nextPrice,
uint256 _sizeDelta,
bool _isLong,
bool _isIncrease
) external view returns (uint256);
function getNextAveragePrice(
address _indexToken,
uint256 _size,
uint256 _averagePrice,
bool _isLong,
uint256 _nextPrice,
uint256 _sizeDelta,
uint256 _lastIncreasedTime
) external view returns (uint256);
function adjustForDecimals(
uint256 _amount,
address _tokenDiv,
address _tokenMul
) external view returns (uint256);
function getGlobalPositionDelta(address _token, uint size, bool _isLong) external view returns (bool, uint256);
function getAum(bool maximise) external view returns (uint256);
function getAumInUsdl(
bool maximise
) external view returns (uint256);
function validatePosition(
uint256 _size,
uint256 _collateral
) external view;
function getNextBorrowingRate(address _indexToken, bool _isLong) external view returns(uint);
function getMinPrice(address _token) external view returns (uint256);
function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);
function getMaxPrice(address _token) external view returns (uint256);
function usdToTokenMin(address _token, uint256 _usdAmount) external view returns (uint256);
function usdToTokenMax(address _token, uint256 _usdAmount) external view returns (uint256);
function updateCumulativeBorrowingRate(address _indexToken) external view returns(uint256 borrowingTime, uint256 borrowingRateForLongs, uint256 borrowingRateForShorts);
function updateCumulativeFundingRate(address _indexToken, uint256 lastFundingTime) external returns(uint lastFundingUpdateTime, int256 fundingRateForLong, int256 fundingRateForShort);
function getRedemptionAmount(address _token, uint256 _usdlAmount) external view returns (uint256);
function collectMarginFees(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
uint256 _sizeDelta,
uint256 _size,
uint256 _entryBorrowingRate,
int256 _entryFundingRate
) external returns (int256 feeUsd);
function getTPPrice(uint256 sizeDelta, bool isLong, uint256 markPrice, uint256 _maxTPAmount, address collateralToken) external returns(uint256);
function calcLiquidationFee(uint256 size, address indexToken) external returns(uint);
function setPriceFeed(address _pricefeed) external;
function getOI(address _token, bool _isLong) view external returns(uint);
function getLPAmountInUSD() external view returns(uint lpAmountInUSD);
function getTotalOI() view external returns(uint totalOI);
}
library StructsUtils {
struct IncreasePositionRequest {
address account;
address _collateralToken;
address indexToken;
uint256 amountIn;
uint256 sizeDelta;
bool isLong;
uint256 acceptablePrice;
uint256 executionFee;
uint256 blockNumber;
uint256 blockTime;
}
struct DecreasePositionRequest {
address account;
address _collateralToken;
address indexToken;
uint256 sizeDelta;
bool isLong;
address receiver;
uint256 acceptablePrice;
uint256 executionFee;
uint256 blockNumber;
uint256 blockTime;
}
struct Order {
address account;
address collateralToken;
address indexToken;
uint256 collateralDelta;
uint256 sizeDelta;
uint256 triggerPrice;
uint256 executionFee;
bool isLong;
bool triggerAboveThreshold;
bool isIncreaseOrder;
bool isMaxOrder;
}
struct Position {
address account;
address collateralToken;
address indexToken;
bool isLong;
uint256 size;
uint256 collateral;
uint256 averagePrice;
uint256 entryBorrowingRate;
int256 entryFundingRate;
int256 realisedPnl;
uint256 lastIncreasedTime;
}
struct MintLLPRequest {
address account;
uint256 amount;
address collateralToken;
uint256 executionFee;
uint256 minUsdl;
uint256 minLLP;
}
struct BurnLLPRequest {
address account;
uint256 amount;
address collateralToken;
uint256 minOut;
address receiver;
uint256 executionFee;
}
}
interface IVault {
struct FundingFeeData {
uint256 fundingRateFactor;
uint256 fundingInterval;
uint256 fundingExponent;
}
struct BorrowingFeeData {
uint256 borrowingRateFactor;
uint256 borrowingInterval;
uint256 borrowingExponent;
}
function isInitialized() external view returns (bool);
function setUtils(address _utils) external;
function usdl() external view returns (address);
function maxLeverage(address _token) external view returns (uint256);
function oiImbalanceThreshold(address _token) external view returns (uint256);
function gov() external view returns (address);
function ceaseTradingActivity() external view returns(bool);
function ceaseLPActivity() external view returns (bool);
function minProfitTime() external view returns (uint256);
function hasDynamicFees() external view returns (bool);
function inManagerMode() external view returns (bool);
function inPrivateLiquidationMode() external view returns (bool);
function maxGasPrice() external view returns (uint256);
function isLiquidator(address _account) external view returns (bool);
function isManager(address _account) external view returns (bool);
function minProfitBasisPoints(address _token) external view returns (uint256);
function tokenBalances(address _token) external view returns (uint256);
function lastBorrowingTimes(address _token) external view returns (uint256);
function lastFundingTimes(address _token) external view returns (uint256);
function setMaxLeverage(uint256 _maxLeverage, address _token) external;
function setInManagerMode(bool _inManagerMode) external;
function setManager(address _manager, bool _isManager) external;
function setMaxGasPrice(uint256 _maxGasPrice) external;
function setMaxGlobalShortSize(address _token, uint256 _amount) external;
function setMaxGlobalLongSize(address _token, uint256 _amount) external;
function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external;
function setLiquidator(address _liquidator, bool _isActive) external;
function setBorrowingRate(address token, uint256 _borrowingInterval, uint256 _borrowingRateFactor, uint256 borrowingExponent) external;
function setFundingRate(address token, uint256 _fundingInterval, uint256 _fundingRateFactor, uint256 fundingExponent) external;
function setFees(
uint256 _mintBurnFeeBasisPoints,
uint256 _marginFeeBasisPoints,
uint256 _liquidationFeeUsd,
uint256 liquidationFactor,
uint256 _minProfitTime,
bool _hasDynamicFees
) external;
function setTokenConfig(
address _token,
uint256 _tokenDecimals,
uint256 _minProfitBps,
bool _isStable,
bool _canBeCollateralToken,
bool _canBeIndexToken,
uint _maxLeverage
) external;
function setCeaseLPActivity(bool _cease) external;
function setCeaseTradingActivity(bool _cease) external;
function setPriceFeed(address _priceFeed) external;
function withdrawFees(address _token, address _receiver) external returns (uint256);
function setGov(address _gov) external;
function directPoolDeposit(address _token) external;
function buyUSDL(address _token, address _receiver) external returns (uint256);
function sellUSDL(address _token, address _receiver) external returns (uint256);
function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;
function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);
function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external;
function liquidatePosition(bytes32 key, address feeReceiver) external;
function priceFeed() external view returns (address);
function fundingRateFactor(address) external view returns (uint256, uint256, uint256);
function borrowingRateFactor(address) external view returns (uint256, uint256, uint256);
function cumulativeBorrowingRatesForLongs(address _token) external view returns (uint256);
function cumulativeBorrowingRatesForShorts(address _token) external view returns (uint256);
function cumulativeFundingRatesForLongs(address _token) external view returns (int);
function cumulativeFundingRatesForShorts(address _token) external view returns (int);
function liquidationFeeUsd() external view returns (uint256);
function liquidationFactor() external view returns (uint256);
function mintBurnFeeBasisPoints() external view returns (uint256);
function marginFeeBasisPoints() external view returns (uint256);
function allWhitelistedTokensLength() external view returns (uint256);
function allWhitelistedTokens(uint256) external view returns (address);
function whitelistedTokens(address _token) external view returns (bool);
function stableTokens(address _token) external view returns (bool);
function feeReserves(address _token) external view returns (uint256);
function globalShortSizes(address _token) external view returns (uint256);
function globalLongSizes(address _token) external view returns (uint256);
function globalShortAveragePrices(address _token) external view returns (uint256);
function globalLongAveragePrices(address _token) external view returns (uint256);
function maxGlobalShortSizesBps(address _token) external view returns (uint256);
function maxGlobalLongSizesBps(address _token) external view returns (uint256);
function tokenDecimals(address _token) external view returns (uint256);
function canBeIndexToken(address _token) external view returns (bool);
function canBeCollateralToken(address _token) external view returns (bool);
function poolAmounts(address _token) external view returns (uint256);
function setGlobalLongSizesLimitBps(address token, uint amount) external;
function setGlobalShortSizesLimitBps(address token, uint amount) external;
function setPoolSafetyFactorInBps(uint _poolSafetyFactorInBps) external;
function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (StructsUtils.Position memory);
}
interface ITimelock {
function setAdmin(address _admin) external;
function signalSetGov(address _target, address _gov) external;
}
contract Governable {
address public gov;
constructor() {
gov = msg.sender;
}
modifier onlyGov() {
require(msg.sender == gov, "Governable: forbidden");
_;
}
function setGov(address _gov) external onlyGov {
gov = _gov;
}
}
interface IPriceFeed {
function getMaxPriceOfToken(address _token) external view returns (uint256);
function getMinPriceOfToken(address _token) external view returns (uint256);
}
contract BaseOrderManager{
using SafeERC20 for IERC20;
address public admin;
address public vault;
address public utils;
address public pricefeed;
uint256 public constant BASIS_POINTS_DIVISOR = 10000;
uint256 public increasePositionBufferBps = 100;
mapping (address => uint256) public feeReserves;
uint public depositFee;
event LeverageDecreased(
uint256 collateralDelta,
uint256 prevLeverage,
uint256 nextLeverage
);
event WithdrawFees(address token, address receiver, uint256 amount);
modifier onlyAdmin() {
require(msg.sender == admin, "BM:403");
_;
}
constructor(
address _vault,
address _utils,
address _pricefeed,
uint _depositFee
) {
vault = _vault;
utils = _utils;
pricefeed = _pricefeed;
admin = msg.sender;
depositFee = _depositFee;
}
function setAdmin(address _admin) external onlyAdmin {
admin = _admin;
}
function setVault(address _vault) external onlyAdmin {
vault = _vault;
}
function setUtils(address _utils) external onlyAdmin {
utils = _utils;
}
function setDepositFee(uint _fee) external onlyAdmin {
depositFee = _fee;
}
function _increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong, uint256 acceptablePrice) internal {
//remove this - not need as only called during increase
uint256 markPrice = _isLong ? IPriceFeed(pricefeed).getMaxPriceOfToken(_indexToken) : IPriceFeed(pricefeed).getMinPriceOfToken(_indexToken);
if (_isLong) {
require(markPrice <= acceptablePrice, "BM:mp");
} else {
require(markPrice >= acceptablePrice, "BM:mp");
}
IVault(vault).increasePosition(_account, _collateralToken, _indexToken, _sizeDelta, _isLong);
}
function _decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong, address _receiver, uint256 _price) internal returns (uint256) {
//remove this - not needed as price is set
uint256 markPrice = _isLong ? IPriceFeed(pricefeed).getMinPriceOfToken(_indexToken) : IPriceFeed(pricefeed).getMaxPriceOfToken(_indexToken);
if (_isLong) {
require(markPrice >= _price, "BM:mp");
} else {
require(markPrice <= _price, "BM:mp");
}
return IVault(vault).decreasePosition(_account, _collateralToken, _indexToken, _sizeDelta, _isLong, _receiver);
}
function shouldDeductFee(
address _account,
address collateralToken,
uint256 _amountIn,
address _indexToken,
bool _isLong,
uint256 _sizeDelta,
uint256 _increasePositionBufferBps
) private returns (bool) {
// if the position size is not increasing, this is a collateral deposit
if (_sizeDelta == 0) { return true; }
StructsUtils.Position memory position = IVault(vault).getPosition(_account, collateralToken, _indexToken, _isLong);
uint256 size = position.size;
uint256 collateral = position.collateral;
// if there is no existing position, do not charge a fee
if (size == 0) { return false; }
uint256 nextSize = size+(_sizeDelta);
//remove this - not needed as price will be set before calling
uint256 collateralDelta = IUtils(utils).tokenToUsdMin(collateralToken, _amountIn);
uint256 nextCollateral = collateral+(collateralDelta);
uint256 prevLeverage = size*(BASIS_POINTS_DIVISOR)/(collateral);
// allow for a maximum of a increasePositionBufferBps decrease since there might be some swap fees taken from the collateral
uint256 nextLeverage = nextSize*(BASIS_POINTS_DIVISOR + _increasePositionBufferBps)/(nextCollateral);
if(nextLeverage < prevLeverage){
emit LeverageDecreased(collateralDelta, prevLeverage, nextLeverage);
return true;
}
return false;
}
function withdrawFees(address _token, address _receiver) external onlyAdmin {
uint256 amount = feeReserves[_token];
if (amount == 0) { return; }
feeReserves[_token] = 0;
IERC20(_token).safeTransfer(_receiver, amount);
emit WithdrawFees(_token, _receiver, amount);
}
function _collectFees(
address _account,
address collateralToken,
uint256 _amountIn,
address _indexToken,
bool _isLong,
uint256 _sizeDelta
) internal returns (uint256) {
if (shouldDeductFee(_account,collateralToken,_amountIn,_indexToken,_isLong,_sizeDelta,increasePositionBufferBps)) {
uint256 afterFeeAmount = _amountIn*(BASIS_POINTS_DIVISOR - (depositFee))/(BASIS_POINTS_DIVISOR);
uint256 feeAmount = _amountIn-(afterFeeAmount);
feeReserves[collateralToken] = feeReserves[collateralToken]+(feeAmount);
return afterFeeAmount;
}
return _amountIn;
}
}
interface IOrderManager{
function increasePositionRequestKeysStart() external returns (uint256);
function decreasePositionRequestKeysStart() external returns (uint256);
function executeIncreasePositions(uint256 _count, address payable _executionFeeReceiver) external returns(uint256);
function executeDecreasePositions(uint256 _count, address payable _executionFeeReceiver) external returns(uint256);
function executeOrder(address, uint256, address payable) external;
function setOrderKeeper(address _account, bool _isActive) external;
function setPriceFeed(address _priceFeed) external;
function executeMultipleOrders(address[] calldata accountAddresses, uint[] calldata orderIndices, address payable _feeReceiver) external;
function liquidateMultiplePositions(bytes32[] calldata keys, address payable _feeReceiver) external;
}
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 value => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastValue;
// Update the index for the moved value
set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}
contract OrderManager is
BaseOrderManager,
IOrderManager,
ReentrancyGuard
{
using SafeERC20 for IERC20;
uint256 public minExecutionFeeMarketOrder;
uint256 public minExecutionFeeLimitOrder;
mapping(address => uint256) public increasePositionsIndex;
mapping(bytes32 => StructsUtils.IncreasePositionRequest) public increasePositionRequests;
bytes32[] public increasePositionRequestKeys;
mapping(address => uint256) public decreasePositionsIndex;
mapping(bytes32 => StructsUtils.DecreasePositionRequest) public decreasePositionRequests;
bytes32[] decreasePositionRequestKeys;
mapping(address => bool) public isPositionKeeper;
uint256 public minBlockDelayKeeper;
uint256 public minTimeDelayPublic;
uint256 public maxTimeDelay;
uint256 public increasePositionRequestKeysStart;
uint256 public decreasePositionRequestKeysStart;
mapping (bytes32 => StructsUtils.Order) public orders;
EnumerableSet.Bytes32Set private orderKeys;
mapping (address => uint256) public ordersIndex;
mapping (address => bool) public isOrderKeeper;
mapping (address => bool) public isLiquidator;
uint public maxProfitMultiplier;
uint256 public minPurchaseUSDAmountMarketOrder;//this will be in 10^18
uint256 public minPurchaseUSDAmountLimitOrder;// this will be in 10^18
event CreateIncreasePosition(
address indexed account,
address _collateralToken,
address indexToken,
uint256 amountIn,
uint256 sizeDelta,
bool isLong,
uint256 acceptablePrice,
uint256 executionFee,
uint256 index,
uint256 queueIndex,
uint256 blockNumber,
uint256 blockTime,
uint256 gasPrice
);
event CancelIncreasePosition(
address indexed account,
address _collateralToken,
address indexToken,
uint256 amountIn,
uint256 sizeDelta,
bool isLong,
uint256 acceptablePrice,
uint256 executionFee,
uint256 blockGap,
uint256 timeGap
);
event CreateDecreasePosition(
address indexed account,
address _collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
address receiver,
uint256 acceptablePrice,
uint256 executionFee,
uint256 index,
uint256 queueIndex,
uint256 blockNumber,
uint256 blockTime
);
event ExecuteDecreasePosition(
address indexed account,
address _collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
address receiver,
uint256 acceptablePrice,
uint256 executionFee,
uint256 blockGap,
uint256 timeGap
);
event CancelDecreasePosition(
address indexed account,
address _collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
address receiver,
uint256 acceptablePrice,
uint256 executionFee,
uint256 blockGap,
uint256 timeGap
);
event ExecuteIncreasePosition(
address indexed account,
address _collateralToken,
address indexToken,
uint256 amountIn,
uint256 sizeDelta,
bool isLong,
uint256 acceptablePrice,
uint256 executionFee,
uint256 blockGap,
uint256 timeGap
);
event CreateOrder(
address indexed account,
address collateralToken,
address indexToken,
uint256 orderIndex,
uint256 collateralDelta,
uint256 sizeDelta,
uint256 triggerPrice,
uint256 executionFee,
bool isLong,
bool triggerAboveThreshold,
bool indexed isIncreaseOrder,
bool isMaxOrder
);
event UpdateOrder(
address indexed account,
address collateralToken,
address indexToken,
uint256 orderIndex,
uint256 collateralDelta,
uint256 sizeDelta,
uint256 triggerPrice,
bool isLong,
bool triggerAboveThreshold,
bool indexed isIncreaseOrder,
bool isMaxOrder
);
event CancelOrder(
address indexed account,
address collateralToken,
address indexToken,
uint256 orderIndex,
uint256 collateralDelta,
uint256 sizeDelta,
uint256 triggerPrice,
uint256 executionFee,
bool isLong,
bool triggerAboveThreshold,
bool indexed isIncreaseOrder,
bool isMaxOrder
);
event ExecuteOrder(
address indexed account,
address collateralToken,
address indexToken,
uint256 orderIndex,
uint256 collateralDelta,
uint256 sizeDelta,
uint256 triggerPrice,
uint256 executionFee,
uint256 executionPrice,
bool isLong,
bool triggerAboveThreshold,
bool indexed isIncreaseOrder
);
event SetPositionKeeper(address indexed account, bool isActive);
event SetOrderKeeper(address indexed account, bool isActive);
event SetLiquidator(address indexed account, bool isActive);
event SetDelayValues(
uint256 minBlockDelayKeeper,
uint256 minTimeDelayPublic,
uint256 maxTimeDelay
);
constructor(
address _vault,
address _utils,
address _pricefeed,
uint256 _minExecutionFeeMarketOrder,
uint256 _minExecutionFeeLimitOrder,
uint _depositFee,
uint _maxProfitMultiplier,
uint256 _minPurchaseUSDAmountLimitOrder,
uint256 _minPurchaseUSDAmountMarketOrder
) BaseOrderManager(_vault, _utils, _pricefeed, _depositFee) {
minExecutionFeeMarketOrder = _minExecutionFeeMarketOrder;
minExecutionFeeLimitOrder = _minExecutionFeeLimitOrder;
maxProfitMultiplier = _maxProfitMultiplier;
minPurchaseUSDAmountMarketOrder = _minPurchaseUSDAmountMarketOrder;
minPurchaseUSDAmountLimitOrder = _minPurchaseUSDAmountLimitOrder;
}
modifier onlyPositionKeeper() {
require(isPositionKeeper[msg.sender], "OM:403");
_;
}
modifier onlyLiquidator() {
require(isLiquidator[msg.sender], "OM:403");
_;
}
modifier onlyOrderKeeper() {
require(isOrderKeeper[msg.sender], "OM:403");
_;
}
function setMinPurchaseAmount(uint256 _marketOrder ,uint256 _limitOrder) external onlyAdmin {
minPurchaseUSDAmountMarketOrder = _marketOrder;
minPurchaseUSDAmountLimitOrder = _limitOrder;
}
function setPositionKeeper(
address _account,
bool _isActive
) external onlyAdmin {
isPositionKeeper[_account] = _isActive;
emit SetPositionKeeper(_account, _isActive);
}
function setMaxTPMultiplier(uint _maxProfitMultiplier) external onlyAdmin {
maxProfitMultiplier = _maxProfitMultiplier;
}
function setMinExecutionFeeMarketOrder(uint256 _minExecutionFeeMarketOrder) external onlyAdmin {
minExecutionFeeMarketOrder = _minExecutionFeeMarketOrder;
}
function setMinExecutionFeeLimitOrder(uint256 _minExecutionFeeLimitOrder) external onlyAdmin {
minExecutionFeeLimitOrder = _minExecutionFeeLimitOrder;
}
function setPriceFeed(address _priceFeed) override external onlyAdmin {
pricefeed = _priceFeed;
}
function setDelayValues(
uint256 _minBlockDelayKeeper,
uint256 _minTimeDelayPublic,
uint256 _maxTimeDelay
) external onlyAdmin {
minBlockDelayKeeper = _minBlockDelayKeeper;
minTimeDelayPublic = _minTimeDelayPublic;
maxTimeDelay = _maxTimeDelay;
emit SetDelayValues(
_minBlockDelayKeeper,
_minTimeDelayPublic,
_maxTimeDelay
);
}
function setOrderKeeper(address _account, bool _isActive) external onlyAdmin {
isOrderKeeper[_account] = _isActive;
emit SetOrderKeeper(_account, _isActive);
}
function setLiquidator(address _account, bool _isActive) external onlyAdmin {
isLiquidator[_account] = _isActive;
emit SetLiquidator(_account, _isActive);
}
function createIncreasePosition(
address _collateralToken,
address _indexToken,
uint256 _amountIn,
uint256 _sizeDelta,
bool _isLong,
uint256 _acceptablePrice,
uint256 takeProfitPrice,
uint256 stopLossPrice,
uint256 _executionFee
) external payable nonReentrant returns (bytes32) {
require(!IVault(vault).ceaseTradingActivity(), "OM:0");
require(IVault(vault).canBeIndexToken(_indexToken), "OM:idx");
require(_executionFee == msg.value, "OM:ef");
if(takeProfitPrice ==0 && stopLossPrice ==0){
require(_executionFee >= minExecutionFeeMarketOrder + minExecutionFeeLimitOrder, "OM:ef");
} else if(takeProfitPrice !=0 && stopLossPrice !=0){
require(_executionFee >= minExecutionFeeMarketOrder + 3 * minExecutionFeeLimitOrder, "OM:ef");
} else {
require(_executionFee >= minExecutionFeeMarketOrder + 2* minExecutionFeeLimitOrder, "OM:ef");
}
//remove this
require( _amountIn>= minPurchaseUSDAmountMarketOrder, "OM:c");
IERC20(_collateralToken).safeTransferFrom(msg.sender, address(this), _amountIn);
bytes32 positionKey = _createIncreasePosition(
msg.sender,
_collateralToken,
_indexToken,
_amountIn,
_sizeDelta,
_isLong,
_acceptablePrice,
minExecutionFeeMarketOrder
);
if(takeProfitPrice !=0){
_createOrder(msg.sender, 0, _collateralToken, _indexToken, _sizeDelta, _isLong, takeProfitPrice, _isLong, minExecutionFeeLimitOrder, false , false);
}
if(stopLossPrice !=0){
_createOrder(msg.sender, 0, _collateralToken, _indexToken, _sizeDelta, _isLong, stopLossPrice, !_isLong, minExecutionFeeLimitOrder, false , false);
}
return positionKey;
}
function _createIncreasePosition(
address _account,
address _collateralToken,
address _indexToken,
uint256 _amountIn,
uint256 _sizeDelta,
bool _isLong,
uint256 _acceptablePrice,
uint256 _executionFee
) internal returns (bytes32) {
StructsUtils.IncreasePositionRequest memory request = StructsUtils.IncreasePositionRequest(
_account,
_collateralToken,
_indexToken,
_amountIn,
_sizeDelta,
_isLong,
_acceptablePrice,
_executionFee,
block.number,
block.timestamp
);
(uint256 index, bytes32 requestKey) = _storeIncreasePositionRequest(
request
);
emit CreateIncreasePosition(
_account,
_collateralToken,
_indexToken,
_amountIn,
_sizeDelta,
_isLong,
_acceptablePrice,
_executionFee,
index,
increasePositionRequestKeys.length - 1,
block.number,
block.timestamp,
tx.gasprice
);
return requestKey;
}
function cancelIncreasePosition(
bytes32 _key,
address payable _executionFeeReceiver
) public nonReentrant returns (bool) {
StructsUtils.IncreasePositionRequest memory request = increasePositionRequests[_key];
// if the request was already executed or cancelled, return true so that the executeIncreasePositions loop will continue executing the next request
if (request.account == address(0)) {
return true;
}
if (!_validateCancellation(request.blockNumber,request.blockTime,request.account)) {
return false;
}
delete increasePositionRequests[_key];
IERC20(request._collateralToken).safeTransfer(request.account, request.amountIn);
(bool success, ) = _executionFeeReceiver.call{value: request.executionFee}("");
require(success, "OM:f");
emit CancelIncreasePosition(
request.account,
request._collateralToken,
request.indexToken,
request.amountIn,
request.sizeDelta,
request.isLong,
request.acceptablePrice,
request.executionFee,
block.number - request.blockNumber,
block.timestamp - request.blockTime
);
return true;
}
function executeIncreasePositions(
uint256 _endIndex,
address payable _executionFeeReceiver
) external override onlyPositionKeeper returns(uint256){
uint256 index = increasePositionRequestKeysStart;
uint256 length = increasePositionRequestKeys.length;
if (index >= length) {
return index;
}
if (_endIndex > length) {
_endIndex = length;
}
while (index < _endIndex) {
bytes32 key = increasePositionRequestKeys[index];
// if the request was executed then delete the key from the array
// if the request was not executed then break from the loop, this can happen if the
// minimum number of blocks has not yet passed
// an error could be thrown if the request is too old or if the slippage is
// higher than what the user specified, or if there is insufficient liquidity for the position
// in case an error was thrown, cancel the request
try
this.executeIncreasePosition(key, _executionFeeReceiver)
returns (bool _wasExecuted) {
if (!_wasExecuted) {
break;
}
} catch {
// wrap this call in a try catch to prevent invalid cancels from blocking the loop
try
this.cancelIncreasePosition(key, _executionFeeReceiver)
returns (bool _wasCancelled) {
if (!_wasCancelled) {
break;
}
} catch {
continue;
}
}
delete increasePositionRequestKeys[index];
index++;
}
increasePositionRequestKeysStart = index;
return index;
}
function executeIncreasePosition(
bytes32 _key,
address payable _executionFeeReceiver
) public nonReentrant returns (bool) {
StructsUtils.IncreasePositionRequest memory request = increasePositionRequests[_key];
// if the request was already executed or cancelled, return true so that the executeIncreasePositions loop will continue executing the next request
if (request.account == address(0)) {
return true;
}
if (!_validateExecution(request.blockNumber,request.blockTime,request.account)) {
return false;
}
delete increasePositionRequests[_key];
IERC20(request._collateralToken).safeTransfer(vault, _collectFees(request.account, request._collateralToken, request.amountIn, request.indexToken, request.isLong, request.sizeDelta));
_increasePosition(
request.account,
request._collateralToken,
request.indexToken,
request.sizeDelta,
request.isLong,
request.acceptablePrice
);
(bool success, ) = _executionFeeReceiver.call{value: request.executionFee}("");
require(success, "OM:f");
if(request.sizeDelta > 0){
//remove this - not needed as price will be set before calling
uint256 tpPrice = IUtils(utils).getTPPrice(request.sizeDelta, request.isLong, request.acceptablePrice, request.amountIn * maxProfitMultiplier, request._collateralToken);
_createOrder(request.account, 0, request._collateralToken, request.indexToken, request.sizeDelta, request.isLong, tpPrice, request.isLong, minExecutionFeeLimitOrder, false , true);
}
emit ExecuteIncreasePosition(
request.account,
request._collateralToken,
request.indexToken,
request.amountIn,
request.sizeDelta,
request.isLong,
request.acceptablePrice,
request.executionFee,
block.number - (request.blockNumber),
block.timestamp - (request.blockTime)
);
return true;
}
function _storeIncreasePositionRequest(
StructsUtils.IncreasePositionRequest memory _request
) internal returns (uint256, bytes32) {
address account = _request.account;
uint256 index = increasePositionsIndex[account] + 1;
increasePositionsIndex[account] = index;
bytes32 key = getRequestKey(account, index);
increasePositionRequests[key] = _request;
increasePositionRequestKeys.push(key);
return (index, key);
}
function createDecreasePosition(
address _collateralToken,
address _indexToken,
uint256 _sizeDelta,
bool _isLong,
address _receiver,
uint256 _acceptablePrice,
uint256 _executionFee
) external payable nonReentrant returns (bytes32) {
require(!IVault(vault).ceaseTradingActivity(), "OM:0");
require(_executionFee >= minExecutionFeeMarketOrder, "OM:f");
require(_executionFee == msg.value, "OM:ef");
require(checkSufficientPositionExists(msg.sender, _collateralToken, _indexToken,_isLong, _sizeDelta), "OM:size");
return
_createDecreasePosition(
msg.sender,
_collateralToken,
_indexToken,
_sizeDelta,
_isLong,
_receiver,
_acceptablePrice,
_executionFee
);
}
function _createDecreasePosition(
address _account,
address _collateralToken,
address _indexToken,
uint256 _sizeDelta,
bool _isLong,
address _receiver,
uint256 _acceptablePrice,
uint256 _executionFee
) internal returns (bytes32) {
StructsUtils.DecreasePositionRequest memory request = StructsUtils.DecreasePositionRequest(
_account,
_collateralToken,
_indexToken,
_sizeDelta,
_isLong,
_receiver,
_acceptablePrice,
_executionFee,
block.number,
block.timestamp
);
(uint256 index, bytes32 requestKey) = _storeDecreasePositionRequest(
request
);
emit CreateDecreasePosition(
request.account,
request._collateralToken,
request.indexToken,
request.sizeDelta,
request.isLong,
request.receiver,
request.acceptablePrice,
request.executionFee,
index,
decreasePositionRequestKeys.length - 1,
block.number,
block.timestamp
);
return requestKey;
}
function _storeDecreasePositionRequest(
StructsUtils.DecreasePositionRequest memory _request
) internal returns (uint256, bytes32) {
address account = _request.account;
uint256 index = decreasePositionsIndex[account] + 1;
decreasePositionsIndex[account] = index;
bytes32 key = getRequestKey(account, index);
decreasePositionRequests[key] = _request;
decreasePositionRequestKeys.push(key);
return (index, key);
}
function cancelDecreasePosition(
bytes32 _key,
address payable _executionFeeReceiver
) public nonReentrant returns (bool) {
StructsUtils.DecreasePositionRequest memory request = decreasePositionRequests[_key];
// if the request was already executed or cancelled, return true so that the executeDecreasePositions loop will continue executing the next request
if (request.account == address(0)) {
return true;
}
if (!_validateCancellation(request.blockNumber,request.blockTime,request.account)) {
return false;
}
delete decreasePositionRequests[_key];
(bool success, ) = _executionFeeReceiver.call{value: request.executionFee}("");
require(success, "OM:f");
emit CancelDecreasePosition(
request.account,
request._collateralToken,
request.indexToken,
request.sizeDelta,
request.isLong,
request.receiver,
request.acceptablePrice,
request.executionFee,
block.number - request.blockNumber,
block.timestamp - request.blockTime
);
return true;
}
function executeDecreasePositions(
uint256 _endIndex,
address payable _executionFeeReceiver
) external override onlyPositionKeeper returns(uint256){
uint256 index = decreasePositionRequestKeysStart;
uint256 length = decreasePositionRequestKeys.length;
if (index >= length) {
return index;
}
if (_endIndex > length) {
_endIndex = length;
}
while (index < _endIndex) {
bytes32 key = decreasePositionRequestKeys[index];
// if the request was executed then delete the key from the array
// if the request was not executed then break from the loop, this can happen if the
// minimum number of blocks has not yet passed
// an error could be thrown if the request is too old
// in case an error was thrown, cancel the request
try
this.executeDecreasePosition(key, _executionFeeReceiver)
returns (bool _wasExecuted) {
if (!_wasExecuted) {
break;
}
} catch {
// wrap this call in a try catch to prevent invalid cancels from blocking the loop
try
this.cancelDecreasePosition(key, _executionFeeReceiver)
returns (bool _wasCancelled) {
if (!_wasCancelled) {
break;
}
} catch {
continue;
}
}
delete decreasePositionRequestKeys[index];
index++;
}
decreasePositionRequestKeysStart = index;
return index;
}
function executeDecreasePosition(
bytes32 _key,
address payable _executionFeeReceiver
) public nonReentrant returns (bool) {
StructsUtils.DecreasePositionRequest memory request = decreasePositionRequests[_key];
// if the request was already executed or cancelled, return true so that the executeDecreasePositions loop will continue executing the next request
if (request.account == address(0)) {
return true;
}
if (!_validateExecution(request.blockNumber,request.blockTime,request.account)) {
return false;
}
delete decreasePositionRequests[_key];
uint256 amountOut = _decreasePosition(
request.account,
request._collateralToken,
request.indexToken,
request.sizeDelta,
request.isLong,
address(this),
request.acceptablePrice
);
IERC20(request._collateralToken).safeTransfer(
request.receiver,
amountOut
);
(bool success, ) = _executionFeeReceiver.call{value: request.executionFee}("");
require(success, "OM:f");
emit ExecuteDecreasePosition(
request.account,
request._collateralToken,
request.indexToken,
request.sizeDelta,
request.isLong,
request.receiver,
request.acceptablePrice,
request.executionFee,
block.number - (request.blockNumber),
block.timestamp - (request.blockTime)
);
return true;
}
function _validateExecution(
uint256 _positionBlockNumber,
uint256 _positionBlockTime,
address _account
) internal view returns (bool) {
require(
block.timestamp < _positionBlockTime + (maxTimeDelay),
"OM:exp"
);
return
_validateExecutionOrCancellation(
_positionBlockNumber,
_positionBlockTime,
_account
);
}
function _validateCancellation(
uint256 _positionBlockNumber,
uint256 _positionBlockTime,
address _account
) internal view returns (bool) {
return
_validateExecutionOrCancellation(
_positionBlockNumber,
_positionBlockTime,
_account
);
}
function _validateExecutionOrCancellation(
uint256 _positionBlockNumber,
uint256 _positionBlockTime,
address _account
) internal view returns (bool) {
if (msg.sender == address(this) || isPositionKeeper[msg.sender]) {
return _positionBlockNumber + minBlockDelayKeeper <= block.number;
}
require(msg.sender == _account, "OM:403");
require(
_positionBlockTime + minTimeDelayPublic <= block.timestamp,
"OM:d"
);
return true;
}
function getRequestKey(
address account,
uint256 index
) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(account, index));
}
//function is added only for testing purposes to prevent locking of funds.
//Main-net will not have this function.
function withdrawFunds(address _token, uint256 _amount) external onlyAdmin {
require(_amount <= IERC20(_token).balanceOf(address(this)),"OM:amount");
IERC20(_token).safeTransfer(admin, _amount);
}
function validatePositionOrderPrice(
bool _triggerAboveThreshold,
uint256 _triggerPrice,
address _indexToken,
bool _maximizePrice
) public view returns (uint256, bool) {
//remove this - not needed as price will be set before calling
uint256 currentPrice = _maximizePrice
? IPriceFeed(pricefeed).getMaxPriceOfToken(_indexToken) : IPriceFeed(pricefeed).getMinPriceOfToken(_indexToken);
bool isPriceValid = _triggerAboveThreshold ? currentPrice > _triggerPrice : currentPrice < _triggerPrice;
require(isPriceValid, "OM:pr");
return (currentPrice, isPriceValid);
}
function _validateLimitOrderPrices(uint256 currMarketPrice, bool _isLong, uint256 limitPrice) public pure {
if(_isLong){
require(limitPrice < currMarketPrice, "OM:p");
}
else{
require(limitPrice > currMarketPrice, "OM:p");
}
}
function _validateTPSLOrderPrices(uint256 currMarketPrice, bool _isLong, uint tpPrice, uint256 slPrice) public pure {
if(_isLong){
if(tpPrice !=0){
require(tpPrice > currMarketPrice, "OM:p");
}
if(slPrice !=0){
require(slPrice < currMarketPrice, "OM:p");
}
}
else{
if(tpPrice !=0){
require(tpPrice < currMarketPrice, "OM:p");
}
if(slPrice !=0){
require(slPrice > currMarketPrice, "OM:p");
}
}
}
function createOrders(
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
address collateralToken,
bool isLong,
uint256 _executionFee,
uint256 limitPrice,
uint256 tpPrice,
uint256 slPrice
) external payable nonReentrant {
require(!IVault(vault).ceaseTradingActivity(), "OM:0");
require(IVault(vault).canBeIndexToken(indexToken), "OM:idx");
require(msg.value == _executionFee, "OM:ef");
// to make sure that you can either open a limit order or tp or sl order
if(tpPrice !=0 || slPrice !=0){
require(limitPrice == 0, "OM:fail");
}
// f checks
if(tpPrice !=0 && slPrice !=0){
require(_executionFee >= 2*minExecutionFeeLimitOrder, "OM:f");
} else if(limitPrice !=0){
require(_executionFee >= 2*minExecutionFeeLimitOrder, "OM:f");
} else{
require(_executionFee >= minExecutionFeeLimitOrder, "OM:f");
}
{
uint256 _collateralDelta = collateralDelta;
address _indexToken = indexToken;
uint256 _sizeDelta = sizeDelta;
address _collateralToken = collateralToken;
bool _isLong = isLong;
uint256 _limitPrice = limitPrice;
uint256 _tpPrice= tpPrice;
uint256 _slPrice= slPrice;
if(limitPrice != 0){
//remove this
//uint256 currMarketPrice = _isLong? IPriceFeed(pricefeed).getMaxPriceOfToken(_indexToken):IPriceFeed(pricefeed).getMinPriceOfToken(_indexToken);
//_validateLimitOrderPrices(currMarketPrice, _isLong, _limitPrice);
IERC20(_collateralToken).safeTransferFrom(msg.sender, address(this), _collateralDelta);
//remove this
require(_collateralDelta >= minPurchaseUSDAmountLimitOrder, "OM:c");
_createOrder(msg.sender, _collateralDelta, _collateralToken, _indexToken, _sizeDelta, _isLong, _limitPrice, !_isLong, minExecutionFeeLimitOrder, true, false);
}else{
// tpsl order or limit order when closing position
uint256 currMarketPrice = !_isLong? IPriceFeed(pricefeed).getMaxPriceOfToken(_indexToken):IPriceFeed(pricefeed).getMinPriceOfToken(_indexToken);
_validateTPSLOrderPrices(currMarketPrice, _isLong, _tpPrice, _slPrice);
if(tpPrice != 0){
_createOrder(msg.sender, 0, _collateralToken, _indexToken, _sizeDelta, _isLong, _tpPrice, _isLong, minExecutionFeeLimitOrder, false, false);
}
if(slPrice !=0){
_createOrder(msg.sender, 0, _collateralToken, _indexToken, _sizeDelta, _isLong, _slPrice, !_isLong, minExecutionFeeLimitOrder, false, false);
}
}
}
}
function _createOrder(
address _account,
uint256 _collateralDelta,
address _collateralToken,
address _indexToken,
uint256 _sizeDelta,
bool _isLong,
uint256 _triggerPrice,
bool _triggerAboveThreshold,
uint256 _executionFee,
bool _isIncreaseOrder,
bool _isMaxOrder
) private {
{
address account = _account;
uint256 collateralDelta = _collateralDelta;
address collateralToken = _collateralToken;
address indexToken = _indexToken;
uint256 sizeDelta = _sizeDelta;
bool isLong = _isLong;
uint256 triggerPrice = _triggerPrice;
bool triggerAboveThreshold = _triggerAboveThreshold;
uint256 executionFee = _executionFee;
bool isIncreaseOrder = _isIncreaseOrder;
bool isMaxOrder = _isMaxOrder;
uint256 _orderIndex = ordersIndex[account];
ordersIndex[account] = _orderIndex+(1);
bytes32 orderKey = getOrderKey(account,_orderIndex);
orders[orderKey] = StructsUtils.Order(
account,
collateralToken,
indexToken,
collateralDelta,
sizeDelta,
triggerPrice,
executionFee,
isLong,
triggerAboveThreshold,
isIncreaseOrder,
isMaxOrder
);
EnumerableSet.add(orderKeys, orderKey);
emitOrderCreateEvent(account, _orderIndex);
}
}
function emitOrderCreateEvent(address _account, uint256 idx) internal{
StructsUtils.Order memory order = orders[getOrderKey(_account,idx)];
emit CreateOrder(
_account,
order.collateralToken,
order.indexToken,
idx,
order.collateralDelta,
order.sizeDelta,
order.triggerPrice,
order.executionFee,
order.isLong,
order.triggerAboveThreshold,
order.isIncreaseOrder,
order.isMaxOrder
);
emit UpdateOrder(
_account,
order.collateralToken,
order.indexToken,
idx,
order.collateralDelta,
order.sizeDelta,
order.triggerPrice,
order.isLong,
order.triggerAboveThreshold,
order.isIncreaseOrder,
order.isMaxOrder
);
}
function updateOrder(uint256 _orderIndex, uint256 _sizeDelta, uint256 _newCollateralAmount, uint256 _triggerPrice) external nonReentrant {
StructsUtils.Order storage order = orders[getOrderKey(msg.sender,_orderIndex)];
require(order.account != address(0), "OM:fail");
//remove this
//uint256 currMarketPrice = order.isLong? IPriceFeed(pricefeed).getMaxPriceOfToken(order.indexToken):IPriceFeed(pricefeed).getMinPriceOfToken(order.indexToken);
// if(order.triggerPrice > currMarketPrice){
// require(_triggerPrice > currMarketPrice, "OM:pr");
// }
// else{
// require(_triggerPrice < currMarketPrice, "OM:pr");
// }
uint256 oldCollateralAmount = order.collateralDelta;
if(order.isIncreaseOrder){
//remove this
//uint256 _collateralAmountUsd = IUtils(utils).tokenToUsdMin(order.collateralToken, _newCollateralAmount);
require(_newCollateralAmount >= minPurchaseUSDAmountLimitOrder, "OM:c");
bool increaseCollateral = _newCollateralAmount > oldCollateralAmount;
uint256 collateralDelta = increaseCollateral ? (_newCollateralAmount - oldCollateralAmount) : (oldCollateralAmount - _newCollateralAmount);
if(increaseCollateral){
IERC20(order.collateralToken).safeTransferFrom(msg.sender, address(this), collateralDelta);
}
else{
IERC20(order.collateralToken).safeTransfer(order.account, collateralDelta);
}
order.collateralDelta = _newCollateralAmount;
}
order.triggerPrice = _triggerPrice;
order.sizeDelta = _sizeDelta;
emit UpdateOrder(
msg.sender,
order.collateralToken,
order.indexToken,
_orderIndex,
order.collateralDelta,
order.sizeDelta,
order.triggerPrice,
order.isLong,
order.triggerAboveThreshold,
order.isIncreaseOrder,
order.isMaxOrder
);
}
function cancelOrder(uint256 _orderIndex, address account) public nonReentrant() {
bytes32 orderKey = getOrderKey(account,_orderIndex);
StructsUtils.Order memory order = orders[orderKey];
if(order.isMaxOrder){
require(isOrderKeeper[msg.sender], "OM:403");
}
else{
require(msg.sender == account || isOrderKeeper[msg.sender], "OM:403");
}
_cancelOrder(orderKey, _orderIndex, order);
}
function _cancelOrder(bytes32 orderKey, uint256 _orderIndex, StructsUtils.Order memory order) internal {
require(order.account != address(0), "OM:fail");
delete orders[orderKey];
EnumerableSet.remove(orderKeys, orderKey);
if(order.isIncreaseOrder){
IERC20(order.collateralToken).safeTransfer(order.account, order.collateralDelta);
}
(bool success, ) = (order.account).call{value: order.executionFee}("");
require(success, "OM:f");
emit CancelOrder(
order.account,
order.collateralToken,
order.indexToken,
_orderIndex,
order.collateralDelta,
order.sizeDelta,
order.triggerPrice,
order.executionFee,
order.isLong,
order.triggerAboveThreshold,
order.isIncreaseOrder,
order.isMaxOrder
);
emit UpdateOrder(
order.account,
order.collateralToken,
order.indexToken,
_orderIndex,
0,
0,
0,
false,
false,
false,
order.isMaxOrder
);
}
function executeOrder(address _address, uint256 _orderIndex, address payable _feeReceiver) override public nonReentrant onlyOrderKeeper {
bytes32 orderKey = getOrderKey(_address,_orderIndex);
StructsUtils.Order memory order = orders[orderKey];
require(order.account != address(0), "OM:fail");
// increase long should use max pr
// increase short should use min pr
(uint256 currentPrice, ) = validatePositionOrderPrice(
order.triggerAboveThreshold,
order.triggerPrice,
order.indexToken,
order.isLong
);
if(order.isIncreaseOrder){
IERC20(order.collateralToken).safeTransfer(vault, order.collateralDelta);
IVault(vault).increasePosition(order.account, order.collateralToken, order.indexToken, order.sizeDelta, order.isLong);
if(order.sizeDelta > 0){
//remove this - not needed as price will be set
uint tpPrice = IUtils(utils).getTPPrice(order.sizeDelta, order.isLong, order.triggerPrice, order.collateralDelta * maxProfitMultiplier, order.collateralToken);
_createOrder(order.account, 0, order.collateralToken, order.indexToken, order.sizeDelta, order.isLong, tpPrice, order.isLong, minExecutionFeeLimitOrder, false , true);
}
} else{
bool sufficientSizeExists = checkSufficientPositionExists(order.account, order.collateralToken, order.indexToken, order.isLong, order.sizeDelta);
if(!sufficientSizeExists){
_cancelOrder(orderKey, _orderIndex, order);
return;
}
uint256 amountOut = IVault(vault).decreasePosition(order.account, order.collateralToken, order.indexToken, order.sizeDelta, order.isLong, address(this));
IERC20(order.collateralToken).safeTransfer(order.account, amountOut);
}
delete orders[orderKey];
EnumerableSet.remove(orderKeys, orderKey);
// pay executor
(bool success, ) = _feeReceiver.call{value: order.executionFee}("");
require(success, "OM:f");
emit ExecuteOrder(
order.account,
order.collateralToken,
order.indexToken,
_orderIndex,
order.collateralDelta,
order.sizeDelta,
order.triggerPrice,
order.executionFee,
currentPrice,
order.isLong,
order.triggerAboveThreshold,
order.isIncreaseOrder
);
emit UpdateOrder(
order.account,
order.collateralToken,
order.indexToken,
_orderIndex,
0,
0,
0,
false,
false,
false,
order.isMaxOrder
);
}
function getOrderKey(address _account, uint256 index) public pure returns(bytes32){
return keccak256(abi.encodePacked(_account, index));
}
function getAllOrders() public view returns(StructsUtils.Order[] memory){
uint orderLength = EnumerableSet.length(orderKeys);
StructsUtils.Order[] memory openOrders = new StructsUtils.Order[](orderLength);
for(uint i =0;i<orderLength;i++){
openOrders[i] = (orders[EnumerableSet.at(orderKeys, i)]);
}
return openOrders;
}
function executeMultipleOrders(address[] calldata accountAddresses, uint[] calldata orderIndices, address payable _feeReceiver) public onlyOrderKeeper {
uint length = accountAddresses.length;
for(uint i=0;i<length;i++){
try this.executeOrder(accountAddresses[i], orderIndices[i], _feeReceiver){} catch {}
}
}
function liquidateMultiplePositions(bytes32[] calldata keys, address payable _feeReceiver) public onlyLiquidator {
uint length = keys.length;
for(uint i=0;i<length;i++){
try IVault(vault).liquidatePosition(keys[i],_feeReceiver){} catch{}
}
}
function checkSufficientPositionExists(address account, address collateralToken, address indexToken, bool isLong, uint sizeDelta) private view returns(bool) {
StructsUtils.Position memory position = IVault(vault).getPosition(account, collateralToken, indexToken, isLong);
if(position.size < sizeDelta){
return false;
}
return true;
}
function getIncreasePositionCount() public view returns(uint){
return increasePositionRequestKeys.length;
}
function getDecreasePositionCount() public view returns(uint){
return decreasePositionRequestKeys.length;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_utils","type":"address"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint256","name":"_minExecutionFeeMarketOrder","type":"uint256"},{"internalType":"uint256","name":"_minExecutionFeeLimitOrder","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"uint256","name":"_maxProfitMultiplier","type":"uint256"},{"internalType":"uint256","name":"_minPurchaseUSDAmountLimitOrder","type":"uint256"},{"internalType":"uint256","name":"_minPurchaseUSDAmountMarketOrder","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"_collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"acceptablePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockGap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeGap","type":"uint256"}],"name":"CancelDecreasePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"_collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"acceptablePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockGap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeGap","type":"uint256"}],"name":"CancelIncreasePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":true,"internalType":"bool","name":"isIncreaseOrder","type":"bool"},{"indexed":false,"internalType":"bool","name":"isMaxOrder","type":"bool"}],"name":"CancelOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"_collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"acceptablePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"queueIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockTime","type":"uint256"}],"name":"CreateDecreasePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"_collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"acceptablePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"queueIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasPrice","type":"uint256"}],"name":"CreateIncreasePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":true,"internalType":"bool","name":"isIncreaseOrder","type":"bool"},{"indexed":false,"internalType":"bool","name":"isMaxOrder","type":"bool"}],"name":"CreateOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"_collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"acceptablePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockGap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeGap","type":"uint256"}],"name":"ExecuteDecreasePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"_collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"acceptablePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockGap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeGap","type":"uint256"}],"name":"ExecuteIncreasePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":true,"internalType":"bool","name":"isIncreaseOrder","type":"bool"}],"name":"ExecuteOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"prevLeverage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextLeverage","type":"uint256"}],"name":"LeverageDecreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minBlockDelayKeeper","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minTimeDelayPublic","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxTimeDelay","type":"uint256"}],"name":"SetDelayValues","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SetLiquidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SetOrderKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SetPositionKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":true,"internalType":"bool","name":"isIncreaseOrder","type":"bool"},{"indexed":false,"internalType":"bool","name":"isMaxOrder","type":"bool"}],"name":"UpdateOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFees","type":"event"},{"inputs":[],"name":"BASIS_POINTS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"currMarketPrice","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"limitPrice","type":"uint256"}],"name":"_validateLimitOrderPrices","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"currMarketPrice","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"tpPrice","type":"uint256"},{"internalType":"uint256","name":"slPrice","type":"uint256"}],"name":"_validateTPSLOrderPrices","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"},{"internalType":"address payable","name":"_executionFeeReceiver","type":"address"}],"name":"cancelDecreasePosition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"},{"internalType":"address payable","name":"_executionFeeReceiver","type":"address"}],"name":"cancelIncreasePosition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_acceptablePrice","type":"uint256"},{"internalType":"uint256","name":"_executionFee","type":"uint256"}],"name":"createDecreasePosition","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"_acceptablePrice","type":"uint256"},{"internalType":"uint256","name":"takeProfitPrice","type":"uint256"},{"internalType":"uint256","name":"stopLossPrice","type":"uint256"},{"internalType":"uint256","name":"_executionFee","type":"uint256"}],"name":"createIncreasePosition","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"_executionFee","type":"uint256"},{"internalType":"uint256","name":"limitPrice","type":"uint256"},{"internalType":"uint256","name":"tpPrice","type":"uint256"},{"internalType":"uint256","name":"slPrice","type":"uint256"}],"name":"createOrders","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decreasePositionRequestKeysStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"decreasePositionRequests","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"acceptablePrice","type":"uint256"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"decreasePositionsIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"},{"internalType":"address payable","name":"_executionFeeReceiver","type":"address"}],"name":"executeDecreasePosition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endIndex","type":"uint256"},{"internalType":"address payable","name":"_executionFeeReceiver","type":"address"}],"name":"executeDecreasePositions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"},{"internalType":"address payable","name":"_executionFeeReceiver","type":"address"}],"name":"executeIncreasePosition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endIndex","type":"uint256"},{"internalType":"address payable","name":"_executionFeeReceiver","type":"address"}],"name":"executeIncreasePositions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accountAddresses","type":"address[]"},{"internalType":"uint256[]","name":"orderIndices","type":"uint256[]"},{"internalType":"address payable","name":"_feeReceiver","type":"address"}],"name":"executeMultipleOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"address payable","name":"_feeReceiver","type":"address"}],"name":"executeOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllOrders","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"bool","name":"isIncreaseOrder","type":"bool"},{"internalType":"bool","name":"isMaxOrder","type":"bool"}],"internalType":"struct StructsUtils.Order[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDecreasePositionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIncreasePositionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOrderKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"increasePositionBufferBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"increasePositionRequestKeys","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"increasePositionRequestKeysStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"increasePositionRequests","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"acceptablePrice","type":"uint256"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"increasePositionsIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOrderKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPositionKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"keys","type":"bytes32[]"},{"internalType":"address payable","name":"_feeReceiver","type":"address"}],"name":"liquidateMultiplePositions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxProfitMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTimeDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBlockDelayKeeper","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minExecutionFeeLimitOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minExecutionFeeMarketOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPurchaseUSDAmountLimitOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPurchaseUSDAmountMarketOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTimeDelayPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"orders","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"bool","name":"isIncreaseOrder","type":"bool"},{"internalType":"bool","name":"isMaxOrder","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ordersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricefeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBlockDelayKeeper","type":"uint256"},{"internalType":"uint256","name":"_minTimeDelayPublic","type":"uint256"},{"internalType":"uint256","name":"_maxTimeDelay","type":"uint256"}],"name":"setDelayValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setDepositFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setLiquidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxProfitMultiplier","type":"uint256"}],"name":"setMaxTPMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minExecutionFeeLimitOrder","type":"uint256"}],"name":"setMinExecutionFeeLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minExecutionFeeMarketOrder","type":"uint256"}],"name":"setMinExecutionFeeMarketOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketOrder","type":"uint256"},{"internalType":"uint256","name":"_limitOrder","type":"uint256"}],"name":"setMinPurchaseAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setOrderKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPositionKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceFeed","type":"address"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_utils","type":"address"}],"name":"setUtils","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"uint256","name":"_newCollateralAmount","type":"uint256"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"}],"name":"updateOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"utils","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"bool","name":"_maximizePrice","type":"bool"}],"name":"validatePositionOrderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260646004553480156200001657600080fd5b5060405162005d1538038062005d158339810160408190526200003991620000ca565b600180546001600160a01b03199081166001600160a01b039b8c161782556002805482169a8c169a909a17909955600380548a1698909a16979097179098556000805433981697909717909655600691909155600793909355600891909155600955601c55601d91909155601e556200014f565b80516001600160a01b0381168114620000c557600080fd5b919050565b60008060008060008060008060006101208a8c031215620000ea57600080fd5b620000f58a620000ad565b98506200010560208b01620000ad565b97506200011560408b01620000ad565b965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b615bb6806200015f6000396000f3fe6080604052600436106103c35760003560e01c80636817031b116101f2578063ba9aede71161010d578063eea3f2f6116100a0578063fa4445771161006f578063fa44457714610cc9578063faf990f314610cf6578063fbfa77cf14610dd1578063fe13fcb214610df157600080fd5b8063eea3f2f614610c54578063f255527814610c69578063f3883d8b14610c89578063f851a44014610ca957600080fd5b8063cb0269c9116100dc578063cb0269c914610bde578063cefdb8b614610bf4578063e4d8f76814610c14578063ec05d5b214610c3457600080fd5b8063ba9aede714610b72578063c107532914610b88578063c66a29f014610ba8578063c74290a914610bc857600080fd5b8063990269e5116101855780639c3f1e90116101545780639c3f1e9014610a37578063a5a89c0914610b2c578063a915e53b14610b3f578063ae5efa2b14610b5257600080fd5b8063990269e5146109cc5780639a208100146109ec5780639b57862014610a0c5780639c3e86ca14610a2257600080fd5b80637323a7d3116101c15780637323a7d3146109545780637bea0d1c146109745780638d60b3921461099657806398d1e03a146109b657600080fd5b80636817031b146108d457806369953501146108f4578063704b6c0214610914578063724e78da1461093457600080fd5b80634067b132116102e2578063590f21131161027557806360a362e21161024457806360a362e214610851578063633451de146108715780636410659a1461089e57806367a52793146108be57600080fd5b8063590f2113146107975780635a29638d146107cf5780635b4c58df146107ef5780635b8d97751461082457600080fd5b8063490ae210116102b1578063490ae210146107115780634b0f534e14610731578063529a356f146107515780635841fcaa1461078157600080fd5b80634067b1321461069b57806343a28ba9146106bb5780634453a374146106d157806348328acb146106f157600080fd5b806327b42c0f1161035a57806336eba48a1161032957806336eba48a1461060f5780633833f5f51461063f5780633a2a80c71461066f5780633b0befca1461068557600080fd5b806327b42c0f146105a65780633422ead1146105c6578063347c91aa146105e657806335d4a103146105f957600080fd5b80631ce9cb8f116103965780631ce9cb8f146104575780631e261538146104845780631f285106146104a6578063225fc9fd1461058657600080fd5b806304225954146103c85780630d4d003d146103fb578063126082cf1461042b5780631bca8cf014610441575b600080fd5b3480156103d457600080fd5b506103e86103e33660046150c4565b610e11565b6040519081526020015b60405180910390f35b34801561040757600080fd5b5061041b6104163660046150f5565b610e32565b60405190151581526020016103f2565b34801561043757600080fd5b506103e861271081565b34801561044d57600080fd5b506103e860155481565b34801561046357600080fd5b506103e8610472366004615125565b60056020526000908152604090205481565b34801561049057600080fd5b506104a461049f366004615150565b6110e4565b005b3480156104b257600080fd5b506105216104c13660046150c4565b600e602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b03978816989688169795861696949560ff8516956101009095041693908a565b604080516001600160a01b039b8c168152998b1660208b0152978a169789019790975260608801959095529215156080870152951660a085015260c084019490945260e0830193909352610100820192909252610120810191909152610140016103f2565b34801561059257600080fd5b5061041b6105a13660046150f5565b61116e565b3480156105b257600080fd5b5061041b6105c13660046150f5565b611415565b3480156105d257600080fd5b506104a46105e1366004615150565b6117b2565b6103e86105f436600461517e565b611834565b34801561060557600080fd5b506103e8601e5481565b34801561061b57600080fd5b5061041b61062a366004615125565b60106020526000908152604090205460ff1681565b34801561064b57600080fd5b5061041b61065a366004615125565b601a6020526000908152604090205460ff1681565b34801561067b57600080fd5b506103e860125481565b34801561069157600080fd5b506103e8601c5481565b3480156106a757600080fd5b506104a46106b63660046151f8565b61197d565b3480156106c757600080fd5b506103e8601d5481565b3480156106dd57600080fd5b506104a46106ec366004615150565b6119fd565b3480156106fd57600080fd5b506104a461070c3660046150c4565b611a7f565b34801561071d57600080fd5b506104a461072c3660046150c4565b611aae565b34801561073d57600080fd5b506104a461074c3660046150c4565b611add565b34801561075d57600080fd5b5061041b61076c366004615125565b601b6020526000908152604090205460ff1681565b34801561078d57600080fd5b506103e860115481565b3480156107a357600080fd5b506003546107b7906001600160a01b031681565b6040516001600160a01b0390911681526020016103f2565b3480156107db57600080fd5b506002546107b7906001600160a01b031681565b3480156107fb57600080fd5b5061080f61080a366004615224565b611b0c565b604080519283529015156020830152016103f2565b34801561083057600080fd5b506103e861083f366004615125565b60196020526000908152604090205481565b34801561085d57600080fd5b5061041b61086c3660046150f5565b611c50565b34801561087d57600080fd5b506103e861088c366004615125565b600a6020526000908152604090205481565b3480156108aa57600080fd5b506104a46108b9366004615277565b611e8a565b3480156108ca57600080fd5b506103e860065481565b3480156108e057600080fd5b506104a46108ef366004615125565b612495565b34801561090057600080fd5b506104a461090f366004615125565b6124e1565b34801561092057600080fd5b506104a461092f366004615125565b61252d565b34801561094057600080fd5b506104a461094f366004615125565b612579565b34801561096057600080fd5b506104a461096f3660046150f5565b6125c5565b34801561098057600080fd5b50610989612723565b6040516103f291906152b9565b3480156109a257600080fd5b506104a46109b136600461537d565b6128da565b3480156109c257600080fd5b506103e860045481565b3480156109d857600080fd5b506104a46109e73660046150c4565b61290f565b3480156109f857600080fd5b506103e8610a073660046150f5565b61293e565b348015610a1857600080fd5b506103e860145481565b348015610a2e57600080fd5b50600c546103e8565b348015610a4357600080fd5b50610ac2610a523660046150c4565b601660205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b0396871697958716969094169492939192909160ff80821691610100810482169162010000820481169163010000009004168b565b604080516001600160a01b039c8d1681529a8c1660208c015298909a16978901979097526060880195909552608087019390935260a086019190915260c0850152151560e084015215156101008301521515610120820152901515610140820152610160016103f2565b6104a4610b3a36600461539f565b612af8565b6103e8610b4d366004615421565b612eb4565b348015610b5e57600080fd5b506104a4610b6d3660046154c5565b613162565b348015610b7e57600080fd5b506103e860085481565b348015610b9457600080fd5b506104a4610ba3366004615549565b613262565b348015610bb457600080fd5b506103e8610bc3366004615549565b613349565b348015610bd457600080fd5b506103e860095481565b348015610bea57600080fd5b506103e860135481565b348015610c0057600080fd5b506104a4610c0f366004615575565b613390565b348015610c2057600080fd5b506104a4610c2f3660046155a7565b613524565b348015610c4057600080fd5b506104a4610c4f3660046155f3565b6135fe565b348015610c6057600080fd5b50600f546103e8565b348015610c7557600080fd5b506104a4610c8436600461562b565b613642565b348015610c9557600080fd5b506103e8610ca43660046150f5565b6136fe565b348015610cb557600080fd5b506000546107b7906001600160a01b031681565b348015610cd557600080fd5b506103e8610ce4366004615125565b600d6020526000908152604090205481565b348015610d0257600080fd5b50610d74610d113660046150c4565b600b6020526000908152604090208054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169997891698909616969495939460ff90931693919290918a565b604080516001600160a01b039b8c168152998b1660208b0152979099169688019690965260608701949094526080860192909252151560a085015260c084015260e0830152610100820152610120810191909152610140016103f2565b348015610ddd57600080fd5b506001546107b7906001600160a01b031681565b348015610dfd57600080fd5b506104a4610e0c366004615659565b6138b8565b600c8181548110610e2157600080fd5b600091825260209091200154905081565b6000610e3c613957565b6000838152600e602090815260409182902082516101408101845281546001600160a01b039081168083526001840154821694830194909452600283015481169482019490945260038201546060820152600482015460ff8116151560808301526101009081900490941660a0820152600582015460c0820152600682015460e082015260078201549381019390935260080154610120830152610ee45760019150506110d4565b610efd8161010001518261012001518360000151613981565b610f0b5760009150506110d4565b6000848152600e6020908152604080832080546001600160a01b03199081168255600182018054821690556002820180549091169055600381018490556004810180546001600160a81b0319169055600581018490556006810184905560078101849055600801839055835191840151908401516060850151608086015160c0870151610f9e95949392919030906139dd565b60a08301516020840151919250610fbf916001600160a01b03169083613b90565b60e08201516040516000916001600160a01b038716918381818185875af1925050503d806000811461100d576040519150601f19603f3d011682016040523d82523d6000602084013e611012565b606091505b505090508061103c5760405162461bcd60e51b815260040161103390615696565b60405180910390fd5b82600001516001600160a01b03167fbece414bdfb172bf1b798de2a8ecc3c86ec25ad7011ee97f4e3549715137b5ef84602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001514361109f91906156ca565b6101208d01516110af90426156ca565b6040516110c4999897969594939291906156dd565b60405180910390a2600193505050505b6110de6001600755565b92915050565b6000546001600160a01b0316331461110e5760405162461bcd60e51b815260040161103390615733565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f1d5bc0255b943d6a5b5279e8a55d74d620baccbceecb25e87a3558f14c4c118e91015b60405180910390a25050565b6000611178613957565b6000838152600b602090815260409182902082516101408101845281546001600160a01b039081168083526001840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460ff16151560a0840152600681015460c0840152600781015460e08401526008810154610100840152600901546101208301526112185760019150506110d4565b6112318161010001518261012001518360000151613bf3565b61123f5760009150506110d4565b6000848152600b60209081526040822080546001600160a01b03199081168255600182018054821690556002820180549091169055600381018390556004810183905560058101805460ff191690556006810183905560078101839055600881018390556009019190915581516060830151918301516112cb926001600160a01b039091169190613b90565b60e08101516040516000916001600160a01b038616918381818185875af1925050503d8060008114611319576040519150601f19603f3d011682016040523d82523d6000602084013e61131e565b606091505b505090508061133f5760405162461bcd60e51b815260040161103390615696565b81600001516001600160a01b03167fb46dc78d7a64b7dd9e215a1a5955b8e522c417f8260520d97a2ce9a73c72bd1283602001518460400151856060015186608001518760a001518860c001518960e001518a6101000151436113a291906156ca565b6101208c01516113b290426156ca565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352901515608086015260a085015260c084015260e0830152610100820152610120015b60405180910390a26001925050506110de6001600755565b600061141f613957565b6000838152600b602090815260409182902082516101408101845281546001600160a01b039081168083526001840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460ff16151560a0840152600681015460c0840152600781015460e08401526008810154610100840152600901546101208301526114bf5760019150506110d4565b6114d88161010001518261012001518360000151613981565b6114e65760009150506110d4565b6000848152600b6020908152604080832080546001600160a01b031990811682556001808301805483169055600283018054909216909155600382018590556004820185905560058201805460ff19169055600682018590556007820185905560088201859055600990910193909355915483519184015160608501519385015160a086015160808701516115a6966001600160a01b03909516956115919590949390929091613c00565b60208401516001600160a01b03169190613b90565b6115cc81600001518260200151836040015184608001518560a001518660c00151613ca4565b60e08101516040516000916001600160a01b038616918381818185875af1925050503d806000811461161a576040519150601f19603f3d011682016040523d82523d6000602084013e61161f565b606091505b50509050806116405760405162461bcd60e51b815260040161103390615696565b60808201511561174f576000600260009054906101000a90046001600160a01b03166001600160a01b0316635dc271d684608001518560a001518660c00151601c5488606001516116919190615753565b60208901516040516001600160e01b031960e088901b16815260048101959095529215156024850152604484019190915260648301526001600160a01b0316608482015260a4016020604051808303816000875af11580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b919061576a565b905061174d836000015160008560200151866040015187608001518860a00151878a60a0015160095460006001613e60565b505b81600001516001600160a01b03167f02ca30b520a08cead06dc4eb7847b9df09adf21e5e07dd7d2d8c32381fecb75283602001518460400151856060015186608001518760a001518860c001518960e001518a6101000151436113a291906156ca565b6000546001600160a01b031633146117dc5760405162461bcd60e51b815260040161103390615733565b6001600160a01b038216600081815260106020908152604091829020805460ff191685151590811790915591519182527ffbabc02389290a451c6e600d05bf9887b99bfad39d8e1237e4e3df042e4941fe9101611162565b600061183e613957565b600160009054906101000a90046001600160a01b03166001600160a01b031663ef9465c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b59190615793565b156118d25760405162461bcd60e51b8152600401611033906157b0565b6008548210156118f45760405162461bcd60e51b815260040161103390615696565b3482146119135760405162461bcd60e51b8152600401611033906157ce565b611920338989888a6140a9565b6119565760405162461bcd60e51b81526020600482015260076024820152664f4d3a73697a6560c81b6044820152606401611033565b611966338989898989898961415b565b90506119726001600755565b979650505050505050565b6000546001600160a01b031633146119a75760405162461bcd60e51b815260040161103390615733565b60118390556012829055601381905560408051848152602081018490529081018290527fb98e759701eaca2e60c25e91109003c1c7442ef731b5d569037063005da8254d906060015b60405180910390a1505050565b6000546001600160a01b03163314611a275760405162461bcd60e51b815260040161103390615733565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f8c0d56805c3b43d441481229dc64bee168253ffe4305f37ab7cfe63b1c4268c69101611162565b6000546001600160a01b03163314611aa95760405162461bcd60e51b815260040161103390615733565b600855565b6000546001600160a01b03163314611ad85760405162461bcd60e51b815260040161103390615733565b600655565b6000546001600160a01b03163314611b075760405162461bcd60e51b815260040161103390615733565b600955565b600080600083611b8957600354604051631b1c2b2360e11b81526001600160a01b03878116600483015290911690633638564690602401602060405180830381865afa158015611b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b84919061576a565b611bf7565b60035460405163286d59ad60e11b81526001600160a01b038781166004830152909116906350dab35a90602401602060405180830381865afa158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf7919061576a565b9050600087611c0857868210611c0c565b8682115b905080611c435760405162461bcd60e51b815260206004820152600560248201526427a69d383960d91b6044820152606401611033565b9097909650945050505050565b6000611c5a613957565b6000838152600e602090815260409182902082516101408101845281546001600160a01b039081168083526001840154821694830194909452600283015481169482019490945260038201546060820152600482015460ff8116151560808301526101009081900490941660a0820152600582015460c0820152600682015460e082015260078201549381019390935260080154610120830152611d025760019150506110d4565b611d1b8161010001518261012001518360000151613bf3565b611d295760009150506110d4565b6000848152600e602052604080822080546001600160a01b03199081168255600182018054821690556002820180549091169055600381018390556004810180546001600160a81b031916905560058101839055600681018390556007810183905560080182905560e083015190516001600160a01b03861691908381818185875af1925050503d8060008114611ddc576040519150601f19603f3d011682016040523d82523d6000602084013e611de1565b606091505b5050905080611e025760405162461bcd60e51b815260040161103390615696565b81600001516001600160a01b03167fd2c665be6c7dd696827595026252b33f769220c8a4d2813d855c5d393afc158c83602001518460400151856060015186608001518760a001518860c001518960e001518a610100015143611e6591906156ca565b6101208c0151611e7590426156ca565b6040516113fd999897969594939291906156dd565b611e92613957565b336000908152601a602052604090205460ff16611ec15760405162461bcd60e51b8152600401611033906157ed565b6000611ecd8484613349565b60008181526016602090815260409182902082516101608101845281546001600160a01b039081168083526001840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460ff808216151560e0850152610100808304821615159085015262010000820481161515610120850152630100000090910416151561014083015291925090611f9a5760405162461bcd60e51b81526004016110339061580d565b6000611fb98261010001518360a0015184604001518560e00151611b0c565b509050816101200151156121905760015460608301516020840151611fec926001600160a01b0391821692911690613b90565b60015482516020840151604080860151608087015160e088015192516348d91abf60e01b81526001600160a01b039586166004820152938516602485015290841660448401526064830152151560848201529116906348d91abf9060a401600060405180830381600087803b15801561206457600080fd5b505af1158015612078573d6000803e3d6000fd5b5050505060808201511561218b576000600260009054906101000a90046001600160a01b03166001600160a01b0316635dc271d684608001518560e001518660a00151601c5488606001516120cd9190615753565b60208901516040516001600160e01b031960e088901b16815260048101959095529215156024850152604484019190915260648301526001600160a01b0316608482015260a4016020604051808303816000875af1158015612133573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612157919061576a565b9050612189836000015160008560200151866040015187608001518860e00151878a60e0015160095460006001613e60565b505b612282565b60006121b38360000151846020015185604001518660e0015187608001516140a9565b9050806121ce576121c58487856142b9565b50505050612486565b60015483516020850151604080870151608088015160e08901519251633cae4d0160e11b81526000966001600160a01b03169563795c9a029561221e95919490939092909190309060040161582e565b6020604051808303816000875af115801561223d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612261919061576a565b8451602086015191925061227f916001600160a01b03169083613b90565b50505b600083815260166020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101829055600581018290556006810191909155600701805463ffffffff191690556122eb6017846144c8565b5060c08201516040516000916001600160a01b038716918381818185875af1925050503d806000811461233a576040519150601f19603f3d011682016040523d82523d6000602084013e61233f565b606091505b50509050806123605760405162461bcd60e51b815260040161103390615696565b826101200151151583600001516001600160a01b03167ff24fdd74c4b1144dd9f57bc5cc659cf1cfc0a71cff35b366ff486c212510d9bb856020015186604001518a886060015189608001518a60a001518b60c001518b8d60e001518e61010001516040516124289a999897969594939291906001600160a01b039a8b16815298909916602089015260408801969096526060870194909452608086019290925260a085015260c084015260e083015215156101008201529015156101208201526101400190565b60405180910390a38251602084015160408086015161014087015191516000946001600160a01b031693600080516020615b61833981519152936124799391928d9188918291829182918291615868565b60405180910390a3505050505b6124906001600755565b505050565b6000546001600160a01b031633146124bf5760405162461bcd60e51b815260040161103390615733565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461250b5760405162461bcd60e51b815260040161103390615733565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146125575760405162461bcd60e51b815260040161103390615733565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146125a35760405162461bcd60e51b815260040161103390615733565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6125cd613957565b60006125d98284613349565b60008181526016602090815260409182902082516101608101845281546001600160a01b03908116825260018301548116938201939093526002820154909216928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c082015260079091015460ff808216151560e0840152610100808304821615159084015262010000820481161515610120840152630100000090910416158015610140830152919250906126c657336000908152601a602052604090205460ff166126c15760405162461bcd60e51b8152600401611033906157ed565b612708565b336001600160a01b03841614806126ec5750336000908152601a602052604090205460ff165b6127085760405162461bcd60e51b8152600401611033906157ed565b6127138285836142b9565b505061271f6001600755565b5050565b6060600061273160176144d4565b905060008167ffffffffffffffff81111561274e5761274e6158b9565b6040519080825280602002602001820160405280156127d557816020015b604080516101608101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201819052610140820152825260001990920191018161276c5790505b50905060005b828110156128d357601660006127f26017846144de565b8152602080820192909252604090810160002081516101608101835281546001600160a01b03908116825260018301548116948201949094526002820154909316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460ff808216151560e0840152610100808304821615159084015262010000820481161515610120840152630100000090910416151561014082015282518390839081106128b5576128b56158cf565b602002602001018190525080806128cb906158e5565b9150506127db565b5092915050565b6000546001600160a01b031633146129045760405162461bcd60e51b815260040161103390615733565b601d91909155601e55565b6000546001600160a01b031633146129395760405162461bcd60e51b815260040161103390615733565b601c55565b3360009081526010602052604081205460ff1661296d5760405162461bcd60e51b8152600401611033906157ed565b601454600c54808210612982575090506110de565b8085111561298e578094505b84821015612aeb576000600c83815481106129ab576129ab6158cf565b6000918252602090912001546040516327b42c0f60e01b8152600481018290526001600160a01b038716602482015290915030906327b42c0f906044016020604051808303816000875af1925050508015612a23575060408051601f3d908101601f19168201909252612a2091810190615793565b60015b612aac5760405163225fc9fd60e01b8152600481018290526001600160a01b0386166024820152309063225fc9fd906044016020604051808303816000875af1925050508015612a90575060408051601f3d908101601f19168201909252612a8d91810190615793565b60015b612a9a575061298e565b80612aa6575050612aeb565b50612aba565b80612ab8575050612aeb565b505b600c8381548110612acd57612acd6158cf565b600091825260208220015582612ae2816158e5565b9350505061298e565b5060148190559392505050565b612b00613957565b600160009054906101000a90046001600160a01b03166001600160a01b031663ef9465c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b779190615793565b15612b945760405162461bcd60e51b8152600401611033906157b0565b600154604051631e3451e360e01b81526001600160a01b038a8116600483015290911690631e3451e390602401602060405180830381865afa158015612bde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c029190615793565b612c375760405162461bcd60e51b815260206004820152600660248201526509e9a74d2c8f60d31b6044820152606401611033565b833414612c565760405162461bcd60e51b8152600401611033906157ce565b81151580612c6357508015155b15612c86578215612c865760405162461bcd60e51b81526004016110339061580d565b8115801590612c9457508015155b15612ccb57600954612ca7906002615753565b841015612cc65760405162461bcd60e51b815260040161103390615696565b612d01565b8215612cdf57600954612ca7906002615753565b600954841015612d015760405162461bcd60e51b815260040161103390615696565b88888888888787878215612d6357612d246001600160a01b03861633308b6144ea565b601e54881015612d465760405162461bcd60e51b8152600401611033906158fe565b612d5e3389878a8a89898b1560095460016000613e60565b612e97565b60008415612dde57600354604051631b1c2b2360e11b81526001600160a01b038a8116600483015290911690633638564690602401602060405180830381865afa158015612db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd9919061576a565b612e4c565b60035460405163286d59ad60e11b81526001600160a01b038a81166004830152909116906350dab35a90602401602060405180830381865afa158015612e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4c919061576a565b9050612e5a818685856138b8565b8a15612e7757612e77336000888b8b8a898c600954600080613e60565b8915612e9557612e95336000888b8b8a888c15600954600080613e60565b505b5050505050505050612ea96001600755565b505050505050505050565b6000612ebe613957565b600160009054906101000a90046001600160a01b03166001600160a01b031663ef9465c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f359190615793565b15612f525760405162461bcd60e51b8152600401611033906157b0565b600154604051631e3451e360e01b81526001600160a01b038b8116600483015290911690631e3451e390602401602060405180830381865afa158015612f9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc09190615793565b612ff55760405162461bcd60e51b815260206004820152600660248201526509e9a74d2c8f60d31b6044820152606401611033565b3482146130145760405162461bcd60e51b8152600401611033906157ce565b83158015613020575082155b1561305957600954600854613035919061591c565b8210156130545760405162461bcd60e51b8152600401611033906157ce565b6130c1565b831580159061306757508215155b156130875760095461307a906003615753565b600854613035919061591c565b600954613095906002615753565b6008546130a2919061591c565b8210156130c15760405162461bcd60e51b8152600401611033906157ce565b601d548810156130e35760405162461bcd60e51b8152600401611033906158fe565b6130f86001600160a01b038b1633308b6144ea565b600061310c338c8c8c8c8c8c600854614522565b9050841561312b5761312b3360008d8d8c8c8b8e600954600080613e60565b8315613149576131493360008d8d8c8c8a8e15600954600080613e60565b90506131556001600755565b9998505050505050505050565b336000908152601a602052604090205460ff166131915760405162461bcd60e51b8152600401611033906157ed565b8360005b818110156132595730636410659a8888848181106131b5576131b56158cf565b90506020020160208101906131ca9190615125565b8787858181106131dc576131dc6158cf565b6040516001600160e01b031960e087901b1681526001600160a01b039485166004820152602090910292909201356024830152509086166044820152606401600060405180830381600087803b15801561323557600080fd5b505af1925050508015613246575060015b5080613251816158e5565b915050613195565b50505050505050565b6000546001600160a01b0316331461328c5760405162461bcd60e51b815260040161103390615733565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156132d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f4919061576a565b81111561332f5760405162461bcd60e51b815260206004820152600960248201526813d34e985b5bdd5b9d60ba1b6044820152606401611033565b60005461271f906001600160a01b03848116911683613b90565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b613398613957565b6000601660006133a83388613349565b8152602081019190915260400160002080549091506001600160a01b03166133e25760405162461bcd60e51b81526004016110339061580d565b6003810154600782015462010000900460ff161561348e57601e5484101561341c5760405162461bcd60e51b8152600401611033906158fe565b8084116000816134355761343086846156ca565b61343f565b61343f83876156ca565b90508115613466576001840154613461906001600160a01b03163330846144ea565b613484565b83546001850154613484916001600160a01b03918216911683613b90565b5050600382018490555b6005820183905560048201859055600782015460018301546002840154600385015460405160ff62010000860481161515953395600080516020615b618339815191529561350a956001600160a01b039283169591909216938f938f928e92808316926101008104821692630100000090910490911690615868565b60405180910390a3505061351e6001600755565b50505050565b336000908152601b602052604090205460ff166135535760405162461bcd60e51b8152600401611033906157ed565b8160005b818110156135f7576001546001600160a01b031663e75a4a2c868684818110613582576135826158cf565b90506020020135856040518363ffffffff1660e01b81526004016135b99291909182526001600160a01b0316602082015260400190565b600060405180830381600087803b1580156135d357600080fd5b505af19250505080156135e4575060015b50806135ef816158e5565b915050613557565b5050505050565b8115613623578281106124905760405162461bcd60e51b81526004016110339061592f565b8281116124905760405162461bcd60e51b81526004016110339061592f565b6000546001600160a01b0316331461366c5760405162461bcd60e51b815260040161103390615733565b6001600160a01b0382166000908152600560205260408120549081900361369257505050565b6001600160a01b0383166000818152600560205260408120556136b6908383613b90565b604080516001600160a01b038086168252841660208201529081018290527f4f1b51dd7a2fcb861aa2670f668be66835c4ee12b4bbbf037e4d0018f39819e4906060016119f0565b3360009081526010602052604081205460ff1661372d5760405162461bcd60e51b8152600401611033906157ed565b601554600f54808210613742575090506110de565b8085111561374e578094505b848210156138ab576000600f838154811061376b5761376b6158cf565b600091825260209091200154604051630d4d003d60e01b8152600481018290526001600160a01b03871660248201529091503090630d4d003d906044016020604051808303816000875af19250505080156137e3575060408051601f3d908101601f191682019092526137e091810190615793565b60015b61386c57604051633051b17160e11b8152600481018290526001600160a01b038616602482015230906360a362e2906044016020604051808303816000875af1925050508015613850575060408051601f3d908101601f1916820190925261384d91810190615793565b60015b61385a575061374e565b806138665750506138ab565b5061387a565b806138785750506138ab565b505b600f838154811061388d5761388d6158cf565b6000918252602082200155826138a2816158e5565b9350505061374e565b5060158190559392505050565b821561390d5781156138e3578382116138e35760405162461bcd60e51b81526004016110339061592f565b8015613908578381106139085760405162461bcd60e51b81526004016110339061592f565b61351e565b8115613932578382106139325760405162461bcd60e51b81526004016110339061592f565b801561351e5783811161351e5760405162461bcd60e51b81526004016110339061592f565b60026007540361397a57604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b600060135483613991919061591c565b42106139c85760405162461bcd60e51b815260206004820152600660248201526504f4d3a6578760d41b6044820152606401611033565b6139d3848484614643565b90505b9392505050565b60008084613a585760035460405163286d59ad60e11b81526001600160a01b038981166004830152909116906350dab35a90602401602060405180830381865afa158015613a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a53919061576a565b613ac6565b600354604051631b1c2b2360e11b81526001600160a01b03898116600483015290911690633638564690602401602060405180830381865afa158015613aa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac6919061576a565b90508415613af35782811015613aee5760405162461bcd60e51b81526004016110339061594d565b613b13565b82811115613b135760405162461bcd60e51b81526004016110339061594d565b600154604051633cae4d0160e11b81526001600160a01b039091169063795c9a0290613b4d908c908c908c908c908c908c9060040161582e565b6020604051808303816000875af1158015613b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613155919061576a565b6040516001600160a01b03831660248201526044810182905261249090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526146f7565b60006139d3848484614643565b6000613c138787878787876004546147c9565b15613c97576000612710600654612710613c2d91906156ca565b613c379088615753565b613c41919061596c565b90506000613c4f82886156ca565b6001600160a01b038916600090815260056020526040902054909150613c7690829061591c565b6001600160a01b038916600090815260056020526040902055509050613c9a565b50835b9695505050505050565b600082613d1e57600354604051631b1c2b2360e11b81526001600160a01b03878116600483015290911690633638564690602401602060405180830381865afa158015613cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d19919061576a565b613d8c565b60035460405163286d59ad60e11b81526001600160a01b038781166004830152909116906350dab35a90602401602060405180830381865afa158015613d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8c919061576a565b90508215613db95781811115613db45760405162461bcd60e51b81526004016110339061594d565b613dd9565b81811015613dd95760405162461bcd60e51b81526004016110339061594d565b6001546040516348d91abf60e01b81526001600160a01b03898116600483015288811660248301528781166044830152606482018790528515156084830152909116906348d91abf9060a401600060405180830381600087803b158015613e3f57600080fd5b505af1158015613e53573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b038b166000908152601960205260409020548b908b908b908b908b908b908b908b908b908b908b90613e9a81600161591c565b6001600160a01b038d16600090815260196020526040812091909155613ec08d83613349565b90506040518061016001604052808e6001600160a01b031681526020018c6001600160a01b031681526020018b6001600160a01b031681526020018d81526020018a81526020018881526020018681526020018915158152602001871515815260200185151581526020018415158152506016600083815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055506101008201518160070160016101000a81548160ff0219169083151502179055506101208201518160070160026101000a81548160ff0219169083151502179055506101408201518160070160036101000a81548160ff0219169083151502179055509050506140846017826149cd565b5061408f8d836149d9565b505050505050505050505050505050505050505050505050565b600154604051634a3f088d60e01b81526001600160a01b0387811660048301528681166024830152858116604483015284151560648301526000928392911690634a3f088d9060840161016060405180830381865afa158015614110573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061413491906159d1565b9050828160800151101561414c576000915050614152565b60019150505b95945050505050565b6000806040518061014001604052808b6001600160a01b031681526020018a6001600160a01b03168152602001896001600160a01b031681526020018881526020018715158152602001866001600160a01b031681526020018581526020018481526020014381526020014281525090506000806141d883614b5f565b9150915082600001516001600160a01b03167fa04ce72776d6eacadbfa98056fa95f0d1c17edf59cd5a86311242bf7e190272884602001518560400151866060015187608001518860a001518960c001518a60e001518a6001600f8054905061424191906156ca565b604080516001600160a01b039a8b168152988a1660208a0152880196909652931515606087015295909116608085015260a084015260c083019390935260e08201929092526101008101919091524361012082015242610140820152610160015b60405180910390a29b9a5050505050505050505050565b80516001600160a01b03166142e05760405162461bcd60e51b81526004016110339061580d565b600083815260166020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101829055600581018290556006810191909155600701805463ffffffff191690556143496017846144c8565b508061012001511561437657805160608201516020830151614376926001600160a01b0390911691613b90565b805160c08201516040516000926001600160a01b031691908381818185875af1925050503d80600081146143c6576040519150601f19603f3d011682016040523d82523d6000602084013e6143cb565b606091505b50509050806143ec5760405162461bcd60e51b815260040161103390615696565b816101200151151582600001516001600160a01b03167f9baccefcc549a2604631907e5ed0fc1e156943afa56b8da2277721800b5fb0158460200151856040015187876060015188608001518960a001518a60c001518b60e001518c61010001518d61014001516040516144699a99989796959493929190615a80565b60405180910390a38151602083015160408085015161014086015191516000946001600160a01b031693600080516020615b61833981519152936144ba9391928a9188918291829182918291615868565b60405180910390a350505050565b60006139d68383614cb9565b60006110de825490565b60006139d68383614dac565b6040516001600160a01b038085166024830152831660448201526064810182905261351e9085906323b872dd60e01b90608401613bbc565b6000806040518061014001604052808b6001600160a01b031681526020018a6001600160a01b03168152602001896001600160a01b03168152602001888152602001878152602001861515815260200185815260200184815260200143815260200142815250905060008061459683614dd6565b915091508b6001600160a01b03167f030190664051033b47fa29bb4639c1e5c2efac367a1071e4cbb970508870f4db8c8c8c8c8c8c8c8a6001600c805490506145df91906156ca565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352901515608086015260a085015260c084015260e083015261010082015243610120820152426101408201523a610160820152610180016142a2565b60003330148061466257503360009081526010602052604090205460ff165b1561467f574360115485614676919061591c565b111590506139d6565b336001600160a01b038316146146a75760405162461bcd60e51b8152600401611033906157ed565b42601254846146b6919061591c565b11156146ed5760405162461bcd60e51b81526004016110339060208082526004908201526313d34e9960e21b604082015260600190565b5060019392505050565b600061474c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614f159092919063ffffffff16565b805190915015612490578080602001905181019061476a9190615793565b6124905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611033565b6000826000036147db57506001611972565b600154604051634a3f088d60e01b81526001600160a01b038a811660048301528981166024830152878116604483015286151560648301526000921690634a3f088d9060840161016060405180830381865afa15801561483f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486391906159d1565b608081015160a08201519192509060008290036148865760009350505050611972565b6000614892878461591c565b600254604051630a48d5a960e01b81526001600160a01b038e81166004830152602482018e905292935060009290911690630a48d5a990604401602060405180830381865afa1580156148e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061490d919061576a565b9050600061491b828561591c565b905060008461492c61271088615753565b614936919061596c565b90506000826149478b61271061591c565b6149519087615753565b61495b919061596c565b9050818110156149b75760408051858152602081018490529081018290527f3f6e9241514ae172d9872f51274a73fd6b370b2f8fa612669bb17d933078860c9060600160405180910390a1600198505050505050505050611972565b5060009f9e505050505050505050505050505050565b60006139d68383614f24565b6000601660006149e98585613349565b8152602080820192909252604090810160002081516101608101835281546001600160a01b0390811682526001830154811694820185905260028301548116828501819052600384015460608401819052600485015460808501819052600586015460a08601819052600687015460c0870181905260079097015460ff808216151560e0890181905261010080840483161515908a01819052620100008404831615156101208b01819052630100000090940490921615156101408a018190529a51989c50919a968e16997fc9a016c895f4c3fd94ea06c606c2bad25bbfded616bd87d92bbe8845e342d8dd99614ae9998f979695949193919290615a80565b60405180910390a38061012001511515836001600160a01b0316600080516020615b618339815191528360200151846040015186866060015187608001518860a001518960e001518a61010001518b6101400151604051614b5299989796959493929190615868565b60405180910390a3505050565b80516001600160a01b0381166000908152600d6020526040812054909182918290614b8b90600161591c565b6001600160a01b0383166000908152600d60205260408120829055909150614bb38383613349565b6000818152600e602090815260408083208a5181546001600160a01b03199081166001600160a01b03928316178355938c015160018084018054871692841692909217909155928c01516002830180549095169082161790935560608b0151600382015560808b015160048201805460a08e01516001600160a81b0319909116921515610100600160a81b031916929092176101009290951682029490941790935560c08b0151600582015560e08b01516006820155918a0151600783015561012090990151600890910155600f8054988901815590527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802909601869055509492505050565b60008181526001830160205260408120548015614da2576000614cdd6001836156ca565b8554909150600090614cf1906001906156ca565b9050818114614d56576000866000018281548110614d1157614d116158cf565b9060005260206000200154905080876000018481548110614d3457614d346158cf565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614d6757614d67615ad7565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506110de565b60009150506110de565b6000826000018281548110614dc357614dc36158cf565b9060005260206000200154905092915050565b80516001600160a01b0381166000908152600a6020526040812054909182918290614e0290600161591c565b6001600160a01b0383166000908152600a60205260408120829055909150614e2a8383613349565b6000818152600b602090815260408083208a5181546001600160a01b03199081166001600160a01b03928316178355938c015160018084018054871692841692909217909155928c015160028301805490951691161790925560608a0151600383015560808a0151600483015560a08a015160058301805460ff191691151591909117905560c08a0151600683015560e08a015160078301556101008a0151600883015561012090990151600990910155600c8054988901815590527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7909601869055509492505050565b60606139d38484600085614f73565b6000818152600183016020526040812054614f6b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556110de565b5060006110de565b606082471015614fd45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611033565b843b6150225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611033565b600080866001600160a01b0316858760405161503e9190615b11565b60006040518083038185875af1925050503d806000811461507b576040519150601f19603f3d011682016040523d82523d6000602084013e615080565b606091505b50915091506119728282866060831561509a5750816139d6565b8251156150aa5782518084602001fd5b8160405162461bcd60e51b81526004016110339190615b2d565b6000602082840312156150d657600080fd5b5035919050565b6001600160a01b03811681146150f257600080fd5b50565b6000806040838503121561510857600080fd5b82359150602083013561511a816150dd565b809150509250929050565b60006020828403121561513757600080fd5b81356139d6816150dd565b80151581146150f257600080fd5b6000806040838503121561516357600080fd5b823561516e816150dd565b9150602083013561511a81615142565b600080600080600080600060e0888a03121561519957600080fd5b87356151a4816150dd565b965060208801356151b4816150dd565b95506040880135945060608801356151cb81615142565b935060808801356151db816150dd565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121561520d57600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561523a57600080fd5b843561524581615142565b935060208501359250604085013561525c816150dd565b9150606085013561526c81615142565b939692955090935050565b60008060006060848603121561528c57600080fd5b8335615297816150dd565b92506020840135915060408401356152ae816150dd565b809150509250925092565b602080825282518282018190526000919060409081850190868401855b8281101561537057815180516001600160a01b03908116865287820151811688870152868201511686860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e08082015115159086015261010080820151151590860152610120808201511515908601526101409081015115159085015261016090930192908501906001016152d6565b5091979650505050505050565b6000806040838503121561539057600080fd5b50508035926020909101359150565b60008060008060008060008060006101208a8c0312156153be57600080fd5b8935985060208a01356153d0816150dd565b975060408a0135965060608a01356153e7816150dd565b955060808a01356153f781615142565b989b979a50959894979660a0860135965060c08601359560e0810135955061010001359350915050565b60008060008060008060008060006101208a8c03121561544057600080fd5b893561544b816150dd565b985060208a013561545b816150dd565b975060408a0135965060608a0135955060808a01356153f781615142565b60008083601f84011261548b57600080fd5b50813567ffffffffffffffff8111156154a357600080fd5b6020830191508360208260051b85010111156154be57600080fd5b9250929050565b6000806000806000606086880312156154dd57600080fd5b853567ffffffffffffffff808211156154f557600080fd5b61550189838a01615479565b9097509550602088013591508082111561551a57600080fd5b5061552788828901615479565b909450925050604086013561553b816150dd565b809150509295509295909350565b6000806040838503121561555c57600080fd5b8235615567816150dd565b946020939093013593505050565b6000806000806080858703121561558b57600080fd5b5050823594602084013594506040840135936060013592509050565b6000806000604084860312156155bc57600080fd5b833567ffffffffffffffff8111156155d357600080fd5b6155df86828701615479565b90945092505060208401356152ae816150dd565b60008060006060848603121561560857600080fd5b83359250602084013561561a81615142565b929592945050506040919091013590565b6000806040838503121561563e57600080fd5b8235615649816150dd565b9150602083013561511a816150dd565b6000806000806080858703121561566f57600080fd5b84359350602085013561568181615142565b93969395505050506040820135916060013590565b60208082526004908201526327a69d3360e11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156110de576110de6156b4565b6001600160a01b03998a16815297891660208901526040880196909652931515606087015291909516608085015260a084019490945260c083019390935260e08201929092526101008101919091526101200190565b602080825260069082015265424d3a34303360d01b604082015260600190565b80820281158282048414176110de576110de6156b4565b60006020828403121561577c57600080fd5b5051919050565b805161578e81615142565b919050565b6000602082840312156157a557600080fd5b81516139d681615142565b60208082526004908201526304f4d3a360e41b604082015260600190565b60208082526005908201526427a69d32b360d91b604082015260600190565b6020808252600690820152654f4d3a34303360d01b604082015260600190565b60208082526007908201526613d34e99985a5b60ca1b604082015260600190565b6001600160a01b0396871681529486166020860152928516604085015260608401919091521515608083015290911660a082015260c00190565b6001600160a01b03998a16815297909816602088015260408701959095526060860193909352608085019190915260a0840152151560c0830152151560e08201529015156101008201526101200190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600182016158f7576158f76156b4565b5060010190565b6020808252600490820152634f4d3a6360e01b604082015260600190565b808201808211156110de576110de6156b4565b60208082526004908201526304f4d3a760e41b604082015260600190565b6020808252600590820152640424d3a6d760dc1b604082015260600190565b60008261598957634e487b7160e01b600052601260045260246000fd5b500490565b604051610160810167ffffffffffffffff811182821017156159c057634e487b7160e01b600052604160045260246000fd5b60405290565b805161578e816150dd565b600061016082840312156159e457600080fd5b6159ec61598e565b6159f5836159c6565b8152615a03602084016159c6565b6020820152615a14604084016159c6565b6040820152615a2560608401615783565b60608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152506101408084015181830152508091505092915050565b6001600160a01b039a8b16815298909916602089015260408801969096526060870194909452608086019290925260a085015260c0840152151560e083015215156101008201529015156101208201526101400190565b634e487b7160e01b600052603160045260246000fd5b60005b83811015615b08578181015183820152602001615af0565b50506000910152565b60008251615b23818460208701615aed565b9190910192915050565b6020815260008251806020840152615b4c816040850160208701615aed565b601f01601f1916919091016040019291505056fed21a7b68c66e053c73bd8bed4d752fc154d5a35d095063cd99a7b35b3787df27a2646970667358221220de8b3beae66e86e258b7f3ff43efac7d163a5ea2bf67531c3dfbb83f309ee13e64736f6c63430008130033000000000000000000000000c5f444d25d5013c395f70398350d2969ef0f6aa0000000000000000000000000f024541569796286d58fff4b5898a3c3f1635bd1000000000000000000000000dccc1dc6c3518dc160f7d2ec72dac1a6ee9a7b4f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000008ac7230489e80000
Deployed Bytecode
0x6080604052600436106103c35760003560e01c80636817031b116101f2578063ba9aede71161010d578063eea3f2f6116100a0578063fa4445771161006f578063fa44457714610cc9578063faf990f314610cf6578063fbfa77cf14610dd1578063fe13fcb214610df157600080fd5b8063eea3f2f614610c54578063f255527814610c69578063f3883d8b14610c89578063f851a44014610ca957600080fd5b8063cb0269c9116100dc578063cb0269c914610bde578063cefdb8b614610bf4578063e4d8f76814610c14578063ec05d5b214610c3457600080fd5b8063ba9aede714610b72578063c107532914610b88578063c66a29f014610ba8578063c74290a914610bc857600080fd5b8063990269e5116101855780639c3f1e90116101545780639c3f1e9014610a37578063a5a89c0914610b2c578063a915e53b14610b3f578063ae5efa2b14610b5257600080fd5b8063990269e5146109cc5780639a208100146109ec5780639b57862014610a0c5780639c3e86ca14610a2257600080fd5b80637323a7d3116101c15780637323a7d3146109545780637bea0d1c146109745780638d60b3921461099657806398d1e03a146109b657600080fd5b80636817031b146108d457806369953501146108f4578063704b6c0214610914578063724e78da1461093457600080fd5b80634067b132116102e2578063590f21131161027557806360a362e21161024457806360a362e214610851578063633451de146108715780636410659a1461089e57806367a52793146108be57600080fd5b8063590f2113146107975780635a29638d146107cf5780635b4c58df146107ef5780635b8d97751461082457600080fd5b8063490ae210116102b1578063490ae210146107115780634b0f534e14610731578063529a356f146107515780635841fcaa1461078157600080fd5b80634067b1321461069b57806343a28ba9146106bb5780634453a374146106d157806348328acb146106f157600080fd5b806327b42c0f1161035a57806336eba48a1161032957806336eba48a1461060f5780633833f5f51461063f5780633a2a80c71461066f5780633b0befca1461068557600080fd5b806327b42c0f146105a65780633422ead1146105c6578063347c91aa146105e657806335d4a103146105f957600080fd5b80631ce9cb8f116103965780631ce9cb8f146104575780631e261538146104845780631f285106146104a6578063225fc9fd1461058657600080fd5b806304225954146103c85780630d4d003d146103fb578063126082cf1461042b5780631bca8cf014610441575b600080fd5b3480156103d457600080fd5b506103e86103e33660046150c4565b610e11565b6040519081526020015b60405180910390f35b34801561040757600080fd5b5061041b6104163660046150f5565b610e32565b60405190151581526020016103f2565b34801561043757600080fd5b506103e861271081565b34801561044d57600080fd5b506103e860155481565b34801561046357600080fd5b506103e8610472366004615125565b60056020526000908152604090205481565b34801561049057600080fd5b506104a461049f366004615150565b6110e4565b005b3480156104b257600080fd5b506105216104c13660046150c4565b600e602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b03978816989688169795861696949560ff8516956101009095041693908a565b604080516001600160a01b039b8c168152998b1660208b0152978a169789019790975260608801959095529215156080870152951660a085015260c084019490945260e0830193909352610100820192909252610120810191909152610140016103f2565b34801561059257600080fd5b5061041b6105a13660046150f5565b61116e565b3480156105b257600080fd5b5061041b6105c13660046150f5565b611415565b3480156105d257600080fd5b506104a46105e1366004615150565b6117b2565b6103e86105f436600461517e565b611834565b34801561060557600080fd5b506103e8601e5481565b34801561061b57600080fd5b5061041b61062a366004615125565b60106020526000908152604090205460ff1681565b34801561064b57600080fd5b5061041b61065a366004615125565b601a6020526000908152604090205460ff1681565b34801561067b57600080fd5b506103e860125481565b34801561069157600080fd5b506103e8601c5481565b3480156106a757600080fd5b506104a46106b63660046151f8565b61197d565b3480156106c757600080fd5b506103e8601d5481565b3480156106dd57600080fd5b506104a46106ec366004615150565b6119fd565b3480156106fd57600080fd5b506104a461070c3660046150c4565b611a7f565b34801561071d57600080fd5b506104a461072c3660046150c4565b611aae565b34801561073d57600080fd5b506104a461074c3660046150c4565b611add565b34801561075d57600080fd5b5061041b61076c366004615125565b601b6020526000908152604090205460ff1681565b34801561078d57600080fd5b506103e860115481565b3480156107a357600080fd5b506003546107b7906001600160a01b031681565b6040516001600160a01b0390911681526020016103f2565b3480156107db57600080fd5b506002546107b7906001600160a01b031681565b3480156107fb57600080fd5b5061080f61080a366004615224565b611b0c565b604080519283529015156020830152016103f2565b34801561083057600080fd5b506103e861083f366004615125565b60196020526000908152604090205481565b34801561085d57600080fd5b5061041b61086c3660046150f5565b611c50565b34801561087d57600080fd5b506103e861088c366004615125565b600a6020526000908152604090205481565b3480156108aa57600080fd5b506104a46108b9366004615277565b611e8a565b3480156108ca57600080fd5b506103e860065481565b3480156108e057600080fd5b506104a46108ef366004615125565b612495565b34801561090057600080fd5b506104a461090f366004615125565b6124e1565b34801561092057600080fd5b506104a461092f366004615125565b61252d565b34801561094057600080fd5b506104a461094f366004615125565b612579565b34801561096057600080fd5b506104a461096f3660046150f5565b6125c5565b34801561098057600080fd5b50610989612723565b6040516103f291906152b9565b3480156109a257600080fd5b506104a46109b136600461537d565b6128da565b3480156109c257600080fd5b506103e860045481565b3480156109d857600080fd5b506104a46109e73660046150c4565b61290f565b3480156109f857600080fd5b506103e8610a073660046150f5565b61293e565b348015610a1857600080fd5b506103e860145481565b348015610a2e57600080fd5b50600c546103e8565b348015610a4357600080fd5b50610ac2610a523660046150c4565b601660205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b0396871697958716969094169492939192909160ff80821691610100810482169162010000820481169163010000009004168b565b604080516001600160a01b039c8d1681529a8c1660208c015298909a16978901979097526060880195909552608087019390935260a086019190915260c0850152151560e084015215156101008301521515610120820152901515610140820152610160016103f2565b6104a4610b3a36600461539f565b612af8565b6103e8610b4d366004615421565b612eb4565b348015610b5e57600080fd5b506104a4610b6d3660046154c5565b613162565b348015610b7e57600080fd5b506103e860085481565b348015610b9457600080fd5b506104a4610ba3366004615549565b613262565b348015610bb457600080fd5b506103e8610bc3366004615549565b613349565b348015610bd457600080fd5b506103e860095481565b348015610bea57600080fd5b506103e860135481565b348015610c0057600080fd5b506104a4610c0f366004615575565b613390565b348015610c2057600080fd5b506104a4610c2f3660046155a7565b613524565b348015610c4057600080fd5b506104a4610c4f3660046155f3565b6135fe565b348015610c6057600080fd5b50600f546103e8565b348015610c7557600080fd5b506104a4610c8436600461562b565b613642565b348015610c9557600080fd5b506103e8610ca43660046150f5565b6136fe565b348015610cb557600080fd5b506000546107b7906001600160a01b031681565b348015610cd557600080fd5b506103e8610ce4366004615125565b600d6020526000908152604090205481565b348015610d0257600080fd5b50610d74610d113660046150c4565b600b6020526000908152604090208054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169997891698909616969495939460ff90931693919290918a565b604080516001600160a01b039b8c168152998b1660208b0152979099169688019690965260608701949094526080860192909252151560a085015260c084015260e0830152610100820152610120810191909152610140016103f2565b348015610ddd57600080fd5b506001546107b7906001600160a01b031681565b348015610dfd57600080fd5b506104a4610e0c366004615659565b6138b8565b600c8181548110610e2157600080fd5b600091825260209091200154905081565b6000610e3c613957565b6000838152600e602090815260409182902082516101408101845281546001600160a01b039081168083526001840154821694830194909452600283015481169482019490945260038201546060820152600482015460ff8116151560808301526101009081900490941660a0820152600582015460c0820152600682015460e082015260078201549381019390935260080154610120830152610ee45760019150506110d4565b610efd8161010001518261012001518360000151613981565b610f0b5760009150506110d4565b6000848152600e6020908152604080832080546001600160a01b03199081168255600182018054821690556002820180549091169055600381018490556004810180546001600160a81b0319169055600581018490556006810184905560078101849055600801839055835191840151908401516060850151608086015160c0870151610f9e95949392919030906139dd565b60a08301516020840151919250610fbf916001600160a01b03169083613b90565b60e08201516040516000916001600160a01b038716918381818185875af1925050503d806000811461100d576040519150601f19603f3d011682016040523d82523d6000602084013e611012565b606091505b505090508061103c5760405162461bcd60e51b815260040161103390615696565b60405180910390fd5b82600001516001600160a01b03167fbece414bdfb172bf1b798de2a8ecc3c86ec25ad7011ee97f4e3549715137b5ef84602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001514361109f91906156ca565b6101208d01516110af90426156ca565b6040516110c4999897969594939291906156dd565b60405180910390a2600193505050505b6110de6001600755565b92915050565b6000546001600160a01b0316331461110e5760405162461bcd60e51b815260040161103390615733565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f1d5bc0255b943d6a5b5279e8a55d74d620baccbceecb25e87a3558f14c4c118e91015b60405180910390a25050565b6000611178613957565b6000838152600b602090815260409182902082516101408101845281546001600160a01b039081168083526001840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460ff16151560a0840152600681015460c0840152600781015460e08401526008810154610100840152600901546101208301526112185760019150506110d4565b6112318161010001518261012001518360000151613bf3565b61123f5760009150506110d4565b6000848152600b60209081526040822080546001600160a01b03199081168255600182018054821690556002820180549091169055600381018390556004810183905560058101805460ff191690556006810183905560078101839055600881018390556009019190915581516060830151918301516112cb926001600160a01b039091169190613b90565b60e08101516040516000916001600160a01b038616918381818185875af1925050503d8060008114611319576040519150601f19603f3d011682016040523d82523d6000602084013e61131e565b606091505b505090508061133f5760405162461bcd60e51b815260040161103390615696565b81600001516001600160a01b03167fb46dc78d7a64b7dd9e215a1a5955b8e522c417f8260520d97a2ce9a73c72bd1283602001518460400151856060015186608001518760a001518860c001518960e001518a6101000151436113a291906156ca565b6101208c01516113b290426156ca565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352901515608086015260a085015260c084015260e0830152610100820152610120015b60405180910390a26001925050506110de6001600755565b600061141f613957565b6000838152600b602090815260409182902082516101408101845281546001600160a01b039081168083526001840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460ff16151560a0840152600681015460c0840152600781015460e08401526008810154610100840152600901546101208301526114bf5760019150506110d4565b6114d88161010001518261012001518360000151613981565b6114e65760009150506110d4565b6000848152600b6020908152604080832080546001600160a01b031990811682556001808301805483169055600283018054909216909155600382018590556004820185905560058201805460ff19169055600682018590556007820185905560088201859055600990910193909355915483519184015160608501519385015160a086015160808701516115a6966001600160a01b03909516956115919590949390929091613c00565b60208401516001600160a01b03169190613b90565b6115cc81600001518260200151836040015184608001518560a001518660c00151613ca4565b60e08101516040516000916001600160a01b038616918381818185875af1925050503d806000811461161a576040519150601f19603f3d011682016040523d82523d6000602084013e61161f565b606091505b50509050806116405760405162461bcd60e51b815260040161103390615696565b60808201511561174f576000600260009054906101000a90046001600160a01b03166001600160a01b0316635dc271d684608001518560a001518660c00151601c5488606001516116919190615753565b60208901516040516001600160e01b031960e088901b16815260048101959095529215156024850152604484019190915260648301526001600160a01b0316608482015260a4016020604051808303816000875af11580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b919061576a565b905061174d836000015160008560200151866040015187608001518860a00151878a60a0015160095460006001613e60565b505b81600001516001600160a01b03167f02ca30b520a08cead06dc4eb7847b9df09adf21e5e07dd7d2d8c32381fecb75283602001518460400151856060015186608001518760a001518860c001518960e001518a6101000151436113a291906156ca565b6000546001600160a01b031633146117dc5760405162461bcd60e51b815260040161103390615733565b6001600160a01b038216600081815260106020908152604091829020805460ff191685151590811790915591519182527ffbabc02389290a451c6e600d05bf9887b99bfad39d8e1237e4e3df042e4941fe9101611162565b600061183e613957565b600160009054906101000a90046001600160a01b03166001600160a01b031663ef9465c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b59190615793565b156118d25760405162461bcd60e51b8152600401611033906157b0565b6008548210156118f45760405162461bcd60e51b815260040161103390615696565b3482146119135760405162461bcd60e51b8152600401611033906157ce565b611920338989888a6140a9565b6119565760405162461bcd60e51b81526020600482015260076024820152664f4d3a73697a6560c81b6044820152606401611033565b611966338989898989898961415b565b90506119726001600755565b979650505050505050565b6000546001600160a01b031633146119a75760405162461bcd60e51b815260040161103390615733565b60118390556012829055601381905560408051848152602081018490529081018290527fb98e759701eaca2e60c25e91109003c1c7442ef731b5d569037063005da8254d906060015b60405180910390a1505050565b6000546001600160a01b03163314611a275760405162461bcd60e51b815260040161103390615733565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f8c0d56805c3b43d441481229dc64bee168253ffe4305f37ab7cfe63b1c4268c69101611162565b6000546001600160a01b03163314611aa95760405162461bcd60e51b815260040161103390615733565b600855565b6000546001600160a01b03163314611ad85760405162461bcd60e51b815260040161103390615733565b600655565b6000546001600160a01b03163314611b075760405162461bcd60e51b815260040161103390615733565b600955565b600080600083611b8957600354604051631b1c2b2360e11b81526001600160a01b03878116600483015290911690633638564690602401602060405180830381865afa158015611b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b84919061576a565b611bf7565b60035460405163286d59ad60e11b81526001600160a01b038781166004830152909116906350dab35a90602401602060405180830381865afa158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf7919061576a565b9050600087611c0857868210611c0c565b8682115b905080611c435760405162461bcd60e51b815260206004820152600560248201526427a69d383960d91b6044820152606401611033565b9097909650945050505050565b6000611c5a613957565b6000838152600e602090815260409182902082516101408101845281546001600160a01b039081168083526001840154821694830194909452600283015481169482019490945260038201546060820152600482015460ff8116151560808301526101009081900490941660a0820152600582015460c0820152600682015460e082015260078201549381019390935260080154610120830152611d025760019150506110d4565b611d1b8161010001518261012001518360000151613bf3565b611d295760009150506110d4565b6000848152600e602052604080822080546001600160a01b03199081168255600182018054821690556002820180549091169055600381018390556004810180546001600160a81b031916905560058101839055600681018390556007810183905560080182905560e083015190516001600160a01b03861691908381818185875af1925050503d8060008114611ddc576040519150601f19603f3d011682016040523d82523d6000602084013e611de1565b606091505b5050905080611e025760405162461bcd60e51b815260040161103390615696565b81600001516001600160a01b03167fd2c665be6c7dd696827595026252b33f769220c8a4d2813d855c5d393afc158c83602001518460400151856060015186608001518760a001518860c001518960e001518a610100015143611e6591906156ca565b6101208c0151611e7590426156ca565b6040516113fd999897969594939291906156dd565b611e92613957565b336000908152601a602052604090205460ff16611ec15760405162461bcd60e51b8152600401611033906157ed565b6000611ecd8484613349565b60008181526016602090815260409182902082516101608101845281546001600160a01b039081168083526001840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460ff808216151560e0850152610100808304821615159085015262010000820481161515610120850152630100000090910416151561014083015291925090611f9a5760405162461bcd60e51b81526004016110339061580d565b6000611fb98261010001518360a0015184604001518560e00151611b0c565b509050816101200151156121905760015460608301516020840151611fec926001600160a01b0391821692911690613b90565b60015482516020840151604080860151608087015160e088015192516348d91abf60e01b81526001600160a01b039586166004820152938516602485015290841660448401526064830152151560848201529116906348d91abf9060a401600060405180830381600087803b15801561206457600080fd5b505af1158015612078573d6000803e3d6000fd5b5050505060808201511561218b576000600260009054906101000a90046001600160a01b03166001600160a01b0316635dc271d684608001518560e001518660a00151601c5488606001516120cd9190615753565b60208901516040516001600160e01b031960e088901b16815260048101959095529215156024850152604484019190915260648301526001600160a01b0316608482015260a4016020604051808303816000875af1158015612133573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612157919061576a565b9050612189836000015160008560200151866040015187608001518860e00151878a60e0015160095460006001613e60565b505b612282565b60006121b38360000151846020015185604001518660e0015187608001516140a9565b9050806121ce576121c58487856142b9565b50505050612486565b60015483516020850151604080870151608088015160e08901519251633cae4d0160e11b81526000966001600160a01b03169563795c9a029561221e95919490939092909190309060040161582e565b6020604051808303816000875af115801561223d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612261919061576a565b8451602086015191925061227f916001600160a01b03169083613b90565b50505b600083815260166020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101829055600581018290556006810191909155600701805463ffffffff191690556122eb6017846144c8565b5060c08201516040516000916001600160a01b038716918381818185875af1925050503d806000811461233a576040519150601f19603f3d011682016040523d82523d6000602084013e61233f565b606091505b50509050806123605760405162461bcd60e51b815260040161103390615696565b826101200151151583600001516001600160a01b03167ff24fdd74c4b1144dd9f57bc5cc659cf1cfc0a71cff35b366ff486c212510d9bb856020015186604001518a886060015189608001518a60a001518b60c001518b8d60e001518e61010001516040516124289a999897969594939291906001600160a01b039a8b16815298909916602089015260408801969096526060870194909452608086019290925260a085015260c084015260e083015215156101008201529015156101208201526101400190565b60405180910390a38251602084015160408086015161014087015191516000946001600160a01b031693600080516020615b61833981519152936124799391928d9188918291829182918291615868565b60405180910390a3505050505b6124906001600755565b505050565b6000546001600160a01b031633146124bf5760405162461bcd60e51b815260040161103390615733565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461250b5760405162461bcd60e51b815260040161103390615733565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146125575760405162461bcd60e51b815260040161103390615733565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146125a35760405162461bcd60e51b815260040161103390615733565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6125cd613957565b60006125d98284613349565b60008181526016602090815260409182902082516101608101845281546001600160a01b03908116825260018301548116938201939093526002820154909216928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c082015260079091015460ff808216151560e0840152610100808304821615159084015262010000820481161515610120840152630100000090910416158015610140830152919250906126c657336000908152601a602052604090205460ff166126c15760405162461bcd60e51b8152600401611033906157ed565b612708565b336001600160a01b03841614806126ec5750336000908152601a602052604090205460ff165b6127085760405162461bcd60e51b8152600401611033906157ed565b6127138285836142b9565b505061271f6001600755565b5050565b6060600061273160176144d4565b905060008167ffffffffffffffff81111561274e5761274e6158b9565b6040519080825280602002602001820160405280156127d557816020015b604080516101608101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201819052610140820152825260001990920191018161276c5790505b50905060005b828110156128d357601660006127f26017846144de565b8152602080820192909252604090810160002081516101608101835281546001600160a01b03908116825260018301548116948201949094526002820154909316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460ff808216151560e0840152610100808304821615159084015262010000820481161515610120840152630100000090910416151561014082015282518390839081106128b5576128b56158cf565b602002602001018190525080806128cb906158e5565b9150506127db565b5092915050565b6000546001600160a01b031633146129045760405162461bcd60e51b815260040161103390615733565b601d91909155601e55565b6000546001600160a01b031633146129395760405162461bcd60e51b815260040161103390615733565b601c55565b3360009081526010602052604081205460ff1661296d5760405162461bcd60e51b8152600401611033906157ed565b601454600c54808210612982575090506110de565b8085111561298e578094505b84821015612aeb576000600c83815481106129ab576129ab6158cf565b6000918252602090912001546040516327b42c0f60e01b8152600481018290526001600160a01b038716602482015290915030906327b42c0f906044016020604051808303816000875af1925050508015612a23575060408051601f3d908101601f19168201909252612a2091810190615793565b60015b612aac5760405163225fc9fd60e01b8152600481018290526001600160a01b0386166024820152309063225fc9fd906044016020604051808303816000875af1925050508015612a90575060408051601f3d908101601f19168201909252612a8d91810190615793565b60015b612a9a575061298e565b80612aa6575050612aeb565b50612aba565b80612ab8575050612aeb565b505b600c8381548110612acd57612acd6158cf565b600091825260208220015582612ae2816158e5565b9350505061298e565b5060148190559392505050565b612b00613957565b600160009054906101000a90046001600160a01b03166001600160a01b031663ef9465c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b779190615793565b15612b945760405162461bcd60e51b8152600401611033906157b0565b600154604051631e3451e360e01b81526001600160a01b038a8116600483015290911690631e3451e390602401602060405180830381865afa158015612bde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c029190615793565b612c375760405162461bcd60e51b815260206004820152600660248201526509e9a74d2c8f60d31b6044820152606401611033565b833414612c565760405162461bcd60e51b8152600401611033906157ce565b81151580612c6357508015155b15612c86578215612c865760405162461bcd60e51b81526004016110339061580d565b8115801590612c9457508015155b15612ccb57600954612ca7906002615753565b841015612cc65760405162461bcd60e51b815260040161103390615696565b612d01565b8215612cdf57600954612ca7906002615753565b600954841015612d015760405162461bcd60e51b815260040161103390615696565b88888888888787878215612d6357612d246001600160a01b03861633308b6144ea565b601e54881015612d465760405162461bcd60e51b8152600401611033906158fe565b612d5e3389878a8a89898b1560095460016000613e60565b612e97565b60008415612dde57600354604051631b1c2b2360e11b81526001600160a01b038a8116600483015290911690633638564690602401602060405180830381865afa158015612db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd9919061576a565b612e4c565b60035460405163286d59ad60e11b81526001600160a01b038a81166004830152909116906350dab35a90602401602060405180830381865afa158015612e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4c919061576a565b9050612e5a818685856138b8565b8a15612e7757612e77336000888b8b8a898c600954600080613e60565b8915612e9557612e95336000888b8b8a888c15600954600080613e60565b505b5050505050505050612ea96001600755565b505050505050505050565b6000612ebe613957565b600160009054906101000a90046001600160a01b03166001600160a01b031663ef9465c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f359190615793565b15612f525760405162461bcd60e51b8152600401611033906157b0565b600154604051631e3451e360e01b81526001600160a01b038b8116600483015290911690631e3451e390602401602060405180830381865afa158015612f9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc09190615793565b612ff55760405162461bcd60e51b815260206004820152600660248201526509e9a74d2c8f60d31b6044820152606401611033565b3482146130145760405162461bcd60e51b8152600401611033906157ce565b83158015613020575082155b1561305957600954600854613035919061591c565b8210156130545760405162461bcd60e51b8152600401611033906157ce565b6130c1565b831580159061306757508215155b156130875760095461307a906003615753565b600854613035919061591c565b600954613095906002615753565b6008546130a2919061591c565b8210156130c15760405162461bcd60e51b8152600401611033906157ce565b601d548810156130e35760405162461bcd60e51b8152600401611033906158fe565b6130f86001600160a01b038b1633308b6144ea565b600061310c338c8c8c8c8c8c600854614522565b9050841561312b5761312b3360008d8d8c8c8b8e600954600080613e60565b8315613149576131493360008d8d8c8c8a8e15600954600080613e60565b90506131556001600755565b9998505050505050505050565b336000908152601a602052604090205460ff166131915760405162461bcd60e51b8152600401611033906157ed565b8360005b818110156132595730636410659a8888848181106131b5576131b56158cf565b90506020020160208101906131ca9190615125565b8787858181106131dc576131dc6158cf565b6040516001600160e01b031960e087901b1681526001600160a01b039485166004820152602090910292909201356024830152509086166044820152606401600060405180830381600087803b15801561323557600080fd5b505af1925050508015613246575060015b5080613251816158e5565b915050613195565b50505050505050565b6000546001600160a01b0316331461328c5760405162461bcd60e51b815260040161103390615733565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156132d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f4919061576a565b81111561332f5760405162461bcd60e51b815260206004820152600960248201526813d34e985b5bdd5b9d60ba1b6044820152606401611033565b60005461271f906001600160a01b03848116911683613b90565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b613398613957565b6000601660006133a83388613349565b8152602081019190915260400160002080549091506001600160a01b03166133e25760405162461bcd60e51b81526004016110339061580d565b6003810154600782015462010000900460ff161561348e57601e5484101561341c5760405162461bcd60e51b8152600401611033906158fe565b8084116000816134355761343086846156ca565b61343f565b61343f83876156ca565b90508115613466576001840154613461906001600160a01b03163330846144ea565b613484565b83546001850154613484916001600160a01b03918216911683613b90565b5050600382018490555b6005820183905560048201859055600782015460018301546002840154600385015460405160ff62010000860481161515953395600080516020615b618339815191529561350a956001600160a01b039283169591909216938f938f928e92808316926101008104821692630100000090910490911690615868565b60405180910390a3505061351e6001600755565b50505050565b336000908152601b602052604090205460ff166135535760405162461bcd60e51b8152600401611033906157ed565b8160005b818110156135f7576001546001600160a01b031663e75a4a2c868684818110613582576135826158cf565b90506020020135856040518363ffffffff1660e01b81526004016135b99291909182526001600160a01b0316602082015260400190565b600060405180830381600087803b1580156135d357600080fd5b505af19250505080156135e4575060015b50806135ef816158e5565b915050613557565b5050505050565b8115613623578281106124905760405162461bcd60e51b81526004016110339061592f565b8281116124905760405162461bcd60e51b81526004016110339061592f565b6000546001600160a01b0316331461366c5760405162461bcd60e51b815260040161103390615733565b6001600160a01b0382166000908152600560205260408120549081900361369257505050565b6001600160a01b0383166000818152600560205260408120556136b6908383613b90565b604080516001600160a01b038086168252841660208201529081018290527f4f1b51dd7a2fcb861aa2670f668be66835c4ee12b4bbbf037e4d0018f39819e4906060016119f0565b3360009081526010602052604081205460ff1661372d5760405162461bcd60e51b8152600401611033906157ed565b601554600f54808210613742575090506110de565b8085111561374e578094505b848210156138ab576000600f838154811061376b5761376b6158cf565b600091825260209091200154604051630d4d003d60e01b8152600481018290526001600160a01b03871660248201529091503090630d4d003d906044016020604051808303816000875af19250505080156137e3575060408051601f3d908101601f191682019092526137e091810190615793565b60015b61386c57604051633051b17160e11b8152600481018290526001600160a01b038616602482015230906360a362e2906044016020604051808303816000875af1925050508015613850575060408051601f3d908101601f1916820190925261384d91810190615793565b60015b61385a575061374e565b806138665750506138ab565b5061387a565b806138785750506138ab565b505b600f838154811061388d5761388d6158cf565b6000918252602082200155826138a2816158e5565b9350505061374e565b5060158190559392505050565b821561390d5781156138e3578382116138e35760405162461bcd60e51b81526004016110339061592f565b8015613908578381106139085760405162461bcd60e51b81526004016110339061592f565b61351e565b8115613932578382106139325760405162461bcd60e51b81526004016110339061592f565b801561351e5783811161351e5760405162461bcd60e51b81526004016110339061592f565b60026007540361397a57604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b600060135483613991919061591c565b42106139c85760405162461bcd60e51b815260206004820152600660248201526504f4d3a6578760d41b6044820152606401611033565b6139d3848484614643565b90505b9392505050565b60008084613a585760035460405163286d59ad60e11b81526001600160a01b038981166004830152909116906350dab35a90602401602060405180830381865afa158015613a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a53919061576a565b613ac6565b600354604051631b1c2b2360e11b81526001600160a01b03898116600483015290911690633638564690602401602060405180830381865afa158015613aa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac6919061576a565b90508415613af35782811015613aee5760405162461bcd60e51b81526004016110339061594d565b613b13565b82811115613b135760405162461bcd60e51b81526004016110339061594d565b600154604051633cae4d0160e11b81526001600160a01b039091169063795c9a0290613b4d908c908c908c908c908c908c9060040161582e565b6020604051808303816000875af1158015613b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613155919061576a565b6040516001600160a01b03831660248201526044810182905261249090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526146f7565b60006139d3848484614643565b6000613c138787878787876004546147c9565b15613c97576000612710600654612710613c2d91906156ca565b613c379088615753565b613c41919061596c565b90506000613c4f82886156ca565b6001600160a01b038916600090815260056020526040902054909150613c7690829061591c565b6001600160a01b038916600090815260056020526040902055509050613c9a565b50835b9695505050505050565b600082613d1e57600354604051631b1c2b2360e11b81526001600160a01b03878116600483015290911690633638564690602401602060405180830381865afa158015613cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d19919061576a565b613d8c565b60035460405163286d59ad60e11b81526001600160a01b038781166004830152909116906350dab35a90602401602060405180830381865afa158015613d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8c919061576a565b90508215613db95781811115613db45760405162461bcd60e51b81526004016110339061594d565b613dd9565b81811015613dd95760405162461bcd60e51b81526004016110339061594d565b6001546040516348d91abf60e01b81526001600160a01b03898116600483015288811660248301528781166044830152606482018790528515156084830152909116906348d91abf9060a401600060405180830381600087803b158015613e3f57600080fd5b505af1158015613e53573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b038b166000908152601960205260409020548b908b908b908b908b908b908b908b908b908b908b90613e9a81600161591c565b6001600160a01b038d16600090815260196020526040812091909155613ec08d83613349565b90506040518061016001604052808e6001600160a01b031681526020018c6001600160a01b031681526020018b6001600160a01b031681526020018d81526020018a81526020018881526020018681526020018915158152602001871515815260200185151581526020018415158152506016600083815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055506101008201518160070160016101000a81548160ff0219169083151502179055506101208201518160070160026101000a81548160ff0219169083151502179055506101408201518160070160036101000a81548160ff0219169083151502179055509050506140846017826149cd565b5061408f8d836149d9565b505050505050505050505050505050505050505050505050565b600154604051634a3f088d60e01b81526001600160a01b0387811660048301528681166024830152858116604483015284151560648301526000928392911690634a3f088d9060840161016060405180830381865afa158015614110573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061413491906159d1565b9050828160800151101561414c576000915050614152565b60019150505b95945050505050565b6000806040518061014001604052808b6001600160a01b031681526020018a6001600160a01b03168152602001896001600160a01b031681526020018881526020018715158152602001866001600160a01b031681526020018581526020018481526020014381526020014281525090506000806141d883614b5f565b9150915082600001516001600160a01b03167fa04ce72776d6eacadbfa98056fa95f0d1c17edf59cd5a86311242bf7e190272884602001518560400151866060015187608001518860a001518960c001518a60e001518a6001600f8054905061424191906156ca565b604080516001600160a01b039a8b168152988a1660208a0152880196909652931515606087015295909116608085015260a084015260c083019390935260e08201929092526101008101919091524361012082015242610140820152610160015b60405180910390a29b9a5050505050505050505050565b80516001600160a01b03166142e05760405162461bcd60e51b81526004016110339061580d565b600083815260166020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101829055600581018290556006810191909155600701805463ffffffff191690556143496017846144c8565b508061012001511561437657805160608201516020830151614376926001600160a01b0390911691613b90565b805160c08201516040516000926001600160a01b031691908381818185875af1925050503d80600081146143c6576040519150601f19603f3d011682016040523d82523d6000602084013e6143cb565b606091505b50509050806143ec5760405162461bcd60e51b815260040161103390615696565b816101200151151582600001516001600160a01b03167f9baccefcc549a2604631907e5ed0fc1e156943afa56b8da2277721800b5fb0158460200151856040015187876060015188608001518960a001518a60c001518b60e001518c61010001518d61014001516040516144699a99989796959493929190615a80565b60405180910390a38151602083015160408085015161014086015191516000946001600160a01b031693600080516020615b61833981519152936144ba9391928a9188918291829182918291615868565b60405180910390a350505050565b60006139d68383614cb9565b60006110de825490565b60006139d68383614dac565b6040516001600160a01b038085166024830152831660448201526064810182905261351e9085906323b872dd60e01b90608401613bbc565b6000806040518061014001604052808b6001600160a01b031681526020018a6001600160a01b03168152602001896001600160a01b03168152602001888152602001878152602001861515815260200185815260200184815260200143815260200142815250905060008061459683614dd6565b915091508b6001600160a01b03167f030190664051033b47fa29bb4639c1e5c2efac367a1071e4cbb970508870f4db8c8c8c8c8c8c8c8a6001600c805490506145df91906156ca565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352901515608086015260a085015260c084015260e083015261010082015243610120820152426101408201523a610160820152610180016142a2565b60003330148061466257503360009081526010602052604090205460ff165b1561467f574360115485614676919061591c565b111590506139d6565b336001600160a01b038316146146a75760405162461bcd60e51b8152600401611033906157ed565b42601254846146b6919061591c565b11156146ed5760405162461bcd60e51b81526004016110339060208082526004908201526313d34e9960e21b604082015260600190565b5060019392505050565b600061474c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614f159092919063ffffffff16565b805190915015612490578080602001905181019061476a9190615793565b6124905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611033565b6000826000036147db57506001611972565b600154604051634a3f088d60e01b81526001600160a01b038a811660048301528981166024830152878116604483015286151560648301526000921690634a3f088d9060840161016060405180830381865afa15801561483f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486391906159d1565b608081015160a08201519192509060008290036148865760009350505050611972565b6000614892878461591c565b600254604051630a48d5a960e01b81526001600160a01b038e81166004830152602482018e905292935060009290911690630a48d5a990604401602060405180830381865afa1580156148e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061490d919061576a565b9050600061491b828561591c565b905060008461492c61271088615753565b614936919061596c565b90506000826149478b61271061591c565b6149519087615753565b61495b919061596c565b9050818110156149b75760408051858152602081018490529081018290527f3f6e9241514ae172d9872f51274a73fd6b370b2f8fa612669bb17d933078860c9060600160405180910390a1600198505050505050505050611972565b5060009f9e505050505050505050505050505050565b60006139d68383614f24565b6000601660006149e98585613349565b8152602080820192909252604090810160002081516101608101835281546001600160a01b0390811682526001830154811694820185905260028301548116828501819052600384015460608401819052600485015460808501819052600586015460a08601819052600687015460c0870181905260079097015460ff808216151560e0890181905261010080840483161515908a01819052620100008404831615156101208b01819052630100000090940490921615156101408a018190529a51989c50919a968e16997fc9a016c895f4c3fd94ea06c606c2bad25bbfded616bd87d92bbe8845e342d8dd99614ae9998f979695949193919290615a80565b60405180910390a38061012001511515836001600160a01b0316600080516020615b618339815191528360200151846040015186866060015187608001518860a001518960e001518a61010001518b6101400151604051614b5299989796959493929190615868565b60405180910390a3505050565b80516001600160a01b0381166000908152600d6020526040812054909182918290614b8b90600161591c565b6001600160a01b0383166000908152600d60205260408120829055909150614bb38383613349565b6000818152600e602090815260408083208a5181546001600160a01b03199081166001600160a01b03928316178355938c015160018084018054871692841692909217909155928c01516002830180549095169082161790935560608b0151600382015560808b015160048201805460a08e01516001600160a81b0319909116921515610100600160a81b031916929092176101009290951682029490941790935560c08b0151600582015560e08b01516006820155918a0151600783015561012090990151600890910155600f8054988901815590527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802909601869055509492505050565b60008181526001830160205260408120548015614da2576000614cdd6001836156ca565b8554909150600090614cf1906001906156ca565b9050818114614d56576000866000018281548110614d1157614d116158cf565b9060005260206000200154905080876000018481548110614d3457614d346158cf565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614d6757614d67615ad7565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506110de565b60009150506110de565b6000826000018281548110614dc357614dc36158cf565b9060005260206000200154905092915050565b80516001600160a01b0381166000908152600a6020526040812054909182918290614e0290600161591c565b6001600160a01b0383166000908152600a60205260408120829055909150614e2a8383613349565b6000818152600b602090815260408083208a5181546001600160a01b03199081166001600160a01b03928316178355938c015160018084018054871692841692909217909155928c015160028301805490951691161790925560608a0151600383015560808a0151600483015560a08a015160058301805460ff191691151591909117905560c08a0151600683015560e08a015160078301556101008a0151600883015561012090990151600990910155600c8054988901815590527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7909601869055509492505050565b60606139d38484600085614f73565b6000818152600183016020526040812054614f6b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556110de565b5060006110de565b606082471015614fd45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611033565b843b6150225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611033565b600080866001600160a01b0316858760405161503e9190615b11565b60006040518083038185875af1925050503d806000811461507b576040519150601f19603f3d011682016040523d82523d6000602084013e615080565b606091505b50915091506119728282866060831561509a5750816139d6565b8251156150aa5782518084602001fd5b8160405162461bcd60e51b81526004016110339190615b2d565b6000602082840312156150d657600080fd5b5035919050565b6001600160a01b03811681146150f257600080fd5b50565b6000806040838503121561510857600080fd5b82359150602083013561511a816150dd565b809150509250929050565b60006020828403121561513757600080fd5b81356139d6816150dd565b80151581146150f257600080fd5b6000806040838503121561516357600080fd5b823561516e816150dd565b9150602083013561511a81615142565b600080600080600080600060e0888a03121561519957600080fd5b87356151a4816150dd565b965060208801356151b4816150dd565b95506040880135945060608801356151cb81615142565b935060808801356151db816150dd565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121561520d57600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561523a57600080fd5b843561524581615142565b935060208501359250604085013561525c816150dd565b9150606085013561526c81615142565b939692955090935050565b60008060006060848603121561528c57600080fd5b8335615297816150dd565b92506020840135915060408401356152ae816150dd565b809150509250925092565b602080825282518282018190526000919060409081850190868401855b8281101561537057815180516001600160a01b03908116865287820151811688870152868201511686860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e08082015115159086015261010080820151151590860152610120808201511515908601526101409081015115159085015261016090930192908501906001016152d6565b5091979650505050505050565b6000806040838503121561539057600080fd5b50508035926020909101359150565b60008060008060008060008060006101208a8c0312156153be57600080fd5b8935985060208a01356153d0816150dd565b975060408a0135965060608a01356153e7816150dd565b955060808a01356153f781615142565b989b979a50959894979660a0860135965060c08601359560e0810135955061010001359350915050565b60008060008060008060008060006101208a8c03121561544057600080fd5b893561544b816150dd565b985060208a013561545b816150dd565b975060408a0135965060608a0135955060808a01356153f781615142565b60008083601f84011261548b57600080fd5b50813567ffffffffffffffff8111156154a357600080fd5b6020830191508360208260051b85010111156154be57600080fd5b9250929050565b6000806000806000606086880312156154dd57600080fd5b853567ffffffffffffffff808211156154f557600080fd5b61550189838a01615479565b9097509550602088013591508082111561551a57600080fd5b5061552788828901615479565b909450925050604086013561553b816150dd565b809150509295509295909350565b6000806040838503121561555c57600080fd5b8235615567816150dd565b946020939093013593505050565b6000806000806080858703121561558b57600080fd5b5050823594602084013594506040840135936060013592509050565b6000806000604084860312156155bc57600080fd5b833567ffffffffffffffff8111156155d357600080fd5b6155df86828701615479565b90945092505060208401356152ae816150dd565b60008060006060848603121561560857600080fd5b83359250602084013561561a81615142565b929592945050506040919091013590565b6000806040838503121561563e57600080fd5b8235615649816150dd565b9150602083013561511a816150dd565b6000806000806080858703121561566f57600080fd5b84359350602085013561568181615142565b93969395505050506040820135916060013590565b60208082526004908201526327a69d3360e11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156110de576110de6156b4565b6001600160a01b03998a16815297891660208901526040880196909652931515606087015291909516608085015260a084019490945260c083019390935260e08201929092526101008101919091526101200190565b602080825260069082015265424d3a34303360d01b604082015260600190565b80820281158282048414176110de576110de6156b4565b60006020828403121561577c57600080fd5b5051919050565b805161578e81615142565b919050565b6000602082840312156157a557600080fd5b81516139d681615142565b60208082526004908201526304f4d3a360e41b604082015260600190565b60208082526005908201526427a69d32b360d91b604082015260600190565b6020808252600690820152654f4d3a34303360d01b604082015260600190565b60208082526007908201526613d34e99985a5b60ca1b604082015260600190565b6001600160a01b0396871681529486166020860152928516604085015260608401919091521515608083015290911660a082015260c00190565b6001600160a01b03998a16815297909816602088015260408701959095526060860193909352608085019190915260a0840152151560c0830152151560e08201529015156101008201526101200190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600182016158f7576158f76156b4565b5060010190565b6020808252600490820152634f4d3a6360e01b604082015260600190565b808201808211156110de576110de6156b4565b60208082526004908201526304f4d3a760e41b604082015260600190565b6020808252600590820152640424d3a6d760dc1b604082015260600190565b60008261598957634e487b7160e01b600052601260045260246000fd5b500490565b604051610160810167ffffffffffffffff811182821017156159c057634e487b7160e01b600052604160045260246000fd5b60405290565b805161578e816150dd565b600061016082840312156159e457600080fd5b6159ec61598e565b6159f5836159c6565b8152615a03602084016159c6565b6020820152615a14604084016159c6565b6040820152615a2560608401615783565b60608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152506101408084015181830152508091505092915050565b6001600160a01b039a8b16815298909916602089015260408801969096526060870194909452608086019290925260a085015260c0840152151560e083015215156101008201529015156101208201526101400190565b634e487b7160e01b600052603160045260246000fd5b60005b83811015615b08578181015183820152602001615af0565b50506000910152565b60008251615b23818460208701615aed565b9190910192915050565b6020815260008251806020840152615b4c816040850160208701615aed565b601f01601f1916919091016040019291505056fed21a7b68c66e053c73bd8bed4d752fc154d5a35d095063cd99a7b35b3787df27a2646970667358221220de8b3beae66e86e258b7f3ff43efac7d163a5ea2bf67531c3dfbb83f309ee13e64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c5f444d25d5013c395f70398350d2969ef0f6aa0000000000000000000000000f024541569796286d58fff4b5898a3c3f1635bd1000000000000000000000000dccc1dc6c3518dc160f7d2ec72dac1a6ee9a7b4f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000008ac7230489e80000
-----Decoded View---------------
Arg [0] : _vault (address): 0xC5f444D25D5013C395F70398350d2969eF0F6AA0
Arg [1] : _utils (address): 0xf024541569796286d58fFF4b5898A3C3f1635bd1
Arg [2] : _pricefeed (address): 0xDcCC1Dc6c3518dC160F7D2ec72Dac1A6eE9a7B4f
Arg [3] : _minExecutionFeeMarketOrder (uint256): 100000000000000
Arg [4] : _minExecutionFeeLimitOrder (uint256): 100000000000000
Arg [5] : _depositFee (uint256): 10
Arg [6] : _maxProfitMultiplier (uint256): 5
Arg [7] : _minPurchaseUSDAmountLimitOrder (uint256): 10000000000000000000
Arg [8] : _minPurchaseUSDAmountMarketOrder (uint256): 10000000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000c5f444d25d5013c395f70398350d2969ef0f6aa0
Arg [1] : 000000000000000000000000f024541569796286d58fff4b5898a3c3f1635bd1
Arg [2] : 000000000000000000000000dccc1dc6c3518dc160f7d2ec72dac1a6ee9a7b4f
Arg [3] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [4] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [8] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Deployed Bytecode Sourcemap
53227:42920:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53619:44;;;;;;;;;;-1:-1:-1;53619:44:0;;;;;:::i;:::-;;:::i;:::-;;;345:25:1;;;333:2;318:18;53619:44:0;;;;;;;;76667:1654;;;;;;;;;;-1:-1:-1;76667:1654:0;;;;;:::i;:::-;;:::i;:::-;;;1122:14:1;;1115:22;1097:41;;1085:2;1070:18;76667:1654:0;957:187:1;33976:52:0;;;;;;;;;;;;34023:5;33976:52;;54097:47;;;;;;;;;;;;;;;;34088;;;;;;;;;;-1:-1:-1;34088:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;61344:182;;;;;;;;;;-1:-1:-1;61344:182:0;;;;;:::i;:::-;;:::i;:::-;;53734:88;;;;;;;;;;-1:-1:-1;53734:88:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53734:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2852:15:1;;;2834:34;;2904:15;;;2899:2;2884:18;;2877:43;2956:15;;;2936:18;;;2929:43;;;;3003:2;2988:18;;2981:34;;;;3059:14;;3052:22;3046:3;3031:19;;3024:51;3112:15;;2814:3;3091:19;;3084:44;3159:3;3144:19;;3137:35;;;;3203:3;3188:19;;3181:35;;;;3247:3;3232:19;;3225:35;;;;3291:3;3276:19;;3269:35;;;;2783:3;2768:19;53734:88:0;2403:907:1;64972:1327:0;;;;;;;;;;-1:-1:-1;64972:1327:0;;;;;:::i;:::-;;:::i;68213:2180::-;;;;;;;;;;-1:-1:-1;68213:2180:0;;;;;:::i;:::-;;:::i;60050:216::-;;;;;;;;;;-1:-1:-1;60050:216:0;;;;;:::i;:::-;;:::i;70906:936::-;;;;;;:::i;:::-;;:::i;54538:45::-;;;;;;;;;;;;;;;;53873:48;;;;;;;;;;-1:-1:-1;53873:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54316:46;;;;;;;;;;-1:-1:-1;54316:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53969:33;;;;;;;;;;;;;;;;54421:31;;;;;;;;;;;;;;;;60888:448;;;;;;;;;;-1:-1:-1;60888:448:0;;;;;:::i;:::-;;:::i;54461:46::-;;;;;;;;;;;;;;;;61534:179;;;;;;;;;;-1:-1:-1;61534:179:0;;;;;:::i;:::-;;:::i;60417:170::-;;;;;;;;;;-1:-1:-1;60417:170:0;;;;;:::i;:::-;;:::i;35054:89::-;;;;;;;;;;-1:-1:-1;35054:89:0;;;;;:::i;:::-;;:::i;60595:166::-;;;;;;;;;;-1:-1:-1;60595:166:0;;;;;:::i;:::-;;:::i;54369:45::-;;;;;;;;;;-1:-1:-1;54369:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53928:34;;;;;;;;;;;;;;;;33943:24;;;;;;;;;;-1:-1:-1;33943:24:0;;;;-1:-1:-1;;;;;33943:24:0;;;;;;-1:-1:-1;;;;;4701:32:1;;;4683:51;;4671:2;4656:18;33943:24:0;4537:203:1;33916:20:0;;;;;;;;;;-1:-1:-1;33916:20:0;;;;-1:-1:-1;;;;;33916:20:0;;;80291:664;;;;;;;;;;-1:-1:-1;80291:664:0;;;;;:::i;:::-;;:::i;:::-;;;;5512:25:1;;;5580:14;;5573:22;5568:2;5553:18;;5546:50;5485:18;80291:664:0;5344:258:1;54262:47:0;;;;;;;;;;-1:-1:-1;54262:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;73643:1240;;;;;;;;;;-1:-1:-1;73643:1240:0;;;;;:::i;:::-;;:::i;53460:57::-;;;;;;;;;;-1:-1:-1;53460:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;91394:2893;;;;;;;;;;-1:-1:-1;91394:2893:0;;;;;:::i;:::-;;:::i;34142:22::-;;;;;;;;;;;;;;;;34862:86;;;;;;;;;;-1:-1:-1;34862:86:0;;;;;:::i;:::-;;:::i;34960:::-;;;;;;;;;;-1:-1:-1;34960:86:0;;;;;:::i;:::-;;:::i;34768:::-;;;;;;;;;;-1:-1:-1;34768:86:0;;;;;:::i;:::-;;:::i;60769:111::-;;;;;;;;;;-1:-1:-1;60769:111:0;;;;;:::i;:::-;;:::i;89656:479::-;;;;;;;;;;-1:-1:-1;89656:479:0;;;;;:::i;:::-;;:::i;94455:383::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59830:212::-;;;;;;;;;;-1:-1:-1;59830:212:0;;;;;:::i;:::-;;:::i;34035:46::-;;;;;;;;;;;;;;;;60274:135;;;;;;;;;;-1:-1:-1;60274:135:0;;;;;:::i;:::-;;:::i;66307:1898::-;;;;;;;;;;-1:-1:-1;66307:1898:0;;;;;:::i;:::-;;:::i;54043:47::-;;;;;;;;;;;;;;;;95896:121;;;;;;;;;;-1:-1:-1;95975:27:0;:34;95896:121;;54153:53;;;;;;;;;;-1:-1:-1;54153:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54153:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9329:15:1;;;9311:34;;9381:15;;;9376:2;9361:18;;9354:43;9433:15;;;;9413:18;;;9406:43;;;;9480:2;9465:18;;9458:34;;;;9523:3;9508:19;;9501:35;;;;9291:3;9552:19;;9545:35;;;;9611:3;9596:19;;9589:35;9668:14;9661:22;9655:3;9640:19;;9633:51;9728:14;9721:22;9715:3;9700:19;;9693:51;9788:14;9781:22;9775:3;9760:19;;9753:51;9848:15;;9841:23;9835:3;9820:19;;9813:52;9260:3;9245:19;54153:53:0;8869:1002:1;81903:2979:0;;;;;;:::i;:::-;;:::i;61721:1986::-;;;;;;:::i;:::-;;:::i;94846:353::-;;;;;;;;;;-1:-1:-1;94846:353:0;;;;;:::i;:::-;;:::i;53365:41::-;;;;;;;;;;;;;;;;80064:219;;;;;;;;;;-1:-1:-1;80064:219:0;;;;;:::i;:::-;;:::i;94295:152::-;;;;;;;;;;-1:-1:-1;94295:152:0;;;;;:::i;:::-;;:::i;53413:40::-;;;;;;;;;;;;;;;;54009:27;;;;;;;;;;;;;;;;87522:2126;;;;;;;;;;-1:-1:-1;87522:2126:0;;;;;:::i;:::-;;:::i;95207:286::-;;;;;;;;;;-1:-1:-1;95207:286:0;;;;;:::i;:::-;;:::i;80963:317::-;;;;;;;;;;-1:-1:-1;80963:317:0;;;;;:::i;:::-;;:::i;96023:121::-;;;;;;;;;;-1:-1:-1;96102:27:0;:34;96023:121;;38034:317;;;;;;;;;;-1:-1:-1;38034:317:0;;;;;:::i;:::-;;:::i;74891:1768::-;;;;;;;;;;-1:-1:-1;74891:1768:0;;;;;:::i;:::-;;:::i;33862:20::-;;;;;;;;;;-1:-1:-1;33862:20:0;;;;-1:-1:-1;;;;;33862:20:0;;;53670:57;;;;;;;;;;-1:-1:-1;53670:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;53524:88;;;;;;;;;;-1:-1:-1;53524:88:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53524:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15644:15:1;;;15626:34;;15696:15;;;15691:2;15676:18;;15669:43;15748:15;;;;15728:18;;;15721:43;;;;15795:2;15780:18;;15773:34;;;;15838:3;15823:19;;15816:35;;;;15895:14;15888:22;15606:3;15867:19;;15860:51;15942:3;15927:19;;15920:35;15986:3;15971:19;;15964:35;16030:3;16015:19;;16008:35;16074:3;16059:19;;16052:35;;;;15575:3;15560:19;53524:88:0;15195:898:1;33889:20:0;;;;;;;;;;-1:-1:-1;33889:20:0;;;;-1:-1:-1;;;;;33889:20:0;;;81288:607;;;;;;;;;;-1:-1:-1;81288:607:0;;;;;:::i;:::-;;:::i;53619:44::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53619:44:0;:::o;76667:1654::-;76807:4;19139:21;:19;:21::i;:::-;76824:51:::1;76878:30:::0;;;:24:::1;:30;::::0;;;;;;;;76824:84;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;76824:84:0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;;::::0;;;;;77076:73:::1;;77133:4;77126:11;;;;;77076:73;77166;77185:7;:19;;;77205:7;:17;;;77223:7;:15;;;77166:18;:73::i;:::-;77161:119;;77263:5;77256:12;;;;;77161:119;77299:30;::::0;;;:24:::1;:30;::::0;;;;;;;77292:37;;-1:-1:-1;;;;;;77292:37:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;77292:37:0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;77394:15;;77424:24;;::::1;::::0;77463:18;;::::1;::::0;77496:17:::1;::::0;::::1;::::0;77528:14:::1;::::0;::::1;::::0;77585:23:::1;::::0;::::1;::::0;77362:257:::1;::::0;77394:15;77424:24;77463:18;77496:17;77528:14;77565:4:::1;::::0;77362:17:::1;:257::i;:::-;77692:16;::::0;::::1;::::0;77639:24:::1;::::0;::::1;::::0;77342:277;;-1:-1:-1;77632:111:0::1;::::0;-1:-1:-1;;;;;77632:45:0::1;::::0;77342:277;77632:45:::1;:111::i;:::-;77809:20;::::0;::::1;::::0;77775:59:::1;::::0;77757:12:::1;::::0;-1:-1:-1;;;;;77775:26:0;::::1;::::0;77757:12;77775:59;77757:12;77775:59;77809:20;77775:26;:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77756:78;;;77853:7;77845:24;;;;-1:-1:-1::0;;;77845:24:0::1;;;;;;;:::i;:::-;;;;;;;;;77925:7;:15;;;-1:-1:-1::0;;;;;77887:404:0::1;;77955:7;:24;;;77994:7;:18;;;78027:7;:17;;;78059:7;:14;;;78088:7;:16;;;78119:7;:23;;;78157:7;:20;;;78208:7;:19;;;78192:12;:36;;;;:::i;:::-;78262:17;::::0;::::1;::::0;78243:37:::1;::::0;:15:::1;:37;:::i;:::-;77887:404;;;;;;;;;;;;;;:::i;:::-;;;;;;;;78309:4;78302:11;;;;;19171:1;19183:20:::0;18472:1;19728:7;:22;19545:213;19183:20;76667:1654;;;;:::o;61344:182::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61432:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;;;;:35;;-1:-1:-1;;61432:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;61483;;1097:41:1;;;61483:35:0::1;::::0;1070:18:1;61483:35:0::1;;;;;;;;61344:182:::0;;:::o;64972:1327::-;65111:4;19139:21;:19;:21::i;:::-;65128:51:::1;65182:30:::0;;;:24:::1;:30;::::0;;;;;;;;65128:84;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;65128:84:0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;;65380:73:::1;;65437:4;65430:11;;;;;65380:73;65470:76;65492:7;:19;;;65512:7;:17;;;65530:7;:15;;;65470:21;:76::i;:::-;65465:122;;65570:5;65563:12;;;;;65465:122;65606:30;::::0;;;:24:::1;:30;::::0;;;;;;65599:37;;-1:-1:-1;;;;;;65599:37:0;;::::1;::::0;;-1:-1:-1;65599:37:0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;65599:37:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;65693:15;;65710:16:::1;::::0;::::1;::::0;65654:24;;::::1;::::0;65647:80:::1;::::0;-1:-1:-1;;;;;65647:45:0;;::::1;::::0;65693:15;65647:45:::1;:80::i;:::-;65792:20;::::0;::::1;::::0;65758:59:::1;::::0;65739:12:::1;::::0;-1:-1:-1;;;;;65758:26:0;::::1;::::0;65739:12;65758:59;65739:12;65758:59;65792:20;65758:26;:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65738:79;;;65836:7;65828:24;;;;-1:-1:-1::0;;;65828:24:0::1;;;;;;;:::i;:::-;65907:7;:15;;;-1:-1:-1::0;;;;;65870:399:0::1;;65937:7;:24;;;65976:7;:18;;;66009:7;:16;;;66040:7;:17;;;66072:7;:14;;;66101:7;:23;;;66139:7;:20;;;66189:7;:19;;;66174:12;:34;;;;:::i;:::-;66241:17;::::0;::::1;::::0;66223:35:::1;::::0;:15:::1;:35;:::i;:::-;65870:399;::::0;;-1:-1:-1;;;;;18942:15:1;;;18924:34;;18994:15;;;;18989:2;18974:18;;18967:43;19026:18;;;19019:34;;;;19084:2;19069:18;;19062:34;;;;19140:14;;19133:22;19127:3;19112:19;;19105:51;18904:3;19172:19;;19165:35;19231:3;19216:19;;19209:35;19275:3;19260:19;;19253:35;19319:3;19304:19;;19297:35;18873:3;18858:19;65870:399:0::1;;;;;;;;66287:4;66280:11;;;;19183:20:::0;18472:1;19728:7;:22;19545:213;68213:2180;68353:4;19139:21;:19;:21::i;:::-;68370:51:::1;68424:30:::0;;;:24:::1;:30;::::0;;;;;;;;68370:84;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;68370:84:0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;;68622:73:::1;;68679:4;68672:11;;;;;68622:73;68712;68731:7;:19;;;68751:7;:17;;;68769:7;:15;;;68712:18;:73::i;:::-;68707:119;;68809:5;68802:12;;;;;68707:119;68845:30;::::0;;;:24:::1;:30;::::0;;;;;;;68838:37;;-1:-1:-1;;;;;;68838:37:0;;::::1;::::0;;-1:-1:-1;68838:37:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;68838:37:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;68932:5;;68952:15;;68969:24;;::::1;::::0;68995:16:::1;::::0;::::1;::::0;69013:18;;::::1;::::0;69033:14:::1;::::0;::::1;::::0;69049:17:::1;::::0;::::1;::::0;68886:182:::1;::::0;-1:-1:-1;;;;;68932:5:0;;::::1;::::0;68939:128:::1;::::0;68952:15;;68969:24;68995:16;;69013:18;;68939:12:::1;:128::i;:::-;68893:24;::::0;::::1;::::0;-1:-1:-1;;;;;68886:45:0::1;::::0;:182;:45:::1;:182::i;:::-;69081:229;69113:7;:15;;;69143:7;:24;;;69182:7;:18;;;69215:7;:17;;;69247:7;:14;;;69276:7;:23;;;69081:17;:229::i;:::-;69377:20;::::0;::::1;::::0;69343:59:::1;::::0;69324:12:::1;::::0;-1:-1:-1;;;;;69343:26:0;::::1;::::0;69324:12;69343:59;69324:12;69343:59;69377:20;69343:26;:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69323:79;;;69421:7;69413:24;;;;-1:-1:-1::0;;;69413:24:0::1;;;;;;;:::i;:::-;69453:17;::::0;::::1;::::0;:21;69450:490:::1;;69566:15;69591:5;;;;;;;;;-1:-1:-1::0;;;;;69591:5:0::1;-1:-1:-1::0;;;;;69584:24:0::1;;69609:7;:17;;;69628:7;:14;;;69644:7;:23;;;69688:19;;69669:7;:16;;;:38;;;;:::i;:::-;69709:24;::::0;::::1;::::0;69584:150:::1;::::0;-1:-1:-1;;;;;;69584:150:0::1;::::0;;;;;;::::1;::::0;::::1;19769:25:1::0;;;;19837:14;;19830:22;19810:18;;;19803:50;19869:18;;;19862:34;;;;19912:18;;;19905:34;-1:-1:-1;;;;;19976:32:1;19955:19;;;19948:61;19741:19;;69584:150:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69566:168;;69749:179;69762:7;:15;;;69779:1;69782:7;:24;;;69808:7;:18;;;69828:7;:17;;;69847:7;:14;;;69863:7;69872;:14;;;69888:25;;69915:5;69923:4;69749:12;:179::i;:::-;69475:465;69450:490;69995:7;:15;;;-1:-1:-1::0;;;;;69957:404:0::1;;70025:7;:24;;;70064:7;:18;;;70097:7;:16;;;70128:7;:17;;;70160:7;:14;;;70189:7;:23;;;70227:7;:20;;;70278:7;:19;;;70262:12;:36;;;;:::i;60050:216::-:0;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60166:26:0;::::1;;::::0;;;:16:::1;:26;::::0;;;;;;;;:38;;-1:-1:-1;;60166:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;60220;;1097:41:1;;;60220:38:0::1;::::0;1070:18:1;60220:38:0::1;957:187:1::0;70906:936:0;71196:7;19139:21;:19;:21::i;:::-;71232:5:::1;;;;;;;;;-1:-1:-1::0;;;;;71232:5:0::1;-1:-1:-1::0;;;;;71225:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71224:37;71216:54;;;;-1:-1:-1::0;;;71216:54:0::1;;;;;;;:::i;:::-;71306:26;;71289:13;:43;;71281:60;;;;-1:-1:-1::0;;;71281:60:0::1;;;;;;;:::i;:::-;71377:9;71360:13;:26;71352:44;;;;-1:-1:-1::0;;;71352:44:0::1;;;;;;;:::i;:::-;71415:92;71445:10;71457:16;71475:11;71487:7;71496:10;71415:29;:92::i;:::-;71407:112;;;::::0;-1:-1:-1;;;71407:112:0;;21463:2:1;71407:112:0::1;::::0;::::1;21445:21:1::0;21502:1;21482:18;;;21475:29;-1:-1:-1;;;21520:18:1;;;21513:37;21567:18;;71407:112:0::1;21261:330:1::0;71407:112:0::1;71552:282;71594:10;71623:16;71658:11;71688:10;71717:7;71743:9;71771:16;71806:13;71552:23;:282::i;:::-;71532:302;;19183:20:::0;18472:1;19728:7;:22;19545:213;19183:20;70906:936;;;;;;;;;:::o;60888:448::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;61058:19:::1;:42:::0;;;61111:18:::1;:40:::0;;;61162:12:::1;:28:::0;;;61206:122:::1;::::0;;21798:25:1;;;21854:2;21839:18;;21832:34;;;21882:18;;;21875:34;;;61206:122:0::1;::::0;21786:2:1;21771:18;61206:122:0::1;;;;;;;;60888:448:::0;;;:::o;61534:179::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61621:22:0;::::1;;::::0;;;:12:::1;:22;::::0;;;;;;;;:34;;-1:-1:-1;;61621:34:0::1;::::0;::::1;;::::0;;::::1;::::0;;;61671;;1097:41:1;;;61671:34:0::1;::::0;1070:18:1;61671:34:0::1;957:187:1::0;60417:170:0;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;60523:26:::1;:56:::0;60417:170::o;35054:89::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;35118:10:::1;:17:::0;35054:89::o;60595:166::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;60699:25:::1;:54:::0;60595:166::o;80291:664::-;80485:7;80494:4;80583:20;80606:14;:139;;80703:9;;80692:53;;-1:-1:-1;;;80692:53:0;;-1:-1:-1;;;;;4701:32:1;;;80692:53:0;;;4683:51:1;80703:9:0;;;;80692:40;;4656:18:1;;80692:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80606:139;;;80647:9;;80636:53;;-1:-1:-1;;;80636:53:0;;-1:-1:-1;;;;;4701:32:1;;;80636:53:0;;;4683:51:1;80647:9:0;;;;80636:40;;4656:18:1;;80636:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80583:162;;80756:17;80776:22;:84;;80847:13;80832:12;:28;80776:84;;;80816:13;80801:12;:28;80776:84;80756:104;;80879:12;80871:30;;;;-1:-1:-1;;;80871:30:0;;22122:2:1;80871:30:0;;;22104:21:1;22161:1;22141:18;;;22134:29;-1:-1:-1;;;22179:18:1;;;22172:35;22224:18;;80871:30:0;21920:328:1;80871:30:0;80920:12;;;;-1:-1:-1;80291:664:0;-1:-1:-1;;;;;80291:664:0:o;73643:1240::-;73782:4;19139:21;:19;:21::i;:::-;73799:51:::1;73853:30:::0;;;:24:::1;:30;::::0;;;;;;;;73799:84;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;73799:84:0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;;::::0;;;;;74051:73:::1;;74108:4;74101:11;;;;;74051:73;74141:76;74163:7;:19;;;74183:7;:17;;;74201:7;:15;;;74141:21;:76::i;:::-;74136:122;;74241:5;74234:12;;;;;74136:122;74277:30;::::0;;;:24:::1;:30;::::0;;;;;74270:37;;-1:-1:-1;;;;;;74270:37:0;;::::1;::::0;;-1:-1:-1;74270:37:0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;74270:37:0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;74374:20:::1;::::0;::::1;::::0;74340:59;;-1:-1:-1;;;;;74340:26:0;::::1;::::0;74374:20;74277:30;74340:59;74277:30;74340:59;74374:20;74340:26;:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74320:79;;;74418:7;74410:24;;;;-1:-1:-1::0;;;74410:24:0::1;;;;;;;:::i;:::-;74489:7;:15;;;-1:-1:-1::0;;;;;74452:399:0::1;;74519:7;:24;;;74558:7;:18;;;74591:7;:17;;;74623:7;:14;;;74652:7;:16;;;74683:7;:23;;;74721:7;:20;;;74771:7;:19;;;74756:12;:34;;;;:::i;:::-;74823:17;::::0;::::1;::::0;74805:35:::1;::::0;:15:::1;:35;:::i;:::-;74452:399;;;;;;;;;;;;;;:::i;91394:2893::-:0;19139:21;:19;:21::i;:::-;59782:10:::1;59768:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;59760:44;;;;-1:-1:-1::0;;;59760:44:0::1;;;;;;;:::i;:::-;91541:16:::2;91560:33;91572:8;91581:11;91560;:33::i;:::-;91604:31;91638:16:::0;;;:6:::2;:16;::::0;;;;;;;;91604:50;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;91604:50:0;;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;;::::0;::::2;::::0;;::::2;;;::::0;;;;::::2;::::0;;::::2;::::0;::::2;;;::::0;;;;;;::::2;::::0;::::2;;;::::0;;;;;;;::::2;;;;::::0;;;;91541:52;;-1:-1:-1;91604:50:0;91665:47:::2;;;;-1:-1:-1::0;;;91665:47:0::2;;;;;;;:::i;:::-;91815:20;91841:170;91882:5;:27;;;91924:5;:18;;;91957:5;:16;;;91988:5;:12;;;91841:26;:170::i;:::-;91814:197;;;92027:5;:21;;;92024:1303;;;92107:5;::::0;92114:21:::2;::::0;::::2;::::0;92071::::2;::::0;::::2;::::0;92064:72:::2;::::0;-1:-1:-1;;;;;92064:42:0;;::::2;::::0;92107:5;::::2;::::0;92064:42:::2;:72::i;:::-;92158:5;::::0;92182:13;;92197:21:::2;::::0;::::2;::::0;92220:16:::2;::::0;;::::2;::::0;92238:15:::2;::::0;::::2;::::0;92255:12:::2;::::0;::::2;::::0;92151:117;;-1:-1:-1;;;92151:117:0;;-1:-1:-1;;;;;23231:15:1;;;92151:117:0::2;::::0;::::2;23213:34:1::0;23283:15;;;23263:18;;;23256:43;23335:15;;;23315:18;;;23308:43;23367:18;;;23360:34;23438:14;23431:22;23410:19;;;23403:51;92158:5:0;::::2;::::0;92151:30:::2;::::0;23147:19:1;;92151:117:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;92286:15:0::2;::::0;::::2;::::0;:19;92283:466:::2;;92390:12;92412:5;;;;;;;;;-1:-1:-1::0;;;;;92412:5:0::2;-1:-1:-1::0;;;;;92405:24:0::2;;92430:5;:15;;;92447:5;:12;;;92461:5;:18;;;92505:19;;92481:5;:21;;;:43;;;;:::i;:::-;92526:21;::::0;::::2;::::0;92405:143:::2;::::0;-1:-1:-1;;;;;;92405:143:0::2;::::0;;;;;;::::2;::::0;::::2;19769:25:1::0;;;;19837:14;;19830:22;19810:18;;;19803:50;19869:18;;;19862:34;;;;19912:18;;;19905:34;-1:-1:-1;;;;;19976:32:1;19955:19;;;19948:61;19741:19;;92405:143:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;92390:158;;92567:166;92580:5;:13;;;92595:1;92598:5;:21;;;92621:5;:16;;;92639:5;:15;;;92656:5;:12;;;92670:7;92679:5;:12;;;92693:25;;92720:5;92728:4;92567:12;:166::i;:::-;92306:443;92283:466;92024:1303;;;92780:25;92808:116;92838:5;:13;;;92853:5;:21;;;92876:5;:16;;;92894:5;:12;;;92908:5;:15;;;92808:29;:116::i;:::-;92780:144;;92943:20;92939:127;;92983:42;92996:8;93006:11;93019:5;92983:12;:42::i;:::-;93044:7;;;;;;92939:127;93107:5;::::0;93131:13;;93146:21:::2;::::0;::::2;::::0;93169:16:::2;::::0;;::::2;::::0;93187:15:::2;::::0;::::2;::::0;93204:12:::2;::::0;::::2;::::0;93100:132;;-1:-1:-1;;;93100:132:0;;93080:17:::2;::::0;-1:-1:-1;;;;;93107:5:0::2;::::0;93100:30:::2;::::0;:132:::2;::::0;93131:13;;93146:21;;93169:16;;93187:15;;93204:12;93226:4:::2;::::0;93100:132:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;93290:13:::0;;93254:21:::2;::::0;::::2;::::0;93080:152;;-1:-1:-1;93247:68:0::2;::::0;-1:-1:-1;;;;;93247:42:0::2;::::0;93080:152;93247:42:::2;:68::i;:::-;92765:562;;92024:1303;93346:16;::::0;;;:6:::2;:16;::::0;;;;93339:23;;-1:-1:-1;;;;;;93339:23:0;;::::2;::::0;;;;::::2;::::0;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;;::::0;;-1:-1:-1;;93339:23:0;;;93373:41:::2;93394:9;93353:8:::0;93373:20:::2;:41::i;:::-;-1:-1:-1::0;93497:18:0::2;::::0;::::2;::::0;93472:48:::2;::::0;93453:12:::2;::::0;-1:-1:-1;;;;;93472:17:0;::::2;::::0;93453:12;93472:48;93453:12;93472:48;93497:18;93472:17;:48:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93452:68;;;93539:7;93531:24;;;;-1:-1:-1::0;;;93531:24:0::2;;;;;;;:::i;:::-;93949:5;:21;;;93573:408;;93600:5;:13;;;-1:-1:-1::0;;;;;93573:408:0::2;;93628:5;:21;;;93664:5;:16;;;93695:11;93721:5;:21;;;93757:5;:15;;;93787:5;:18;;;93820:5;:18;;;93853:12;93880:5;:12;;;93907:5;:27;;;93573:408;;;;;;;;;;;;;;-1:-1:-1::0;;;;;24532:15:1;;;24514:34;;24584:15;;;;24579:2;24564:18;;24557:43;24631:2;24616:18;;24609:34;;;;24674:2;24659:18;;24652:34;;;;24717:3;24702:19;;24695:35;;;;24494:3;24746:19;;24739:35;24805:3;24790:19;;24783:35;24849:3;24834:19;;24827:35;24906:14;24899:22;24893:3;24878:19;;24871:51;24966:14;;24959:22;24953:3;24938:19;;24931:51;24463:3;24448:19;;24089:899;93573:408:0::2;;;;;;;;94023:13:::0;;94051:21:::2;::::0;::::2;::::0;94087:16:::2;::::0;;::::2;::::0;94252::::2;::::0;::::2;::::0;93997:282;;94232:5:::2;::::0;-1:-1:-1;;;;;93997:282:0::2;::::0;-1:-1:-1;;;;;;;;;;;93997:282:0;::::2;::::0;94051:21;;94118:11;;94232:5;;;;;;;;;;93997:282:::2;:::i;:::-;;;;;;;;91530:2757;;;;59815:1;19183:20:::0;18472:1;19728:7;:22;19545:213;19183:20;91394:2893;;;:::o;34862:86::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;34926:5:::1;:14:::0;;-1:-1:-1;;;;;;34926:14:0::1;-1:-1:-1::0;;;;;34926:14:0;;;::::1;::::0;;;::::1;::::0;;34862:86::o;34960:::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;35024:5:::1;:14:::0;;-1:-1:-1;;;;;;35024:14:0::1;-1:-1:-1::0;;;;;35024:14:0;;;::::1;::::0;;;::::1;::::0;;34960:86::o;34768:::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;34832:5:::1;:14:::0;;-1:-1:-1;;;;;;34832:14:0::1;-1:-1:-1::0;;;;;34832:14:0;;;::::1;::::0;;;::::1;::::0;;34768:86::o;60769:111::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;60850:9:::1;:22:::0;;-1:-1:-1;;;;;;60850:22:0::1;-1:-1:-1::0;;;;;60850:22:0;;;::::1;::::0;;;::::1;::::0;;60769:111::o;89656:479::-;19139:21;:19;:21::i;:::-;89748:16:::1;89767:32;89779:7;89787:11;89767;:32::i;:::-;89810:31;89844:16:::0;;;:6:::1;:16;::::0;;;;;;;;89810:50;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;89810:50:0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;;::::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;::::1;;;::::0;;;;;;;::::1;;;::::0;::::1;::::0;;;;89748:51;;-1:-1:-1;89810:50:0;89873:201:::1;;89930:10;89916:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;89908:44;;;;-1:-1:-1::0;;;89908:44:0::1;;;;;;;:::i;:::-;89873:201;;;90001:10;-1:-1:-1::0;;;;;90001:21:0;::::1;;::::0;:50:::1;;-1:-1:-1::0;90040:10:0::1;90026:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;90001:50;89993:69;;;;-1:-1:-1::0;;;89993:69:0::1;;;;;;;:::i;:::-;90084:43;90097:8;90107:11;90121:5;90084:12;:43::i;:::-;89737:398;;19183:20:::0;18472:1;19728:7;:22;19545:213;19183:20;89656:479;;:::o;94455:383::-;94499:27;94538:16;94557:31;94578:9;94557:20;:31::i;:::-;94538:50;;94599:38;94665:11;94640:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94640:37:0;;-1:-1:-1;;94640:37:0;;;;;;;;;;;;94599:78;;94692:6;94688:115;94704:11;94702:1;:13;94688:115;;;94752:6;:38;94759:30;94776:9;94787:1;94759:16;:30::i;:::-;94752:38;;;;;;;;;;;;;;-1:-1:-1;94752:38:0;94735:56;;;;;;;;;-1:-1:-1;;;;;94735:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;;:10;;94746:1;;94735:13;;;;;;:::i;:::-;;;;;;:56;;;;94716:3;;;;;:::i;:::-;;;;94688:115;;;-1:-1:-1;94820:10:0;94455:383;-1:-1:-1;;94455:383:0:o;59830:212::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;59933:31:::1;:46:::0;;;;59990:30:::1;:44:::0;59830:212::o;60274:135::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;60359:19:::1;:42:::0;60274:135::o;66307:1898::-;59564:10;66469:7;59547:28;;;:16;:28;;;;;;;;59539:47;;;;-1:-1:-1;;;59539:47:0;;;;;;;:::i;:::-;66504:32:::1;::::0;66564:27:::1;:34:::0;66615:15;;::::1;66611:60;;-1:-1:-1::0;66654:5:0;-1:-1:-1;66647:12:0::1;;66611:60;66699:6;66687:9;:18;66683:69;;;66734:6;66722:18;;66683:69;66779:9;66771:5;:17;66764:1358;;;66805:11;66819:27;66847:5;66819:34;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;67388:56:::1;::::0;-1:-1:-1;;;67388:56:0;;::::1;::::0;::::1;26453:25:1::0;;;-1:-1:-1;;;;;26514:32:1;;26494:18;;;26487:60;66819:34:0;;-1:-1:-1;67388:4:0::1;::::0;:28:::1;::::0;26426:18:1;;67388:56:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;67388:56:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;67388:56:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;67367:664;;67738:55;::::0;-1:-1:-1;;;67738:55:0;;::::1;::::0;::::1;26453:25:1::0;;;-1:-1:-1;;;;;26514:32:1;;26494:18;;;26487:60;67738:4:0::1;::::0;:27:::1;::::0;26426:18:1;;67738:55:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;67738:55:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;67738:55:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;67713:303;;67988:8;;;67713:303;67868:13;67863:76;;67910:5;;;;67863:76;67811:147;67367:664;;;67510:12;67505:67;;67547:5;;;;67505:67;67458:129;67367:664;68054:27;68082:5;68054:34;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;68047:41:::0;68103:7;::::1;::::0;::::1;:::i;:::-;;;;66790:1332;66764:1358;;;-1:-1:-1::0;68134:32:0::1;:40:::0;;;;66307:1898;-1:-1:-1;;;66307:1898:0:o;81903:2979::-;19139:21;:19;:21::i;:::-;82249:5:::1;;;;;;;;;-1:-1:-1::0;;;;;82249:5:0::1;-1:-1:-1::0;;;;;82242:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82241:37;82233:54;;;;-1:-1:-1::0;;;82233:54:0::1;;;;;;;:::i;:::-;82313:5;::::0;82306:41:::1;::::0;-1:-1:-1;;;82306:41:0;;-1:-1:-1;;;;;4701:32:1;;;82306:41:0::1;::::0;::::1;4683:51:1::0;82313:5:0;;::::1;::::0;82306:29:::1;::::0;4656:18:1;;82306:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82298:60;;;::::0;-1:-1:-1;;;82298:60:0;;26760:2:1;82298:60:0::1;::::0;::::1;26742:21:1::0;26799:1;26779:18;;;26772:29;-1:-1:-1;;;26817:18:1;;;26810:36;26863:18;;82298:60:0::1;26558:329:1::0;82298:60:0::1;82390:13;82377:9;:26;82369:44;;;;-1:-1:-1::0;;;82369:44:0::1;;;;;;;:::i;:::-;82511:11:::0;;::::1;::::0;:26:::1;;-1:-1:-1::0;82526:11:0;;::::1;82511:26;82508:92;;;82561:15:::0;;82553:35:::1;;;;-1:-1:-1::0;;;82553:35:0::1;;;;;;;:::i;:::-;82635:11:::0;;;::::1;::::0;:26:::1;;-1:-1:-1::0;82650:11:0;;::::1;82635:26;82632:321;;;82704:25;::::0;82702:27:::1;::::0;:1:::1;:27;:::i;:::-;82685:13;:44;;82677:61;;;;-1:-1:-1::0;;;82677:61:0::1;;;;;;;:::i;:::-;82632:321;;;82759:14:::0;;82756:197:::1;;82816:25;::::0;82814:27:::1;::::0;:1:::1;:27;:::i;82756:197::-;82907:25;;82890:13;:42;;82882:59;;;;-1:-1:-1::0;;;82882:59:0::1;;;;;;;:::i;:::-;83007:15:::0;83059:10;83105:9;83156:15;83201:6;83244:10;83287:7;83327;83354:15;;83351:1513:::1;;83686:86;-1:-1:-1::0;;;;;83686:41:0;::::1;83728:10;83748:4;83755:16:::0;83686:41:::1;:86::i;:::-;83858:30;;83838:16;:50;;83830:67;;;;-1:-1:-1::0;;;83830:67:0::1;;;;;;;:::i;:::-;83920:157;83933:10;83945:16;83963;83981:11;83994:10;84006:7;84015:11;84029:7;84028:8;84038:25;;84065:4;84071:5;83920:12;:157::i;:::-;83351:1513;;;84184:23;84211:7;84210:8;:117;;84285:9;::::0;84274:53:::1;::::0;-1:-1:-1;;;84274:53:0;;-1:-1:-1;;;;;4701:32:1;;;84274:53:0::1;::::0;::::1;4683:51:1::0;84285:9:0;;::::1;::::0;84274:40:::1;::::0;4656:18:1;;84274:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84210:117;;;84231:9;::::0;84220:53:::1;::::0;-1:-1:-1;;;84220:53:0;;-1:-1:-1;;;;;4701:32:1;;;84220:53:0::1;::::0;::::1;4683:51:1::0;84231:9:0;;::::1;::::0;84220:40:::1;::::0;4656:18:1;;84220:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84184:143;;84346:70;84371:15;84388:7;84397:8;84407;84346:24;:70::i;:::-;84438:12:::0;;84435:198:::1;;84474:139;84487:10;84499:1;84502:16;84520:11;84533:10;84545:7;84554:8;84564:7;84573:25;;84600:5;84607::::0;84474:12:::1;:139::i;:::-;84654:11:::0;;84651:198:::1;;84689:140;84702:10;84714:1;84717:16;84735:11;84748:10;84760:7;84769:8;84780:7;84779:8;84789:25;;84816:5;84823::::0;84689:12:::1;:140::i;:::-;84097:767;83351:1513;82965:1910;;;;;;;;19183:20:::0;18472:1;19728:7;:22;19545:213;19183:20;81903:2979;;;;;;;;;:::o;61721:1986::-;62077:7;19139:21;:19;:21::i;:::-;62113:5:::1;;;;;;;;;-1:-1:-1::0;;;;;62113:5:0::1;-1:-1:-1::0;;;;;62106:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62105:37;62097:54;;;;-1:-1:-1::0;;;62097:54:0::1;;;;;;;:::i;:::-;62177:5;::::0;62170:42:::1;::::0;-1:-1:-1;;;62170:42:0;;-1:-1:-1;;;;;4701:32:1;;;62170:42:0::1;::::0;::::1;4683:51:1::0;62177:5:0;;::::1;::::0;62170:29:::1;::::0;4656:18:1;;62170:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62162:61;;;::::0;-1:-1:-1;;;62162:61:0;;26760:2:1;62162:61:0::1;::::0;::::1;26742:21:1::0;26799:1;26779:18;;;26772:29;-1:-1:-1;;;26817:18:1;;;26810:36;26863:18;;62162:61:0::1;26558:329:1::0;62162:61:0::1;62259:9;62242:13;:26;62234:44;;;;-1:-1:-1::0;;;62234:44:0::1;;;;;;;:::i;:::-;62292:19:::0;;:40;::::1;;;-1:-1:-1::0;62315:17:0;;62292:40:::1;62289:455;;;62402:25;;62373:26;;:54;;;;:::i;:::-;62356:13;:71;;62348:89;;;;-1:-1:-1::0;;;62348:89:0::1;;;;;;;:::i;:::-;62289:455;;;62458:19:::0;;;::::1;::::0;:40:::1;;-1:-1:-1::0;62481:17:0;;::::1;62458:40;62455:289;;;62572:25;::::0;62568:29:::1;::::0;:1:::1;:29;:::i;:::-;62539:26;;:58;;;;:::i;62455:289::-;62697:25;::::0;62694:28:::1;::::0;:1:::1;:28;:::i;:::-;62665:26;;:57;;;;:::i;:::-;62648:13;:74;;62640:92;;;;-1:-1:-1::0;;;62640:92:0::1;;;;;;;:::i;:::-;62798:31;;62786:9;:43;;62777:61;;;;-1:-1:-1::0;;;62777:61:0::1;;;;;;;:::i;:::-;62849:79;-1:-1:-1::0;;;;;62849:41:0;::::1;62891:10;62911:4;62918:9:::0;62849:41:::1;:79::i;:::-;62939:19;62962:295;63004:10;63033:16;63068:11;63098:9;63126:10;63155:7;63181:16;63216:26;;62962:23;:295::i;:::-;62939:318:::0;-1:-1:-1;63271:19:0;;63268:197:::1;;63306:147;63319:10;63331:1;63334:16;63352:11;63365:10;63377:7;63386:15;63403:7;63412:25;;63439:5;63447::::0;63306:12:::1;:147::i;:::-;63478:17:::0;;63475:194:::1;;63511:146;63524:10;63536:1;63539:16;63557:11;63570:10;63582:7;63591:13;63607:7;63606:8;63616:25;;63643:5;63651::::0;63511:12:::1;:146::i;:::-;63688:11:::0;-1:-1:-1;19183:20:0;18472:1;19728:7;:22;19545:213;19183:20;61721:1986;;;;;;;;;;;:::o;94846:353::-;59782:10;59768:25;;;;:13;:25;;;;;;;;59760:44;;;;-1:-1:-1;;;59760:44:0;;;;;;;:::i;:::-;95022:16;95008:11:::1;95056:136;95071:6;95069:1;:8;95056:136;;;95101:4;:17;95119:16:::0;;95136:1;95119:19;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;95140:12;;95153:1;95140:15;;;;;;;:::i;:::-;95101:69;::::0;-1:-1:-1;;;;;;95101:69:0::1;::::0;;;;;;-1:-1:-1;;;;;27628:15:1;;;95101:69:0::1;::::0;::::1;27610:34:1::0;95140:15:0::1;::::0;;::::1;::::0;;;::::1;;27660:18:1::0;;;27653:34;-1:-1:-1;27723:15:1;;;27703:18;;;27696:43;27545:18;;95101:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;95097:84:::0;95078:3;::::1;::::0;::::1;:::i;:::-;;;;95056:136;;;;94997:202;94846:353:::0;;;;;:::o;80064:219::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;80169:39:::1;::::0;-1:-1:-1;;;80169:39:0;;80202:4:::1;80169:39;::::0;::::1;4683:51:1::0;-1:-1:-1;;;;;80169:24:0;::::1;::::0;::::1;::::0;4656:18:1;;80169:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80158:7;:50;;80150:71;;;::::0;-1:-1:-1;;;80150:71:0;;27952:2:1;80150:71:0::1;::::0;::::1;27934:21:1::0;27991:1;27971:18;;;27964:29;-1:-1:-1;;;28009:18:1;;;28002:39;28058:18;;80150:71:0::1;27750:332:1::0;80150:71:0::1;80260:5;::::0;80232:43:::1;::::0;-1:-1:-1;;;;;80232:27:0;;::::1;::::0;80260:5:::1;80267:7:::0;80232:27:::1;:43::i;94295:152::-:0;94405:33;;-1:-1:-1;;28264:2:1;28260:15;;;28256:53;94405:33:0;;;28244:66:1;28326:12;;;28319:28;;;94369:7:0;;28363:12:1;;94405:33:0;;;;;;;;;;;;94395:44;;;;;;94388:51;;94295:152;;;;:::o;87522:2126::-;19139:21;:19;:21::i;:::-;87671:32:::1;87706:6;:43;87713:35;87725:10;87736:11;87713;:35::i;:::-;87706:43:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;87706:43:0;87768:13;;87706:43;;-1:-1:-1;;;;;;87768:13:0::1;87760:47;;;;-1:-1:-1::0;;;87760:47:0::1;;;;;;;:::i;:::-;88277:21;::::0;::::1;::::0;88312::::1;::::0;::::1;::::0;;;::::1;;;88309:853;;;88528:30;;88504:20;:54;;88496:71;;;;-1:-1:-1::0;;;88496:71:0::1;;;;;;;:::i;:::-;88608:42:::0;;::::1;88582:23;88608:42:::0;88691:112:::1;;88760:42;88782:20:::0;88760:19;:42:::1;:::i;:::-;88691:112;;;88713:42;88736:19:::0;88713:20;:42:::1;:::i;:::-;88665:138;;88821:18;88818:274;;;88866:21;::::0;::::1;::::0;88859:90:::1;::::0;-1:-1:-1;;;;;88866:21:0::1;88906:10;88926:4;88933:15:::0;88859:46:::1;:90::i;:::-;88818:274;;;89045:13:::0;;;89009:21;::::1;::::0;89002:74:::1;::::0;-1:-1:-1;;;;;89009:21:0;;::::1;::::0;89045:13:::1;89060:15:::0;89002:42:::1;:74::i;:::-;-1:-1:-1::0;;89106:21:0::1;::::0;::::1;:44:::0;;;88309:853:::1;89174:18;::::0;::::1;:34:::0;;;89219:15:::1;::::0;::::1;:28:::0;;;89577:21:::1;::::0;::::1;::::0;-1:-1:-1;89316:21:0;::::1;::::0;89577::::1;89352:16:::0;::::1;::::0;89409:21:::1;::::0;::::1;::::0;89265:375:::1;::::0;89577:21:::1;::::0;;::::1;::::0;::::1;89265:375;;::::0;89291:10:::1;::::0;-1:-1:-1;;;;;;;;;;;89265:375:0;::::1;::::0;-1:-1:-1;;;;;89316:21:0;;::::1;::::0;89352:16;;;::::1;::::0;89383:11;;89237:10;;89195:13;;89508:12;;::::1;::::0;89577:21:::1;89535:27:::0;::::1;::::0;::::1;::::0;89613:16;;;::::1;::::0;;::::1;::::0;89265:375:::1;:::i;:::-;;;;;;;;87660:1988;;19183:20:::0;18472:1;19728:7;:22;19545:213;19183:20;87522:2126;;;;:::o;95207:286::-;59672:10;59659:24;;;;:12;:24;;;;;;;;59651:43;;;;-1:-1:-1;;;59651:43:0;;;;;;;:::i;:::-;95345:4;95331:11:::1;95367:119;95382:6;95380:1;:8;95367:119;;;95419:5;::::0;-1:-1:-1;;;;;95419:5:0::1;95412:31;95444:4:::0;;95449:1;95444:7;;::::1;;;;;:::i;:::-;;;;;;;95452:12;95412:53;;;;;;;;;;;;;;;26453:25:1::0;;;-1:-1:-1;;;;;26514:32:1;26509:2;26494:18;;26487:60;26441:2;26426:18;;26263:290;95412:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;95408:67:::0;95389:3;::::1;::::0;::::1;:::i;:::-;;;;95367:119;;;;95320:173;95207:286:::0;;;:::o;80963:317::-;81087:7;81084:189;;;81135:15;81122:10;:28;81114:45;;;;-1:-1:-1;;;81114:45:0;;;;;;;:::i;81084:189::-;81233:15;81220:10;:28;81212:45;;;;-1:-1:-1;;;81212:45:0;;;;;;;:::i;38034:317::-;34436:5;;-1:-1:-1;;;;;34436:5:0;34422:10;:19;34414:38;;;;-1:-1:-1;;;34414:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38138:19:0;::::1;38121:14;38138:19:::0;;;:11:::1;:19;::::0;;;;;;38172:11;;;38168:28:::1;;38187:7;89656:479:::0;;:::o;38168:28::-:1;-1:-1:-1::0;;;;;38208:19:0;::::1;38230:1;38208:19:::0;;;:11:::1;:19;::::0;;;;:23;38242:46:::1;::::0;38270:9;38281:6;38242:27:::1;:46::i;:::-;38304:39;::::0;;-1:-1:-1;;;;;30105:15:1;;;30087:34;;30157:15;;30152:2;30137:18;;30130:43;30189:18;;;30182:34;;;38304:39:0::1;::::0;30037:2:1;30022:18;38304:39:0::1;29847:375:1::0;74891:1768:0;59564:10;75053:7;59547:28;;;:16;:28;;;;;;;;59539:47;;;;-1:-1:-1;;;59539:47:0;;;;;;;:::i;:::-;75088:32:::1;::::0;75148:27:::1;:34:::0;75199:15;;::::1;75195:60;;-1:-1:-1::0;75238:5:0;-1:-1:-1;75231:12:0::1;;75195:60;75283:6;75271:9;:18;75267:69;;;75318:6;75306:18;;75267:69;75363:9;75355:5;:17;75348:1228;;;75389:11;75403:27;75431:5;75403:34;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;75842:56:::1;::::0;-1:-1:-1;;;75842:56:0;;::::1;::::0;::::1;26453:25:1::0;;;-1:-1:-1;;;;;26514:32:1;;26494:18;;;26487:60;75403:34:0;;-1:-1:-1;75842:4:0::1;::::0;:28:::1;::::0;26426:18:1;;75842:56:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;75842:56:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;75842:56:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;75821:664;;76192:55;::::0;-1:-1:-1;;;76192:55:0;;::::1;::::0;::::1;26453:25:1::0;;;-1:-1:-1;;;;;26514:32:1;;26494:18;;;26487:60;76192:4:0::1;::::0;:27:::1;::::0;26426:18:1;;76192:55:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;76192:55:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;76192:55:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;76167:303;;76442:8;;;76167:303;76322:13;76317:76;;76364:5;;;;76317:76;76265:147;75821:664;;;75964:12;75959:67;;76001:5;;;;75959:67;75912:129;75821:664;76508:27;76536:5;76508:34;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;76501:41:::0;76557:7;::::1;::::0;::::1;:::i;:::-;;;;75374:1202;75348:1228;;;-1:-1:-1::0;76588:32:0::1;:40:::0;;;;74891:1768;-1:-1:-1;;;74891:1768:0:o;81288:607::-;81418:7;81415:473;;;81444:11;;81441:92;;81493:15;81483:7;:25;81475:42;;;;-1:-1:-1;;;81475:42:0;;;;;;;:::i;:::-;81550:11;;81547:92;;81599:15;81589:7;:25;81581:42;;;;-1:-1:-1;;;81581:42:0;;;;;;;:::i;:::-;81415:473;;;81682:11;;81679:92;;81731:15;81721:7;:25;81713:42;;;;-1:-1:-1;;;81713:42:0;;;;;;;:::i;:::-;81788:11;;81785:92;;81837:15;81827:7;:25;81819:42;;;;-1:-1:-1;;;81819:42:0;;;;;;;:::i;19219:318::-;18516:1;19349:7;;:19;19345:89;;19392:30;;-1:-1:-1;;;19392:30:0;;;;;;;;;;;19345:89;18516:1;19511:7;:18;19219:318::o;78329:478::-;78490:4;78569:12;;78547:18;:35;;;;:::i;:::-;78529:15;:53;78507:109;;;;-1:-1:-1;;;78507:109:0;;30429:2:1;78507:109:0;;;30411:21:1;30468:1;30448:18;;;30441:29;-1:-1:-1;;;30486:18:1;;;30479:36;30532:18;;78507:109:0;30227:329:1;78507:109:0;78649:150;78700:20;78739:18;78776:8;78649:32;:150::i;:::-;78629:170;;78329:478;;;;;;:::o;35822:676::-;36001:7;36073:17;36093:7;:119;;36170:9;;36159:53;;-1:-1:-1;;;36159:53:0;;-1:-1:-1;;;;;4701:32:1;;;36159:53:0;;;4683:51:1;36170:9:0;;;;36159:40;;4656:18:1;;36159:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36093:119;;;36114:9;;36103:53;;-1:-1:-1;;;36103:53:0;;-1:-1:-1;;;;;4701:32:1;;;36103:53:0;;;4683:51:1;36114:9:0;;;;36103:40;;4656:18:1;;36103:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36073:139;;36227:7;36223:147;;;36272:6;36259:9;:19;;36251:37;;;;-1:-1:-1;;;36251:37:0;;;;;;;:::i;:::-;36223:147;;;36342:6;36329:9;:19;;36321:37;;;;-1:-1:-1;;;36321:37:0;;;;;;;:::i;:::-;36394:5;;36387:103;;-1:-1:-1;;;36387:103:0;;-1:-1:-1;;;;;36394:5:0;;;;36387:30;;:103;;36418:8;;36428:16;;36446:11;;36459:10;;36471:7;;36480:9;;36387:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13761:177::-;13871:58;;-1:-1:-1;;;;;31086:32:1;;13871:58:0;;;31068:51:1;31135:18;;;31128:34;;;13844:86:0;;13864:5;;-1:-1:-1;;;13894:23:0;31041:18:1;;13871:58:0;;;;-1:-1:-1;;13871:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13871:58:0;-1:-1:-1;;;;;;13871:58:0;;;;;;;;;;13844:19;:86::i;78815:359::-;78979:4;79016:150;79067:20;79106:18;79143:8;79016:32;:150::i;38359:695::-;38577:7;38603:108;38619:8;38628:15;38644:9;38654:11;38666:7;38674:10;38685:25;;38603:15;:108::i;:::-;38599:419;;;38728:22;34023:5;38788:10;;34023:5;38764:35;;;;:::i;:::-;38753:47;;:9;:47;:::i;:::-;:70;;;;:::i;:::-;38728:95;-1:-1:-1;38838:17:0;38858:26;38728:95;38858:9;:26;:::i;:::-;-1:-1:-1;;;;;38930:28:0;;;;;;:11;:28;;;;;;38838:46;;-1:-1:-1;38930:40:0;;38838:46;;38930:40;:::i;:::-;-1:-1:-1;;;;;38899:28:0;;;;;;:11;:28;;;;;:71;-1:-1:-1;38992:14:0;-1:-1:-1;38985:21:0;;38599:419;-1:-1:-1;39037:9:0;38359:695;;;;;;;;;:::o;35151:663::-;35387:17;35407:7;:119;;35484:9;;35473:53;;-1:-1:-1;;;35473:53:0;;-1:-1:-1;;;;;4701:32:1;;;35473:53:0;;;4683:51:1;35484:9:0;;;;35473:40;;4656:18:1;;35473:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35407:119;;;35428:9;;35417:53;;-1:-1:-1;;;35417:53:0;;-1:-1:-1;;;;;4701:32:1;;;35417:53:0;;;4683:51:1;35428:9:0;;;;35417:40;;4656:18:1;;35417:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35387:139;;35541:7;35537:165;;;35586:15;35573:9;:28;;35565:46;;;;-1:-1:-1;;;35565:46:0;;;;;;;:::i;:::-;35537:165;;;35665:15;35652:9;:28;;35644:46;;;;-1:-1:-1;;;35644:46:0;;;;;;;:::i;:::-;35721:5;;35714:92;;-1:-1:-1;;;35714:92:0;;-1:-1:-1;;;;;23231:15:1;;;35714:92:0;;;23213:34:1;23283:15;;;23263:18;;;23256:43;23335:15;;;23315:18;;;23308:43;23367:18;;;23360:34;;;23438:14;;23431:22;23410:19;;;23403:51;35721:5:0;;;;35714:30;;23147:19:1;;35714:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35311:503;35151:663;;;;;;:::o;84890:1666::-;-1:-1:-1;;;;;85868:20:0;;85295:15;85868:20;;;:11;:20;;;;;;85313:8;;85362:16;;85419;;85471:11;;85517:10;;85556:7;;85601:13;;85658:22;;85718:13;;85769:16;;85818:11;;85926:15;85868:20;85939:1;85926:15;:::i;:::-;-1:-1:-1;;;;;85903:20:0;;;;;;:11;:20;;;;;:38;;;;85975:32;85915:7;85995:11;85975;:32::i;:::-;85956:51;;86041:374;;;;;;;;86078:7;-1:-1:-1;;;;;86041:374:0;;;;;86104:15;-1:-1:-1;;;;;86041:374:0;;;;;86138:10;-1:-1:-1;;;;;86041:374:0;;;;;86167:15;86041:374;;;;86201:9;86041:374;;;;86229:12;86041:374;;;;86260:12;86041:374;;;;86291:6;86041:374;;;;;;86316:21;86041:374;;;;;;86356:15;86041:374;;;;;;86390:10;86041:374;;;;;86022:6;:16;86029:8;86022:16;;;;;;;;;;;:393;;;;;;;;;;;;;-1:-1:-1;;;;;86022:393:0;;;;;-1:-1:-1;;;;;86022:393:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;86022:393:0;;;;;-1:-1:-1;;;;;86022:393:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;86022:393:0;;;;;-1:-1:-1;;;;;86022:393:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86430:38;86448:9;86459:8;86430:17;:38::i;:::-;;86485:42;86506:7;86515:11;86485:20;:42::i;:::-;85280:1259;;;;;;;;;;;;;84890:1666;;;;;;;;;;;:::o;95501:387::-;95716:5;;95709:71;;-1:-1:-1;;;95709:71:0;;-1:-1:-1;;;;;31676:15:1;;;95709:71:0;;;31658:34:1;31728:15;;;31708:18;;;31701:43;31780:15;;;31760:18;;;31753:43;31839:14;;31832:22;31812:18;;;31805:50;95652:4:0;;;;95716:5;;;95709:25;;31592:19:1;;95709:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95669:111;;95810:9;95794:8;:13;;;:25;95791:68;;;95842:5;95835:12;;;;;95791:68;95876:4;95869:11;;;95501:387;;;;;;;;:::o;71850:1280::-;72147:7;72167:51;72221:314;;;;;;;;72272:8;-1:-1:-1;;;;;72221:314:0;;;;;72295:16;-1:-1:-1;;;;;72221:314:0;;;;;72326:11;-1:-1:-1;;;;;72221:314:0;;;;;72352:10;72221:314;;;;72377:7;72221:314;;;;;;72399:9;-1:-1:-1;;;;;72221:314:0;;;;;72423:16;72221:314;;;;72454:13;72221:314;;;;72482:12;72221:314;;;;72509:15;72221:314;;;72167:368;;72549:13;72564:18;72586:62;72630:7;72586:29;:62::i;:::-;72548:100;;;;72701:7;:15;;;-1:-1:-1;;;;;72664:430:0;;72731:7;:24;;;72770:7;:18;;;72803:7;:17;;;72835:7;:14;;;72864:7;:16;;;72895:7;:23;;;72933:7;:20;;;72968:5;73025:1;72988:27;:34;;;;:38;;;;:::i;:::-;72664:430;;;-1:-1:-1;;;;;33875:15:1;;;33857:34;;33927:15;;;33922:2;33907:18;;33900:43;33959:18;;33952:34;;;;34029:14;;34022:22;34017:2;34002:18;;33995:50;34082:15;;;;34076:3;34061:19;;34054:44;33837:3;34114:19;;34107:35;34173:3;34158:19;;34151:35;;;;34217:3;34202:19;;34195:35;;;;34261:3;34246:19;;34239:35;;;;73041:12:0;34305:3:1;34290:19;;34283:35;73068:15:0;34349:3:1;34334:19;;34327:36;33806:3;33791:19;72664:430:0;;;;;;;;73112:10;71850:1280;-1:-1:-1;;;;;;;;;;;71850:1280:0:o;90143:1243::-;90265:13;;-1:-1:-1;;;;;90265:27:0;90257:47;;;;-1:-1:-1;;;90257:47:0;;;;;;;:::i;:::-;90322:16;;;;:6;:16;;;;;90315:23;;-1:-1:-1;;;;;;90315:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;90315:23:0;;;90349:41;90370:9;90329:8;90349:20;:41::i;:::-;;90404:5;:21;;;90401:132;;;90484:13;;90499:21;;;;90448;;;;90441:80;;-1:-1:-1;;;;;90441:42:0;;;;;:80::i;:::-;90564:13;;90591:18;;;;90563:51;;90544:12;;-1:-1:-1;;;;;90563:20:0;;90591:18;90544:12;90563:51;90544:12;90563:51;90591:18;90563:20;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90543:71;;;90633:7;90625:24;;;;-1:-1:-1;;;90625:24:0;;;;;;;:::i;:::-;91015:5;:21;;;90667:411;;90693:5;:13;;;-1:-1:-1;;;;;90667:411:0;;90721:5;:21;;;90757:5;:16;;;90788:11;90814:5;:21;;;90850:5;:15;;;90880:5;:18;;;90913:5;:18;;;90946:5;:12;;;90973:5;:27;;;91051:5;:16;;;90667:411;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;91122:13;;91150:21;;;;91186:16;;;;;91351;;;;91096:282;;91331:5;;-1:-1:-1;;;;;91096:282:0;;-1:-1:-1;;;;;;;;;;;91096:282:0;;;91150:21;;91217:11;;91331:5;;;;;;;;;;91096:282;:::i;:::-;;;;;;;;90246:1140;90143:1243;;;:::o;46275:131::-;46348:4;46372:26;46380:3;46392:5;46372:7;:26::i;46718:117::-;46781:7;46808:19;46816:3;44559:18;;44476:109;47189:131;47263:7;47290:22;47294:3;47306:5;47290:3;:22::i;13946:205::-;14074:68;;-1:-1:-1;;;;;30105:15:1;;;14074:68:0;;;30087:34:1;30157:15;;30137:18;;;30130:43;30189:18;;;30182:34;;;14047:96:0;;14067:5;;-1:-1:-1;;;14097:27:0;30022:18:1;;14074:68:0;29847:375:1;63715:1249:0;64012:7;64032:51;64086:314;;;;;;;;64137:8;-1:-1:-1;;;;;64086:314:0;;;;;64160:16;-1:-1:-1;;;;;64086:314:0;;;;;64191:11;-1:-1:-1;;;;;64086:314:0;;;;;64217:9;64086:314;;;;64241:10;64086:314;;;;64266:7;64086:314;;;;;;64288:16;64086:314;;;;64319:13;64086:314;;;;64347:12;64086:314;;;;64374:15;64086:314;;;64032:368;;64414:13;64429:18;64451:62;64495:7;64451:29;:62::i;:::-;64413:100;;;;64566:8;-1:-1:-1;;;;;64529:399:0;;64589:16;64620:11;64646:9;64670:10;64695:7;64717:16;64748:13;64776:5;64833:1;64796:27;:34;;;;:38;;;;:::i;:::-;64529:399;;;-1:-1:-1;;;;;35795:15:1;;;35777:34;;35847:15;;;;35842:2;35827:18;;35820:43;35879:18;;;35872:34;;;;35937:2;35922:18;;35915:34;;;;35993:14;;35986:22;35980:3;35965:19;;35958:51;35757:3;36025:19;;36018:35;36084:3;36069:19;;36062:35;36128:3;36113:19;;36106:35;36172:3;36157:19;;36150:35;64849:12:0;36216:3:1;36201:19;;36194:35;64876:15:0;36260:3:1;36245:19;;36238:36;64906:11:0;36305:3:1;36290:19;;36283:36;35726:3;35711:19;64529:399:0;35288:1037:1;79182:559:0;79357:4;79380:10;79402:4;79380:27;;:59;;-1:-1:-1;79428:10:0;79411:28;;;;:16;:28;;;;;;;;79380:59;79376:157;;;79509:12;79486:19;;79463:20;:42;;;;:::i;:::-;:58;;79456:65;;;;79376:157;79551:10;-1:-1:-1;;;;;79551:22:0;;;79543:41;;;;-1:-1:-1;;;79543:41:0;;;;;;;:::i;:::-;79662:15;79640:18;;79619;:39;;;;:::i;:::-;:58;;79597:112;;;;-1:-1:-1;;;79597:112:0;;;;;;36532:2:1;36514:21;;;36571:1;36551:18;;;36544:29;-1:-1:-1;;;36604:2:1;36589:18;;36582:34;36648:2;36633:18;;36330:327;79597:112:0;-1:-1:-1;79729:4:0;79182:559;;;;;:::o;16015:761::-;16439:23;16465:69;16493:4;16465:69;;;;;;;;;;;;;;;;;16473:5;-1:-1:-1;;;;;16465:27:0;;;:69;;;;;:::i;:::-;16549:17;;16439:95;;-1:-1:-1;16549:21:0;16545:224;;16691:10;16680:30;;;;;;;;;;;;:::i;:::-;16672:85;;;;-1:-1:-1;;;16672:85:0;;36864:2:1;16672:85:0;;;36846:21:1;36903:2;36883:18;;;36876:30;36942:34;36922:18;;;36915:62;-1:-1:-1;;;36993:18:1;;;36986:40;37043:19;;16672:85:0;36662:406:1;36506:1520:0;36771:4;36875:10;36889:1;36875:15;36871:37;;-1:-1:-1;36901:4:0;36894:11;;36871:37;36967:5;;36960:74;;-1:-1:-1;;;36960:74:0;;-1:-1:-1;;;;;31676:15:1;;;36960:74:0;;;31658:34:1;31728:15;;;31708:18;;;31701:43;31780:15;;;31760:18;;;31753:43;31839:14;;31832:22;31812:18;;;31805:50;36920:37:0;;36967:5;;36960:25;;31592:19:1;;36960:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37060:13;;;;37105:19;;;;36920:114;;-1:-1:-1;37060:13:0;37045:12;37207:9;;;37203:32;;37227:5;37220:12;;;;;;;37203:32;37247:16;37266:17;37272:10;37266:4;:17;:::i;:::-;37399:5;;37392:55;;-1:-1:-1;;;37392:55:0;;-1:-1:-1;;;;;31086:32:1;;;37392:55:0;;;31068:51:1;31135:18;;;31128:34;;;37247:36:0;;-1:-1:-1;37366:23:0;;37399:5;;;;37392:27;;31041:18:1;;37392:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37366:81;-1:-1:-1;37458:22:0;37483:28;37366:81;37483:10;:28;:::i;:::-;37458:53;-1:-1:-1;37524:20:0;37576:10;37547:27;34023:5;37547:4;:27;:::i;:::-;:40;;;;:::i;:::-;37524:63;-1:-1:-1;37732:20:0;37817:14;37765:49;37788:26;34023:5;37765:49;:::i;:::-;37755:60;;:8;:60;:::i;:::-;:77;;;;:::i;:::-;37732:100;;37861:12;37846;:27;37843:151;;;37894:62;;;21798:25:1;;;21854:2;21839:18;;21832:34;;;21882:18;;;21875:34;;;37894:62:0;;21786:2:1;21771:18;37894:62:0;;;;;;;37978:4;37971:11;;;;;;;;;;;;37843:151;-1:-1:-1;38013:5:0;;36506:1520;-1:-1:-1;;;;;;;;;;;;;;;36506:1520:0:o;45974:125::-;46044:4;46068:23;46073:3;46085:5;46068:4;:23::i;86564:950::-;86644:31;86678:6;:33;86685:25;86697:8;86706:3;86685:11;:25::i;:::-;86678:33;;;;;;;;;;;;;;-1:-1:-1;86678:33:0;86644:67;;;;;;;;;-1:-1:-1;;;;;86644:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86727:398;;86644:67;;-1:-1:-1;86644:67:0;;86727:398;;;;;;;;86843:3;;86644:67;;;;;;;;86727:398;:::i;:::-;;;;;;;;87443:5;:21;;;87141:365;;87167:8;-1:-1:-1;;;;;87141:365:0;-1:-1:-1;;;;;;;;;;;87190:5:0;:21;;;87226:5;:16;;;87257:3;87275:5;:21;;;87311:5;:15;;;87341:5;:18;;;87374:5;:12;;;87401:5;:27;;;87479:5;:16;;;87141:365;;;;;;;;;;;;;;:::i;:::-;;;;;;;;86633:881;86564:950;;:::o;73138:497::-;73312:16;;-1:-1:-1;;;;;73355:31:0;;73265:7;73355:31;;;:22;:31;;;;;;73265:7;;;;;;73355:35;;73389:1;73355:35;:::i;:::-;-1:-1:-1;;;;;73401:31:0;;;;;;:22;:31;;;;;:39;;;73339:51;;-1:-1:-1;73465:29:0;73424:7;73339:51;73465:13;:29::i;:::-;73507;;;;:24;:29;;;;;;;;:40;;;;-1:-1:-1;;;;;;73507:40:0;;;-1:-1:-1;;;;;73507:40:0;;;;;;;;;;-1:-1:-1;73507:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;73507:40:0;;;;;;-1:-1:-1;;;;;;73507:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73558:27;:37;;;;;;;;;;;;;;;;-1:-1:-1;73616:5:0;;-1:-1:-1;;;73138:497:0:o;42755:1420::-;42821:4;42960:19;;;:12;;;:19;;;;;;42996:15;;42992:1176;;43371:21;43395:14;43408:1;43395:10;:14;:::i;:::-;43444:18;;43371:38;;-1:-1:-1;43424:17:0;;43444:22;;43465:1;;43444:22;:::i;:::-;43424:42;;43500:13;43487:9;:26;43483:405;;43534:17;43554:3;:11;;43566:9;43554:22;;;;;;;;:::i;:::-;;;;;;;;;43534:42;;43708:9;43679:3;:11;;43691:13;43679:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;43793:23;;;:12;;;:23;;;;;:36;;;43483:405;43969:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44064:3;:12;;:19;44077:5;44064:19;;;;;;;;;;;44057:26;;;44107:4;44100:11;;;;;;;42992:1176;44151:5;44144:12;;;;;44939:120;45006:7;45033:3;:11;;45045:5;45033:18;;;;;;;;:::i;:::-;;;;;;;;;45026:25;;44939:120;;;;:::o;70401:497::-;70575:16;;-1:-1:-1;;;;;70618:31:0;;70528:7;70618:31;;;:22;:31;;;;;;70528:7;;;;;;70618:35;;70652:1;70618:35;:::i;:::-;-1:-1:-1;;;;;70664:31:0;;;;;;:22;:31;;;;;:39;;;70602:51;;-1:-1:-1;70728:29:0;70687:7;70602:51;70728:13;:29::i;:::-;70770;;;;:24;:29;;;;;;;;:40;;;;-1:-1:-1;;;;;;70770:40:0;;;-1:-1:-1;;;;;70770:40:0;;;;;;;;;;-1:-1:-1;70770:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70770:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70821:27;:37;;;;;;;;;;;;;;;;-1:-1:-1;70879:5:0;;-1:-1:-1;;;70401:497:0:o;8894:195::-;8997:12;9029:52;9051:6;9059:4;9065:1;9068:12;9029:21;:52::i;42165:414::-;42228:4;44358:19;;;:12;;;:19;;;;;;42245:327;;-1:-1:-1;42288:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;42471:18;;42449:19;;;:12;;;:19;;;;;;:40;;;;42504:11;;42245:327;-1:-1:-1;42555:5:0;42548:12;;9946:530;10073:12;10131:5;10106:21;:30;;10098:81;;;;-1:-1:-1;;;10098:81:0;;37407:2:1;10098:81:0;;;37389:21:1;37446:2;37426:18;;;37419:30;37485:34;37465:18;;;37458:62;-1:-1:-1;;;37536:18:1;;;37529:36;37582:19;;10098:81:0;37205:402:1;10098:81:0;6343:20;;10190:60;;;;-1:-1:-1;;;10190:60:0;;37814:2:1;10190:60:0;;;37796:21:1;37853:2;37833:18;;;37826:30;37892:31;37872:18;;;37865:59;37941:18;;10190:60:0;37612:353:1;10190:60:0;10324:12;10338:23;10365:6;-1:-1:-1;;;;;10365:11:0;10385:5;10393:4;10365:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10323:75;;;;10416:52;10434:7;10443:10;10455:12;12601;12630:7;12626:595;;;-1:-1:-1;12661:10:0;12654:17;;12626:595;12775:17;;:21;12771:439;;13038:10;13032:17;13099:15;13086:10;13082:2;13078:19;13071:44;12771:439;13181:12;13174:20;;-1:-1:-1;;;13174:20:0;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;381:139::-;-1:-1:-1;;;;;464:31:1;;454:42;;444:70;;510:1;507;500:12;444:70;381:139;:::o;525:331::-;601:6;609;662:2;650:9;641:7;637:23;633:32;630:52;;;678:1;675;668:12;630:52;714:9;701:23;691:33;;774:2;763:9;759:18;746:32;787:39;820:5;787:39;:::i;:::-;845:5;835:15;;;525:331;;;;;:::o;1331:255::-;1390:6;1443:2;1431:9;1422:7;1418:23;1414:32;1411:52;;;1459:1;1456;1449:12;1411:52;1498:9;1485:23;1517:39;1550:5;1517:39;:::i;1591:118::-;1677:5;1670:13;1663:21;1656:5;1653:32;1643:60;;1699:1;1696;1689:12;1714:390;1779:6;1787;1840:2;1828:9;1819:7;1815:23;1811:32;1808:52;;;1856:1;1853;1846:12;1808:52;1895:9;1882:23;1914:39;1947:5;1914:39;:::i;:::-;1972:5;-1:-1:-1;2029:2:1;2014:18;;2001:32;2042:30;2001:32;2042:30;:::i;3315:896::-;3425:6;3433;3441;3449;3457;3465;3473;3526:3;3514:9;3505:7;3501:23;3497:33;3494:53;;;3543:1;3540;3533:12;3494:53;3582:9;3569:23;3601:39;3634:5;3601:39;:::i;:::-;3659:5;-1:-1:-1;3716:2:1;3701:18;;3688:32;3729:41;3688:32;3729:41;:::i;:::-;3789:7;-1:-1:-1;3843:2:1;3828:18;;3815:32;;-1:-1:-1;3899:2:1;3884:18;;3871:32;3912:30;3871:32;3912:30;:::i;:::-;3961:7;-1:-1:-1;4020:3:1;4005:19;;3992:33;4034:41;3992:33;4034:41;:::i;:::-;3315:896;;;;-1:-1:-1;3315:896:1;;;;4094:7;4148:3;4133:19;;4120:33;;-1:-1:-1;4200:3:1;4185:19;;;4172:33;;3315:896;-1:-1:-1;;3315:896:1:o;4216:316::-;4293:6;4301;4309;4362:2;4350:9;4341:7;4337:23;4333:32;4330:52;;;4378:1;4375;4368:12;4330:52;-1:-1:-1;;4401:23:1;;;4471:2;4456:18;;4443:32;;-1:-1:-1;4522:2:1;4507:18;;;4494:32;;4216:316;-1:-1:-1;4216:316:1:o;4745:594::-;4825:6;4833;4841;4849;4902:3;4890:9;4881:7;4877:23;4873:33;4870:53;;;4919:1;4916;4909:12;4870:53;4958:9;4945:23;4977:28;4999:5;4977:28;:::i;:::-;5024:5;-1:-1:-1;5076:2:1;5061:18;;5048:32;;-1:-1:-1;5132:2:1;5117:18;;5104:32;5145:41;5104:32;5145:41;:::i;:::-;5205:7;-1:-1:-1;5264:2:1;5249:18;;5236:32;5277:30;5236:32;5277:30;:::i;:::-;4745:594;;;;-1:-1:-1;4745:594:1;;-1:-1:-1;;4745:594:1:o;5607:480::-;5692:6;5700;5708;5761:2;5749:9;5740:7;5736:23;5732:32;5729:52;;;5777:1;5774;5767:12;5729:52;5816:9;5803:23;5835:39;5868:5;5835:39;:::i;:::-;5893:5;-1:-1:-1;5945:2:1;5930:18;;5917:32;;-1:-1:-1;6001:2:1;5986:18;;5973:32;6014:41;5973:32;6014:41;:::i;:::-;6074:7;6064:17;;;5607:480;;;;;:::o;6420:1855::-;6637:2;6689:21;;;6759:13;;6662:18;;;6781:22;;;6608:4;;6637:2;6822;;6840:18;;;;6881:15;;;6608:4;6924:1325;6938:6;6935:1;6932:13;6924:1325;;;6997:13;;7042:9;;-1:-1:-1;;;;;2360:31:1;;;2348:44;;7096:11;;;7090:18;2360:31;;7154:12;;;2348:44;7208:11;;;7202:18;2360:31;7268:12;;;2348:44;7304:4;7348:11;;;7342:18;7328:12;;;7321:40;7384:4;7428:11;;;7422:18;7408:12;;;7401:40;7464:4;7508:11;;;7502:18;7488:12;;;7481:40;7544:4;7588:11;;;7582:18;7568:12;;;7561:40;7624:4;7669:11;;;7663:18;931:13;924:21;7726:12;;;912:34;7762:6;7809:11;;;7803:18;931:13;924:21;7866:12;;;912:34;7903:6;7950:12;;;7944:19;931:13;924:21;8008:13;;;912:34;8046:6;8093:12;;;8087:19;931:13;924:21;8151:13;;;912:34;8194:6;8185:16;;;;8224:15;;;;6960:1;6953:9;6924:1325;;;-1:-1:-1;8266:3:1;;6420:1855;-1:-1:-1;;;;;;;6420:1855:1:o;8280:248::-;8348:6;8356;8409:2;8397:9;8388:7;8384:23;8380:32;8377:52;;;8425:1;8422;8415:12;8377:52;-1:-1:-1;;8448:23:1;;;8518:2;8503:18;;;8490:32;;-1:-1:-1;8280:248:1:o;9876:953::-;10004:6;10012;10020;10028;10036;10044;10052;10060;10068;10121:3;10109:9;10100:7;10096:23;10092:33;10089:53;;;10138:1;10135;10128:12;10089:53;10174:9;10161:23;10151:33;;10234:2;10223:9;10219:18;10206:32;10247:39;10280:5;10247:39;:::i;:::-;10305:5;-1:-1:-1;10357:2:1;10342:18;;10329:32;;-1:-1:-1;10413:2:1;10398:18;;10385:32;10426:41;10385:32;10426:41;:::i;:::-;10486:7;-1:-1:-1;10545:3:1;10530:19;;10517:33;10559:30;10517:33;10559:30;:::i;:::-;9876:953;;;;-1:-1:-1;9876:953:1;;;;10608:7;10662:3;10647:19;;10634:33;;-1:-1:-1;10714:3:1;10699:19;;10686:33;;10766:3;10751:19;;10738:33;;-1:-1:-1;10818:3:1;10803:19;10790:33;;-1:-1:-1;9876:953:1;-1:-1:-1;;9876:953:1:o;10834:::-;10962:6;10970;10978;10986;10994;11002;11010;11018;11026;11079:3;11067:9;11058:7;11054:23;11050:33;11047:53;;;11096:1;11093;11086:12;11047:53;11135:9;11122:23;11154:39;11187:5;11154:39;:::i;:::-;11212:5;-1:-1:-1;11269:2:1;11254:18;;11241:32;11282:41;11241:32;11282:41;:::i;:::-;11342:7;-1:-1:-1;11396:2:1;11381:18;;11368:32;;-1:-1:-1;11447:2:1;11432:18;;11419:32;;-1:-1:-1;11503:3:1;11488:19;;11475:33;11517:30;11475:33;11517:30;:::i;11792:367::-;11855:8;11865:6;11919:3;11912:4;11904:6;11900:17;11896:27;11886:55;;11937:1;11934;11927:12;11886:55;-1:-1:-1;11960:20:1;;12003:18;11992:30;;11989:50;;;12035:1;12032;12025:12;11989:50;12072:4;12064:6;12060:17;12048:29;;12132:3;12125:4;12115:6;12112:1;12108:14;12100:6;12096:27;12092:38;12089:47;12086:67;;;12149:1;12146;12139:12;12086:67;11792:367;;;;;:::o;12164:924::-;12303:6;12311;12319;12327;12335;12388:2;12376:9;12367:7;12363:23;12359:32;12356:52;;;12404:1;12401;12394:12;12356:52;12444:9;12431:23;12473:18;12514:2;12506:6;12503:14;12500:34;;;12530:1;12527;12520:12;12500:34;12569:70;12631:7;12622:6;12611:9;12607:22;12569:70;:::i;:::-;12658:8;;-1:-1:-1;12543:96:1;-1:-1:-1;12746:2:1;12731:18;;12718:32;;-1:-1:-1;12762:16:1;;;12759:36;;;12791:1;12788;12781:12;12759:36;;12830:72;12894:7;12883:8;12872:9;12868:24;12830:72;:::i;:::-;12921:8;;-1:-1:-1;12804:98:1;-1:-1:-1;;13006:2:1;12991:18;;12978:32;13019:39;12978:32;13019:39;:::i;:::-;13077:5;13067:15;;;12164:924;;;;;;;;:::o;13093:323::-;13161:6;13169;13222:2;13210:9;13201:7;13197:23;13193:32;13190:52;;;13238:1;13235;13228:12;13190:52;13277:9;13264:23;13296:39;13329:5;13296:39;:::i;:::-;13354:5;13406:2;13391:18;;;;13378:32;;-1:-1:-1;;;13093:323:1:o;13421:385::-;13507:6;13515;13523;13531;13584:3;13572:9;13563:7;13559:23;13555:33;13552:53;;;13601:1;13598;13591:12;13552:53;-1:-1:-1;;13624:23:1;;;13694:2;13679:18;;13666:32;;-1:-1:-1;13745:2:1;13730:18;;13717:32;;13796:2;13781:18;13768:32;;-1:-1:-1;13421:385:1;-1:-1:-1;13421:385:1:o;13811:588::-;13914:6;13922;13930;13983:2;13971:9;13962:7;13958:23;13954:32;13951:52;;;13999:1;13996;13989:12;13951:52;14039:9;14026:23;14072:18;14064:6;14061:30;14058:50;;;14104:1;14101;14094:12;14058:50;14143:70;14205:7;14196:6;14185:9;14181:22;14143:70;:::i;:::-;14232:8;;-1:-1:-1;14117:96:1;-1:-1:-1;;14317:2:1;14302:18;;14289:32;14330:39;14289:32;14330:39;:::i;14404:377::-;14478:6;14486;14494;14547:2;14535:9;14526:7;14522:23;14518:32;14515:52;;;14563:1;14560;14553:12;14515:52;14599:9;14586:23;14576:33;;14659:2;14648:9;14644:18;14631:32;14672:28;14694:5;14672:28;:::i;:::-;14404:377;;14719:5;;-1:-1:-1;;;14771:2:1;14756:18;;;;14743:32;;14404:377::o;14786:404::-;14854:6;14862;14915:2;14903:9;14894:7;14890:23;14886:32;14883:52;;;14931:1;14928;14921:12;14883:52;14970:9;14957:23;14989:39;15022:5;14989:39;:::i;:::-;15047:5;-1:-1:-1;15104:2:1;15089:18;;15076:32;15117:41;15076:32;15117:41;:::i;16098:446::-;16181:6;16189;16197;16205;16258:3;16246:9;16237:7;16233:23;16229:33;16226:53;;;16275:1;16272;16265:12;16226:53;16311:9;16298:23;16288:33;;16371:2;16360:9;16356:18;16343:32;16384:28;16406:5;16384:28;:::i;:::-;16098:446;;16431:5;;-1:-1:-1;;;;16483:2:1;16468:18;;16455:32;;16534:2;16519:18;16506:32;;16098:446::o;16759:327::-;16961:2;16943:21;;;17000:1;16980:18;;;16973:29;-1:-1:-1;;;17033:2:1;17018:18;;17011:34;17077:2;17062:18;;16759:327::o;17091:127::-;17152:10;17147:3;17143:20;17140:1;17133:31;17183:4;17180:1;17173:15;17207:4;17204:1;17197:15;17223:128;17290:9;;;17311:11;;;17308:37;;;17325:18;;:::i;17356:826::-;-1:-1:-1;;;;;17777:15:1;;;17759:34;;17829:15;;;17824:2;17809:18;;17802:43;17876:2;17861:18;;17854:34;;;;17931:14;;17924:22;17919:2;17904:18;;17897:50;17984:15;;;;17978:3;17963:19;;17956:44;17739:3;18016:19;;18009:35;;;;18075:3;18060:19;;18053:35;;;;18119:3;18104:19;;18097:35;;;;18163:3;18148:19;;18141:35;;;;17708:3;17693:19;;17356:826::o;18187:329::-;18389:2;18371:21;;;18428:1;18408:18;;;18401:29;-1:-1:-1;;;18461:2:1;18446:18;;18439:36;18507:2;18492:18;;18187:329::o;19343:168::-;19416:9;;;19447;;19464:15;;;19458:22;;19444:37;19434:71;;19485:18;;:::i;20020:184::-;20090:6;20143:2;20131:9;20122:7;20118:23;20114:32;20111:52;;;20159:1;20156;20149:12;20111:52;-1:-1:-1;20182:16:1;;20020:184;-1:-1:-1;20020:184:1:o;20209:132::-;20285:13;;20307:28;20285:13;20307:28;:::i;:::-;20209:132;;;:::o;20346:245::-;20413:6;20466:2;20454:9;20445:7;20441:23;20437:32;20434:52;;;20482:1;20479;20472:12;20434:52;20514:9;20508:16;20533:28;20555:5;20533:28;:::i;20596:327::-;20798:2;20780:21;;;20837:1;20817:18;;;20810:29;-1:-1:-1;;;20870:2:1;20855:18;;20848:34;20914:2;20899:18;;20596:327::o;20928:328::-;21130:2;21112:21;;;21169:1;21149:18;;;21142:29;-1:-1:-1;;;21202:2:1;21187:18;;21180:35;21247:2;21232:18;;20928:328::o;22253:329::-;22455:2;22437:21;;;22494:1;22474:18;;;22467:29;-1:-1:-1;;;22527:2:1;22512:18;;22505:36;22573:2;22558:18;;22253:329::o;22587:330::-;22789:2;22771:21;;;22828:1;22808:18;;;22801:29;-1:-1:-1;;;22861:2:1;22846:18;;22839:37;22908:2;22893:18;;22587:330::o;23465:619::-;-1:-1:-1;;;;;23802:15:1;;;23784:34;;23854:15;;;23849:2;23834:18;;23827:43;23906:15;;;23901:2;23886:18;;23879:43;23953:2;23938:18;;23931:34;;;;24009:14;24002:22;23996:3;23981:19;;23974:51;24062:15;;;23764:3;24041:19;;24034:44;23733:3;23718:19;;23465:619::o;24993:861::-;-1:-1:-1;;;;;25426:15:1;;;25408:34;;25478:15;;;;25473:2;25458:18;;25451:43;25525:2;25510:18;;25503:34;;;;25568:2;25553:18;;25546:34;;;;25611:3;25596:19;;25589:35;;;;25388:3;25640:19;;25633:35;25712:14;25705:22;25699:3;25684:19;;25677:51;25772:14;25765:22;25759:3;25744:19;;25737:51;25832:14;;25825:22;25819:3;25804:19;;25797:51;25357:3;25342:19;;24993:861::o;25859:127::-;25920:10;25915:3;25911:20;25908:1;25901:31;25951:4;25948:1;25941:15;25975:4;25972:1;25965:15;25991:127;26052:10;26047:3;26043:20;26040:1;26033:31;26083:4;26080:1;26073:15;26107:4;26104:1;26097:15;26123:135;26162:3;26183:17;;;26180:43;;26203:18;;:::i;:::-;-1:-1:-1;26250:1:1;26239:13;;26123:135::o;26892:327::-;27094:2;27076:21;;;27133:1;27113:18;;;27106:29;-1:-1:-1;;;27166:2:1;27151:18;;27144:34;27210:2;27195:18;;26892:327::o;27224:125::-;27289:9;;;27310:10;;;27307:36;;;27323:18;;:::i;29515:327::-;29717:2;29699:21;;;29756:1;29736:18;;;29729:29;-1:-1:-1;;;29789:2:1;29774:18;;29767:34;29833:2;29818:18;;29515:327::o;30561:328::-;30763:2;30745:21;;;30802:1;30782:18;;;30775:29;-1:-1:-1;;;30835:2:1;30820:18;;30813:35;30880:2;30865:18;;30561:328::o;31173:217::-;31213:1;31239;31229:132;;31283:10;31278:3;31274:20;31271:1;31264:31;31318:4;31315:1;31308:15;31346:4;31343:1;31336:15;31229:132;-1:-1:-1;31375:9:1;;31173:217::o;31866:344::-;31933:2;31927:9;31975:3;31963:16;;32009:18;31994:34;;32030:22;;;31991:62;31988:185;;;32095:10;32090:3;32086:20;32083:1;32076:31;32130:4;32127:1;32120:15;32158:4;32155:1;32148:15;31988:185;32189:2;32182:22;31866:344;:::o;32215:146::-;32294:13;;32316:39;32294:13;32316:39;:::i;32366:1026::-;32462:6;32515:3;32503:9;32494:7;32490:23;32486:33;32483:53;;;32532:1;32529;32522:12;32483:53;32558:17;;:::i;:::-;32598:40;32628:9;32598:40;:::i;:::-;32591:5;32584:55;32671:49;32716:2;32705:9;32701:18;32671:49;:::i;:::-;32666:2;32659:5;32655:14;32648:73;32753:49;32798:2;32787:9;32783:18;32753:49;:::i;:::-;32748:2;32741:5;32737:14;32730:73;32835:46;32877:2;32866:9;32862:18;32835:46;:::i;:::-;32830:2;32823:5;32819:14;32812:70;32936:3;32925:9;32921:19;32915:26;32909:3;32902:5;32898:15;32891:51;32996:3;32985:9;32981:19;32975:26;32969:3;32962:5;32958:15;32951:51;33056:3;33045:9;33041:19;33035:26;33029:3;33022:5;33018:15;33011:51;33116:3;33105:9;33101:19;33095:26;33089:3;33082:5;33078:15;33071:51;33141:3;33197:2;33186:9;33182:18;33176:25;33171:2;33164:5;33160:14;33153:49;;33221:3;33277:2;33266:9;33262:18;33256:25;33251:2;33244:5;33240:14;33233:49;;33301:3;33357:2;33346:9;33342:18;33336:25;33331:2;33324:5;33320:14;33313:49;;33381:5;33371:15;;;32366:1026;;;;:::o;34374:909::-;-1:-1:-1;;;;;34811:15:1;;;34793:34;;34863:15;;;;34858:2;34843:18;;34836:43;34910:2;34895:18;;34888:34;;;;34953:2;34938:18;;34931:34;;;;34996:3;34981:19;;34974:35;;;;34773:3;35025:19;;35018:35;35084:3;35069:19;;35062:35;35141:14;35134:22;35128:3;35113:19;;35106:51;35201:14;35194:22;35188:3;35173:19;;35166:51;35261:14;;35254:22;35248:3;35233:19;;35226:51;34742:3;34727:19;;34374:909::o;37073:127::-;37134:10;37129:3;37125:20;37122:1;37115:31;37165:4;37162:1;37155:15;37189:4;37186:1;37179:15;37970:250;38055:1;38065:113;38079:6;38076:1;38073:13;38065:113;;;38155:11;;;38149:18;38136:11;;;38129:39;38101:2;38094:10;38065:113;;;-1:-1:-1;;38212:1:1;38194:16;;38187:27;37970:250::o;38225:287::-;38354:3;38392:6;38386:13;38408:66;38467:6;38462:3;38455:4;38447:6;38443:17;38408:66;:::i;:::-;38490:16;;;;;38225:287;-1:-1:-1;;38225:287:1:o;38517:396::-;38666:2;38655:9;38648:21;38629:4;38698:6;38692:13;38741:6;38736:2;38725:9;38721:18;38714:34;38757:79;38829:6;38824:2;38813:9;38809:18;38804:2;38796:6;38792:15;38757:79;:::i;:::-;38897:2;38876:15;-1:-1:-1;;38872:29:1;38857:45;;;;38904:2;38853:54;;38517:396;-1:-1:-1;;38517:396:1:o
Swarm Source
ipfs://de8b3beae66e86e258b7f3ff43efac7d163a5ea2bf67531c3dfbb83f309ee13e
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$4,379.22
Net Worth in ETH
Token Allocations
ETH
96.74%
USDC
3.26%
Multichain Portfolio | 35 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.