Overview
CELO Balance
CELO Value
$0.00More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
IceCreamSwapV2Router
Compiler Version
v0.6.6+commit.6c089d02
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity =0.6.6; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol"; import "@uniswap/lib/contracts/libraries/TransferHelper.sol"; import "./interfaces/IIceCreamSwapV2Router02.sol"; import "./libraries/IceCreamSwapV2Library.sol"; import "./libraries/SafeMath.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/IWETH.sol"; contract IceCreamSwapV2Router is IIceCreamSwapV2Router02 { using SafeMath for uint256; address public immutable override factory; address public immutable override WETH; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "IceCreamSwapV2Router: EXPIRED"); _; } constructor(address _factory, address _WETH) public { factory = _factory; WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal virtual returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) { IUniswapV2Factory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = IceCreamSwapV2Library.getReserves(factory, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = IceCreamSwapV2Library.quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "IceCreamSwapV2Router: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = IceCreamSwapV2Library.quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "IceCreamSwapV2Router: INSUFFICIENT_A_AMOUNT"); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = IceCreamSwapV2Library.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IUniswapV2Pair(pair).mint(to); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = IceCreamSwapV2Library.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IUniswapV2Pair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = IceCreamSwapV2Library.pairFor(factory, tokenA, tokenB); IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to); (address token0, ) = IceCreamSwapV2Library.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "IceCreamSwapV2Router: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "IceCreamSwapV2Router: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountA, uint256 amountB) { address pair = IceCreamSwapV2Library.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? uint256(-1) : liquidity; IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountToken, uint256 amountETH) { address pair = IceCreamSwapV2Library.pairFor(factory, token, WETH); uint256 value = approveMax ? uint256(-1) : liquidity; IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountETH) { (, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline); TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this))); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountETH) { address pair = IceCreamSwapV2Library.pairFor(factory, token, WETH); uint256 value = approveMax ? uint256(-1) : liquidity; IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint256[] memory amounts, address[] memory path, address _to) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = IceCreamSwapV2Library.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? IceCreamSwapV2Library.pairFor(factory, output, path[i + 2]) : _to; IUniswapV2Pair(IceCreamSwapV2Library.pairFor(factory, input, output)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = IceCreamSwapV2Library.getAmountsOut(factory, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, "IceCreamSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = IceCreamSwapV2Library.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "IceCreamSwapV2Router: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "IceCreamSwapV2Router: INVALID_PATH"); amounts = IceCreamSwapV2Library.getAmountsOut(factory, msg.value, path); require(amounts[amounts.length - 1] >= amountOutMin, "IceCreamSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0])); _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "IceCreamSwapV2Router: INVALID_PATH"); amounts = IceCreamSwapV2Library.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "IceCreamSwapV2Router: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "IceCreamSwapV2Router: INVALID_PATH"); amounts = IceCreamSwapV2Library.getAmountsOut(factory, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, "IceCreamSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "IceCreamSwapV2Router: INVALID_PATH"); amounts = IceCreamSwapV2Library.getAmountsIn(factory, amountOut, path); require(amounts[0] <= msg.value, "IceCreamSwapV2Router: EXCESSIVE_INPUT_AMOUNT"); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0])); _swap(amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = IceCreamSwapV2Library.sortTokens(input, output); IUniswapV2Pair pair = IUniswapV2Pair(IceCreamSwapV2Library.pairFor(factory, input, output)); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput); amountOutput = IceCreamSwapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? IceCreamSwapV2Library.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "IceCreamSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "IceCreamSwapV2Router: INVALID_PATH"); uint256 amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert(IWETH(WETH).transfer(IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amountIn)); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "IceCreamSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { require(path[path.length - 1] == WETH, "IceCreamSwapV2Router: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, IceCreamSwapV2Library.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require(amountOut >= amountOutMin, "IceCreamSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) public pure virtual override returns (uint256 amountB) { return IceCreamSwapV2Library.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountOut) { return IceCreamSwapV2Library.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountIn) { return IceCreamSwapV2Library.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut( uint256 amountIn, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return IceCreamSwapV2Library.getAmountsOut(factory, amountIn, path); } function getAmountsIn( uint256 amountOut, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return IceCreamSwapV2Library.getAmountsIn(factory, amountOut, path); } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
pragma solidity >=0.5.0; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); }
pragma solidity >=0.6.2; interface IIceCreamSwapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); }
pragma solidity >=0.6.2; import "./IIceCreamSwapV2Router01.sol"; interface IIceCreamSwapV2Router02 is IIceCreamSwapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
pragma solidity >=0.5.0; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol"; import "./SafeMath.sol"; library IceCreamSwapV2Library { using SafeMath for uint256; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "IceCreamSwapV2Library: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "IceCreamSwapV2Library: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint256( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), hex"0437378fc27e93c612c5c385779bf540ca2064b54705e48c313aa216da380100" // init code hash ) ) ) ); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) { require(amountA > 0, "IceCreamSwapV2Library: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "IceCreamSwapV2Library: INSUFFICIENT_LIQUIDITY"); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "IceCreamSwapV2Library: INSUFFICIENT_INPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "IceCreamSwapV2Library: INSUFFICIENT_LIQUIDITY"); uint256 amountInWithFee = amountIn.mul(997); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "IceCreamSwapV2Library: INSUFFICIENT_OUTPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "IceCreamSwapV2Library: INSUFFICIENT_LIQUIDITY"); uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "IceCreamSwapV2Library: INVALID_PATH"); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "IceCreamSwapV2Library: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } }
pragma solidity =0.6.6; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "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"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"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":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"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":"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":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"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":"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":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"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"},{"internalType":"address[]","name":"path","type":"address[]"},{"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"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b506040516200574238038062005742833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6155bb62000187600039806101ac5280610e5d5280610e985280610fd5528061128252806116dc52806118aa5280611df25280611f605280612030528061213752806122d45280612369528061261b52806126c25280612797528061289c528061296e52806129ef528061307e52806133b4528061340a528061343e52806134bf52806136d9528061387352806139085250806110b152806111af5280611355528061138e528061153952806117b852806118885280611a75528061220752806123a852806125515280612a2e5280612d715280613003528061302c528061305c528061323952806133e852806137a95280613947528061439a52806143dd528061472752806149085280614e6d5280614f4e5280614fce52506155bb6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061134e945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611384565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114c2565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611653565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611880565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119d2565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d6b565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120c3565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124cd565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124da565b34801561096057600080fd5b50610969612619565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b508035906020810135906040013561263d565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a0013561264a565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282a565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612cf7565b348015610b3157600080fd5b50610969613001565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613025945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613052565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356131aa565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135613339565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135613665565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612cf7565b9093509150610e96898685613a9e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c65565b50965096945050505050565b6000610f44848484613da2565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b61110a7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ec692505050565b9150868260018451038151811061111d57fe5b6020026020010151101561117c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b6112418686600081811061118c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336112277f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111db57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061120557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16614016565b8560008151811061123457fe5b6020026020010151614101565b611280828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506142d1915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112cc57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561130a57600080fd5b505af115801561131e573d6000803e3d6000fd5b50505050611343848360018551038151811061133657fe5b6020026020010151613c65565b509695505050505050565b606061137b7f00000000000000000000000000000000000000000000000000000000000000008484614558565b90505b92915050565b60008060006113b47f00000000000000000000000000000000000000000000000000000000000000008f8f614016565b90506000876113c3578c6113e5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050506114a88f8f8f8f8f8f8f612cf7565b809450819550505050509b509b9950505050505050505050565b6060814281101561153457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6115927f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ec692505050565b915086826001845103815181106115a557fe5b60200260200101511015611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b6116148686600081811061118c57fe5b611343828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506142d1915050565b606081428110156116c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061172a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b6118117f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061455892505050565b9150868260008151811061182157fe5b6020026020010151111561117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615455602c913960400191505060405180910390fd5b6000806118ce7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000614016565b90506000866118dd578b6118ff565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561199b57600080fd5b505af11580156119af573d6000803e3d6000fd5b505050506119c18d8d8d8d8d8d61264a565b9d9c50505050505050505050505050565b8042811015611a4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b611ad185856000818110611a5257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611acb7f000000000000000000000000000000000000000000000000000000000000000089896000818110611aa157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061120557fe5b8a614101565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b0157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b9a57600080fd5b505afa158015611bae573d6000803e3d6000fd5b505050506040513d6020811015611bc457600080fd5b50516040805160208881028281018201909352888252929350611c069290918991899182918501908490808284376000920191909152508892506146d0915050565b86611d0a8288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c3957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b50519063ffffffff614a6316565b1015611d61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b5050505050505050565b8042811015611ddb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e4057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ec9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b611ed985856000818110611a5257fe5b611f178585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506146d0915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611fa757600080fd5b505afa158015611fbb573d6000803e3d6000fd5b505050506040513d6020811015611fd157600080fd5b505190508681101561202e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b50505050611d618482613c65565b6060814281101561213557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061217957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b6122607f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ec692505050565b9150868260018451038151811061227357fe5b602002602001015110156122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061231b57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561234e57600080fd5b505af1158015612362573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123d47f000000000000000000000000000000000000000000000000000000000000000089896000818110611aa157fe5b846000815181106123e157fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245257600080fd5b505af1158015612466573d6000803e3d6000fd5b505050506040513d602081101561247c57600080fd5b505161248457fe5b6124c3828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506142d1915050565b5095945050505050565b6000610f44848484614ad5565b6060814281101561254c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6125aa7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061455892505050565b915086826000815181106125ba57fe5b60200260200101511115611604576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615455602c913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614bf9565b600081428110156126bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6126eb887f00000000000000000000000000000000000000000000000000000000000000008989893089612cf7565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191945061279592508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b15801561276457600080fd5b505afa158015612778573d6000803e3d6000fd5b505050506040513d602081101561278e57600080fd5b5051613a9e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280857600080fd5b505af115801561281c573d6000803e3d6000fd5b505050506113438483613c65565b804281101561289a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106128de57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612967576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129d457600080fd5b505af11580156129e8573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a5a7f000000000000000000000000000000000000000000000000000000000000000089896000818110611aa157fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac457600080fd5b505af1158015612ad8573d6000803e3d6000fd5b505050506040513d6020811015612aee57600080fd5b5051612af657fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bbf57600080fd5b505afa158015612bd3573d6000803e3d6000fd5b505050506040513d6020811015612be957600080fd5b50516040805160208981028281018201909352898252929350612c2b9290918a918a9182918501908490808284376000920191909152508992506146d0915050565b87611d0a8289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c5e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d6a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6000612d977f00000000000000000000000000000000000000000000000000000000000000008c8c614016565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b505050506040513d6020811015612e4257600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612eb557600080fd5b505af1158015612ec9573d6000803e3d6000fd5b505050506040513d6040811015612edf57600080fd5b50805160209091015190925090506000612ef98e8e614cd9565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f36578183612f39565b82825b90975095508a871015612f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153a9602b913960400191505060405180910390fd5b89861015612ff0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061552b602b913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061137b7f00000000000000000000000000000000000000000000000000000000000000008484613ec6565b60008060006130a27f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000614016565b90506000876130b1578c6130d3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561316f57600080fd5b505af1158015613183573d6000803e3d6000fd5b505050506131958e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561321f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b61322d8c8c8c8c8c8c614e16565b9094509250600061325f7f00000000000000000000000000000000000000000000000000000000000000008e8e614016565b905061326d8d338388614101565b6132798c338387614101565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132f857600080fd5b505af115801561330c573d6000803e3d6000fd5b505050506040513d602081101561332257600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156133ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6133dc8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614e16565b9094509250600061342e7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000614016565b905061343c8b338388614101565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156134a457600080fd5b505af11580156134b8573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561356457600080fd5b505af1158015613578573d6000803e3d6000fd5b505050506040513d602081101561358e57600080fd5b505161359657fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561361557600080fd5b505af1158015613629573d6000803e3d6000fd5b505050506040513d602081101561363f57600080fd5b50519250348410156136575761365733853403613c65565b505096509650969350505050565b606081428110156136d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061371b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146137a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b6138027f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061455892505050565b9150348260008151811061381257fe5b60200260200101511115613871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615455602c913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106138ba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156138ed57600080fd5b505af1158015613901573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139737f000000000000000000000000000000000000000000000000000000000000000089896000818110611aa157fe5b8460008151811061398057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156139f157600080fd5b505af1158015613a05573d6000803e3d6000fd5b505050506040513d6020811015613a1b57600080fd5b5051613a2357fe5b613a62828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506142d1915050565b81600081518110613a6f57fe5b60200260200101513411156124c3576124c33383600081518110613a8f57fe5b60200260200101513403613c65565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b7457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613b37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613bd6576040519150601f19603f3d011682016040523d82523d6000602084013e613bdb565b606091505b5091509150818015613c09575080511580613c095750808060200190516020811015613c0657600080fd5b50515b613c5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806154db602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613cdc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c9f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613d3e576040519150601f19603f3d011682016040523d82523d6000602084013e613d43565b606091505b5050905080613d9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061534b6034913960400191505060405180910390fd5b505050565b6000808411613dfc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806155566030913960400191505060405180910390fd5b600083118015613e0c5750600082115b613e61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806153d4602d913960400191505060405180910390fd5b6000613e75856103e563ffffffff61511716565b90506000613e89828563ffffffff61511716565b90506000613eaf83613ea3886103e863ffffffff61511716565b9063ffffffff61519d16565b9050808281613eba57fe5b04979650505050505050565b6060600282511015613f23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155086023913960400191505060405180910390fd5b815167ffffffffffffffff81118015613f3b57600080fd5b50604051908082528060200260200182016040528015613f65578160200160208202803683370190505b5090508281600081518110613f7657fe5b60200260200101818152505060005b600183510381101561400e57600080613fc887868581518110613fa457fe5b6020026020010151878660010181518110613fbb57fe5b602002602001015161520f565b91509150613fea848481518110613fdb57fe5b60200260200101518383613da2565b848460010181518110613ff957fe5b60209081029190910101525050600101613f85565b509392505050565b60008060006140258585614cd9565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f0437378fc27e93c612c5c385779bf540ca2064b54705e48c313aa216da380100609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b602083106141df57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016141a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614241576040519150601f19603f3d011682016040523d82523d6000602084013e614246565b606091505b5091509150818015614274575080511580614274575080806020019051602081101561427157600080fd5b50515b6142c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806152f86031913960400191505060405180910390fd5b505050505050565b60005b6001835103811015614552576000808483815181106142ef57fe5b602002602001015185846001018151811061430657fe5b602002602001015191509150600061431e8383614cd9565b509050600087856001018151811061433257fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461437a5782600061437e565b6000835b91509150600060028a5103881061439557886143d6565b6143d67f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106143c957fe5b6020026020010151614016565b90506144037f00000000000000000000000000000000000000000000000000000000000000008888614016565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561444d576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156144d85781810151838201526020016144c0565b50505050905090810190601f1680156145055780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561452757600080fd5b505af115801561453b573d6000803e3d6000fd5b5050600190990198506142d4975050505050505050565b50505050565b60606002825110156145b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155086023913960400191505060405180910390fd5b815167ffffffffffffffff811180156145cd57600080fd5b506040519080825280602002602001820160405280156145f7578160200160208202803683370190505b509050828160018351038151811061460b57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b801561400e5760008061466b8786600186038151811061465757fe5b6020026020010151878681518110613fbb57fe5b9150915061468d84848151811061467e57fe5b60200260200101518383614ad5565b84600185038151811061469c57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161463b565b60005b6001835103811015613d9d576000808483815181106146ee57fe5b602002602001015185846001018151811061470557fe5b602002602001015191509150600061471d8383614cd9565b509050600061474d7f00000000000000000000000000000000000000000000000000000000000000008585614016565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561479b57600080fd5b505afa1580156147af573d6000803e3d6000fd5b505050506040513d60608110156147c557600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a81169089161461480f578284614812565b83835b91509150614897828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b95506148a4868383613da2565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146148e8578260006148ec565b6000835b91509150600060028c51038a10614903578a614937565b6149377f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106143c957fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156149e75781810151838201526020016149cf565b50505050905090810190601f168015614a145780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614a3657600080fd5b505af1158015614a4a573d6000803e3d6000fd5b50506001909b019a506146d39950505050505050505050565b8082038281111561137e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614b2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806154246031913960400191505060405180910390fd5b600083118015614b3f5750600082115b614b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806153d4602d913960400191505060405180910390fd5b6000614bb86103e8614bac868863ffffffff61511716565b9063ffffffff61511716565b90506000614bd26103e5614bac868963ffffffff614a6316565b9050614bef6001828481614be257fe5b049063ffffffff61519d16565b9695505050505050565b6000808411614c53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615481602a913960400191505060405180910390fd5b600083118015614c635750600082115b614cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806153d4602d913960400191505060405180910390fd5b82614cc9858463ffffffff61511716565b81614cd057fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061537f602a913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d9b578284614d9e565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154016023913960400191505060405180910390fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614eb657600080fd5b505afa158015614eca573d6000803e3d6000fd5b505050506040513d6020811015614ee057600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614fc657604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b158015614f9957600080fd5b505af1158015614fad573d6000803e3d6000fd5b505050506040513d6020811015614fc357600080fd5b50505b600080614ff47f00000000000000000000000000000000000000000000000000000000000000008b8b61520f565b91509150816000148015615006575080155b156150165787935086925061510a565b6000615023898484614bf9565b90508781116150905785811015615085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061552b602b913960400191505060405180910390fd5b889450925082615108565b600061509d898486614bf9565b9050898111156150a957fe5b87811015615102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153a9602b913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806151325750508082028282828161512f57fe5b04145b61137e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561137e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080600061521e8585614cd9565b50905060008061522f888888614016565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561527457600080fd5b505afa158015615288573d6000803e3d6000fd5b505050506040513d606081101561529e57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146152e55780826152e8565b81815b9099909850965050505050505056fe5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c6564496365437265616d537761705632526f757465723a20494e56414c49445f504154485472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564496365437265616d5377617056324c6962726172793a204944454e544943414c5f414444524553534553496365437265616d537761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54496365437265616d5377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459496365437265616d5377617056324c6962726172793a205a45524f5f41444452455353496365437265616d5377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54496365437265616d537761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54496365437265616d5377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54496365437265616d537761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564496365437265616d5377617056324c6962726172793a20494e56414c49445f50415448496365437265616d537761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54496365437265616d5377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a26469706673582212204c7ed123f24783f37d9afb767c31fc0a34cbfa775f24f1ec20632c8b34e588ae64736f6c63430006060033000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd6000000000000000000000000471ece3750da237f93b8e339c536989b8978a438
Deployed Bytecode
0x60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43816146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061134e945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611384565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114c2565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611653565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611880565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119d2565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d6b565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120c3565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124cd565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124da565b34801561096057600080fd5b50610969612619565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b508035906020810135906040013561263d565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a0013561264a565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282a565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612cf7565b348015610b3157600080fd5b50610969613001565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613025945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613052565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356131aa565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135613339565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135613665565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b610e86897f000000000000000000000000471ece3750da237f93b8e339c536989b8978a4388a8a8a308a612cf7565b9093509150610e96898685613a9e565b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c65565b50965096945050505050565b6000610f44848484613da2565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a4381686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b61110a7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd689888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ec692505050565b9150868260018451038151811061111d57fe5b6020026020010151101561117c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b6112418686600081811061118c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336112277f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68a8a60008181106111db57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061120557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16614016565b8560008151811061123457fe5b6020026020010151614101565b611280828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506142d1915050565b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112cc57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561130a57600080fd5b505af115801561131e573d6000803e3d6000fd5b50505050611343848360018551038151811061133657fe5b6020026020010151613c65565b509695505050505050565b606061137b7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68484614558565b90505b92915050565b60008060006113b47f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68f8f614016565b90506000876113c3578c6113e5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050506114a88f8f8f8f8f8f8f612cf7565b809450819550505050509b509b9950505050505050505050565b6060814281101561153457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6115927f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd689888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ec692505050565b915086826001845103815181106115a557fe5b60200260200101511015611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b6116148686600081811061118c57fe5b611343828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506142d1915050565b606081428110156116c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a4381686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061172a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b6118117f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061455892505050565b9150868260008151811061182157fe5b6020026020010151111561117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615455602c913960400191505060405180910390fd5b6000806118ce7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68d7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a438614016565b90506000866118dd578b6118ff565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561199b57600080fd5b505af11580156119af573d6000803e3d6000fd5b505050506119c18d8d8d8d8d8d61264a565b9d9c50505050505050505050505050565b8042811015611a4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b611ad185856000818110611a5257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611acb7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd689896000818110611aa157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061120557fe5b8a614101565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b0157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b9a57600080fd5b505afa158015611bae573d6000803e3d6000fd5b505050506040513d6020811015611bc457600080fd5b50516040805160208881028281018201909352888252929350611c069290918991899182918501908490808284376000920191909152508892506146d0915050565b86611d0a8288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c3957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b50519063ffffffff614a6316565b1015611d61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b5050505050505050565b8042811015611ddb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a4381685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e4057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ec9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b611ed985856000818110611a5257fe5b611f178585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506146d0915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43816916370a0823191602480820192602092909190829003018186803b158015611fa757600080fd5b505afa158015611fbb573d6000803e3d6000fd5b505050506040513d6020811015611fd157600080fd5b505190508681101561202e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b50505050611d618482613c65565b6060814281101561213557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff168686600081811061217957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b6122607f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd634888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ec692505050565b9150868260018451038151811061227357fe5b602002602001015110156122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806154ab6030913960400191505060405180910390fd5b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061231b57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561234e57600080fd5b505af1158015612362573d6000803e3d6000fd5b50505050507f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123d47f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd689896000818110611aa157fe5b846000815181106123e157fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245257600080fd5b505af1158015612466573d6000803e3d6000fd5b505050506040513d602081101561247c57600080fd5b505161248457fe5b6124c3828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506142d1915050565b5095945050505050565b6000610f44848484614ad5565b6060814281101561254c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6125aa7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061455892505050565b915086826000815181106125ba57fe5b60200260200101511115611604576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615455602c913960400191505060405180910390fd5b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43881565b6000610f44848484614bf9565b600081428110156126bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6126eb887f000000000000000000000000471ece3750da237f93b8e339c536989b8978a4388989893089612cf7565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191945061279592508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b15801561276457600080fd5b505afa158015612778573d6000803e3d6000fd5b505050506040513d602081101561278e57600080fd5b5051613a9e565b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280857600080fd5b505af115801561281c573d6000803e3d6000fd5b505050506113438483613c65565b804281101561289a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff16858560008181106128de57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612967576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b60003490507f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129d457600080fd5b505af11580156129e8573d6000803e3d6000fd5b50505050507f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a5a7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd689896000818110611aa157fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac457600080fd5b505af1158015612ad8573d6000803e3d6000fd5b505050506040513d6020811015612aee57600080fd5b5051612af657fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bbf57600080fd5b505afa158015612bd3573d6000803e3d6000fd5b505050506040513d6020811015612be957600080fd5b50516040805160208981028281018201909352898252929350612c2b9290918a918a9182918501908490808284376000920191909152508992506146d0915050565b87611d0a8289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c5e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d6a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6000612d977f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68c8c614016565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b505050506040513d6020811015612e4257600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612eb557600080fd5b505af1158015612ec9573d6000803e3d6000fd5b505050506040513d6040811015612edf57600080fd5b50805160209091015190925090506000612ef98e8e614cd9565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f36578183612f39565b82825b90975095508a871015612f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153a9602b913960400191505060405180910390fd5b89861015612ff0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061552b602b913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd681565b606061137b7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68484613ec6565b60008060006130a27f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68e7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a438614016565b90506000876130b1578c6130d3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561316f57600080fd5b505af1158015613183573d6000803e3d6000fd5b505050506131958e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561321f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b61322d8c8c8c8c8c8c614e16565b9094509250600061325f7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68e8e614016565b905061326d8d338388614101565b6132798c338387614101565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132f857600080fd5b505af115801561330c573d6000803e3d6000fd5b505050506040513d602081101561332257600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156133ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b6133dc8a7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a4388b348c8c614e16565b9094509250600061342e7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68c7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a438614016565b905061343c8b338388614101565b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156134a457600080fd5b505af11580156134b8573d6000803e3d6000fd5b50505050507f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561356457600080fd5b505af1158015613578573d6000803e3d6000fd5b505050506040513d602081101561358e57600080fd5b505161359657fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561361557600080fd5b505af1158015613629573d6000803e3d6000fd5b505050506040513d602081101561363f57600080fd5b50519250348410156136575761365733853403613c65565b505096509650969350505050565b606081428110156136d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496365437265616d537761705632526f757465723a2045585049524544000000604482015290519081900360640190fd5b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff168686600081811061371b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146137a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153296022913960400191505060405180910390fd5b6138027f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061455892505050565b9150348260008151811061381257fe5b60200260200101511115613871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615455602c913960400191505060405180910390fd5b7f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106138ba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156138ed57600080fd5b505af1158015613901573d6000803e3d6000fd5b50505050507f000000000000000000000000471ece3750da237f93b8e339c536989b8978a43873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139737f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd689896000818110611aa157fe5b8460008151811061398057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156139f157600080fd5b505af1158015613a05573d6000803e3d6000fd5b505050506040513d6020811015613a1b57600080fd5b5051613a2357fe5b613a62828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506142d1915050565b81600081518110613a6f57fe5b60200260200101513411156124c3576124c33383600081518110613a8f57fe5b60200260200101513403613c65565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b7457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613b37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613bd6576040519150601f19603f3d011682016040523d82523d6000602084013e613bdb565b606091505b5091509150818015613c09575080511580613c095750808060200190516020811015613c0657600080fd5b50515b613c5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806154db602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613cdc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c9f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613d3e576040519150601f19603f3d011682016040523d82523d6000602084013e613d43565b606091505b5050905080613d9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061534b6034913960400191505060405180910390fd5b505050565b6000808411613dfc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806155566030913960400191505060405180910390fd5b600083118015613e0c5750600082115b613e61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806153d4602d913960400191505060405180910390fd5b6000613e75856103e563ffffffff61511716565b90506000613e89828563ffffffff61511716565b90506000613eaf83613ea3886103e863ffffffff61511716565b9063ffffffff61519d16565b9050808281613eba57fe5b04979650505050505050565b6060600282511015613f23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155086023913960400191505060405180910390fd5b815167ffffffffffffffff81118015613f3b57600080fd5b50604051908082528060200260200182016040528015613f65578160200160208202803683370190505b5090508281600081518110613f7657fe5b60200260200101818152505060005b600183510381101561400e57600080613fc887868581518110613fa457fe5b6020026020010151878660010181518110613fbb57fe5b602002602001015161520f565b91509150613fea848481518110613fdb57fe5b60200260200101518383613da2565b848460010181518110613ff957fe5b60209081029190910101525050600101613f85565b509392505050565b60008060006140258585614cd9565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f0437378fc27e93c612c5c385779bf540ca2064b54705e48c313aa216da380100609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b602083106141df57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016141a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614241576040519150601f19603f3d011682016040523d82523d6000602084013e614246565b606091505b5091509150818015614274575080511580614274575080806020019051602081101561427157600080fd5b50515b6142c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806152f86031913960400191505060405180910390fd5b505050505050565b60005b6001835103811015614552576000808483815181106142ef57fe5b602002602001015185846001018151811061430657fe5b602002602001015191509150600061431e8383614cd9565b509050600087856001018151811061433257fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461437a5782600061437e565b6000835b91509150600060028a5103881061439557886143d6565b6143d67f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd6878c8b600201815181106143c957fe5b6020026020010151614016565b90506144037f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68888614016565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561444d576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156144d85781810151838201526020016144c0565b50505050905090810190601f1680156145055780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561452757600080fd5b505af115801561453b573d6000803e3d6000fd5b5050600190990198506142d4975050505050505050565b50505050565b60606002825110156145b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155086023913960400191505060405180910390fd5b815167ffffffffffffffff811180156145cd57600080fd5b506040519080825280602002602001820160405280156145f7578160200160208202803683370190505b509050828160018351038151811061460b57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b801561400e5760008061466b8786600186038151811061465757fe5b6020026020010151878681518110613fbb57fe5b9150915061468d84848151811061467e57fe5b60200260200101518383614ad5565b84600185038151811061469c57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161463b565b60005b6001835103811015613d9d576000808483815181106146ee57fe5b602002602001015185846001018151811061470557fe5b602002602001015191509150600061471d8383614cd9565b509050600061474d7f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68585614016565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561479b57600080fd5b505afa1580156147af573d6000803e3d6000fd5b505050506040513d60608110156147c557600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a81169089161461480f578284614812565b83835b91509150614897828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b95506148a4868383613da2565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146148e8578260006148ec565b6000835b91509150600060028c51038a10614903578a614937565b6149377f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd6898e8d600201815181106143c957fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156149e75781810151838201526020016149cf565b50505050905090810190601f168015614a145780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614a3657600080fd5b505af1158015614a4a573d6000803e3d6000fd5b50506001909b019a506146d39950505050505050505050565b8082038281111561137e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614b2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806154246031913960400191505060405180910390fd5b600083118015614b3f5750600082115b614b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806153d4602d913960400191505060405180910390fd5b6000614bb86103e8614bac868863ffffffff61511716565b9063ffffffff61511716565b90506000614bd26103e5614bac868963ffffffff614a6316565b9050614bef6001828481614be257fe5b049063ffffffff61519d16565b9695505050505050565b6000808411614c53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615481602a913960400191505060405180910390fd5b600083118015614c635750600082115b614cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806153d4602d913960400191505060405180910390fd5b82614cc9858463ffffffff61511716565b81614cd057fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061537f602a913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d9b578284614d9e565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154016023913960400191505060405180910390fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd69092169163e6a4390591604480820192602092909190829003018186803b158015614eb657600080fd5b505afa158015614eca573d6000803e3d6000fd5b505050506040513d6020811015614ee057600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614fc657604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd69092169163c9c65396916044808201926020929091908290030181600087803b158015614f9957600080fd5b505af1158015614fad573d6000803e3d6000fd5b505050506040513d6020811015614fc357600080fd5b50505b600080614ff47f000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd68b8b61520f565b91509150816000148015615006575080155b156150165787935086925061510a565b6000615023898484614bf9565b90508781116150905785811015615085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061552b602b913960400191505060405180910390fd5b889450925082615108565b600061509d898486614bf9565b9050898111156150a957fe5b87811015615102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153a9602b913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806151325750508082028282828161512f57fe5b04145b61137e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561137e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080600061521e8585614cd9565b50905060008061522f888888614016565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561527457600080fd5b505afa158015615288573d6000803e3d6000fd5b505050506040513d606081101561529e57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146152e55780826152e8565b81815b9099909850965050505050505056fe5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c6564496365437265616d537761705632526f757465723a20494e56414c49445f504154485472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564496365437265616d5377617056324c6962726172793a204944454e544943414c5f414444524553534553496365437265616d537761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54496365437265616d5377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459496365437265616d5377617056324c6962726172793a205a45524f5f41444452455353496365437265616d5377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54496365437265616d537761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54496365437265616d5377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54496365437265616d537761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564496365437265616d5377617056324c6962726172793a20494e56414c49445f50415448496365437265616d537761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54496365437265616d5377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a26469706673582212204c7ed123f24783f37d9afb767c31fc0a34cbfa775f24f1ec20632c8b34e588ae64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd6000000000000000000000000471ece3750da237f93b8e339c536989b8978a438
-----Decoded View---------------
Arg [0] : _factory (address): 0xFABbD5f4a53725266a4fA84D4140276794572cD6
Arg [1] : _WETH (address): 0x471EcE3750Da237f93B8E339c536989b8978a438
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000fabbd5f4a53725266a4fa84d4140276794572cd6
Arg [1] : 000000000000000000000000471ece3750da237f93b8e339c536989b8978a438
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.