Source Code
Latest 25 from a total of 9,257 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Exact Nativ... | 13160079 | 86 days ago | IN | 1 GLMR | 0.01367175 | ||||
| Swap Exact Token... | 10480582 | 283 days ago | IN | 0 GLMR | 0.01290755 | ||||
| Swap Exact Token... | 6002465 | 641 days ago | IN | 0 GLMR | 0.0281056 | ||||
| Swap Exact Token... | 5957283 | 648 days ago | IN | 0 GLMR | 0.0281056 | ||||
| Swap Exact Token... | 5929577 | 652 days ago | IN | 0 GLMR | 0.0281056 | ||||
| Swap Exact Nativ... | 5929087 | 652 days ago | IN | 161.04 GLMR | 0.0277053 | ||||
| Swap Exact Nativ... | 5927573 | 652 days ago | IN | 167.72 GLMR | 0.0277053 | ||||
| Swap Exact Nativ... | 5927566 | 652 days ago | IN | 165.74 GLMR | 0.03651097 | ||||
| Swap Exact Nativ... | 5927561 | 652 days ago | IN | 162.25 GLMR | 0.0277053 | ||||
| Swap Exact Token... | 5913377 | 654 days ago | IN | 0 GLMR | 0.03691128 | ||||
| Swap Exact Token... | 5913374 | 654 days ago | IN | 0 GLMR | 0.0281056 | ||||
| Swap Exact Token... | 5913370 | 654 days ago | IN | 0 GLMR | 0.03691128 | ||||
| Swap Exact Token... | 5913367 | 654 days ago | IN | 0 GLMR | 0.0281056 | ||||
| Swap Exact Token... | 5913363 | 654 days ago | IN | 0 GLMR | 0.03691128 | ||||
| Swap Exact Token... | 5905602 | 655 days ago | IN | 0 GLMR | 0.02881813 | ||||
| Swap Exact Nativ... | 5900268 | 656 days ago | IN | 55.78 GLMR | 0.03651097 | ||||
| Swap Exact Nativ... | 5900258 | 656 days ago | IN | 55.43 GLMR | 0.0277053 | ||||
| Swap Exact Nativ... | 5900251 | 656 days ago | IN | 55.46 GLMR | 0.03651097 | ||||
| Swap Exact Nativ... | 5898174 | 656 days ago | IN | 78.7 GLMR | 0.03317642 | ||||
| Swap Exact Nativ... | 5898167 | 656 days ago | IN | 82.53 GLMR | 0.04365218 | ||||
| Swap Exact Nativ... | 5898160 | 656 days ago | IN | 83.05 GLMR | 0.03315701 | ||||
| Swap Exact Nativ... | 5898157 | 656 days ago | IN | 55.41 GLMR | 0.04362891 | ||||
| Swap Exact Token... | 5894856 | 657 days ago | IN | 0 GLMR | 0.03366474 | ||||
| Swap Exact Token... | 5876953 | 659 days ago | IN | 0 GLMR | 0.03361259 | ||||
| Swap Exact Token... | 5873263 | 660 days ago | IN | 0 GLMR | 0.04450725 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 13160079 | 86 days ago | 1 GLMR | ||||
| 6002465 | 641 days ago | 32.2520513 GLMR | ||||
| 6002465 | 641 days ago | 32.2520513 GLMR | ||||
| 5957283 | 648 days ago | 211.03224409 GLMR | ||||
| 5957283 | 648 days ago | 211.03224409 GLMR | ||||
| 5929577 | 652 days ago | 187.04910535 GLMR | ||||
| 5929577 | 652 days ago | 187.04910535 GLMR | ||||
| 5929087 | 652 days ago | 161.04 GLMR | ||||
| 5927573 | 652 days ago | 167.72 GLMR | ||||
| 5927566 | 652 days ago | 165.74 GLMR | ||||
| 5927561 | 652 days ago | 162.25 GLMR | ||||
| 5913377 | 654 days ago | 112.71656446 GLMR | ||||
| 5913377 | 654 days ago | 112.71656446 GLMR | ||||
| 5913374 | 654 days ago | 113.24550364 GLMR | ||||
| 5913374 | 654 days ago | 113.24550364 GLMR | ||||
| 5913370 | 654 days ago | 113.69321694 GLMR | ||||
| 5913370 | 654 days ago | 113.69321694 GLMR | ||||
| 5913367 | 654 days ago | 114.24229965 GLMR | ||||
| 5913367 | 654 days ago | 114.24229965 GLMR | ||||
| 5913363 | 654 days ago | 114.70563293 GLMR | ||||
| 5913363 | 654 days ago | 114.70563293 GLMR | ||||
| 5905602 | 655 days ago | 852.61186179 GLMR | ||||
| 5905602 | 655 days ago | 852.61186179 GLMR | ||||
| 5900268 | 656 days ago | 55.78 GLMR | ||||
| 5900258 | 656 days ago | 55.43 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SwapRouterV1
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-08-01
*/
// File: contracts/core/interfaces/IFactory.sol
pragma solidity >=0.8.0;
interface IFactory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
event PairCreateLocked(
address indexed caller
);
event PairCreateUnlocked(
address indexed caller
);
event BootstrapSetted(
address indexed tokenA,
address indexed tokenB,
address indexed bootstrap
);
event FeetoUpdated(
address indexed feeto
);
event FeeBasePointUpdated(
uint8 basePoint
);
function feeto() external view returns (address);
function feeBasePoint() external view returns (uint8);
function lockForPairCreate() external view returns (bool);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
function getBootstrap(address tokenA, address tokenB)
external
view
returns (address bootstrap);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function createPair(address tokenA, address tokenB)
external
returns (address pair);
}
// File: contracts/core/interfaces/IPair.sol
pragma solidity >=0.8.0;
interface IPair {
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function burn(address to)
external
returns (uint256 amount0, uint256 amount1);
function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// File: contracts/libraries/Math.sol
pragma solidity >=0.8.0;
// a library for performing various math operations
library Math {
function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = x < y ? x : y;
}
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint256 y) internal pure returns (uint256 z) {
if (y > 3) {
z = y;
uint256 x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
}
// File: contracts/libraries/Helper.sol
pragma solidity >=0.8.0;
library Helper {
using Math for uint256;
function sortTokens(address tokenA, address tokenB)
internal
pure
returns (address token0, address token1)
{
require(tokenA != tokenB, "Helper: IDENTICAL_ADDRESSES");
(token0, token1) = tokenA < tokenB
? (tokenA, tokenB)
: (tokenB, tokenA);
require(token0 != address(0), "Helper: ZERO_ADDRESS");
}
function pairFor(
address factory,
address tokenA,
address tokenB
) internal view returns (address pair) {
return IFactory(factory).getPair(tokenA, tokenB);
}
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) internal pure returns (uint256 amountB) {
require(amountA > 0, "INSUFFICIENT_AMOUNT");
require(reserveA > 0 && reserveB > 0, "INSUFFICIENT_LIQUIDITY");
amountB = amountA.mul(reserveB) / reserveA;
}
function getReserves(
address factory,
address tokenA,
address tokenB
) internal view returns (uint256 reserveA, uint256 reserveB) {
(address token0, ) = sortTokens(tokenA, tokenB);
(uint256 reserve0, uint256 reserve1, ) = IPair(
pairFor(factory, tokenA, tokenB)
).getReserves();
(reserveA, reserveB) = tokenA == token0
? (reserve0, reserve1)
: (reserve1, reserve0);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0x23b872dd, from, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::transferFrom: transferFrom failed"
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0xa9059cbb, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::safeTransfer: transfer failed"
);
}
function safeTransferNativeCurrency(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(
success,
"TransferHelper::safeTransferNativeCurrency: NativeCurrency transfer failed"
);
}
// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) internal pure returns (uint256 amountOut) {
require(amountIn > 0, "Helper: INSUFFICIENT_INPUT_AMOUNT");
require(
reserveIn > 0 && reserveOut > 0,
"Helper: INSUFFICIENT_LIQUIDITY"
);
uint256 amountInWithFee = amountIn.mul(997);
uint256 numerator = amountInWithFee.mul(reserveOut);
uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);
amountOut = numerator / denominator;
}
// given an output amount of an asset and pair reserves, returns a required input amount of the other asset
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) internal pure returns (uint256 amountIn) {
require(amountOut > 0, "Helper: INSUFFICIENT_OUTPUT_AMOUNT");
require(
reserveIn > 0 && reserveOut > 0,
"Helper: INSUFFICIENT_LIQUIDITY"
);
uint256 numerator = reserveIn.mul(amountOut).mul(1000);
uint256 denominator = reserveOut.sub(amountOut).mul(997);
amountIn = (numerator / denominator).add(1);
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(
address factory,
uint256 amountIn,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "Helper: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[0] = amountIn;
for (uint256 i; i < path.length - 1; i++) {
(uint256 reserveIn, uint256 reserveOut) = getReserves(
factory,
path[i],
path[i + 1]
);
amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
}
}
function getAmountsIn(
address factory,
uint256 amountOut,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "Helper: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint256 i = path.length - 1; i > 0; i--) {
(uint256 reserveIn, uint256 reserveOut) = getReserves(
factory,
path[i - 1],
path[i]
);
amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
}
}
}
// File: contracts/periphery/interfaces/IWNativeCurrency.sol
pragma solidity >=0.8.0;
interface IWNativeCurrency {
function deposit() external payable;
function withdraw(uint256) external;
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.7.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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
// 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/ISwapRouterV1.sol
pragma solidity >=0.8.0;
interface ISwapRouterV1 {
struct Route {
bool stable;
bytes callData;
}
function factory() external view returns (address);
function WNativeCurrency() external view returns (address);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactNativeCurrencyForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactNativeCurrency(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForNativeCurrency(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapNativeCurrencyForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapPool(
IStableSwap pool,
uint8 fromIndex,
uint8 toIndex,
uint256 inAmount,
uint256 minOutAmount,
address to,
uint256 deadline
) external returns (uint256 amountOut);
function swapPoolFromBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
address to,
uint256 deadline
) external returns (uint256 amountOut);
function swapPoolToBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
address to,
uint256 deadline
) external returns (uint256 amountOut);
function swapExactTokensForTokensThroughStablePool(
uint256 amountIn,
uint256 amountOutMin,
Route[] calldata routes,
address to,
uint256 deadline
) external returns (uint256 amountOut);
function swapExactNativeCurrencyForTokensThroughStablePool(
uint256 amountOutMin,
Route[] calldata routes,
address to,
uint256 deadline
) external payable returns (uint256 amountOut);
function swapExactTokensForNativeCurrencyThroughStablePool(
uint256 amountIn,
uint256 amountOutMin,
Route[] calldata routes,
address to,
uint256 deadline
) external returns (uint256 amountOut);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
function getAmountsOut(
uint256 amountIn,
address[] memory path
) external view returns (uint256[] memory amounts);
function getAmountsIn(
uint256 amountOut,
address[] memory path
) external view returns (uint256[] memory amounts);
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: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v4.7.0) (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));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @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/periphery/SwapRouterV1.sol
pragma solidity >=0.8.0;
contract SwapRouterV1 is ISwapRouterV1 {
using SafeERC20 for IERC20;
using Math for uint256;
struct StablePath {
IStableSwap pool;
IStableSwap basePool;
address fromToken;
address toToken;
bool fromBase;
}
address public override factory;
address public override WNativeCurrency;
constructor(address _factory, address _WNativeCurrency) {
factory = _factory;
WNativeCurrency = _WNativeCurrency;
}
modifier ensure(uint256 deadline) {
require(deadline >= block.timestamp, "SwapRouterV1: EXPIRED");
_;
}
receive() external payable {
require(msg.sender == WNativeCurrency);
}
function _swap(
uint256[] memory amounts,
address[] memory path,
address _to
) private {
for (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = Helper.sortTokens(input, output);
uint256 amountOut = amounts[i + 1];
(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOut)
: (amountOut, uint256(0));
address to = i < path.length - 2
? Helper.pairFor(factory, output, path[i + 2])
: _to;
IPair(Helper.pairFor(factory, input, output)).swap(
amount0Out,
amount1Out,
to,
new bytes(0)
);
}
}
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256[] memory amounts) {
amounts = Helper.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
);
Helper.safeTransferFrom(
path[0],
msg.sender,
Helper.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256[] memory amounts) {
amounts = Helper.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= amountInMax, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT");
Helper.safeTransferFrom(
path[0],
msg.sender,
Helper.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapExactNativeCurrencyForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external override payable ensure(deadline) returns (uint256[] memory amounts) {
require(path[0] == WNativeCurrency, "SwapRouterV1: INVALID_PATH");
amounts = Helper.getAmountsOut(factory, msg.value, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
);
IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
require(
IERC20(WNativeCurrency).transfer(
Helper.pairFor(factory, path[0], path[1]),
amounts[0]
)
);
_swap(amounts, path, to);
}
function swapTokensForExactNativeCurrency(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256[] memory amounts) {
require(
path[path.length - 1] == WNativeCurrency,
"SwapRouterV1: INVALID_PATH"
);
amounts = Helper.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= amountInMax, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT");
Helper.safeTransferFrom(
path[0],
msg.sender,
Helper.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
}
function swapExactTokensForNativeCurrency(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256[] memory amounts) {
require(
path[path.length - 1] == WNativeCurrency,
"SwapRouterV1: INVALID_PATH"
);
amounts = Helper.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
);
Helper.safeTransferFrom(
path[0],
msg.sender,
Helper.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
}
function swapNativeCurrencyForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external override payable ensure(deadline) returns (uint256[] memory amounts) {
require(path[0] == WNativeCurrency, "SwapRouterV1: INVALID_PATH");
amounts = Helper.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= msg.value, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT");
IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
require(
IERC20(WNativeCurrency).transfer(
Helper.pairFor(factory, path[0], path[1]),
amounts[0]
)
);
_swap(amounts, path, to);
if (msg.value > amounts[0]) {
Helper.safeTransferNativeCurrency(
msg.sender,
msg.value - amounts[0]
);
}
}
function _swapPool(
IStableSwap pool,
uint8 fromIndex,
uint8 toIndex,
uint256 inAmount,
uint256 minOutAmount,
uint256 deadline
) private returns (uint256 amountOut) {
IERC20 coin = pool.getToken(fromIndex);
coin.safeIncreaseAllowance(address(pool), inAmount);
amountOut = pool.swap(fromIndex, toIndex, inAmount, minOutAmount, deadline);
}
function _swapPoolFromBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
uint256 deadline
) private returns (uint256 amountOut) {
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.safeIncreaseAllowance(address(basePool), dx);
uint256 baseLpAmount = basePool.addLiquidity(base_amounts, 0, deadline);
if (baseTokenIndex != tokenIndexTo) {
amountOut = _swapPool(pool, baseTokenIndex, tokenIndexTo, baseLpAmount, minDy, deadline);
} else {
amountOut = baseLpAmount;
}
}
function _swapPoolToBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
uint256 deadline
) private returns (uint256 amountOut) {
IERC20 baseToken = basePool.getLpToken();
uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
uint256 tokenLPAmount = dx;
if (baseTokenIndex != tokenIndexFrom) {
tokenLPAmount = _swapPool(pool, tokenIndexFrom, baseTokenIndex, dx, 0, deadline);
}
baseToken.safeIncreaseAllowance(address(basePool), tokenLPAmount);
amountOut = basePool.removeLiquidityOneToken(tokenLPAmount, tokenIndexTo, minDy, deadline);
}
function swapPool(
IStableSwap pool,
uint8 fromIndex,
uint8 toIndex,
uint256 inAmount,
uint256 minOutAmount,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256 amountOut) {
IERC20 coin = pool.getToken(fromIndex);
coin.safeTransferFrom(msg.sender, address(this), inAmount);
amountOut = _swapPool(pool, fromIndex, toIndex, inAmount, minOutAmount, deadline);
IERC20 coinTo = pool.getToken(toIndex);
coinTo.safeTransfer(to, amountOut);
}
function swapPoolFromBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256 amountOut) {
IERC20 coin = basePool.getToken(tokenIndexFrom);
coin.safeTransferFrom(msg.sender, address(this), dx);
amountOut = _swapPoolFromBase(pool, basePool, tokenIndexFrom, tokenIndexTo, dx, minDy, deadline);
IERC20 coinTo = pool.getToken(tokenIndexTo);
coinTo.safeTransfer(to, amountOut);
}
function swapPoolToBase(
IStableSwap pool,
IStableSwap basePool,
uint8 tokenIndexFrom,
uint8 tokenIndexTo,
uint256 dx,
uint256 minDy,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256 amountOut) {
IERC20 coin = pool.getToken(tokenIndexFrom);
coin.safeTransferFrom(msg.sender, address(this), dx);
amountOut = _swapPoolToBase(pool, basePool, tokenIndexFrom, tokenIndexTo, dx, minDy, deadline);
IERC20 coinTo = basePool.getToken(tokenIndexTo);
coinTo.safeTransfer(to, amountOut);
}
function _anyStableSwap(
uint256 amountIn,
Route calldata route,
uint256 deadline
) private returns (address tokenOut, uint256 amountOut) {
StablePath memory path = _decodeStableSwapCallData(route.callData);
tokenOut = path.toToken;
if (address(path.basePool) == address(0)) {
amountOut = _swapPool(
path.pool,
path.pool.getTokenIndex(path.fromToken),
path.pool.getTokenIndex(path.toToken),
amountIn,
0,
deadline
);
} else if (path.fromBase) {
amountOut = _swapPoolFromBase(
path.pool,
path.basePool,
path.basePool.getTokenIndex(path.fromToken),
path.pool.getTokenIndex(path.toToken),
amountIn,
0,
deadline
);
} else {
amountOut = _swapPoolToBase(
path.pool,
path.basePool,
path.pool.getTokenIndex(path.fromToken),
path.basePool.getTokenIndex(path.toToken),
amountIn,
0,
deadline
);
}
}
function _swapThroughStablePool(
address tokenIn,
uint256 amountIn,
Route[] calldata routes,
uint256 deadline
) private returns (address tokenOut, uint256 amountOut) {
tokenOut = tokenIn;
amountOut = amountIn;
for (uint256 i = 0; i < routes.length; i++) {
if (routes[i].stable) {
(tokenOut, amountOut) = _anyStableSwap(amountOut, routes[i], deadline);
} else {
address[] memory path = _decodeAmmCalldata(routes[i].callData);
tokenOut = path[path.length - 1];
uint256[] memory amounts = Helper.getAmountsOut(factory, amountOut, path);
Helper.safeTransfer(
path[0],
Helper.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
amountOut = amounts[amounts.length - 1];
}
}
}
function swapExactTokensForTokensThroughStablePool(
uint256 amountIn,
uint256 amountOutMin,
Route[] calldata routes,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256 amountOut) {
address tokenIn;
if (routes[0].stable) {
tokenIn = _decodeStableSwapCallData(routes[0].callData).fromToken;
} else {
tokenIn = _decodeAmmCalldata(routes[0].callData)[0];
}
Helper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
address tokenOut;
(tokenOut, amountOut) = _swapThroughStablePool(tokenIn, amountIn, routes, deadline);
require(
amountOut >= amountOutMin,
"SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
);
IERC20(tokenOut).safeTransfer(to, amountOut);
}
function swapExactNativeCurrencyForTokensThroughStablePool(
uint256 amountOutMin,
Route[] calldata routes,
address to,
uint256 deadline
) external override payable ensure(deadline) returns (uint256 amountOut) {
require(!routes[0].stable, "SwapRouterV1: INVALID_ROUTES");
address tokenIn = _decodeAmmCalldata(routes[0].callData)[0];
require(tokenIn == WNativeCurrency, "SwapRouterV1: INVALID_ROUTES");
IWNativeCurrency(WNativeCurrency).deposit{value: msg.value}();
address tokenOut;
(tokenOut, amountOut) = _swapThroughStablePool(tokenIn, msg.value, routes, deadline);
require(
amountOut >= amountOutMin,
"SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
);
IERC20(tokenOut).safeTransfer(to, amountOut);
}
function swapExactTokensForNativeCurrencyThroughStablePool(
uint256 amountIn,
uint256 amountOutMin,
Route[] calldata routes,
address to,
uint256 deadline
) external override ensure(deadline) returns (uint256 amountOut) {
require(!routes[routes.length - 1].stable, "SwapRouterV1: INVALID_ROUTES");
address[] memory tokenOutPath = _decodeAmmCalldata(routes[routes.length - 1].callData);
require(tokenOutPath[tokenOutPath.length - 1] == WNativeCurrency, "SwapRouterV1: INVALID_ROUTES");
address tokenIn;
if (routes[0].stable) {
tokenIn = _decodeStableSwapCallData(routes[0].callData).fromToken;
} else {
tokenIn = _decodeAmmCalldata(routes[0].callData)[0];
}
Helper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
address tokenOut;
(tokenOut, amountOut) = _swapThroughStablePool(tokenIn, amountIn, routes, deadline);
require(
amountOut >= amountOutMin,
"SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
);
IWNativeCurrency(WNativeCurrency).withdraw(amountOut);
Helper.safeTransferNativeCurrency(to, amountOut);
}
function _decodeAmmCalldata(bytes memory data) private pure returns (address[] memory path) {
path = abi.decode(data, (address[]));
}
function _decodeStableSwapCallData(bytes memory data)
private
pure
returns (StablePath memory path)
{
(
IStableSwap pool,
IStableSwap basePool,
address fromToken,
address toToken,
bool fromBase
) = abi.decode(data, (IStableSwap, IStableSwap, address, address, bool));
return StablePath(pool, basePool, fromToken, toToken, fromBase);
}
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external override pure returns (uint256 amountOut) {
return Helper.getAmountOut(amountIn, reserveIn, reserveOut);
}
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external override pure returns (uint256 amountIn) {
return Helper.getAmountOut(amountOut, reserveIn, reserveOut);
}
function getAmountsOut(uint256 amountIn, address[] memory path)
external
override
view
returns (uint256[] memory amounts)
{
return Helper.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(uint256 amountOut, address[] memory path)
external
override
view
returns (uint256[] memory amounts)
{
return Helper.getAmountsIn(factory, amountOut, path);
}
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);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WNativeCurrency","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WNativeCurrency","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactNativeCurrencyForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactNativeCurrencyForTokensThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForNativeCurrency","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForNativeCurrencyThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapNativeCurrencyForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","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":"amountOut","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":"amountOut","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":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactNativeCurrency","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200467638038062004676833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b6145ab80620000cb6000396000f3fe60806040526004361061012e5760003560e01c80638803dbee116100ab578063c45a01551161006f578063c45a01551461032f578063cd1bd0d91461034f578063d06ca61f14610362578063d74fff4e14610382578063dcff1b94146103a2578063f85b7c8b146103c257600080fd5b80638803dbee1461029c5780638a311c57146102bc5780639be7614d146102dc5780639d9270a8146102ef578063b56527bd1461030f57600080fd5b8063419591ed116100f2578063419591ed146102115780634b1d08ca146102495780636dc9c4981461025c578063798af7201461027c57806385f8c2591461015157600080fd5b8063054d50d4146101515780631f00ca74146101845780633214b8c9146101b1578063357b32f0146101d157806338ed1739146101f157600080fd5b3661014c576001546001600160a01b0316331461014a57600080fd5b005b600080fd5b34801561015d57600080fd5b5061017161016c3660046140ed565b6103e2565b6040519081526020015b60405180910390f35b34801561019057600080fd5b506101a461019f366004613fcd565b6103f9565b60405161017b91906141b9565b3480156101bd57600080fd5b506101716101cc366004613d3f565b61041c565b3480156101dd57600080fd5b506101716101ec366004613e82565b61063b565b3480156101fd57600080fd5b506101a461020c36600461407a565b6107ab565b34801561021d57600080fd5b50600154610231906001600160a01b031681565b6040516001600160a01b03909116815260200161017b565b610171610257366004613f66565b61095c565b34801561026857600080fd5b5061017161027736600461407a565b610b4a565b34801561028857600080fd5b50610171610297366004613e31565b610de0565b3480156102a857600080fd5b506101a46102b736600461407a565b610e6c565b3480156102c857600080fd5b506101716102d7366004613d3f565b610f15565b6101a46102ea366004613f66565b611216565b3480156102fb57600080fd5b5061017161030a36600461407a565b611526565b34801561031b57600080fd5b5061017161032a366004613da3565b611637565b34801561033b57600080fd5b50600054610231906001600160a01b031681565b6101a461035d366004613f66565b6117a1565b34801561036e57600080fd5b506101a461037d366004613fcd565b611a3a565b34801561038e57600080fd5b5061017161039d366004613da3565b611a54565b3480156103ae57600080fd5b506101a46103bd36600461407a565b611b4d565b3480156103ce57600080fd5b506101a46103dd36600461407a565b611d78565b60006103ef848484611e87565b90505b9392505050565b600054606090610413906001600160a01b03168484611f8b565b90505b92915050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104909190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b1580156104d757600080fd5b505afa1580156104eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050f9190614119565b90508360ff808316908816146105ab5760405163a95b089f60e01b815260ff808916600483015283166024820152604481018690526001600160a01b038a169063a95b089f9060640160206040518083038186803b15801561057057600080fd5b505afa158015610584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a89190613f4d565b90505b60405163342a87a160e01b81526004810182905260ff871660248201526001600160a01b0389169063342a87a19060440160206040518083038186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062c9190613f4d565b93505050505b95945050505050565b600081428110156106675760405162461bcd60e51b815260040161065e906142a7565b60405180910390fd5b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b1580156106ab57600080fd5b505afa1580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190613bcd565b90506106fa6001600160a01b03821633308a612118565b6107088a8a8a8a8a89612189565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240160206040518083038186803b15801561074f57600080fd5b505afa158015610763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107879190613bcd565b905061079d6001600160a01b03821687866122c2565b505050979650505050505050565b606081428110156107ce5760405162461bcd60e51b815260040161065e906142a7565b6000546040805160208089028281018201909352888252610818936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b915086826001845161082a9190614489565b8151811061083a5761083a614514565b602002602001015110156108605760405162461bcd60e51b815260040161065e9061425f565b6109128686600081811061087657610876614514565b905060200201602081019061088b9190613bb0565b6000805433916108f2916001600160a01b0316908b908b90816108b0576108b0614514565b90506020020160208101906108c59190613bb0565b8b8b60018181106108d8576108d8614514565b90506020020160208101906108ed9190613bb0565b612464565b8560008151811061090557610905614514565b60200260200101516124e9565b61095182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b509695505050505050565b6000814281101561097f5760405162461bcd60e51b815260040161065e906142a7565b8585600081811061099257610992614514565b90506020028101906109a491906143c5565b6109b2906020810190613c90565b156109cf5760405162461bcd60e51b815260040161065e906142d6565b6000610a41878760008181106109e7576109e7614514565b90506020028101906109f991906143c5565b610a0790602081019061437e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061280292505050565b600081518110610a5357610a53614514565b60209081029190910101516001549091506001600160a01b03808316911614610a8e5760405162461bcd60e51b815260040161065e906142d6565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b50505050506000610b0682348a8a89612818565b9450905088841015610b2a5760405162461bcd60e51b815260040161065e9061425f565b610b3e6001600160a01b03821687866122c2565b50505095945050505050565b60008142811015610b6d5760405162461bcd60e51b815260040161065e906142a7565b8585610b7a600182614489565b818110610b8957610b89614514565b9050602002810190610b9b91906143c5565b610ba9906020810190613c90565b15610bc65760405162461bcd60e51b815260040161065e906142d6565b6000610be78787610bd8600182614489565b8181106109e7576109e7614514565b6001805482519293506001600160a01b0316918391610c0591614489565b81518110610c1557610c15614514565b60200260200101516001600160a01b031614610c435760405162461bcd60e51b815260040161065e906142d6565b600087876000818110610c5857610c58614514565b9050602002810190610c6a91906143c5565b610c78906020810190613c90565b15610cf857610ced88886000818110610c9357610c93614514565b9050602002810190610ca591906143c5565b610cb390602081019061437e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129cf92505050565b604001519050610d2b565b610d0e888860008181106109e7576109e7614514565b600081518110610d2057610d20614514565b602002602001015190505b610d378133308d6124e9565b6000610d46828c8b8b8a612818565b9550905089851015610d6a5760405162461bcd60e51b815260040161065e9061425f565b600154604051632e1a7d4d60e01b8152600481018790526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b50505050610dd28786612a5a565b505050509695505050505050565b60405163a95b089f60e01b815260ff808516600483015283166024820152604481018290526000906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610e3457600080fd5b505afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190613f4d565b60608142811015610e8f5760405162461bcd60e51b815260040161065e906142a7565b6000546040805160208089028281018201909352888252610ed9936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110610eef57610eef614514565b602002602001015111156108605760405162461bcd60e51b815260040161065e9061430d565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5157600080fd5b505afa158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110089190614119565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561104557600080fd5b505afa158015611059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107d9190613f4d565b67ffffffffffffffff8111156110955761109561452a565b6040519080825280602002602001820160405280156110be578160200160208202803683370190505b50905084818860ff16815181106110d7576110d7614514565b6020908102919091010152604051637355940360e11b81526000906001600160a01b038a169063e6ab2806906111149085906001906004016141cc565b60206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190613f4d565b90508660ff168360ff16141561117f57935061063292505050565b60405163a95b089f60e01b815260ff808516600483015288166024820152604481018290526001600160a01b038b169063a95b089f9060640160206040518083038186803b1580156111d057600080fd5b505afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190613f4d565b9a9950505050505050505050565b606081428110156112395760405162461bcd60e51b815260040161065e906142a7565b6001546001600160a01b0316868660008161125657611256614514565b905060200201602081019061126b9190613bb0565b6001600160a01b0316146112915760405162461bcd60e51b815260040161065e90614228565b60005460408051602080890282810182019093528882526112db936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611f8b92505050565b915034826000815181106112f1576112f1614514565b602002602001015111156113175760405162461bcd60e51b815260040161065e9061430d565b60015482516001600160a01b039091169063d0e30db090849060009061133f5761133f614514565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561137257600080fd5b505af1158015611386573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506113e59350909116908a908a90816113bd576113bd614514565b90506020020160208101906113d29190613bb0565b8a8a60018181106108d8576108d8614514565b846000815181106113f8576113f8614514565b60200260200101516040518363ffffffff1660e01b81526004016114319291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114839190613cad565b61148c57600080fd5b6114cb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b816000815181106114de576114de614514565b602002602001015134111561151c5761151c338360008151811061150457611504614514565b6020026020010151346115179190614489565b612a5a565b5095945050505050565b600081428110156115495760405162461bcd60e51b815260040161065e906142a7565b60008686600081811061155e5761155e614514565b905060200281019061157091906143c5565b61157e906020810190613c90565b156115a45761159987876000818110610c9357610c93614514565b6040015190506115d7565b6115ba878760008181106109e7576109e7614514565b6000815181106115cc576115cc614514565b602002602001015190505b6115e38133308c6124e9565b60006115f2828b8a8a89612818565b94509050888410156116165760405162461bcd60e51b815260040161065e9061425f565b61162a6001600160a01b03821687866122c2565b5050509695505050505050565b6000814281101561165a5760405162461bcd60e51b815260040161065e906142a7565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190613bcd565b90506116ed6001600160a01b03821633308a612118565b6116fc8b8b8b8b8b8b8a612b50565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038d16906382b86600906024015b60206040518083038186803b15801561174457600080fd5b505afa158015611758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177c9190613bcd565b90506117926001600160a01b03821687866122c2565b50505098975050505050505050565b606081428110156117c45760405162461bcd60e51b815260040161065e906142a7565b6001546001600160a01b031686866000816117e1576117e1614514565b90506020020160208101906117f69190613bb0565b6001600160a01b03161461181c5760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611866936001600160a01b0316923492918b918b918291908501908490808284376000920191909152506122f792505050565b91508682600184516118789190614489565b8151811061188857611888614514565b602002602001015110156118ae5760405162461bcd60e51b815260040161065e9061425f565b60015482516001600160a01b039091169063d0e30db09084906000906118d6576118d6614514565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506119549350909116908a908a90816113bd576113bd614514565b8460008151811061196757611967614514565b60200260200101516040518363ffffffff1660e01b81526004016119a09291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f29190613cad565b6119fb57600080fd5b61151c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b600054606090610413906001600160a01b031684846122f7565b60008142811015611a775760405162461bcd60e51b815260040161065e906142a7565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015611abb57600080fd5b505afa158015611acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af39190613bcd565b9050611b0a6001600160a01b03821633308a612118565b611b198b8b8b8b8b8b8a612e6c565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240161172c565b60608142811015611b705760405162461bcd60e51b815260040161065e906142a7565b600180546001600160a01b03169087908790611b8c9082614489565b818110611b9b57611b9b614514565b9050602002016020810190611bb09190613bb0565b6001600160a01b031614611bd65760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611c20936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b9150868260018451611c329190614489565b81518110611c4257611c42614514565b60200260200101511015611c685760405162461bcd60e51b815260040161065e9061425f565b611c7e8686600081811061087657610876614514565b611cbd82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612627915050565b6001805483516001600160a01b0390911691632e1a7d4d918591611ce091614489565b81518110611cf057611cf0614514565b60200260200101516040518263ffffffff1660e01b8152600401611d1691815260200190565b600060405180830381600087803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505050610951848360018551611d5b9190614489565b81518110611d6b57611d6b614514565b6020026020010151612a5a565b60608142811015611d9b5760405162461bcd60e51b815260040161065e906142a7565b600180546001600160a01b03169087908790611db79082614489565b818110611dc657611dc6614514565b9050602002016020810190611ddb9190613bb0565b6001600160a01b031614611e015760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611e4b936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110611e6157611e61614514565b60200260200101511115611c685760405162461bcd60e51b815260040161065e9061430d565b6000808411611ee25760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b606482015260840161065e565b600083118015611ef25750600082115b611f3e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b6000611f4c856103e5613035565b90506000611f5a8285613035565b90506000611f7483611f6e886103e8613035565b9061309c565b9050611f808183614448565b979650505050505050565b6060600282511015611fd65760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff811115611ff057611ff061452a565b604051908082528060200260200182016040528015612019578160200160208202803683370190505b50905082816001835161202c9190614489565b8151811061203c5761203c614514565b6020026020010181815250506000600183516120589190614489565b90505b8015612110576000806120ab8786612074600187614489565b8151811061208457612084614514565b602002602001015187868151811061209e5761209e614514565b60200260200101516130f1565b915091506120d38484815181106120c4576120c4614514565b602002602001015183836131ca565b846120df600186614489565b815181106120ef576120ef614514565b60200260200101818152505050508080612108906144cc565b91505061205b565b509392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121839085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526132c9565b50505050565b60405162415c3360e91b815260ff8616600482015260009081906001600160a01b038916906382b866009060240160206040518083038186803b1580156121cf57600080fd5b505afa1580156121e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122079190613bcd565b905061221d6001600160a01b038216898761339b565b6040516348b4aac360e11b815260ff8089166004830152871660248201526044810186905260648101859052608481018490526001600160a01b0389169063916955869060a401602060405180830381600087803b15801561227e57600080fd5b505af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190613f4d565b98975050505050505050565b6040516001600160a01b0383166024820152604481018290526122f290849063a9059cbb60e01b9060640161214c565b505050565b60606002825110156123425760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff81111561235c5761235c61452a565b604051908082528060200260200182016040528015612385578160200160208202803683370190505b509050828160008151811061239c5761239c614514565b60200260200101818152505060005b600183516123b99190614489565b811015612110576000806123ff878685815181106123d9576123d9614514565b6020026020010151878660016123ef9190614430565b8151811061209e5761209e614514565b9150915061242784848151811061241857612418614514565b60200260200101518383611e87565b84612433856001614430565b8151811061244357612443614514565b6020026020010181815250505050808061245c906144e3565b9150506123ab565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b1580156124b157600080fd5b505afa1580156124c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190613bcd565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161254d919061419d565b6000604051808303816000865af19150503d806000811461258a576040519150601f19603f3d011682016040523d82523d6000602084013e61258f565b606091505b50915091508180156125b95750805115806125b95750808060200190518101906125b99190613cad565b61261f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b606482015260840161065e565b505050505050565b60005b600183516126389190614489565b8110156121835760008084838151811061265457612654614514565b60200260200101518584600161266a9190614430565b8151811061267a5761267a614514565b6020026020010151915091506000612692838361345c565b5090506000876126a3866001614430565b815181106126b3576126b3614514565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146126e1578260006126e5565b6000835b91509150600060028a516126f99190614489565b8810612705578861273f565b60005461273f906001600160a01b0316878c6127228c6002614430565b8151811061273257612732614514565b6020026020010151612464565b600054909150612759906001600160a01b03168888612464565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612796576020820181803683370190505b506040518563ffffffff1660e01b81526004016127b69493929190614351565b600060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050505050505050505080806127fa906144e3565b91505061262a565b6060818060200190518101906104169190613bea565b848460005b848110156129c45785858281811061283757612837614514565b905060200281019061284991906143c5565b612857906020810190613c90565b156128945761288a8287878481811061287257612872614514565b905060200281019061288491906143c5565b8661353d565b90935091506129b2565b60006128ab8787848181106109e7576109e7614514565b905080600182516128bc9190614489565b815181106128cc576128cc614514565b6020026020010151935060006128f660008054906101000a90046001600160a01b031685846122f7565b905061297b8260008151811061290e5761290e614514565b602002602001015161295b60008054906101000a90046001600160a01b03168560008151811061294057612940614514565b60200260200101518660018151811061273257612732614514565b8360008151811061296e5761296e614514565b60200260200101516138c4565b612986818330612627565b80600182516129959190614489565b815181106129a5576129a5614514565b6020026020010151935050505b806129bc816144e3565b91505061281d565b509550959350505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080600080600086806020019051810190612a169190613cca565b6040805160a0810182526001600160a01b03968716815294861660208601529285169284019290925290921660608201529015156080820152979650505050505050565b604080516000808252602082019092526001600160a01b038416908390604051612a84919061419d565b60006040518083038185875af1925050503d8060008114612ac1576040519150601f19603f3d011682016040523d82523d6000602084013e612ac6565b606091505b50509050806122f25760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a40161065e565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8c57600080fd5b505afa158015612ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc49190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612c0b57600080fd5b505afa158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c439190614119565b90506000896001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8057600080fd5b505afa158015612c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb89190613f4d565b67ffffffffffffffff811115612cd057612cd061452a565b604051908082528060200260200182016040528015612cf9578160200160208202803683370190505b50905086818a60ff1681518110612d1257612d12614514565b602090810291909101015260405162415c3360e91b815260ff8a1660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015612d6157600080fd5b505afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d999190613bcd565b9050612daf6001600160a01b0382168c8a61339b565b604051634d49e87d60e01b81526000906001600160a01b038d1690634d49e87d90612de290869085908c906004016141f0565b602060405180830381600087803b158015612dfc57600080fd5b505af1158015612e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e349190613f4d565b90508960ff168460ff1614612e5857612e518d858c848c8c612189565b9550612e5c565b8095505b5050505050979650505050505050565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612ea857600080fd5b505afa158015612ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee09190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612f2757600080fd5b505afa158015612f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5f9190614119565b90508560ff808316908a1614612f8157612f7e8b8a848a60008a612189565b90505b612f956001600160a01b0384168b8361339b565b6040516301f1d0ab60e51b81526004810182905260ff8916602482015260448101879052606481018690526001600160a01b038b1690633e3a156090608401602060405180830381600087803b158015612fee57600080fd5b505af1158015613002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130269190613f4d565b9b9a5050505050505050505050565b60008115806130595750828261304b818361446a565b92506130579083614448565b145b6104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161065e565b6000826130a98382614430565b91508110156104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161065e565b6000806000613100858561345c565b509050600080613111888888612464565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561314957600080fd5b505afa15801561315d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131819190613efd565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146131b85780826131bb565b81815b90999098509650505050505050565b60008084116132265760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b606482015260840161065e565b6000831180156132365750600082115b6132825760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b600061329a6103e86132948688613035565b90613035565b905060006132ae6103e561329486896139f5565b90506132bf6001611f6e8385614448565b9695505050505050565b600061331e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a4b9092919063ffffffff16565b8051909150156122f2578080602001905181019061333c9190613cad565b6122f25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156133e757600080fd5b505afa1580156133fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341f9190613f4d565b6134299190614430565b6040516001600160a01b03851660248201526044810182905290915061218390859063095ea7b360e01b9060640161214c565b600080826001600160a01b0316846001600160a01b031614156134c15760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f4144445245535345530000000000604482015260640161065e565b826001600160a01b0316846001600160a01b0316106134e15782846134e4565b83835b90925090506001600160a01b0382166135365760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b604482015260640161065e565b9250929050565b60008080613551610cb3602087018761437e565b606081015160208201519094509091506001600160a01b031661368357805160408083015190516319b02f4960e21b81526001600160a01b03918216600482015261367c92918216906366c0bd249060240160206040518083038186803b1580156135bb57600080fd5b505afa1580156135cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f39190614119565b835160608501516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561363b57600080fd5b505afa15801561364f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136739190614119565b89600089612189565b91506138bb565b8060800151156137a1578051602082015160408084015190516319b02f4960e21b81526001600160a01b03918216600482015261367c9392918216906366c0bd249060240160206040518083038186803b1580156136e057600080fd5b505afa1580156136f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137189190614119565b845160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561376057600080fd5b505afa158015613774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137989190614119565b8a60008a612b50565b8051602082015160408084015190516319b02f4960e21b81526001600160a01b0391821660048201526138b89392918316906366c0bd249060240160206040518083038186803b1580156137f457600080fd5b505afa158015613808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382c9190614119565b602085015160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561387757600080fd5b505afa15801561388b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138af9190614119565b8a60008a612e6c565b91505b50935093915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613920919061419d565b6000604051808303816000865af19150503d806000811461395d576040519150601f19603f3d011682016040523d82523d6000602084013e613962565b606091505b509150915081801561398c57508051158061398c57508080602001905181019061398c9190613cad565b6139ee5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161065e565b5050505050565b600082613a028382614489565b91508111156104165760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161065e565b60606103ef8484600085856001600160a01b0385163b613aad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065e565b600080866001600160a01b03168587604051613ac9919061419d565b60006040518083038185875af1925050503d8060008114613b06576040519150601f19603f3d011682016040523d82523d6000602084013e613b0b565b606091505b5091509150611f8082828660608315613b255750816103f2565b825115613b355782518084602001fd5b8160405162461bcd60e51b815260040161065e9190614215565b60008083601f840112613b6157600080fd5b50813567ffffffffffffffff811115613b7957600080fd5b6020830191508360208260051b850101111561353657600080fd5b80516001600160701b0381168114613bab57600080fd5b919050565b600060208284031215613bc257600080fd5b81356103f281614540565b600060208284031215613bdf57600080fd5b81516103f281614540565b60006020808385031215613bfd57600080fd5b825167ffffffffffffffff811115613c1457600080fd5b8301601f81018513613c2557600080fd5b8051613c38613c338261440c565b6143db565b80828252848201915084840188868560051b8701011115613c5857600080fd5b600094505b83851015613c84578051613c7081614540565b835260019490940193918501918501613c5d565b50979650505050505050565b600060208284031215613ca257600080fd5b81356103f281614558565b600060208284031215613cbf57600080fd5b81516103f281614558565b600080600080600060a08688031215613ce257600080fd5b8551613ced81614540565b6020870151909550613cfe81614540565b6040870151909450613d0f81614540565b6060870151909350613d2081614540565b6080870151909250613d3181614558565b809150509295509295909350565b600080600080600060a08688031215613d5757600080fd5b8535613d6281614540565b94506020860135613d7281614540565b93506040860135613d8281614566565b92506060860135613d9281614566565b949793965091946080013592915050565b600080600080600080600080610100898b031215613dc057600080fd5b8835613dcb81614540565b97506020890135613ddb81614540565b96506040890135613deb81614566565b95506060890135613dfb81614566565b94506080890135935060a0890135925060c0890135613e1981614540565b8092505060e089013590509295985092959890939650565b60008060008060808587031215613e4757600080fd5b8435613e5281614540565b93506020850135613e6281614566565b92506040850135613e7281614566565b9396929550929360600135925050565b600080600080600080600060e0888a031215613e9d57600080fd5b8735613ea881614540565b96506020880135613eb881614566565b95506040880135613ec881614566565b9450606088013593506080880135925060a0880135613ee681614540565b8092505060c0880135905092959891949750929550565b600080600060608486031215613f1257600080fd5b613f1b84613b94565b9250613f2960208501613b94565b9150604084015163ffffffff81168114613f4257600080fd5b809150509250925092565b600060208284031215613f5f57600080fd5b5051919050565b600080600080600060808688031215613f7e57600080fd5b85359450602086013567ffffffffffffffff811115613f9c57600080fd5b613fa888828901613b4f565b9095509350506040860135613fbc81614540565b949793965091946060013592915050565b60008060408385031215613fe057600080fd5b8235915060208084013567ffffffffffffffff811115613fff57600080fd5b8401601f8101861361401057600080fd5b803561401e613c338261440c565b80828252848201915084840189868560051b870101111561403e57600080fd5b600094505b8385101561406a57803561405681614540565b835260019490940193918501918501614043565b5080955050505050509250929050565b60008060008060008060a0878903121561409357600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156140b857600080fd5b6140c489828a01613b4f565b90955093505060608701356140d881614540565b80925050608087013590509295509295509295565b60008060006060848603121561410257600080fd5b505081359360208301359350604090920135919050565b60006020828403121561412b57600080fd5b81516103f281614566565b600081518084526020808501945080840160005b838110156141665781518752958201959082019060010161414a565b509495945050505050565b600081518084526141898160208601602086016144a0565b601f01601f19169290920160200192915050565b600082516141af8184602087016144a0565b9190910192915050565b6020815260006104136020830184614136565b6040815260006141df6040830185614136565b905082151560208301529392505050565b6060815260006142036060830186614136565b60208301949094525060400152919050565b6020815260006104136020830184614171565b6020808252601a908201527f53776170526f7574657256313a20494e56414c49445f50415448000000000000604082015260600190565b60208082526028908201527f53776170526f7574657256313a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b60208082526015908201527414ddd85c149bdd5d195c958c4e8811561412549151605a1b604082015260600190565b6020808252601c908201527f53776170526f7574657256313a20494e56414c49445f524f5554455300000000604082015260600190565b60208082526024908201527f53776170526f7574657256313a204558434553534956455f494e5055545f414d60408201526313d5539560e21b606082015260800190565b84815283602082015260018060a01b03831660408201526080606082015260006132bf6080830184614171565b6000808335601e1984360301811261439557600080fd5b83018035915067ffffffffffffffff8211156143b057600080fd5b60200191503681900382131561353657600080fd5b60008235603e198336030181126141af57600080fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156144045761440461452a565b604052919050565b600067ffffffffffffffff8211156144265761442661452a565b5060051b60200190565b60008219821115614443576144436144fe565b500190565b60008261446557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614484576144846144fe565b500290565b60008282101561449b5761449b6144fe565b500390565b60005b838110156144bb5781810151838201526020016144a3565b838111156121835750506000910152565b6000816144db576144db6144fe565b506000190190565b60006000198214156144f7576144f76144fe565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461455557600080fd5b50565b801515811461455557600080fd5b60ff8116811461455557600080fdfea2646970667358221220c1b9b93b5890006555202f0f9817bdfdb929081c6e0bd36a86da4a459b66c44364736f6c63430008070033000000000000000000000000079710316b06bbb2c0ff4befb7d2dac206c716a0000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Deployed Bytecode
0x60806040526004361061012e5760003560e01c80638803dbee116100ab578063c45a01551161006f578063c45a01551461032f578063cd1bd0d91461034f578063d06ca61f14610362578063d74fff4e14610382578063dcff1b94146103a2578063f85b7c8b146103c257600080fd5b80638803dbee1461029c5780638a311c57146102bc5780639be7614d146102dc5780639d9270a8146102ef578063b56527bd1461030f57600080fd5b8063419591ed116100f2578063419591ed146102115780634b1d08ca146102495780636dc9c4981461025c578063798af7201461027c57806385f8c2591461015157600080fd5b8063054d50d4146101515780631f00ca74146101845780633214b8c9146101b1578063357b32f0146101d157806338ed1739146101f157600080fd5b3661014c576001546001600160a01b0316331461014a57600080fd5b005b600080fd5b34801561015d57600080fd5b5061017161016c3660046140ed565b6103e2565b6040519081526020015b60405180910390f35b34801561019057600080fd5b506101a461019f366004613fcd565b6103f9565b60405161017b91906141b9565b3480156101bd57600080fd5b506101716101cc366004613d3f565b61041c565b3480156101dd57600080fd5b506101716101ec366004613e82565b61063b565b3480156101fd57600080fd5b506101a461020c36600461407a565b6107ab565b34801561021d57600080fd5b50600154610231906001600160a01b031681565b6040516001600160a01b03909116815260200161017b565b610171610257366004613f66565b61095c565b34801561026857600080fd5b5061017161027736600461407a565b610b4a565b34801561028857600080fd5b50610171610297366004613e31565b610de0565b3480156102a857600080fd5b506101a46102b736600461407a565b610e6c565b3480156102c857600080fd5b506101716102d7366004613d3f565b610f15565b6101a46102ea366004613f66565b611216565b3480156102fb57600080fd5b5061017161030a36600461407a565b611526565b34801561031b57600080fd5b5061017161032a366004613da3565b611637565b34801561033b57600080fd5b50600054610231906001600160a01b031681565b6101a461035d366004613f66565b6117a1565b34801561036e57600080fd5b506101a461037d366004613fcd565b611a3a565b34801561038e57600080fd5b5061017161039d366004613da3565b611a54565b3480156103ae57600080fd5b506101a46103bd36600461407a565b611b4d565b3480156103ce57600080fd5b506101a46103dd36600461407a565b611d78565b60006103ef848484611e87565b90505b9392505050565b600054606090610413906001600160a01b03168484611f8b565b90505b92915050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104909190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b1580156104d757600080fd5b505afa1580156104eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050f9190614119565b90508360ff808316908816146105ab5760405163a95b089f60e01b815260ff808916600483015283166024820152604481018690526001600160a01b038a169063a95b089f9060640160206040518083038186803b15801561057057600080fd5b505afa158015610584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a89190613f4d565b90505b60405163342a87a160e01b81526004810182905260ff871660248201526001600160a01b0389169063342a87a19060440160206040518083038186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062c9190613f4d565b93505050505b95945050505050565b600081428110156106675760405162461bcd60e51b815260040161065e906142a7565b60405180910390fd5b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b1580156106ab57600080fd5b505afa1580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190613bcd565b90506106fa6001600160a01b03821633308a612118565b6107088a8a8a8a8a89612189565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240160206040518083038186803b15801561074f57600080fd5b505afa158015610763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107879190613bcd565b905061079d6001600160a01b03821687866122c2565b505050979650505050505050565b606081428110156107ce5760405162461bcd60e51b815260040161065e906142a7565b6000546040805160208089028281018201909352888252610818936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b915086826001845161082a9190614489565b8151811061083a5761083a614514565b602002602001015110156108605760405162461bcd60e51b815260040161065e9061425f565b6109128686600081811061087657610876614514565b905060200201602081019061088b9190613bb0565b6000805433916108f2916001600160a01b0316908b908b90816108b0576108b0614514565b90506020020160208101906108c59190613bb0565b8b8b60018181106108d8576108d8614514565b90506020020160208101906108ed9190613bb0565b612464565b8560008151811061090557610905614514565b60200260200101516124e9565b61095182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b509695505050505050565b6000814281101561097f5760405162461bcd60e51b815260040161065e906142a7565b8585600081811061099257610992614514565b90506020028101906109a491906143c5565b6109b2906020810190613c90565b156109cf5760405162461bcd60e51b815260040161065e906142d6565b6000610a41878760008181106109e7576109e7614514565b90506020028101906109f991906143c5565b610a0790602081019061437e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061280292505050565b600081518110610a5357610a53614514565b60209081029190910101516001549091506001600160a01b03808316911614610a8e5760405162461bcd60e51b815260040161065e906142d6565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b50505050506000610b0682348a8a89612818565b9450905088841015610b2a5760405162461bcd60e51b815260040161065e9061425f565b610b3e6001600160a01b03821687866122c2565b50505095945050505050565b60008142811015610b6d5760405162461bcd60e51b815260040161065e906142a7565b8585610b7a600182614489565b818110610b8957610b89614514565b9050602002810190610b9b91906143c5565b610ba9906020810190613c90565b15610bc65760405162461bcd60e51b815260040161065e906142d6565b6000610be78787610bd8600182614489565b8181106109e7576109e7614514565b6001805482519293506001600160a01b0316918391610c0591614489565b81518110610c1557610c15614514565b60200260200101516001600160a01b031614610c435760405162461bcd60e51b815260040161065e906142d6565b600087876000818110610c5857610c58614514565b9050602002810190610c6a91906143c5565b610c78906020810190613c90565b15610cf857610ced88886000818110610c9357610c93614514565b9050602002810190610ca591906143c5565b610cb390602081019061437e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129cf92505050565b604001519050610d2b565b610d0e888860008181106109e7576109e7614514565b600081518110610d2057610d20614514565b602002602001015190505b610d378133308d6124e9565b6000610d46828c8b8b8a612818565b9550905089851015610d6a5760405162461bcd60e51b815260040161065e9061425f565b600154604051632e1a7d4d60e01b8152600481018790526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b50505050610dd28786612a5a565b505050509695505050505050565b60405163a95b089f60e01b815260ff808516600483015283166024820152604481018290526000906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610e3457600080fd5b505afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190613f4d565b60608142811015610e8f5760405162461bcd60e51b815260040161065e906142a7565b6000546040805160208089028281018201909352888252610ed9936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110610eef57610eef614514565b602002602001015111156108605760405162461bcd60e51b815260040161065e9061430d565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5157600080fd5b505afa158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110089190614119565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561104557600080fd5b505afa158015611059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107d9190613f4d565b67ffffffffffffffff8111156110955761109561452a565b6040519080825280602002602001820160405280156110be578160200160208202803683370190505b50905084818860ff16815181106110d7576110d7614514565b6020908102919091010152604051637355940360e11b81526000906001600160a01b038a169063e6ab2806906111149085906001906004016141cc565b60206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190613f4d565b90508660ff168360ff16141561117f57935061063292505050565b60405163a95b089f60e01b815260ff808516600483015288166024820152604481018290526001600160a01b038b169063a95b089f9060640160206040518083038186803b1580156111d057600080fd5b505afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190613f4d565b9a9950505050505050505050565b606081428110156112395760405162461bcd60e51b815260040161065e906142a7565b6001546001600160a01b0316868660008161125657611256614514565b905060200201602081019061126b9190613bb0565b6001600160a01b0316146112915760405162461bcd60e51b815260040161065e90614228565b60005460408051602080890282810182019093528882526112db936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611f8b92505050565b915034826000815181106112f1576112f1614514565b602002602001015111156113175760405162461bcd60e51b815260040161065e9061430d565b60015482516001600160a01b039091169063d0e30db090849060009061133f5761133f614514565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561137257600080fd5b505af1158015611386573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506113e59350909116908a908a90816113bd576113bd614514565b90506020020160208101906113d29190613bb0565b8a8a60018181106108d8576108d8614514565b846000815181106113f8576113f8614514565b60200260200101516040518363ffffffff1660e01b81526004016114319291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114839190613cad565b61148c57600080fd5b6114cb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b816000815181106114de576114de614514565b602002602001015134111561151c5761151c338360008151811061150457611504614514565b6020026020010151346115179190614489565b612a5a565b5095945050505050565b600081428110156115495760405162461bcd60e51b815260040161065e906142a7565b60008686600081811061155e5761155e614514565b905060200281019061157091906143c5565b61157e906020810190613c90565b156115a45761159987876000818110610c9357610c93614514565b6040015190506115d7565b6115ba878760008181106109e7576109e7614514565b6000815181106115cc576115cc614514565b602002602001015190505b6115e38133308c6124e9565b60006115f2828b8a8a89612818565b94509050888410156116165760405162461bcd60e51b815260040161065e9061425f565b61162a6001600160a01b03821687866122c2565b5050509695505050505050565b6000814281101561165a5760405162461bcd60e51b815260040161065e906142a7565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190613bcd565b90506116ed6001600160a01b03821633308a612118565b6116fc8b8b8b8b8b8b8a612b50565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038d16906382b86600906024015b60206040518083038186803b15801561174457600080fd5b505afa158015611758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177c9190613bcd565b90506117926001600160a01b03821687866122c2565b50505098975050505050505050565b606081428110156117c45760405162461bcd60e51b815260040161065e906142a7565b6001546001600160a01b031686866000816117e1576117e1614514565b90506020020160208101906117f69190613bb0565b6001600160a01b03161461181c5760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611866936001600160a01b0316923492918b918b918291908501908490808284376000920191909152506122f792505050565b91508682600184516118789190614489565b8151811061188857611888614514565b602002602001015110156118ae5760405162461bcd60e51b815260040161065e9061425f565b60015482516001600160a01b039091169063d0e30db09084906000906118d6576118d6614514565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506119549350909116908a908a90816113bd576113bd614514565b8460008151811061196757611967614514565b60200260200101516040518363ffffffff1660e01b81526004016119a09291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f29190613cad565b6119fb57600080fd5b61151c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b600054606090610413906001600160a01b031684846122f7565b60008142811015611a775760405162461bcd60e51b815260040161065e906142a7565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015611abb57600080fd5b505afa158015611acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af39190613bcd565b9050611b0a6001600160a01b03821633308a612118565b611b198b8b8b8b8b8b8a612e6c565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240161172c565b60608142811015611b705760405162461bcd60e51b815260040161065e906142a7565b600180546001600160a01b03169087908790611b8c9082614489565b818110611b9b57611b9b614514565b9050602002016020810190611bb09190613bb0565b6001600160a01b031614611bd65760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611c20936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b9150868260018451611c329190614489565b81518110611c4257611c42614514565b60200260200101511015611c685760405162461bcd60e51b815260040161065e9061425f565b611c7e8686600081811061087657610876614514565b611cbd82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612627915050565b6001805483516001600160a01b0390911691632e1a7d4d918591611ce091614489565b81518110611cf057611cf0614514565b60200260200101516040518263ffffffff1660e01b8152600401611d1691815260200190565b600060405180830381600087803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505050610951848360018551611d5b9190614489565b81518110611d6b57611d6b614514565b6020026020010151612a5a565b60608142811015611d9b5760405162461bcd60e51b815260040161065e906142a7565b600180546001600160a01b03169087908790611db79082614489565b818110611dc657611dc6614514565b9050602002016020810190611ddb9190613bb0565b6001600160a01b031614611e015760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611e4b936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110611e6157611e61614514565b60200260200101511115611c685760405162461bcd60e51b815260040161065e9061430d565b6000808411611ee25760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b606482015260840161065e565b600083118015611ef25750600082115b611f3e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b6000611f4c856103e5613035565b90506000611f5a8285613035565b90506000611f7483611f6e886103e8613035565b9061309c565b9050611f808183614448565b979650505050505050565b6060600282511015611fd65760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff811115611ff057611ff061452a565b604051908082528060200260200182016040528015612019578160200160208202803683370190505b50905082816001835161202c9190614489565b8151811061203c5761203c614514565b6020026020010181815250506000600183516120589190614489565b90505b8015612110576000806120ab8786612074600187614489565b8151811061208457612084614514565b602002602001015187868151811061209e5761209e614514565b60200260200101516130f1565b915091506120d38484815181106120c4576120c4614514565b602002602001015183836131ca565b846120df600186614489565b815181106120ef576120ef614514565b60200260200101818152505050508080612108906144cc565b91505061205b565b509392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121839085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526132c9565b50505050565b60405162415c3360e91b815260ff8616600482015260009081906001600160a01b038916906382b866009060240160206040518083038186803b1580156121cf57600080fd5b505afa1580156121e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122079190613bcd565b905061221d6001600160a01b038216898761339b565b6040516348b4aac360e11b815260ff8089166004830152871660248201526044810186905260648101859052608481018490526001600160a01b0389169063916955869060a401602060405180830381600087803b15801561227e57600080fd5b505af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190613f4d565b98975050505050505050565b6040516001600160a01b0383166024820152604481018290526122f290849063a9059cbb60e01b9060640161214c565b505050565b60606002825110156123425760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff81111561235c5761235c61452a565b604051908082528060200260200182016040528015612385578160200160208202803683370190505b509050828160008151811061239c5761239c614514565b60200260200101818152505060005b600183516123b99190614489565b811015612110576000806123ff878685815181106123d9576123d9614514565b6020026020010151878660016123ef9190614430565b8151811061209e5761209e614514565b9150915061242784848151811061241857612418614514565b60200260200101518383611e87565b84612433856001614430565b8151811061244357612443614514565b6020026020010181815250505050808061245c906144e3565b9150506123ab565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b1580156124b157600080fd5b505afa1580156124c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190613bcd565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161254d919061419d565b6000604051808303816000865af19150503d806000811461258a576040519150601f19603f3d011682016040523d82523d6000602084013e61258f565b606091505b50915091508180156125b95750805115806125b95750808060200190518101906125b99190613cad565b61261f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b606482015260840161065e565b505050505050565b60005b600183516126389190614489565b8110156121835760008084838151811061265457612654614514565b60200260200101518584600161266a9190614430565b8151811061267a5761267a614514565b6020026020010151915091506000612692838361345c565b5090506000876126a3866001614430565b815181106126b3576126b3614514565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146126e1578260006126e5565b6000835b91509150600060028a516126f99190614489565b8810612705578861273f565b60005461273f906001600160a01b0316878c6127228c6002614430565b8151811061273257612732614514565b6020026020010151612464565b600054909150612759906001600160a01b03168888612464565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612796576020820181803683370190505b506040518563ffffffff1660e01b81526004016127b69493929190614351565b600060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050505050505050505080806127fa906144e3565b91505061262a565b6060818060200190518101906104169190613bea565b848460005b848110156129c45785858281811061283757612837614514565b905060200281019061284991906143c5565b612857906020810190613c90565b156128945761288a8287878481811061287257612872614514565b905060200281019061288491906143c5565b8661353d565b90935091506129b2565b60006128ab8787848181106109e7576109e7614514565b905080600182516128bc9190614489565b815181106128cc576128cc614514565b6020026020010151935060006128f660008054906101000a90046001600160a01b031685846122f7565b905061297b8260008151811061290e5761290e614514565b602002602001015161295b60008054906101000a90046001600160a01b03168560008151811061294057612940614514565b60200260200101518660018151811061273257612732614514565b8360008151811061296e5761296e614514565b60200260200101516138c4565b612986818330612627565b80600182516129959190614489565b815181106129a5576129a5614514565b6020026020010151935050505b806129bc816144e3565b91505061281d565b509550959350505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080600080600086806020019051810190612a169190613cca565b6040805160a0810182526001600160a01b03968716815294861660208601529285169284019290925290921660608201529015156080820152979650505050505050565b604080516000808252602082019092526001600160a01b038416908390604051612a84919061419d565b60006040518083038185875af1925050503d8060008114612ac1576040519150601f19603f3d011682016040523d82523d6000602084013e612ac6565b606091505b50509050806122f25760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a40161065e565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8c57600080fd5b505afa158015612ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc49190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612c0b57600080fd5b505afa158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c439190614119565b90506000896001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8057600080fd5b505afa158015612c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb89190613f4d565b67ffffffffffffffff811115612cd057612cd061452a565b604051908082528060200260200182016040528015612cf9578160200160208202803683370190505b50905086818a60ff1681518110612d1257612d12614514565b602090810291909101015260405162415c3360e91b815260ff8a1660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015612d6157600080fd5b505afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d999190613bcd565b9050612daf6001600160a01b0382168c8a61339b565b604051634d49e87d60e01b81526000906001600160a01b038d1690634d49e87d90612de290869085908c906004016141f0565b602060405180830381600087803b158015612dfc57600080fd5b505af1158015612e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e349190613f4d565b90508960ff168460ff1614612e5857612e518d858c848c8c612189565b9550612e5c565b8095505b5050505050979650505050505050565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612ea857600080fd5b505afa158015612ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee09190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612f2757600080fd5b505afa158015612f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5f9190614119565b90508560ff808316908a1614612f8157612f7e8b8a848a60008a612189565b90505b612f956001600160a01b0384168b8361339b565b6040516301f1d0ab60e51b81526004810182905260ff8916602482015260448101879052606481018690526001600160a01b038b1690633e3a156090608401602060405180830381600087803b158015612fee57600080fd5b505af1158015613002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130269190613f4d565b9b9a5050505050505050505050565b60008115806130595750828261304b818361446a565b92506130579083614448565b145b6104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161065e565b6000826130a98382614430565b91508110156104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161065e565b6000806000613100858561345c565b509050600080613111888888612464565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561314957600080fd5b505afa15801561315d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131819190613efd565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146131b85780826131bb565b81815b90999098509650505050505050565b60008084116132265760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b606482015260840161065e565b6000831180156132365750600082115b6132825760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b600061329a6103e86132948688613035565b90613035565b905060006132ae6103e561329486896139f5565b90506132bf6001611f6e8385614448565b9695505050505050565b600061331e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a4b9092919063ffffffff16565b8051909150156122f2578080602001905181019061333c9190613cad565b6122f25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156133e757600080fd5b505afa1580156133fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341f9190613f4d565b6134299190614430565b6040516001600160a01b03851660248201526044810182905290915061218390859063095ea7b360e01b9060640161214c565b600080826001600160a01b0316846001600160a01b031614156134c15760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f4144445245535345530000000000604482015260640161065e565b826001600160a01b0316846001600160a01b0316106134e15782846134e4565b83835b90925090506001600160a01b0382166135365760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b604482015260640161065e565b9250929050565b60008080613551610cb3602087018761437e565b606081015160208201519094509091506001600160a01b031661368357805160408083015190516319b02f4960e21b81526001600160a01b03918216600482015261367c92918216906366c0bd249060240160206040518083038186803b1580156135bb57600080fd5b505afa1580156135cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f39190614119565b835160608501516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561363b57600080fd5b505afa15801561364f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136739190614119565b89600089612189565b91506138bb565b8060800151156137a1578051602082015160408084015190516319b02f4960e21b81526001600160a01b03918216600482015261367c9392918216906366c0bd249060240160206040518083038186803b1580156136e057600080fd5b505afa1580156136f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137189190614119565b845160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561376057600080fd5b505afa158015613774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137989190614119565b8a60008a612b50565b8051602082015160408084015190516319b02f4960e21b81526001600160a01b0391821660048201526138b89392918316906366c0bd249060240160206040518083038186803b1580156137f457600080fd5b505afa158015613808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382c9190614119565b602085015160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561387757600080fd5b505afa15801561388b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138af9190614119565b8a60008a612e6c565b91505b50935093915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613920919061419d565b6000604051808303816000865af19150503d806000811461395d576040519150601f19603f3d011682016040523d82523d6000602084013e613962565b606091505b509150915081801561398c57508051158061398c57508080602001905181019061398c9190613cad565b6139ee5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161065e565b5050505050565b600082613a028382614489565b91508111156104165760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161065e565b60606103ef8484600085856001600160a01b0385163b613aad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065e565b600080866001600160a01b03168587604051613ac9919061419d565b60006040518083038185875af1925050503d8060008114613b06576040519150601f19603f3d011682016040523d82523d6000602084013e613b0b565b606091505b5091509150611f8082828660608315613b255750816103f2565b825115613b355782518084602001fd5b8160405162461bcd60e51b815260040161065e9190614215565b60008083601f840112613b6157600080fd5b50813567ffffffffffffffff811115613b7957600080fd5b6020830191508360208260051b850101111561353657600080fd5b80516001600160701b0381168114613bab57600080fd5b919050565b600060208284031215613bc257600080fd5b81356103f281614540565b600060208284031215613bdf57600080fd5b81516103f281614540565b60006020808385031215613bfd57600080fd5b825167ffffffffffffffff811115613c1457600080fd5b8301601f81018513613c2557600080fd5b8051613c38613c338261440c565b6143db565b80828252848201915084840188868560051b8701011115613c5857600080fd5b600094505b83851015613c84578051613c7081614540565b835260019490940193918501918501613c5d565b50979650505050505050565b600060208284031215613ca257600080fd5b81356103f281614558565b600060208284031215613cbf57600080fd5b81516103f281614558565b600080600080600060a08688031215613ce257600080fd5b8551613ced81614540565b6020870151909550613cfe81614540565b6040870151909450613d0f81614540565b6060870151909350613d2081614540565b6080870151909250613d3181614558565b809150509295509295909350565b600080600080600060a08688031215613d5757600080fd5b8535613d6281614540565b94506020860135613d7281614540565b93506040860135613d8281614566565b92506060860135613d9281614566565b949793965091946080013592915050565b600080600080600080600080610100898b031215613dc057600080fd5b8835613dcb81614540565b97506020890135613ddb81614540565b96506040890135613deb81614566565b95506060890135613dfb81614566565b94506080890135935060a0890135925060c0890135613e1981614540565b8092505060e089013590509295985092959890939650565b60008060008060808587031215613e4757600080fd5b8435613e5281614540565b93506020850135613e6281614566565b92506040850135613e7281614566565b9396929550929360600135925050565b600080600080600080600060e0888a031215613e9d57600080fd5b8735613ea881614540565b96506020880135613eb881614566565b95506040880135613ec881614566565b9450606088013593506080880135925060a0880135613ee681614540565b8092505060c0880135905092959891949750929550565b600080600060608486031215613f1257600080fd5b613f1b84613b94565b9250613f2960208501613b94565b9150604084015163ffffffff81168114613f4257600080fd5b809150509250925092565b600060208284031215613f5f57600080fd5b5051919050565b600080600080600060808688031215613f7e57600080fd5b85359450602086013567ffffffffffffffff811115613f9c57600080fd5b613fa888828901613b4f565b9095509350506040860135613fbc81614540565b949793965091946060013592915050565b60008060408385031215613fe057600080fd5b8235915060208084013567ffffffffffffffff811115613fff57600080fd5b8401601f8101861361401057600080fd5b803561401e613c338261440c565b80828252848201915084840189868560051b870101111561403e57600080fd5b600094505b8385101561406a57803561405681614540565b835260019490940193918501918501614043565b5080955050505050509250929050565b60008060008060008060a0878903121561409357600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156140b857600080fd5b6140c489828a01613b4f565b90955093505060608701356140d881614540565b80925050608087013590509295509295509295565b60008060006060848603121561410257600080fd5b505081359360208301359350604090920135919050565b60006020828403121561412b57600080fd5b81516103f281614566565b600081518084526020808501945080840160005b838110156141665781518752958201959082019060010161414a565b509495945050505050565b600081518084526141898160208601602086016144a0565b601f01601f19169290920160200192915050565b600082516141af8184602087016144a0565b9190910192915050565b6020815260006104136020830184614136565b6040815260006141df6040830185614136565b905082151560208301529392505050565b6060815260006142036060830186614136565b60208301949094525060400152919050565b6020815260006104136020830184614171565b6020808252601a908201527f53776170526f7574657256313a20494e56414c49445f50415448000000000000604082015260600190565b60208082526028908201527f53776170526f7574657256313a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b60208082526015908201527414ddd85c149bdd5d195c958c4e8811561412549151605a1b604082015260600190565b6020808252601c908201527f53776170526f7574657256313a20494e56414c49445f524f5554455300000000604082015260600190565b60208082526024908201527f53776170526f7574657256313a204558434553534956455f494e5055545f414d60408201526313d5539560e21b606082015260800190565b84815283602082015260018060a01b03831660408201526080606082015260006132bf6080830184614171565b6000808335601e1984360301811261439557600080fd5b83018035915067ffffffffffffffff8211156143b057600080fd5b60200191503681900382131561353657600080fd5b60008235603e198336030181126141af57600080fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156144045761440461452a565b604052919050565b600067ffffffffffffffff8211156144265761442661452a565b5060051b60200190565b60008219821115614443576144436144fe565b500190565b60008261446557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614484576144846144fe565b500290565b60008282101561449b5761449b6144fe565b500390565b60005b838110156144bb5781810151838201526020016144a3565b838111156121835750506000910152565b6000816144db576144db6144fe565b506000190190565b60006000198214156144f7576144f76144fe565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461455557600080fd5b50565b801515811461455557600080fd5b60ff8116811461455557600080fdfea2646970667358221220c1b9b93b5890006555202f0f9817bdfdb929081c6e0bd36a86da4a459b66c44364736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000079710316b06bbb2c0ff4befb7d2dac206c716a0000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
-----Decoded View---------------
Arg [0] : _factory (address): 0x079710316b06BBB2c0FF4bEFb7D2DaC206c716A0
Arg [1] : _WNativeCurrency (address): 0xAcc15dC74880C9944775448304B263D191c6077F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000079710316b06bbb2c0ff4befb7d2dac206c716a0
Arg [1] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Deployed Bytecode Sourcemap
36710:19261:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37416:15;;-1:-1:-1;;;;;37416:15:0;37402:10;:29;37394:38;;;;;;36710:19261;;;;;53368:242;;;;;;;;;;-1:-1:-1;53368:242:0;;;;;:::i;:::-;;:::i;:::-;;;23514:25:1;;;23502:2;23487:18;53368:242:0;;;;;;;;54110:234;;;;;;;;;;-1:-1:-1;54110:234:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55351:617::-;;;;;;;;;;-1:-1:-1;55351:617:0;;;;;:::i;:::-;;:::i;45480:583::-;;;;;;;;;;-1:-1:-1;45480:583:0;;;;;:::i;:::-;;:::i;38318:677::-;;;;;;;;;;-1:-1:-1;38318:677:0;;;;;:::i;:::-;;:::i;37028:39::-;;;;;;;;;;-1:-1:-1;37028:39:0;;;;-1:-1:-1;;;;;37028:39:0;;;;;;-1:-1:-1;;;;;13470:32:1;;;13452:51;;13440:2;13425:18;37028:39:0;13306:203:1;50615:850:0;;;;;;:::i;:::-;;:::i;51473:1251::-;;;;;;;;;;-1:-1:-1;51473:1251:0;;;;;:::i;:::-;;:::i;54352:249::-;;;;;;;;;;-1:-1:-1;54352:249:0;;;;;:::i;:::-;;:::i;39003:618::-;;;;;;;;;;-1:-1:-1;39003:618:0;;;;;:::i;:::-;;:::i;54609:734::-;;;;;;;;;;-1:-1:-1;54609:734:0;;;;;:::i;:::-;;:::i;42381:941::-;;;;;;:::i;:::-;;:::i;49720:887::-;;;;;;;;;;-1:-1:-1;49720:887:0;;;;;:::i;:::-;;:::i;46071:642::-;;;;;;;;;;-1:-1:-1;46071:642:0;;;;;:::i;:::-;;:::i;36990:31::-;;;;;;;;;;-1:-1:-1;36990:31:0;;;;-1:-1:-1;;;;;36990:31:0;;;39629:823;;;;;;:::i;:::-;;:::i;53868:234::-;;;;;;;;;;-1:-1:-1;53868:234:0;;;;;:::i;:::-;;:::i;46721:638::-;;;;;;;;;;-1:-1:-1;46721:638:0;;;;;:::i;:::-;;:::i;41391:982::-;;;;;;;;;;-1:-1:-1;41391:982:0;;;;;:::i;:::-;;:::i;40460:923::-;;;;;;;;;;-1:-1:-1;40460:923:0;;;;;:::i;:::-;;:::i;53368:242::-;53513:17;53550:52;53570:8;53580:9;53591:10;53550:19;:52::i;:::-;53543:59;;53368:242;;;;;;:::o;54110:234::-;54311:7;;54242:24;;54291:45;;-1:-1:-1;;;;;54311:7:0;54320:9;54331:4;54291:19;:45::i;:::-;54284:52;;54110:234;;;;;:::o;55351:617::-;55558:7;55578:16;55597:8;-1:-1:-1;;;;;55597:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55652:38;;-1:-1:-1;;;55652:38:0;;-1:-1:-1;;;;;13470:32:1;;;55652:38:0;;;13452:51:1;55578:40:0;;-1:-1:-1;55629:20:0;;55652:18;;;;;13425::1;;55652:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55629:61;-1:-1:-1;55725:2:0;55742:32;;;;;;;;55738:135;;55807:54;;-1:-1:-1;;;55807:54:0;;25089:4:1;25077:17;;;55807:54:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;-1:-1:-1;;;;;55807:18:0;;;;;25032::1;;55807:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55791:70;;55738:135;55890:70;;-1:-1:-1;;;55890:70:0;;;;;24183:25:1;;;24256:4;24244:17;;24224:18;;;24217:45;-1:-1:-1;;;;;55890:41:0;;;;;24156:18:1;;55890:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55883:77;;;;;55351:617;;;;;;;;:::o;45480:583::-;45732:17;45713:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;;;;;;;;;45776:24:::1;::::0;-1:-1:-1;;;45776:24:0;;24848:4:1;24836:17;;45776:24:0::1;::::0;::::1;24818:36:1::0;45762:11:0::1;::::0;-1:-1:-1;;;;;45776:13:0;::::1;::::0;::::1;::::0;24791:18:1;;45776:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45762:38:::0;-1:-1:-1;45811:58:0::1;-1:-1:-1::0;;;;;45811:21:0;::::1;45833:10;45853:4;45860:8:::0;45811:21:::1;:58::i;:::-;45892:69;45902:4;45908:9;45919:7;45928:8;45938:12;45952:8;45892:9;:69::i;:::-;45988:22;::::0;-1:-1:-1;;;45988:22:0;;24848:4:1;24836:17;;45988:22:0::1;::::0;::::1;24818:36:1::0;45880:81:0;;-1:-1:-1;45972:13:0::1;::::0;-1:-1:-1;;;;;45988:13:0;::::1;::::0;::::1;::::0;24791:18:1;;45988:22:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45972:38:::0;-1:-1:-1;46021:34:0::1;-1:-1:-1::0;;;;;46021:19:0;::::1;46041:2:::0;46045:9;46021:19:::1;:34::i;:::-;45751:312;;45480:583:::0;;;;;;;;;;:::o;38318:677::-;38543:24;38524:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;38611:7:::1;::::0;38590:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;38611:7:0::1;::::0;38620:8;;38590:45;38630:4;;;;;;38590:45;;::::1;::::0;38630:4;;38590:45;38630:4;38590:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;38590:20:0::1;::::0;-1:-1:-1;;;38590:45:0:i:1;:::-;38580:55;;38699:12;38668:7;38693:1;38676:7;:14;:18;;;;:::i;:::-;38668:27;;;;;;;;:::i;:::-;;;;;;;:43;;38646:133;;;;-1:-1:-1::0;;;38646:133:0::1;;;;;;;:::i;:::-;38790:162;38828:4;;38833:1;38828:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38890;::::0;;38850:10:::1;::::0;38875:41:::1;::::0;-1:-1:-1;;;;;38890:7:0::1;::::0;38899:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38908:4;;38913:1;38908:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38875:14;:41::i;:::-;38931:7;38939:1;38931:10;;;;;;;;:::i;:::-;;;;;;;38790:23;:162::i;:::-;38963:24;38969:7;38978:4;;38963:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38984:2:0;;-1:-1:-1;38963:5:0::1;::::0;-1:-1:-1;;38963:24:0:i:1;:::-;38318:677:::0;;;;;;;;;:::o;50615:850::-;50846:17;50827:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;50885:6:::1;;50892:1;50885:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50884:17;50876:58;;;;-1:-1:-1::0;;;50876:58:0::1;;;;;;;:::i;:::-;50945:15;50963:38;50982:6;;50989:1;50982:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50963:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;50963:18:0::1;::::0;-1:-1:-1;;;50963:38:0:i:1;:::-;51002:1;50963:41;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;51034:15:::1;::::0;50963:41;;-1:-1:-1;;;;;;51023:26:0;;::::1;51034:15:::0;::::1;51023:26;51015:67;;;;-1:-1:-1::0;;;51015:67:0::1;;;;;;;:::i;:::-;51110:15;;;;;;;;;-1:-1:-1::0;;;;;51110:15:0::1;-1:-1:-1::0;;;;;51093:41:0::1;;51142:9;51093:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;51165:16;51216:60;51239:7;51248:9;51259:6;;51267:8;51216:22;:60::i;:::-;51192:84:::0;-1:-1:-1;51192:84:0;-1:-1:-1;51309:25:0;;::::1;;51287:115;;;;-1:-1:-1::0;;;51287:115:0::1;;;;;;;:::i;:::-;51413:44;-1:-1:-1::0;;;;;51413:29:0;::::1;51443:2:::0;51447:9;51413:29:::1;:44::i;:::-;50865:600;;50615:850:::0;;;;;;;;:::o;51473:1251::-;51723:17;51704:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;51762:6;;51769:17:::1;51785:1;51762:6:::0;51769:17:::1;:::i;:::-;51762:25;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:32;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;51761:33;51753:74;;;;-1:-1:-1::0;;;51753:74:0::1;;;;;;;:::i;:::-;51838:29;51870:54;51889:6:::0;;51896:17:::1;51912:1;51889:6:::0;51896:17:::1;:::i;:::-;51889:25;;;;;;;:::i;51870:54::-;51984:15;::::0;;51956:19;;51838:86;;-1:-1:-1;;;;;;51984:15:0::1;::::0;51838:86;;51956:23:::1;::::0;::::1;:::i;:::-;51943:37;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;51943:56:0::1;;51935:97;;;;-1:-1:-1::0;;;51935:97:0::1;;;;;;;:::i;:::-;52043:15;52073:6;;52080:1;52073:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;52069:198;;;52116:45;52142:6;;52149:1;52142:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;52116:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;52116:25:0::1;::::0;-1:-1:-1;;;52116:45:0:i:1;:::-;:55;;;52106:65;;52069:198;;;52214:38;52233:6;;52240:1;52233:9;;;;;;;:::i;52214:38::-;52253:1;52214:41;;;;;;;;:::i;:::-;;;;;;;52204:51;;52069:198;52277:69;52301:7;52310:10;52330:4;52337:8;52277:23;:69::i;:::-;52357:16;52408:59;52431:7;52440:8;52450:6;;52458:8;52408:22;:59::i;:::-;52384:83:::0;-1:-1:-1;52384:83:0;-1:-1:-1;52500:25:0;;::::1;;52478:115;;;;-1:-1:-1::0;;;52478:115:0::1;;;;;;;:::i;:::-;52621:15;::::0;52604:53:::1;::::0;-1:-1:-1;;;52604:53:0;;::::1;::::0;::::1;23514:25:1::0;;;-1:-1:-1;;;;;52621:15:0;;::::1;::::0;52604:42:::1;::::0;23487:18:1;;52604:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52668:48;52702:2;52706:9;52668:33;:48::i;:::-;51742:982;;;51473:1251:::0;;;;;;;;;:::o;54352:249::-;54545:48;;-1:-1:-1;;;54545:48:0;;25089:4:1;25077:17;;;54545:48:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;54518:7:0;;-1:-1:-1;;;;;54545:18:0;;;;;25032::1;;54545:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39003:618::-;39228:24;39209:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;39295:7:::1;::::0;39275:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;39295:7:0::1;::::0;39304:9;;39275:45;39315:4;;;;;;39275:45;;::::1;::::0;39315:4;;39275:45;39315:4;39275:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39275:19:0::1;::::0;-1:-1:-1;;;39275:45:0:i:1;:::-;39265:55;;39353:11;39339:7;39347:1;39339:10;;;;;;;;:::i;:::-;;;;;;;:25;;39331:74;;;;-1:-1:-1::0;;;39331:74:0::1;;;;;;;:::i;54609:734::-:0;54818:7;54838:16;54857:8;-1:-1:-1;;;;;54857:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54912:38;;-1:-1:-1;;;54912:38:0;;-1:-1:-1;;;;;13470:32:1;;;54912:38:0;;;13452:51:1;54838:40:0;;-1:-1:-1;54889:20:0;;54912:18;;;;;13425::1;;54912:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54889:61;;54961:29;55007:8;-1:-1:-1;;;;;55007:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54993:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54993:43:0;;54961:75;;55078:2;55047:12;55060:14;55047:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;55114:49;;-1:-1:-1;;;55114:49:0;;55091:20;;-1:-1:-1;;;;;55114:29:0;;;;;:49;;55144:12;;55158:4;;55114:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55091:72;;55196:12;55178:30;;:14;:30;;;55174:82;;;55232:12;-1:-1:-1;55225:19:0;;-1:-1:-1;;;55225:19:0;55174:82;55273:62;;-1:-1:-1;;;55273:62:0;;25089:4:1;25077:17;;;55273:62:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;-1:-1:-1;;;;;55273:18:0;;;;;25032::1;;55273:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55266:69;54609:734;-1:-1:-1;;;;;;;;;;54609:734:0:o;42381:941::-;42592:24;42573:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;42648:15:::1;::::0;-1:-1:-1;;;;;42648:15:0::1;42637:4:::0;;42648:15:::1;42637:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42637:26:0::1;;42629:65;;;;-1:-1:-1::0;;;42629:65:0::1;;;;;;;:::i;:::-;42735:7;::::0;42715:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;42735:7:0::1;::::0;42744:9;;42715:45;42755:4;;;;;;42715:45;;::::1;::::0;42755:4;;42715:45;42755:4;42715:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;42715:19:0::1;::::0;-1:-1:-1;;;42715:45:0:i:1;:::-;42705:55;;42793:9;42779:7;42787:1;42779:10;;;;;;;;:::i;:::-;;;;;;;:23;;42771:72;;;;-1:-1:-1::0;;;42771:72:0::1;;;;;;;:::i;:::-;42871:15;::::0;42903:10;;-1:-1:-1;;;;;42871:15:0;;::::1;::::0;42854:41:::1;::::0;42903:7;;42871:15:::1;::::0;42903:10:::1;;;;:::i;:::-;;;;;;;42854:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42956:15:0::1;::::0;::::1;43015:7:::0;;-1:-1:-1;;;;;42956:15:0;;::::1;::::0;-1:-1:-1;42949:32:0::1;::::0;-1:-1:-1;43000:41:0::1;::::0;-1:-1:-1;43015:7:0;;::::1;::::0;43024:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;43033:4;;43038:1;43033:7;;;;;;;:::i;43000:41::-;43060:7;43068:1;43060:10;;;;;;;;:::i;:::-;;;;;;;42949:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;14395:32:1;;;;14377:51;;14459:2;14444:18;;14437:34;14365:2;14350:18;;14203:274;42949:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42927:169;;;::::0;::::1;;43107:24;43113:7;43122:4;;43107:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;43128:2:0;;-1:-1:-1;43107:5:0::1;::::0;-1:-1:-1;;43107:24:0:i:1;:::-;43158:7;43166:1;43158:10;;;;;;;;:::i;:::-;;;;;;;43146:9;:22;43142:173;;;43185:118;43237:10;43278:7;43286:1;43278:10;;;;;;;;:::i;:::-;;;;;;;43266:9;:22;;;;:::i;:::-;43185:33;:118::i;:::-;42381:941:::0;;;;;;;;:::o;49720:887::-;49962:17;49943:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;49992:15:::1;50022:6;;50029:1;50022:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50018:198;;;50065:45;50091:6;;50098:1;50091:9;;;;;;;:::i;50065:45::-;:55;;;50055:65;;50018:198;;;50163:38;50182:6;;50189:1;50182:9;;;;;;;:::i;50163:38::-;50202:1;50163:41;;;;;;;;:::i;:::-;;;;;;;50153:51;;50018:198;50228:69;50252:7;50261:10;50281:4;50288:8;50228:23;:69::i;:::-;50308:16;50359:59;50382:7;50391:8;50401:6;;50409:8;50359:22;:59::i;:::-;50335:83:::0;-1:-1:-1;50335:83:0;-1:-1:-1;50451:25:0;;::::1;;50429:115;;;;-1:-1:-1::0;;;50429:115:0::1;;;;;;;:::i;:::-;50555:44;-1:-1:-1::0;;;;;50555:29:0;::::1;50585:2:::0;50589:9;50555:29:::1;:44::i;:::-;49981:626;;49720:887:::0;;;;;;;;;:::o;46071:642::-;46359:17;46340:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;46403:33:::1;::::0;-1:-1:-1;;;46403:33:0;;24848:4:1;24836:17;;46403:33:0::1;::::0;::::1;24818:36:1::0;46389:11:0::1;::::0;-1:-1:-1;;;;;46403:17:0;::::1;::::0;::::1;::::0;24791:18:1;;46403:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46389:47:::0;-1:-1:-1;46447:52:0::1;-1:-1:-1::0;;;;;46447:21:0;::::1;46469:10;46489:4;46496:2:::0;46447:21:::1;:52::i;:::-;46522:84;46540:4;46546:8;46556:14;46572:12;46586:2;46590:5;46597:8;46522:17;:84::i;:::-;46633:27;::::0;-1:-1:-1;;;46633:27:0;;24848:4:1;24836:17;;46633:27:0::1;::::0;::::1;24818:36:1::0;46510:96:0;;-1:-1:-1;46617:13:0::1;::::0;-1:-1:-1;;;;;46633:13:0;::::1;::::0;::::1;::::0;24791:18:1;;46633:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46617:43:::0;-1:-1:-1;46671:34:0::1;-1:-1:-1::0;;;;;46671:19:0;::::1;46691:2:::0;46695:9;46671:19:::1;:34::i;:::-;46378:335;;46071:642:::0;;;;;;;;;;;:::o;39629:823::-;39843:24;39824:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;39899:15:::1;::::0;-1:-1:-1;;;;;39899:15:0::1;39888:4:::0;;39899:15:::1;39888:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39888:26:0::1;;39880:65;;;;-1:-1:-1::0;;;39880:65:0::1;;;;;;;:::i;:::-;39987:7;::::0;39966:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;39987:7:0::1;::::0;39996:9:::1;::::0;39966:46;40007:4;;;;;;39966:46;;::::1;::::0;40007:4;;39966:46;40007:4;39966:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39966:20:0::1;::::0;-1:-1:-1;;;39966:46:0:i:1;:::-;39956:56;;40076:12;40045:7;40070:1;40053:7;:14;:18;;;;:::i;:::-;40045:27;;;;;;;;:::i;:::-;;;;;;;:43;;40023:133;;;;-1:-1:-1::0;;;40023:133:0::1;;;;;;;:::i;:::-;40184:15;::::0;40216:10;;-1:-1:-1;;;;;40184:15:0;;::::1;::::0;40167:41:::1;::::0;40216:7;;40184:15:::1;::::0;40216:10:::1;;;;:::i;:::-;;;;;;;40167:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40269:15:0::1;::::0;::::1;40328:7:::0;;-1:-1:-1;;;;;40269:15:0;;::::1;::::0;-1:-1:-1;40262:32:0::1;::::0;-1:-1:-1;40313:41:0::1;::::0;-1:-1:-1;40328:7:0;;::::1;::::0;40337:4;;;;:7;::::1;;;;:::i;40313:41::-;40373:7;40381:1;40373:10;;;;;;;;:::i;:::-;;;;;;;40262:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;14395:32:1;;;;14377:51;;14459:2;14444:18;;14437:34;14365:2;14350:18;;14203:274;40262:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40240:169;;;::::0;::::1;;40420:24;40426:7;40435:4;;40420:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;40441:2:0;;-1:-1:-1;40420:5:0::1;::::0;-1:-1:-1;;40420:24:0:i:1;53868:234::-:0;54070:7;;54000:24;;54049:45;;-1:-1:-1;;;;;54070:7:0;54079:8;54089:4;54049:20;:45::i;46721:638::-;47007:17;46988:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;47051:29:::1;::::0;-1:-1:-1;;;47051:29:0;;24848:4:1;24836:17;;47051:29:0::1;::::0;::::1;24818:36:1::0;47037:11:0::1;::::0;-1:-1:-1;;;;;47051:13:0;::::1;::::0;::::1;::::0;24791:18:1;;47051:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47037:43:::0;-1:-1:-1;47091:52:0::1;-1:-1:-1::0;;;;;47091:21:0;::::1;47113:10;47133:4;47140:2:::0;47091:21:::1;:52::i;:::-;47166:82;47182:4;47188:8;47198:14;47214:12;47228:2;47232:5;47239:8;47166:15;:82::i;:::-;47275:31;::::0;-1:-1:-1;;;47275:31:0;;24848:4:1;24836:17;;47275:31:0::1;::::0;::::1;24818:36:1::0;47154:94:0;;-1:-1:-1;47259:13:0::1;::::0;-1:-1:-1;;;;;47275:17:0;::::1;::::0;::::1;::::0;24791:18:1;;47275:31:0::1;24676:184:1::0;41391:982:0;41624:24;41605:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;41708:15:::1;::::0;;-1:-1:-1;;;;;41708:15:0::1;::::0;41683:4;;;;41688:15:::1;::::0;41683:4;41688:15:::1;:::i;:::-;41683:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41683:40:0::1;;41661:116;;;;-1:-1:-1::0;;;41661:116:0::1;;;;;;;:::i;:::-;41819:7;::::0;41798:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;41819:7:0::1;::::0;41828:8;;41798:45;41838:4;;;;;;41798:45;;::::1;::::0;41838:4;;41798:45;41838:4;41798:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;41798:20:0::1;::::0;-1:-1:-1;;;41798:45:0:i:1;:::-;41788:55;;41907:12;41876:7;41901:1;41884:7;:14;:18;;;;:::i;:::-;41876:27;;;;;;;;:::i;:::-;;;;;;;:43;;41854:133;;;;-1:-1:-1::0;;;41854:133:0::1;;;;;;;:::i;:::-;41998:162;42036:4;;42041:1;42036:7;;;;;;;:::i;41998:162::-;42171:35;42177:7;42186:4;;42171:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42200:4:0::1;::::0;-1:-1:-1;42171:5:0::1;::::0;-1:-1:-1;;42171:35:0:i:1;:::-;42234:15;::::0;;42268:14;;-1:-1:-1;;;;;42234:15:0;;::::1;::::0;42217:42:::1;::::0;42260:7;;42268:18:::1;::::0;::::1;:::i;:::-;42260:27;;;;;;;;:::i;:::-;;;;;;;42217:71;;;;;;;;;;;;;23514:25:1::0;;23502:2;23487:18;;23368:177;42217:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42299:66;42333:2;42337:7;42362:1;42345:7;:14;:18;;;;:::i;:::-;42337:27;;;;;;;;:::i;:::-;;;;;;;42299:33;:66::i;40460:923::-:0;40693:24;40674:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;40777:15:::1;::::0;;-1:-1:-1;;;;;40777:15:0::1;::::0;40752:4;;;;40757:15:::1;::::0;40752:4;40757:15:::1;:::i;:::-;40752:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40752:40:0::1;;40730:116;;;;-1:-1:-1::0;;;40730:116:0::1;;;;;;;:::i;:::-;40887:7;::::0;40867:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;40887:7:0::1;::::0;40896:9;;40867:45;40907:4;;;;;;40867:45;;::::1;::::0;40907:4;;40867:45;40907:4;40867:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;40867:19:0::1;::::0;-1:-1:-1;;;40867:45:0:i:1;:::-;40857:55;;40945:11;40931:7;40939:1;40931:10;;;;;;;;:::i;:::-;;;;;;;:25;;40923:74;;;;-1:-1:-1::0;;;40923:74:0::1;;;;;;;:::i;7009:589::-:0;7145:17;7194:1;7183:8;:12;7175:58;;;;-1:-1:-1;;;7175:58:0;;23168:2:1;7175:58:0;;;23150:21:1;23207:2;23187:18;;;23180:30;23246:34;23226:18;;;23219:62;-1:-1:-1;;;23297:18:1;;;23290:31;23338:19;;7175:58:0;22966:397:1;7175:58:0;7278:1;7266:9;:13;:31;;;;;7296:1;7283:10;:14;7266:31;7244:111;;;;-1:-1:-1;;;7244:111:0;;22049:2:1;7244:111:0;;;22031:21:1;22088:2;22068:18;;;22061:30;22127:32;22107:18;;;22100:60;22177:18;;7244:111:0;21847:354:1;7244:111:0;7366:23;7392:17;:8;7405:3;7392:12;:17::i;:::-;7366:43;-1:-1:-1;7420:17:0;7440:31;7366:43;7460:10;7440:19;:31::i;:::-;7420:51;-1:-1:-1;7482:19:0;7504:40;7528:15;7504:19;:9;7518:4;7504:13;:19::i;:::-;:23;;:40::i;:::-;7482:62;-1:-1:-1;7567:23:0;7482:62;7567:9;:23;:::i;:::-;7555:35;7009:589;-1:-1:-1;;;;;;;7009:589:0:o;8969:640::-;9107:24;9167:1;9152:4;:11;:16;;9144:49;;;;-1:-1:-1;;;9144:49:0;;22408:2:1;9144:49:0;;;22390:21:1;22447:2;22427:18;;;22420:30;-1:-1:-1;;;22466:18:1;;;22459:50;22526:18;;9144:49:0;22206:344:1;9144:49:0;9228:4;:11;9214:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9214:26:0;;9204:36;;9281:9;9251:7;9276:1;9259:7;:14;:18;;;;:::i;:::-;9251:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;9306:9;9332:1;9318:4;:11;:15;;;;:::i;:::-;9306:27;;9301:301;9335:5;;9301:301;;9363:17;;9404:108;9434:7;9460:4;9465:5;9469:1;9465;:5;:::i;:::-;9460:11;;;;;;;;:::i;:::-;;;;;;;9490:4;9495:1;9490:7;;;;;;;;:::i;:::-;;;;;;;9404:11;:108::i;:::-;9362:150;;;;9544:46;9556:7;9564:1;9556:10;;;;;;;;:::i;:::-;;;;;;;9568:9;9579:10;9544:11;:46::i;:::-;9527:7;9535:5;9539:1;9535;:5;:::i;:::-;9527:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9347:255;;9342:3;;;;;:::i;:::-;;;;9301:301;;;;8969:640;;;;;:::o;33046:248::-;33217:68;;-1:-1:-1;;;;;14081:15:1;;;33217:68:0;;;14063:34:1;14133:15;;14113:18;;;14106:43;14165:18;;;14158:34;;;33190:96:0;;33210:5;;-1:-1:-1;;;33240:27:0;13998:18:1;;33217:68:0;;;;-1:-1:-1;;33217:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;33217:68:0;-1:-1:-1;;;;;;33217:68:0;;;;;;;;;;33190:19;:96::i;:::-;33046:248;;;;:::o;43330:429::-;43579:24;;-1:-1:-1;;;43579:24:0;;24848:4:1;24836:17;;43579:24:0;;;24818:36:1;43535:17:0;;;;-1:-1:-1;;;;;43579:13:0;;;;;24791:18:1;;43579:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43565:38;-1:-1:-1;43614:51:0;-1:-1:-1;;;;;43614:26:0;;43649:4;43656:8;43614:26;:51::i;:::-;43688:63;;-1:-1:-1;;;43688:63:0;;25484:4:1;25472:17;;;43688:63:0;;;25454:36:1;25526:17;;25506:18;;;25499:45;25560:18;;;25553:34;;;25603:18;;;25596:34;;;25646:19;;;25639:35;;;-1:-1:-1;;;;;43688:9:0;;;;;25426:19:1;;43688:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43676:75;43330:429;-1:-1:-1;;;;;;;;43330:429:0:o;32827:211::-;32971:58;;-1:-1:-1;;;;;14395:32:1;;32971:58:0;;;14377:51:1;14444:18;;;14437:34;;;32944:86:0;;32964:5;;-1:-1:-1;;;32994:23:0;14350:18:1;;32971:58:0;14203:274:1;32944:86:0;32827:211;;;:::o;8342:619::-;8480:24;8540:1;8525:4;:11;:16;;8517:49;;;;-1:-1:-1;;;8517:49:0;;22408:2:1;8517:49:0;;;22390:21:1;22447:2;22427:18;;;22420:30;-1:-1:-1;;;22466:18:1;;;22459:50;22526:18;;8517:49:0;22206:344:1;8517:49:0;8601:4;:11;8587:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8587:26:0;;8577:36;;8637:8;8624:7;8632:1;8624:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8661:9;8656:298;8690:1;8676:4;:11;:15;;;;:::i;:::-;8672:1;:19;8656:298;;;8714:17;8733:18;8755:108;8785:7;8811:4;8816:1;8811:7;;;;;;;;:::i;:::-;;;;;;;8837:4;8842:1;8846;8842:5;;;;:::i;:::-;8837:11;;;;;;;;:::i;8755:108::-;8713:150;;;;8895:47;8908:7;8916:1;8908:10;;;;;;;;:::i;:::-;;;;;;;8920:9;8931:10;8895:12;:47::i;:::-;8878:7;8886:5;:1;8890;8886:5;:::i;:::-;8878:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8698:256;;8693:3;;;;;:::i;:::-;;;;8656:298;;4550:204;4705:41;;-1:-1:-1;;;4705:41:0;;-1:-1:-1;;;;;13744:15:1;;;4705:41:0;;;13726:34:1;13796:15;;;13776:18;;;13769:43;4673:12:0;;4705:25;;;;;;13661:18:1;;4705:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5589:522::-;5874:51;;;-1:-1:-1;;;;;14081:15:1;;;5874:51:0;;;14063:34:1;14133:15;;;14113:18;;;14106:43;14165:18;;;;14158:34;;;5874:51:0;;;;;;;;;;13998:18:1;;;;5874:51:0;;;;;;;-1:-1:-1;;;;;5874:51:0;-1:-1:-1;;;5874:51:0;;;5849:87;;-1:-1:-1;;;;5849:10:0;;;;:87;;5874:51;5849:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5813:123;;;;5969:7;:57;;;;-1:-1:-1;5981:11:0;;:16;;:44;;;6012:4;6001:24;;;;;;;;;;;;:::i;:::-;5947:156;;;;-1:-1:-1;;;5947:156:0;;17749:2:1;5947:156:0;;;17731:21:1;17788:2;17768:18;;;17761:30;17827:34;17807:18;;;17800:62;-1:-1:-1;;;17878:18:1;;;17871:47;17935:19;;5947:156:0;17547:413:1;5947:156:0;5723:388;;5589:522;;;;:::o;37448:862::-;37583:9;37578:725;37612:1;37598:4;:11;:15;;;;:::i;:::-;37594:1;:19;37578:725;;;37636:13;37651:14;37670:4;37675:1;37670:7;;;;;;;;:::i;:::-;;;;;;;37679:4;37684:1;37688;37684:5;;;;:::i;:::-;37679:11;;;;;;;;:::i;:::-;;;;;;;37635:56;;;;37707:14;37727:32;37745:5;37752:6;37727:17;:32::i;:::-;-1:-1:-1;37706:53:0;-1:-1:-1;37774:17:0;37794:7;37802:5;:1;37806;37802:5;:::i;:::-;37794:14;;;;;;;;:::i;:::-;;;;;;;37774:34;;37824:18;37844;37875:6;-1:-1:-1;;;;;37866:15:0;:5;-1:-1:-1;;;;;37866:15:0;;:101;;37945:9;37964:1;37866:101;;;37910:1;37914:9;37866:101;37823:144;;;;37982:10;38013:1;37999:4;:11;:15;;;;:::i;:::-;37995:1;:19;:106;;38098:3;37995:106;;;38049:7;;38034:44;;-1:-1:-1;;;;;38049:7:0;38058:6;38066:4;38071:5;:1;38075;38071:5;:::i;:::-;38066:11;;;;;;;;:::i;:::-;;;;;;;38034:14;:44::i;:::-;38137:7;;37982:119;;-1:-1:-1;38122:38:0;;-1:-1:-1;;;;;38137:7:0;38146:5;38153:6;38122:14;:38::i;:::-;-1:-1:-1;;;;;38116:50:0;;38185:10;38214;38243:2;38274:1;38264:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38264:12:0;;38116:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37620:683;;;;;;;37615:3;;;;;:::i;:::-;;;;37578:725;;52732:147;52801:21;52853:4;52842:29;;;;;;;;;;;;:::i;48686:1026::-;48915:7;48945:8;48856:16;48966:739;48986:17;;;48966:739;;;49029:6;;49036:1;49029:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;;;;;;;:::i;:::-;49025:669;;;49089:46;49104:9;49115:6;;49122:1;49115:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;49126:8;49089:14;:46::i;:::-;49065:70;;-1:-1:-1;49065:70:0;-1:-1:-1;49025:669:0;;;49176:21;49200:38;49219:6;;49226:1;49219:9;;;;;;;:::i;49200:38::-;49176:62;;49268:4;49287:1;49273:4;:11;:15;;;;:::i;:::-;49268:21;;;;;;;;:::i;:::-;;;;;;;49257:32;;49308:24;49335:46;49356:7;;;;;;;;-1:-1:-1;;;;;49356:7:0;49365:9;49376:4;49335:20;:46::i;:::-;49308:73;;49400:166;49442:4;49447:1;49442:7;;;;;;;;:::i;:::-;;;;;;;49473:41;49488:7;;;;;;;;-1:-1:-1;;;;;49488:7:0;49497:4;49502:1;49497:7;;;;;;;;:::i;:::-;;;;;;;49506:4;49511:1;49506:7;;;;;;;;:::i;49473:41::-;49537:7;49545:1;49537:10;;;;;;;;:::i;:::-;;;;;;;49400:19;:166::i;:::-;49585:35;49591:7;49600:4;49614;49585:5;:35::i;:::-;49651:7;49676:1;49659:7;:14;:18;;;;:::i;:::-;49651:27;;;;;;;;:::i;:::-;;;;;;;49639:39;;49157:537;;49025:669;49005:3;;;;:::i;:::-;;;;48966:739;;;;48686:1026;;;;;;;;:::o;52887:473::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53049:16:0;53081:20;53117:17;53150:15;53181:13;53219:4;53208:68;;;;;;;;;;;;:::i;:::-;53296:56;;;;;;;;-1:-1:-1;;;;;53296:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;52887:473:0:o;6600:287::-;6724:12;;;6684;6724;;;;;;;;;-1:-1:-1;;;;;6702:7:0;;;6717:5;;6702:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6683:54;;;6770:7;6748:131;;;;-1:-1:-1;;;6748:131:0;;19686:2:1;6748:131:0;;;19668:21:1;19725:2;19705:18;;;19698:30;19764:34;19744:18;;;19737:62;19835:34;19815:18;;;19808:62;-1:-1:-1;;;19886:19:1;;;19879:41;19937:19;;6748:131:0;19484:478:1;43767:939:0;44008:17;44038:16;44057:8;-1:-1:-1;;;;;44057:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44112:38;;-1:-1:-1;;;44112:38:0;;-1:-1:-1;;;;;13470:32:1;;;44112:38:0;;;13452:51:1;44038:40:0;;-1:-1:-1;44089:20:0;;44112:18;;;;;13425::1;;44112:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44089:61;;44161:29;44207:8;-1:-1:-1;;;;;44207:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44193:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44193:43:0;;44161:75;;44278:2;44247:12;44260:14;44247:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;44305;;-1:-1:-1;;;44305:33:0;;24848:4:1;24836:17;;44305:33:0;;;24818:36:1;44291:11:0;;-1:-1:-1;;;;;44305:17:0;;;;;24791:18:1;;44305:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44291:47;-1:-1:-1;44349:49:0;-1:-1:-1;;;;;44349:26:0;;44384:8;44395:2;44349:26;:49::i;:::-;44432:48;;-1:-1:-1;;;44432:48:0;;44409:20;;-1:-1:-1;;;;;44432:21:0;;;;;:48;;44454:12;;44409:20;;44471:8;;44432:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44409:71;;44513:12;44495:30;;:14;:30;;;44491:208;;44554:76;44564:4;44570:14;44586:12;44600;44614:5;44621:8;44554:9;:76::i;:::-;44542:88;;44491:208;;;44675:12;44663:24;;44491:208;44027:679;;;;;43767:939;;;;;;;;;:::o;44714:758::-;44953:17;44983:16;45002:8;-1:-1:-1;;;;;45002:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45057:38;;-1:-1:-1;;;45057:38:0;;-1:-1:-1;;;;;13470:32:1;;;45057:38:0;;;13452:51:1;44983:40:0;;-1:-1:-1;45034:20:0;;45057:18;;;;;13425::1;;45057:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45034:61;-1:-1:-1;45130:2:0;45147:32;;;;;;;;45143:145;;45212:64;45222:4;45228:14;45244;45260:2;45264:1;45267:8;45212:9;:64::i;:::-;45196:80;;45143:145;45298:65;-1:-1:-1;;;;;45298:31:0;;45338:8;45349:13;45298:31;:65::i;:::-;45386:78;;-1:-1:-1;;;45386:78:0;;;;;24500:25:1;;;24573:4;24561:17;;24541:18;;;24534:45;24595:18;;;24588:34;;;24638:18;;;24631:34;;;-1:-1:-1;;;;;45386:32:0;;;;;24472:19:1;;45386:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45374:90;44714:758;-1:-1:-1;;;;;;;;;;;44714:758:0:o;3863:151::-;3921:9;3951:6;;;:30;;-1:-1:-1;3980:1:0;3975;3966:5;3975:1;3980;3966:5;:::i;:::-;3962:9;-1:-1:-1;3961:15:0;;3962:9;3961:15;:::i;:::-;:20;3951:30;3943:63;;;;-1:-1:-1;;;3943:63:0;;16642:2:1;3943:63:0;;;16624:21:1;16681:2;16661:18;;;16654:30;-1:-1:-1;;;16700:18:1;;;16693:50;16760:18;;3943:63:0;16440:344:1;3572:137:0;3630:9;3675:1;3665:5;3669:1;3675;3665:5;:::i;:::-;3661:9;;;3660:16;;3652:49;;;;-1:-1:-1;;;3652:49:0;;16991:2:1;3652:49:0;;;16973:21:1;17030:2;17010:18;;;17003:30;-1:-1:-1;;;17049:18:1;;;17042:50;17109:18;;3652:49:0;16789:344:1;5101:480:0;5228:16;5246;5276:14;5296:26;5307:6;5315;5296:10;:26::i;:::-;5275:47;;;5334:16;5352;5394:32;5402:7;5411:6;5419;5394:7;:32::i;:::-;-1:-1:-1;;;;;5374:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5333:118;-1:-1:-1;;;;;5333:118:0;;;-1:-1:-1;;;;;5333:118:0;;;5495:6;-1:-1:-1;;;;;5485:16:0;:6;-1:-1:-1;;;;;5485:16:0;;:88;;5554:8;5564;5485:88;;;5518:8;5528;5485:88;5462:111;;;;-1:-1:-1;5101:480:0;-1:-1:-1;;;;;;;5101:480:0:o;7719:541::-;7855:16;7904:1;7892:9;:13;7884:60;;;;-1:-1:-1;;;7884:60:0;;20518:2:1;7884:60:0;;;20500:21:1;20557:2;20537:18;;;20530:30;20596:34;20576:18;;;20569:62;-1:-1:-1;;;20647:18:1;;;20640:32;20689:19;;7884:60:0;20316:398:1;7884:60:0;7989:1;7977:9;:13;:31;;;;;8007:1;7994:10;:14;7977:31;7955:111;;;;-1:-1:-1;;;7955:111:0;;22049:2:1;7955:111:0;;;22031:21:1;22088:2;22068:18;;;22061:30;22127:32;22107:18;;;22100:60;22177:18;;7955:111:0;21847:354:1;7955:111:0;8077:17;8097:34;8126:4;8097:24;:9;8111;8097:13;:24::i;:::-;:28;;:34::i;:::-;8077:54;-1:-1:-1;8142:19:0;8164:34;8194:3;8164:25;:10;8179:9;8164:14;:25::i;:34::-;8142:56;-1:-1:-1;8220:32:0;8250:1;8221:23;8142:56;8221:9;:23;:::i;8220:32::-;8209:43;7719:541;-1:-1:-1;;;;;;7719:541:0:o;35894:716::-;36318:23;36344:69;36372:4;36344:69;;;;;;;;;;;;;;;;;36352:5;-1:-1:-1;;;;;36344:27:0;;;:69;;;;;:::i;:::-;36428:17;;36318:95;;-1:-1:-1;36428:21:0;36424:179;;36525:10;36514:30;;;;;;;;;;;;:::i;:::-;36506:85;;;;-1:-1:-1;;;36506:85:0;;22757:2:1;36506:85:0;;;22739:21:1;22796:2;22776:18;;;22769:30;22835:34;22815:18;;;22808:62;-1:-1:-1;;;22886:18:1;;;22879:40;22936:19;;36506:85:0;22555:406:1;34187:317:0;34341:39;;-1:-1:-1;;;34341:39:0;;34365:4;34341:39;;;13726:34:1;-1:-1:-1;;;;;13796:15:1;;;13776:18;;;13769:43;34318:20:0;;34383:5;;34341:15;;;;;13661:18:1;;34341:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;34426:69;;-1:-1:-1;;;;;14395:32:1;;34426:69:0;;;14377:51:1;14444:18;;;14437:34;;;34318:70:0;;-1:-1:-1;34399:97:0;;34419:5;;-1:-1:-1;;;34449:22:0;14350:18:1;;34426:69:0;14203:274:1;4155:387:0;4257:14;4273;4323:6;-1:-1:-1;;;;;4313:16:0;:6;-1:-1:-1;;;;;4313:16:0;;;4305:56;;;;-1:-1:-1;;;4305:56:0;;20921:2:1;4305:56:0;;;20903:21:1;20960:2;20940:18;;;20933:30;20999:29;20979:18;;;20972:57;21046:18;;4305:56:0;20719:351:1;4305:56:0;4400:6;-1:-1:-1;;;;;4391:15:0;:6;-1:-1:-1;;;;;4391:15:0;;:79;;4455:6;4463;4391:79;;;4423:6;4431;4391:79;4372:98;;-1:-1:-1;4372:98:0;-1:-1:-1;;;;;;4489:20:0;;4481:53;;;;-1:-1:-1;;;4481:53:0;;20169:2:1;4481:53:0;;;20151:21:1;20208:2;20188:18;;;20181:30;-1:-1:-1;;;20227:18:1;;;20220:50;20287:18;;4481:53:0;19967:344:1;4481:53:0;4155:387;;;;;:::o;47367:1311::-;47500:16;;;47573:41;47599:14;;;;:5;:14;:::i;47573:41::-;47636:12;;;;47673:13;;;;47636:12;;-1:-1:-1;47548:66:0;;-1:-1:-1;;;;;;47665:36:0;47661:1010;;47758:9;;47811:14;;;;;47787:39;;-1:-1:-1;;;47787:39:0;;-1:-1:-1;;;;;13470:32:1;;;47787:39:0;;;13452:51:1;47730:245:0;;47758:9;47787:23;;;;;13425:18:1;;47787:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47846:9;;47870:12;;;;47846:37;;-1:-1:-1;;;47846:37:0;;-1:-1:-1;;;;;13470:32:1;;;47846:37:0;;;13452:51:1;47846:23:0;;;;;13425:18:1;;47846:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47903:8;47931:1;47952:8;47730:9;:245::i;:::-;47718:257;;47661:1010;;;47997:4;:13;;;47993:678;;;48075:9;;48104:13;;;;48165:14;;;;;48137:43;;-1:-1:-1;;;48137:43:0;;-1:-1:-1;;;;;13470:32:1;;;48137:43:0;;;13452:51:1;48039:290:0;;48075:9;48104:13;48137:27;;;;;13425:18:1;;48137:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48200:9;;48224:12;;;;48200:37;;-1:-1:-1;;;48200:37:0;;-1:-1:-1;;;;;13470:32:1;;;48200:37:0;;;13452:51:1;48200:23:0;;;;;13425:18:1;;48200:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48257:8;48285:1;48306:8;48039:17;:290::i;47993:678::-;48408:9;;48436:13;;;;48492:14;;;;;48468:39;;-1:-1:-1;;;48468:39:0;;-1:-1:-1;;;;;13470:32:1;;;48468:39:0;;;13452:51:1;48374:285:0;;48408:9;48436:13;48468:23;;;;;13425:18:1;;48468:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48527:13;;;;48555:12;;;;48527:41;;-1:-1:-1;;;48527:41:0;;-1:-1:-1;;;;;13470:32:1;;;48527:41:0;;;13452:51:1;48527:27:0;;;;;13425:18:1;;48527:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48588:8;48616:1;48636:8;48374:15;:285::i;:::-;48362:297;;47993:678;47537:1141;47367:1311;;;;;;:::o;6119:473::-;6365:45;;;-1:-1:-1;;;;;14395:32:1;;;6365:45:0;;;14377:51:1;14444:18;;;;14437:34;;;6365:45:0;;;;;;;;;;14350:18:1;;;;6365:45:0;;;;;;;-1:-1:-1;;;;;6365:45:0;-1:-1:-1;;;6365:45:0;;;6340:81;;-1:-1:-1;;;;6340:10:0;;;;:81;;6365:45;6340:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6304:117;;;;6454:7;:57;;;;-1:-1:-1;6466:11:0;;:16;;:44;;;6497:4;6486:24;;;;;;;;;;;;:::i;:::-;6432:152;;;;-1:-1:-1;;;6432:152:0;;21635:2:1;6432:152:0;;;21617:21:1;21674:2;21654:18;;;21647:30;21713:34;21693:18;;;21686:62;-1:-1:-1;;;21764:18:1;;;21757:43;21817:19;;6432:152:0;21433:409:1;6432:152:0;6226:366;;6119:473;;;:::o;3717:138::-;3775:9;3820:1;3810:5;3814:1;3820;3810:5;:::i;:::-;3806:9;;;3805:16;;3797:50;;;;-1:-1:-1;;;3797:50:0;;15937:2:1;3797:50:0;;;15919:21:1;15976:2;15956:18;;;15949:30;-1:-1:-1;;;15995:18:1;;;15988:51;16056:18;;3797:50:0;15735:345:1;13811:229:0;13948:12;13980:52;14002:6;14010:4;14016:1;14019:12;13948;-1:-1:-1;;;;;11361:19:0;;;15218:60;;;;-1:-1:-1;;;15218:60:0;;21277:2:1;15218:60:0;;;21259:21:1;21316:2;21296:18;;;21289:30;21355:31;21335:18;;;21328:59;21404:18;;15218:60:0;21075:353:1;15218:60:0;15292:12;15306:23;15333:6;-1:-1:-1;;;;;15333:11:0;15352:5;15359:4;15333:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15291:73;;;;15382:51;15399:7;15408:10;15420:12;17767;17796:7;17792:580;;;-1:-1:-1;17827:10:0;17820:17;;17792:580;17941:17;;:21;17937:424;;18189:10;18183:17;18250:15;18237:10;18233:2;18229:19;18222:44;17937:424;18332:12;18325:20;;-1:-1:-1;;;18325: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;;225:18;214:30;;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;386:188;465:13;;-1:-1:-1;;;;;507:42:1;;497:53;;487:81;;564:1;561;554:12;487:81;386:188;;;:::o;579:247::-;638:6;691:2;679:9;670:7;666:23;662:32;659:52;;;707:1;704;697:12;659:52;746:9;733:23;765:31;790:5;765:31;:::i;831:251::-;901:6;954:2;942:9;933:7;929:23;925:32;922:52;;;970:1;967;960:12;922:52;1002:9;996:16;1021:31;1046:5;1021:31;:::i;1087:967::-;1182:6;1213:2;1256;1244:9;1235:7;1231:23;1227:32;1224:52;;;1272:1;1269;1262:12;1224:52;1305:9;1299:16;1338:18;1330:6;1327:30;1324:50;;;1370:1;1367;1360:12;1324:50;1393:22;;1446:4;1438:13;;1434:27;-1:-1:-1;1424:55:1;;1475:1;1472;1465:12;1424:55;1504:2;1498:9;1527:60;1543:43;1583:2;1543:43;:::i;:::-;1527:60;:::i;:::-;1609:3;1633:2;1628:3;1621:15;1661:2;1656:3;1652:12;1645:19;;1692:2;1688;1684:11;1740:7;1735:2;1729;1726:1;1722:10;1718:2;1714:19;1710:28;1707:41;1704:61;;;1761:1;1758;1751:12;1704:61;1783:1;1774:10;;1793:231;1807:2;1804:1;1801:9;1793:231;;;1871:3;1865:10;1888:31;1913:5;1888:31;:::i;:::-;1932:18;;1825:1;1818:9;;;;;1970:12;;;;2002;;1793:231;;;-1:-1:-1;2043:5:1;1087:967;-1:-1:-1;;;;;;;1087:967:1:o;2059:241::-;2115:6;2168:2;2156:9;2147:7;2143:23;2139:32;2136:52;;;2184:1;2181;2174:12;2136:52;2223:9;2210:23;2242:28;2264:5;2242:28;:::i;2305:245::-;2372:6;2425:2;2413:9;2404:7;2400:23;2396:32;2393:52;;;2441:1;2438;2431:12;2393:52;2473:9;2467:16;2492:28;2514:5;2492:28;:::i;2826:839::-;2985:6;2993;3001;3009;3017;3070:3;3058:9;3049:7;3045:23;3041:33;3038:53;;;3087:1;3084;3077:12;3038:53;3119:9;3113:16;3138:31;3163:5;3138:31;:::i;:::-;3238:2;3223:18;;3217:25;3188:5;;-1:-1:-1;3251:33:1;3217:25;3251:33;:::i;:::-;3355:2;3340:18;;3334:25;3303:7;;-1:-1:-1;3368:33:1;3334:25;3368:33;:::i;:::-;3472:2;3457:18;;3451:25;3420:7;;-1:-1:-1;3485:33:1;3451:25;3485:33;:::i;:::-;3589:3;3574:19;;3568:26;3537:7;;-1:-1:-1;3603:30:1;3568:26;3603:30;:::i;:::-;3652:7;3642:17;;;2826:839;;;;;;;;:::o;3670:772::-;3801:6;3809;3817;3825;3833;3886:3;3874:9;3865:7;3861:23;3857:33;3854:53;;;3903:1;3900;3893:12;3854:53;3942:9;3929:23;3961:31;3986:5;3961:31;:::i;:::-;4011:5;-1:-1:-1;4068:2:1;4053:18;;4040:32;4081:33;4040:32;4081:33;:::i;:::-;4133:7;-1:-1:-1;4192:2:1;4177:18;;4164:32;4205:31;4164:32;4205:31;:::i;:::-;4255:7;-1:-1:-1;4314:2:1;4299:18;;4286:32;4327:31;4286:32;4327:31;:::i;:::-;3670:772;;;;-1:-1:-1;3670:772:1;;4431:3;4416:19;4403:33;;3670:772;-1:-1:-1;;3670:772:1:o;4447:1052::-;4605:6;4613;4621;4629;4637;4645;4653;4661;4714:3;4702:9;4693:7;4689:23;4685:33;4682:53;;;4731:1;4728;4721:12;4682:53;4770:9;4757:23;4789:31;4814:5;4789:31;:::i;:::-;4839:5;-1:-1:-1;4896:2:1;4881:18;;4868:32;4909:33;4868:32;4909:33;:::i;:::-;4961:7;-1:-1:-1;5020:2:1;5005:18;;4992:32;5033:31;4992:32;5033:31;:::i;:::-;5083:7;-1:-1:-1;5142:2:1;5127:18;;5114:32;5155:31;5114:32;5155:31;:::i;:::-;5205:7;-1:-1:-1;5259:3:1;5244:19;;5231:33;;-1:-1:-1;5311:3:1;5296:19;;5283:33;;-1:-1:-1;5368:3:1;5353:19;;5340:33;5382;5340;5382;:::i;:::-;5434:7;5424:17;;;5488:3;5477:9;5473:19;5460:33;5450:43;;4447:1052;;;;;;;;;;;:::o;5504:610::-;5606:6;5614;5622;5630;5683:3;5671:9;5662:7;5658:23;5654:33;5651:53;;;5700:1;5697;5690:12;5651:53;5739:9;5726:23;5758:31;5783:5;5758:31;:::i;:::-;5808:5;-1:-1:-1;5865:2:1;5850:18;;5837:32;5878:31;5837:32;5878:31;:::i;:::-;5928:7;-1:-1:-1;5987:2:1;5972:18;;5959:32;6000:31;5959:32;6000:31;:::i;:::-;5504:610;;;;-1:-1:-1;6050:7:1;;6104:2;6089:18;6076:32;;-1:-1:-1;;5504:610:1:o;6119:890::-;6248:6;6256;6264;6272;6280;6288;6296;6349:3;6337:9;6328:7;6324:23;6320:33;6317:53;;;6366:1;6363;6356:12;6317:53;6405:9;6392:23;6424:31;6449:5;6424:31;:::i;:::-;6474:5;-1:-1:-1;6531:2:1;6516:18;;6503:32;6544:31;6503:32;6544:31;:::i;:::-;6594:7;-1:-1:-1;6653:2:1;6638:18;;6625:32;6666:31;6625:32;6666:31;:::i;:::-;6716:7;-1:-1:-1;6770:2:1;6755:18;;6742:32;;-1:-1:-1;6821:3:1;6806:19;;6793:33;;-1:-1:-1;6878:3:1;6863:19;;6850:33;6892;6850;6892;:::i;:::-;6944:7;6934:17;;;6998:3;6987:9;6983:19;6970:33;6960:43;;6119:890;;;;;;;;;;:::o;7014:450::-;7101:6;7109;7117;7170:2;7158:9;7149:7;7145:23;7141:32;7138:52;;;7186:1;7183;7176:12;7138:52;7209:40;7239:9;7209:40;:::i;:::-;7199:50;;7268:49;7313:2;7302:9;7298:18;7268:49;:::i;:::-;7258:59;;7360:2;7349:9;7345:18;7339:25;7404:10;7397:5;7393:22;7386:5;7383:33;7373:61;;7430:1;7427;7420:12;7373:61;7453:5;7443:15;;;7014:450;;;;;:::o;7469:184::-;7539:6;7592:2;7580:9;7571:7;7567:23;7563:32;7560:52;;;7608:1;7605;7598:12;7560:52;-1:-1:-1;7631:16:1;;7469:184;-1:-1:-1;7469:184:1:o;7658:709::-;7771:6;7779;7787;7795;7803;7856:3;7844:9;7835:7;7831:23;7827:33;7824:53;;;7873:1;7870;7863:12;7824:53;7909:9;7896:23;7886:33;;7970:2;7959:9;7955:18;7942:32;7997:18;7989:6;7986:30;7983:50;;;8029:1;8026;8019:12;7983:50;8068:70;8130:7;8121:6;8110:9;8106:22;8068:70;:::i;:::-;8157:8;;-1:-1:-1;8042:96:1;-1:-1:-1;;8242:2:1;8227:18;;8214:32;8255:31;8214:32;8255:31;:::i;:::-;7658:709;;;;-1:-1:-1;7658:709:1;;8357:2;8342:18;8329:32;;7658:709;-1:-1:-1;;7658:709:1:o;8372:1045::-;8465:6;8473;8526:2;8514:9;8505:7;8501:23;8497:32;8494:52;;;8542:1;8539;8532:12;8494:52;8578:9;8565:23;8555:33;;8607:2;8660;8649:9;8645:18;8632:32;8687:18;8679:6;8676:30;8673:50;;;8719:1;8716;8709:12;8673:50;8742:22;;8795:4;8787:13;;8783:27;-1:-1:-1;8773:55:1;;8824:1;8821;8814:12;8773:55;8860:2;8847:16;8883:60;8899:43;8939:2;8899:43;:::i;8883:60::-;8965:3;8989:2;8984:3;8977:15;9017:2;9012:3;9008:12;9001:19;;9048:2;9044;9040:11;9096:7;9091:2;9085;9082:1;9078:10;9074:2;9070:19;9066:28;9063:41;9060:61;;;9117:1;9114;9107:12;9060:61;9139:1;9130:10;;9149:238;9163:2;9160:1;9157:9;9149:238;;;9234:3;9221:17;9251:31;9276:5;9251:31;:::i;:::-;9295:18;;9181:1;9174:9;;;;;9333:12;;;;9365;;9149:238;;;9153:3;9406:5;9396:15;;;;;;;8372:1045;;;;;:::o;10161:778::-;10283:6;10291;10299;10307;10315;10323;10376:3;10364:9;10355:7;10351:23;10347:33;10344:53;;;10393:1;10390;10383:12;10344:53;10429:9;10416:23;10406:33;;10486:2;10475:9;10471:18;10458:32;10448:42;;10541:2;10530:9;10526:18;10513:32;10568:18;10560:6;10557:30;10554:50;;;10600:1;10597;10590:12;10554:50;10639:70;10701:7;10692:6;10681:9;10677:22;10639:70;:::i;:::-;10728:8;;-1:-1:-1;10613:96:1;-1:-1:-1;;10813:2:1;10798:18;;10785:32;10826:31;10785:32;10826:31;:::i;:::-;10876:5;10866:15;;;10928:3;10917:9;10913:19;10900:33;10890:43;;10161:778;;;;;;;;:::o;11752:316::-;11829:6;11837;11845;11898:2;11886:9;11877:7;11873:23;11869:32;11866:52;;;11914:1;11911;11904:12;11866:52;-1:-1:-1;;11937:23:1;;;12007:2;11992:18;;11979:32;;-1:-1:-1;12058:2:1;12043:18;;;12030:32;;11752:316;-1:-1:-1;11752:316:1:o;12073:247::-;12141:6;12194:2;12182:9;12173:7;12169:23;12165:32;12162:52;;;12210:1;12207;12200:12;12162:52;12242:9;12236:16;12261:29;12284:5;12261:29;:::i;12325:435::-;12378:3;12416:5;12410:12;12443:6;12438:3;12431:19;12469:4;12498:2;12493:3;12489:12;12482:19;;12535:2;12528:5;12524:14;12556:1;12566:169;12580:6;12577:1;12574:13;12566:169;;;12641:13;;12629:26;;12675:12;;;;12710:15;;;;12602:1;12595:9;12566:169;;;-1:-1:-1;12751:3:1;;12325:435;-1:-1:-1;;;;;12325:435:1:o;12765:257::-;12806:3;12844:5;12838:12;12871:6;12866:3;12859:19;12887:63;12943:6;12936:4;12931:3;12927:14;12920:4;12913:5;12909:16;12887:63;:::i;:::-;13004:2;12983:15;-1:-1:-1;;12979:29:1;12970:39;;;;13011:4;12966:50;;12765:257;-1:-1:-1;;12765:257:1:o;13027:274::-;13156:3;13194:6;13188:13;13210:53;13256:6;13251:3;13244:4;13236:6;13232:17;13210:53;:::i;:::-;13279:16;;;;;13027:274;-1:-1:-1;;13027:274:1:o;14482:261::-;14661:2;14650:9;14643:21;14624:4;14681:56;14733:2;14722:9;14718:18;14710:6;14681:56;:::i;14748:342::-;14949:2;14938:9;14931:21;14912:4;14969:56;15021:2;15010:9;15006:18;14998:6;14969:56;:::i;:::-;14961:64;;15075:6;15068:14;15061:22;15056:2;15045:9;15041:18;15034:50;14748:342;;;;;:::o;15095:411::-;15338:2;15327:9;15320:21;15301:4;15358:56;15410:2;15399:9;15395:18;15387:6;15358:56;:::i;:::-;15445:2;15430:18;;15423:34;;;;-1:-1:-1;15488:2:1;15473:18;15466:34;15350:64;15095:411;-1:-1:-1;15095:411:1:o;15511:219::-;15660:2;15649:9;15642:21;15623:4;15680:44;15720:2;15709:9;15705:18;15697:6;15680:44;:::i;16085:350::-;16287:2;16269:21;;;16326:2;16306:18;;;16299:30;16365:28;16360:2;16345:18;;16338:56;16426:2;16411:18;;16085:350::o;17138:404::-;17340:2;17322:21;;;17379:2;17359:18;;;17352:30;17418:34;17413:2;17398:18;;17391:62;-1:-1:-1;;;17484:2:1;17469:18;;17462:38;17532:3;17517:19;;17138:404::o;18372:345::-;18574:2;18556:21;;;18613:2;18593:18;;;18586:30;-1:-1:-1;;;18647:2:1;18632:18;;18625:51;18708:2;18693:18;;18372:345::o;18722:352::-;18924:2;18906:21;;;18963:2;18943:18;;;18936:30;19002;18997:2;18982:18;;18975:58;19065:2;19050:18;;18722:352::o;19079:400::-;19281:2;19263:21;;;19320:2;19300:18;;;19293:30;19359:34;19354:2;19339:18;;19332:62;-1:-1:-1;;;19425:2:1;19410:18;;19403:34;19469:3;19454:19;;19079:400::o;23550:458::-;23781:6;23770:9;23763:25;23824:6;23819:2;23808:9;23804:18;23797:34;23896:1;23892;23887:3;23883:11;23879:19;23871:6;23867:32;23862:2;23851:9;23847:18;23840:60;23936:3;23931:2;23920:9;23916:18;23909:31;23744:4;23957:45;23997:3;23986:9;23982:19;23974:6;23957:45;:::i;25685:521::-;25762:4;25768:6;25828:11;25815:25;25922:2;25918:7;25907:8;25891:14;25887:29;25883:43;25863:18;25859:68;25849:96;;25941:1;25938;25931:12;25849:96;25968:33;;26020:20;;;-1:-1:-1;26063:18:1;26052:30;;26049:50;;;26095:1;26092;26085:12;26049:50;26128:4;26116:17;;-1:-1:-1;26159:14:1;26155:27;;;26145:38;;26142:58;;;26196:1;26193;26186:12;26211:322;26302:4;26360:11;26347:25;26454:2;26450:7;26439:8;26423:14;26419:29;26415:43;26395:18;26391:68;26381:96;;26473:1;26470;26463:12;26538:275;26609:2;26603:9;26674:2;26655:13;;-1:-1:-1;;26651:27:1;26639:40;;26709:18;26694:34;;26730:22;;;26691:62;26688:88;;;26756:18;;:::i;:::-;26792:2;26785:22;26538:275;;-1:-1:-1;26538:275:1:o;26818:183::-;26878:4;26911:18;26903:6;26900:30;26897:56;;;26933:18;;:::i;:::-;-1:-1:-1;26978:1:1;26974:14;26990:4;26970:25;;26818:183::o;27006:128::-;27046:3;27077:1;27073:6;27070:1;27067:13;27064:39;;;27083:18;;:::i;:::-;-1:-1:-1;27119:9:1;;27006:128::o;27139:217::-;27179:1;27205;27195:132;;27249:10;27244:3;27240:20;27237:1;27230:31;27284:4;27281:1;27274:15;27312:4;27309:1;27302:15;27195:132;-1:-1:-1;27341:9:1;;27139:217::o;27361:168::-;27401:7;27467:1;27463;27459:6;27455:14;27452:1;27449:21;27444:1;27437:9;27430:17;27426:45;27423:71;;;27474:18;;:::i;:::-;-1:-1:-1;27514:9:1;;27361:168::o;27534:125::-;27574:4;27602:1;27599;27596:8;27593:34;;;27607:18;;:::i;:::-;-1:-1:-1;27644:9:1;;27534:125::o;27664:258::-;27736:1;27746:113;27760:6;27757:1;27754:13;27746:113;;;27836:11;;;27830:18;27817:11;;;27810:39;27782:2;27775:10;27746:113;;;27877:6;27874:1;27871:13;27868:48;;;-1:-1:-1;;27912:1:1;27894:16;;27887:27;27664:258::o;27927:136::-;27966:3;27994:5;27984:39;;28003:18;;:::i;:::-;-1:-1:-1;;;28039:18:1;;27927:136::o;28068:135::-;28107:3;-1:-1:-1;;28128:17:1;;28125:43;;;28148:18;;:::i;:::-;-1:-1:-1;28195:1:1;28184:13;;28068:135::o;28208:127::-;28269:10;28264:3;28260:20;28257:1;28250:31;28300:4;28297:1;28290:15;28324:4;28321:1;28314:15;28340:127;28401:10;28396:3;28392:20;28389:1;28382:31;28432:4;28429:1;28422:15;28456:4;28453:1;28446:15;28472:127;28533:10;28528:3;28524:20;28521:1;28514:31;28564:4;28561:1;28554:15;28588:4;28585:1;28578:15;28604:131;-1:-1:-1;;;;;28679:31:1;;28669:42;;28659:70;;28725:1;28722;28715:12;28659:70;28604:131;:::o;28740:118::-;28826:5;28819:13;28812:21;28805:5;28802:32;28792:60;;28848:1;28845;28838:12;28863:114;28947:4;28940:5;28936:16;28929:5;28926:27;28916:55;;28967:1;28964;28957:12
Swarm Source
ipfs://c1b9b93b5890006555202f0f9817bdfdb929081c6e0bd36a86da4a459b66c443
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 ]
[ 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.