Contract Overview
Balance:
0 MOVR
MOVR Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
SwapRouterV1
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2022-05-30 */ // 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); 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 ) 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.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: 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 v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/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 ); } } 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); } }
[{"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
60806040523480156200001157600080fd5b50604051620045fa380380620045fa833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b61452f80620000cb6000396000f3fe60806040526004361061012e5760003560e01c80638803dbee116100ab578063c45a01551161006f578063c45a01551461032f578063cd1bd0d91461034f578063d06ca61f14610362578063d74fff4e14610382578063dcff1b94146103a2578063f85b7c8b146103c257600080fd5b80638803dbee1461029c5780638a311c57146102bc5780639be7614d146102dc5780639d9270a8146102ef578063b56527bd1461030f57600080fd5b8063419591ed116100f2578063419591ed146102115780634b1d08ca146102495780636dc9c4981461025c578063798af7201461027c57806385f8c2591461015157600080fd5b8063054d50d4146101515780631f00ca74146101845780633214b8c9146101b1578063357b32f0146101d157806338ed1739146101f157600080fd5b3661014c576001546001600160a01b0316331461014a57600080fd5b005b600080fd5b34801561015d57600080fd5b5061017161016c3660046140aa565b6103e2565b6040519081526020015b60405180910390f35b34801561019057600080fd5b506101a461019f366004613f8a565b6103f9565b60405161017b919061414a565b3480156101bd57600080fd5b506101716101cc366004613d19565b61041c565b3480156101dd57600080fd5b506101716101ec366004613e5c565b61063b565b3480156101fd57600080fd5b506101a461020c366004614037565b6107ab565b34801561021d57600080fd5b50600154610231906001600160a01b031681565b6040516001600160a01b03909116815260200161017b565b610171610257366004613f23565b61095c565b34801561026857600080fd5b50610171610277366004614037565b610b4a565b34801561028857600080fd5b50610171610297366004613e0b565b610de0565b3480156102a857600080fd5b506101a46102b7366004614037565b610e6c565b3480156102c857600080fd5b506101716102d7366004613d19565b610f15565b6101a46102ea366004613f23565b611216565b3480156102fb57600080fd5b5061017161030a366004614037565b611526565b34801561031b57600080fd5b5061017161032a366004613d7d565b611637565b34801561033b57600080fd5b50600054610231906001600160a01b031681565b6101a461035d366004613f23565b6117a1565b34801561036e57600080fd5b506101a461037d366004613f8a565b611a3a565b34801561038e57600080fd5b5061017161039d366004613d7d565b611a54565b3480156103ae57600080fd5b506101a46103bd366004614037565b611b4d565b3480156103ce57600080fd5b506101a46103dd366004614037565b611d78565b60006103ef848484611e87565b90505b9392505050565b600054606090610413906001600160a01b03168484611f8b565b90505b92915050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104909190613ba7565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b1580156104d757600080fd5b505afa1580156104eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050f91906140d6565b90508360ff808316908816146105ab5760405163a95b089f60e01b815260ff808916600483015283166024820152604481018690526001600160a01b038a169063a95b089f9060640160206040518083038186803b15801561057057600080fd5b505afa158015610584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a89190613f0a565b90505b60405163342a87a160e01b81526004810182905260ff871660248201526001600160a01b0389169063342a87a19060440160206040518083038186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062c9190613f0a565b93505050505b95945050505050565b600081428110156106675760405162461bcd60e51b815260040161065e90614258565b60405180910390fd5b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b1580156106ab57600080fd5b505afa1580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190613ba7565b90506106fa6001600160a01b03821633308a612118565b6107088a8a8a8a8a89612189565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240160206040518083038186803b15801561074f57600080fd5b505afa158015610763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107879190613ba7565b905061079d6001600160a01b03821687866122c2565b505050979650505050505050565b606081428110156107ce5760405162461bcd60e51b815260040161065e90614258565b6000546040805160208089028281018201909352888252610818936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b915086826001845161082a919061440d565b8151811061083a5761083a614498565b602002602001015110156108605760405162461bcd60e51b815260040161065e90614210565b6109128686600081811061087657610876614498565b905060200201602081019061088b9190613b8a565b6000805433916108f2916001600160a01b0316908b908b90816108b0576108b0614498565b90506020020160208101906108c59190613b8a565b8b8b60018181106108d8576108d8614498565b90506020020160208101906108ed9190613b8a565b612464565b8560008151811061090557610905614498565b60200260200101516124e9565b61095182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b509695505050505050565b6000814281101561097f5760405162461bcd60e51b815260040161065e90614258565b8585600081811061099257610992614498565b90506020028101906109a49190614349565b6109b2906020810190613c6a565b156109cf5760405162461bcd60e51b815260040161065e90614287565b6000610a41878760008181106109e7576109e7614498565b90506020028101906109f99190614349565b610a07906020810190614302565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127de92505050565b600081518110610a5357610a53614498565b60209081029190910101516001549091506001600160a01b03808316911614610a8e5760405162461bcd60e51b815260040161065e90614287565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b50505050506000610b0682348a8a896127f4565b9450905088841015610b2a5760405162461bcd60e51b815260040161065e90614210565b610b3e6001600160a01b03821687866122c2565b50505095945050505050565b60008142811015610b6d5760405162461bcd60e51b815260040161065e90614258565b8585610b7a60018261440d565b818110610b8957610b89614498565b9050602002810190610b9b9190614349565b610ba9906020810190613c6a565b15610bc65760405162461bcd60e51b815260040161065e90614287565b6000610be78787610bd860018261440d565b8181106109e7576109e7614498565b6001805482519293506001600160a01b0316918391610c059161440d565b81518110610c1557610c15614498565b60200260200101516001600160a01b031614610c435760405162461bcd60e51b815260040161065e90614287565b600087876000818110610c5857610c58614498565b9050602002810190610c6a9190614349565b610c78906020810190613c6a565b15610cf857610ced88886000818110610c9357610c93614498565b9050602002810190610ca59190614349565b610cb3906020810190614302565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129ab92505050565b604001519050610d2b565b610d0e888860008181106109e7576109e7614498565b600081518110610d2057610d20614498565b602002602001015190505b610d378133308d6124e9565b6000610d46828c8b8b8a6127f4565b9550905089851015610d6a5760405162461bcd60e51b815260040161065e90614210565b600154604051632e1a7d4d60e01b8152600481018790526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b50505050610dd28786612a36565b505050509695505050505050565b60405163a95b089f60e01b815260ff808516600483015283166024820152604481018290526000906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610e3457600080fd5b505afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190613f0a565b60608142811015610e8f5760405162461bcd60e51b815260040161065e90614258565b6000546040805160208089028281018201909352888252610ed9936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110610eef57610eef614498565b602002602001015111156108605760405162461bcd60e51b815260040161065e906142be565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5157600080fd5b505afa158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190613ba7565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100891906140d6565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561104557600080fd5b505afa158015611059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107d9190613f0a565b67ffffffffffffffff811115611095576110956144ae565b6040519080825280602002602001820160405280156110be578160200160208202803683370190505b50905084818860ff16815181106110d7576110d7614498565b6020908102919091010152604051637355940360e11b81526000906001600160a01b038a169063e6ab28069061111490859060019060040161415d565b60206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190613f0a565b90508660ff168360ff16141561117f57935061063292505050565b60405163a95b089f60e01b815260ff808516600483015288166024820152604481018290526001600160a01b038b169063a95b089f9060640160206040518083038186803b1580156111d057600080fd5b505afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190613f0a565b9a9950505050505050505050565b606081428110156112395760405162461bcd60e51b815260040161065e90614258565b6001546001600160a01b0316868660008161125657611256614498565b905060200201602081019061126b9190613b8a565b6001600160a01b0316146112915760405162461bcd60e51b815260040161065e906141d9565b60005460408051602080890282810182019093528882526112db936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611f8b92505050565b915034826000815181106112f1576112f1614498565b602002602001015111156113175760405162461bcd60e51b815260040161065e906142be565b60015482516001600160a01b039091169063d0e30db090849060009061133f5761133f614498565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561137257600080fd5b505af1158015611386573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506113e59350909116908a908a90816113bd576113bd614498565b90506020020160208101906113d29190613b8a565b8a8a60018181106108d8576108d8614498565b846000815181106113f8576113f8614498565b60200260200101516040518363ffffffff1660e01b81526004016114319291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114839190613c87565b61148c57600080fd5b6114cb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b816000815181106114de576114de614498565b602002602001015134111561151c5761151c338360008151811061150457611504614498565b602002602001015134611517919061440d565b612a36565b5095945050505050565b600081428110156115495760405162461bcd60e51b815260040161065e90614258565b60008686600081811061155e5761155e614498565b90506020028101906115709190614349565b61157e906020810190613c6a565b156115a45761159987876000818110610c9357610c93614498565b6040015190506115d7565b6115ba878760008181106109e7576109e7614498565b6000815181106115cc576115cc614498565b602002602001015190505b6115e38133308c6124e9565b60006115f2828b8a8a896127f4565b94509050888410156116165760405162461bcd60e51b815260040161065e90614210565b61162a6001600160a01b03821687866122c2565b5050509695505050505050565b6000814281101561165a5760405162461bcd60e51b815260040161065e90614258565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190613ba7565b90506116ed6001600160a01b03821633308a612118565b6116fc8b8b8b8b8b8b8a612b2c565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038d16906382b86600906024015b60206040518083038186803b15801561174457600080fd5b505afa158015611758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177c9190613ba7565b90506117926001600160a01b03821687866122c2565b50505098975050505050505050565b606081428110156117c45760405162461bcd60e51b815260040161065e90614258565b6001546001600160a01b031686866000816117e1576117e1614498565b90506020020160208101906117f69190613b8a565b6001600160a01b03161461181c5760405162461bcd60e51b815260040161065e906141d9565b6000546040805160208089028281018201909352888252611866936001600160a01b0316923492918b918b918291908501908490808284376000920191909152506122f792505050565b9150868260018451611878919061440d565b8151811061188857611888614498565b602002602001015110156118ae5760405162461bcd60e51b815260040161065e90614210565b60015482516001600160a01b039091169063d0e30db09084906000906118d6576118d6614498565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506119549350909116908a908a90816113bd576113bd614498565b8460008151811061196757611967614498565b60200260200101516040518363ffffffff1660e01b81526004016119a09291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f29190613c87565b6119fb57600080fd5b61151c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b600054606090610413906001600160a01b031684846122f7565b60008142811015611a775760405162461bcd60e51b815260040161065e90614258565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015611abb57600080fd5b505afa158015611acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af39190613ba7565b9050611b0a6001600160a01b03821633308a612118565b611b198b8b8b8b8b8b8a612e48565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240161172c565b60608142811015611b705760405162461bcd60e51b815260040161065e90614258565b600180546001600160a01b03169087908790611b8c908261440d565b818110611b9b57611b9b614498565b9050602002016020810190611bb09190613b8a565b6001600160a01b031614611bd65760405162461bcd60e51b815260040161065e906141d9565b6000546040805160208089028281018201909352888252611c20936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b9150868260018451611c32919061440d565b81518110611c4257611c42614498565b60200260200101511015611c685760405162461bcd60e51b815260040161065e90614210565b611c7e8686600081811061087657610876614498565b611cbd82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612627915050565b6001805483516001600160a01b0390911691632e1a7d4d918591611ce09161440d565b81518110611cf057611cf0614498565b60200260200101516040518263ffffffff1660e01b8152600401611d1691815260200190565b600060405180830381600087803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505050610951848360018551611d5b919061440d565b81518110611d6b57611d6b614498565b6020026020010151612a36565b60608142811015611d9b5760405162461bcd60e51b815260040161065e90614258565b600180546001600160a01b03169087908790611db7908261440d565b818110611dc657611dc6614498565b9050602002016020810190611ddb9190613b8a565b6001600160a01b031614611e015760405162461bcd60e51b815260040161065e906141d9565b6000546040805160208089028281018201909352888252611e4b936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110611e6157611e61614498565b60200260200101511115611c685760405162461bcd60e51b815260040161065e906142be565b6000808411611ee25760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b606482015260840161065e565b600083118015611ef25750600082115b611f3e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b6000611f4c856103e5613011565b90506000611f5a8285613011565b90506000611f7483611f6e886103e8613011565b90613078565b9050611f8081836143cc565b979650505050505050565b6060600282511015611fd65760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff811115611ff057611ff06144ae565b604051908082528060200260200182016040528015612019578160200160208202803683370190505b50905082816001835161202c919061440d565b8151811061203c5761203c614498565b602002602001018181525050600060018351612058919061440d565b90505b8015612110576000806120ab878661207460018761440d565b8151811061208457612084614498565b602002602001015187868151811061209e5761209e614498565b60200260200101516130cd565b915091506120d38484815181106120c4576120c4614498565b602002602001015183836131a4565b846120df60018661440d565b815181106120ef576120ef614498565b6020026020010181815250505050808061210890614450565b91505061205b565b509392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121839085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526132a3565b50505050565b60405162415c3360e91b815260ff8616600482015260009081906001600160a01b038916906382b866009060240160206040518083038186803b1580156121cf57600080fd5b505afa1580156121e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122079190613ba7565b905061221d6001600160a01b0382168987613375565b6040516348b4aac360e11b815260ff8089166004830152871660248201526044810186905260648101859052608481018490526001600160a01b0389169063916955869060a401602060405180830381600087803b15801561227e57600080fd5b505af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190613f0a565b98975050505050505050565b6040516001600160a01b0383166024820152604481018290526122f290849063a9059cbb60e01b9060640161214c565b505050565b60606002825110156123425760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff81111561235c5761235c6144ae565b604051908082528060200260200182016040528015612385578160200160208202803683370190505b509050828160008151811061239c5761239c614498565b60200260200101818152505060005b600183516123b9919061440d565b811015612110576000806123ff878685815181106123d9576123d9614498565b6020026020010151878660016123ef91906143b4565b8151811061209e5761209e614498565b9150915061242784848151811061241857612418614498565b60200260200101518383611e87565b846124338560016143b4565b8151811061244357612443614498565b6020026020010181815250505050808061245c90614467565b9150506123ab565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b1580156124b157600080fd5b505afa1580156124c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190613ba7565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161254d919061412e565b6000604051808303816000865af19150503d806000811461258a576040519150601f19603f3d011682016040523d82523d6000602084013e61258f565b606091505b50915091508180156125b95750805115806125b95750808060200190518101906125b99190613c87565b61261f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b606482015260840161065e565b505050505050565b60005b60018351612638919061440d565b8110156121835760008084838151811061265457612654614498565b60200260200101518584600161266a91906143b4565b8151811061267a5761267a614498565b60200260200101519150915060006126928383613436565b5090506000876126a38660016143b4565b815181106126b3576126b3614498565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146126e1578260006126e5565b6000835b91509150600060028a516126f9919061440d565b8810612705578861273f565b60005461273f906001600160a01b0316878c6127228c60026143b4565b8151811061273257612732614498565b6020026020010151612464565b600054909150612759906001600160a01b03168888612464565b6040516336cd320560e11b815260048101859052602481018490526001600160a01b0383811660448301529190911690636d9a640a90606401600060405180830381600087803b1580156127ac57600080fd5b505af11580156127c0573d6000803e3d6000fd5b505050505050505050505080806127d690614467565b91505061262a565b6060818060200190518101906104169190613bc4565b848460005b848110156129a05785858281811061281357612813614498565b90506020028101906128259190614349565b612833906020810190613c6a565b15612870576128668287878481811061284e5761284e614498565b90506020028101906128609190614349565b86613517565b909350915061298e565b60006128878787848181106109e7576109e7614498565b90508060018251612898919061440d565b815181106128a8576128a8614498565b6020026020010151935060006128d260008054906101000a90046001600160a01b031685846122f7565b9050612957826000815181106128ea576128ea614498565b602002602001015161293760008054906101000a90046001600160a01b03168560008151811061291c5761291c614498565b60200260200101518660018151811061273257612732614498565b8360008151811061294a5761294a614498565b602002602001015161389e565b612962818330612627565b8060018251612971919061440d565b8151811061298157612981614498565b6020026020010151935050505b8061299881614467565b9150506127f9565b509550959350505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526000806000806000868060200190518101906129f29190613ca4565b6040805160a0810182526001600160a01b03968716815294861660208601529285169284019290925290921660608201529015156080820152979650505050505050565b604080516000808252602082019092526001600160a01b038416908390604051612a60919061412e565b60006040518083038185875af1925050503d8060008114612a9d576040519150601f19603f3d011682016040523d82523d6000602084013e612aa2565b606091505b50509050806122f25760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a40161065e565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b6857600080fd5b505afa158015612b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba09190613ba7565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612be757600080fd5b505afa158015612bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1f91906140d6565b90506000896001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612c5c57600080fd5b505afa158015612c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c949190613f0a565b67ffffffffffffffff811115612cac57612cac6144ae565b604051908082528060200260200182016040528015612cd5578160200160208202803683370190505b50905086818a60ff1681518110612cee57612cee614498565b602090810291909101015260405162415c3360e91b815260ff8a1660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015612d3d57600080fd5b505afa158015612d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d759190613ba7565b9050612d8b6001600160a01b0382168c8a613375565b604051634d49e87d60e01b81526000906001600160a01b038d1690634d49e87d90612dbe90869085908c90600401614181565b602060405180830381600087803b158015612dd857600080fd5b505af1158015612dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e109190613f0a565b90508960ff168460ff1614612e3457612e2d8d858c848c8c612189565b9550612e38565b8095505b5050505050979650505050505050565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8457600080fd5b505afa158015612e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebc9190613ba7565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612f0357600080fd5b505afa158015612f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3b91906140d6565b90508560ff808316908a1614612f5d57612f5a8b8a848a60008a612189565b90505b612f716001600160a01b0384168b83613375565b6040516301f1d0ab60e51b81526004810182905260ff8916602482015260448101879052606481018690526001600160a01b038b1690633e3a156090608401602060405180830381600087803b158015612fca57600080fd5b505af1158015612fde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130029190613f0a565b9b9a5050505050505050505050565b60008115806130355750828261302781836143ee565b925061303390836143cc565b145b6104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161065e565b60008261308583826143b4565b91508110156104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161065e565b60008060006130dc8585613436565b5090506000806130ed888888612464565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401604080518083038186803b15801561312457600080fd5b505afa158015613138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315c9190613ed7565b6001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613192578082613195565b81815b90999098509650505050505050565b60008084116132005760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b606482015260840161065e565b6000831180156132105750600082115b61325c5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b60006132746103e861326e8688613011565b90613011565b905060006132886103e561326e86896139cf565b90506132996001611f6e83856143cc565b9695505050505050565b60006132f8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a259092919063ffffffff16565b8051909150156122f257808060200190518101906133169190613c87565b6122f25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190613f0a565b61340391906143b4565b6040516001600160a01b03851660248201526044810182905290915061218390859063095ea7b360e01b9060640161214c565b600080826001600160a01b0316846001600160a01b0316141561349b5760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f4144445245535345530000000000604482015260640161065e565b826001600160a01b0316846001600160a01b0316106134bb5782846134be565b83835b90925090506001600160a01b0382166135105760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b604482015260640161065e565b9250929050565b6000808061352b610cb36020870187614302565b606081015160208201519094509091506001600160a01b031661365d57805160408083015190516319b02f4960e21b81526001600160a01b03918216600482015261365692918216906366c0bd249060240160206040518083038186803b15801561359557600080fd5b505afa1580156135a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cd91906140d6565b835160608501516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561361557600080fd5b505afa158015613629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364d91906140d6565b89600089612189565b9150613895565b80608001511561377b578051602082015160408084015190516319b02f4960e21b81526001600160a01b0391821660048201526136569392918216906366c0bd249060240160206040518083038186803b1580156136ba57600080fd5b505afa1580156136ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136f291906140d6565b845160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561373a57600080fd5b505afa15801561374e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377291906140d6565b8a60008a612b2c565b8051602082015160408084015190516319b02f4960e21b81526001600160a01b0391821660048201526138929392918316906366c0bd249060240160206040518083038186803b1580156137ce57600080fd5b505afa1580156137e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061380691906140d6565b602085015160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561385157600080fd5b505afa158015613865573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388991906140d6565b8a60008a612e48565b91505b50935093915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916138fa919061412e565b6000604051808303816000865af19150503d8060008114613937576040519150601f19603f3d011682016040523d82523d6000602084013e61393c565b606091505b50915091508180156139665750805115806139665750808060200190518101906139669190613c87565b6139c85760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161065e565b5050505050565b6000826139dc838261440d565b91508111156104165760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161065e565b60606103ef8484600085856001600160a01b0385163b613a875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065e565b600080866001600160a01b03168587604051613aa3919061412e565b60006040518083038185875af1925050503d8060008114613ae0576040519150601f19603f3d011682016040523d82523d6000602084013e613ae5565b606091505b5091509150611f8082828660608315613aff5750816103f2565b825115613b0f5782518084602001fd5b8160405162461bcd60e51b815260040161065e91906141a6565b60008083601f840112613b3b57600080fd5b50813567ffffffffffffffff811115613b5357600080fd5b6020830191508360208260051b850101111561351057600080fd5b80516001600160701b0381168114613b8557600080fd5b919050565b600060208284031215613b9c57600080fd5b81356103f2816144c4565b600060208284031215613bb957600080fd5b81516103f2816144c4565b60006020808385031215613bd757600080fd5b825167ffffffffffffffff811115613bee57600080fd5b8301601f81018513613bff57600080fd5b8051613c12613c0d82614390565b61435f565b80828252848201915084840188868560051b8701011115613c3257600080fd5b600094505b83851015613c5e578051613c4a816144c4565b835260019490940193918501918501613c37565b50979650505050505050565b600060208284031215613c7c57600080fd5b81356103f2816144dc565b600060208284031215613c9957600080fd5b81516103f2816144dc565b600080600080600060a08688031215613cbc57600080fd5b8551613cc7816144c4565b6020870151909550613cd8816144c4565b6040870151909450613ce9816144c4565b6060870151909350613cfa816144c4565b6080870151909250613d0b816144dc565b809150509295509295909350565b600080600080600060a08688031215613d3157600080fd5b8535613d3c816144c4565b94506020860135613d4c816144c4565b93506040860135613d5c816144ea565b92506060860135613d6c816144ea565b949793965091946080013592915050565b600080600080600080600080610100898b031215613d9a57600080fd5b8835613da5816144c4565b97506020890135613db5816144c4565b96506040890135613dc5816144ea565b95506060890135613dd5816144ea565b94506080890135935060a0890135925060c0890135613df3816144c4565b8092505060e089013590509295985092959890939650565b60008060008060808587031215613e2157600080fd5b8435613e2c816144c4565b93506020850135613e3c816144ea565b92506040850135613e4c816144ea565b9396929550929360600135925050565b600080600080600080600060e0888a031215613e7757600080fd5b8735613e82816144c4565b96506020880135613e92816144ea565b95506040880135613ea2816144ea565b9450606088013593506080880135925060a0880135613ec0816144c4565b8092505060c0880135905092959891949750929550565b60008060408385031215613eea57600080fd5b613ef383613b6e565b9150613f0160208401613b6e565b90509250929050565b600060208284031215613f1c57600080fd5b5051919050565b600080600080600060808688031215613f3b57600080fd5b85359450602086013567ffffffffffffffff811115613f5957600080fd5b613f6588828901613b29565b9095509350506040860135613f79816144c4565b949793965091946060013592915050565b60008060408385031215613f9d57600080fd5b8235915060208084013567ffffffffffffffff811115613fbc57600080fd5b8401601f81018613613fcd57600080fd5b8035613fdb613c0d82614390565b80828252848201915084840189868560051b8701011115613ffb57600080fd5b600094505b83851015614027578035614013816144c4565b835260019490940193918501918501614000565b5080955050505050509250929050565b60008060008060008060a0878903121561405057600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561407557600080fd5b61408189828a01613b29565b9095509350506060870135614095816144c4565b80925050608087013590509295509295509295565b6000806000606084860312156140bf57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156140e857600080fd5b81516103f2816144ea565b600081518084526020808501945080840160005b8381101561412357815187529582019590820190600101614107565b509495945050505050565b60008251614140818460208701614424565b9190910192915050565b60208152600061041360208301846140f3565b60408152600061417060408301856140f3565b905082151560208301529392505050565b60608152600061419460608301866140f3565b60208301949094525060400152919050565b60208152600082518060208401526141c5816040850160208701614424565b601f01601f19169190910160400192915050565b6020808252601a908201527f53776170526f7574657256313a20494e56414c49445f50415448000000000000604082015260600190565b60208082526028908201527f53776170526f7574657256313a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b60208082526015908201527414ddd85c149bdd5d195c958c4e8811561412549151605a1b604082015260600190565b6020808252601c908201527f53776170526f7574657256313a20494e56414c49445f524f5554455300000000604082015260600190565b60208082526024908201527f53776170526f7574657256313a204558434553534956455f494e5055545f414d60408201526313d5539560e21b606082015260800190565b6000808335601e1984360301811261431957600080fd5b83018035915067ffffffffffffffff82111561433457600080fd5b60200191503681900382131561351057600080fd5b60008235603e1983360301811261414057600080fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614388576143886144ae565b604052919050565b600067ffffffffffffffff8211156143aa576143aa6144ae565b5060051b60200190565b600082198211156143c7576143c7614482565b500190565b6000826143e957634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561440857614408614482565b500290565b60008282101561441f5761441f614482565b500390565b60005b8381101561443f578181015183820152602001614427565b838111156121835750506000910152565b60008161445f5761445f614482565b506000190190565b600060001982141561447b5761447b614482565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146144d957600080fd5b50565b80151581146144d957600080fd5b60ff811681146144d957600080fdfea264697066735822122026c833bb4215de701cd58000f461d97a7228c22af98650a3efb60a5a5ab2e62964736f6c63430008070033000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
-----Decoded View---------------
Arg [0] : _factory (address): 0xf36ae63d89983e3aea8aaad1086c3280eb01438d
Arg [1] : _WNativeCurrency (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d
Arg [1] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Deployed ByteCode Sourcemap
33524:19230:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34230:15;;-1:-1:-1;;;;;34230:15:0;34216:10;:29;34208:38;;;;;;33524:19230;;;;;50151:242;;;;;;;;;;-1:-1:-1;50151:242:0;;;;;:::i;:::-;;:::i;:::-;;;23259:25:1;;;23247:2;23232:18;50151:242:0;;;;;;;;50893:234;;;;;;;;;;-1:-1:-1;50893:234:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52134:617::-;;;;;;;;;;-1:-1:-1;52134:617:0;;;;;:::i;:::-;;:::i;42263:583::-;;;;;;;;;;-1:-1:-1;42263:583:0;;;;;:::i;:::-;;:::i;35101:677::-;;;;;;;;;;-1:-1:-1;35101:677:0;;;;;:::i;:::-;;:::i;33842:39::-;;;;;;;;;;-1:-1:-1;33842:39:0;;;;-1:-1:-1;;;;;33842:39:0;;;;;;-1:-1:-1;;;;;13051:32:1;;;13033:51;;13021:2;13006:18;33842:39:0;12887:203:1;47398:850:0;;;;;;:::i;:::-;;:::i;48256:1251::-;;;;;;;;;;-1:-1:-1;48256:1251:0;;;;;:::i;:::-;;:::i;51135:249::-;;;;;;;;;;-1:-1:-1;51135:249:0;;;;;:::i;:::-;;:::i;35786:618::-;;;;;;;;;;-1:-1:-1;35786:618:0;;;;;:::i;:::-;;:::i;51392:734::-;;;;;;;;;;-1:-1:-1;51392:734:0;;;;;:::i;:::-;;:::i;39164:941::-;;;;;;:::i;:::-;;:::i;46503:887::-;;;;;;;;;;-1:-1:-1;46503:887:0;;;;;:::i;:::-;;:::i;42854:642::-;;;;;;;;;;-1:-1:-1;42854:642:0;;;;;:::i;:::-;;:::i;33804:31::-;;;;;;;;;;-1:-1:-1;33804:31:0;;;;-1:-1:-1;;;;;33804:31:0;;;36412:823;;;;;;:::i;:::-;;:::i;50651:234::-;;;;;;;;;;-1:-1:-1;50651:234:0;;;;;:::i;:::-;;:::i;43504:638::-;;;;;;;;;;-1:-1:-1;43504:638:0;;;;;:::i;:::-;;:::i;38174:982::-;;;;;;;;;;-1:-1:-1;38174:982:0;;;;;:::i;:::-;;:::i;37243:923::-;;;;;;;;;;-1:-1:-1;37243:923:0;;;;;:::i;:::-;;:::i;50151:242::-;50296:17;50333:52;50353:8;50363:9;50374:10;50333:19;:52::i;:::-;50326:59;;50151:242;;;;;;:::o;50893:234::-;51094:7;;51025:24;;51074:45;;-1:-1:-1;;;;;51094:7:0;51103:9;51114:4;51074:19;:45::i;:::-;51067:52;;50893:234;;;;;:::o;52134:617::-;52341:7;52361:16;52380:8;-1:-1:-1;;;;;52380:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52435:38;;-1:-1:-1;;;52435:38:0;;-1:-1:-1;;;;;13051:32:1;;;52435:38:0;;;13033:51:1;52361:40:0;;-1:-1:-1;52412:20:0;;52435:18;;;;;13006::1;;52435:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52412:61;-1:-1:-1;52508:2:0;52525:32;;;;;;;;52521:135;;52590:54;;-1:-1:-1;;;52590:54:0;;24721:4:1;24709:17;;;52590:54:0;;;24691:36:1;24763:17;;24743:18;;;24736:45;24797:18;;;24790:34;;;-1:-1:-1;;;;;52590:18:0;;;;;24664::1;;52590:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52574:70;;52521:135;52673:70;;-1:-1:-1;;;52673:70:0;;;;;23815:25:1;;;23888:4;23876:17;;23856:18;;;23849:45;-1:-1:-1;;;;;52673:41:0;;;;;23788:18:1;;52673:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52666:77;;;;;52134:617;;;;;;;;:::o;42263:583::-;42515:17;42496:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;;;;;;;;;42559:24:::1;::::0;-1:-1:-1;;;42559:24:0;;24480:4:1;24468:17;;42559:24:0::1;::::0;::::1;24450:36:1::0;42545:11:0::1;::::0;-1:-1:-1;;;;;42559:13:0;::::1;::::0;::::1;::::0;24423:18:1;;42559:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42545:38:::0;-1:-1:-1;42594:58:0::1;-1:-1:-1::0;;;;;42594:21:0;::::1;42616:10;42636:4;42643:8:::0;42594:21:::1;:58::i;:::-;42675:69;42685:4;42691:9;42702:7;42711:8;42721:12;42735:8;42675:9;:69::i;:::-;42771:22;::::0;-1:-1:-1;;;42771:22:0;;24480:4:1;24468:17;;42771:22:0::1;::::0;::::1;24450:36:1::0;42663:81:0;;-1:-1:-1;42755:13:0::1;::::0;-1:-1:-1;;;;;42771:13:0;::::1;::::0;::::1;::::0;24423:18:1;;42771:22:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42755:38:::0;-1:-1:-1;42804:34:0::1;-1:-1:-1::0;;;;;42804:19:0;::::1;42824:2:::0;42828:9;42804:19:::1;:34::i;:::-;42534:312;;42263:583:::0;;;;;;;;;;:::o;35101:677::-;35326:24;35307:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;35394:7:::1;::::0;35373:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;35394:7:0::1;::::0;35403:8;;35373:45;35413:4;;;;;;35373:45;;::::1;::::0;35413:4;;35373:45;35413:4;35373:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;35373:20:0::1;::::0;-1:-1:-1;;;35373:45:0:i:1;:::-;35363:55;;35482:12;35451:7;35476:1;35459:7;:14;:18;;;;:::i;:::-;35451:27;;;;;;;;:::i;:::-;;;;;;;:43;;35429:133;;;;-1:-1:-1::0;;;35429:133:0::1;;;;;;;:::i;:::-;35573:162;35611:4;;35616:1;35611:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35673;::::0;;35633:10:::1;::::0;35658:41:::1;::::0;-1:-1:-1;;;;;35673:7:0::1;::::0;35682:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35691:4;;35696:1;35691:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35658:14;:41::i;:::-;35714:7;35722:1;35714:10;;;;;;;;:::i;:::-;;;;;;;35573:23;:162::i;:::-;35746:24;35752:7;35761:4;;35746:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35767:2:0;;-1:-1:-1;35746:5:0::1;::::0;-1:-1:-1;;35746:24:0:i:1;:::-;35101:677:::0;;;;;;;;;:::o;47398:850::-;47629:17;47610:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;47668:6:::1;;47675:1;47668:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;47667:17;47659:58;;;;-1:-1:-1::0;;;47659:58:0::1;;;;;;;:::i;:::-;47728:15;47746:38;47765:6;;47772:1;47765:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;47746:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;47746:18:0::1;::::0;-1:-1:-1;;;47746:38:0:i:1;:::-;47785:1;47746:41;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;47817:15:::1;::::0;47746:41;;-1:-1:-1;;;;;;47806:26:0;;::::1;47817:15:::0;::::1;47806:26;47798:67;;;;-1:-1:-1::0;;;47798:67:0::1;;;;;;;:::i;:::-;47893:15;;;;;;;;;-1:-1:-1::0;;;;;47893:15:0::1;-1:-1:-1::0;;;;;47876:41:0::1;;47925:9;47876:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;47948:16;47999:60;48022:7;48031:9;48042:6;;48050:8;47999:22;:60::i;:::-;47975:84:::0;-1:-1:-1;47975:84:0;-1:-1:-1;48092:25:0;;::::1;;48070:115;;;;-1:-1:-1::0;;;48070:115:0::1;;;;;;;:::i;:::-;48196:44;-1:-1:-1::0;;;;;48196:29:0;::::1;48226:2:::0;48230:9;48196:29:::1;:44::i;:::-;47648:600;;47398:850:::0;;;;;;;;:::o;48256:1251::-;48506:17;48487:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;48545:6;;48552:17:::1;48568:1;48545:6:::0;48552:17:::1;:::i;:::-;48545:25;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:32;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;48544:33;48536:74;;;;-1:-1:-1::0;;;48536:74:0::1;;;;;;;:::i;:::-;48621:29;48653:54;48672:6:::0;;48679:17:::1;48695:1;48672:6:::0;48679:17:::1;:::i;:::-;48672:25;;;;;;;:::i;48653:54::-;48767:15;::::0;;48739:19;;48621:86;;-1:-1:-1;;;;;;48767:15:0::1;::::0;48621:86;;48739:23:::1;::::0;::::1;:::i;:::-;48726:37;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;48726:56:0::1;;48718:97;;;;-1:-1:-1::0;;;48718:97:0::1;;;;;;;:::i;:::-;48826:15;48856:6;;48863:1;48856:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;48852:198;;;48899:45;48925:6;;48932:1;48925:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;48899:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;48899:25:0::1;::::0;-1:-1:-1;;;48899:45:0:i:1;:::-;:55;;;48889:65;;48852:198;;;48997:38;49016:6;;49023:1;49016:9;;;;;;;:::i;48997:38::-;49036:1;48997:41;;;;;;;;:::i;:::-;;;;;;;48987:51;;48852:198;49060:69;49084:7;49093:10;49113:4;49120:8;49060:23;:69::i;:::-;49140:16;49191:59;49214:7;49223:8;49233:6;;49241:8;49191:22;:59::i;:::-;49167:83:::0;-1:-1:-1;49167:83:0;-1:-1:-1;49283:25:0;;::::1;;49261:115;;;;-1:-1:-1::0;;;49261:115:0::1;;;;;;;:::i;:::-;49404:15;::::0;49387:53:::1;::::0;-1:-1:-1;;;49387:53:0;;::::1;::::0;::::1;23259:25:1::0;;;-1:-1:-1;;;;;49404:15:0;;::::1;::::0;49387:42:::1;::::0;23232:18:1;;49387:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49451:48;49485:2;49489:9;49451:33;:48::i;:::-;48525:982;;;48256:1251:::0;;;;;;;;;:::o;51135:249::-;51328:48;;-1:-1:-1;;;51328:48:0;;24721:4:1;24709:17;;;51328:48:0;;;24691:36:1;24763:17;;24743:18;;;24736:45;24797:18;;;24790:34;;;51301:7:0;;-1:-1:-1;;;;;51328:18:0;;;;;24664::1;;51328:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35786:618::-;36011:24;35992:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;36078:7:::1;::::0;36058:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;36078:7:0::1;::::0;36087:9;;36058:45;36098:4;;;;;;36058:45;;::::1;::::0;36098:4;;36058:45;36098:4;36058:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;36058:19:0::1;::::0;-1:-1:-1;;;36058:45:0:i:1;:::-;36048:55;;36136:11;36122:7;36130:1;36122:10;;;;;;;;:::i;:::-;;;;;;;:25;;36114:74;;;;-1:-1:-1::0;;;36114:74:0::1;;;;;;;:::i;51392:734::-:0;51601:7;51621:16;51640:8;-1:-1:-1;;;;;51640:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51695:38;;-1:-1:-1;;;51695:38:0;;-1:-1:-1;;;;;13051:32:1;;;51695:38:0;;;13033:51:1;51621:40:0;;-1:-1:-1;51672:20:0;;51695:18;;;;;13006::1;;51695:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51672:61;;51744:29;51790:8;-1:-1:-1;;;;;51790:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51776:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51776:43:0;;51744:75;;51861:2;51830:12;51843:14;51830:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;51897:49;;-1:-1:-1;;;51897:49:0;;51874:20;;-1:-1:-1;;;;;51897:29:0;;;;;:49;;51927:12;;51941:4;;51897:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51874:72;;51979:12;51961:30;;:14;:30;;;51957:82;;;52015:12;-1:-1:-1;52008:19:0;;-1:-1:-1;;;52008:19:0;51957:82;52056:62;;-1:-1:-1;;;52056:62:0;;24721:4:1;24709:17;;;52056:62:0;;;24691:36:1;24763:17;;24743:18;;;24736:45;24797:18;;;24790:34;;;-1:-1:-1;;;;;52056:18:0;;;;;24664::1;;52056:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52049:69;51392:734;-1:-1:-1;;;;;;;;;;51392:734:0:o;39164:941::-;39375:24;39356:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;39431:15:::1;::::0;-1:-1:-1;;;;;39431:15:0::1;39420:4:::0;;39431:15:::1;39420:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39420:26:0::1;;39412:65;;;;-1:-1:-1::0;;;39412:65:0::1;;;;;;;:::i;:::-;39518:7;::::0;39498:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;39518:7:0::1;::::0;39527:9;;39498:45;39538:4;;;;;;39498:45;;::::1;::::0;39538:4;;39498:45;39538:4;39498:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39498:19:0::1;::::0;-1:-1:-1;;;39498:45:0:i:1;:::-;39488:55;;39576:9;39562:7;39570:1;39562:10;;;;;;;;:::i;:::-;;;;;;;:23;;39554:72;;;;-1:-1:-1::0;;;39554:72:0::1;;;;;;;:::i;:::-;39654:15;::::0;39686:10;;-1:-1:-1;;;;;39654:15:0;;::::1;::::0;39637:41:::1;::::0;39686:7;;39654:15:::1;::::0;39686:10:::1;;;;:::i;:::-;;;;;;;39637:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;39739:15:0::1;::::0;::::1;39798:7:::0;;-1:-1:-1;;;;;39739:15:0;;::::1;::::0;-1:-1:-1;39732:32:0::1;::::0;-1:-1:-1;39783:41:0::1;::::0;-1:-1:-1;39798:7:0;;::::1;::::0;39807:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;39816:4;;39821:1;39816:7;;;;;;;:::i;39783:41::-;39843:7;39851:1;39843:10;;;;;;;;:::i;:::-;;;;;;;39732:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;13976:32:1;;;;13958:51;;14040:2;14025:18;;14018:34;13946:2;13931:18;;13784:274;39732:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39710:169;;;::::0;::::1;;39890:24;39896:7;39905:4;;39890:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39911:2:0;;-1:-1:-1;39890:5:0::1;::::0;-1:-1:-1;;39890:24:0:i:1;:::-;39941:7;39949:1;39941:10;;;;;;;;:::i;:::-;;;;;;;39929:9;:22;39925:173;;;39968:118;40020:10;40061:7;40069:1;40061:10;;;;;;;;:::i;:::-;;;;;;;40049:9;:22;;;;:::i;:::-;39968:33;:118::i;:::-;39164:941:::0;;;;;;;;:::o;46503:887::-;46745:17;46726:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;46775:15:::1;46805:6;;46812:1;46805:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;46801:198;;;46848:45;46874:6;;46881:1;46874:9;;;;;;;:::i;46848:45::-;:55;;;46838:65;;46801:198;;;46946:38;46965:6;;46972:1;46965:9;;;;;;;:::i;46946:38::-;46985:1;46946:41;;;;;;;;:::i;:::-;;;;;;;46936:51;;46801:198;47011:69;47035:7;47044:10;47064:4;47071:8;47011:23;:69::i;:::-;47091:16;47142:59;47165:7;47174:8;47184:6;;47192:8;47142:22;:59::i;:::-;47118:83:::0;-1:-1:-1;47118:83:0;-1:-1:-1;47234:25:0;;::::1;;47212:115;;;;-1:-1:-1::0;;;47212:115:0::1;;;;;;;:::i;:::-;47338:44;-1:-1:-1::0;;;;;47338:29:0;::::1;47368:2:::0;47372:9;47338:29:::1;:44::i;:::-;46764:626;;46503:887:::0;;;;;;;;;:::o;42854:642::-;43142:17;43123:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;43186:33:::1;::::0;-1:-1:-1;;;43186:33:0;;24480:4:1;24468:17;;43186:33:0::1;::::0;::::1;24450:36:1::0;43172:11:0::1;::::0;-1:-1:-1;;;;;43186:17:0;::::1;::::0;::::1;::::0;24423:18:1;;43186:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43172:47:::0;-1:-1:-1;43230:52:0::1;-1:-1:-1::0;;;;;43230:21:0;::::1;43252:10;43272:4;43279:2:::0;43230:21:::1;:52::i;:::-;43305:84;43323:4;43329:8;43339:14;43355:12;43369:2;43373:5;43380:8;43305:17;:84::i;:::-;43416:27;::::0;-1:-1:-1;;;43416:27:0;;24480:4:1;24468:17;;43416:27:0::1;::::0;::::1;24450:36:1::0;43293:96:0;;-1:-1:-1;43400:13:0::1;::::0;-1:-1:-1;;;;;43416:13:0;::::1;::::0;::::1;::::0;24423:18:1;;43416:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43400:43:::0;-1:-1:-1;43454:34:0::1;-1:-1:-1::0;;;;;43454:19:0;::::1;43474:2:::0;43478:9;43454:19:::1;:34::i;:::-;43161:335;;42854:642:::0;;;;;;;;;;;:::o;36412:823::-;36626:24;36607:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;36682:15:::1;::::0;-1:-1:-1;;;;;36682:15:0::1;36671:4:::0;;36682:15:::1;36671:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36671:26:0::1;;36663:65;;;;-1:-1:-1::0;;;36663:65:0::1;;;;;;;:::i;:::-;36770:7;::::0;36749:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;36770:7:0::1;::::0;36779:9:::1;::::0;36749:46;36790:4;;;;;;36749:46;;::::1;::::0;36790:4;;36749:46;36790:4;36749:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;36749:20:0::1;::::0;-1:-1:-1;;;36749:46:0:i:1;:::-;36739:56;;36859:12;36828:7;36853:1;36836:7;:14;:18;;;;:::i;:::-;36828:27;;;;;;;;:::i;:::-;;;;;;;:43;;36806:133;;;;-1:-1:-1::0;;;36806:133:0::1;;;;;;;:::i;:::-;36967:15;::::0;36999:10;;-1:-1:-1;;;;;36967:15:0;;::::1;::::0;36950:41:::1;::::0;36999:7;;36967:15:::1;::::0;36999:10:::1;;;;:::i;:::-;;;;;;;36950:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37052:15:0::1;::::0;::::1;37111:7:::0;;-1:-1:-1;;;;;37052:15:0;;::::1;::::0;-1:-1:-1;37045:32:0::1;::::0;-1:-1:-1;37096:41:0::1;::::0;-1:-1:-1;37111:7:0;;::::1;::::0;37120:4;;;;:7;::::1;;;;:::i;37096:41::-;37156:7;37164:1;37156:10;;;;;;;;:::i;:::-;;;;;;;37045:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;13976:32:1;;;;13958:51;;14040:2;14025:18;;14018:34;13946:2;13931:18;;13784:274;37045:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37023:169;;;::::0;::::1;;37203:24;37209:7;37218:4;;37203:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37224:2:0;;-1:-1:-1;37203:5:0::1;::::0;-1:-1:-1;;37203:24:0:i:1;50651:234::-:0;50853:7;;50783:24;;50832:45;;-1:-1:-1;;;;;50853:7:0;50862:8;50872:4;50832:20;:45::i;43504:638::-;43790:17;43771:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;43834:29:::1;::::0;-1:-1:-1;;;43834:29:0;;24480:4:1;24468:17;;43834:29:0::1;::::0;::::1;24450:36:1::0;43820:11:0::1;::::0;-1:-1:-1;;;;;43834:13:0;::::1;::::0;::::1;::::0;24423:18:1;;43834:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43820:43:::0;-1:-1:-1;43874:52:0::1;-1:-1:-1::0;;;;;43874:21:0;::::1;43896:10;43916:4;43923:2:::0;43874:21:::1;:52::i;:::-;43949:82;43965:4;43971:8;43981:14;43997:12;44011:2;44015:5;44022:8;43949:15;:82::i;:::-;44058:31;::::0;-1:-1:-1;;;44058:31:0;;24480:4:1;24468:17;;44058:31:0::1;::::0;::::1;24450:36:1::0;43937:94:0;;-1:-1:-1;44042:13:0::1;::::0;-1:-1:-1;;;;;44058:17:0;::::1;::::0;::::1;::::0;24423:18:1;;44058:31:0::1;24308:184:1::0;38174:982:0;38407:24;38388:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;38491:15:::1;::::0;;-1:-1:-1;;;;;38491:15:0::1;::::0;38466:4;;;;38471:15:::1;::::0;38466:4;38471:15:::1;:::i;:::-;38466:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38466:40:0::1;;38444:116;;;;-1:-1:-1::0;;;38444:116:0::1;;;;;;;:::i;:::-;38602:7;::::0;38581:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;38602:7:0::1;::::0;38611:8;;38581:45;38621:4;;;;;;38581:45;;::::1;::::0;38621:4;;38581:45;38621:4;38581:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;38581:20:0::1;::::0;-1:-1:-1;;;38581:45:0:i:1;:::-;38571:55;;38690:12;38659:7;38684:1;38667:7;:14;:18;;;;:::i;:::-;38659:27;;;;;;;;:::i;:::-;;;;;;;:43;;38637:133;;;;-1:-1:-1::0;;;38637:133:0::1;;;;;;;:::i;:::-;38781:162;38819:4;;38824:1;38819:7;;;;;;;:::i;38781:162::-;38954:35;38960:7;38969:4;;38954:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38983:4:0::1;::::0;-1:-1:-1;38954:5:0::1;::::0;-1:-1:-1;;38954:35:0:i:1;:::-;39017:15;::::0;;39051:14;;-1:-1:-1;;;;;39017:15:0;;::::1;::::0;39000:42:::1;::::0;39043:7;;39051:18:::1;::::0;::::1;:::i;:::-;39043:27;;;;;;;;:::i;:::-;;;;;;;39000:71;;;;;;;;;;;;;23259:25:1::0;;23247:2;23232:18;;23113:177;39000:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39082:66;39116:2;39120:7;39145:1;39128:7;:14;:18;;;;:::i;:::-;39120:27;;;;;;;;:::i;:::-;;;;;;;39082:33;:66::i;37243:923::-:0;37476:24;37457:8;34101:15;34089:8;:27;;34081:61;;;;-1:-1:-1;;;34081:61:0;;;;;;;:::i;:::-;37560:15:::1;::::0;;-1:-1:-1;;;;;37560:15:0::1;::::0;37535:4;;;;37540:15:::1;::::0;37535:4;37540:15:::1;:::i;:::-;37535:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37535:40:0::1;;37513:116;;;;-1:-1:-1::0;;;37513:116:0::1;;;;;;;:::i;:::-;37670:7;::::0;37650:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;37670:7:0::1;::::0;37679:9;;37650:45;37690:4;;;;;;37650:45;;::::1;::::0;37690:4;;37650:45;37690:4;37650:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;37650:19:0::1;::::0;-1:-1:-1;;;37650:45:0:i:1;:::-;37640:55;;37728:11;37714:7;37722:1;37714:10;;;;;;;;:::i;:::-;;;;;;;:25;;37706:74;;;;-1:-1:-1::0;;;37706:74:0::1;;;;;;;:::i;6749:589::-:0;6885:17;6934:1;6923:8;:12;6915:58;;;;-1:-1:-1;;;6915:58:0;;22913:2:1;6915:58:0;;;22895:21:1;22952:2;22932:18;;;22925:30;22991:34;22971:18;;;22964:62;-1:-1:-1;;;23042:18:1;;;23035:31;23083:19;;6915:58:0;22711:397:1;6915:58:0;7018:1;7006:9;:13;:31;;;;;7036:1;7023:10;:14;7006:31;6984:111;;;;-1:-1:-1;;;6984:111:0;;21794:2:1;6984:111:0;;;21776:21:1;21833:2;21813:18;;;21806:30;21872:32;21852:18;;;21845:60;21922:18;;6984:111:0;21592:354:1;6984:111:0;7106:23;7132:17;:8;7145:3;7132:12;:17::i;:::-;7106:43;-1:-1:-1;7160:17:0;7180:31;7106:43;7200:10;7180:19;:31::i;:::-;7160:51;-1:-1:-1;7222:19:0;7244:40;7268:15;7244:19;:9;7258:4;7244:13;:19::i;:::-;:23;;:40::i;:::-;7222:62;-1:-1:-1;7307:23:0;7222:62;7307:9;:23;:::i;:::-;7295:35;6749:589;-1:-1:-1;;;;;;;6749:589:0:o;8709:640::-;8847:24;8907:1;8892:4;:11;:16;;8884:49;;;;-1:-1:-1;;;8884:49:0;;22153:2:1;8884:49:0;;;22135:21:1;22192:2;22172:18;;;22165:30;-1:-1:-1;;;22211:18:1;;;22204:50;22271:18;;8884:49:0;21951:344:1;8884:49:0;8968:4;:11;8954:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8954:26:0;;8944:36;;9021:9;8991:7;9016:1;8999:7;:14;:18;;;;:::i;:::-;8991:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;9046:9;9072:1;9058:4;:11;:15;;;;:::i;:::-;9046:27;;9041:301;9075:5;;9041:301;;9103:17;;9144:108;9174:7;9200:4;9205:5;9209:1;9205;:5;:::i;:::-;9200:11;;;;;;;;:::i;:::-;;;;;;;9230:4;9235:1;9230:7;;;;;;;;:::i;:::-;;;;;;;9144:11;:108::i;:::-;9102:150;;;;9284:46;9296:7;9304:1;9296:10;;;;;;;;:::i;:::-;;;;;;;9308:9;9319:10;9284:11;:46::i;:::-;9267:7;9275:5;9279:1;9275;:5;:::i;:::-;9267:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9087:255;;9082:3;;;;;:::i;:::-;;;;9041:301;;;;8709:640;;;;;:::o;30354:248::-;30525:68;;-1:-1:-1;;;;;13662:15:1;;;30525:68:0;;;13644:34:1;13714:15;;13694:18;;;13687:43;13746:18;;;13739:34;;;30498:96:0;;30518:5;;-1:-1:-1;;;30548:27:0;13579:18:1;;30525:68:0;;;;-1:-1:-1;;30525:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30525:68:0;-1:-1:-1;;;;;;30525:68:0;;;;;;;;;;30498:19;:96::i;:::-;30354:248;;;;:::o;40113:429::-;40362:24;;-1:-1:-1;;;40362:24:0;;24480:4:1;24468:17;;40362:24:0;;;24450:36:1;40318:17:0;;;;-1:-1:-1;;;;;40362:13:0;;;;;24423:18:1;;40362:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40348:38;-1:-1:-1;40397:51:0;-1:-1:-1;;;;;40397:26:0;;40432:4;40439:8;40397:26;:51::i;:::-;40471:63;;-1:-1:-1;;;40471:63:0;;25116:4:1;25104:17;;;40471:63:0;;;25086:36:1;25158:17;;25138:18;;;25131:45;25192:18;;;25185:34;;;25235:18;;;25228:34;;;25278:19;;;25271:35;;;-1:-1:-1;;;;;40471:9:0;;;;;25058:19:1;;40471:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40459:75;40113:429;-1:-1:-1;;;;;;;;40113:429:0:o;30135:211::-;30279:58;;-1:-1:-1;;;;;13976:32:1;;30279:58:0;;;13958:51:1;14025:18;;;14018:34;;;30252:86:0;;30272:5;;-1:-1:-1;;;30302:23:0;13931:18:1;;30279:58:0;13784:274:1;30252:86:0;30135:211;;;:::o;8082:619::-;8220:24;8280:1;8265:4;:11;:16;;8257:49;;;;-1:-1:-1;;;8257:49:0;;22153:2:1;8257:49:0;;;22135:21:1;22192:2;22172:18;;;22165:30;-1:-1:-1;;;22211:18:1;;;22204:50;22271:18;;8257:49:0;21951:344:1;8257:49:0;8341:4;:11;8327:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8327:26:0;;8317:36;;8377:8;8364:7;8372:1;8364:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8401:9;8396:298;8430:1;8416:4;:11;:15;;;;:::i;:::-;8412:1;:19;8396:298;;;8454:17;8473:18;8495:108;8525:7;8551:4;8556:1;8551:7;;;;;;;;:::i;:::-;;;;;;;8577:4;8582:1;8586;8582:5;;;;:::i;:::-;8577:11;;;;;;;;:::i;8495:108::-;8453:150;;;;8635:47;8648:7;8656:1;8648:10;;;;;;;;:::i;:::-;;;;;;;8660:9;8671:10;8635:12;:47::i;:::-;8618:7;8626:5;:1;8630;8626:5;:::i;:::-;8618:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8438:256;;8433:3;;;;;:::i;:::-;;;;8396:298;;4292:204;4447:41;;-1:-1:-1;;;4447:41:0;;-1:-1:-1;;;;;13325:15:1;;;4447:41:0;;;13307:34:1;13377:15;;;13357:18;;;13350:43;4415:12:0;;4447:25;;;;;;13242:18:1;;4447:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5329:522::-;5614:51;;;-1:-1:-1;;;;;13662:15:1;;;5614:51:0;;;13644:34:1;13714:15;;;13694:18;;;13687:43;13746:18;;;;13739:34;;;5614:51:0;;;;;;;;;;13579:18:1;;;;5614:51:0;;;;;;;-1:-1:-1;;;;;5614:51:0;-1:-1:-1;;;5614:51:0;;;5589:87;;-1:-1:-1;;;;5589:10:0;;;;:87;;5614:51;5589:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5553:123;;;;5709:7;:57;;;;-1:-1:-1;5721:11:0;;:16;;:44;;;5752:4;5741:24;;;;;;;;;;;;:::i;:::-;5687:156;;;;-1:-1:-1;;;5687:156:0;;17494:2:1;5687:156:0;;;17476:21:1;17533:2;17513:18;;;17506:30;17572:34;17552:18;;;17545:62;-1:-1:-1;;;17623:18:1;;;17616:47;17680:19;;5687:156:0;17292:413:1;5687:156:0;5463:388;;5329:522;;;;:::o;34262:831::-;34397:9;34392:694;34426:1;34412:4;:11;:15;;;;:::i;:::-;34408:1;:19;34392:694;;;34450:13;34465:14;34484:4;34489:1;34484:7;;;;;;;;:::i;:::-;;;;;;;34493:4;34498:1;34502;34498:5;;;;:::i;:::-;34493:11;;;;;;;;:::i;:::-;;;;;;;34449:56;;;;34521:14;34541:32;34559:5;34566:6;34541:17;:32::i;:::-;-1:-1:-1;34520:53:0;-1:-1:-1;34588:17:0;34608:7;34616:5;:1;34620;34616:5;:::i;:::-;34608:14;;;;;;;;:::i;:::-;;;;;;;34588:34;;34638:18;34658;34689:6;-1:-1:-1;;;;;34680:15:0;:5;-1:-1:-1;;;;;34680:15:0;;:101;;34759:9;34778:1;34680:101;;;34724:1;34728:9;34680:101;34637:144;;;;34796:10;34827:1;34813:4;:11;:15;;;;:::i;:::-;34809:1;:19;:106;;34912:3;34809:106;;;34863:7;;34848:44;;-1:-1:-1;;;;;34863:7:0;34872:6;34880:4;34885:5;:1;34889;34885:5;:::i;:::-;34880:11;;;;;;;;:::i;:::-;;;;;;;34848:14;:44::i;:::-;34951:7;;34796:119;;-1:-1:-1;34936:38:0;;-1:-1:-1;;;;;34951:7:0;34960:5;34967:6;34936:14;:38::i;:::-;34930:144;;-1:-1:-1;;;34930:144:0;;;;;23497:25:1;;;23538:18;;;23531:34;;;-1:-1:-1;;;;;23601:32:1;;;23581:18;;;23574:60;34930:50:0;;;;;;;23470:18:1;;34930:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34434:652;;;;;;;34429:3;;;;;:::i;:::-;;;;34392:694;;49515:147;49584:21;49636:4;49625:29;;;;;;;;;;;;:::i;45469:1026::-;45698:7;45728:8;45639:16;45749:739;45769:17;;;45749:739;;;45812:6;;45819:1;45812:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;;;;;;;:::i;:::-;45808:669;;;45872:46;45887:9;45898:6;;45905:1;45898:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;45909:8;45872:14;:46::i;:::-;45848:70;;-1:-1:-1;45848:70:0;-1:-1:-1;45808:669:0;;;45959:21;45983:38;46002:6;;46009:1;46002:9;;;;;;;:::i;45983:38::-;45959:62;;46051:4;46070:1;46056:4;:11;:15;;;;:::i;:::-;46051:21;;;;;;;;:::i;:::-;;;;;;;46040:32;;46091:24;46118:46;46139:7;;;;;;;;-1:-1:-1;;;;;46139:7:0;46148:9;46159:4;46118:20;:46::i;:::-;46091:73;;46183:166;46225:4;46230:1;46225:7;;;;;;;;:::i;:::-;;;;;;;46256:41;46271:7;;;;;;;;-1:-1:-1;;;;;46271:7:0;46280:4;46285:1;46280:7;;;;;;;;:::i;:::-;;;;;;;46289:4;46294:1;46289:7;;;;;;;;:::i;46256:41::-;46320:7;46328:1;46320:10;;;;;;;;:::i;:::-;;;;;;;46183:19;:166::i;:::-;46368:35;46374:7;46383:4;46397;46368:5;:35::i;:::-;46434:7;46459:1;46442:7;:14;:18;;;;:::i;:::-;46434:27;;;;;;;;:::i;:::-;;;;;;;46422:39;;45940:537;;45808:669;45788:3;;;;:::i;:::-;;;;45749:739;;;;45469:1026;;;;;;;;:::o;49670:473::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49832:16:0;49864:20;49900:17;49933:15;49964:13;50002:4;49991:68;;;;;;;;;;;;:::i;:::-;50079:56;;;;;;;;-1:-1:-1;;;;;50079:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;49670:473:0:o;6340:287::-;6464:12;;;6424;6464;;;;;;;;;-1:-1:-1;;;;;6442:7:0;;;6457:5;;6442:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6423:54;;;6510:7;6488:131;;;;-1:-1:-1;;;6488:131:0;;19431:2:1;6488:131:0;;;19413:21:1;19470:2;19450:18;;;19443:30;19509:34;19489:18;;;19482:62;19580:34;19560:18;;;19553:62;-1:-1:-1;;;19631:19:1;;;19624:41;19682:19;;6488:131:0;19229:478:1;40550:939:0;40791:17;40821:16;40840:8;-1:-1:-1;;;;;40840:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40895:38;;-1:-1:-1;;;40895:38:0;;-1:-1:-1;;;;;13051:32:1;;;40895:38:0;;;13033:51:1;40821:40:0;;-1:-1:-1;40872:20:0;;40895:18;;;;;13006::1;;40895:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40872:61;;40944:29;40990:8;-1:-1:-1;;;;;40990:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40976:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40976:43:0;;40944:75;;41061:2;41030:12;41043:14;41030:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;41088;;-1:-1:-1;;;41088:33:0;;24480:4:1;24468:17;;41088:33:0;;;24450:36:1;41074:11:0;;-1:-1:-1;;;;;41088:17:0;;;;;24423:18:1;;41088:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41074:47;-1:-1:-1;41132:49:0;-1:-1:-1;;;;;41132:26:0;;41167:8;41178:2;41132:26;:49::i;:::-;41215:48;;-1:-1:-1;;;41215:48:0;;41192:20;;-1:-1:-1;;;;;41215:21:0;;;;;:48;;41237:12;;41192:20;;41254:8;;41215:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41192:71;;41296:12;41278:30;;:14;:30;;;41274:208;;41337:76;41347:4;41353:14;41369:12;41383;41397:5;41404:8;41337:9;:76::i;:::-;41325:88;;41274:208;;;41458:12;41446:24;;41274:208;40810:679;;;;;40550:939;;;;;;;;;:::o;41497:758::-;41736:17;41766:16;41785:8;-1:-1:-1;;;;;41785:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41840:38;;-1:-1:-1;;;41840:38:0;;-1:-1:-1;;;;;13051:32:1;;;41840:38:0;;;13033:51:1;41766:40:0;;-1:-1:-1;41817:20:0;;41840:18;;;;;13006::1;;41840:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41817:61;-1:-1:-1;41913:2:0;41930:32;;;;;;;;41926:145;;41995:64;42005:4;42011:14;42027;42043:2;42047:1;42050:8;41995:9;:64::i;:::-;41979:80;;41926:145;42081:65;-1:-1:-1;;;;;42081:31:0;;42121:8;42132:13;42081:31;:65::i;:::-;42169:78;;-1:-1:-1;;;42169:78:0;;;;;24132:25:1;;;24205:4;24193:17;;24173:18;;;24166:45;24227:18;;;24220:34;;;24270:18;;;24263:34;;;-1:-1:-1;;;;;42169:32:0;;;;;24104:19:1;;42169:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42157:90;41497:758;-1:-1:-1;;;;;;;;;;;41497:758:0:o;3605:151::-;3663:9;3693:6;;;:30;;-1:-1:-1;3722:1:0;3717;3708:5;3717:1;3722;3708:5;:::i;:::-;3704:9;-1:-1:-1;3703:15:0;;3704:9;3703:15;:::i;:::-;:20;3693:30;3685:63;;;;-1:-1:-1;;;3685:63:0;;16387:2:1;3685:63:0;;;16369:21:1;16426:2;16406:18;;;16399:30;-1:-1:-1;;;16445:18:1;;;16438:50;16505:18;;3685:63:0;16185:344:1;3314:137:0;3372:9;3417:1;3407:5;3411:1;3417;3407:5;:::i;:::-;3403:9;;;3402:16;;3394:49;;;;-1:-1:-1;;;3394:49:0;;16736:2:1;3394:49:0;;;16718:21:1;16775:2;16755:18;;;16748:30;-1:-1:-1;;;16794:18:1;;;16787:50;16854:18;;3394:49:0;16534:344:1;4843:478:0;4970:16;4988;5018:14;5038:26;5049:6;5057;5038:10;:26::i;:::-;5017:47;;;5076:16;5094;5134:32;5142:7;5151:6;5159;5134:7;:32::i;:::-;-1:-1:-1;;;;;5114:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5075:116:0;;;-1:-1:-1;;;;;5075:116:0;;;5235:6;-1:-1:-1;;;;;5225:16:0;:6;-1:-1:-1;;;;;5225:16:0;;:88;;5294:8;5304;5225:88;;;5258:8;5268;5225:88;5202:111;;;;-1:-1:-1;4843:478:0;-1:-1:-1;;;;;;;4843:478:0:o;7459:541::-;7595:16;7644:1;7632:9;:13;7624:60;;;;-1:-1:-1;;;7624:60:0;;20263:2:1;7624:60:0;;;20245:21:1;20302:2;20282:18;;;20275:30;20341:34;20321:18;;;20314:62;-1:-1:-1;;;20392:18:1;;;20385:32;20434:19;;7624:60:0;20061:398:1;7624:60:0;7729:1;7717:9;:13;:31;;;;;7747:1;7734:10;:14;7717:31;7695:111;;;;-1:-1:-1;;;7695:111:0;;21794:2:1;7695:111:0;;;21776:21:1;21833:2;21813:18;;;21806:30;21872:32;21852:18;;;21845:60;21922:18;;7695:111:0;21592:354:1;7695:111:0;7817:17;7837:34;7866:4;7837:24;:9;7851;7837:13;:24::i;:::-;:28;;:34::i;:::-;7817:54;-1:-1:-1;7882:19:0;7904:34;7934:3;7904:25;:10;7919:9;7904:14;:25::i;:34::-;7882:56;-1:-1:-1;7960:32:0;7990:1;7961:23;7882:56;7961:9;:23;:::i;7960:32::-;7949:43;7459:541;-1:-1:-1;;;;;;7459:541:0:o;32708:716::-;33132:23;33158:69;33186:4;33158:69;;;;;;;;;;;;;;;;;33166:5;-1:-1:-1;;;;;33158:27:0;;;:69;;;;;:::i;:::-;33242:17;;33132:95;;-1:-1:-1;33242:21:0;33238:179;;33339:10;33328:30;;;;;;;;;;;;:::i;:::-;33320:85;;;;-1:-1:-1;;;33320:85:0;;22502:2:1;33320:85:0;;;22484:21:1;22541:2;22521:18;;;22514:30;22580:34;22560:18;;;22553:62;-1:-1:-1;;;22631:18:1;;;22624:40;22681:19;;33320:85:0;22300:406:1;31495:317:0;31649:39;;-1:-1:-1;;;31649:39:0;;31673:4;31649:39;;;13307:34:1;-1:-1:-1;;;;;13377:15:1;;;13357:18;;;13350:43;31626:20:0;;31691:5;;31649:15;;;;;13242:18:1;;31649:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;31734:69;;-1:-1:-1;;;;;13976:32:1;;31734:69:0;;;13958:51:1;14025:18;;;14018:34;;;31626:70:0;;-1:-1:-1;31707:97:0;;31727:5;;-1:-1:-1;;;31757:22:0;13931:18:1;;31734:69:0;13784:274:1;3897:387:0;3999:14;4015;4065:6;-1:-1:-1;;;;;4055:16:0;:6;-1:-1:-1;;;;;4055:16:0;;;4047:56;;;;-1:-1:-1;;;4047:56:0;;20666:2:1;4047:56:0;;;20648:21:1;20705:2;20685:18;;;20678:30;20744:29;20724:18;;;20717:57;20791:18;;4047:56:0;20464:351:1;4047:56:0;4142:6;-1:-1:-1;;;;;4133:15:0;:6;-1:-1:-1;;;;;4133:15:0;;:79;;4197:6;4205;4133:79;;;4165:6;4173;4133:79;4114:98;;-1:-1:-1;4114:98:0;-1:-1:-1;;;;;;4231:20:0;;4223:53;;;;-1:-1:-1;;;4223:53:0;;19914:2:1;4223:53:0;;;19896:21:1;19953:2;19933:18;;;19926:30;-1:-1:-1;;;19972:18:1;;;19965:50;20032:18;;4223:53:0;19712:344:1;4223:53:0;3897:387;;;;;:::o;44150:1311::-;44283:16;;;44356:41;44382:14;;;;:5;:14;:::i;44356:41::-;44419:12;;;;44456:13;;;;44419:12;;-1:-1:-1;44331:66:0;;-1:-1:-1;;;;;;44448:36:0;44444:1010;;44541:9;;44594:14;;;;;44570:39;;-1:-1:-1;;;44570:39:0;;-1:-1:-1;;;;;13051:32:1;;;44570:39:0;;;13033:51:1;44513:245:0;;44541:9;44570:23;;;;;13006:18:1;;44570:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44629:9;;44653:12;;;;44629:37;;-1:-1:-1;;;44629:37:0;;-1:-1:-1;;;;;13051:32:1;;;44629:37:0;;;13033:51:1;44629:23:0;;;;;13006:18:1;;44629:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44686:8;44714:1;44735:8;44513:9;:245::i;:::-;44501:257;;44444:1010;;;44780:4;:13;;;44776:678;;;44858:9;;44887:13;;;;44948:14;;;;;44920:43;;-1:-1:-1;;;44920:43:0;;-1:-1:-1;;;;;13051:32:1;;;44920:43:0;;;13033:51:1;44822:290:0;;44858:9;44887:13;44920:27;;;;;13006:18:1;;44920:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44983:9;;45007:12;;;;44983:37;;-1:-1:-1;;;44983:37:0;;-1:-1:-1;;;;;13051:32:1;;;44983:37:0;;;13033:51:1;44983:23:0;;;;;13006:18:1;;44983:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45040:8;45068:1;45089:8;44822:17;:290::i;44776:678::-;45191:9;;45219:13;;;;45275:14;;;;;45251:39;;-1:-1:-1;;;45251:39:0;;-1:-1:-1;;;;;13051:32:1;;;45251:39:0;;;13033:51:1;45157:285:0;;45191:9;45219:13;45251:23;;;;;13006:18:1;;45251:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45310:13;;;;45338:12;;;;45310:41;;-1:-1:-1;;;45310:41:0;;-1:-1:-1;;;;;13051:32:1;;;45310:41:0;;;13033:51:1;45310:27:0;;;;;13006:18:1;;45310:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45371:8;45399:1;45419:8;45157:15;:285::i;:::-;45145:297;;44776:678;44320:1141;44150:1311;;;;;;:::o;5859:473::-;6105:45;;;-1:-1:-1;;;;;13976:32:1;;;6105:45:0;;;13958:51:1;14025:18;;;;14018:34;;;6105:45:0;;;;;;;;;;13931:18:1;;;;6105:45:0;;;;;;;-1:-1:-1;;;;;6105:45:0;-1:-1:-1;;;6105:45:0;;;6080:81;;-1:-1:-1;;;;6080:10:0;;;;:81;;6105:45;6080:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6044:117;;;;6194:7;:57;;;;-1:-1:-1;6206:11:0;;:16;;:44;;;6237:4;6226:24;;;;;;;;;;;;:::i;:::-;6172:152;;;;-1:-1:-1;;;6172:152:0;;21380:2:1;6172:152:0;;;21362:21:1;21419:2;21399:18;;;21392:30;21458:34;21438:18;;;21431:62;-1:-1:-1;;;21509:18:1;;;21502:43;21562:19;;6172:152:0;21178:409:1;6172:152:0;5966:366;;5859:473;;;:::o;3459:138::-;3517:9;3562:1;3552:5;3556:1;3562;3552:5;:::i;:::-;3548:9;;;3547:16;;3539:50;;;;-1:-1:-1;;;3539:50:0;;15682:2:1;3539:50:0;;;15664:21:1;15721:2;15701:18;;;15694:30;-1:-1:-1;;;15740:18:1;;;15733:51;15801:18;;3539:50:0;15480:345:1;13551:229:0;13688:12;13720:52;13742:6;13750:4;13756:1;13759:12;13688;-1:-1:-1;;;;;11101:19:0;;;14958:60;;;;-1:-1:-1;;;14958:60:0;;21022:2:1;14958:60:0;;;21004:21:1;21061:2;21041:18;;;21034:30;21100:31;21080:18;;;21073:59;21149:18;;14958:60:0;20820:353:1;14958:60:0;15032:12;15046:23;15073:6;-1:-1:-1;;;;;15073:11:0;15092:5;15099:4;15073:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15031:73;;;;15122:51;15139:7;15148:10;15160:12;17507;17536:7;17532:530;;;-1:-1:-1;17567:10:0;17560:17;;17532:530;17681:17;;:21;17677:374;;17879:10;17873:17;17940:15;17927:10;17923:2;17919:19;17912:44;17677:374;18022:12;18015:20;;-1:-1:-1;;;18015: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:293::-;7093:6;7101;7154:2;7142:9;7133:7;7129:23;7125:32;7122:52;;;7170:1;7167;7160:12;7122:52;7193:40;7223:9;7193:40;:::i;:::-;7183:50;;7252:49;7297:2;7286:9;7282:18;7252:49;:::i;:::-;7242:59;;7014:293;;;;;:::o;7312:184::-;7382:6;7435:2;7423:9;7414:7;7410:23;7406:32;7403:52;;;7451:1;7448;7441:12;7403:52;-1:-1:-1;7474:16:1;;7312:184;-1:-1:-1;7312:184:1:o;7501:709::-;7614:6;7622;7630;7638;7646;7699:3;7687:9;7678:7;7674:23;7670:33;7667:53;;;7716:1;7713;7706:12;7667:53;7752:9;7739:23;7729:33;;7813:2;7802:9;7798:18;7785:32;7840:18;7832:6;7829:30;7826:50;;;7872:1;7869;7862:12;7826:50;7911:70;7973:7;7964:6;7953:9;7949:22;7911:70;:::i;:::-;8000:8;;-1:-1:-1;7885:96:1;-1:-1:-1;;8085:2:1;8070:18;;8057:32;8098:31;8057:32;8098:31;:::i;:::-;7501:709;;;;-1:-1:-1;7501:709:1;;8200:2;8185:18;8172:32;;7501:709;-1:-1:-1;;7501:709:1:o;8215:1045::-;8308:6;8316;8369:2;8357:9;8348:7;8344:23;8340:32;8337:52;;;8385:1;8382;8375:12;8337:52;8421:9;8408:23;8398:33;;8450:2;8503;8492:9;8488:18;8475:32;8530:18;8522:6;8519:30;8516:50;;;8562:1;8559;8552:12;8516:50;8585:22;;8638:4;8630:13;;8626:27;-1:-1:-1;8616:55:1;;8667:1;8664;8657:12;8616:55;8703:2;8690:16;8726:60;8742:43;8782:2;8742:43;:::i;8726:60::-;8808:3;8832:2;8827:3;8820:15;8860:2;8855:3;8851:12;8844:19;;8891:2;8887;8883:11;8939:7;8934:2;8928;8925:1;8921:10;8917:2;8913:19;8909:28;8906:41;8903:61;;;8960:1;8957;8950:12;8903:61;8982:1;8973:10;;8992:238;9006:2;9003:1;9000:9;8992:238;;;9077:3;9064:17;9094:31;9119:5;9094:31;:::i;:::-;9138:18;;9024:1;9017:9;;;;;9176:12;;;;9208;;8992:238;;;8996:3;9249:5;9239:15;;;;;;;8215:1045;;;;;:::o;10004:778::-;10126:6;10134;10142;10150;10158;10166;10219:3;10207:9;10198:7;10194:23;10190:33;10187:53;;;10236:1;10233;10226:12;10187:53;10272:9;10259:23;10249:33;;10329:2;10318:9;10314:18;10301:32;10291:42;;10384:2;10373:9;10369:18;10356:32;10411:18;10403:6;10400:30;10397:50;;;10443:1;10440;10433:12;10397:50;10482:70;10544:7;10535:6;10524:9;10520:22;10482:70;:::i;:::-;10571:8;;-1:-1:-1;10456:96:1;-1:-1:-1;;10656:2:1;10641:18;;10628:32;10669:31;10628:32;10669:31;:::i;:::-;10719:5;10709:15;;;10771:3;10760:9;10756:19;10743:33;10733:43;;10004:778;;;;;;;;:::o;11595:316::-;11672:6;11680;11688;11741:2;11729:9;11720:7;11716:23;11712:32;11709:52;;;11757:1;11754;11747:12;11709:52;-1:-1:-1;;11780:23:1;;;11850:2;11835:18;;11822:32;;-1:-1:-1;11901:2:1;11886:18;;;11873:32;;11595:316;-1:-1:-1;11595:316:1:o;11916:247::-;11984:6;12037:2;12025:9;12016:7;12012:23;12008:32;12005:52;;;12053:1;12050;12043:12;12005:52;12085:9;12079:16;12104:29;12127:5;12104:29;:::i;12168:435::-;12221:3;12259:5;12253:12;12286:6;12281:3;12274:19;12312:4;12341:2;12336:3;12332:12;12325:19;;12378:2;12371:5;12367:14;12399:1;12409:169;12423:6;12420:1;12417:13;12409:169;;;12484:13;;12472:26;;12518:12;;;;12553:15;;;;12445:1;12438:9;12409:169;;;-1:-1:-1;12594:3:1;;12168:435;-1:-1:-1;;;;;12168:435:1:o;12608:274::-;12737:3;12775:6;12769:13;12791:53;12837:6;12832:3;12825:4;12817:6;12813:17;12791:53;:::i;:::-;12860:16;;;;;12608:274;-1:-1:-1;;12608:274:1:o;14063:261::-;14242:2;14231:9;14224:21;14205:4;14262:56;14314:2;14303:9;14299:18;14291:6;14262:56;:::i;14329:342::-;14530:2;14519:9;14512:21;14493:4;14550:56;14602:2;14591:9;14587:18;14579:6;14550:56;:::i;:::-;14542:64;;14656:6;14649:14;14642:22;14637:2;14626:9;14622:18;14615:50;14329:342;;;;;:::o;14676:411::-;14919:2;14908:9;14901:21;14882:4;14939:56;14991:2;14980:9;14976:18;14968:6;14939:56;:::i;:::-;15026:2;15011:18;;15004:34;;;;-1:-1:-1;15069:2:1;15054:18;15047:34;14931:64;14676:411;-1:-1:-1;14676:411:1:o;15092:383::-;15241:2;15230:9;15223:21;15204:4;15273:6;15267:13;15316:6;15311:2;15300:9;15296:18;15289:34;15332:66;15391:6;15386:2;15375:9;15371:18;15366:2;15358:6;15354:15;15332:66;:::i;:::-;15459:2;15438:15;-1:-1:-1;;15434:29:1;15419:45;;;;15466:2;15415:54;;15092:383;-1:-1:-1;;15092:383:1:o;15830:350::-;16032:2;16014:21;;;16071:2;16051:18;;;16044:30;16110:28;16105:2;16090:18;;16083:56;16171:2;16156:18;;15830:350::o;16883:404::-;17085:2;17067:21;;;17124:2;17104:18;;;17097:30;17163:34;17158:2;17143:18;;17136:62;-1:-1:-1;;;17229:2:1;17214:18;;17207:38;17277:3;17262:19;;16883:404::o;18117:345::-;18319:2;18301:21;;;18358:2;18338:18;;;18331:30;-1:-1:-1;;;18392:2:1;18377:18;;18370:51;18453:2;18438:18;;18117:345::o;18467:352::-;18669:2;18651:21;;;18708:2;18688:18;;;18681:30;18747;18742:2;18727:18;;18720:58;18810:2;18795:18;;18467:352::o;18824:400::-;19026:2;19008:21;;;19065:2;19045:18;;;19038:30;19104:34;19099:2;19084:18;;19077:62;-1:-1:-1;;;19170:2:1;19155:18;;19148:34;19214:3;19199:19;;18824:400::o;25317:521::-;25394:4;25400:6;25460:11;25447:25;25554:2;25550:7;25539:8;25523:14;25519:29;25515:43;25495:18;25491:68;25481:96;;25573:1;25570;25563:12;25481:96;25600:33;;25652:20;;;-1:-1:-1;25695:18:1;25684:30;;25681:50;;;25727:1;25724;25717:12;25681:50;25760:4;25748:17;;-1:-1:-1;25791:14:1;25787:27;;;25777:38;;25774:58;;;25828:1;25825;25818:12;25843:322;25934:4;25992:11;25979:25;26086:2;26082:7;26071:8;26055:14;26051:29;26047:43;26027:18;26023:68;26013:96;;26105:1;26102;26095:12;26170:275;26241:2;26235:9;26306:2;26287:13;;-1:-1:-1;;26283:27:1;26271:40;;26341:18;26326:34;;26362:22;;;26323:62;26320:88;;;26388:18;;:::i;:::-;26424:2;26417:22;26170:275;;-1:-1:-1;26170:275:1:o;26450:183::-;26510:4;26543:18;26535:6;26532:30;26529:56;;;26565:18;;:::i;:::-;-1:-1:-1;26610:1:1;26606:14;26622:4;26602:25;;26450:183::o;26638:128::-;26678:3;26709:1;26705:6;26702:1;26699:13;26696:39;;;26715:18;;:::i;:::-;-1:-1:-1;26751:9:1;;26638:128::o;26771:217::-;26811:1;26837;26827:132;;26881:10;26876:3;26872:20;26869:1;26862:31;26916:4;26913:1;26906:15;26944:4;26941:1;26934:15;26827:132;-1:-1:-1;26973:9:1;;26771:217::o;26993:168::-;27033:7;27099:1;27095;27091:6;27087:14;27084:1;27081:21;27076:1;27069:9;27062:17;27058:45;27055:71;;;27106:18;;:::i;:::-;-1:-1:-1;27146:9:1;;26993:168::o;27166:125::-;27206:4;27234:1;27231;27228:8;27225:34;;;27239:18;;:::i;:::-;-1:-1:-1;27276:9:1;;27166:125::o;27296:258::-;27368:1;27378:113;27392:6;27389:1;27386:13;27378:113;;;27468:11;;;27462:18;27449:11;;;27442:39;27414:2;27407:10;27378:113;;;27509:6;27506:1;27503:13;27500:48;;;-1:-1:-1;;27544:1:1;27526:16;;27519:27;27296:258::o;27559:136::-;27598:3;27626:5;27616:39;;27635:18;;:::i;:::-;-1:-1:-1;;;27671:18:1;;27559:136::o;27700:135::-;27739:3;-1:-1:-1;;27760:17:1;;27757:43;;;27780:18;;:::i;:::-;-1:-1:-1;27827:1:1;27816:13;;27700:135::o;27840:127::-;27901:10;27896:3;27892:20;27889:1;27882:31;27932:4;27929:1;27922:15;27956:4;27953:1;27946:15;27972:127;28033:10;28028:3;28024:20;28021:1;28014:31;28064:4;28061:1;28054:15;28088:4;28085:1;28078:15;28104:127;28165:10;28160:3;28156:20;28153:1;28146:31;28196:4;28193:1;28186:15;28220:4;28217:1;28210:15;28236:131;-1:-1:-1;;;;;28311:31:1;;28301:42;;28291:70;;28357:1;28354;28347:12;28291:70;28236:131;:::o;28372:118::-;28458:5;28451:13;28444:21;28437:5;28434:32;28424:60;;28480:1;28477;28470:12;28495:114;28579:4;28572:5;28568:16;28561:5;28558:27;28548:55;;28599:1;28596;28589:12
Swarm Source
ipfs://26c833bb4215de701cd58000f461d97a7228c22af98650a3efb60a5a5ab2e629
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.