Source Code
Overview
GLMR Balance
GLMR Value
$0.00Latest 25 from a total of 423 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Remove Pool Liqu... | 4551951 | 848 days ago | IN | 0 GLMR | 0.04173406 | ||||
| Remove Pool Liqu... | 3131240 | 1049 days ago | IN | 0 GLMR | 0.03559769 | ||||
| Remove Pool Liqu... | 2619437 | 1123 days ago | IN | 0 GLMR | 0.02216021 | ||||
| Add Pool Liquidi... | 2619409 | 1123 days ago | IN | 0 GLMR | 0.03165763 | ||||
| Remove Pool Liqu... | 2449963 | 1147 days ago | IN | 0 GLMR | 0.02316175 | ||||
| Add Pool Liquidi... | 2449951 | 1147 days ago | IN | 0 GLMR | 0.03165886 | ||||
| Remove Pool Liqu... | 2402528 | 1153 days ago | IN | 0 GLMR | 0.02216143 | ||||
| Add Pool Liquidi... | 2402491 | 1153 days ago | IN | 0 GLMR | 0.02728785 | ||||
| Remove Pool Liqu... | 2140486 | 1190 days ago | IN | 0 GLMR | 0.02976247 | ||||
| Remove Pool Liqu... | 2140478 | 1190 days ago | IN | 0 GLMR | 0.02332933 | ||||
| Remove Pool Liqu... | 2061783 | 1201 days ago | IN | 0 GLMR | 0.02117764 | ||||
| Remove Pool Liqu... | 1803456 | 1238 days ago | IN | 0 GLMR | 0.03298833 | ||||
| Remove Pool Liqu... | 1728183 | 1249 days ago | IN | 0 GLMR | 0.02811191 | ||||
| Remove Pool Liqu... | 1716261 | 1251 days ago | IN | 0 GLMR | 0.03298343 | ||||
| Remove Pool Liqu... | 1714754 | 1251 days ago | IN | 0 GLMR | 0.02142224 | ||||
| Add Pool Liquidi... | 1680875 | 1256 days ago | IN | 0 GLMR | 0.03015507 | ||||
| Remove Pool Liqu... | 1651068 | 1260 days ago | IN | 0 GLMR | 0.00424228 | ||||
| Remove Pool Liqu... | 1651059 | 1260 days ago | IN | 0 GLMR | 0.03136449 | ||||
| Remove Pool Liqu... | 1650809 | 1260 days ago | IN | 0 GLMR | 0.02041754 | ||||
| Remove Pool Liqu... | 1649461 | 1260 days ago | IN | 0 GLMR | 0.06616155 | ||||
| Remove Pool Liqu... | 1649008 | 1261 days ago | IN | 0 GLMR | 0.03372086 | ||||
| Remove Pool Liqu... | 1621837 | 1264 days ago | IN | 0 GLMR | 0.02973769 | ||||
| Remove Pool Liqu... | 1619754 | 1265 days ago | IN | 0 GLMR | 0.02031228 | ||||
| Add Pool Liquidi... | 1619743 | 1265 days ago | IN | 0 GLMR | 0.02453742 | ||||
| Remove Pool Liqu... | 1608914 | 1266 days ago | IN | 0 GLMR | 0.02117968 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StableSwapRouter
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-05-30
*/
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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);
}
// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/stableswap/interfaces/IStableSwap.sol
pragma solidity >=0.8.0;
interface IStableSwap {
/// EVENTS
event AddLiquidity(
address indexed provider,
uint256[] tokenAmounts,
uint256[] fees,
uint256 invariant,
uint256 tokenSupply
);
event FlashLoan(
address indexed caller,
address indexed receiver,
uint256[] amounts_out
);
event TokenExchange(
address indexed buyer,
uint256 soldId,
uint256 tokensSold,
uint256 boughtId,
uint256 tokensBought
);
event RemoveLiquidity(address indexed provider, uint256[] tokenAmounts, uint256[] fees, uint256 tokenSupply);
event RemoveLiquidityOne(address indexed provider, uint256 tokenIndex, uint256 tokenAmount, uint256 coinAmount);
event RemoveLiquidityImbalance(
address indexed provider,
uint256[] tokenAmounts,
uint256[] fees,
uint256 invariant,
uint256 tokenSupply
);
event RampA(uint256 oldA, uint256 newA, uint256 initialTime, uint256 futureTime);
event StopRampA(uint256 A, uint256 timestamp);
event NewFee(uint256 fee, uint256 adminFee);
event CollectProtocolFee(address token, uint256 amount);
event FeeControllerChanged(address newController);
event FeeDistributorChanged(address newController);
// pool data view functions
function getLpToken() external view returns (IERC20 lpToken);
function getA() external view returns (uint256);
function getAPrecise() external view returns (uint256);
function getToken(uint8 index) external view returns (IERC20);
function getTokens() external view returns (IERC20[] memory);
function getTokenIndex(address tokenAddress) external view returns (uint8);
function getTokenBalance(uint8 index) external view returns (uint256);
function getTokenBalances() external view returns (uint256[] memory);
function getNumberOfTokens() external view returns (uint256);
function getVirtualPrice() external view returns (uint256);
function calculateTokenAmount(uint256[] calldata amounts, bool deposit) external view returns (uint256);
function calculateSwap(
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx
) external view returns (uint256);
function calculateRemoveLiquidity(uint256 amount) external view returns (uint256[] memory);
function calculateRemoveLiquidityOneToken(uint256 tokenAmount, uint8 tokenIndex)
external
view
returns (uint256 availableTokenAmount);
function getAdminBalances() external view returns (uint256[] memory adminBalances);
function getAdminBalance(uint8 index) external view returns (uint256);
// state modifying functions
function swap(
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
uint256 deadline
) external returns (uint256);
function flashLoan(
uint256[] memory amountsOut,
address to,
bytes calldata data,
uint256 deadline
) external;
function addLiquidity(
uint256[] calldata amounts,
uint256 minToMint,
uint256 deadline
) external returns (uint256);
function removeLiquidity(
uint256 amount,
uint256[] calldata minAmounts,
uint256 deadline
) external returns (uint256[] memory);
function removeLiquidityOneToken(
uint256 tokenAmount,
uint8 tokenIndex,
uint256 minAmount,
uint256 deadline
) external returns (uint256);
function removeLiquidityImbalance(
uint256[] calldata amounts,
uint256 maxBurnAmount,
uint256 deadline
) external returns (uint256);
function withdrawAdminFee() external;
}
// File: contracts/periphery/interfaces/IStableSwapRouter.sol
pragma solidity >=0.8.0;
interface IStableSwapRouter {
function convert(
IStableSwap fromPool,
IStableSwap toPool,
uint256 amount,
uint256 minToMint,
address to,
uint256 deadline
) external returns (uint256);
function addPoolLiquidity(
IStableSwap pool,
uint256[] memory amounts,
uint256 minMintAmount,
address to,
uint256 deadline
) external returns (uint256);
function addPoolAndBaseLiquidity(
IStableSwap pool,
IStableSwap basePool,
uint256[] memory meta_amounts,
uint256[] memory base_amounts,
uint256 minToMint,
address to,
uint256 deadline
) external returns (uint256);
function removePoolLiquidity(
IStableSwap pool,
uint256 lpAmount,
uint256[] memory minAmounts,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function removePoolLiquidityOneToken(
IStableSwap pool,
uint256 lpAmount,
uint8 index,
uint256 minAmount,
address to,
uint256 deadline
) external returns (uint256);
function removePoolAndBaseLiquidity(
IStableSwap pool,
IStableSwap basePool,
uint256 _amount,
uint256[] calldata min_amounts_meta,
uint256[] calldata min_amounts_base,
address to,
uint256 deadline
) external returns (uint256[] memory amounts, uint256[] memory base_amounts);
function removePoolAndBaseLiquidityOneToken(
IStableSwap pool,
IStableSwap basePool,
uint256 _token_amount,
uint8 i,
uint256 _min_amount,
address to,
uint256 deadline
) external returns (uint256);
function swapPool(
IStableSwap pool,
uint8 fromIndex,
uint8 toIndex,
uint256 inAmount,
uint256 minOutAmount,
address to,
uint256 deadline
) external returns (uint256);
function swapPoolFromBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
address to,
uint256 deadline
) external returns (uint256);
function swapPoolToBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
address to,
uint256 deadline
) external returns (uint256);
function calculateConvert(
IStableSwap fromPool,
IStableSwap toPool,
uint256 amount
) external view returns (uint256);
function calculateTokenAmount(
IStableSwap pool,
IStableSwap basePool,
uint256[] memory meta_amounts,
uint256[] memory base_amounts,
bool is_deposit
) external view returns (uint256);
function calculateRemoveLiquidity(
IStableSwap pool,
IStableSwap basePool,
uint256 amount
) external view returns (uint256[] memory meta_amounts, uint256[] memory base_amounts);
function calculateRemoveBaseLiquidityOneToken(
IStableSwap pool,
IStableSwap basePool,
uint256 _token_amount,
uint8 iBase
) external view returns (uint256 availableTokenAmount);
function calculateSwap(
IStableSwap pool,
uint8 fromIndex,
uint8 toIndex,
uint256 inAmount
) external view returns (uint256);
function calculateSwapFromBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx
) external view returns (uint256);
function calculateSwapToBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx
) external view returns (uint256);
}
// File: contracts/periphery/StableSwapRouter.sol
pragma solidity >=0.8.0;
contract StableSwapRouter is IStableSwapRouter {
using SafeERC20 for IERC20;
function convert(
IStableSwap fromPool,
IStableSwap toPool,
uint256 amount,
uint256 minToMint,
address to,
uint256 deadline
) external override returns (uint256) {
uint256 fromPoolLength = fromPool.getNumberOfTokens();
uint256 toPoolLength = toPool.getNumberOfTokens();
require(address(fromPool) != address(toPool), "fromPool = toPool");
require(fromPoolLength == toPoolLength, "poolTokensLengthMissmatch");
IERC20 fromToken = fromPool.getLpToken();
IERC20 toToken = toPool.getLpToken();
uint256[] memory min_amounts = new uint256[](fromPoolLength);
// validate token
for (uint8 i = 0; i < fromPoolLength; i++) {
IERC20 coin = fromPool.getToken(i);
toPool.getTokenIndex(address(coin));
}
fromToken.safeTransferFrom(msg.sender, address(this), amount);
fromToken.safeIncreaseAllowance(address(fromPool), amount);
fromPool.removeLiquidity(amount, min_amounts, deadline);
uint256[] memory meta_amounts = new uint256[](toPoolLength);
for (uint8 i = 0; i < toPoolLength; i++) {
IERC20 coin = toPool.getToken(i);
uint256 addBalance = coin.balanceOf(address(this));
coin.safeIncreaseAllowance(address(toPool), addBalance);
meta_amounts[i] = addBalance;
}
toPool.addLiquidity(meta_amounts, minToMint, deadline);
uint256 lpAmount = toToken.balanceOf(address(this));
toToken.safeTransfer(to, lpAmount);
return lpAmount;
}
function addPoolLiquidity(
IStableSwap pool,
uint256[] memory amounts,
uint256 minMintAmount,
address to,
uint256 deadline
) external override returns (uint256) {
IERC20 token = IERC20(pool.getLpToken());
for (uint8 i = 0; i < amounts.length; i++) {
IERC20 coin = pool.getToken(i);
uint256 transferred;
if (amounts[i] > 0) {
transferred = transferIn(coin, msg.sender, amounts[i]);
}
amounts[i] = transferred;
if (transferred > 0) {
coin.safeIncreaseAllowance(address(pool), transferred);
}
}
pool.addLiquidity(amounts, minMintAmount, deadline);
uint256 lpAmount = token.balanceOf(address(this));
token.safeTransfer(to, lpAmount);
return lpAmount;
}
function addPoolAndBaseLiquidity(
IStableSwap pool,
IStableSwap basePool,
uint256[] memory meta_amounts,
uint256[] memory base_amounts,
uint256 minToMint,
address to,
uint256 deadline
) external override returns (uint256) {
IERC20 token = IERC20(pool.getLpToken());
IERC20 base_lp = IERC20(basePool.getLpToken());
require(base_amounts.length == basePool.getNumberOfTokens(), "invalidBaseAmountsLength");
require(meta_amounts.length == pool.getNumberOfTokens(), "invalidMetaAmountsLength");
bool deposit_base = false;
for (uint8 i = 0; i < base_amounts.length; i++) {
uint256 amount = base_amounts[i];
if (amount > 0) {
deposit_base = true;
IERC20 coin = basePool.getToken(i);
uint256 transferred = transferIn(coin, msg.sender, amount);
coin.safeIncreaseAllowance(address(basePool), transferred);
base_amounts[i] = transferred;
}
}
uint256 base_lp_received;
if (deposit_base) {
base_lp_received = basePool.addLiquidity(base_amounts, 0, deadline);
}
for (uint8 i = 0; i < meta_amounts.length; i++) {
IERC20 coin = pool.getToken(i);
uint256 transferred;
if (address(coin) == address(base_lp)) {
transferred = base_lp_received;
} else if (meta_amounts[i] > 0) {
transferred = transferIn(coin, msg.sender, meta_amounts[i]);
}
meta_amounts[i] = transferred;
if (transferred > 0) {
coin.safeIncreaseAllowance(address(pool), transferred);
}
}
uint256 base_lp_prior = base_lp.balanceOf(address(this));
pool.addLiquidity(meta_amounts, minToMint, deadline);
if (deposit_base) {
require((base_lp.balanceOf(address(this)) + base_lp_received) == base_lp_prior, "invalidBasePool");
}
uint256 lpAmount = token.balanceOf(address(this));
token.safeTransfer(to, lpAmount);
return lpAmount;
}
function removePoolLiquidity(
IStableSwap pool,
uint256 lpAmount,
uint256[] memory minAmounts,
address to,
uint256 deadline
) external override returns (uint256[] memory amounts) {
IERC20 token = pool.getLpToken();
token.safeTransferFrom(msg.sender, address(this), lpAmount);
token.safeIncreaseAllowance(address(pool), lpAmount);
pool.removeLiquidity(lpAmount, minAmounts, deadline);
amounts = new uint256[](pool.getNumberOfTokens());
for (uint8 i = 0; i < pool.getNumberOfTokens(); i++) {
IERC20 coin = pool.getToken(i);
amounts[i] = coin.balanceOf(address(this));
if (amounts[i] > 0) {
coin.safeTransfer(to, amounts[i]);
}
}
}
function removePoolLiquidityOneToken(
IStableSwap pool,
uint256 lpAmount,
uint8 index,
uint256 minAmount,
address to,
uint256 deadline
) external override returns (uint256) {
IERC20 token = pool.getLpToken();
token.safeTransferFrom(msg.sender, address(this), lpAmount);
token.safeIncreaseAllowance(address(pool), lpAmount);
pool.removeLiquidityOneToken(lpAmount, index, minAmount, deadline);
IERC20 coin = pool.getToken(index);
uint256 coin_amount = coin.balanceOf(address(this));
coin.safeTransfer(to, coin_amount);
return coin_amount;
}
function removePoolAndBaseLiquidity(
IStableSwap pool,
IStableSwap basePool,
uint256 _amount,
uint256[] calldata min_amounts_meta,
uint256[] calldata min_amounts_base,
address to,
uint256 deadline
) external override returns (uint256[] memory amounts, uint256[] memory base_amounts) {
IERC20 token = pool.getLpToken();
IERC20 baseToken = basePool.getLpToken();
token.safeTransferFrom(msg.sender, address(this), _amount);
token.safeIncreaseAllowance(address(pool), _amount);
pool.removeLiquidity(_amount, min_amounts_meta, deadline);
uint256 _base_amount = baseToken.balanceOf(address(this));
baseToken.safeIncreaseAllowance(address(basePool), _base_amount);
basePool.removeLiquidity(_base_amount, min_amounts_base, deadline);
// Transfer all coins out
amounts = new uint256[](pool.getNumberOfTokens());
for (uint8 i = 0; i < pool.getNumberOfTokens(); i++) {
IERC20 coin = pool.getToken(i);
amounts[i] = coin.balanceOf(address(this));
if (amounts[i] > 0) {
coin.safeTransfer(to, amounts[i]);
}
}
base_amounts = new uint256[](basePool.getNumberOfTokens());
for (uint8 i = 0; i < basePool.getNumberOfTokens(); i++) {
IERC20 coin = basePool.getToken(i);
base_amounts[i] = coin.balanceOf(address(this));
if (base_amounts[i] > 0) {
coin.safeTransfer(to, base_amounts[i]);
}
}
}
function removePoolAndBaseLiquidityOneToken(
IStableSwap pool,
IStableSwap basePool,
uint256 _token_amount,
uint8 i,
uint256 _min_amount,
address to,
uint256 deadline
) external override returns (uint256) {
IERC20 token = pool.getLpToken();
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
token.safeTransferFrom(msg.sender, address(this), _token_amount);
token.safeIncreaseAllowance(address(pool), _token_amount);
pool.removeLiquidityOneToken(_token_amount, baseTokenIndex, 0, deadline);
uint256 _base_amount = baseToken.balanceOf(address(this));
baseToken.safeIncreaseAllowance(address(basePool), _base_amount);
basePool.removeLiquidityOneToken(_base_amount, i, _min_amount, deadline);
IERC20 coin = basePool.getToken(i);
uint256 coin_amount = coin.balanceOf(address(this));
coin.safeTransfer(to, coin_amount);
return coin_amount;
}
function swapPool(
IStableSwap pool,
uint8 fromIndex,
uint8 toIndex,
uint256 inAmount,
uint256 minOutAmount,
address to,
uint256 deadline
) external override returns (uint256) {
IERC20 coin = pool.getToken(fromIndex);
coin.safeTransferFrom(msg.sender, address(this), inAmount);
coin.safeIncreaseAllowance(address(pool), inAmount);
pool.swap(fromIndex, toIndex, inAmount, minOutAmount, deadline);
IERC20 coinTo = pool.getToken(toIndex);
uint256 amountOut = coinTo.balanceOf(address(this));
coinTo.safeTransfer(to, amountOut);
return amountOut;
}
function swapPoolFromBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
address to,
uint256 deadline
) external override returns (uint256) {
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
uint256[] memory base_amounts = new uint256[](basePool.getNumberOfTokens());
base_amounts[tokenIndexFrom] = dx;
IERC20 coin = basePool.getToken(tokenIndexFrom);
coin.safeTransferFrom(msg.sender, address(this), dx);
coin.safeIncreaseAllowance(address(basePool), dx);
uint256 baseLpAmount = basePool.addLiquidity(base_amounts, 0, deadline);
if (baseTokenIndex != tokenIndexTo) {
baseToken.safeIncreaseAllowance(address(pool), baseLpAmount);
pool.swap(baseTokenIndex, tokenIndexTo, baseLpAmount, minDy, deadline);
}
IERC20 coinTo = pool.getToken(tokenIndexTo);
uint256 amountOut = coinTo.balanceOf(address(this));
coinTo.safeTransfer(to, amountOut);
return amountOut;
}
function swapPoolToBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
address to,
uint256 deadline
) external override returns (uint256) {
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
IERC20 coin = pool.getToken(tokenIndexFrom);
coin.safeTransferFrom(msg.sender, address(this), dx);
uint256 tokenLPAmount = dx;
if (baseTokenIndex != tokenIndexFrom) {
coin.safeIncreaseAllowance(address(pool), dx);
tokenLPAmount = pool.swap(tokenIndexFrom, baseTokenIndex, dx, 0, deadline);
}
baseToken.safeIncreaseAllowance(address(basePool), tokenLPAmount);
basePool.removeLiquidityOneToken(tokenLPAmount, tokenIndexTo, minDy, deadline);
IERC20 coinTo = basePool.getToken(tokenIndexTo);
uint256 amountOut = coinTo.balanceOf(address(this));
coinTo.safeTransfer(to, amountOut);
return amountOut;
}
// =========== VIEW ===========
function calculateConvert(
IStableSwap fromPool,
IStableSwap toPool,
uint256 amount
) external override view returns (uint256) {
uint256 fromPoolLength = fromPool.getNumberOfTokens();
uint256[] memory amounts = fromPool.calculateRemoveLiquidity(amount);
uint256[] memory meta_amounts = new uint256[](fromPoolLength);
for (uint8 i = 0; i < fromPoolLength; i++) {
IERC20 fromCoin = fromPool.getToken(i);
uint256 toCoinIndex = toPool.getTokenIndex(address(fromCoin));
meta_amounts[toCoinIndex] = amounts[i];
}
return toPool.calculateTokenAmount(meta_amounts, true);
}
function calculateTokenAmount(
IStableSwap pool,
IStableSwap basePool,
uint256[] memory meta_amounts,
uint256[] memory base_amounts,
bool is_deposit
) external override view returns (uint256) {
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
uint256 _base_tokens = basePool.calculateTokenAmount(base_amounts, is_deposit);
meta_amounts[baseTokenIndex] = meta_amounts[baseTokenIndex] + _base_tokens;
return pool.calculateTokenAmount(meta_amounts, is_deposit);
}
function calculateRemoveLiquidity(
IStableSwap pool,
IStableSwap basePool,
uint256 amount
) external override view returns (uint256[] memory meta_amounts, uint256[] memory base_amounts) {
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
meta_amounts = pool.calculateRemoveLiquidity(amount);
uint256 lpAmount = meta_amounts[baseTokenIndex];
meta_amounts[baseTokenIndex] = 0;
base_amounts = basePool.calculateRemoveLiquidity(lpAmount);
}
function calculateRemoveBaseLiquidityOneToken(
IStableSwap pool,
IStableSwap basePool,
uint256 _token_amount,
uint8 iBase
) external override view returns (uint256 availableTokenAmount) {
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
uint256 _base_tokens = pool.calculateRemoveLiquidityOneToken(_token_amount, baseTokenIndex);
availableTokenAmount = basePool.calculateRemoveLiquidityOneToken(_base_tokens, iBase);
}
function calculateSwap(
IStableSwap pool,
uint8 fromIndex,
uint8 toIndex,
uint256 inAmount
) external override view returns (uint256) {
return pool.calculateSwap(fromIndex, toIndex, inAmount);
}
function calculateSwapFromBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx
) external override view returns (uint256) {
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
uint256[] memory base_amounts = new uint256[](basePool.getNumberOfTokens());
base_amounts[tokenIndexFrom] = dx;
uint256 baseLpAmount = basePool.calculateTokenAmount(base_amounts, true);
if (baseTokenIndex == tokenIndexTo) {
return baseLpAmount;
}
return pool.calculateSwap(baseTokenIndex, tokenIndexTo, baseLpAmount);
}
function calculateSwapToBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx
) external override view returns (uint256) {
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
uint256 tokenLPAmount = dx;
if (baseTokenIndex != tokenIndexFrom) {
tokenLPAmount = pool.calculateSwap(tokenIndexFrom, baseTokenIndex, dx);
}
return basePool.calculateRemoveLiquidityOneToken(tokenLPAmount, tokenIndexTo);
}
function transferIn(
IERC20 token,
address from,
uint256 amount
) internal returns (uint256 transferred) {
uint256 prior_balance = token.balanceOf(address(this));
token.safeTransferFrom(from, address(this), amount);
transferred = token.balanceOf(address(this)) - prior_balance;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint256[]","name":"meta_amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"base_amounts","type":"uint256[]"},{"internalType":"uint256","name":"minToMint","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addPoolAndBaseLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minMintAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addPoolLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"fromPool","type":"address"},{"internalType":"contract IStableSwap","name":"toPool","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateConvert","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint256","name":"_token_amount","type":"uint256"},{"internalType":"uint8","name":"iBase","type":"uint8"}],"name":"calculateRemoveBaseLiquidityOneToken","outputs":[{"internalType":"uint256","name":"availableTokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateRemoveLiquidity","outputs":[{"internalType":"uint256[]","name":"meta_amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"base_amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint8","name":"fromIndex","type":"uint8"},{"internalType":"uint8","name":"toIndex","type":"uint8"},{"internalType":"uint256","name":"inAmount","type":"uint256"}],"name":"calculateSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"calculateSwapFromBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"calculateSwapToBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint256[]","name":"meta_amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"base_amounts","type":"uint256[]"},{"internalType":"bool","name":"is_deposit","type":"bool"}],"name":"calculateTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"fromPool","type":"address"},{"internalType":"contract IStableSwap","name":"toPool","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minToMint","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"convert","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"min_amounts_meta","type":"uint256[]"},{"internalType":"uint256[]","name":"min_amounts_base","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removePoolAndBaseLiquidity","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"base_amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint256","name":"_token_amount","type":"uint256"},{"internalType":"uint8","name":"i","type":"uint8"},{"internalType":"uint256","name":"_min_amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removePoolAndBaseLiquidityOneToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removePoolLiquidity","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"},{"internalType":"uint8","name":"index","type":"uint8"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removePoolLiquidityOneToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint8","name":"fromIndex","type":"uint8"},{"internalType":"uint8","name":"toIndex","type":"uint8"},{"internalType":"uint256","name":"inAmount","type":"uint256"},{"internalType":"uint256","name":"minOutAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPoolFromBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPoolToBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b506150f3806100206000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063643abb86116100a2578063b404d95911610071578063b404d95914610222578063b56527bd14610235578063b61f8d0514610248578063d3f051351461025b578063d74fff4e1461026e57600080fd5b8063643abb86146101d657806377269e29146101e9578063798af720146101fc5780638a311c571461020f57600080fd5b8063357b32f0116100de578063357b32f01461017d5780634d7602441461019057806354681c41146101b057806357c9ee3e146101c357600080fd5b806304b70f0a1461011057806305023d2c146101365780630c8b2216146101495780633214b8c91461016a575b600080fd5b61012361011e3660046148ad565b610281565b6040519081526020015b60405180910390f35b61012361014436600461479d565b610a5c565b61015c61015736600461495d565b610d13565b60405161012d929190614e60565b610123610178366004614b76565b610f55565b61012361018b366004614d5c565b611173565b6101a361019e366004614c57565b6113d3565b60405161012d9190614e4d565b6101236101be366004614abf565b6117c0565b6101236101d1366004614a58565b6119ca565b6101236101e436600461495d565b61210f565b6101236101f7366004614810565b612438565b61012361020a366004614d0b565b612625565b61012361021d366004614b76565b6126b1565b61015c61023036600461499e565b6129a3565b610123610243366004614bc9565b6131b8565b610123610256366004614cb9565b61369b565b610123610269366004614b12565b6138db565b61012361027c366004614bc9565b613d31565b600080886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f59190614780565b90506000886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561033257600080fd5b505afa158015610346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036a9190614780565b9050886001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b1580156103a557600080fd5b505afa1580156103b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103dd9190614dc0565b8751146104315760405162461bcd60e51b815260206004820152601860248201527f696e76616c696442617365416d6f756e74734c656e677468000000000000000060448201526064015b60405180910390fd5b896001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561046a57600080fd5b505afa15801561047e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a29190614dc0565b8851146104f15760405162461bcd60e51b815260206004820152601860248201527f696e76616c69644d657461416d6f756e74734c656e67746800000000000000006044820152606401610428565b6000805b88518160ff161015610608576000898260ff16815181106105185761051861505c565b6020026020010151905060008111156105f55760405162415c3360e91b815260ff83166004820152600193506000906001600160a01b038e16906382b866009060240160206040518083038186803b15801561057357600080fd5b505afa158015610587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ab9190614780565b905060006105ba82338561413f565b90506105d06001600160a01b0383168f83614255565b808c8560ff16815181106105e6576105e661505c565b60200260200101818152505050505b508061060081615026565b9150506104f5565b506000811561069757604051634d49e87d60e01b81526001600160a01b038c1690634d49e87d90610642908c906000908b90600401614ea9565b602060405180830381600087803b15801561065c57600080fd5b505af1158015610670573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106949190614dc0565b90505b60005b8a518160ff1610156107f05760405162415c3360e91b815260ff821660048201526000906001600160a01b038f16906382b866009060240160206040518083038186803b1580156106ea57600080fd5b505afa1580156106fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107229190614780565b90506000856001600160a01b0316826001600160a01b03161415610747575082610796565b60008d8460ff168151811061075e5761075e61505c565b602002602001015111156107965761079382338f8660ff16815181106107865761078661505c565b602002602001015161413f565b90505b808d8460ff16815181106107ac576107ac61505c565b602090810291909101015280156107db576107db8f82846001600160a01b03166142559092919063ffffffff16565b505080806107e890615026565b91505061069a565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561083357600080fd5b505afa158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b9190614dc0565b604051634d49e87d60e01b81529091506001600160a01b038e1690634d49e87d9061089e908e908d908c90600401614ea9565b602060405180830381600087803b1580156108b857600080fd5b505af11580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190614dc0565b5082156109bb576040516370a0823160e01b8152306004820152819083906001600160a01b038716906370a082319060240160206040518083038186803b15801561093a57600080fd5b505afa15801561094e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109729190614dc0565b61097c9190614fcb565b146109bb5760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a5910985cd9541bdbdb608a1b6044820152606401610428565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b1580156109fd57600080fd5b505afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a359190614dc0565b9050610a4b6001600160a01b0387168a8361434f565b9d9c50505050505050505050505050565b600080866001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610a9857600080fd5b505afa158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad09190614780565b905060005b86518160ff161015610bf25760405162415c3360e91b815260ff821660048201526000906001600160a01b038a16906382b866009060240160206040518083038186803b158015610b2557600080fd5b505afa158015610b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5d9190614780565b9050600080898460ff1681518110610b7757610b7761505c565b60200260200101511115610ba257610b9f82338b8660ff16815181106107865761078661505c565b90505b80898460ff1681518110610bb857610bb861505c565b60209081029190910101528015610bdd57610bdd6001600160a01b0383168b83614255565b50508080610bea90615026565b915050610ad5565b50604051634d49e87d60e01b81526001600160a01b03881690634d49e87d90610c2390899089908890600401614ea9565b602060405180830381600087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c759190614dc0565b506040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610cb857600080fd5b505afa158015610ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf09190614dc0565b9050610d066001600160a01b038316868361434f565b9150505b95945050505050565b6060806000846001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610d5157600080fd5b505afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d899190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918816906366c0bd249060240160206040518083038186803b158015610dd057600080fd5b505afa158015610de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e089190614dd9565b60405163797d695b60e11b8152600481018790529091506001600160a01b0388169063f2fad2b69060240160006040518083038186803b158015610e4b57600080fd5b505afa158015610e5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e8791908101906146cc565b93506000848260ff1681518110610ea057610ea061505c565b602002602001015190506000858360ff1681518110610ec157610ec161505c565b602090810291909101015260405163797d695b60e11b8152600481018290526001600160a01b0388169063f2fad2b69060240160006040518083038186803b158015610f0c57600080fd5b505afa158015610f20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f4891908101906146cc565b9350505050935093915050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9157600080fd5b505afa158015610fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc99190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b15801561101057600080fd5b505afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110489190614dd9565b90508360ff808316908816146110e45760405163a95b089f60e01b815260ff808916600483015283166024820152604481018690526001600160a01b038a169063a95b089f9060640160206040518083038186803b1580156110a957600080fd5b505afa1580156110bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e19190614dc0565b90505b60405163342a87a160e01b81526004810182905260ff871660248201526001600160a01b0389169063342a87a1906044015b60206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111669190614dc0565b9998505050505050505050565b60405162415c3360e91b815260ff8716600482015260009081906001600160a01b038a16906382b866009060240160206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f19190614780565b90506112086001600160a01b038216333089614384565b61121c6001600160a01b0382168a88614255565b6040516348b4aac360e11b815260ff808a166004830152881660248201526044810187905260648101869052608481018490526001600160a01b038a169063916955869060a401602060405180830381600087803b15801561127d57600080fd5b505af1158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b59190614dc0565b5060405162415c3360e91b815260ff881660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b1580156112fa57600080fd5b505afa15801561130e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113329190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113af9190614dc0565b90506113c56001600160a01b038316878361434f565b9a9950505050505050505050565b60606000866001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561141057600080fd5b505afa158015611424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114489190614780565b905061145f6001600160a01b038216333089614384565b6114736001600160a01b0382168888614255565b60405163031cd52b60e41b81526001600160a01b038816906331cd52b0906114a390899089908890600401614f4f565b600060405180830381600087803b1580156114bd57600080fd5b505af11580156114d1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114f991908101906146cc565b50866001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561153357600080fd5b505afa158015611547573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156b9190614dc0565b6001600160401b0381111561158257611582615072565b6040519080825280602002602001820160405280156115ab578160200160208202803683370190505b50915060005b876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ea57600080fd5b505afa1580156115fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116229190614dc0565b8160ff1610156117b55760405162415c3360e91b815260ff821660048201526000906001600160a01b038a16906382b866009060240160206040518083038186803b15801561167057600080fd5b505afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190614780565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a082319060240160206040518083038186803b1580156116ea57600080fd5b505afa1580156116fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117229190614dc0565b848360ff16815181106117375761173761505c565b6020026020010181815250506000848360ff168151811061175a5761175a61505c565b602002602001015111156117a2576117a286858460ff16815181106117815761178161505c565b6020026020010151836001600160a01b031661434f9092919063ffffffff16565b50806117ad81615026565b9150506115b1565b505095945050505050565b600080846001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156117fc57600080fd5b505afa158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918816906366c0bd249060240160206040518083038186803b15801561187b57600080fd5b505afa15801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b39190614dd9565b60405163342a87a160e01b81526004810187905260ff821660248201529091506000906001600160a01b0389169063342a87a19060440160206040518083038186803b15801561190257600080fd5b505afa158015611916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193a9190614dc0565b60405163342a87a160e01b81526004810182905260ff871660248201529091506001600160a01b0388169063342a87a19060440160206040518083038186803b15801561198657600080fd5b505afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119be9190614dc0565b98975050505050505050565b600080876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3e9190614dc0565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7b57600080fd5b505afa158015611a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab39190614dc0565b9050876001600160a01b0316896001600160a01b03161415611b0b5760405162461bcd60e51b8152602060048201526011602482015270199c9bdb541bdbdb080f481d1bd41bdbdb607a1b6044820152606401610428565b808214611b5a5760405162461bcd60e51b815260206004820152601960248201527f706f6f6c546f6b656e734c656e6774684d6973736d61746368000000000000006044820152606401610428565b6000896001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611b9557600080fd5b505afa158015611ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcd9190614780565b90506000896001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611c0a57600080fd5b505afa158015611c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c429190614780565b90506000846001600160401b03811115611c5e57611c5e615072565b604051908082528060200260200182016040528015611c87578160200160208202803683370190505b50905060005b858160ff161015611da65760405162415c3360e91b815260ff821660048201526000906001600160a01b038f16906382b866009060240160206040518083038186803b158015611cdc57600080fd5b505afa158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d149190614780565b6040516319b02f4960e21b81526001600160a01b038083166004830152919250908e16906366c0bd249060240160206040518083038186803b158015611d5957600080fd5b505afa158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d919190614dd9565b50508080611d9e90615026565b915050611c8d565b50611dbc6001600160a01b03841633308d614384565b611dd06001600160a01b0384168d8c614255565b60405163031cd52b60e41b81526001600160a01b038d16906331cd52b090611e00908d9085908c90600401614f4f565b600060405180830381600087803b158015611e1a57600080fd5b505af1158015611e2e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e5691908101906146cc565b506000846001600160401b03811115611e7157611e71615072565b604051908082528060200260200182016040528015611e9a578160200160208202803683370190505b50905060005b858160ff161015611ffb5760405162415c3360e91b815260ff821660048201526000906001600160a01b038f16906382b866009060240160206040518083038186803b158015611eef57600080fd5b505afa158015611f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f279190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190614dc0565b9050611fc48f82846001600160a01b03166142559092919063ffffffff16565b80848460ff1681518110611fda57611fda61505c565b60200260200101818152505050508080611ff390615026565b915050611ea0565b50604051634d49e87d60e01b81526001600160a01b038d1690634d49e87d9061202c9084908e908d90600401614ea9565b602060405180830381600087803b15801561204657600080fd5b505af115801561205a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207e9190614dc0565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f99190614dc0565b9050610a4b6001600160a01b0385168b8361434f565b600080846001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561214b57600080fd5b505afa15801561215f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121839190614dc0565b60405163797d695b60e11b8152600481018590529091506000906001600160a01b0387169063f2fad2b69060240160006040518083038186803b1580156121c957600080fd5b505afa1580156121dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261220591908101906146cc565b90506000826001600160401b0381111561222157612221615072565b60405190808252806020026020018201604052801561224a578160200160208202803683370190505b50905060005b838160ff1610156123ab5760405162415c3360e91b815260ff821660048201526000906001600160a01b038a16906382b866009060240160206040518083038186803b15801561229f57600080fd5b505afa1580156122b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d79190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918a16906366c0bd249060240160206040518083038186803b15801561231e57600080fd5b505afa158015612332573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123569190614dd9565b60ff169050848360ff16815181106123705761237061505c565b602002602001015184828151811061238a5761238a61505c565b602002602001018181525050505080806123a390615026565b915050612250565b50604051637355940360e11b81526001600160a01b0387169063e6ab2806906123db908490600190600401614e85565b60206040518083038186803b1580156123f357600080fd5b505afa158015612407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242b9190614dc0565b93505050505b9392505050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561247457600080fd5b505afa158015612488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ac9190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b1580156124f357600080fd5b505afa158015612507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252b9190614dd9565b90506000876001600160a01b031663e6ab280687876040518363ffffffff1660e01b815260040161255d929190614e85565b60206040518083038186803b15801561257557600080fd5b505afa158015612589573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ad9190614dc0565b905080878360ff16815181106125c5576125c561505c565b60200260200101516125d79190614fcb565b878360ff16815181106125ec576125ec61505c565b6020908102919091010152604051637355940360e11b81526001600160a01b038a169063e6ab280690611116908a908990600401614e85565b60405163a95b089f60e01b815260ff808516600483015283166024820152604481018290526000906001600160a01b0386169063a95b089f9060640160206040518083038186803b15801561267957600080fd5b505afa15801561268d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0a9190614dc0565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ed57600080fd5b505afa158015612701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127259190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b15801561276c57600080fd5b505afa158015612780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a49190614dd9565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e157600080fd5b505afa1580156127f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128199190614dc0565b6001600160401b0381111561283057612830615072565b604051908082528060200260200182016040528015612859578160200160208202803683370190505b50905084818860ff16815181106128725761287261505c565b6020908102919091010152604051637355940360e11b81526000906001600160a01b038a169063e6ab2806906128af908590600190600401614e85565b60206040518083038186803b1580156128c757600080fd5b505afa1580156128db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ff9190614dc0565b90508660ff168360ff16141561291a579350610d0a92505050565b60405163a95b089f60e01b815260ff808516600483015288166024820152604481018290526001600160a01b038b169063a95b089f9060640160206040518083038186803b15801561296b57600080fd5b505afa15801561297f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c59190614dc0565b60608060008b6001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e157600080fd5b505afa1580156129f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a199190614780565b905060008b6001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612a5657600080fd5b505afa158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190614780565b9050612aa56001600160a01b03831633308e614384565b612ab96001600160a01b0383168e8d614255565b60405163031cd52b60e41b81526001600160a01b038e16906331cd52b090612aeb908e908e908e908b90600401614f01565b600060405180830381600087803b158015612b0557600080fd5b505af1158015612b19573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b4191908101906146cc565b506040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015612b8457600080fd5b505afa158015612b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbc9190614dc0565b9050612bd26001600160a01b0383168e83614255565b60405163031cd52b60e41b81526001600160a01b038e16906331cd52b090612c049084908d908d908c90600401614f01565b600060405180830381600087803b158015612c1e57600080fd5b505af1158015612c32573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c5a91908101906146cc565b508d6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612c9457600080fd5b505afa158015612ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccc9190614dc0565b6001600160401b03811115612ce357612ce3615072565b604051908082528060200260200182016040528015612d0c578160200160208202803683370190505b50945060005b8e6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612d4b57600080fd5b505afa158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d839190614dc0565b8160ff161015612f005760008f6001600160a01b03166382b86600836040518263ffffffff1660e01b8152600401612dc4919060ff91909116815260200190565b60206040518083038186803b158015612ddc57600080fd5b505afa158015612df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e149190614780565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a082319060240160206040518083038186803b158015612e5657600080fd5b505afa158015612e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8e9190614dc0565b878360ff1681518110612ea357612ea361505c565b6020026020010181815250506000878360ff1681518110612ec657612ec661505c565b60200260200101511115612eed57612eed89888460ff16815181106117815761178161505c565b5080612ef881615026565b915050612d12565b508c6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3a57600080fd5b505afa158015612f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f729190614dc0565b6001600160401b03811115612f8957612f89615072565b604051908082528060200260200182016040528015612fb2578160200160208202803683370190505b50935060005b8d6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612ff157600080fd5b505afa158015613005573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130299190614dc0565b8160ff1610156131a65760008e6001600160a01b03166382b86600836040518263ffffffff1660e01b815260040161306a919060ff91909116815260200190565b60206040518083038186803b15801561308257600080fd5b505afa158015613096573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ba9190614780565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a082319060240160206040518083038186803b1580156130fc57600080fd5b505afa158015613110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131349190614dc0565b868360ff16815181106131495761314961505c565b6020026020010181815250506000868360ff168151811061316c5761316c61505c565b602002602001015111156131935761319389878460ff16815181106117815761178161505c565b508061319e81615026565b915050612fb8565b50505050995099975050505050505050565b600080886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f457600080fd5b505afa158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c9190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918c16906366c0bd249060240160206040518083038186803b15801561327357600080fd5b505afa158015613287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ab9190614dd9565b905060008a6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b1580156132e857600080fd5b505afa1580156132fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133209190614dc0565b6001600160401b0381111561333757613337615072565b604051908082528060200260200182016040528015613360578160200160208202803683370190505b50905087818b60ff16815181106133795761337961505c565b602090810291909101015260405162415c3360e91b815260ff8b1660048201526000906001600160a01b038d16906382b866009060240160206040518083038186803b1580156133c857600080fd5b505afa1580156133dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134009190614780565b90506134176001600160a01b03821633308c614384565b61342b6001600160a01b0382168d8b614255565b604051634d49e87d60e01b81526000906001600160a01b038e1690634d49e87d9061345e90869085908c90600401614ea9565b602060405180830381600087803b15801561347857600080fd5b505af115801561348c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b09190614dc0565b90508a60ff168460ff161461356e576134d36001600160a01b0386168f83614255565b6040516348b4aac360e11b815260ff80861660048301528c16602482015260448101829052606481018a9052608481018890526001600160a01b038f169063916955869060a401602060405180830381600087803b15801561353457600080fd5b505af1158015613548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356c9190614dc0565b505b60008e6001600160a01b03166382b866008d6040518263ffffffff1660e01b81526004016135a5919060ff91909116815260200190565b60206040518083038186803b1580156135bd57600080fd5b505afa1580156135d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f59190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561363a57600080fd5b505afa15801561364e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136729190614dc0565b90506136886001600160a01b0383168b8361434f565b9f9e505050505050505050505050505050565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156136d757600080fd5b505afa1580156136eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370f9190614780565b90506137266001600160a01b03821633308a614384565b61373a6001600160a01b0382168989614255565b6040516301f1d0ab60e51b81526004810188905260ff8716602482015260448101869052606481018490526001600160a01b03891690633e3a156090608401602060405180830381600087803b15801561379357600080fd5b505af11580156137a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cb9190614dc0565b5060405162415c3360e91b815260ff871660048201526000906001600160a01b038a16906382b866009060240160206040518083038186803b15801561381057600080fd5b505afa158015613824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138489190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561388d57600080fd5b505afa1580156138a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c59190614dc0565b90506111666001600160a01b038316878361434f565b600080886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561391757600080fd5b505afa15801561392b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061394f9190614780565b90506000886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561398c57600080fd5b505afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c49190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918c16906366c0bd249060240160206040518083038186803b158015613a0b57600080fd5b505afa158015613a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a439190614dd9565b9050613a5a6001600160a01b03841633308c614384565b613a6e6001600160a01b0384168c8b614255565b6040516301f1d0ab60e51b8152600481018a905260ff8216602482015260006044820152606481018690526001600160a01b038c1690633e3a156090608401602060405180830381600087803b158015613ac757600080fd5b505af1158015613adb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aff9190614dc0565b506040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015613b4257600080fd5b505afa158015613b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7a9190614dc0565b9050613b906001600160a01b0384168c83614255565b6040516301f1d0ab60e51b81526004810182905260ff8a16602482015260448101899052606481018790526001600160a01b038c1690633e3a156090608401602060405180830381600087803b158015613be957600080fd5b505af1158015613bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c219190614dc0565b5060405162415c3360e91b815260ff8a1660048201526000906001600160a01b038d16906382b866009060240160206040518083038186803b158015613c6657600080fd5b505afa158015613c7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c9e9190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015613ce357600080fd5b505afa158015613cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1b9190614dc0565b9050610a4b6001600160a01b0383168a8361434f565b600080886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015613d6d57600080fd5b505afa158015613d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da59190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918c16906366c0bd249060240160206040518083038186803b158015613dec57600080fd5b505afa158015613e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e249190614dd9565b60405162415c3360e91b815260ff8b1660048201529091506000906001600160a01b038d16906382b866009060240160206040518083038186803b158015613e6b57600080fd5b505afa158015613e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ea39190614780565b9050613eba6001600160a01b03821633308b614384565b8760ff838116908c1614613f7857613edc6001600160a01b0383168e8b614255565b6040516348b4aac360e11b815260ff808d16600483015284166024820152604481018a905260006064820152608481018790526001600160a01b038e169063916955869060a401602060405180830381600087803b158015613f3d57600080fd5b505af1158015613f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f759190614dc0565b90505b613f8c6001600160a01b0385168d83614255565b6040516301f1d0ab60e51b81526004810182905260ff8b16602482015260448101899052606481018790526001600160a01b038d1690633e3a156090608401602060405180830381600087803b158015613fe557600080fd5b505af1158015613ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061401d9190614dc0565b5060405162415c3360e91b815260ff8b1660048201526000906001600160a01b038e16906382b866009060240160206040518083038186803b15801561406257600080fd5b505afa158015614076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061409a9190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b1580156140df57600080fd5b505afa1580156140f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141179190614dc0565b905061412d6001600160a01b0383168a8361434f565b9e9d5050505050505050505050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038616906370a082319060240160206040518083038186803b15801561418357600080fd5b505afa158015614197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141bb9190614dc0565b90506141d26001600160a01b038616853086614384565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a082319060240160206040518083038186803b15801561421357600080fd5b505afa158015614227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424b9190614dc0565b610d0a9190614fe3565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156142a157600080fd5b505afa1580156142b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d99190614dc0565b6142e39190614fcb565b6040516001600160a01b03851660248201526044810182905290915061434990859063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526143bc565b50505050565b6040516001600160a01b03831660248201526044810182905261437f90849063a9059cbb60e01b90606401614312565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526143499085906323b872dd60e01b90608401614312565b6000614411826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661448e9092919063ffffffff16565b80519091501561437f578080602001905181019061442f9190614763565b61437f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610428565b606061449d84846000856144a5565b949350505050565b6060824710156145065760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610428565b6001600160a01b0385163b61455d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610428565b600080866001600160a01b031685876040516145799190614e31565b60006040518083038185875af1925050503d80600081146145b6576040519150601f19603f3d011682016040523d82523d6000602084013e6145bb565b606091505b50915091506145cb8282866145d6565b979650505050505050565b606083156145e5575081612431565b8251156145f55782518084602001fd5b8160405162461bcd60e51b81526004016104289190614ece565b60008083601f84011261462157600080fd5b5081356001600160401b0381111561463857600080fd5b6020830191508360208260051b850101111561465357600080fd5b9250929050565b600082601f83011261466b57600080fd5b8135602061468061467b83614fa8565b614f78565b80838252828201915082860187848660051b89010111156146a057600080fd5b60005b858110156146bf578135845292840192908401906001016146a3565b5090979650505050505050565b600060208083850312156146df57600080fd5b82516001600160401b038111156146f557600080fd5b8301601f8101851361470657600080fd5b805161471461467b82614fa8565b80828252848201915084840188868560051b870101111561473457600080fd5b600094505b83851015614757578051835260019490940193918501918501614739565b50979650505050505050565b60006020828403121561477557600080fd5b8151612431816150a0565b60006020828403121561479257600080fd5b815161243181615088565b600080600080600060a086880312156147b557600080fd5b85356147c081615088565b945060208601356001600160401b038111156147db57600080fd5b6147e78882890161465a565b9450506040860135925060608601356147ff81615088565b949793965091946080013592915050565b600080600080600060a0868803121561482857600080fd5b853561483381615088565b9450602086013561484381615088565b935060408601356001600160401b038082111561485f57600080fd5b61486b89838a0161465a565b9450606088013591508082111561488157600080fd5b5061488e8882890161465a565b925050608086013561489f816150a0565b809150509295509295909350565b600080600080600080600060e0888a0312156148c857600080fd5b87356148d381615088565b965060208801356148e381615088565b955060408801356001600160401b03808211156148ff57600080fd5b61490b8b838c0161465a565b965060608a013591508082111561492157600080fd5b5061492e8a828b0161465a565b9450506080880135925060a088013561494681615088565b8092505060c0880135905092959891949750929550565b60008060006060848603121561497257600080fd5b833561497d81615088565b9250602084013561498d81615088565b929592945050506040919091013590565b600080600080600080600080600060e08a8c0312156149bc57600080fd5b89356149c781615088565b985060208a01356149d781615088565b975060408a0135965060608a01356001600160401b03808211156149fa57600080fd5b614a068d838e0161460f565b909850965060808c0135915080821115614a1f57600080fd5b50614a2c8c828d0161460f565b90955093505060a08a0135614a4081615088565b8092505060c08a013590509295985092959850929598565b60008060008060008060c08789031215614a7157600080fd5b8635614a7c81615088565b95506020870135614a8c81615088565b945060408701359350606087013592506080870135614aaa81615088565b8092505060a087013590509295509295509295565b60008060008060808587031215614ad557600080fd5b8435614ae081615088565b93506020850135614af081615088565b9250604085013591506060850135614b07816150ae565b939692955090935050565b600080600080600080600060e0888a031215614b2d57600080fd5b8735614b3881615088565b96506020880135614b4881615088565b9550604088013594506060880135614b5f816150ae565b93506080880135925060a088013561494681615088565b600080600080600060a08688031215614b8e57600080fd5b8535614b9981615088565b94506020860135614ba981615088565b93506040860135614bb9816150ae565b925060608601356147ff816150ae565b600080600080600080600080610100898b031215614be657600080fd5b8835614bf181615088565b97506020890135614c0181615088565b96506040890135614c11816150ae565b95506060890135614c21816150ae565b94506080890135935060a0890135925060c0890135614c3f81615088565b8092505060e089013590509295985092959890939650565b600080600080600060a08688031215614c6f57600080fd5b8535614c7a81615088565b94506020860135935060408601356001600160401b03811115614c9c57600080fd5b614ca88882890161465a565b93505060608601356147ff81615088565b60008060008060008060c08789031215614cd257600080fd5b8635614cdd81615088565b9550602087013594506040870135614cf4816150ae565b9350606087013592506080870135614aaa81615088565b60008060008060808587031215614d2157600080fd5b8435614d2c81615088565b93506020850135614d3c816150ae565b92506040850135614d4c816150ae565b9396929550929360600135925050565b600080600080600080600060e0888a031215614d7757600080fd5b8735614d8281615088565b96506020880135614d92816150ae565b95506040880135614da2816150ae565b9450606088013593506080880135925060a088013561494681615088565b600060208284031215614dd257600080fd5b5051919050565b600060208284031215614deb57600080fd5b8151612431816150ae565b600081518084526020808501945080840160005b83811015614e2657815187529582019590820190600101614e0a565b509495945050505050565b60008251614e43818460208701614ffa565b9190910192915050565b6020815260006124316020830184614df6565b604081526000614e736040830185614df6565b8281036020840152610d0a8185614df6565b604081526000614e986040830185614df6565b905082151560208301529392505050565b606081526000614ebc6060830186614df6565b60208301949094525060400152919050565b6020815260008251806020840152614eed816040850160208701614ffa565b601f01601f19169190910160400192915050565b848152606060208201819052810183905260006001600160fb1b03841115614f2857600080fd5b8360051b808660808501376000908301608001908152604090920192909252949350505050565b838152606060208201526000614f686060830185614df6565b9050826040830152949350505050565b604051601f8201601f191681016001600160401b0381118282101715614fa057614fa0615072565b604052919050565b60006001600160401b03821115614fc157614fc1615072565b5060051b60200190565b60008219821115614fde57614fde615046565b500190565b600082821015614ff557614ff5615046565b500390565b60005b83811015615015578181015183820152602001614ffd565b838111156143495750506000910152565b600060ff821660ff81141561503d5761503d615046565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461509d57600080fd5b50565b801515811461509d57600080fd5b60ff8116811461509d57600080fdfea2646970667358221220a559d0fca38729545ba31bd919215bdbe29a0329b28d9a3feeef3fc69f8a8df864736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063643abb86116100a2578063b404d95911610071578063b404d95914610222578063b56527bd14610235578063b61f8d0514610248578063d3f051351461025b578063d74fff4e1461026e57600080fd5b8063643abb86146101d657806377269e29146101e9578063798af720146101fc5780638a311c571461020f57600080fd5b8063357b32f0116100de578063357b32f01461017d5780634d7602441461019057806354681c41146101b057806357c9ee3e146101c357600080fd5b806304b70f0a1461011057806305023d2c146101365780630c8b2216146101495780633214b8c91461016a575b600080fd5b61012361011e3660046148ad565b610281565b6040519081526020015b60405180910390f35b61012361014436600461479d565b610a5c565b61015c61015736600461495d565b610d13565b60405161012d929190614e60565b610123610178366004614b76565b610f55565b61012361018b366004614d5c565b611173565b6101a361019e366004614c57565b6113d3565b60405161012d9190614e4d565b6101236101be366004614abf565b6117c0565b6101236101d1366004614a58565b6119ca565b6101236101e436600461495d565b61210f565b6101236101f7366004614810565b612438565b61012361020a366004614d0b565b612625565b61012361021d366004614b76565b6126b1565b61015c61023036600461499e565b6129a3565b610123610243366004614bc9565b6131b8565b610123610256366004614cb9565b61369b565b610123610269366004614b12565b6138db565b61012361027c366004614bc9565b613d31565b600080886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f59190614780565b90506000886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561033257600080fd5b505afa158015610346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036a9190614780565b9050886001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b1580156103a557600080fd5b505afa1580156103b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103dd9190614dc0565b8751146104315760405162461bcd60e51b815260206004820152601860248201527f696e76616c696442617365416d6f756e74734c656e677468000000000000000060448201526064015b60405180910390fd5b896001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561046a57600080fd5b505afa15801561047e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a29190614dc0565b8851146104f15760405162461bcd60e51b815260206004820152601860248201527f696e76616c69644d657461416d6f756e74734c656e67746800000000000000006044820152606401610428565b6000805b88518160ff161015610608576000898260ff16815181106105185761051861505c565b6020026020010151905060008111156105f55760405162415c3360e91b815260ff83166004820152600193506000906001600160a01b038e16906382b866009060240160206040518083038186803b15801561057357600080fd5b505afa158015610587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ab9190614780565b905060006105ba82338561413f565b90506105d06001600160a01b0383168f83614255565b808c8560ff16815181106105e6576105e661505c565b60200260200101818152505050505b508061060081615026565b9150506104f5565b506000811561069757604051634d49e87d60e01b81526001600160a01b038c1690634d49e87d90610642908c906000908b90600401614ea9565b602060405180830381600087803b15801561065c57600080fd5b505af1158015610670573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106949190614dc0565b90505b60005b8a518160ff1610156107f05760405162415c3360e91b815260ff821660048201526000906001600160a01b038f16906382b866009060240160206040518083038186803b1580156106ea57600080fd5b505afa1580156106fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107229190614780565b90506000856001600160a01b0316826001600160a01b03161415610747575082610796565b60008d8460ff168151811061075e5761075e61505c565b602002602001015111156107965761079382338f8660ff16815181106107865761078661505c565b602002602001015161413f565b90505b808d8460ff16815181106107ac576107ac61505c565b602090810291909101015280156107db576107db8f82846001600160a01b03166142559092919063ffffffff16565b505080806107e890615026565b91505061069a565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561083357600080fd5b505afa158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b9190614dc0565b604051634d49e87d60e01b81529091506001600160a01b038e1690634d49e87d9061089e908e908d908c90600401614ea9565b602060405180830381600087803b1580156108b857600080fd5b505af11580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190614dc0565b5082156109bb576040516370a0823160e01b8152306004820152819083906001600160a01b038716906370a082319060240160206040518083038186803b15801561093a57600080fd5b505afa15801561094e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109729190614dc0565b61097c9190614fcb565b146109bb5760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a5910985cd9541bdbdb608a1b6044820152606401610428565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b1580156109fd57600080fd5b505afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a359190614dc0565b9050610a4b6001600160a01b0387168a8361434f565b9d9c50505050505050505050505050565b600080866001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610a9857600080fd5b505afa158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad09190614780565b905060005b86518160ff161015610bf25760405162415c3360e91b815260ff821660048201526000906001600160a01b038a16906382b866009060240160206040518083038186803b158015610b2557600080fd5b505afa158015610b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5d9190614780565b9050600080898460ff1681518110610b7757610b7761505c565b60200260200101511115610ba257610b9f82338b8660ff16815181106107865761078661505c565b90505b80898460ff1681518110610bb857610bb861505c565b60209081029190910101528015610bdd57610bdd6001600160a01b0383168b83614255565b50508080610bea90615026565b915050610ad5565b50604051634d49e87d60e01b81526001600160a01b03881690634d49e87d90610c2390899089908890600401614ea9565b602060405180830381600087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c759190614dc0565b506040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610cb857600080fd5b505afa158015610ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf09190614dc0565b9050610d066001600160a01b038316868361434f565b9150505b95945050505050565b6060806000846001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610d5157600080fd5b505afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d899190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918816906366c0bd249060240160206040518083038186803b158015610dd057600080fd5b505afa158015610de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e089190614dd9565b60405163797d695b60e11b8152600481018790529091506001600160a01b0388169063f2fad2b69060240160006040518083038186803b158015610e4b57600080fd5b505afa158015610e5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e8791908101906146cc565b93506000848260ff1681518110610ea057610ea061505c565b602002602001015190506000858360ff1681518110610ec157610ec161505c565b602090810291909101015260405163797d695b60e11b8152600481018290526001600160a01b0388169063f2fad2b69060240160006040518083038186803b158015610f0c57600080fd5b505afa158015610f20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f4891908101906146cc565b9350505050935093915050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9157600080fd5b505afa158015610fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc99190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b15801561101057600080fd5b505afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110489190614dd9565b90508360ff808316908816146110e45760405163a95b089f60e01b815260ff808916600483015283166024820152604481018690526001600160a01b038a169063a95b089f9060640160206040518083038186803b1580156110a957600080fd5b505afa1580156110bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e19190614dc0565b90505b60405163342a87a160e01b81526004810182905260ff871660248201526001600160a01b0389169063342a87a1906044015b60206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111669190614dc0565b9998505050505050505050565b60405162415c3360e91b815260ff8716600482015260009081906001600160a01b038a16906382b866009060240160206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f19190614780565b90506112086001600160a01b038216333089614384565b61121c6001600160a01b0382168a88614255565b6040516348b4aac360e11b815260ff808a166004830152881660248201526044810187905260648101869052608481018490526001600160a01b038a169063916955869060a401602060405180830381600087803b15801561127d57600080fd5b505af1158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b59190614dc0565b5060405162415c3360e91b815260ff881660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b1580156112fa57600080fd5b505afa15801561130e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113329190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113af9190614dc0565b90506113c56001600160a01b038316878361434f565b9a9950505050505050505050565b60606000866001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561141057600080fd5b505afa158015611424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114489190614780565b905061145f6001600160a01b038216333089614384565b6114736001600160a01b0382168888614255565b60405163031cd52b60e41b81526001600160a01b038816906331cd52b0906114a390899089908890600401614f4f565b600060405180830381600087803b1580156114bd57600080fd5b505af11580156114d1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114f991908101906146cc565b50866001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561153357600080fd5b505afa158015611547573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156b9190614dc0565b6001600160401b0381111561158257611582615072565b6040519080825280602002602001820160405280156115ab578160200160208202803683370190505b50915060005b876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ea57600080fd5b505afa1580156115fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116229190614dc0565b8160ff1610156117b55760405162415c3360e91b815260ff821660048201526000906001600160a01b038a16906382b866009060240160206040518083038186803b15801561167057600080fd5b505afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190614780565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a082319060240160206040518083038186803b1580156116ea57600080fd5b505afa1580156116fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117229190614dc0565b848360ff16815181106117375761173761505c565b6020026020010181815250506000848360ff168151811061175a5761175a61505c565b602002602001015111156117a2576117a286858460ff16815181106117815761178161505c565b6020026020010151836001600160a01b031661434f9092919063ffffffff16565b50806117ad81615026565b9150506115b1565b505095945050505050565b600080846001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156117fc57600080fd5b505afa158015611810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118349190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918816906366c0bd249060240160206040518083038186803b15801561187b57600080fd5b505afa15801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b39190614dd9565b60405163342a87a160e01b81526004810187905260ff821660248201529091506000906001600160a01b0389169063342a87a19060440160206040518083038186803b15801561190257600080fd5b505afa158015611916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193a9190614dc0565b60405163342a87a160e01b81526004810182905260ff871660248201529091506001600160a01b0388169063342a87a19060440160206040518083038186803b15801561198657600080fd5b505afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119be9190614dc0565b98975050505050505050565b600080876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3e9190614dc0565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7b57600080fd5b505afa158015611a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab39190614dc0565b9050876001600160a01b0316896001600160a01b03161415611b0b5760405162461bcd60e51b8152602060048201526011602482015270199c9bdb541bdbdb080f481d1bd41bdbdb607a1b6044820152606401610428565b808214611b5a5760405162461bcd60e51b815260206004820152601960248201527f706f6f6c546f6b656e734c656e6774684d6973736d61746368000000000000006044820152606401610428565b6000896001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611b9557600080fd5b505afa158015611ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcd9190614780565b90506000896001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611c0a57600080fd5b505afa158015611c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c429190614780565b90506000846001600160401b03811115611c5e57611c5e615072565b604051908082528060200260200182016040528015611c87578160200160208202803683370190505b50905060005b858160ff161015611da65760405162415c3360e91b815260ff821660048201526000906001600160a01b038f16906382b866009060240160206040518083038186803b158015611cdc57600080fd5b505afa158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d149190614780565b6040516319b02f4960e21b81526001600160a01b038083166004830152919250908e16906366c0bd249060240160206040518083038186803b158015611d5957600080fd5b505afa158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d919190614dd9565b50508080611d9e90615026565b915050611c8d565b50611dbc6001600160a01b03841633308d614384565b611dd06001600160a01b0384168d8c614255565b60405163031cd52b60e41b81526001600160a01b038d16906331cd52b090611e00908d9085908c90600401614f4f565b600060405180830381600087803b158015611e1a57600080fd5b505af1158015611e2e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e5691908101906146cc565b506000846001600160401b03811115611e7157611e71615072565b604051908082528060200260200182016040528015611e9a578160200160208202803683370190505b50905060005b858160ff161015611ffb5760405162415c3360e91b815260ff821660048201526000906001600160a01b038f16906382b866009060240160206040518083038186803b158015611eef57600080fd5b505afa158015611f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f279190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190614dc0565b9050611fc48f82846001600160a01b03166142559092919063ffffffff16565b80848460ff1681518110611fda57611fda61505c565b60200260200101818152505050508080611ff390615026565b915050611ea0565b50604051634d49e87d60e01b81526001600160a01b038d1690634d49e87d9061202c9084908e908d90600401614ea9565b602060405180830381600087803b15801561204657600080fd5b505af115801561205a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207e9190614dc0565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f99190614dc0565b9050610a4b6001600160a01b0385168b8361434f565b600080846001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561214b57600080fd5b505afa15801561215f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121839190614dc0565b60405163797d695b60e11b8152600481018590529091506000906001600160a01b0387169063f2fad2b69060240160006040518083038186803b1580156121c957600080fd5b505afa1580156121dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261220591908101906146cc565b90506000826001600160401b0381111561222157612221615072565b60405190808252806020026020018201604052801561224a578160200160208202803683370190505b50905060005b838160ff1610156123ab5760405162415c3360e91b815260ff821660048201526000906001600160a01b038a16906382b866009060240160206040518083038186803b15801561229f57600080fd5b505afa1580156122b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d79190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918a16906366c0bd249060240160206040518083038186803b15801561231e57600080fd5b505afa158015612332573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123569190614dd9565b60ff169050848360ff16815181106123705761237061505c565b602002602001015184828151811061238a5761238a61505c565b602002602001018181525050505080806123a390615026565b915050612250565b50604051637355940360e11b81526001600160a01b0387169063e6ab2806906123db908490600190600401614e85565b60206040518083038186803b1580156123f357600080fd5b505afa158015612407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242b9190614dc0565b93505050505b9392505050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561247457600080fd5b505afa158015612488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ac9190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b1580156124f357600080fd5b505afa158015612507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252b9190614dd9565b90506000876001600160a01b031663e6ab280687876040518363ffffffff1660e01b815260040161255d929190614e85565b60206040518083038186803b15801561257557600080fd5b505afa158015612589573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ad9190614dc0565b905080878360ff16815181106125c5576125c561505c565b60200260200101516125d79190614fcb565b878360ff16815181106125ec576125ec61505c565b6020908102919091010152604051637355940360e11b81526001600160a01b038a169063e6ab280690611116908a908990600401614e85565b60405163a95b089f60e01b815260ff808516600483015283166024820152604481018290526000906001600160a01b0386169063a95b089f9060640160206040518083038186803b15801561267957600080fd5b505afa15801561268d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0a9190614dc0565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ed57600080fd5b505afa158015612701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127259190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b15801561276c57600080fd5b505afa158015612780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a49190614dd9565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e157600080fd5b505afa1580156127f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128199190614dc0565b6001600160401b0381111561283057612830615072565b604051908082528060200260200182016040528015612859578160200160208202803683370190505b50905084818860ff16815181106128725761287261505c565b6020908102919091010152604051637355940360e11b81526000906001600160a01b038a169063e6ab2806906128af908590600190600401614e85565b60206040518083038186803b1580156128c757600080fd5b505afa1580156128db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ff9190614dc0565b90508660ff168360ff16141561291a579350610d0a92505050565b60405163a95b089f60e01b815260ff808516600483015288166024820152604481018290526001600160a01b038b169063a95b089f9060640160206040518083038186803b15801561296b57600080fd5b505afa15801561297f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c59190614dc0565b60608060008b6001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e157600080fd5b505afa1580156129f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a199190614780565b905060008b6001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612a5657600080fd5b505afa158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190614780565b9050612aa56001600160a01b03831633308e614384565b612ab96001600160a01b0383168e8d614255565b60405163031cd52b60e41b81526001600160a01b038e16906331cd52b090612aeb908e908e908e908b90600401614f01565b600060405180830381600087803b158015612b0557600080fd5b505af1158015612b19573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b4191908101906146cc565b506040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015612b8457600080fd5b505afa158015612b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbc9190614dc0565b9050612bd26001600160a01b0383168e83614255565b60405163031cd52b60e41b81526001600160a01b038e16906331cd52b090612c049084908d908d908c90600401614f01565b600060405180830381600087803b158015612c1e57600080fd5b505af1158015612c32573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c5a91908101906146cc565b508d6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612c9457600080fd5b505afa158015612ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccc9190614dc0565b6001600160401b03811115612ce357612ce3615072565b604051908082528060200260200182016040528015612d0c578160200160208202803683370190505b50945060005b8e6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612d4b57600080fd5b505afa158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d839190614dc0565b8160ff161015612f005760008f6001600160a01b03166382b86600836040518263ffffffff1660e01b8152600401612dc4919060ff91909116815260200190565b60206040518083038186803b158015612ddc57600080fd5b505afa158015612df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e149190614780565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a082319060240160206040518083038186803b158015612e5657600080fd5b505afa158015612e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8e9190614dc0565b878360ff1681518110612ea357612ea361505c565b6020026020010181815250506000878360ff1681518110612ec657612ec661505c565b60200260200101511115612eed57612eed89888460ff16815181106117815761178161505c565b5080612ef881615026565b915050612d12565b508c6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3a57600080fd5b505afa158015612f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f729190614dc0565b6001600160401b03811115612f8957612f89615072565b604051908082528060200260200182016040528015612fb2578160200160208202803683370190505b50935060005b8d6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612ff157600080fd5b505afa158015613005573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130299190614dc0565b8160ff1610156131a65760008e6001600160a01b03166382b86600836040518263ffffffff1660e01b815260040161306a919060ff91909116815260200190565b60206040518083038186803b15801561308257600080fd5b505afa158015613096573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ba9190614780565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a082319060240160206040518083038186803b1580156130fc57600080fd5b505afa158015613110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131349190614dc0565b868360ff16815181106131495761314961505c565b6020026020010181815250506000868360ff168151811061316c5761316c61505c565b602002602001015111156131935761319389878460ff16815181106117815761178161505c565b508061319e81615026565b915050612fb8565b50505050995099975050505050505050565b600080886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f457600080fd5b505afa158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c9190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918c16906366c0bd249060240160206040518083038186803b15801561327357600080fd5b505afa158015613287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ab9190614dd9565b905060008a6001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b1580156132e857600080fd5b505afa1580156132fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133209190614dc0565b6001600160401b0381111561333757613337615072565b604051908082528060200260200182016040528015613360578160200160208202803683370190505b50905087818b60ff16815181106133795761337961505c565b602090810291909101015260405162415c3360e91b815260ff8b1660048201526000906001600160a01b038d16906382b866009060240160206040518083038186803b1580156133c857600080fd5b505afa1580156133dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134009190614780565b90506134176001600160a01b03821633308c614384565b61342b6001600160a01b0382168d8b614255565b604051634d49e87d60e01b81526000906001600160a01b038e1690634d49e87d9061345e90869085908c90600401614ea9565b602060405180830381600087803b15801561347857600080fd5b505af115801561348c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b09190614dc0565b90508a60ff168460ff161461356e576134d36001600160a01b0386168f83614255565b6040516348b4aac360e11b815260ff80861660048301528c16602482015260448101829052606481018a9052608481018890526001600160a01b038f169063916955869060a401602060405180830381600087803b15801561353457600080fd5b505af1158015613548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356c9190614dc0565b505b60008e6001600160a01b03166382b866008d6040518263ffffffff1660e01b81526004016135a5919060ff91909116815260200190565b60206040518083038186803b1580156135bd57600080fd5b505afa1580156135d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f59190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561363a57600080fd5b505afa15801561364e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136729190614dc0565b90506136886001600160a01b0383168b8361434f565b9f9e505050505050505050505050505050565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b1580156136d757600080fd5b505afa1580156136eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370f9190614780565b90506137266001600160a01b03821633308a614384565b61373a6001600160a01b0382168989614255565b6040516301f1d0ab60e51b81526004810188905260ff8716602482015260448101869052606481018490526001600160a01b03891690633e3a156090608401602060405180830381600087803b15801561379357600080fd5b505af11580156137a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cb9190614dc0565b5060405162415c3360e91b815260ff871660048201526000906001600160a01b038a16906382b866009060240160206040518083038186803b15801561381057600080fd5b505afa158015613824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138489190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561388d57600080fd5b505afa1580156138a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c59190614dc0565b90506111666001600160a01b038316878361434f565b600080886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561391757600080fd5b505afa15801561392b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061394f9190614780565b90506000886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561398c57600080fd5b505afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c49190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918c16906366c0bd249060240160206040518083038186803b158015613a0b57600080fd5b505afa158015613a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a439190614dd9565b9050613a5a6001600160a01b03841633308c614384565b613a6e6001600160a01b0384168c8b614255565b6040516301f1d0ab60e51b8152600481018a905260ff8216602482015260006044820152606481018690526001600160a01b038c1690633e3a156090608401602060405180830381600087803b158015613ac757600080fd5b505af1158015613adb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aff9190614dc0565b506040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015613b4257600080fd5b505afa158015613b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7a9190614dc0565b9050613b906001600160a01b0384168c83614255565b6040516301f1d0ab60e51b81526004810182905260ff8a16602482015260448101899052606481018790526001600160a01b038c1690633e3a156090608401602060405180830381600087803b158015613be957600080fd5b505af1158015613bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c219190614dc0565b5060405162415c3360e91b815260ff8a1660048201526000906001600160a01b038d16906382b866009060240160206040518083038186803b158015613c6657600080fd5b505afa158015613c7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c9e9190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015613ce357600080fd5b505afa158015613cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1b9190614dc0565b9050610a4b6001600160a01b0383168a8361434f565b600080886001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015613d6d57600080fd5b505afa158015613d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da59190614780565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918c16906366c0bd249060240160206040518083038186803b158015613dec57600080fd5b505afa158015613e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e249190614dd9565b60405162415c3360e91b815260ff8b1660048201529091506000906001600160a01b038d16906382b866009060240160206040518083038186803b158015613e6b57600080fd5b505afa158015613e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ea39190614780565b9050613eba6001600160a01b03821633308b614384565b8760ff838116908c1614613f7857613edc6001600160a01b0383168e8b614255565b6040516348b4aac360e11b815260ff808d16600483015284166024820152604481018a905260006064820152608481018790526001600160a01b038e169063916955869060a401602060405180830381600087803b158015613f3d57600080fd5b505af1158015613f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f759190614dc0565b90505b613f8c6001600160a01b0385168d83614255565b6040516301f1d0ab60e51b81526004810182905260ff8b16602482015260448101899052606481018790526001600160a01b038d1690633e3a156090608401602060405180830381600087803b158015613fe557600080fd5b505af1158015613ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061401d9190614dc0565b5060405162415c3360e91b815260ff8b1660048201526000906001600160a01b038e16906382b866009060240160206040518083038186803b15801561406257600080fd5b505afa158015614076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061409a9190614780565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b1580156140df57600080fd5b505afa1580156140f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141179190614dc0565b905061412d6001600160a01b0383168a8361434f565b9e9d5050505050505050505050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038616906370a082319060240160206040518083038186803b15801561418357600080fd5b505afa158015614197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141bb9190614dc0565b90506141d26001600160a01b038616853086614384565b6040516370a0823160e01b815230600482015281906001600160a01b038716906370a082319060240160206040518083038186803b15801561421357600080fd5b505afa158015614227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424b9190614dc0565b610d0a9190614fe3565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156142a157600080fd5b505afa1580156142b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d99190614dc0565b6142e39190614fcb565b6040516001600160a01b03851660248201526044810182905290915061434990859063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526143bc565b50505050565b6040516001600160a01b03831660248201526044810182905261437f90849063a9059cbb60e01b90606401614312565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526143499085906323b872dd60e01b90608401614312565b6000614411826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661448e9092919063ffffffff16565b80519091501561437f578080602001905181019061442f9190614763565b61437f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610428565b606061449d84846000856144a5565b949350505050565b6060824710156145065760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610428565b6001600160a01b0385163b61455d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610428565b600080866001600160a01b031685876040516145799190614e31565b60006040518083038185875af1925050503d80600081146145b6576040519150601f19603f3d011682016040523d82523d6000602084013e6145bb565b606091505b50915091506145cb8282866145d6565b979650505050505050565b606083156145e5575081612431565b8251156145f55782518084602001fd5b8160405162461bcd60e51b81526004016104289190614ece565b60008083601f84011261462157600080fd5b5081356001600160401b0381111561463857600080fd5b6020830191508360208260051b850101111561465357600080fd5b9250929050565b600082601f83011261466b57600080fd5b8135602061468061467b83614fa8565b614f78565b80838252828201915082860187848660051b89010111156146a057600080fd5b60005b858110156146bf578135845292840192908401906001016146a3565b5090979650505050505050565b600060208083850312156146df57600080fd5b82516001600160401b038111156146f557600080fd5b8301601f8101851361470657600080fd5b805161471461467b82614fa8565b80828252848201915084840188868560051b870101111561473457600080fd5b600094505b83851015614757578051835260019490940193918501918501614739565b50979650505050505050565b60006020828403121561477557600080fd5b8151612431816150a0565b60006020828403121561479257600080fd5b815161243181615088565b600080600080600060a086880312156147b557600080fd5b85356147c081615088565b945060208601356001600160401b038111156147db57600080fd5b6147e78882890161465a565b9450506040860135925060608601356147ff81615088565b949793965091946080013592915050565b600080600080600060a0868803121561482857600080fd5b853561483381615088565b9450602086013561484381615088565b935060408601356001600160401b038082111561485f57600080fd5b61486b89838a0161465a565b9450606088013591508082111561488157600080fd5b5061488e8882890161465a565b925050608086013561489f816150a0565b809150509295509295909350565b600080600080600080600060e0888a0312156148c857600080fd5b87356148d381615088565b965060208801356148e381615088565b955060408801356001600160401b03808211156148ff57600080fd5b61490b8b838c0161465a565b965060608a013591508082111561492157600080fd5b5061492e8a828b0161465a565b9450506080880135925060a088013561494681615088565b8092505060c0880135905092959891949750929550565b60008060006060848603121561497257600080fd5b833561497d81615088565b9250602084013561498d81615088565b929592945050506040919091013590565b600080600080600080600080600060e08a8c0312156149bc57600080fd5b89356149c781615088565b985060208a01356149d781615088565b975060408a0135965060608a01356001600160401b03808211156149fa57600080fd5b614a068d838e0161460f565b909850965060808c0135915080821115614a1f57600080fd5b50614a2c8c828d0161460f565b90955093505060a08a0135614a4081615088565b8092505060c08a013590509295985092959850929598565b60008060008060008060c08789031215614a7157600080fd5b8635614a7c81615088565b95506020870135614a8c81615088565b945060408701359350606087013592506080870135614aaa81615088565b8092505060a087013590509295509295509295565b60008060008060808587031215614ad557600080fd5b8435614ae081615088565b93506020850135614af081615088565b9250604085013591506060850135614b07816150ae565b939692955090935050565b600080600080600080600060e0888a031215614b2d57600080fd5b8735614b3881615088565b96506020880135614b4881615088565b9550604088013594506060880135614b5f816150ae565b93506080880135925060a088013561494681615088565b600080600080600060a08688031215614b8e57600080fd5b8535614b9981615088565b94506020860135614ba981615088565b93506040860135614bb9816150ae565b925060608601356147ff816150ae565b600080600080600080600080610100898b031215614be657600080fd5b8835614bf181615088565b97506020890135614c0181615088565b96506040890135614c11816150ae565b95506060890135614c21816150ae565b94506080890135935060a0890135925060c0890135614c3f81615088565b8092505060e089013590509295985092959890939650565b600080600080600060a08688031215614c6f57600080fd5b8535614c7a81615088565b94506020860135935060408601356001600160401b03811115614c9c57600080fd5b614ca88882890161465a565b93505060608601356147ff81615088565b60008060008060008060c08789031215614cd257600080fd5b8635614cdd81615088565b9550602087013594506040870135614cf4816150ae565b9350606087013592506080870135614aaa81615088565b60008060008060808587031215614d2157600080fd5b8435614d2c81615088565b93506020850135614d3c816150ae565b92506040850135614d4c816150ae565b9396929550929360600135925050565b600080600080600080600060e0888a031215614d7757600080fd5b8735614d8281615088565b96506020880135614d92816150ae565b95506040880135614da2816150ae565b9450606088013593506080880135925060a088013561494681615088565b600060208284031215614dd257600080fd5b5051919050565b600060208284031215614deb57600080fd5b8151612431816150ae565b600081518084526020808501945080840160005b83811015614e2657815187529582019590820190600101614e0a565b509495945050505050565b60008251614e43818460208701614ffa565b9190910192915050565b6020815260006124316020830184614df6565b604081526000614e736040830185614df6565b8281036020840152610d0a8185614df6565b604081526000614e986040830185614df6565b905082151560208301529392505050565b606081526000614ebc6060830186614df6565b60208301949094525060400152919050565b6020815260008251806020840152614eed816040850160208701614ffa565b601f01601f19169190910160400192915050565b848152606060208201819052810183905260006001600160fb1b03841115614f2857600080fd5b8360051b808660808501376000908301608001908152604090920192909252949350505050565b838152606060208201526000614f686060830185614df6565b9050826040830152949350505050565b604051601f8201601f191681016001600160401b0381118282101715614fa057614fa0615072565b604052919050565b60006001600160401b03821115614fc157614fc1615072565b5060051b60200190565b60008219821115614fde57614fde615046565b500190565b600082821015614ff557614ff5615046565b500390565b60005b83811015615015578181015183820152602001614ffd565b838111156143495750506000910152565b600060ff821660ff81141561503d5761503d615046565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461509d57600080fd5b50565b801515811461509d57600080fd5b60ff8116811461509d57600080fdfea2646970667358221220a559d0fca38729545ba31bd919215bdbe29a0329b28d9a3feeef3fc69f8a8df864736f6c63430008070033
Deployed Bytecode Sourcemap
23628:16638:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26262:2233;;;;;;:::i;:::-;;:::i;:::-;;;22301:25:1;;;22289:2;22274:18;26262:2233:0;;;;;;;;25363:891;;;;;;:::i;:::-;;:::i;37142:582::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;39295:617::-;;;;;;:::i;:::-;;:::i;32725:689::-;;;;;;:::i;:::-;;:::i;28503:815::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37732:556::-;;;;;;:::i;:::-;;:::i;23717:1638::-;;;;;;:::i;:::-;;:::i;35816:694::-;;;;;;:::i;:::-;;:::i;36518:616::-;;;;;;:::i;:::-;;:::i;38296:249::-;;;;;;:::i;:::-;;:::i;38553:734::-;;;;;;:::i;:::-;;:::i;30008:1621::-;;;;;;:::i;:::-;;:::i;33422:1210::-;;;;;;:::i;:::-;;:::i;29326:674::-;;;;;;:::i;:::-;;:::i;31637:1080::-;;;;;;:::i;:::-;;:::i;34640:1129::-;;;;;;:::i;:::-;;:::i;26262:2233::-;26543:7;26563:12;26585:4;-1:-1:-1;;;;;26585:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26563:40;;26614:14;26638:8;-1:-1:-1;;;;;26638:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26614:46;;26702:8;-1:-1:-1;;;;;26702:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26679:12;:19;:51;26671:88;;;;-1:-1:-1;;;26671:88:0;;20891:2:1;26671:88:0;;;20873:21:1;20930:2;20910:18;;;20903:30;20969:26;20949:18;;;20942:54;21013:18;;26671:88:0;;;;;;;;;26801:4;-1:-1:-1;;;;;26801:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26778:12;:19;:47;26770:84;;;;-1:-1:-1;;;26770:84:0;;20538:2:1;26770:84:0;;;20520:21:1;20577:2;20557:18;;;20550:30;20616:26;20596:18;;;20589:54;20660:18;;26770:84:0;20336:348:1;26770:84:0;26865:17;26906:7;26901:446;26923:12;:19;26919:1;:23;;;26901:446;;;26964:14;26981:12;26994:1;26981:15;;;;;;;;;;:::i;:::-;;;;;;;26964:32;;27024:1;27015:6;:10;27011:325;;;27098:20;;-1:-1:-1;;;27098:20:0;;24626:4:1;24614:17;;27098:20:0;;;24596:36:1;27061:4:0;;-1:-1:-1;27084:11:0;;-1:-1:-1;;;;;27098:17:0;;;;;24569:18:1;;27098:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27084:34;;27137:19;27159:36;27170:4;27176:10;27188:6;27159:10;:36::i;:::-;27137:58;-1:-1:-1;27214:58:0;-1:-1:-1;;;;;27214:26:0;;27249:8;27137:58;27214:26;:58::i;:::-;27309:11;27291:12;27304:1;27291:15;;;;;;;;;;:::i;:::-;;;;;;:29;;;;;27027:309;;27011:325;-1:-1:-1;26944:3:0;;;;:::i;:::-;;;;26901:446;;;;27359:24;27398:12;27394:112;;;27446:48;;-1:-1:-1;;;27446:48:0;;-1:-1:-1;;;;;27446:21:0;;;;;:48;;27468:12;;27482:1;;27485:8;;27446:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27427:67;;27394:112;27523:7;27518:554;27540:12;:19;27536:1;:23;;;27518:554;;;27595:16;;-1:-1:-1;;;27595:16:0;;24626:4:1;24614:17;;27595:16:0;;;24596:36:1;27581:11:0;;-1:-1:-1;;;;;27595:13:0;;;;;24569:18:1;;27595:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27581:30;;27628:19;27691:7;-1:-1:-1;;;;;27666:33:0;27674:4;-1:-1:-1;;;;;27666:33:0;;27662:229;;;-1:-1:-1;27734:16:0;27662:229;;;27794:1;27776:12;27789:1;27776:15;;;;;;;;;;:::i;:::-;;;;;;;:19;27772:119;;;27830:45;27841:4;27847:10;27859:12;27872:1;27859:15;;;;;;;;;;:::i;:::-;;;;;;;27830:10;:45::i;:::-;27816:59;;27772:119;27925:11;27907:12;27920:1;27907:15;;;;;;;;;;:::i;:::-;;;;;;;;;;:29;27955:15;;27951:110;;27991:54;28026:4;28033:11;27991:4;-1:-1:-1;;;;;27991:26:0;;;:54;;;;;:::i;:::-;27566:506;;27561:3;;;;;:::i;:::-;;;;27518:554;;;-1:-1:-1;28108:32:0;;-1:-1:-1;;;28108:32:0;;28134:4;28108:32;;;15904:51:1;28084:21:0;;-1:-1:-1;;;;;28108:17:0;;;;;15877:18:1;;28108:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28151:52;;-1:-1:-1;;;28151:52:0;;28084:56;;-1:-1:-1;;;;;;28151:17:0;;;;;:52;;28169:12;;28183:9;;28194:8;;28151:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28218:12;28214:143;;;28256:32;;-1:-1:-1;;;28256:32:0;;28282:4;28256:32;;;15904:51:1;28312:13:0;;28291:16;;-1:-1:-1;;;;;28256:17:0;;;;;15877:18:1;;28256:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;28255:70;28247:98;;;;-1:-1:-1;;;28247:98:0;;21244:2:1;28247:98:0;;;21226:21:1;21283:2;21263:18;;;21256:30;-1:-1:-1;;;21302:18:1;;;21295:45;21357:18;;28247:98:0;21042:339:1;28247:98:0;28388:30;;-1:-1:-1;;;28388:30:0;;28412:4;28388:30;;;15904:51:1;28369:16:0;;-1:-1:-1;;;;;28388:15:0;;;;;15877:18:1;;28388:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28369:49;-1:-1:-1;28429:32:0;-1:-1:-1;;;;;28429:18:0;;28448:2;28369:49;28429:18;:32::i;:::-;28479:8;26262:2233;-1:-1:-1;;;;;;;;;;;;;26262:2233:0:o;25363:891::-;25565:7;25585:12;25607:4;-1:-1:-1;;;;;25607:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25585:40;;25641:7;25636:420;25658:7;:14;25654:1;:18;;;25636:420;;;25708:16;;-1:-1:-1;;;25708:16:0;;24626:4:1;24614:17;;25708:16:0;;;24596:36:1;25694:11:0;;-1:-1:-1;;;;;25708:13:0;;;;;24569:18:1;;25708:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25694:30;;25739:19;25790:1;25777:7;25785:1;25777:10;;;;;;;;;;:::i;:::-;;;;;;;:14;25773:109;;;25826:40;25837:4;25843:10;25855:7;25863:1;25855:10;;;;;;;;;;:::i;25826:40::-;25812:54;;25773:109;25909:11;25896:7;25904:1;25896:10;;;;;;;;;;:::i;:::-;;;;;;;;;;:24;25939:15;;25935:110;;25975:54;-1:-1:-1;;;;;25975:26:0;;26010:4;26017:11;25975:26;:54::i;:::-;25679:377;;25674:3;;;;;:::i;:::-;;;;25636:420;;;-1:-1:-1;26066:51:0;;-1:-1:-1;;;26066:51:0;;-1:-1:-1;;;;;26066:17:0;;;;;:51;;26084:7;;26093:13;;26108:8;;26066:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;26147:30:0;;-1:-1:-1;;;26147:30:0;;26171:4;26147:30;;;15904:51:1;26128:16:0;;-1:-1:-1;;;;;26147:15:0;;;;;15877:18:1;;26147:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26128:49;-1:-1:-1;26188:32:0;-1:-1:-1;;;;;26188:18:0;;26207:2;26128:49;26188:18;:32::i;:::-;26238:8;-1:-1:-1;;25363:891:0;;;;;;;;:::o;37142:582::-;37298:29;37329;37371:16;37390:8;-1:-1:-1;;;;;37390:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37445:38;;-1:-1:-1;;;37445:38:0;;-1:-1:-1;;;;;15922:32:1;;;37445:38:0;;;15904:51:1;37371:40:0;;-1:-1:-1;37422:20:0;;37445:18;;;;;15877::1;;37445:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37509:37;;-1:-1:-1;;;37509:37:0;;;;;22301:25:1;;;37422:61:0;;-1:-1:-1;;;;;;37509:29:0;;;;;22274:18:1;;37509:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37509:37:0;;;;;;;;;;;;:::i;:::-;37494:52;;37557:16;37576:12;37589:14;37576:28;;;;;;;;;;:::i;:::-;;;;;;;37557:47;;37646:1;37615:12;37628:14;37615:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:32;37673:43;;-1:-1:-1;;;37673:43:0;;;;;22301:25:1;;;-1:-1:-1;;;;;37673:33:0;;;;;22274:18:1;;37673:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37673:43:0;;;;;;;;;;;;:::i;:::-;37658:58;;37360:364;;;37142:582;;;;;;:::o;39295:617::-;39502:7;39522:16;39541:8;-1:-1:-1;;;;;39541:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39596:38;;-1:-1:-1;;;39596:38:0;;-1:-1:-1;;;;;15922:32:1;;;39596:38:0;;;15904:51:1;39522:40:0;;-1:-1:-1;39573:20:0;;39596:18;;;;;15877::1;;39596:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39573:61;-1:-1:-1;39669:2:0;39686:32;;;;;;;;39682:135;;39751:54;;-1:-1:-1;;;39751:54:0;;24867:4:1;24855:17;;;39751:54:0;;;24837:36:1;24909:17;;24889:18;;;24882:45;24943:18;;;24936:34;;;-1:-1:-1;;;;;39751:18:0;;;;;24810::1;;39751:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39735:70;;39682:135;39834:70;;-1:-1:-1;;;39834:70:0;;;;;23550:25:1;;;23623:4;23611:17;;23591:18;;;23584:45;-1:-1:-1;;;;;39834:41:0;;;;;23523:18:1;;39834:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39827:77;39295:617;-1:-1:-1;;;;;;;;;39295:617:0:o;32725:689::-;32994:24;;-1:-1:-1;;;32994:24:0;;24626:4:1;24614:17;;32994:24:0;;;24596:36:1;32960:7:0;;;;-1:-1:-1;;;;;32994:13:0;;;;;24569:18:1;;32994:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32980:38;-1:-1:-1;33029:58:0;-1:-1:-1;;;;;33029:21:0;;33051:10;33071:4;33078:8;33029:21;:58::i;:::-;33098:51;-1:-1:-1;;;;;33098:26:0;;33133:4;33140:8;33098:26;:51::i;:::-;33160:63;;-1:-1:-1;;;33160:63:0;;25270:4:1;25258:17;;;33160:63:0;;;25240:36:1;25312:17;;25292:18;;;25285:45;25346:18;;;25339:34;;;25389:18;;;25382:34;;;25432:19;;;25425:35;;;-1:-1:-1;;;;;33160:9:0;;;;;25212:19:1;;33160:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33250:22:0;;-1:-1:-1;;;33250:22:0;;24626:4:1;24614:17;;33250:22:0;;;24596:36:1;33234:13:0;;-1:-1:-1;;;;;33250:13:0;;;;;24569:18:1;;33250:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33303:31;;-1:-1:-1;;;33303:31:0;;33328:4;33303:31;;;15904:51:1;33234:38:0;;-1:-1:-1;33283:17:0;;-1:-1:-1;;;;;33303:16:0;;;;;15877:18:1;;33303:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33283:51;-1:-1:-1;33345:34:0;-1:-1:-1;;;;;33345:19:0;;33365:2;33283:51;33345:19;:34::i;:::-;33397:9;32725:689;-1:-1:-1;;;;;;;;;;32725:689:0:o;28503:815::-;28706:24;28743:12;28758:4;-1:-1:-1;;;;;28758:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28743:32;-1:-1:-1;28786:59:0;-1:-1:-1;;;;;28786:22:0;;28809:10;28829:4;28836:8;28786:22;:59::i;:::-;28856:52;-1:-1:-1;;;;;28856:27:0;;28892:4;28899:8;28856:27;:52::i;:::-;28919;;-1:-1:-1;;;28919:52:0;;-1:-1:-1;;;;;28919:20:0;;;;;:52;;28940:8;;28950:10;;28962:8;;28919:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28919:52:0;;;;;;;;;;;;:::i;:::-;;29006:4;-1:-1:-1;;;;;29006:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28992:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28992:39:0;;28982:49;;29047:7;29042:269;29064:4;-1:-1:-1;;;;;29064:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29060:1;:28;;;29042:269;;;29124:16;;-1:-1:-1;;;29124:16:0;;24626:4:1;24614:17;;29124:16:0;;;24596:36:1;29110:11:0;;-1:-1:-1;;;;;29124:13:0;;;;;24569:18:1;;29124:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29168:29;;-1:-1:-1;;;29168:29:0;;29191:4;29168:29;;;15904:51:1;29110:30:0;;-1:-1:-1;;;;;;29168:14:0;;;;;15877:18:1;;29168:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29155:7;29163:1;29155:10;;;;;;;;;;:::i;:::-;;;;;;:42;;;;;29229:1;29216:7;29224:1;29216:10;;;;;;;;;;:::i;:::-;;;;;;;:14;29212:88;;;29251:33;29269:2;29273:7;29281:1;29273:10;;;;;;;;;;:::i;:::-;;;;;;;29251:4;-1:-1:-1;;;;;29251:17:0;;;:33;;;;;:::i;:::-;-1:-1:-1;29090:3:0;;;;:::i;:::-;;;;29042:269;;;;28732:586;28503:815;;;;;;;:::o;37732:556::-;37929:28;37970:16;37989:8;-1:-1:-1;;;;;37989:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38044:38;;-1:-1:-1;;;38044:38:0;;-1:-1:-1;;;;;15922:32:1;;;38044:38:0;;;15904:51:1;37970:40:0;;-1:-1:-1;38021:20:0;;38044:18;;;;;15877::1;;38044:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38116:68;;-1:-1:-1;;;38116:68:0;;;;;23550:25:1;;;23623:4;23611:17;;23591:18;;;23584:45;38021:61:0;;-1:-1:-1;38093:20:0;;-1:-1:-1;;;;;38116:37:0;;;;;23523:18:1;;38116:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38218:62;;-1:-1:-1;;;38218:62:0;;;;;23550:25:1;;;23623:4;23611:17;;23591:18;;;23584:45;38093:91:0;;-1:-1:-1;;;;;;38218:41:0;;;;;23523:18:1;;38218:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38195:85;37732:556;-1:-1:-1;;;;;;;;37732:556:0:o;23717:1638::-;23929:7;23949:22;23974:8;-1:-1:-1;;;;;23974:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23949:53;;24013:20;24036:6;-1:-1:-1;;;;;24036:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24013:49;;24110:6;-1:-1:-1;;;;;24081:36:0;24089:8;-1:-1:-1;;;;;24081:36:0;;;24073:66;;;;-1:-1:-1;;;24073:66:0;;20192:2:1;24073:66:0;;;20174:21:1;20231:2;20211:18;;;20204:30;-1:-1:-1;;;20250:18:1;;;20243:47;20307:18;;24073:66:0;19990:341:1;24073:66:0;24176:12;24158:14;:30;24150:68;;;;-1:-1:-1;;;24150:68:0;;19838:2:1;24150:68:0;;;19820:21:1;19877:2;19857:18;;;19850:30;19916:27;19896:18;;;19889:55;19961:18;;24150:68:0;19636:349:1;24150:68:0;24229:16;24248:8;-1:-1:-1;;;;;24248:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24229:40;;24280:14;24297:6;-1:-1:-1;;;;;24297:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24280:36;;24327:28;24372:14;-1:-1:-1;;;;;24358:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24358:29:0;;24327:60;;24430:7;24425:154;24447:14;24443:1;:18;;;24425:154;;;24497:20;;-1:-1:-1;;;24497:20:0;;24626:4:1;24614:17;;24497:20:0;;;24596:36:1;24483:11:0;;-1:-1:-1;;;;;24497:17:0;;;;;24569:18:1;;24497:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24532:35;;-1:-1:-1;;;24532:35:0;;-1:-1:-1;;;;;15922:32:1;;;24532:35:0;;;15904:51:1;24483:34:0;;-1:-1:-1;24532:20:0;;;;;;15877:18:1;;24532:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24468:111;24463:3;;;;;:::i;:::-;;;;24425:154;;;-1:-1:-1;24589:61:0;-1:-1:-1;;;;;24589:26:0;;24616:10;24636:4;24643:6;24589:26;:61::i;:::-;24661:58;-1:-1:-1;;;;;24661:31:0;;24701:8;24712:6;24661:31;:58::i;:::-;24730:55;;-1:-1:-1;;;24730:55:0;;-1:-1:-1;;;;;24730:24:0;;;;;:55;;24755:6;;24763:11;;24776:8;;24730:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24730:55:0;;;;;;;;;;;;:::i;:::-;;24798:29;24844:12;-1:-1:-1;;;;;24830:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24830:27:0;;24798:59;;24875:7;24870:278;24892:12;24888:1;:16;;;24870:278;;;24940:18;;-1:-1:-1;;;24940:18:0;;24626:4:1;24614:17;;24940:18:0;;;24596:36:1;24926:11:0;;-1:-1:-1;;;;;24940:15:0;;;;;24569:18:1;;24940::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24994:29;;-1:-1:-1;;;24994:29:0;;25017:4;24994:29;;;15904:51:1;24926:32:0;;-1:-1:-1;24973:18:0;;-1:-1:-1;;;;;24994:14:0;;;;;15877:18:1;;24994:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24973:50;;25038:55;25073:6;25082:10;25038:4;-1:-1:-1;;;;;25038:26:0;;;:55;;;;;:::i;:::-;25126:10;25108:12;25121:1;25108:15;;;;;;;;;;:::i;:::-;;;;;;:28;;;;;24911:237;;24906:3;;;;;:::i;:::-;;;;24870:278;;;-1:-1:-1;25158:54:0;;-1:-1:-1;;;25158:54:0;;-1:-1:-1;;;;;25158:19:0;;;;;:54;;25178:12;;25192:9;;25203:8;;25158:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25244:32:0;;-1:-1:-1;;;25244:32:0;;25270:4;25244:32;;;15904:51:1;25225:16:0;;-1:-1:-1;;;;;25244:17:0;;;;;15877:18:1;;25244:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25225:51;-1:-1:-1;25287:34:0;-1:-1:-1;;;;;25287:20:0;;25308:2;25225:51;25287:20;:34::i;35816:694::-;35966:7;35986:22;36011:8;-1:-1:-1;;;;;36011:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36077:41;;-1:-1:-1;;;36077:41:0;;;;;22301:25:1;;;35986:53:0;;-1:-1:-1;36050:24:0;;-1:-1:-1;;;;;36077:33:0;;;;;22274:18:1;;36077:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36077:41:0;;;;;;;;;;;;:::i;:::-;36050:68;;36129:29;36175:14;-1:-1:-1;;;;;36161:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36161:29:0;;36129:61;;36206:7;36201:237;36223:14;36219:1;:18;;;36201:237;;;36277:20;;-1:-1:-1;;;36277:20:0;;24626:4:1;24614:17;;36277:20:0;;;24596:36:1;36259:15:0;;-1:-1:-1;;;;;36277:17:0;;;;;24569:18:1;;36277:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36334:39;;-1:-1:-1;;;36334:39:0;;-1:-1:-1;;;;;15922:32:1;;;36334:39:0;;;15904:51:1;36259:38:0;;-1:-1:-1;36312:19:0;;36334:20;;;;;15877:18:1;;36334:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36312:61;;;;36416:7;36424:1;36416:10;;;;;;;;;;:::i;:::-;;;;;;;36388:12;36401:11;36388:25;;;;;;;;:::i;:::-;;;;;;:38;;;;;36244:194;;36239:3;;;;;:::i;:::-;;;;36201:237;;;-1:-1:-1;36455:47:0;;-1:-1:-1;;;36455:47:0;;-1:-1:-1;;;;;36455:27:0;;;;;:47;;36483:12;;36497:4;;36455:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36448:54;;;;;35816:694;;;;;;:::o;36518:616::-;36751:7;36771:16;36790:8;-1:-1:-1;;;;;36790:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36845:38;;-1:-1:-1;;;36845:38:0;;-1:-1:-1;;;;;15922:32:1;;;36845:38:0;;;15904:51:1;36771:40:0;;-1:-1:-1;36822:20:0;;36845:18;;;;;15877::1;;36845:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36822:61;;36894:20;36917:8;-1:-1:-1;;;;;36917:29:0;;36947:12;36961:10;36917:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36894:78;;37045:12;37014;37027:14;37014:28;;;;;;;;;;:::i;:::-;;;;;;;:43;;;;:::i;:::-;36983:12;36996:14;36983:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:74;37075:51;;-1:-1:-1;;;37075:51:0;;-1:-1:-1;;;;;37075:25:0;;;;;:51;;37101:12;;37115:10;;37075:51;;;:::i;38296:249::-;38489:48;;-1:-1:-1;;;38489:48:0;;24867:4:1;24855:17;;;38489:48:0;;;24837:36:1;24909:17;;24889:18;;;24882:45;24943:18;;;24936:34;;;38462:7:0;;-1:-1:-1;;;;;38489:18:0;;;;;24810::1;;38489:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38553:734::-;38762:7;38782:16;38801:8;-1:-1:-1;;;;;38801:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38856:38;;-1:-1:-1;;;38856:38:0;;-1:-1:-1;;;;;15922:32:1;;;38856:38:0;;;15904:51:1;38782:40:0;;-1:-1:-1;38833:20:0;;38856:18;;;;;15877::1;;38856:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38833:61;;38905:29;38951:8;-1:-1:-1;;;;;38951:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38937:43:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38937:43:0;;38905:75;;39022:2;38991:12;39004:14;38991:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;39058:49;;-1:-1:-1;;;39058:49:0;;39035:20;;-1:-1:-1;;;;;39058:29:0;;;;;:49;;39088:12;;39102:4;;39058:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39035:72;;39140:12;39122:30;;:14;:30;;;39118:82;;;39176:12;-1:-1:-1;39169:19:0;;-1:-1:-1;;;39169:19:0;39118:82;39217:62;;-1:-1:-1;;;39217:62:0;;24867:4:1;24855:17;;;39217:62:0;;;24837:36:1;24909:17;;24889:18;;;24882:45;24943:18;;;24936:34;;;-1:-1:-1;;;;;39217:18:0;;;;;24810::1;;39217:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30008:1621::-;30302:24;30328:29;30370:12;30385:4;-1:-1:-1;;;;;30385:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30370:32;;30413:16;30432:8;-1:-1:-1;;;;;30432:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30413:40;-1:-1:-1;30464:58:0;-1:-1:-1;;;;;30464:22:0;;30487:10;30507:4;30514:7;30464:22;:58::i;:::-;30533:51;-1:-1:-1;;;;;30533:27:0;;30569:4;30576:7;30533:27;:51::i;:::-;30595:57;;-1:-1:-1;;;30595:57:0;;-1:-1:-1;;;;;30595:20:0;;;;;:57;;30616:7;;30625:16;;;;30643:8;;30595:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30595:57:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;30686:34:0;;-1:-1:-1;;;30686:34:0;;30714:4;30686:34;;;15904:51:1;30663:20:0;;-1:-1:-1;;;;;30686:19:0;;;;;15877:18:1;;30686:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30663:57;-1:-1:-1;30731:64:0;-1:-1:-1;;;;;30731:31:0;;30771:8;30663:57;30731:31;:64::i;:::-;30808:66;;-1:-1:-1;;;30808:66:0;;-1:-1:-1;;;;;30808:24:0;;;;;:66;;30833:12;;30847:16;;;;30865:8;;30808:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30808:66:0;;;;;;;;;;;;:::i;:::-;;30944:4;-1:-1:-1;;;;;30944:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30930:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30930:39:0;;30920:49;;30985:7;30980:269;31002:4;-1:-1:-1;;;;;31002:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30998:1;:28;;;30980:269;;;31048:11;31062:4;-1:-1:-1;;;;;31062:13:0;;31076:1;31062:16;;;;;;;;;;;;;;24626:4:1;24614:17;;;;24596:36;;24584:2;24569:18;;24454:184;31062:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31106:29;;-1:-1:-1;;;31106:29:0;;31129:4;31106:29;;;15904:51:1;31048:30:0;;-1:-1:-1;;;;;;31106:14:0;;;;;15877:18:1;;31106:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31093:7;31101:1;31093:10;;;;;;;;;;:::i;:::-;;;;;;:42;;;;;31167:1;31154:7;31162:1;31154:10;;;;;;;;;;:::i;:::-;;;;;;;:14;31150:88;;;31189:33;31207:2;31211:7;31219:1;31211:10;;;;;;;;;;:::i;31189:33::-;-1:-1:-1;31028:3:0;;;;:::i;:::-;;;;30980:269;;;;31290:8;-1:-1:-1;;;;;31290:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31276:43:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31276:43:0;;31261:58;;31335:7;31330:292;31352:8;-1:-1:-1;;;;;31352:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31348:1;:32;;;31330:292;;;31402:11;31416:8;-1:-1:-1;;;;;31416:17:0;;31434:1;31416:20;;;;;;;;;;;;;;24626:4:1;24614:17;;;;24596:36;;24584:2;24569:18;;24454:184;31416:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31469:29;;-1:-1:-1;;;31469:29:0;;31492:4;31469:29;;;15904:51:1;31402:34:0;;-1:-1:-1;;;;;;31469:14:0;;;;;15877:18:1;;31469:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31451:12;31464:1;31451:15;;;;;;;;;;:::i;:::-;;;;;;:47;;;;;31535:1;31517:12;31530:1;31517:15;;;;;;;;;;:::i;:::-;;;;;;;:19;31513:98;;;31557:38;31575:2;31579:12;31592:1;31579:15;;;;;;;;;;:::i;31557:38::-;-1:-1:-1;31382:3:0;;;;:::i;:::-;;;;31330:292;;;;30359:1270;;;30008:1621;;;;;;;;;;;;:::o;33422:1210::-;33693:7;33713:16;33732:8;-1:-1:-1;;;;;33732:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33787:38;;-1:-1:-1;;;33787:38:0;;-1:-1:-1;;;;;15922:32:1;;;33787:38:0;;;15904:51:1;33713:40:0;;-1:-1:-1;33764:20:0;;33787:18;;;;;15877::1;;33787:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33764:61;;33836:29;33882:8;-1:-1:-1;;;;;33882:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33868:43:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33868:43:0;;33836:75;;33953:2;33922:12;33935:14;33922:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;33980;;-1:-1:-1;;;33980:33:0;;24626:4:1;24614:17;;33980:33:0;;;24596:36:1;33966:11:0;;-1:-1:-1;;;;;33980:17:0;;;;;24569:18:1;;33980:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33966:47;-1:-1:-1;34024:52:0;-1:-1:-1;;;;;34024:21:0;;34046:10;34066:4;34073:2;34024:21;:52::i;:::-;34087:49;-1:-1:-1;;;;;34087:26:0;;34122:8;34133:2;34087:26;:49::i;:::-;34170:48;;-1:-1:-1;;;34170:48:0;;34147:20;;-1:-1:-1;;;;;34170:21:0;;;;;:48;;34192:12;;34147:20;;34209:8;;34170:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34147:71;;34251:12;34233:30;;:14;:30;;;34229:208;;34280:60;-1:-1:-1;;;;;34280:31:0;;34320:4;34327:12;34280:31;:60::i;:::-;34355:70;;-1:-1:-1;;;34355:70:0;;25270:4:1;25258:17;;;34355:70:0;;;25240:36:1;25312:17;;25292:18;;;25285:45;25346:18;;;25339:34;;;25389:18;;;25382:34;;;25432:19;;;25425:35;;;-1:-1:-1;;;;;34355:9:0;;;;;25212:19:1;;34355:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34229:208;34447:13;34463:4;-1:-1:-1;;;;;34463:13:0;;34477:12;34463:27;;;;;;;;;;;;;;24626:4:1;24614:17;;;;24596:36;;24584:2;24569:18;;24454:184;34463:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34521:31;;-1:-1:-1;;;34521:31:0;;34546:4;34521:31;;;15904:51:1;34447:43:0;;-1:-1:-1;34501:17:0;;-1:-1:-1;;;;;34521:16:0;;;;;15877:18:1;;34521:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34501:51;-1:-1:-1;34563:34:0;-1:-1:-1;;;;;34563:19:0;;34583:2;34501:51;34563:19;:34::i;:::-;34615:9;33422:1210;-1:-1:-1;;;;;;;;;;;;;;;33422:1210:0:o;29326:674::-;29549:7;29569:12;29584:4;-1:-1:-1;;;;;29584:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29569:32;-1:-1:-1;29612:59:0;-1:-1:-1;;;;;29612:22:0;;29635:10;29655:4;29662:8;29612:22;:59::i;:::-;29682:52;-1:-1:-1;;;;;29682:27:0;;29718:4;29725:8;29682:27;:52::i;:::-;29745:66;;-1:-1:-1;;;29745:66:0;;;;;23875:25:1;;;23948:4;23936:17;;23916:18;;;23909:45;23970:18;;;23963:34;;;24013:18;;;24006:34;;;-1:-1:-1;;;;;29745:28:0;;;;;23847:19:1;;29745:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;29836:20:0;;-1:-1:-1;;;29836:20:0;;24626:4:1;24614:17;;29836:20:0;;;24596:36:1;29822:11:0;;-1:-1:-1;;;;;29836:13:0;;;;;24569:18:1;;29836:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29889:29;;-1:-1:-1;;;29889:29:0;;29912:4;29889:29;;;15904:51:1;29822:34:0;;-1:-1:-1;29867:19:0;;-1:-1:-1;;;;;29889:14:0;;;;;15877:18:1;;29889:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29867:51;-1:-1:-1;29929:34:0;-1:-1:-1;;;;;29929:17:0;;29947:2;29867:51;29929:17;:34::i;31637:1080::-;31901:7;31921:12;31936:4;-1:-1:-1;;;;;31936:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31921:32;;31964:16;31983:8;-1:-1:-1;;;;;31983:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32038:38;;-1:-1:-1;;;32038:38:0;;-1:-1:-1;;;;;15922:32:1;;;32038:38:0;;;15904:51:1;31964:40:0;;-1:-1:-1;32015:20:0;;32038:18;;;;;15877::1;;32038:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32015:61;-1:-1:-1;32087:64:0;-1:-1:-1;;;;;32087:22:0;;32110:10;32130:4;32137:13;32087:22;:64::i;:::-;32162:57;-1:-1:-1;;;;;32162:27:0;;32198:4;32205:13;32162:27;:57::i;:::-;32230:72;;-1:-1:-1;;;32230:72:0;;;;;23875:25:1;;;23948:4;23936:17;;23916:18;;;23909:45;32290:1:0;23970:18:1;;;23963:34;24013:18;;;24006:34;;;-1:-1:-1;;;;;32230:28:0;;;;;23847:19:1;;32230:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32336:34:0;;-1:-1:-1;;;32336:34:0;;32364:4;32336:34;;;15904:51:1;32313:20:0;;-1:-1:-1;;;;;32336:19:0;;;;;15877:18:1;;32336:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32313:57;-1:-1:-1;32381:64:0;-1:-1:-1;;;;;32381:31:0;;32421:8;32313:57;32381:31;:64::i;:::-;32456:72;;-1:-1:-1;;;32456:72:0;;;;;23875:25:1;;;23948:4;23936:17;;23916:18;;;23909:45;23970:18;;;23963:34;;;24013:18;;;24006:34;;;-1:-1:-1;;;;;32456:32:0;;;;;23847:19:1;;32456:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32553:20:0;;-1:-1:-1;;;32553:20:0;;24626:4:1;24614:17;;32553:20:0;;;24596:36:1;32539:11:0;;-1:-1:-1;;;;;32553:17:0;;;;;24569:18:1;;32553:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32606:29;;-1:-1:-1;;;32606:29:0;;32629:4;32606:29;;;15904:51:1;32539:34:0;;-1:-1:-1;32584:19:0;;-1:-1:-1;;;;;32606:14:0;;;;;15877:18:1;;32606:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32584:51;-1:-1:-1;32646:34:0;-1:-1:-1;;;;;32646:17:0;;32664:2;32584:51;32646:17;:34::i;34640:1129::-;34909:7;34929:16;34948:8;-1:-1:-1;;;;;34948:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35003:38;;-1:-1:-1;;;35003:38:0;;-1:-1:-1;;;;;15922:32:1;;;35003:38:0;;;15904:51:1;34929:40:0;;-1:-1:-1;34980:20:0;;35003:18;;;;;15877::1;;35003:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35066:29;;-1:-1:-1;;;35066:29:0;;24626:4:1;24614:17;;35066:29:0;;;24596:36:1;34980:61:0;;-1:-1:-1;35052:11:0;;-1:-1:-1;;;;;35066:13:0;;;;;24569:18:1;;35066:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35052:43;-1:-1:-1;35106:52:0;-1:-1:-1;;;;;35106:21:0;;35128:10;35148:4;35155:2;35106:21;:52::i;:::-;35193:2;35210:32;;;;;;;;35206:199;;35259:45;-1:-1:-1;;;;;35259:26:0;;35294:4;35301:2;35259:26;:45::i;:::-;35335:58;;-1:-1:-1;;;35335:58:0;;25270:4:1;25258:17;;;35335:58:0;;;25240:36:1;25312:17;;25292:18;;;25285:45;25346:18;;;25339:34;;;35381:1:0;25389:18:1;;;25382:34;25432:19;;;25425:35;;;-1:-1:-1;;;;;35335:9:0;;;;;25212:19:1;;35335:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35319:74;;35206:199;35415:65;-1:-1:-1;;;;;35415:31:0;;35455:8;35466:13;35415:31;:65::i;:::-;35491:78;;-1:-1:-1;;;35491:78:0;;;;;23875:25:1;;;23948:4;23936:17;;23916:18;;;23909:45;23970:18;;;23963:34;;;24013:18;;;24006:34;;;-1:-1:-1;;;;;35491:32:0;;;;;23847:19:1;;35491:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35596:31:0;;-1:-1:-1;;;35596:31:0;;24626:4:1;24614:17;;35596:31:0;;;24596:36:1;35580:13:0;;-1:-1:-1;;;;;35596:17:0;;;;;24569:18:1;;35596:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35658;;-1:-1:-1;;;35658:31:0;;35683:4;35658:31;;;15904:51:1;35580:47:0;;-1:-1:-1;35638:17:0;;-1:-1:-1;;;;;35658:16:0;;;;;15877:18:1;;35658:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35638:51;-1:-1:-1;35700:34:0;-1:-1:-1;;;;;35700:19:0;;35720:2;35638:51;35700:19;:34::i;:::-;35752:9;34640:1129;-1:-1:-1;;;;;;;;;;;;;;34640:1129:0:o;39920:343::-;40092:30;;-1:-1:-1;;;40092:30:0;;40116:4;40092:30;;;15904:51:1;40036:19:0;;;;-1:-1:-1;;;;;40092:15:0;;;;;15877:18:1;;40092:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40068:54;-1:-1:-1;40133:51:0;-1:-1:-1;;;;;40133:22:0;;40156:4;40170;40177:6;40133:22;:51::i;:::-;40209:30;;-1:-1:-1;;;40209:30:0;;40233:4;40209:30;;;15904:51:1;40242:13:0;;-1:-1:-1;;;;;40209:15:0;;;;;15877:18:1;;40209:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;;:::i;13439:317::-;13593:39;;-1:-1:-1;;;13593:39:0;;13617:4;13593:39;;;16178:34:1;-1:-1:-1;;;;;16248:15:1;;;16228:18;;;16221:43;13570:20:0;;13635:5;;13593:15;;;;;16113:18:1;;13593:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;13678:69;;-1:-1:-1;;;;;16847:32:1;;13678:69:0;;;16829:51:1;16896:18;;;16889:34;;;13570:70:0;;-1:-1:-1;13651:97:0;;13671:5;;-1:-1:-1;;;13701:22:0;16802:18:1;;13678:69:0;;;;-1:-1:-1;;13678:69:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13678:69:0;-1:-1:-1;;;;;;13678:69:0;;;;;;;;;;13651:19;:97::i;:::-;13559:197;13439:317;;;:::o;12079:211::-;12223:58;;-1:-1:-1;;;;;16847:32:1;;12223:58:0;;;16829:51:1;16896:18;;;16889:34;;;12196:86:0;;12216:5;;-1:-1:-1;;;12246:23:0;16802:18:1;;12223:58:0;16655:274:1;12196:86:0;12079:211;;;:::o;12298:248::-;12469:68;;-1:-1:-1;;;;;16533:15:1;;;12469:68:0;;;16515:34:1;16585:15;;16565:18;;;16558:43;16617:18;;;16610:34;;;12442:96:0;;12462:5;;-1:-1:-1;;;12492:27:0;16450:18:1;;12469:68:0;16275:375:1;14652:716:0;15076:23;15102:69;15130:4;15102:69;;;;;;;;;;;;;;;;;15110:5;-1:-1:-1;;;;;15102:27:0;;;:69;;;;;:::i;:::-;15186:17;;15076:95;;-1:-1:-1;15186:21:0;15182:179;;15283:10;15272:30;;;;;;;;;;;;:::i;:::-;15264:85;;;;-1:-1:-1;;;15264:85:0;;21946:2:1;15264:85:0;;;21928:21:1;21985:2;21965:18;;;21958:30;22024:34;22004:18;;;21997:62;-1:-1:-1;;;22075:18:1;;;22068:40;22125:19;;15264:85:0;21744:406:1;3978:229:0;4115:12;4147:52;4169:6;4177:4;4183:1;4186:12;4147:21;:52::i;:::-;4140:59;3978:229;-1:-1:-1;;;;3978:229:0:o;5098:510::-;5268:12;5326:5;5301:21;:30;;5293:81;;;;-1:-1:-1;;;5293:81:0;;19431:2:1;5293:81:0;;;19413:21:1;19470:2;19450:18;;;19443:30;19509:34;19489:18;;;19482:62;-1:-1:-1;;;19560:18:1;;;19553:36;19606:19;;5293:81:0;19229:402:1;5293:81:0;-1:-1:-1;;;;;1528:19:0;;;5385:60;;;;-1:-1:-1;;;5385:60:0;;21588:2:1;5385:60:0;;;21570:21:1;21627:2;21607:18;;;21600:30;21666:31;21646:18;;;21639:59;21715:18;;5385:60:0;21386:353:1;5385:60:0;5459:12;5473:23;5500:6;-1:-1:-1;;;;;5500:11:0;5519:5;5526:4;5500:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5458:73;;;;5549:51;5566:7;5575:10;5587:12;5549:16;:51::i;:::-;5542:58;5098:510;-1:-1:-1;;;;;;;5098:510:0:o;7784:712::-;7934:12;7963:7;7959:530;;;-1:-1:-1;7994:10:0;7987:17;;7959:530;8108:17;;:21;8104:374;;8306:10;8300:17;8367:15;8354:10;8350:2;8346:19;8339:44;8104:374;8449:12;8442:20;;-1:-1:-1;;;8442:20:0;;;;;;;;:::i;14:367:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;-1:-1:-1;;;;;214:30:1;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:673::-;440:5;493:3;486:4;478:6;474:17;470:27;460:55;;511:1;508;501:12;460:55;547:6;534:20;573:4;597:60;613:43;653:2;613:43;:::i;:::-;597:60;:::i;:::-;679:3;703:2;698:3;691:15;731:2;726:3;722:12;715:19;;766:2;758:6;754:15;818:3;813:2;807;804:1;800:10;792:6;788:23;784:32;781:41;778:61;;;835:1;832;825:12;778:61;857:1;867:163;881:2;878:1;875:9;867:163;;;938:17;;926:30;;976:12;;;;1008;;;;899:1;892:9;867:163;;;-1:-1:-1;1048:5:1;;386:673;-1:-1:-1;;;;;;;386:673:1:o;1064:892::-;1159:6;1190:2;1233;1221:9;1212:7;1208:23;1204:32;1201:52;;;1249:1;1246;1239:12;1201:52;1282:9;1276:16;-1:-1:-1;;;;;1307:6:1;1304:30;1301:50;;;1347:1;1344;1337:12;1301:50;1370:22;;1423:4;1415:13;;1411:27;-1:-1:-1;1401:55:1;;1452:1;1449;1442:12;1401:55;1481:2;1475:9;1504:60;1520:43;1560:2;1520:43;:::i;1504:60::-;1586:3;1610:2;1605:3;1598:15;1638:2;1633:3;1629:12;1622:19;;1669:2;1665;1661:11;1717:7;1712:2;1706;1703:1;1699:10;1695:2;1691:19;1687:28;1684:41;1681:61;;;1738:1;1735;1728:12;1681:61;1760:1;1751:10;;1770:156;1784:2;1781:1;1778:9;1770:156;;;1841:10;;1829:23;;1802:1;1795:9;;;;;1872:12;;;;1904;;1770:156;;;-1:-1:-1;1945:5:1;1064:892;-1:-1:-1;;;;;;;1064:892:1:o;1961:245::-;2028:6;2081:2;2069:9;2060:7;2056:23;2052:32;2049:52;;;2097:1;2094;2087:12;2049:52;2129:9;2123:16;2148:28;2170:5;2148:28;:::i;2211:265::-;2295:6;2348:2;2336:9;2327:7;2323:23;2319:32;2316:52;;;2364:1;2361;2354:12;2316:52;2396:9;2390:16;2415:31;2440:5;2415:31;:::i;2481:781::-;2620:6;2628;2636;2644;2652;2705:3;2693:9;2684:7;2680:23;2676:33;2673:53;;;2722:1;2719;2712:12;2673:53;2761:9;2748:23;2780:31;2805:5;2780:31;:::i;:::-;2830:5;-1:-1:-1;2886:2:1;2871:18;;2858:32;-1:-1:-1;;;;;2902:30:1;;2899:50;;;2945:1;2942;2935:12;2899:50;2968:61;3021:7;3012:6;3001:9;2997:22;2968:61;:::i;:::-;2958:71;;;3076:2;3065:9;3061:18;3048:32;3038:42;;3132:2;3121:9;3117:18;3104:32;3145:33;3170:7;3145:33;:::i;:::-;2481:781;;;;-1:-1:-1;2481:781:1;;3251:3;3236:19;3223:33;;2481:781;-1:-1:-1;;2481:781:1:o;3267:1046::-;3447:6;3455;3463;3471;3479;3532:3;3520:9;3511:7;3507:23;3503:33;3500:53;;;3549:1;3546;3539:12;3500:53;3588:9;3575:23;3607:31;3632:5;3607:31;:::i;:::-;3657:5;-1:-1:-1;3714:2:1;3699:18;;3686:32;3727:33;3686:32;3727:33;:::i;:::-;3779:7;-1:-1:-1;3837:2:1;3822:18;;3809:32;-1:-1:-1;;;;;3890:14:1;;;3887:34;;;3917:1;3914;3907:12;3887:34;3940:61;3993:7;3984:6;3973:9;3969:22;3940:61;:::i;:::-;3930:71;;4054:2;4043:9;4039:18;4026:32;4010:48;;4083:2;4073:8;4070:16;4067:36;;;4099:1;4096;4089:12;4067:36;;4122:63;4177:7;4166:8;4155:9;4151:24;4122:63;:::i;:::-;4112:73;;;4237:3;4226:9;4222:19;4209:33;4251:30;4273:7;4251:30;:::i;:::-;4300:7;4290:17;;;3267:1046;;;;;;;;:::o;4318:1190::-;4519:6;4527;4535;4543;4551;4559;4567;4620:3;4608:9;4599:7;4595:23;4591:33;4588:53;;;4637:1;4634;4627:12;4588:53;4676:9;4663:23;4695:31;4720:5;4695:31;:::i;:::-;4745:5;-1:-1:-1;4802:2:1;4787:18;;4774:32;4815:33;4774:32;4815:33;:::i;:::-;4867:7;-1:-1:-1;4925:2:1;4910:18;;4897:32;-1:-1:-1;;;;;4978:14:1;;;4975:34;;;5005:1;5002;4995:12;4975:34;5028:61;5081:7;5072:6;5061:9;5057:22;5028:61;:::i;:::-;5018:71;;5142:2;5131:9;5127:18;5114:32;5098:48;;5171:2;5161:8;5158:16;5155:36;;;5187:1;5184;5177:12;5155:36;;5210:63;5265:7;5254:8;5243:9;5239:24;5210:63;:::i;:::-;5200:73;;;5320:3;5309:9;5305:19;5292:33;5282:43;;5377:3;5366:9;5362:19;5349:33;5391;5416:7;5391:33;:::i;:::-;5443:7;5433:17;;;5497:3;5486:9;5482:19;5469:33;5459:43;;4318:1190;;;;;;;;;;:::o;5513:494::-;5628:6;5636;5644;5697:2;5685:9;5676:7;5672:23;5668:32;5665:52;;;5713:1;5710;5703:12;5665:52;5752:9;5739:23;5771:31;5796:5;5771:31;:::i;:::-;5821:5;-1:-1:-1;5878:2:1;5863:18;;5850:32;5891:33;5850:32;5891:33;:::i;:::-;5513:494;;5943:7;;-1:-1:-1;;;5997:2:1;5982:18;;;;5969:32;;5513:494::o;6012:1368::-;6217:6;6225;6233;6241;6249;6257;6265;6273;6281;6334:3;6322:9;6313:7;6309:23;6305:33;6302:53;;;6351:1;6348;6341:12;6302:53;6390:9;6377:23;6409:31;6434:5;6409:31;:::i;:::-;6459:5;-1:-1:-1;6516:2:1;6501:18;;6488:32;6529:33;6488:32;6529:33;:::i;:::-;6581:7;-1:-1:-1;6635:2:1;6620:18;;6607:32;;-1:-1:-1;6690:2:1;6675:18;;6662:32;-1:-1:-1;;;;;6743:14:1;;;6740:34;;;6770:1;6767;6760:12;6740:34;6809:70;6871:7;6862:6;6851:9;6847:22;6809:70;:::i;:::-;6898:8;;-1:-1:-1;6783:96:1;-1:-1:-1;6986:3:1;6971:19;;6958:33;;-1:-1:-1;7003:16:1;;;7000:36;;;7032:1;7029;7022:12;7000:36;;7071:72;7135:7;7124:8;7113:9;7109:24;7071:72;:::i;:::-;7162:8;;-1:-1:-1;7045:98:1;-1:-1:-1;;7249:3:1;7234:19;;7221:33;7263;7221;7263;:::i;:::-;7315:7;7305:17;;;7369:3;7358:9;7354:19;7341:33;7331:43;;6012:1368;;;;;;;;;;;:::o;7385:774::-;7527:6;7535;7543;7551;7559;7567;7620:3;7608:9;7599:7;7595:23;7591:33;7588:53;;;7637:1;7634;7627:12;7588:53;7676:9;7663:23;7695:31;7720:5;7695:31;:::i;:::-;7745:5;-1:-1:-1;7802:2:1;7787:18;;7774:32;7815:33;7774:32;7815:33;:::i;:::-;7867:7;-1:-1:-1;7921:2:1;7906:18;;7893:32;;-1:-1:-1;7972:2:1;7957:18;;7944:32;;-1:-1:-1;8028:3:1;8013:19;;8000:33;8042;8000;8042;:::i;:::-;8094:7;8084:17;;;8148:3;8137:9;8133:19;8120:33;8110:43;;7385:774;;;;;;;;:::o;8164:632::-;8286:6;8294;8302;8310;8363:3;8351:9;8342:7;8338:23;8334:33;8331:53;;;8380:1;8377;8370:12;8331:53;8419:9;8406:23;8438:31;8463:5;8438:31;:::i;:::-;8488:5;-1:-1:-1;8545:2:1;8530:18;;8517:32;8558:33;8517:32;8558:33;:::i;:::-;8610:7;-1:-1:-1;8664:2:1;8649:18;;8636:32;;-1:-1:-1;8720:2:1;8705:18;;8692:32;8733:31;8692:32;8733:31;:::i;:::-;8164:632;;;;-1:-1:-1;8164:632:1;;-1:-1:-1;;8164:632:1:o;8801:912::-;8950:6;8958;8966;8974;8982;8990;8998;9051:3;9039:9;9030:7;9026:23;9022:33;9019:53;;;9068:1;9065;9058:12;9019:53;9107:9;9094:23;9126:31;9151:5;9126:31;:::i;:::-;9176:5;-1:-1:-1;9233:2:1;9218:18;;9205:32;9246:33;9205:32;9246:33;:::i;:::-;9298:7;-1:-1:-1;9352:2:1;9337:18;;9324:32;;-1:-1:-1;9408:2:1;9393:18;;9380:32;9421:31;9380:32;9421:31;:::i;:::-;9471:7;-1:-1:-1;9525:3:1;9510:19;;9497:33;;-1:-1:-1;9582:3:1;9567:19;;9554:33;9596;9554;9596;:::i;9718:770::-;9847:6;9855;9863;9871;9879;9932:3;9920:9;9911:7;9907:23;9903:33;9900:53;;;9949:1;9946;9939:12;9900:53;9988:9;9975:23;10007:31;10032:5;10007:31;:::i;:::-;10057:5;-1:-1:-1;10114:2:1;10099:18;;10086:32;10127:33;10086:32;10127:33;:::i;:::-;10179:7;-1:-1:-1;10238:2:1;10223:18;;10210:32;10251:31;10210:32;10251:31;:::i;:::-;10301:7;-1:-1:-1;10360:2:1;10345:18;;10332:32;10373:31;10332:32;10373:31;:::i;10493:1050::-;10649:6;10657;10665;10673;10681;10689;10697;10705;10758:3;10746:9;10737:7;10733:23;10729:33;10726:53;;;10775:1;10772;10765:12;10726:53;10814:9;10801:23;10833:31;10858:5;10833:31;:::i;:::-;10883:5;-1:-1:-1;10940:2:1;10925:18;;10912:32;10953:33;10912:32;10953:33;:::i;:::-;11005:7;-1:-1:-1;11064:2:1;11049:18;;11036:32;11077:31;11036:32;11077:31;:::i;:::-;11127:7;-1:-1:-1;11186:2:1;11171:18;;11158:32;11199:31;11158:32;11199:31;:::i;:::-;11249:7;-1:-1:-1;11303:3:1;11288:19;;11275:33;;-1:-1:-1;11355:3:1;11340:19;;11327:33;;-1:-1:-1;11412:3:1;11397:19;;11384:33;11426;11384;11426;:::i;:::-;11478:7;11468:17;;;11532:3;11521:9;11517:19;11504:33;11494:43;;10493:1050;;;;;;;;;;;:::o;11548:781::-;11687:6;11695;11703;11711;11719;11772:3;11760:9;11751:7;11747:23;11743:33;11740:53;;;11789:1;11786;11779:12;11740:53;11828:9;11815:23;11847:31;11872:5;11847:31;:::i;:::-;11897:5;-1:-1:-1;11949:2:1;11934:18;;11921:32;;-1:-1:-1;12004:2:1;11989:18;;11976:32;-1:-1:-1;;;;;12020:30:1;;12017:50;;;12063:1;12060;12053:12;12017:50;12086:61;12139:7;12130:6;12119:9;12115:22;12086:61;:::i;:::-;12076:71;;;12199:2;12188:9;12184:18;12171:32;12212:33;12237:7;12212:33;:::i;12334:751::-;12455:6;12463;12471;12479;12487;12495;12548:3;12536:9;12527:7;12523:23;12519:33;12516:53;;;12565:1;12562;12555:12;12516:53;12604:9;12591:23;12623:31;12648:5;12623:31;:::i;:::-;12673:5;-1:-1:-1;12725:2:1;12710:18;;12697:32;;-1:-1:-1;12781:2:1;12766:18;;12753:32;12794:31;12753:32;12794:31;:::i;:::-;12844:7;-1:-1:-1;12898:2:1;12883:18;;12870:32;;-1:-1:-1;12954:3:1;12939:19;;12926:33;12968;12926;12968;:::i;13090:609::-;13191:6;13199;13207;13215;13268:3;13256:9;13247:7;13243:23;13239:33;13236:53;;;13285:1;13282;13275:12;13236:53;13324:9;13311:23;13343:31;13368:5;13343:31;:::i;:::-;13393:5;-1:-1:-1;13450:2:1;13435:18;;13422:32;13463:31;13422:32;13463:31;:::i;:::-;13513:7;-1:-1:-1;13572:2:1;13557:18;;13544:32;13585:31;13544:32;13585:31;:::i;:::-;13090:609;;;;-1:-1:-1;13635:7:1;;13689:2;13674:18;13661:32;;-1:-1:-1;;13090:609:1:o;13704:889::-;13832:6;13840;13848;13856;13864;13872;13880;13933:3;13921:9;13912:7;13908:23;13904:33;13901:53;;;13950:1;13947;13940:12;13901:53;13989:9;13976:23;14008:31;14033:5;14008:31;:::i;:::-;14058:5;-1:-1:-1;14115:2:1;14100:18;;14087:32;14128:31;14087:32;14128:31;:::i;:::-;14178:7;-1:-1:-1;14237:2:1;14222:18;;14209:32;14250:31;14209:32;14250:31;:::i;:::-;14300:7;-1:-1:-1;14354:2:1;14339:18;;14326:32;;-1:-1:-1;14405:3:1;14390:19;;14377:33;;-1:-1:-1;14462:3:1;14447:19;;14434:33;14476;14434;14476;:::i;14598:184::-;14668:6;14721:2;14709:9;14700:7;14696:23;14692:32;14689:52;;;14737:1;14734;14727:12;14689:52;-1:-1:-1;14760:16:1;;14598:184;-1:-1:-1;14598:184:1:o;14787:247::-;14855:6;14908:2;14896:9;14887:7;14883:23;14879:32;14876:52;;;14924:1;14921;14914:12;14876:52;14956:9;14950:16;14975:29;14998:5;14975:29;:::i;15039:435::-;15092:3;15130:5;15124:12;15157:6;15152:3;15145:19;15183:4;15212:2;15207:3;15203:12;15196:19;;15249:2;15242:5;15238:14;15270:1;15280:169;15294:6;15291:1;15288:13;15280:169;;;15355:13;;15343:26;;15389:12;;;;15424:15;;;;15316:1;15309:9;15280:169;;;-1:-1:-1;15465:3:1;;15039:435;-1:-1:-1;;;;;15039:435:1:o;15479:274::-;15608:3;15646:6;15640:13;15662:53;15708:6;15703:3;15696:4;15688:6;15684:17;15662:53;:::i;:::-;15731:16;;;;;15479:274;-1:-1:-1;;15479:274:1:o;16934:261::-;17113:2;17102:9;17095:21;17076:4;17133:56;17185:2;17174:9;17170:18;17162:6;17133:56;:::i;17200:465::-;17457:2;17446:9;17439:21;17420:4;17483:56;17535:2;17524:9;17520:18;17512:6;17483:56;:::i;:::-;17587:9;17579:6;17575:22;17570:2;17559:9;17555:18;17548:50;17615:44;17652:6;17644;17615:44;:::i;17670:342::-;17871:2;17860:9;17853:21;17834:4;17891:56;17943:2;17932:9;17928:18;17920:6;17891:56;:::i;:::-;17883:64;;17997:6;17990:14;17983:22;17978:2;17967:9;17963:18;17956:50;17670:342;;;;;:::o;18017:411::-;18260:2;18249:9;18242:21;18223:4;18280:56;18332:2;18321:9;18317:18;18309:6;18280:56;:::i;:::-;18367:2;18352:18;;18345:34;;;;-1:-1:-1;18410:2:1;18395:18;18388:34;18272:64;18017:411;-1:-1:-1;18017:411:1:o;18841:383::-;18990:2;18979:9;18972:21;18953:4;19022:6;19016:13;19065:6;19060:2;19049:9;19045:18;19038:34;19081:66;19140:6;19135:2;19124:9;19120:18;19115:2;19107:6;19103:15;19081:66;:::i;:::-;19208:2;19187:15;-1:-1:-1;;19183:29:1;19168:45;;;;19215:2;19164:54;;18841:383;-1:-1:-1;;18841:383:1:o;22337:630::-;22564:25;;;22625:2;22620;22605:18;;22598:30;;;22644:18;;22637:34;;;-1:-1:-1;;;;;;22683:31:1;;22680:51;;;22727:1;22724;22717:12;22680:51;22761:6;22758:1;22754:14;22819:6;22811;22805:3;22794:9;22790:19;22777:49;22897:1;22849:22;;;22873:3;22845:32;22886:13;;;22949:2;22934:18;;;22927:34;;;;22845:32;22337:630;-1:-1:-1;;;;22337:630:1:o;22972:403::-;23207:6;23196:9;23189:25;23250:2;23245;23234:9;23230:18;23223:30;23170:4;23270:56;23322:2;23311:9;23307:18;23299:6;23270:56;:::i;:::-;23262:64;;23362:6;23357:2;23346:9;23342:18;23335:34;22972:403;;;;;;:::o;25953:275::-;26024:2;26018:9;26089:2;26070:13;;-1:-1:-1;;26066:27:1;26054:40;;-1:-1:-1;;;;;26109:34:1;;26145:22;;;26106:62;26103:88;;;26171:18;;:::i;:::-;26207:2;26200:22;25953:275;;-1:-1:-1;25953:275:1:o;26233:183::-;26293:4;-1:-1:-1;;;;;26318:6:1;26315:30;26312:56;;;26348:18;;:::i;:::-;-1:-1:-1;26393:1:1;26389:14;26405:4;26385:25;;26233:183::o;26421:128::-;26461:3;26492:1;26488:6;26485:1;26482:13;26479:39;;;26498:18;;:::i;:::-;-1:-1:-1;26534:9:1;;26421:128::o;26554:125::-;26594:4;26622:1;26619;26616:8;26613:34;;;26627:18;;:::i;:::-;-1:-1:-1;26664:9:1;;26554:125::o;26684:258::-;26756:1;26766:113;26780:6;26777:1;26774:13;26766:113;;;26856:11;;;26850:18;26837:11;;;26830:39;26802:2;26795:10;26766:113;;;26897:6;26894:1;26891:13;26888:48;;;-1:-1:-1;;26932:1:1;26914:16;;26907:27;26684:258::o;26947:175::-;26984:3;27028:4;27021:5;27017:16;27057:4;27048:7;27045:17;27042:43;;;27065:18;;:::i;:::-;27114:1;27101:15;;26947:175;-1:-1:-1;;26947:175:1:o;27127:127::-;27188:10;27183:3;27179:20;27176:1;27169:31;27219:4;27216:1;27209:15;27243:4;27240:1;27233:15;27259:127;27320:10;27315:3;27311:20;27308:1;27301:31;27351:4;27348:1;27341:15;27375:4;27372:1;27365:15;27391:127;27452:10;27447:3;27443:20;27440:1;27433:31;27483:4;27480:1;27473:15;27507:4;27504:1;27497:15;27523:131;-1:-1:-1;;;;;27598:31:1;;27588:42;;27578:70;;27644:1;27641;27634:12;27578:70;27523:131;:::o;27659:118::-;27745:5;27738:13;27731:21;27724:5;27721:32;27711:60;;27767:1;27764;27757:12;27782:114;27866:4;27859:5;27855:16;27848:5;27845:27;27835:55;;27886:1;27883;27876:12
Swarm Source
ipfs://a559d0fca38729545ba31bd919215bdbe29a0329b28d9a3feeef3fc69f8a8df8
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.