Latest 25 from a total of 119,460 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Exact Token... | 28258474 | 2 hrs ago | IN | 0 ETH | 0.00002138 | ||||
| Swap Exact Token... | 28256858 | 3 hrs ago | IN | 0 ETH | 0.000015 | ||||
| Swap Exact ETH F... | 28255291 | 4 hrs ago | IN | 0.00001 ETH | 0.00000877 | ||||
| Swap Exact ETH F... | 28253228 | 5 hrs ago | IN | 0.00001 ETH | 0.00001996 | ||||
| Swap Exact Token... | 28252674 | 6 hrs ago | IN | 0 ETH | 0.00001997 | ||||
| Swap Exact ETH F... | 28252051 | 6 hrs ago | IN | 0.0000115 ETH | 0.00002432 | ||||
| Remove Liquidity... | 28247386 | 9 hrs ago | IN | 0 ETH | 0.00001327 | ||||
| Remove Liquidity | 28247341 | 9 hrs ago | IN | 0 ETH | 0.00001207 | ||||
| Swap Exact Token... | 28245704 | 10 hrs ago | IN | 0 ETH | 0.00002406 | ||||
| Swap Exact Token... | 28245685 | 10 hrs ago | IN | 0 ETH | 0.00000958 | ||||
| Swap Exact Token... | 28245670 | 10 hrs ago | IN | 0 ETH | 0.00000958 | ||||
| Swap Exact ETH F... | 28235003 | 17 hrs ago | IN | 0.00005884 ETH | 0.00002367 | ||||
| Remove Liquidity... | 28224636 | 24 hrs ago | IN | 0 ETH | 0.00001224 | ||||
| Swap Exact ETH F... | 28223569 | 24 hrs ago | IN | 0.00051845 ETH | 0.00009878 | ||||
| Swap Exact Token... | 28221426 | 26 hrs ago | IN | 0 ETH | 0.00001971 | ||||
| Swap Exact Token... | 28220195 | 26 hrs ago | IN | 0 ETH | 0.00001348 | ||||
| Swap Exact Token... | 28219911 | 27 hrs ago | IN | 0 ETH | 0.000022 | ||||
| Swap Exact Token... | 28218229 | 28 hrs ago | IN | 0 ETH | 0.00002142 | ||||
| Swap Exact Token... | 28218184 | 28 hrs ago | IN | 0 ETH | 0.00002463 | ||||
| Swap Exact Token... | 28211411 | 32 hrs ago | IN | 0 ETH | 0.00002202 | ||||
| Swap Exact Token... | 28191814 | 43 hrs ago | IN | 0 ETH | 0.00001015 | ||||
| Swap Exact Token... | 28187788 | 45 hrs ago | IN | 0 ETH | 0.00000899 | ||||
| Swap Exact Token... | 28186416 | 46 hrs ago | IN | 0 ETH | 0.00002223 | ||||
| Remove Liquidity | 28180214 | 2 days ago | IN | 0 ETH | 0.0000128 | ||||
| Swap Exact Token... | 28178355 | 2 days ago | IN | 0 ETH | 0.00002083 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28258474 | 2 hrs ago | 0 ETH | ||||
| 28256858 | 3 hrs ago | 0.00016877 ETH | ||||
| 28256858 | 3 hrs ago | 0.00016877 ETH | ||||
| 28256858 | 3 hrs ago | 0 ETH | ||||
| 28256858 | 3 hrs ago | 0 ETH | ||||
| 28256858 | 3 hrs ago | 0 ETH | ||||
| 28256858 | 3 hrs ago | 0 ETH | ||||
| 28256858 | 3 hrs ago | 0 ETH | ||||
| 28256858 | 3 hrs ago | 0 ETH | ||||
| 28256858 | 3 hrs ago | 0 ETH | ||||
| 28256858 | 3 hrs ago | 0 ETH | ||||
| 28255291 | 4 hrs ago | 0 ETH | ||||
| 28255291 | 4 hrs ago | 0 ETH | ||||
| 28255291 | 4 hrs ago | 0.00001 ETH | ||||
| 28255291 | 4 hrs ago | 0 ETH | ||||
| 28255291 | 4 hrs ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RouterV2
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
// ftm.guru's extension of Solidly's periphery (Router)
// https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol
// BaseV1Router02.sol : Supporting Fee-on-transfer Tokens
// https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol
pragma solidity 0.8.13;
import './interfaces/IBaseV1Factory.sol';
import './interfaces/IBaseV1Pair.sol';
import './interfaces/IPairFactory.sol';
import './interfaces/IWETH.sol';
import './interfaces/IERC20.sol';
import './libraries/Math.sol';
// Experimental Extension [ftm.guru/solidly/BaseV1Router02]
// contract BaseV1Router02 is BaseV1Router01
// with Support for Fee-on-Transfer Tokens
contract RouterV2 {
using Math for uint;
struct route {
address from;
address to;
bool stable;
}
address public immutable factory;
IWETH public immutable wETH;
uint internal constant MINIMUM_LIQUIDITY = 10**3;
bytes32 immutable pairCodeHash;
// swap event for the referral system
event Swap(address indexed sender,uint amount0In,address _tokenIn, address indexed to, bool stable);
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, 'BaseV1Router: EXPIRED');
_;
}
constructor(address _factory, address _wETH) {
factory = _factory;
pairCodeHash = IBaseV1Factory(_factory).pairCodeHash();
wETH = IWETH(_wETH);
}
receive() external payable {
assert(msg.sender == address(wETH)); // only accept ETH via fallback from the WETH contract
}
function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
require(tokenA != tokenB, 'BaseV1Router: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'BaseV1Router: ZERO_ADDRESS');
}
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint160(uint256(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1, stable)),
pairCodeHash // init code hash
)))));
}
// given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
require(amountA > 0, 'BaseV1Router: INSUFFICIENT_AMOUNT');
require(reserveA > 0 && reserveB > 0, 'BaseV1Router: INSUFFICIENT_LIQUIDITY');
amountB = amountA * reserveB / reserveA;
}
// fetches and sorts the reserves for a pair
function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
(uint reserve0, uint reserve1,) = IBaseV1Pair(pairFor(tokenA, tokenB, stable)).getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) {
address pair = pairFor(tokenIn, tokenOut, true);
uint amountStable;
uint amountVolatile;
if (IBaseV1Factory(factory).isPair(pair)) {
amountStable = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn);
}
pair = pairFor(tokenIn, tokenOut, false);
if (IBaseV1Factory(factory).isPair(pair)) {
amountVolatile = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn);
}
return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) {
require(routes.length >= 1, 'BaseV1Router: INVALID_PATH');
amounts = new uint[](routes.length+1);
amounts[0] = amountIn;
for (uint i = 0; i < routes.length; i++) {
address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
if (IBaseV1Factory(factory).isPair(pair)) {
amounts[i+1] = IBaseV1Pair(pair).getAmountOut(amounts[i], routes[i].from);
}
}
}
function isPair(address pair) external view returns (bool) {
return IBaseV1Factory(factory).isPair(pair);
}
function quoteAddLiquidity(
address tokenA,
address tokenB,
bool stable,
uint amountADesired,
uint amountBDesired
) external view returns (uint amountA, uint amountB, uint liquidity) {
// create the pair if it doesn't exist yet
address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);
(uint reserveA, uint reserveB) = (0,0);
uint _totalSupply = 0;
if (_pair != address(0)) {
_totalSupply = IERC20(_pair).totalSupply();
(reserveA, reserveB) = getReserves(tokenA, tokenB, stable);
}
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
} else {
uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
(amountA, amountB) = (amountADesired, amountBOptimal);
liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
} else {
uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
(amountA, amountB) = (amountAOptimal, amountBDesired);
liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
}
}
}
function quoteRemoveLiquidity(
address tokenA,
address tokenB,
bool stable,
uint liquidity
) external view returns (uint amountA, uint amountB) {
// create the pair if it doesn't exist yet
address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);
if (_pair == address(0)) {
return (0,0);
}
(uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
uint _totalSupply = IERC20(_pair).totalSupply();
amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution
amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution
}
function _addLiquidity(
address tokenA,
address tokenB,
bool stable,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin
) internal returns (uint amountA, uint amountB) {
require(amountADesired >= amountAMin);
require(amountBDesired >= amountBMin);
// create the pair if it doesn't exist yet
address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);
if (_pair == address(0)) {
_pair = IBaseV1Factory(factory).createPair(tokenA, tokenB, stable);
}
(uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
require(amountBOptimal >= amountBMin, 'BaseV1Router: INSUFFICIENT_B_AMOUNT');
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin, 'BaseV1Router: INSUFFICIENT_A_AMOUNT');
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
function addLiquidity(
address tokenA,
address tokenB,
bool stable,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
(amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
address pair = pairFor(tokenA, tokenB, stable);
_safeTransferFrom(tokenA, msg.sender, pair, amountA);
_safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = IBaseV1Pair(pair).mint(to);
}
function addLiquidityETH(
address token,
bool stable,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
(amountToken, amountETH) = _addLiquidity(
token,
address(wETH),
stable,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = pairFor(token, address(wETH), stable);
_safeTransferFrom(token, msg.sender, pair, amountToken);
wETH.deposit{value: amountETH}();
assert(wETH.transfer(pair, amountETH));
liquidity = IBaseV1Pair(pair).mint(to);
// refund dust ETH, if any
if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH);
}
// **** REMOVE LIQUIDITY ****
function removeLiquidity(
address tokenA,
address tokenB,
bool stable,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) public ensure(deadline) returns (uint amountA, uint amountB) {
address pair = pairFor(tokenA, tokenB, stable);
require(IBaseV1Pair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair
(uint amount0, uint amount1) = IBaseV1Pair(pair).burn(to);
(address token0,) = sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
require(amountA >= amountAMin, 'BaseV1Router: INSUFFICIENT_A_AMOUNT');
require(amountB >= amountBMin, 'BaseV1Router: INSUFFICIENT_B_AMOUNT');
}
function removeLiquidityETH(
address token,
bool stable,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public ensure(deadline) returns (uint amountToken, uint amountETH) {
(amountToken, amountETH) = removeLiquidity(
token,
address(wETH),
stable,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
_safeTransfer(token, to, amountToken);
wETH.withdraw(amountETH);
_safeTransferETH(to, amountETH);
}
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
bool stable,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB) {
address pair = pairFor(tokenA, tokenB, stable);
{
uint value = approveMax ? type(uint).max : liquidity;
IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
}
(amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
}
function removeLiquidityETHWithPermit(
address token,
bool stable,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH) {
address pair = pairFor(token, address(wETH), stable);
uint value = approveMax ? type(uint).max : liquidity;
IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline);
}
// **** SWAP ****
// requires the initial amount to have already been sent to the first pair
function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual {
for (uint i = 0; i < routes.length; i++) {
(address token0,) = sortTokens(routes[i].from, routes[i].to);
uint amountOut = amounts[i + 1];
(uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
amount0Out, amount1Out, to, new bytes(0)
);
emit Swap(msg.sender,amounts[i],routes[i].from, _to, routes[i].stable);
}
}
function swapExactTokensForTokensSimple(
uint amountIn,
uint amountOutMin,
address tokenFrom,
address tokenTo,
bool stable,
address to,
uint deadline
) external ensure(deadline) returns (uint[] memory amounts) {
route[] memory routes = new route[](1);
routes[0].from = tokenFrom;
routes[0].to = tokenTo;
routes[0].stable = stable;
amounts = getAmountsOut(amountIn, routes);
require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
_safeTransferFrom(
routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
);
_swap(amounts, routes, to);
}
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
route[] calldata routes,
address to,
uint deadline
) external ensure(deadline) returns (uint[] memory amounts) {
amounts = getAmountsOut(amountIn, routes);
require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
_safeTransferFrom(
routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
);
_swap(amounts, routes, to);
}
function swapExactETHForTokens(uint amountOutMin, route[] calldata routes, address to, uint deadline) external payable ensure(deadline) returns (uint[] memory amounts) {
require(routes[0].from == address(wETH), 'BaseV1Router: INVALID_PATH');
amounts = getAmountsOut(msg.value, routes);
require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
wETH.deposit{value: amounts[0]}();
assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
_swap(amounts, routes, to);
}
function swapExactTokensForETH(uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline)
external
ensure(deadline)
returns (uint[] memory amounts)
{
require(routes[routes.length - 1].to == address(wETH), 'BaseV1Router: INVALID_PATH');
amounts = getAmountsOut(amountIn, routes);
require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
_safeTransferFrom(
routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
);
_swap(amounts, routes, address(this));
wETH.withdraw(amounts[amounts.length - 1]);
_safeTransferETH(to, amounts[amounts.length - 1]);
}
function UNSAFE_swapExactTokensForTokens(
uint[] memory amounts,
route[] calldata routes,
address to,
uint deadline
) external ensure(deadline) returns (uint[] memory) {
_safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
_swap(amounts, routes, to);
return amounts;
}
function _safeTransferETH(address to, uint value) internal {
(bool success,) = to.call{value:value}(new bytes(0));
require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
}
function _safeTransfer(address token, address to, uint256 value) internal {
require(token.code.length > 0);
(bool success, bytes memory data) =
token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))));
}
function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
require(token.code.length > 0);
(bool success, bytes memory data) =
token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))));
}
// Experimental Extension [ETH.guru/solidly/BaseV1Router02]
// **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)****
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
bool stable,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public ensure(deadline) returns (uint amountToken, uint amountETH) {
(amountToken, amountETH) = removeLiquidity(
token,
address(wETH),
stable,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
_safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
wETH.withdraw(amountETH);
_safeTransferETH(to, amountETH);
}
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
bool stable,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH) {
address pair = pairFor(token, address(wETH), stable);
uint value = approveMax ? type(uint).max : liquidity;
IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountToken, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens(
token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline
);
}
// **** SWAP (supporting fee-on-transfer tokens) ****
// requires the initial amount to have already been sent to the first pair
function _swapSupportingFeeOnTransferTokens(route[] calldata routes, address _to) internal virtual {
for (uint i; i < routes.length; i++) {
(address input, address output) = (routes[i].from, routes[i].to);
(address token0,) = sortTokens(input, output);
IBaseV1Pair pair = IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable));
uint amountInput;
uint amountOutput;
{ // scope to avoid stack too deep errors
(uint reserve0, uint reserve1,) = pair.getReserves();
(uint reserveInput,) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
(amountOutput,) = getAmountOut(amountInput, input, output);
}
(uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
bool _stable = routes[i].stable;
emit Swap(msg.sender,amountInput,input,_to,_stable);
}
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
route[] calldata routes,
address to,
uint deadline
) external ensure(deadline) {
_safeTransferFrom(
routes[0].from,
msg.sender,
pairFor(routes[0].from, routes[0].to, routes[0].stable),
amountIn
);
uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to);
_swapSupportingFeeOnTransferTokens(routes, to);
require(
IERC20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin,
'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
route[] calldata routes,
address to,
uint deadline
)
external
payable
ensure(deadline)
{
require(routes[0].from == address(wETH), 'BaseV1Router: INVALID_PATH');
uint amountIn = msg.value;
wETH.deposit{value: amountIn}();
assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn));
uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to);
_swapSupportingFeeOnTransferTokens(routes, to);
require(
IERC20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin,
'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
);
}
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
route[] calldata routes,
address to,
uint deadline
)
external
ensure(deadline)
{
require(routes[routes.length - 1].to == address(wETH), 'BaseV1Router: INVALID_PATH');
_safeTransferFrom(
routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn
);
_swapSupportingFeeOnTransferTokens(routes, address(this));
uint amountOut = IERC20(address(wETH)).balanceOf(address(this));
require(amountOut >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
wETH.withdraw(amountOut);
_safeTransferETH(to, amountOut);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
interface IBaseV1Factory {
function allPairsLength() external view returns (uint);
function isPair(address pair) external view returns (bool);
function pairCodeHash() external pure returns (bytes32);
function getPair(address tokenA, address token, bool stable) external view returns (address);
function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
interface IBaseV1Pair {
function transferFrom(address src, address dst, uint amount) external returns (bool);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function burn(address to) external returns (uint amount0, uint amount1);
function mint(address to) external returns (uint liquidity);
function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast);
function getAmountOut(uint, address) external view returns (uint);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
interface IERC20 {
function totalSupply() external view returns (uint256);
function transfer(address recipient, uint amount) external returns (bool);
function decimals() external view returns (uint8);
function symbol() external view returns (string memory);
function balanceOf(address) external view returns (uint);
function transferFrom(address sender, address recipient, uint amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
interface IPairFactory {
function allPairsLength() external view returns (uint);
function isPair(address pair) external view returns (bool);
function allPairs(uint index) external view returns (address);
function pairCodeHash() external pure returns (bytes32);
function getPair(address tokenA, address token, bool stable) external view returns (address);
function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
function MAX_REFERRAL_FEE() external view returns(uint);
function dibs() external view returns(address);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
library Math {
function max(uint a, uint b) internal pure returns (uint) {
return a >= b ? a : b;
}
function min(uint a, uint b) internal pure returns (uint) {
return a < b ? a : b;
}
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
function cbrt(uint256 n) internal pure returns (uint256) { unchecked {
uint256 x = 0;
for (uint256 y = 1 << 255; y > 0; y >>= 3) {
x <<= 1;
uint256 z = 3 * x * (x + 1) + 1;
if (n / y >= z) {
n -= y * z;
x += 1;
}
}
return x;
}}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, 'Math: Sub-underflow');
}
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"address","name":"_tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bool","name":"stable","type":"bool"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60e06040523480156200001157600080fd5b5060405162004de838038062004de88339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c051614bbc6200022c60003960006111810152600081816101b50152818161056701528181610b0901528181610db901528181611017015281816117af01528181611933015281816119c101528181611ef901528181611fa70152818161201b0152818161225e015281816123410152818161242d01528181612a8201528181612ab801528181612aed01528181612b8201528181612ce901528181612d3901528181612dbf01526131020152600081816104c301528181610ece015281816111460152818161146e01528181611582015281816125e10152818161278501528181612eaf015281816136fd01526137c20152614bbc6000f3fe6080604052600436106101a55760003560e01c806376c72751116100e1578063c45a01551161008a578063e5e31b1311610064578063e5e31b1314610525578063f242862114610555578063f41766d814610589578063fe411f14146105a957600080fd5b8063c45a0155146104b1578063d7b0e0a5146104e5578063e2d9d4dc1461050557600080fd5b806398a0fb3c116100bb57806398a0fb3c1461045e578063a32b1fcd1461047e578063b7e0d4c01461049e57600080fd5b806376c727511461040b5780637af728c81461041e5780639881fcb41461043e57600080fd5b8063544caa561161014e5780635e60dab5116101285780635e60dab51461039857806367ffb66a146103b85780636cc1ae13146103cb5780637301e3c8146103eb57600080fd5b8063544caa56146102e85780635a47ddc3146103285780635e1e63251461036357600080fd5b80634386e63c1161017f5780634386e63c14610270578063448725b4146102905780634c1ee03e146102b057600080fd5b80630dede6c4146101e957806313dcfc591461022357806318a130861461025057600080fd5b366101e457336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101e2576101e2614043565b005b600080fd5b3480156101f557600080fd5b5061020961020436600461408a565b6105c9565b604080519283526020830191909152015b60405180910390f35b34801561022f57600080fd5b5061024361023e36600461410f565b610838565b60405161021a919061418a565b34801561025c57600080fd5b5061024361026b366004614213565b610ab4565b34801561027c57600080fd5b5061020961028b366004614286565b610e98565b34801561029c57600080fd5b506102096102ab3660046142e8565b61100c565b3480156102bc57600080fd5b506102d06102cb366004614392565b6110ff565b6040516001600160a01b03909116815260200161021a565b3480156102f457600080fd5b506103086103033660046143dd565b61121f565b604080516001600160a01b0393841681529290911660208301520161021a565b34801561033457600080fd5b50610348610343366004614416565b61132e565b6040805193845260208401929092529082015260600161021a565b34801561036f57600080fd5b5061038361037e3660046144a5565b611436565b6040805192835290151560208301520161021a565b3480156103a457600080fd5b506102096103b3366004614392565b61168a565b6102436103c63660046144dc565b611762565b3480156103d757600080fd5b506101e26103e6366004614213565b611b5a565b3480156103f757600080fd5b506102436104063660046145ae565b611db0565b6101e26104193660046144dc565b611eae565b34801561042a57600080fd5b506101e2610439366004614213565b61220b565b34801561044a57600080fd5b506102436104593660046146f0565b61249b565b34801561046a57600080fd5b50610348610479366004614796565b61274d565b34801561048a57600080fd5b506102096104993660046147f1565b612959565b6103486104ac3660046148ad565b612a2e565b3480156104bd57600080fd5b506102d07f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f157600080fd5b506102096105003660046148ad565b612c97565b34801561051157600080fd5b506102096105203660046142e8565b612db4565b34801561053157600080fd5b50610545610540366004614908565b612e8d565b604051901515815260200161021a565b34801561056157600080fd5b506102d07f000000000000000000000000000000000000000000000000000000000000000081565b34801561059557600080fd5b506102436105a4366004614213565b612f22565b3480156105b557600080fd5b506102096105c43660046148ad565b6130b0565b600080824281101561061a5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b60448201526064015b60405180910390fd5b60006106278c8c8c6110ff565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190614925565b6106aa57600080fd5b6040517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561070f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107339190614942565b9150915060006107438f8f61121f565b509050806001600160a01b03168f6001600160a01b031614610766578183610769565b82825b90975095508a8710156107ca5760405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60448201526215539560ea1b6064820152608401610611565b898610156108265760405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60448201526215539560ea1b6064820152608401610611565b50505050509850989650505050505050565b606081428110156108835760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161089a57905050905087816000815181106108dd576108dd614966565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061091557610915614966565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061094d5761094d614966565b602090810291909101015190151560409091015261096b8a8261249b565b925088836001855161097d9190614992565b8151811061098d5761098d614966565b602002602001015110156109f45760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b610a9c81600081518110610a0a57610a0a614966565b60200260200101516000015133610a7c84600081518110610a2d57610a2d614966565b60200260200101516000015185600081518110610a4c57610a4c614966565b60200260200101516020015186600081518110610a6b57610a6b614966565b6020026020010151604001516110ff565b86600081518110610a8f57610a8f614966565b60200260200101516131a6565b610aa78382876132b3565b5050979650505050505050565b60608142811015610aff5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610b36600182614992565b818110610b4557610b45614966565b9050606002016020016020810190610b5d9190614908565b6001600160a01b031614610bb35760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b610c0f888787808060200260200160405190810160405280939291908181526020016000905b82821015610c0557610bf6606083028601368190038101906149a9565b81526020019060010190610bd9565b505050505061249b565b9150868260018451610c219190614992565b81518110610c3157610c31614966565b60200260200101511015610c985760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b610d5a86866000818110610cae57610cae614966565b610cc49260206060909202019081019150614908565b33610d4789896000818110610cdb57610cdb614966565b610cf19260206060909202019081019150614908565b8a8a6000818110610d0457610d04614966565b9050606002016020016020810190610d1c9190614908565b8b8b6000818110610d2f57610d2f614966565b90506060020160400160208101906102cb91906149c5565b85600081518110610a8f57610a8f614966565b610db7828787808060200260200160405190810160405280939291908181526020016000905b82821015610dac57610d9d606083028601368190038101906149a9565b81526020019060010190610d80565b5050505050306132b3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610df59190614992565b81518110610e0557610e05614966565b60200260200101516040518263ffffffff1660e01b8152600401610e2b91815260200190565b600060405180830381600087803b158015610e4557600080fd5b505af1158015610e59573d6000803e3d6000fd5b50505050610e8d848360018551610e709190614992565b81518110610e8057610e80614966565b60200260200101516135c6565b509695505050505050565b6040516306801cc360e41b81526001600160a01b03858116600483015284811660248301528315156044830152600091829182917f000000000000000000000000000000000000000000000000000000000000000090911690636801cc3090606401602060405180830381865afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b91906149e2565b90506001600160a01b038116610f58576000809250925050611003565b600080610f6689898961168a565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce91906149ff565b905080610fdb8489614a18565b610fe59190614a37565b955080610ff28389614a18565b610ffc9190614a37565b9450505050505b94509492505050565b600080600061103c8e7f00000000000000000000000000000000000000000000000000000000000000008f6110ff565b905060008761104b578c61104f565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b1580156110be57600080fd5b505af11580156110d2573d6000803e3d6000fd5b505050506110e58f8f8f8f8f8f8f612c97565b809450819550505050509b509b9950505050505050505050565b600080600061110e868661121f565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f00000000000000000000000000000000000000000000000000000000000000006040516020016111fd939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b0316036112a95760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f414444524553534560448201527f53000000000000000000000000000000000000000000000000000000000000006064820152608401610611565b826001600160a01b0316846001600160a01b0316106112c95782846112cc565b83835b90925090506001600160a01b0382166113275760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f414444524553530000000000006044820152606401610611565b9250929050565b6000806000834281101561137c5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b61138b8d8d8d8d8d8d8d6136ae565b9094509250600061139d8e8e8e6110ff565b90506113ab8e3383886131a6565b6113b78d3383876131a6565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156113ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142391906149ff565b9250505099509950999650505050505050565b6000806000611447858560016110ff565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156114b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114db9190614925565b15611554576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561152d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155191906149ff565b91505b611560878760006110ff565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef9190614925565b15611668576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166591906149ff565b90505b8082116116775780600061167b565b8160015b94509450505050935093915050565b6000806000611699868661121f565b5090506000806116aa8888886110ff565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156116e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170b9190614a77565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316886001600160a01b031614611750578082611753565b81815b90999098509650505050505050565b606081428110156117ad5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106117ea576117ea614966565b6118009260206060909202019081019150614908565b6001600160a01b0316146118565760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b6118a8348787808060200260200160405190810160405280939291908181526020016000905b82821015610c0557611899606083028601368190038101906149a9565b8152602001906001019061187c565b91508682600184516118ba9190614992565b815181106118ca576118ca614966565b602002602001015110156119315760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061197357611973614966565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156119a657600080fd5b505af11580156119ba573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611a5888886000818110611a0457611a04614966565b611a1a9260206060909202019081019150614908565b89896000818110611a2d57611a2d614966565b9050606002016020016020810190611a459190614908565b8a8a6000818110610d2f57610d2f614966565b84600081518110611a6b57611a6b614966565b60200260200101516040518363ffffffff1660e01b8152600401611aa49291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae79190614925565b611af357611af3614043565b611b50828787808060200260200160405190810160405280939291908181526020016000905b82821015611b4557611b36606083028601368190038101906149a9565b81526020019060010190611b19565b5050505050866132b3565b5095945050505050565b8042811015611ba35760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b611bec85856000818110611bb957611bb9614966565b611bcf9260206060909202019081019150614908565b33611be688886000818110611a0457611a04614966565b8a6131a6565b60008585611bfb600182614992565b818110611c0a57611c0a614966565b9050606002016020016020810190611c229190614908565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e91906149ff565b9050611c9b868686613971565b86611d47828888611cad600182614992565b818110611cbc57611cbc614966565b9050606002016020016020810190611cd49190614908565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4191906149ff565b90613d44565b1015611da65760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b5050505050505050565b60608142811015611dfb5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b611e5186866000818110611e1157611e11614966565b611e279260206060909202019081019150614908565b33611e3e89896000818110610cdb57610cdb614966565b8a600081518110610a8f57610a8f614966565b611ea3878787808060200260200160405190810160405280939291908181526020016000905b82821015611b4557611e94606083028601368190038101906149a9565b81526020019060010190611e77565b509495945050505050565b8042811015611ef75760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611f3457611f34614966565b611f4a9260206060909202019081019150614908565b6001600160a01b031614611fa05760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561200057600080fd5b505af1158015612014573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61205e88886000818110611a0457611a04614966565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e79190614925565b6120f3576120f3614043565b60008686612102600182614992565b81811061211157612111614966565b90506060020160200160208101906121299190614908565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015612171573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219591906149ff565b90506121a2878787613971565b87611d478289896121b4600182614992565b8181106121c3576121c3614966565b90506060020160200160208101906121db9190614908565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a0823190602401611d00565b80428110156122545760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858561228b600182614992565b81811061229a5761229a614966565b90506060020160200160208101906122b29190614908565b6001600160a01b0316146123085760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b61231e85856000818110611bb957611bb9614966565b612329858530613971565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b491906149ff565b9050868110156124175760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b50505050611da684826135c6565b60606001825110156124ef5760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b81516124fc906001614abc565b67ffffffffffffffff81111561251457612514614543565b60405190808252806020026020018201604052801561253d578160200160208202803683370190505b509050828160008151811061255457612554614966565b60200260200101818152505060005b82518110156127465760006125bf84838151811061258357612583614966565b6020026020010151600001518584815181106125a1576125a1614966565b602002602001015160200151868581518110610a6b57610a6b614966565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561262a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264e9190614925565b1561273357806001600160a01b031663f140a35a84848151811061267457612674614966565b602002602001015186858151811061268e5761268e614966565b6020026020010151600001516040518363ffffffff1660e01b81526004016126c99291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156126e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270a91906149ff565b83612716846001614abc565b8151811061272657612726614966565b6020026020010181815250505b508061273e81614ad4565b915050612563565b5092915050565b6040516306801cc360e41b81526001600160a01b038681166004830152858116602483015284151560448301526000918291829182917f00000000000000000000000000000000000000000000000000000000000000001690636801cc3090606401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f091906149e2565b9050600080806001600160a01b0384161561287a57836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612843573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286791906149ff565b90506128748c8c8c61168a565b90935091505b82158015612886575081155b156128b7578896508795506103e86128a66128a1888a614a18565b613da2565b6128b09190614992565b945061294a565b60006128c48a8585613e12565b905088811161290c57899750955085612905846128e1848b614a18565b6128eb9190614a37565b846128f6858b614a18565b6129009190614a37565b613f27565b9550612948565b60006129198a8587613e12565b98508997508890506129448561292f8584614a18565b6129399190614a37565b856128f6868c614a18565b9650505b505b50505050955095509592505050565b60008060006129698f8f8f6110ff565b9050600087612978578c61297c565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b1580156129eb57600080fd5b505af11580156129ff573d6000803e3d6000fd5b5050505050612a148f8f8f8f8f8f8f8f6105c9565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015612a7c5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b612aab8b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d6136ae565b90945092506000612add8c7f00000000000000000000000000000000000000000000000000000000000000008d6110ff565b9050612aeb8c3383886131a6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b4657600080fd5b505af1158015612b5a573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf39190614925565b612bff57612bff614043565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6b91906149ff565b925083341115612c8857612c8833612c838634614992565b6135c6565b50509750975097945050505050565b6000808242811015612ce35760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b612d138a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6105c9565b9093509150612d238a8685613f3f565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b50505050612da785836135c6565b5097509795505050505050565b6000806000612de48e7f00000000000000000000000000000000000000000000000000000000000000008f6110ff565b9050600087612df3578c612df7565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015612e6657600080fd5b505af1158015612e7a573d6000803e3d6000fd5b505050506110e58f8f8f8f8f8f8f6130b0565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c9190614925565b92915050565b60608142811015612f6d5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b612fbf888787808060200260200160405190810160405280939291908181526020016000905b82821015610c0557612fb0606083028601368190038101906149a9565b81526020019060010190612f93565b9150868260018451612fd19190614992565b81518110612fe157612fe1614966565b602002602001015110156130485760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b61305e86866000818110610cae57610cae614966565b610e8d828787808060200260200160405190810160405280939291908181526020016000905b82821015611b45576130a1606083028601368190038101906149a9565b81526020019060010190613084565b60008082428110156130fc5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b61312c8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6105c9565b6040516370a0823160e01b81523060048201529194509250612d23908b9087906001600160a01b038316906370a0823190602401602060405180830381865afa15801561317d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a191906149ff565b613f3f565b6000846001600160a01b03163b116131bd57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17905291516000928392908816916132369190614b19565b6000604051808303816000865af19150503d8060008114613273576040519150601f19603f3d011682016040523d82523d6000602084013e613278565b606091505b50915091508180156132a25750805115806132a25750808060200190518101906132a29190614925565b6132ab57600080fd5b505050505050565b60005b82518110156135c05760006133058483815181106132d6576132d6614966565b6020026020010151600001518584815181106132f4576132f4614966565b60200260200101516020015161121f565b509050600085613316846001614abc565b8151811061332657613326614966565b60200260200101519050600080836001600160a01b031687868151811061334f5761334f614966565b6020026020010151600001516001600160a01b03161461337157826000613375565b6000835b915091506000600188516133899190614992565b86106133955786613408565b613408886133a4886001614abc565b815181106133b4576133b4614966565b602002602001015160000151898860016133ce9190614abc565b815181106133de576133de614966565b6020026020010151602001518a8960016133f89190614abc565b81518110610a6b57610a6b614966565b905061345b88878151811061341f5761341f614966565b60200260200101516000015189888151811061343d5761343d614966565b6020026020010151602001518a8981518110610a6b57610a6b614966565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613498576020820181803683370190505b506040518563ffffffff1660e01b81526004016134b89493929190614b35565b600060405180830381600087803b1580156134d257600080fd5b505af11580156134e6573d6000803e3d6000fd5b50505050866001600160a01b0316336001600160a01b03167f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e508b898151811061353157613531614966565b60200260200101518b8a8151811061354b5761354b614966565b6020026020010151600001518c8b8151811061356957613569614966565b6020026020010151604001516040516135a0939291909283526001600160a01b039190911660208301521515604082015260600190565b60405180910390a3505050505080806135b890614ad4565b9150506132b6565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516135f09190614b19565b60006040518083038185875af1925050503d806000811461362d576040519150601f19603f3d011682016040523d82523d6000602084013e613632565b606091505b50509050806136a95760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c454400000000000000000000000000000000000000000000000000000000006064820152608401610611565b505050565b600080838610156136be57600080fd5b828510156136cb57600080fd5b6040516306801cc360e41b81526001600160a01b038a81166004830152898116602483015288151560448301526000917f000000000000000000000000000000000000000000000000000000000000000090911690636801cc3090606401602060405180830381865afa158015613746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061376a91906149e2565b90506001600160a01b038116613832576040517f82dfdce40000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301528a8116602483015289151560448301527f000000000000000000000000000000000000000000000000000000000000000016906382dfdce4906064016020604051808303816000875af115801561380b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382f91906149e2565b90505b6000806138408c8c8c61168a565b91509150816000148015613852575080155b1561386257889450879350613962565b600061386f8a8484613e12565b90508881116138df57868110156138d45760405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60448201526215539560ea1b6064820152608401610611565b899550935083613960565b60006138ec8a8486613e12565b90508a8111156138fe576138fe614043565b8881101561395a5760405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60448201526215539560ea1b6064820152608401610611565b95508894505b505b50505097509795505050505050565b60005b828110156135c05760008085858481811061399157613991614966565b6139a79260206060909202019081019150614908565b8686858181106139b9576139b9614966565b90506060020160200160208101906139d19190614908565b9150915060006139e1838361121f565b5090506000613a4d8888878181106139fb576139fb614966565b613a119260206060909202019081019150614908565b898988818110613a2357613a23614966565b9050606002016020016020810190613a3b9190614908565b8a8a89818110610d2f57610d2f614966565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ab79190614a77565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000866001600160a01b0316896001600160a01b031614613afe578183613b01565b82825b506040516370a0823160e01b81526001600160a01b038881166004830152919250613b3a918391908c16906370a0823190602401611d00565b9450613b47858a8a611436565b5080945050505050600080856001600160a01b0316886001600160a01b031614613b7357826000613b77565b6000835b90925090506000613b8960018d614992565b8a10613b95578a613c1a565b613c1a8d8d613ba58d6001614abc565b818110613bb457613bb4614966565b613bca9260206060909202019081019150614908565b8e8e613bd78e6001614abc565b818110613be657613be6614966565b9050606002016020016020810190613bfe9190614908565b8f8f613c0b8f6001614abc565b818110610d2f57610d2f614966565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f90613c759086908690869060248101614b35565b600060405180830381600087803b158015613c8f57600080fd5b505af1158015613ca3573d6000803e3d6000fd5b5050505060008d8d8c818110613cbb57613cbb614966565b9050606002016040016020810190613cd391906149c5565b604080518881526001600160a01b038d81166020830152831515828401529151929350908e169133917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50919081900360600190a3505050505050505050508080613d3c90614ad4565b915050613974565b600082613d518382614992565b9150811115612f1c5760405162461bcd60e51b815260206004820152601360248201527f4d6174683a205375622d756e646572666c6f77000000000000000000000000006044820152606401610611565b60006003821115613e035750806000613dbc600283614a37565b613dc7906001614abc565b90505b81811015613dfd57905080600281613de28186614a37565b613dec9190614abc565b613df69190614a37565b9050613dca565b50919050565b8115613e0d575060015b919050565b6000808411613e895760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e60448201527f54000000000000000000000000000000000000000000000000000000000000006064820152608401610611565b600083118015613e995750600082115b613f0a5760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c4951554960448201527f44495459000000000000000000000000000000000000000000000000000000006064820152608401610611565b82613f158386614a18565b613f1f9190614a37565b949350505050565b6000818310613f365781613f38565b825b9392505050565b6000836001600160a01b03163b11613f5657600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1790529151600092839290871691613fc79190614b19565b6000604051808303816000865af19150503d8060008114614004576040519150601f19603f3d011682016040523d82523d6000602084013e614009565b606091505b50915091508180156140335750805115806140335750808060200190518101906140339190614925565b61403c57600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461406e57600080fd5b50565b8035613e0d81614059565b801515811461406e57600080fd5b600080600080600080600080610100898b0312156140a757600080fd5b88356140b281614059565b975060208901356140c281614059565b965060408901356140d28161407c565b9550606089013594506080890135935060a0890135925060c08901356140f781614059565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a03121561412a57600080fd5b8735965060208801359550604088013561414381614059565b9450606088013561415381614059565b935060808801356141638161407c565b925060a088013561417381614059565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b818110156141c2578351835292840192918401916001016141a6565b50909695505050505050565b60008083601f8401126141e057600080fd5b50813567ffffffffffffffff8111156141f857600080fd5b60208301915083602060608302850101111561132757600080fd5b60008060008060008060a0878903121561422c57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561425157600080fd5b61425d89828a016141ce565b909550935050606087013561427181614059565b80925050608087013590509295509295509295565b6000806000806080858703121561429c57600080fd5b84356142a781614059565b935060208501356142b781614059565b925060408501356142c78161407c565b9396929550929360600135925050565b803560ff81168114613e0d57600080fd5b60008060008060008060008060008060006101608c8e03121561430a57600080fd5b8b3561431581614059565b9a5060208c01356143258161407c565b995060408c0135985060608c0135975060808c0135965060a08c013561434a81614059565b955060c08c0135945060e08c01356143618161407c565b93506143706101008d016142d7565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000606084860312156143a757600080fd5b83356143b281614059565b925060208401356143c281614059565b915060408401356143d28161407c565b809150509250925092565b600080604083850312156143f057600080fd5b82356143fb81614059565b9150602083013561440b81614059565b809150509250929050565b60008060008060008060008060006101208a8c03121561443557600080fd5b893561444081614059565b985060208a013561445081614059565b975060408a01356144608161407c565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561448c81614059565b809250506101008a013590509295985092959850929598565b6000806000606084860312156144ba57600080fd5b8335925060208401356144cc81614059565b915060408401356143d281614059565b6000806000806000608086880312156144f457600080fd5b85359450602086013567ffffffffffffffff81111561451257600080fd5b61451e888289016141ce565b909550935050604086013561453281614059565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561458257614582614543565b604052919050565b600067ffffffffffffffff8211156145a4576145a4614543565b5060051b60200190565b6000806000806000608086880312156145c657600080fd5b853567ffffffffffffffff808211156145de57600080fd5b818801915088601f8301126145f257600080fd5b813560206146076146028361458a565b614559565b82815260059290921b8401810191818101908c84111561462657600080fd5b948201945b838610156146445785358252948201949082019061462b565b9950508901359250508082111561465a57600080fd5b50614667888289016141ce565b9095509350614532905060408701614071565b60006060828403121561468c57600080fd5b6040516060810181811067ffffffffffffffff821117156146af576146af614543565b60405290508082356146c081614059565b815260208301356146d081614059565b602082015260408301356146e38161407c565b6040919091015292915050565b6000806040838503121561470357600080fd5b8235915060208084013567ffffffffffffffff81111561472257600080fd5b8401601f8101861361473357600080fd5b80356147416146028261458a565b8181526060918202830184019184820191908984111561476057600080fd5b938501935b83851015614786576147778a8661467a565b83529384019391850191614765565b5080955050505050509250929050565b600080600080600060a086880312156147ae57600080fd5b85356147b981614059565b945060208601356147c981614059565b935060408601356147d98161407c565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f03121561481457600080fd5b8c3561481f81614059565b9b5060208d013561482f81614059565b9a5060408d013561483f8161407c565b995060608d0135985060808d0135975060a08d0135965060c08d013561486481614059565b955060e08d013594506101008d013561487c8161407c565b935061488b6101208e016142d7565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a0312156148c857600080fd5b87356148d381614059565b965060208801356148e38161407c565b955060408801359450606088013593506080880135925060a088013561417381614059565b60006020828403121561491a57600080fd5b8135613f3881614059565b60006020828403121561493757600080fd5b8151613f388161407c565b6000806040838503121561495557600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156149a4576149a461497c565b500390565b6000606082840312156149bb57600080fd5b613f38838361467a565b6000602082840312156149d757600080fd5b8135613f388161407c565b6000602082840312156149f457600080fd5b8151613f3881614059565b600060208284031215614a1157600080fd5b5051919050565b6000816000190483118215151615614a3257614a3261497c565b500290565b600082614a5457634e487b7160e01b600052601260045260246000fd5b500490565b80516dffffffffffffffffffffffffffff81168114613e0d57600080fd5b600080600060608486031215614a8c57600080fd5b614a9584614a59565b9250614aa360208501614a59565b9150604084015163ffffffff811681146143d257600080fd5b60008219821115614acf57614acf61497c565b500190565b600060018201614ae657614ae661497c565b5060010190565b60005b83811015614b08578181015183820152602001614af0565b838111156135c05750506000910152565b60008251614b2b818460208701614aed565b9190910192915050565b8481528360208201526001600160a01b03831660408201526080606082015260008251806080840152614b6f8160a0850160208701614aed565b601f01601f19169190910160a0019594505050505056fea26469706673582212208165068a40b4a5ee300abe61242f3820c72bd2edc994bb04f01888718c56f93e64736f6c634300080d0033000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f
Deployed Bytecode
0x6080604052600436106101a55760003560e01c806376c72751116100e1578063c45a01551161008a578063e5e31b1311610064578063e5e31b1314610525578063f242862114610555578063f41766d814610589578063fe411f14146105a957600080fd5b8063c45a0155146104b1578063d7b0e0a5146104e5578063e2d9d4dc1461050557600080fd5b806398a0fb3c116100bb57806398a0fb3c1461045e578063a32b1fcd1461047e578063b7e0d4c01461049e57600080fd5b806376c727511461040b5780637af728c81461041e5780639881fcb41461043e57600080fd5b8063544caa561161014e5780635e60dab5116101285780635e60dab51461039857806367ffb66a146103b85780636cc1ae13146103cb5780637301e3c8146103eb57600080fd5b8063544caa56146102e85780635a47ddc3146103285780635e1e63251461036357600080fd5b80634386e63c1161017f5780634386e63c14610270578063448725b4146102905780634c1ee03e146102b057600080fd5b80630dede6c4146101e957806313dcfc591461022357806318a130861461025057600080fd5b366101e457336001600160a01b037f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16146101e2576101e2614043565b005b600080fd5b3480156101f557600080fd5b5061020961020436600461408a565b6105c9565b604080519283526020830191909152015b60405180910390f35b34801561022f57600080fd5b5061024361023e36600461410f565b610838565b60405161021a919061418a565b34801561025c57600080fd5b5061024361026b366004614213565b610ab4565b34801561027c57600080fd5b5061020961028b366004614286565b610e98565b34801561029c57600080fd5b506102096102ab3660046142e8565b61100c565b3480156102bc57600080fd5b506102d06102cb366004614392565b6110ff565b6040516001600160a01b03909116815260200161021a565b3480156102f457600080fd5b506103086103033660046143dd565b61121f565b604080516001600160a01b0393841681529290911660208301520161021a565b34801561033457600080fd5b50610348610343366004614416565b61132e565b6040805193845260208401929092529082015260600161021a565b34801561036f57600080fd5b5061038361037e3660046144a5565b611436565b6040805192835290151560208301520161021a565b3480156103a457600080fd5b506102096103b3366004614392565b61168a565b6102436103c63660046144dc565b611762565b3480156103d757600080fd5b506101e26103e6366004614213565b611b5a565b3480156103f757600080fd5b506102436104063660046145ae565b611db0565b6101e26104193660046144dc565b611eae565b34801561042a57600080fd5b506101e2610439366004614213565b61220b565b34801561044a57600080fd5b506102436104593660046146f0565b61249b565b34801561046a57600080fd5b50610348610479366004614796565b61274d565b34801561048a57600080fd5b506102096104993660046147f1565b612959565b6103486104ac3660046148ad565b612a2e565b3480156104bd57600080fd5b506102d07f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee81565b3480156104f157600080fd5b506102096105003660046148ad565b612c97565b34801561051157600080fd5b506102096105203660046142e8565b612db4565b34801561053157600080fd5b50610545610540366004614908565b612e8d565b604051901515815260200161021a565b34801561056157600080fd5b506102d07f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f81565b34801561059557600080fd5b506102436105a4366004614213565b612f22565b3480156105b557600080fd5b506102096105c43660046148ad565b6130b0565b600080824281101561061a5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b60448201526064015b60405180910390fd5b60006106278c8c8c6110ff565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190614925565b6106aa57600080fd5b6040517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561070f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107339190614942565b9150915060006107438f8f61121f565b509050806001600160a01b03168f6001600160a01b031614610766578183610769565b82825b90975095508a8710156107ca5760405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60448201526215539560ea1b6064820152608401610611565b898610156108265760405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60448201526215539560ea1b6064820152608401610611565b50505050509850989650505050505050565b606081428110156108835760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161089a57905050905087816000815181106108dd576108dd614966565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061091557610915614966565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061094d5761094d614966565b602090810291909101015190151560409091015261096b8a8261249b565b925088836001855161097d9190614992565b8151811061098d5761098d614966565b602002602001015110156109f45760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b610a9c81600081518110610a0a57610a0a614966565b60200260200101516000015133610a7c84600081518110610a2d57610a2d614966565b60200260200101516000015185600081518110610a4c57610a4c614966565b60200260200101516020015186600081518110610a6b57610a6b614966565b6020026020010151604001516110ff565b86600081518110610a8f57610a8f614966565b60200260200101516131a6565b610aa78382876132b3565b5050979650505050505050565b60608142811015610aff5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b6001600160a01b037f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f168686610b36600182614992565b818110610b4557610b45614966565b9050606002016020016020810190610b5d9190614908565b6001600160a01b031614610bb35760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b610c0f888787808060200260200160405190810160405280939291908181526020016000905b82821015610c0557610bf6606083028601368190038101906149a9565b81526020019060010190610bd9565b505050505061249b565b9150868260018451610c219190614992565b81518110610c3157610c31614966565b60200260200101511015610c985760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b610d5a86866000818110610cae57610cae614966565b610cc49260206060909202019081019150614908565b33610d4789896000818110610cdb57610cdb614966565b610cf19260206060909202019081019150614908565b8a8a6000818110610d0457610d04614966565b9050606002016020016020810190610d1c9190614908565b8b8b6000818110610d2f57610d2f614966565b90506060020160400160208101906102cb91906149c5565b85600081518110610a8f57610a8f614966565b610db7828787808060200260200160405190810160405280939291908181526020016000905b82821015610dac57610d9d606083028601368190038101906149a9565b81526020019060010190610d80565b5050505050306132b3565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b0316632e1a7d4d8360018551610df59190614992565b81518110610e0557610e05614966565b60200260200101516040518263ffffffff1660e01b8152600401610e2b91815260200190565b600060405180830381600087803b158015610e4557600080fd5b505af1158015610e59573d6000803e3d6000fd5b50505050610e8d848360018551610e709190614992565b81518110610e8057610e80614966565b60200260200101516135c6565b509695505050505050565b6040516306801cc360e41b81526001600160a01b03858116600483015284811660248301528315156044830152600091829182917f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee90911690636801cc3090606401602060405180830381865afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b91906149e2565b90506001600160a01b038116610f58576000809250925050611003565b600080610f6689898961168a565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce91906149ff565b905080610fdb8489614a18565b610fe59190614a37565b955080610ff28389614a18565b610ffc9190614a37565b9450505050505b94509492505050565b600080600061103c8e7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f8f6110ff565b905060008761104b578c61104f565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b1580156110be57600080fd5b505af11580156110d2573d6000803e3d6000fd5b505050506110e58f8f8f8f8f8f8f612c97565b809450819550505050509b509b9950505050505050505050565b600080600061110e868661121f565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee90604901604051602081830303815290604052805190602001207ff40e8808230a29863f9f7f99beb90d28bca2c60094e78d93cca67f746dbfd1426040516020016111fd939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b0316036112a95760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f414444524553534560448201527f53000000000000000000000000000000000000000000000000000000000000006064820152608401610611565b826001600160a01b0316846001600160a01b0316106112c95782846112cc565b83835b90925090506001600160a01b0382166113275760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f414444524553530000000000006044820152606401610611565b9250929050565b6000806000834281101561137c5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b61138b8d8d8d8d8d8d8d6136ae565b9094509250600061139d8e8e8e6110ff565b90506113ab8e3383886131a6565b6113b78d3383876131a6565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156113ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142391906149ff565b9250505099509950999650505050505050565b6000806000611447858560016110ff565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee9091169063e5e31b1390602401602060405180830381865afa1580156114b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114db9190614925565b15611554576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561152d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155191906149ff565b91505b611560878760006110ff565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee9091169063e5e31b1390602401602060405180830381865afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef9190614925565b15611668576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166591906149ff565b90505b8082116116775780600061167b565b8160015b94509450505050935093915050565b6000806000611699868661121f565b5090506000806116aa8888886110ff565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156116e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170b9190614a77565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316886001600160a01b031614611750578082611753565b81815b90999098509650505050505050565b606081428110156117ad5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b0316868660008181106117ea576117ea614966565b6118009260206060909202019081019150614908565b6001600160a01b0316146118565760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b6118a8348787808060200260200160405190810160405280939291908181526020016000905b82821015610c0557611899606083028601368190038101906149a9565b8152602001906001019061187c565b91508682600184516118ba9190614992565b815181106118ca576118ca614966565b602002602001015110156119315760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db08360008151811061197357611973614966565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156119a657600080fd5b505af11580156119ba573d6000803e3d6000fd5b50505050507f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663a9059cbb611a5888886000818110611a0457611a04614966565b611a1a9260206060909202019081019150614908565b89896000818110611a2d57611a2d614966565b9050606002016020016020810190611a459190614908565b8a8a6000818110610d2f57610d2f614966565b84600081518110611a6b57611a6b614966565b60200260200101516040518363ffffffff1660e01b8152600401611aa49291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae79190614925565b611af357611af3614043565b611b50828787808060200260200160405190810160405280939291908181526020016000905b82821015611b4557611b36606083028601368190038101906149a9565b81526020019060010190611b19565b5050505050866132b3565b5095945050505050565b8042811015611ba35760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b611bec85856000818110611bb957611bb9614966565b611bcf9260206060909202019081019150614908565b33611be688886000818110611a0457611a04614966565b8a6131a6565b60008585611bfb600182614992565b818110611c0a57611c0a614966565b9050606002016020016020810190611c229190614908565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e91906149ff565b9050611c9b868686613971565b86611d47828888611cad600182614992565b818110611cbc57611cbc614966565b9050606002016020016020810190611cd49190614908565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4191906149ff565b90613d44565b1015611da65760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b5050505050505050565b60608142811015611dfb5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b611e5186866000818110611e1157611e11614966565b611e279260206060909202019081019150614908565b33611e3e89896000818110610cdb57610cdb614966565b8a600081518110610a8f57610a8f614966565b611ea3878787808060200260200160405190810160405280939291908181526020016000905b82821015611b4557611e94606083028601368190038101906149a9565b81526020019060010190611e77565b509495945050505050565b8042811015611ef75760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031685856000818110611f3457611f34614966565b611f4a9260206060909202019081019150614908565b6001600160a01b031614611fa05760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b60003490507f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561200057600080fd5b505af1158015612014573d6000803e3d6000fd5b50505050507f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663a9059cbb61205e88886000818110611a0457611a04614966565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e79190614925565b6120f3576120f3614043565b60008686612102600182614992565b81811061211157612111614966565b90506060020160200160208101906121299190614908565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015612171573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219591906149ff565b90506121a2878787613971565b87611d478289896121b4600182614992565b8181106121c3576121c3614966565b90506060020160200160208101906121db9190614908565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a0823190602401611d00565b80428110156122545760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b6001600160a01b037f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16858561228b600182614992565b81811061229a5761229a614966565b90506060020160200160208101906122b29190614908565b6001600160a01b0316146123085760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b61231e85856000818110611bb957611bb9614966565b612329858530613971565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b0316906370a0823190602401602060405180830381865afa158015612390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b491906149ff565b9050868110156124175760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b50505050611da684826135c6565b60606001825110156124ef5760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152606401610611565b81516124fc906001614abc565b67ffffffffffffffff81111561251457612514614543565b60405190808252806020026020018201604052801561253d578160200160208202803683370190505b509050828160008151811061255457612554614966565b60200260200101818152505060005b82518110156127465760006125bf84838151811061258357612583614966565b6020026020010151600001518584815181106125a1576125a1614966565b602002602001015160200151868581518110610a6b57610a6b614966565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee9091169063e5e31b1390602401602060405180830381865afa15801561262a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264e9190614925565b1561273357806001600160a01b031663f140a35a84848151811061267457612674614966565b602002602001015186858151811061268e5761268e614966565b6020026020010151600001516040518363ffffffff1660e01b81526004016126c99291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156126e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270a91906149ff565b83612716846001614abc565b8151811061272657612726614966565b6020026020010181815250505b508061273e81614ad4565b915050612563565b5092915050565b6040516306801cc360e41b81526001600160a01b038681166004830152858116602483015284151560448301526000918291829182917f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee1690636801cc3090606401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f091906149e2565b9050600080806001600160a01b0384161561287a57836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612843573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286791906149ff565b90506128748c8c8c61168a565b90935091505b82158015612886575081155b156128b7578896508795506103e86128a66128a1888a614a18565b613da2565b6128b09190614992565b945061294a565b60006128c48a8585613e12565b905088811161290c57899750955085612905846128e1848b614a18565b6128eb9190614a37565b846128f6858b614a18565b6129009190614a37565b613f27565b9550612948565b60006129198a8587613e12565b98508997508890506129448561292f8584614a18565b6129399190614a37565b856128f6868c614a18565b9650505b505b50505050955095509592505050565b60008060006129698f8f8f6110ff565b9050600087612978578c61297c565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b1580156129eb57600080fd5b505af11580156129ff573d6000803e3d6000fd5b5050505050612a148f8f8f8f8f8f8f8f6105c9565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015612a7c5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b612aab8b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f8c8c348d8d6136ae565b90945092506000612add8c7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f8d6110ff565b9050612aeb8c3383886131a6565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b4657600080fd5b505af1158015612b5a573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16935063a9059cbb925060440190506020604051808303816000875af1158015612bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf39190614925565b612bff57612bff614043565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6b91906149ff565b925083341115612c8857612c8833612c838634614992565b6135c6565b50509750975097945050505050565b6000808242811015612ce35760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b612d138a7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f8b8b8b8b308b6105c9565b9093509150612d238a8685613f3f565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b50505050612da785836135c6565b5097509795505050505050565b6000806000612de48e7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f8f6110ff565b9050600087612df3578c612df7565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015612e6657600080fd5b505af1158015612e7a573d6000803e3d6000fd5b505050506110e58f8f8f8f8f8f8f6130b0565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee9091169063e5e31b1390602401602060405180830381865afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c9190614925565b92915050565b60608142811015612f6d5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b612fbf888787808060200260200160405190810160405280939291908181526020016000905b82821015610c0557612fb0606083028601368190038101906149a9565b81526020019060010190612f93565b9150868260018451612fd19190614992565b81518110612fe157612fe1614966565b602002602001015110156130485760405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610611565b61305e86866000818110610cae57610cae614966565b610e8d828787808060200260200160405190810160405280939291908181526020016000905b82821015611b45576130a1606083028601368190038101906149a9565b81526020019060010190613084565b60008082428110156130fc5760405162461bcd60e51b815260206004820152601560248201527410985cd9558c549bdd5d195c8e8811561412549151605a1b6044820152606401610611565b61312c8a7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f8b8b8b8b308b6105c9565b6040516370a0823160e01b81523060048201529194509250612d23908b9087906001600160a01b038316906370a0823190602401602060405180830381865afa15801561317d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a191906149ff565b613f3f565b6000846001600160a01b03163b116131bd57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17905291516000928392908816916132369190614b19565b6000604051808303816000865af19150503d8060008114613273576040519150601f19603f3d011682016040523d82523d6000602084013e613278565b606091505b50915091508180156132a25750805115806132a25750808060200190518101906132a29190614925565b6132ab57600080fd5b505050505050565b60005b82518110156135c05760006133058483815181106132d6576132d6614966565b6020026020010151600001518584815181106132f4576132f4614966565b60200260200101516020015161121f565b509050600085613316846001614abc565b8151811061332657613326614966565b60200260200101519050600080836001600160a01b031687868151811061334f5761334f614966565b6020026020010151600001516001600160a01b03161461337157826000613375565b6000835b915091506000600188516133899190614992565b86106133955786613408565b613408886133a4886001614abc565b815181106133b4576133b4614966565b602002602001015160000151898860016133ce9190614abc565b815181106133de576133de614966565b6020026020010151602001518a8960016133f89190614abc565b81518110610a6b57610a6b614966565b905061345b88878151811061341f5761341f614966565b60200260200101516000015189888151811061343d5761343d614966565b6020026020010151602001518a8981518110610a6b57610a6b614966565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613498576020820181803683370190505b506040518563ffffffff1660e01b81526004016134b89493929190614b35565b600060405180830381600087803b1580156134d257600080fd5b505af11580156134e6573d6000803e3d6000fd5b50505050866001600160a01b0316336001600160a01b03167f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e508b898151811061353157613531614966565b60200260200101518b8a8151811061354b5761354b614966565b6020026020010151600001518c8b8151811061356957613569614966565b6020026020010151604001516040516135a0939291909283526001600160a01b039190911660208301521515604082015260600190565b60405180910390a3505050505080806135b890614ad4565b9150506132b6565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516135f09190614b19565b60006040518083038185875af1925050503d806000811461362d576040519150601f19603f3d011682016040523d82523d6000602084013e613632565b606091505b50509050806136a95760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c454400000000000000000000000000000000000000000000000000000000006064820152608401610611565b505050565b600080838610156136be57600080fd5b828510156136cb57600080fd5b6040516306801cc360e41b81526001600160a01b038a81166004830152898116602483015288151560448301526000917f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee90911690636801cc3090606401602060405180830381865afa158015613746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061376a91906149e2565b90506001600160a01b038116613832576040517f82dfdce40000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301528a8116602483015289151560448301527f000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee16906382dfdce4906064016020604051808303816000875af115801561380b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382f91906149e2565b90505b6000806138408c8c8c61168a565b91509150816000148015613852575080155b1561386257889450879350613962565b600061386f8a8484613e12565b90508881116138df57868110156138d45760405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60448201526215539560ea1b6064820152608401610611565b899550935083613960565b60006138ec8a8486613e12565b90508a8111156138fe576138fe614043565b8881101561395a5760405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60448201526215539560ea1b6064820152608401610611565b95508894505b505b50505097509795505050505050565b60005b828110156135c05760008085858481811061399157613991614966565b6139a79260206060909202019081019150614908565b8686858181106139b9576139b9614966565b90506060020160200160208101906139d19190614908565b9150915060006139e1838361121f565b5090506000613a4d8888878181106139fb576139fb614966565b613a119260206060909202019081019150614908565b898988818110613a2357613a23614966565b9050606002016020016020810190613a3b9190614908565b8a8a89818110610d2f57610d2f614966565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ab79190614a77565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000866001600160a01b0316896001600160a01b031614613afe578183613b01565b82825b506040516370a0823160e01b81526001600160a01b038881166004830152919250613b3a918391908c16906370a0823190602401611d00565b9450613b47858a8a611436565b5080945050505050600080856001600160a01b0316886001600160a01b031614613b7357826000613b77565b6000835b90925090506000613b8960018d614992565b8a10613b95578a613c1a565b613c1a8d8d613ba58d6001614abc565b818110613bb457613bb4614966565b613bca9260206060909202019081019150614908565b8e8e613bd78e6001614abc565b818110613be657613be6614966565b9050606002016020016020810190613bfe9190614908565b8f8f613c0b8f6001614abc565b818110610d2f57610d2f614966565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f90613c759086908690869060248101614b35565b600060405180830381600087803b158015613c8f57600080fd5b505af1158015613ca3573d6000803e3d6000fd5b5050505060008d8d8c818110613cbb57613cbb614966565b9050606002016040016020810190613cd391906149c5565b604080518881526001600160a01b038d81166020830152831515828401529151929350908e169133917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50919081900360600190a3505050505050505050508080613d3c90614ad4565b915050613974565b600082613d518382614992565b9150811115612f1c5760405162461bcd60e51b815260206004820152601360248201527f4d6174683a205375622d756e646572666c6f77000000000000000000000000006044820152606401610611565b60006003821115613e035750806000613dbc600283614a37565b613dc7906001614abc565b90505b81811015613dfd57905080600281613de28186614a37565b613dec9190614abc565b613df69190614a37565b9050613dca565b50919050565b8115613e0d575060015b919050565b6000808411613e895760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e60448201527f54000000000000000000000000000000000000000000000000000000000000006064820152608401610611565b600083118015613e995750600082115b613f0a5760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c4951554960448201527f44495459000000000000000000000000000000000000000000000000000000006064820152608401610611565b82613f158386614a18565b613f1f9190614a37565b949350505050565b6000818310613f365781613f38565b825b9392505050565b6000836001600160a01b03163b11613f5657600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1790529151600092839290871691613fc79190614b19565b6000604051808303816000865af19150503d8060008114614004576040519150601f19603f3d011682016040523d82523d6000602084013e614009565b606091505b50915091508180156140335750805115806140335750808060200190518101906140339190614925565b61403c57600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461406e57600080fd5b50565b8035613e0d81614059565b801515811461406e57600080fd5b600080600080600080600080610100898b0312156140a757600080fd5b88356140b281614059565b975060208901356140c281614059565b965060408901356140d28161407c565b9550606089013594506080890135935060a0890135925060c08901356140f781614059565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a03121561412a57600080fd5b8735965060208801359550604088013561414381614059565b9450606088013561415381614059565b935060808801356141638161407c565b925060a088013561417381614059565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b818110156141c2578351835292840192918401916001016141a6565b50909695505050505050565b60008083601f8401126141e057600080fd5b50813567ffffffffffffffff8111156141f857600080fd5b60208301915083602060608302850101111561132757600080fd5b60008060008060008060a0878903121561422c57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561425157600080fd5b61425d89828a016141ce565b909550935050606087013561427181614059565b80925050608087013590509295509295509295565b6000806000806080858703121561429c57600080fd5b84356142a781614059565b935060208501356142b781614059565b925060408501356142c78161407c565b9396929550929360600135925050565b803560ff81168114613e0d57600080fd5b60008060008060008060008060008060006101608c8e03121561430a57600080fd5b8b3561431581614059565b9a5060208c01356143258161407c565b995060408c0135985060608c0135975060808c0135965060a08c013561434a81614059565b955060c08c0135945060e08c01356143618161407c565b93506143706101008d016142d7565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000606084860312156143a757600080fd5b83356143b281614059565b925060208401356143c281614059565b915060408401356143d28161407c565b809150509250925092565b600080604083850312156143f057600080fd5b82356143fb81614059565b9150602083013561440b81614059565b809150509250929050565b60008060008060008060008060006101208a8c03121561443557600080fd5b893561444081614059565b985060208a013561445081614059565b975060408a01356144608161407c565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561448c81614059565b809250506101008a013590509295985092959850929598565b6000806000606084860312156144ba57600080fd5b8335925060208401356144cc81614059565b915060408401356143d281614059565b6000806000806000608086880312156144f457600080fd5b85359450602086013567ffffffffffffffff81111561451257600080fd5b61451e888289016141ce565b909550935050604086013561453281614059565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561458257614582614543565b604052919050565b600067ffffffffffffffff8211156145a4576145a4614543565b5060051b60200190565b6000806000806000608086880312156145c657600080fd5b853567ffffffffffffffff808211156145de57600080fd5b818801915088601f8301126145f257600080fd5b813560206146076146028361458a565b614559565b82815260059290921b8401810191818101908c84111561462657600080fd5b948201945b838610156146445785358252948201949082019061462b565b9950508901359250508082111561465a57600080fd5b50614667888289016141ce565b9095509350614532905060408701614071565b60006060828403121561468c57600080fd5b6040516060810181811067ffffffffffffffff821117156146af576146af614543565b60405290508082356146c081614059565b815260208301356146d081614059565b602082015260408301356146e38161407c565b6040919091015292915050565b6000806040838503121561470357600080fd5b8235915060208084013567ffffffffffffffff81111561472257600080fd5b8401601f8101861361473357600080fd5b80356147416146028261458a565b8181526060918202830184019184820191908984111561476057600080fd5b938501935b83851015614786576147778a8661467a565b83529384019391850191614765565b5080955050505050509250929050565b600080600080600060a086880312156147ae57600080fd5b85356147b981614059565b945060208601356147c981614059565b935060408601356147d98161407c565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f03121561481457600080fd5b8c3561481f81614059565b9b5060208d013561482f81614059565b9a5060408d013561483f8161407c565b995060608d0135985060808d0135975060a08d0135965060c08d013561486481614059565b955060e08d013594506101008d013561487c8161407c565b935061488b6101208e016142d7565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a0312156148c857600080fd5b87356148d381614059565b965060208801356148e38161407c565b955060408801359450606088013593506080880135925060a088013561417381614059565b60006020828403121561491a57600080fd5b8135613f3881614059565b60006020828403121561493757600080fd5b8151613f388161407c565b6000806040838503121561495557600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156149a4576149a461497c565b500390565b6000606082840312156149bb57600080fd5b613f38838361467a565b6000602082840312156149d757600080fd5b8135613f388161407c565b6000602082840312156149f457600080fd5b8151613f3881614059565b600060208284031215614a1157600080fd5b5051919050565b6000816000190483118215151615614a3257614a3261497c565b500290565b600082614a5457634e487b7160e01b600052601260045260246000fd5b500490565b80516dffffffffffffffffffffffffffff81168114613e0d57600080fd5b600080600060608486031215614a8c57600080fd5b614a9584614a59565b9250614aa360208501614a59565b9150604084015163ffffffff811681146143d257600080fd5b60008219821115614acf57614acf61497c565b500190565b600060018201614ae657614ae661497c565b5060010190565b60005b83811015614b08578181015183820152602001614af0565b838111156135c05750506000910152565b60008251614b2b818460208701614aed565b9190910192915050565b8481528360208201526001600160a01b03831660408201526080606082015260008251806080840152614b6f8160a0850160208701614aed565b601f01601f19169190910160a0019594505050505056fea26469706673582212208165068a40b4a5ee300abe61242f3820c72bd2edc994bb04f01888718c56f93e64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f
-----Decoded View---------------
Arg [0] : _factory (address): 0xBc7695Fd00E3b32D08124b7a4287493aEE99f9ee
Arg [1] : _wETH (address): 0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000bc7695fd00e3b32d08124b7a4287493aee99f9ee
Arg [1] : 000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1,725.18
Net Worth in ETH
Token Allocations
ETH
90.14%
POL
7.71%
BNB
2.15%
Multichain Portfolio | 35 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.