Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 33 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Swap | 15470589 | 8 days ago | IN | 2 S | 0.01006214 | ||||
Execute Swap | 15470512 | 8 days ago | IN | 0 S | 0.01099906 | ||||
Execute Swap | 15468766 | 8 days ago | IN | 0 S | 0.01099956 | ||||
Execute Swap | 15370542 | 9 days ago | IN | 1 S | 0.01006214 | ||||
Execute Swap | 15275030 | 9 days ago | IN | 2 S | 0.01006214 | ||||
Execute Swap | 15254321 | 9 days ago | IN | 1 S | 0.01006214 | ||||
Execute Swap | 15253606 | 9 days ago | IN | 1 S | 0.02879041 | ||||
Execute Swap | 15253427 | 9 days ago | IN | 0 S | 0.01099956 | ||||
Execute Swap | 15189344 | 10 days ago | IN | 2 S | 0.01006214 | ||||
Execute Swap | 15083172 | 10 days ago | IN | 0 S | 0.01099906 | ||||
Execute Swap | 15031300 | 10 days ago | IN | 5 S | 0.01006214 | ||||
Execute Swap | 15030756 | 10 days ago | IN | 0 S | 0.0297314 | ||||
Execute Swap | 15030000 | 10 days ago | IN | 0 S | 0.0297314 | ||||
Execute Swap | 14909272 | 11 days ago | IN | 0 S | 0.01099906 | ||||
Remove Token | 14896060 | 11 days ago | IN | 0 S | 0.00686942 | ||||
Execute Swap | 14877791 | 11 days ago | IN | 2 S | 0.01006214 | ||||
Execute Swap | 14837390 | 11 days ago | IN | 0 S | 0.00975576 | ||||
Execute Swap | 14837325 | 11 days ago | IN | 1 S | 0.01029232 | ||||
Execute Swap | 14836971 | 11 days ago | IN | 1 S | 0.00892431 | ||||
Execute Swap | 14826333 | 11 days ago | IN | 1 S | 0.01145704 | ||||
Execute Swap | 14825127 | 11 days ago | IN | 1 S | 0.01008762 | ||||
Remove Token | 14812004 | 12 days ago | IN | 0 S | 0.00795366 | ||||
Remove Token | 14811804 | 12 days ago | IN | 0 S | 0.00675066 | ||||
Add Multiple Tok... | 14709818 | 12 days ago | IN | 0 S | 0.33729898 | ||||
Add Dex | 14709103 | 12 days ago | IN | 0 S | 0.00726253 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15470589 | 8 days ago | 2 S | ||||
15470512 | 8 days ago | 4.55982862 S | ||||
15470512 | 8 days ago | 0.00913793 S | ||||
15470512 | 8 days ago | 4.56896656 S | ||||
15468766 | 8 days ago | 3.8980653 S | ||||
15468766 | 8 days ago | 0.00781175 S | ||||
15468766 | 8 days ago | 3.90587705 S | ||||
15370542 | 9 days ago | 1 S | ||||
15275030 | 9 days ago | 2 S | ||||
15254321 | 9 days ago | 1 S | ||||
15253427 | 9 days ago | 5.72997641 S | ||||
15253427 | 9 days ago | 0.01148291 S | ||||
15253427 | 9 days ago | 5.74145933 S | ||||
15189344 | 10 days ago | 2 S | ||||
15083172 | 10 days ago | 7.56089226 S | ||||
15083172 | 10 days ago | 0.01515208 S | ||||
15083172 | 10 days ago | 7.57604435 S | ||||
15031300 | 10 days ago | 5 S | ||||
14909272 | 11 days ago | 5.88391807 S | ||||
14909272 | 11 days ago | 0.01179141 S | ||||
14909272 | 11 days ago | 5.89570949 S | ||||
14877791 | 11 days ago | 2 S | ||||
14837390 | 11 days ago | 0.99003716 S | ||||
14837390 | 11 days ago | 0.00198404 S | ||||
14837390 | 11 days ago | 0.9920212 S |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
PegasusAggregator
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./DexManager.sol"; import "./PegasusStaking.sol"; import "./interfaces/IDEXStructs.sol"; import "hardhat/console.sol"; interface IRouter { function WETH() external pure returns (address); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); } // New V3 Router Interface interface IV3Router { struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); function WETH9() external view returns (address); } // New V3 Quoter Interface interface IV3Quoter { function quoteExactInput( bytes memory path, uint256 amountIn ) external returns (uint256 amountOut); function quoteExactInputSingle( address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96 ) external returns (uint256 amountOut); } interface IWeth { function deposit() external payable; function withdraw(uint256) external; } contract PegasusAggregator is DexManager { //for wrapped natives struct WrappedNatives { string name; address _address; address stableCoin; } //for price and pools struct PoolInfo { address poolAddress; bool isV3; uint256 liquidity; uint24 fee; } //for split quote and swap struct SplitRoute { address dexRouter; uint256 percentage; // Out of 10000 (100.00%) address[] path; // For V2 bytes v3Path; // For V3 bool isV3; uint24 feeTier; // For V3 } struct SplitQuote { SplitRoute[] routes; uint256 totalAmountOut; string[] dexNames; } //for direct swaps and quotes struct Quote { string dexName; address dexRouter; uint256 amountIn; uint256 amountOut; address[] path; //for v2 bytes v3Path; // For V3 bool isV3; uint24 feeTier; // For V3 } // Fee distribution address public teamFeeCollector; bool public distributeFeesToStakers; uint256 private swapFeePercent = 20; // Reference to the staking contract PegasusStaking public stakingContract; //mappings WrappedNatives public wrappedBy; // Fee denominator for percentage calculations (100% = 10000) uint256 private constant FEE_DENOMINATOR = 10000; //For very low amounts uint256 public constant MIN_FEE_TO_CONVERT = 0.001 ether; event SwapExecuted(address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut, address router, address recipient); constructor() DexManager(msg.sender) { teamFeeCollector = msg.sender; distributeFeesToStakers = false; } // Function to update fee percentage function updateFeePercent(uint256 newFeePercent) external onlyOwner { require(newFeePercent <= 100, "Fee cannot exceed 1%"); // Safety check swapFeePercent = newFeePercent; } //Helper functions function getWrappedNative() internal view returns (address) { return wrappedBy._address; } function calculateFee(uint256 amount) public view returns (uint256 feeAmount, uint256 finalAmount) { feeAmount = amount * swapFeePercent / FEE_DENOMINATOR; finalAmount = amount - feeAmount; return (feeAmount, finalAmount); } function executeV3Swap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, uint24 feeTier, uint256 deadline ) internal returns (uint256) { IV3Router.ExactInputSingleParams memory params = IV3Router.ExactInputSingleParams({ tokenIn: tokenIn, tokenOut: tokenOut, fee: feeTier, recipient: address(this), deadline: deadline, amountIn: amountIn, amountOutMinimum: amountOutMin, sqrtPriceLimitX96: 0 }); try IV3Router(router).exactInputSingle(params) returns (uint256 _amountOut) { return _amountOut; } catch { revert("V3 swap failed"); } } function executeV2Swap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, uint256 deadline, address[] memory path ) internal returns (uint256) { require(path.length >= 2, "Invalid path length"); require(path[0] == tokenIn, "First token in path must be tokenIn"); require(path[path.length - 1] == tokenOut, "Last token in path must be tokenOut"); try IRouter(router).swapExactTokensForTokens( amountIn, amountOutMin, path, address(this), deadline ) returns (uint[] memory amounts) { return amounts[amounts.length - 1]; } catch { revert("V2 swap failed"); } } function _processRoute( address actualTokenIn, address actualTokenOut, uint256 routeAmountIn, SplitRoute calldata route, uint256 deadline, bool isNativeOut ) private returns (uint256) { // Approve router IERC20(actualTokenIn).approve(route.dexRouter, routeAmountIn); uint256 routeAmountOut; if (route.isV3) { routeAmountOut = executeV3Swap( actualTokenIn, actualTokenOut, routeAmountIn, 0, route.dexRouter, route.feeTier, deadline ); } else { // For V2, handle native output separately if needed if (isNativeOut) { address[] memory path = route.path; if (path.length == 0 || path[0] == address(0) || path[path.length - 1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; // Use wrapped native for V2 path path = autoPath; } try IRouter(route.dexRouter).swapExactTokensForETH( routeAmountIn, 0, // Minimum output validated at the end path, address(this), deadline ) returns (uint[] memory amounts) { routeAmountOut = amounts[amounts.length - 1]; } catch { revert("V2 swap to ETH failed"); } } else { // Regular token to token swap address[] memory path = route.path; if (path.length == 0 || path[0] == address(0) || path[path.length - 1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; path = autoPath; } routeAmountOut = executeV2Swap( actualTokenIn, actualTokenOut, routeAmountIn, 0, // Minimum output validated at the end route.dexRouter, deadline, path ); } } return routeAmountOut; } function getQuotes( address tokenIn, address tokenOut, uint256 amount, bool isExactIn ) internal view returns (Quote[] memory) { Quote[] memory quotes = new Quote[](supportedDexes.length * 3); uint256 validQuotes = 0; for (uint i = 0; i < supportedDexes.length; i++) { if (!supportedDexes[i].active) continue; //account for v3 if(supportedDexes[i].isV3) { IV3Quoter quoter = IV3Quoter(supportedDexes[i].quoter); for (uint j = 0; j < supportedDexes[i].feeTiers.length; j++) { // Encode the function call data bytes memory callData = abi.encodeWithSelector( quoter.quoteExactInputSingle.selector, tokenIn, tokenOut, supportedDexes[i].feeTiers[j], amount, 0 ); // Use low-level staticcall to simulate the function (bool success, bytes memory result) = address(quoter).staticcall{gas: 3000000}(callData); if (success) { uint256 amountOut = abi.decode(result, (uint256)); quotes[validQuotes] = Quote({ dexName: supportedDexes[i].name, dexRouter: supportedDexes[i].routerAddress, amountIn: amount, amountOut: amountOut, path: new address[](0), v3Path: abi.encodePacked(tokenIn, supportedDexes[i].feeTiers[j], tokenOut), isV3: true, feeTier: supportedDexes[i].feeTiers[j] }); validQuotes++; } } } else { // Existing V2 quote logic address WBNB = getWrappedNative(); // Try direct path address[] memory path = new address[](2); path[0] = tokenIn; path[1] = tokenOut; // Try WETH path address[] memory wethPath = new address[](3); wethPath[0] = tokenIn; wethPath[1] = WBNB; wethPath[2] = tokenOut; // Try path with stable coin address[] memory stablePath = new address[](3); stablePath[0] = tokenIn; stablePath[1] = wrappedBy.stableCoin; stablePath[2] = tokenOut; IRouter router = IRouter(supportedDexes[i].routerAddress); try router.getAmountsOut(amount, path) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[i].name, dexRouter: supportedDexes[i].routerAddress, amountIn: amount, amountOut: amounts[1], path: path, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch { // If direct path fails, try through WETH try router.getAmountsOut(amount, wethPath) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[i].name, dexRouter: supportedDexes[i].routerAddress, amountIn: amount, amountOut: amounts[2], path: wethPath, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch { // If WETH path fails, try reverse WETH path try router.getAmountsOut(amount, stablePath) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[i].name, dexRouter: supportedDexes[i].routerAddress, amountIn: amount, amountOut: amounts[2], path: stablePath, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch {} } } } } // Resize array to remove empty quotes assembly { mstore(quotes, validQuotes) } return quotes; } //for split quote function getBestSplitQuote( address tokenIn, address tokenOut, uint256 amount ) public view returns (SplitQuote memory) { // Get all possible quotes first Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, true); require(quotes.length > 0, "No valid quotes found"); // Sort quotes by amountOut in descending order for(uint i = 0; i < quotes.length - 1; i++) { for(uint j = i + 1; j < quotes.length; j++) { if(quotes[j].amountOut > quotes[i].amountOut) { Quote memory temp = quotes[i]; quotes[i] = quotes[j]; quotes[j] = temp; } } } // Start with the best single route uint256 bestTotalOutput = 0; SplitQuote memory bestSplit; // Try different split combinations for(uint i = 0; i < quotes.length; i++) { for(uint j = i + 1; j < quotes.length; j++) { // Try different split ratios (25-75, 50-50, 75-25) uint256[] memory splits = new uint256[](3); splits[0] = 2500; // 25% splits[1] = 5000; // 50% splits[2] = 7500; // 75% for(uint s = 0; s < splits.length; s++) { uint256 amount1 = (amount * splits[s]) / 10000; uint256 amount2 = amount - amount1; // Calculate theoretical output uint256 output1 = (quotes[i].amountOut * splits[s]) / 10000; uint256 output2 = (quotes[j].amountOut * (10000 - splits[s])) / 10000; uint256 totalOutput = output1 + output2; if(totalOutput > bestTotalOutput) { bestTotalOutput = totalOutput; // Update best split bestSplit.routes = new SplitRoute[](2); bestSplit.dexNames = new string[](2); bestSplit.routes[0] = SplitRoute({ dexRouter: quotes[i].dexRouter, percentage: splits[s], path: quotes[i].path, v3Path: quotes[i].v3Path, isV3: quotes[i].isV3, feeTier: quotes[i].feeTier }); bestSplit.routes[1] = SplitRoute({ dexRouter: quotes[j].dexRouter, percentage: 10000 - splits[s], path: quotes[j].path, v3Path: quotes[j].v3Path, isV3: quotes[j].isV3, feeTier: quotes[j].feeTier }); bestSplit.dexNames[0] = quotes[i].dexName; bestSplit.dexNames[1] = quotes[j].dexName; bestSplit.totalAmountOut = totalOutput; } } } } return bestSplit; } //For direct swaps and quotes function getBestQuote( address tokenIn, address tokenOut, uint256 amount, bool isExactIn ) external view returns (Quote memory) { Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, isExactIn); require(quotes.length > 0, "No valid quotes found"); uint256 bestIndex = 0; uint256 bestAmount = isExactIn ? 0 : type(uint256).max; for (uint i = 0; i < quotes.length; i++) { if (isExactIn) { if (quotes[i].amountOut > bestAmount) { bestAmount = quotes[i].amountOut; bestIndex = i; } } else { if (quotes[i].amountIn < bestAmount) { bestAmount = quotes[i].amountIn; bestIndex = i; } } } return quotes[bestIndex]; } // for direct swaps function executeSwap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, address recipient, uint256 deadline, uint24 feeTier, uint256 minFee, address[] memory path ) external payable returns (uint256) { require(recipient != address(0), "Invalid recipient"); if(tokenIn == address(0) || tokenOut == address(0)) { require(!(path[0] == address(0) && path[1] == address(0)), "Invalid path"); } address wrappedNative = getWrappedNative(); require(wrappedNative != address(0), "Wrapped native not set"); // Enhanced Native/Wrapped Token Conversion Handling bool isDirectWrappedConversion = (tokenIn == address(0) && tokenOut == wrappedNative) || (tokenIn == wrappedNative && tokenOut == address(0)); // Direct wrapped conversion short-circuit if (isDirectWrappedConversion) { uint256 amount = tokenIn == address(0) ? msg.value : amountIn; if (tokenIn == address(0)) { // Native to Wrapped: Deposit and send to recipient IWeth(wrappedNative).deposit{value: amount}(); IERC20(wrappedNative).transfer(recipient, amount); } else { // Wrapped to Native: Withdraw and send IERC20(tokenIn).transferFrom(msg.sender, address(this), amount); IWeth(wrappedNative).withdraw(amount); (bool success, ) = payable(recipient).call{value: amount}(""); require(success, "Native transfer failed"); } return amount; } bool isNativeIn = tokenIn == address(0); bool isNativeOut = tokenOut == address(0); require(!(isNativeIn && isNativeOut), "Cannot swap native to native"); // Real tokens to use in swap logic address actualTokenIn = isNativeIn ? wrappedNative : tokenIn; address actualTokenOut = isNativeOut ? wrappedNative : tokenOut; // Validate tokens require(isNativeIn || isSupportedToken[tokenIn], "Unsupported input token"); require(isNativeOut || isSupportedToken[tokenOut], "Unsupported output token"); uint256 swapAmount = isNativeIn ? msg.value : amountIn; require(swapAmount > 0, "amount must be greater than zero"); // Handle native input (convert to wrapped) if (isNativeIn) { IWeth(wrappedNative).deposit{value: msg.value}(); } else { // Transfer ERC20 tokens from sender IERC20(actualTokenIn).transferFrom(msg.sender, address(this), swapAmount); } // Approve router to spend tokens IERC20(actualTokenIn).approve(router, swapAmount); uint256 amountOut; //account for v3 if(isV3Router[router]) { amountOut = executeV3Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, feeTier, deadline ); } else { // For V2, ensure proper path if (path[0] == address(0) || path[1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; path = autoPath; } if (isNativeIn) { // Already converted to wrapped native, so use regular token swap amountOut = executeV2Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, deadline, path ); } else if (isNativeOut) { try IRouter(router).swapExactTokensForETH( swapAmount, amountOutMin, path, address(this), deadline ) returns (uint[] memory amounts) { amountOut = amounts[amounts.length - 1]; } catch { revert("V2 swap to ETH failed"); } } else { // Regular token to token swap amountOut = executeV2Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, deadline, path ); } } // Calculate fee (uint256 feeAmount, uint256 finalAmount) = calculateFee(amountOut); handleFeeDistribution(feeAmount, wrappedNative, actualTokenOut, router, deadline, minFee, isNativeOut); // Handle output transfer to recipient if (isNativeOut) { // Convert wrapped native to native and send if (isV3Router[router]) { // For V3, we need to unwrap manually IWeth(wrappedNative).withdraw(finalAmount); } // Send native to recipient (bool success, ) = recipient.call{value: finalAmount}(""); require(success, "Native transfer failed"); } else { // Transfer ERC20 tokens to recipient IERC20(actualTokenOut).transfer(recipient, finalAmount); } emit SwapExecuted( isNativeIn ? address(0) : tokenIn, isNativeOut ? address(0) : tokenOut, swapAmount, finalAmount, router, recipient ); return amountOut; } //for split swaps function executeSplitSwap( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, SplitRoute[] calldata routes, address recipient, uint256 deadline, uint256 minFee ) external payable returns (uint256) { require(routes.length > 0, "No routes provided"); require(recipient != address(0), "Invalid recipient"); address wrappedNative = getWrappedNative(); require(wrappedNative != address(0), "Wrapped native not set"); bool isNativeIn = tokenIn == address(0); bool isNativeOut = tokenOut == address(0); require(!(isNativeIn && isNativeOut), "Cannot swap native to native"); // Real tokens to use in swap logic address actualTokenIn = isNativeIn ? wrappedNative : tokenIn; address actualTokenOut = isNativeOut ? wrappedNative : tokenOut; // Validate tokens require(isNativeIn || isSupportedToken[tokenIn], "Unsupported input token"); require(isNativeOut || isSupportedToken[tokenOut], "Unsupported output token"); uint256 swapAmount = isNativeIn ? msg.value : amountIn; require(swapAmount > 0, "Zero amount"); // Handle native input (convert to wrapped) if (isNativeIn) { IWeth(wrappedNative).deposit{value: msg.value}(); } else { // Transfer ERC20 tokens from sender IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); } // Process all routes and track total output uint256 totalAmountOut; console.log(11, totalAmountOut); for(uint i = 0; i < routes.length; i++) { uint256 routeAmountIn = (swapAmount * routes[i].percentage) / 10000; totalAmountOut += _processRoute( actualTokenIn, actualTokenOut, routeAmountIn, routes[i], deadline, isNativeOut ); } require(totalAmountOut >= minAmountOut, "Insufficient output amount"); // Calculate and handle fees (uint256 feeAmount, uint256 finalAmount) = calculateFee(totalAmountOut); handleFeeDistribution(feeAmount, wrappedNative, actualTokenOut, routes[0].dexRouter, deadline, minFee, isNativeOut); // Handle output transfer to recipient if (isNativeOut) { // For V3, we need to unwrap manually IWeth(wrappedNative).withdraw(finalAmount); // Send native to recipient (bool success, ) = recipient.call{value: finalAmount}(""); require(success, "Native transfer failed"); } else { // Transfer ERC20 tokens to recipient IERC20(actualTokenOut).transfer(recipient, finalAmount); } emit SwapExecuted( isNativeIn ? address(0) : tokenIn, isNativeOut ? address(0) : tokenOut, swapAmount, finalAmount, address(0), // No specific router for split swaps recipient ); return totalAmountOut; } //Fee distribution handling function handleFeeDistribution(uint feeAmount, address WBNB, address tokenOut, address router, uint deadline, uint256 minFeeRequired, bool isNativeOut) internal { // Handle fees based on minimum conversion amount if (distributeFeesToStakers && address(stakingContract) != address(0)) { if (tokenOut != WBNB) { if (feeAmount >= minFeeRequired) { // Convert fees to Native token address[] memory feePath = new address[](2); feePath[0] = tokenOut; feePath[1] = WBNB; //get current contract balance uint256 balanceBefore = address(this).balance; IERC20(tokenOut).approve(router, feeAmount); IRouter(router).swapExactTokensForETH( feeAmount, 0, feePath, address(this), deadline); uint256 receivedBNB = address(this).balance - balanceBefore; // Update rewards only if conversion happened if (receivedBNB > 0) { stakingContract.distributeRewards{value: receivedBNB}(); } } else { // If fee is too small, send to team instead IERC20(tokenOut).transfer(teamFeeCollector, feeAmount); } } else { // Handle WBNB fees if (feeAmount >= MIN_FEE_TO_CONVERT) { IWeth(WBNB).withdraw(feeAmount); stakingContract.distributeRewards{value: feeAmount}(); } else { // If fee is too small, send to team IERC20(WBNB).transfer(teamFeeCollector, feeAmount); } } } else { if(isNativeOut) { (bool success, ) = payable(teamFeeCollector).call{value: feeAmount}(""); require(success, "Native transfer failed"); } else { // If staking is disabled, send fees to team (automate by converting to bnb before sending to team) IERC20(tokenOut).transfer(teamFeeCollector, feeAmount); } } } // Admin update functions and helper functions function setFeeDistributionMode(bool _distributeToStakers) external onlyOwner { distributeFeesToStakers = _distributeToStakers; } // Set the staking contract function setStakingContract(address _stakingContract) external onlyOwner { require(_stakingContract != address(0), "Invalid staking contract"); stakingContract = PegasusStaking(payable(_stakingContract)); } function setTeamFeeCollector(address _collector) external onlyOwner { require(_collector != address(0), "Invalid address"); teamFeeCollector = _collector; } function getADex(address _dexRouter) internal view returns (IDEXStructs.DEX memory) { require(_dexRouter != address(0), "Invalid router address"); for (uint256 i = 0; i < supportedDexes.length; i++) { if (supportedDexes[i].routerAddress == _dexRouter) { return supportedDexes[i]; } } revert("DEX not found"); } //For wrapped function addWrapped(string memory name, address _address, address stable) external onlyOwner { require(_address != address(0), "bad address"); wrappedBy = WrappedNatives(name, _address, stable); } function updateWrapped(string memory name, address _address, address stable) external onlyOwner { require(_address != address(0), "bad address"); wrappedBy.name = name; wrappedBy._address = _address; wrappedBy.stableCoin = stable; } // Emergency functions function rescueTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).transfer(to, amount); } function updateOwner(address newOwner) external onlyOwner { transferOwnership(newOwner); } // Allow contract to receive BNB receive() external payable {} fallback() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "./interfaces/IDEXStructs.sol"; import "./TokenManager.sol"; contract DexManager is TokenManager { IDEXStructs.DEX[] public supportedDexes; // chainId => DEX[] mapping(address => bool) public isV3Router; // check if a dex is v3 event DexAdded(string indexed name, address indexed router); event DexUpdated(uint256 indexed index, string indexed name); event DexRemoved(address indexed router); constructor(address _someAddress) TokenManager(_someAddress) {} function addDex( string calldata name, address router, address factory, bool isV3, address quoter, uint24[] calldata feeTiers ) external onlyOwner { require(router != address(0), "Invalid router address"); if (isV3) { require(quoter != address(0), "Invalid quoter address"); require(feeTiers.length > 0, "Must provide fee tiers"); } supportedDexes.push(IDEXStructs.DEX({ name: name, routerAddress: router, factory: factory, active: true, isV3: isV3, quoter: quoter, feeTiers: feeTiers })); isV3Router[router] = isV3; emit DexAdded(name, router); } function removeDex(address router) external onlyOwner { IDEXStructs.DEX[] storage dexes = supportedDexes; for (uint i = 0; i < dexes.length; i++) { if (dexes[i].routerAddress == router) { // Replace the DEX to remove with the last DEX in the array dexes[i] = dexes[dexes.length - 1]; // Remove the last element dexes.pop(); // Mark the router as no longer a V3 router isV3Router[router] = false; // Emit event with the router address emit DexRemoved(router); return; } } revert("DEX router not found"); } function getDexes() external view returns (IDEXStructs.DEX[] memory) { return supportedDexes; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; interface IDEXStructs { struct DEX { string name; address routerAddress; address factory; bool active; bool isV3; address quoter; uint24[] feeTiers; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "hardhat/console.sol"; contract PegasusStaking is Ownable { // Staking token (likely Pegasus token) IERC20 public stakingToken; // Total staked amount uint256 public totalStaked; // Accumulated reward per share uint256 public accRewardPerShare; // Precision for reward calculations uint256 private constant REWARD_PRECISION = 1e12; // Staker information struct Staker { uint256 stakedAmount; uint256 rewardDebt; uint256 unclaimedRewards; } // Mapping of staker address to their information mapping(address => Staker) public stakers; // PegasusAggregator contract address (rewards source) address public aggregator; // Events event Staked(address indexed user, uint256 amount); event Unstaked(address indexed user, uint256 amount); event RewardClaimed(address indexed user, uint256 amount); event RewardDistributed(uint256 indexed amount); // Modifier to restrict functions to the aggregator contract modifier onlyAggregator() { require(msg.sender == aggregator, "Only aggregator can call"); _; } constructor(address _stakingToken) Ownable(msg.sender) { require(_stakingToken != address(0), "Invalid staking token"); stakingToken = IERC20(_stakingToken); accRewardPerShare = 0; } // Set the aggregator contract address function setAggregator(address _aggregator) external onlyOwner { require(_aggregator != address(0), "Invalid aggregator address"); aggregator = _aggregator; } // Update reward for a specific user function updateReward(address user) internal { if (totalStaked > 0) { Staker storage staker = stakers[user]; uint256 pending = (staker.stakedAmount * accRewardPerShare / REWARD_PRECISION) - staker.rewardDebt; staker.unclaimedRewards += pending; staker.rewardDebt = (staker.stakedAmount * accRewardPerShare) / REWARD_PRECISION; } } // Stake tokens function stake(uint256 amount) external { require(amount > 0, "Cannot stake 0"); // Update rewards before changing stake updateReward(msg.sender); // Transfer tokens from sender to contract stakingToken.transferFrom(msg.sender, address(this), amount); // Update staker information stakers[msg.sender].stakedAmount += amount; totalStaked += amount; // Update reward debt stakers[msg.sender].rewardDebt = (stakers[msg.sender].stakedAmount * accRewardPerShare) / REWARD_PRECISION; emit Staked(msg.sender, amount); } // Unstake tokens function unstake(uint256 amount) external { require(amount > 0, "Cannot unstake 0"); require(stakers[msg.sender].stakedAmount >= amount, "Insufficient stake"); // Update rewards before changing stake updateReward(msg.sender); // Update staker information stakers[msg.sender].stakedAmount -= amount; totalStaked -= amount; // Update reward debt stakers[msg.sender].rewardDebt = (stakers[msg.sender].stakedAmount * accRewardPerShare) / REWARD_PRECISION; // Transfer tokens back to user stakingToken.transfer(msg.sender, amount); emit Unstaked(msg.sender, amount); } // Claim rewards function claimReward() external { updateReward(msg.sender); uint256 reward = stakers[msg.sender].unclaimedRewards; if (reward > 0) { stakers[msg.sender].unclaimedRewards = 0; // Transfer native rewards (bool success, ) = msg.sender.call{value: reward}(""); require(success, "Native transfer failed"); emit RewardClaimed(msg.sender, reward); } } // Distribute rewards (called by aggregator) function distributeRewards() external payable onlyAggregator { require(totalStaked > 0, "No stakers"); if (msg.value > 0) { // Update accumulated reward per share accRewardPerShare += (msg.value * REWARD_PRECISION) / totalStaked; emit RewardDistributed(msg.value); } } // Get pending rewards for a staker function getPendingRewards(address _staker) external view returns (uint256) { Staker storage staker = stakers[_staker]; if (totalStaked == 0) { return staker.unclaimedRewards; } uint256 pending = ((staker.stakedAmount * accRewardPerShare) / REWARD_PRECISION) - staker.rewardDebt; return staker.unclaimedRewards + pending; } // Get staker information function getStakerInfo(address _staker) external view returns ( uint256 stakedAmount, uint256 rewardDebt, uint256 unclaimedRewards ) { Staker storage staker = stakers[_staker]; return (staker.stakedAmount, staker.rewardDebt, staker.unclaimedRewards); } // Emergency function to rescue tokens function rescueTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).transfer(to, amount); } // Emergency function to rescue ETH/BNB function rescueETH(address payable to, uint256 amount) external onlyOwner { require(address(this).balance >= amount, "Insufficient balance"); (bool success, ) = to.call{value: amount}(""); require(success, "ETH transfer failed"); } // Allow contract to receive native currency receive() external payable {} fallback() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/access/Ownable.sol"; contract TokenManager is Ownable { struct Token { string symbol; string name; address tokenAddress; uint8 decimals; string logouri; bool active; } Token[] public tokens; // chainId => Token[] mapping(address => bool) public isSupportedToken; // shows that a token is supported event TokenAdded(string indexed symbol, address indexed tokenAddress); event TokenRemoved(address indexed tokenAddress); event TokenUpdated(string indexed symbol, address indexed tokenAddress); event MultipleTokensAdded(uint256 indexed count); constructor(address _someAddress) Ownable(_someAddress) {} function addToken( string calldata symbol, string calldata name, address tokenAddress, uint8 decimals, string calldata logoUri ) external onlyOwner { _addSingleToken( Token({ symbol: symbol, name: name, tokenAddress: tokenAddress, decimals: decimals, logouri: logoUri, active: true }) ); } function _addSingleToken(Token memory newToken) private { require(!isSupportedToken[newToken.tokenAddress], "Token already exists"); tokens.push(newToken); isSupportedToken[newToken.tokenAddress] = true; emit TokenAdded(newToken.symbol, newToken.tokenAddress); } function addMultipleTokens( Token[] calldata tokensIn ) external onlyOwner { require(tokensIn.length > 0, "No tokens provided"); uint256 addedCount = 0; Token[] storage newTokens = tokens; for (uint256 i = 0; i < tokensIn.length; i++) { if (isSupportedToken[tokensIn[i].tokenAddress]) { continue; } newTokens.push(tokensIn[i]); isSupportedToken[tokensIn[i].tokenAddress] = true; addedCount++; emit TokenAdded(tokensIn[i].symbol, tokensIn[i].tokenAddress); } if (addedCount > 0) { emit MultipleTokensAdded(addedCount); } } function removeToken(address tokenAddress) external onlyOwner { require(isSupportedToken[tokenAddress], "Token not found"); Token[] storage targetTokens = tokens; for (uint i = 0; i < targetTokens.length; i++) { if (targetTokens[i].tokenAddress == tokenAddress) { targetTokens[i] = tokens[tokens.length - 1]; targetTokens.pop(); isSupportedToken[tokenAddress] = false; emit TokenRemoved(tokenAddress); break; } } } function getAllTokens() external view returns (Token[] memory) { return tokens; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1 }, "evmVersion": "paris", "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":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"DexAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"DexRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"string","name":"name","type":"string"}],"name":"DexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"count","type":"uint256"}],"name":"MultipleTokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"SwapExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"symbol","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"symbol","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MIN_FEE_TO_CONVERT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"},{"internalType":"uint24[]","name":"feeTiers","type":"uint24[]"}],"name":"addDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct TokenManager.Token[]","name":"tokensIn","type":"tuple[]"}],"name":"addMultipleTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"logoUri","type":"string"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stable","type":"address"}],"name":"addWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"finalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeFeesToStakers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"components":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.SplitRoute[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"minFee","type":"uint256"}],"name":"executeSplitSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"feeTier","type":"uint24"},{"internalType":"uint256","name":"minFee","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"executeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAllTokens","outputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct TokenManager.Token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isExactIn","type":"bool"}],"name":"getBestQuote","outputs":[{"components":[{"internalType":"string","name":"dexName","type":"string"},{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.Quote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBestSplitQuote","outputs":[{"components":[{"components":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.SplitRoute[]","name":"routes","type":"tuple[]"},{"internalType":"uint256","name":"totalAmountOut","type":"uint256"},{"internalType":"string[]","name":"dexNames","type":"string[]"}],"internalType":"struct PegasusAggregator.SplitQuote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDexes","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"},{"internalType":"uint24[]","name":"feeTiers","type":"uint24[]"}],"internalType":"struct IDEXStructs.DEX[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSupportedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isV3Router","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"removeDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_distributeToStakers","type":"bool"}],"name":"setFeeDistributionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"}],"name":"setStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collector","type":"address"}],"name":"setTeamFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"contract PegasusStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedDexes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFeeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeePercent","type":"uint256"}],"name":"updateFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stable","type":"address"}],"name":"updateWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedBy","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stableCoin","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608080604052346093573315607d5760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36014600655600580546001600160a81b0319163360ff60a01b1916179055615ba990816100998239f35b631e4fbdf760e01b600052600060045260246000fd5b600080fdfe60806040526004361015610010575b005b60003560e01c806309a477c7146102105780630ae9c2771461020b578063124e694c14610206578063124f1ead14610201578063240028e8146101fc5780632a5c792a146101f75780634c984d38146101f25780634d24df9d146101ed5780634f64b2be146101e85780635fa7b584146101e3578063715018a6146101de5780637765fd0d146101d957806381ee0715146101d457806386f75f62146101cf578063880cdc31146101ca5780638a142ea4146101c55780638cf106e1146101c05780638da5cb5b146101bb57806399a5d747146101b65780639dd373b9146101b15780639ed12c31146101ac578063b1db3096146101a7578063b5d52d1a146101a2578063ba1471321461019d578063c74b92ca14610198578063cea9d26f14610193578063d2f0ee8b1461018e578063ee99205c14610189578063f05c5fed14610184578063f2fde38b1461017f578063fccdfe4f1461017a5763fda493c90361000e5761228d565b61203c565b61201f565b611fba565b611f91565b611e98565b611e2c565b611d9f565b611d79565b611d50565b611be7565b611b09565b611a7f565b611a51565b611a28565b6119e6565b61194f565b611824565b61178e565b611734565b611629565b611544565b61144f565b6113d5565b610fba565b610d94565b610ca1565b610ba3565b610b42565b610656565b610598565b6103e6565b600091031261022057565b600080fd5b90600182811c92168015610255575b602083101461023f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610234565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b0382111761029057604052565b61025f565b606081019081106001600160401b0382111761029057604052565b60e081019081106001600160401b0382111761029057604052565b601f909101601f19168101906001600160401b0382119082101761029057604052565b906040519182600082549261030284610225565b80845293600181169081156103705750600114610329575b50610327925003836102cb565b565b90506000929192526020600020906000915b818310610354575050906020610327928201013861031a565b602091935080600191548385890101520191019091849261033b565b90506020925061032794915060ff191682840152151560051b8201013861031a565b6001600160a01b031690565b60005b8381106103b15750506000910152565b81810151838201526020016103a1565b906020916103da8151809281855285808601910161039e565b601f01601f1916010190565b3461022057600036600319011261022057604051600060085461040881610225565b80845290600181169081156104b65750600114610469575b61045a83610430818503826102cb565b60018060a01b036009541660018060a01b03600a54166040519384936060855260608501906103c1565b91602084015260408301520390f35b60086000908152600080516020615b34833981519152939250905b80821061049c57509091508101602001610430610420565b919260018160209254838588010152019101909291610484565b60ff191660208086019190915291151560051b840190910191506104309050610420565b634e487b7160e01b600052603260045260246000fd5b60035481101561050f5760036000526005602060002091020190600090565b6104da565b60015481101561050f5760016000526005602060002091020190600090565b805482101561050f576000526005602060002091020190600090565b949196959261056960a0959260c0885260c08801906103c1565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b3461022057602036600319011261022057600435600354811015610220576105bf906104f0565b506105c9816102ee565b60018201546002830154600390930154604051938493610611936001600160a01b039384169360a884901c60ff9081169460a081901c9091169390821692909116908761054f565b0390f35b6001600160a01b0381160361022057565b9181601f84011215610220578235916001600160401b038311610220576020808501948460051b01011161022057565b6101003660031901126102205761066e600435610615565b610679602435610615565b6044356064356084356001600160401b0381116102205761069e903690600401610626565b9190926106ac60a435610615565b60c4359160e435946000956106c28615156123a8565b6106d860a4356001600160a01b031615156123e9565b6009546001600160a01b0316946106f0861515612429565b6004356001600160a01b03161580610b2f575b61070d901561246e565b6004356001600160a01b0316610b265785965b6024356001600160a01b0316610b1d5786945b6004356001600160a01b0316801590610b04575b610750906124b9565b6024356001600160a01b0316801590610ae4575b61076d906124ff565b6004356001600160a01b0316610ade5734965b61078b881515612546565b6004356001600160a01b0316610a7a57506001600160a01b0388163b15610a7657604051630d0e30db60e41b81528a81600481346001600160a01b038e165af1801561096a57610a62575b505b89986107e2614518565b8a905b8b8483106109ff5750505091610838939161080761082d9796948b101561265e565b85896108326108158d613ab3565b9a6024356001600160a01b03161598919590916125d8565b6126a7565b9261484c565b6024356001600160a01b031661097357506001600160a01b0383163b1561096f57604051632e1a7d4d60e01b8152600481018290529285908490602490829084906001600160a01b03165af1801561096a5761061195600080516020615b548339815191529461092a92610950575b506108c3818080808760a4355af16108bd6126e1565b50612711565b6004356001600160a01b031661094757805b6024356001600160a01b031661093d57925b604080516001600160a01b039384168152948316602086015284019490945260608301939093526000608083015260a43590921660a082015290819060c0820190565b0390a16040519081529081906020820190565b50602435926108e7565b600435906108d5565b8061095e83610964936102cb565b80610215565b386108a7565b6125b7565b8480fd5b60405163a9059cbb60e01b81529350602090849081888161099a8760a435600484016126b1565b03926001600160a01b03165af1801561096a5761061195600080516020615b548339815191529461092a926109d0575b506108c3565b6109f19060203d6020116109f8575b6109e981836102cb565b810190612580565b50386109ca565b503d6109df565b829b610a5489888c878f610a3a610a32610a4d92610a5a9a8f610a2860019e9f6020928c6125e8565b0190503590612630565b612710900490565b918c8a8060a01b036024351615966125e8565b91896145c1565b90612651565b9a01906107e5565b8061095e8c610a70936102cb565b386107d6565b8980fd5b6020610a9e918c60405180809581946323b872dd60e01b8352303360048501612595565b03916004356001600160a01b03165af1801561096a57610abf575b506107d8565b610ad79060203d6020116109f8576109e981836102cb565b5038610ab9565b86610780565b5061076d610afd610af6602435610b6f565b5460ff1690565b9050610764565b50610750610b16610af6600435610b6f565b9050610747565b60243594610733565b60043596610720565b506024356001600160a01b031615610703565b346102205760203660031901126102205761000e600435610b6281610615565b610b6a614b36565b612c58565b6001600160a01b0316600090815260026020526040902090565b6001600160a01b0316600090815260046020526040902090565b3461022057602036600319011261022057600435610bc081610615565b60018060a01b03166000526002602052602060ff604060002054166040519015158152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610c1857505050505090565b9091929394602080600192603f1985820301865288519060a080610c8a610c5b610c4b865160c0875260c08701906103c1565b87870151868203898801526103c1565b8880841b03604087015116604086015260ff6060870151166060860152608086015185820360808701526103c1565b930151151591015297019301930191939290610c09565b3461022057600036600319011261022057600154610cbe816118c7565b90610ccc60405192836102cb565b808252600160009081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6602084015b838310610d1157604051806106118782610be5565b60056020600192604051610d2481610275565b610d2d866102ee565b8152610d3a8587016102ee565b81840152600286015460a086811b879003821660408401521c60ff166060820152610d67600387016102ee565b6080820152610d86610d7d600488015460ff1690565b151560a0830152565b815201920192019190610cfc565b3461022057602036600319011261022057600435610db181610615565b610db9614b36565b6001600160a01b03168015610dde57600580546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b606090600319011261022057600435610e2d81610615565b90602435610e3a81610615565b9060443590565b906020808351928381520192019060005b818110610e5f5750505090565b82516001600160a01b0316845260209384019390920191600101610e52565b9080602083519182815201916020808360051b8301019401926000915b838310610eaa57505050505090565b9091929394602080610ec8600193601f1986820301875289516103c1565b97019301930191939290610e9b565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b828210610f3b5750505050926040846020610f3895960151828401520151906060601f1982850301910152610e7e565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610f99610f87604087015160c0604088015260c0870190610e41565b606087015186820360608801526103c1565b94608081015115156080860152015116910152970192019201909291610f08565b3461022057610fde610fcb36610e15565b9291908391610fd8612d4b565b50614c2d565b610fea81511515612d6b565b60005b610ff78251612756565b81101561108d5761100781612643565b82518110156110845780606061101f60019386612ddc565b510151606061102e8587612ddc565b5101511061103d575b01611007565b6110478385612ddc565b516110528286612ddc565b5161105d8587612ddc565b526110688486612ddc565b506110738286612ddc565b5261107e8185612ddc565b50611037565b50600101610fed565b50600090611099612d4b565b906000905b805182101561136d576110b082612643565b8151811015611362576110c1612df0565b926109c46110ce85612daf565b526113886110db85612dbc565b52611d4c6110e885612dcc565b5260005b84518110156113575761111561110f610a326111088489612ddc565b518b612630565b89612775565b5061116d61113f610a32606061112b8689612ddc565b510151611138858a612ddc565b5190612630565b610a54610a326060611151888a612ddc565b510151611167611161878c612ddc565b51612765565b90612630565b87811161117e575b506001016110ec565b965086611189612e12565b8752611193612e8d565b604088019081526111a48487612ddc565b51602001516111b290610392565b6111bc8489612ddc565b516111c78689612ddc565b51608001516111d6878a612ddc565b5160a001516111e5888b612ddc565b5160c001511515916111f7898c612ddc565b5160e0015162ffffff169361120a611899565b956112159087612d3c565b6020860152604085015260608401521515608083015262ffffff1660a082015288519061124182612daf565b5261124b90612daf565b506112568587612ddc565b5160200161126390612ec8565b61126d8489612ddc565b5161127790612765565b6112818789612ddc565b5160800151611290888a612ddc565b5160a0015161129f898b612ddc565b5160c001511515916112b18a8c612ddc565b5160e0015162ffffff16936112c4611899565b956112cf9087612d3c565b6020860152604085015260608401521515608083015262ffffff1660a08201528851906112fb82612dbc565b5261130590612dbc565b506113108487612ddc565b515181519061131e82612daf565b5261132890612daf565b506113338587612ddc565b515190519061134182612dbc565b5261134b90612dbc565b50602087015238611175565b5092506001016110b0565b50906001019061109e565b604051806106118582610ed7565b949060a0946113ad6113cd959461139f60ff949b9a9b60c08b5260c08b01906103c1565b9089820360208b01526103c1565b93600180881b0316604088015216606086015284820360808601526103c1565b931515910152565b3461022057602036600319011261022057600435600154811015610220576113fc90610514565b50611406816102ee565b90610611611416600183016102ee565b9160028101549060ff600461142d600384016102ee565b920154169160405195869560ff8360a01c169260018060a01b0316918761137b565b346102205760203660031901126102205760043561146c81610615565b611474614b36565b6001600160a01b03811660008181526002602052604090205490919061149c9060ff16612ed5565b60005b6001548082101561000e57836114b483610514565b50600201546001600160a01b03906114cb90610392565b16146114da575060010161149f565b91611506611513926115006114f96114f461151d97612756565b610514565b5091610514565b90612f22565b61150e612f9e565b610b6f565b805460ff19169055565b7f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd3600080a2005b346102205760003660031901126102205761155d614b36565b600080546001600160a01b0319811682556001600160a01b0316600080516020615b148339815191528280a3005b8015150361022057565b610f38906020815261010060e06116116115fb6115be87518560208801526101208701906103c1565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a0880152610e41565b60a0870151858203601f190160c08701526103c1565b60c086015115158483015294015162ffffff16910152565b346102205760803660031901126102205760043561164681610615565b6116766024359161165683610615565b6044356064359384926116688461158b565b611670612fed565b50615134565b9061168382511515612d6b565b600090801561172c57815b90825b84518110156117125781156116da578260606116ad8388612ddc565b510151116116c0575b6001905b01611691565b9250905060606116d08385612ddc565b51015190826116b6565b8260406116e78388612ddc565b510151106116f8575b6001906116ba565b9250905060406117088385612ddc565b51015190826116f0565b61061161171f8587612ddc565b5160405191829182611595565b60001961168e565b3461022057600036600319011261022057602060405166038d7ea4c680008152f35b9181601f84011215610220578235916001600160401b038311610220576020838186019501011161022057565b60ff81160361022057565b346102205760a0366003190112610220576004356001600160401b038111610220576117be903690600401611756565b6024356001600160401b038111610220576117dd903690600401611756565b6044939193356117ec81610615565b606435916117f983611783565b608435956001600160401b0387116102205761181c61000e973690600401611756565b96909561303e565b346102205760203660031901126102205760043561184181610615565b611849614b36565b611851614b36565b6001600160a01b038116156118695761000e90615538565b631e4fbdf760e01b600052600060045260246000fd5b62ffffff81160361022057565b60e435906103278261187f565b6040519061032760c0836102cb565b6040519061032760e0836102cb565b60405190610327610100836102cb565b6001600160401b0381116102905760051b60200190565b9291906118ea816118c7565b936118f860405195866102cb565b602085838152019160051b810192831161022057905b82821061191a57505050565b60208091833561192981610615565b81520191019061190e565b9080601f8301121561022057816020610f38933591016118de565b6101403660031901126102205760043561196881610615565b6024359061197582610615565b6044359060643560843561198881610615565b60a43561199481610615565b60c435906119a061188c565b926101043561012435979095906001600160401b03891161022057610611996119d06119d69a3690600401611934565b986132f9565b6040519081529081906020820190565b3461022057602036600319011261022057600435611a0381610615565b60018060a01b03166000526004602052602060ff604060002054166040519015158152f35b34610220576000366003190112610220576000546040516001600160a01b039091168152602090f35b3461022057602036600319011261022057611a6d600435613ab3565b60408051928352602083019190915290f35b3461022057602036600319011261022057600435611a9c81610615565b611aa4614b36565b6001600160a01b03168015611ac957600780546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a59081cdd185ada5b99c818dbdb9d1c9858dd60421b6044820152606490fd5b3461022057602036600319011261022057611b3b600435611b298161158b565b611b31614b36565b1515600554612967565b600555005b6001600160401b03811161029057601f01601f191660200190565b929192611b6782611b40565b91611b7560405193846102cb565b829481845281830111610220578281602093846000960137010152565b606060031982011261022057600435906001600160401b038211610220578060238301121561022057816024611bcd93600401359101611b5b565b90602435611bda81610615565b90604435610f3881610615565b3461022057611bf536611b92565b9190611bff614b36565b6001600160a01b031690611c14821515613ad2565b60408051611c2181610295565b828152602081019384526001600160a01b0390941693019283528051906001600160401b03821161029057611c6082611c5b600854610225565b6127af565b602090601f8311600114611cce57611ca193611c928461000e9795611c9695611c9c95600092611cc3575b505061282e565b6008555b51610392565b612926565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b015190503880611c8b565b6008600052601f1983169190600080516020615b348339815191529260005b818110611d38575084611c9694611c9c94611ca1989461000e9a9860019510611d1f575b505050811b01600855611c96565b015160001960f88460031b161c19169055388080611d11565b92936020600181928786015181550195019301611ced565b34610220576000366003190112610220576005546040516001600160a01b039091168152602090f35b3461022057600036600319011261022057602060ff60055460a01c166040519015158152f35b346102205760c0366003190112610220576004356001600160401b03811161022057611dcf903690600401611756565b60243591611ddc83610615565b604435611de881610615565b606435611df48161158b565b60843591611e0183610615565b60a435956001600160401b03871161022057611e2461000e973690600401610626565b969095613bb8565b3461022057611e676020611e3f36610e15565b9190611e49614b36565b600060405180968195829463a9059cbb60e01b8452600484016126b1565b03926001600160a01b03165af1801561096a57611e8057005b61000e9060203d6020116109f8576109e981836102cb565b3461022057611ea636611b92565b9091611eb0614b36565b611ec46001600160a01b0384161515613ad2565b8051906001600160401b03821161029057611ee482611c5b600854610225565b602090601f8311600114611f165782611ca19361000e9693611f0e93600092611cc357505061282e565b600855612926565b6008600052601f1983169190600080516020615b348339815191529260005b818110611f795750926001928592611ca19661000e999610611f60575b505050811b01600855612926565b015160001960f88460031b161c19169055388080611f52565b92936020600181928786015181550195019301611f35565b34610220576000366003190112610220576007546040516001600160a01b039091168152602090f35b3461022057602036600319011261022057600435611fd6614b36565b60648111611fe357600655005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b346102205760203660031901126102205760043561184981610615565b34610220576020366003190112610220576004356001600160401b0381116102205761206c903690600401610626565b90612075614b36565b61208082151561402d565b6000916000915b8183106120bd57838061209657005b7f0e18d302d46528f9fe1ca287fbdc60b7b9d0a6d9ed00fc3f6303e98683a0bac6600080a2005b9091926120dc610af661150e60406120d68888886125e8565b016126a7565b612177576121216001916120f96120f48787876125e8565b614168565b61211c61210f61150e60406120d68a8a8a6125e8565b805460ff19166001179055565b6142ca565b936121526121396121338387876125e8565b8061406e565b61214c60406120d6868a8a9796976125e8565b92614018565b90838060a01b031690600080516020615af4833981519152600080a35b019190612087565b9260019061216f565b906020808351928381520192019060005b81811061219e5750505090565b825162ffffff16845260209384019390920191600101612191565b602081016020825282518091526040820191602060408360051b8301019401926000915b8383106121ec57505050505090565b909192939460208061227e600193603f1986820301875289519060c061221b835160e0845260e08401906103c1565b92878060a01b03868201511686840152878060a01b03604082015116604084015260608101511515606084015261225b6080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c0818403910152612180565b970193019301919392906121dd565b34610220576000366003190112610220576003546122aa816118c7565b906122b860405192836102cb565b808252600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602084015b8383106122fd576040518061061187826121b9565b60056020600192604051612310816102b0565b612319866102ee565b8152848060a01b03858701541683820152612370612367600288015461234a61234182610392565b60408601612d3c565b61235e60a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b6123896123806003880154610392565b60a08301612d3c565b612395600487016142d9565b60c08201528152019201920191906122e8565b156123af57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b156123f057565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b1561243057565b60405162461bcd60e51b815260206004820152601660248201527515dc985c1c1959081b985d1a5d99481b9bdd081cd95d60521b6044820152606490fd5b1561247557565b60405162461bcd60e51b815260206004820152601c60248201527b43616e6e6f742073776170206e617469766520746f206e617469766560201b6044820152606490fd5b156124c057565b60405162461bcd60e51b81526020600482015260176024820152762ab739bab83837b93a32b21034b7383aba103a37b5b2b760491b6044820152606490fd5b1561250657565b60405162461bcd60e51b81526020600482015260186024820152772ab739bab83837b93a32b21037baba383aba103a37b5b2b760411b6044820152606490fd5b1561254d57565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b908160209103126102205751610f388161158b565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b90359060be1981360301821215610220570190565b901561050f5780610f38916125c3565b9082101561050f57610f389160051b8101906125c3565b634e487b7160e01b600052601160045260246000fd5b9060038202918083046003149015171561262b57565b6125ff565b8181029291811591840414171561262b57565b906001820180921161262b57565b9190820180921161262b57565b1561266557565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b35610f3881610615565b6001600160a01b039091168152602081019190915260400190565b604051906126db6020836102cb565b60008252565b3d1561270c573d906126f282611b40565b9161270060405193846102cb565b82523d6000602084013e565b606090565b1561271857565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b60001981019190821161262b57565b6127100390612710821161262b57565b9190820391821161262b57565b634e487b7160e01b600052600060045260246000fd5b8181106127a3575050565b60008155600101612798565b90601f82116127bc575050565b6103279160086000526020600020906020601f840160051c830193106127ea575b601f0160051c0190612798565b90915081906127dd565b9190601f811161280357505050565b610327926000526020600020906020601f840160051c830193106127ea57601f0160051c0190612798565b8160011b916000199060031b1c19161790565b919091828114612921576128558354610225565b6001600160401b03811161029057612877816128718454610225565b846127f4565b600093601f82116001146128aa5761289b929394829160009261289f57505061282e565b9055565b015490503880611c8b565b6128be601f19831691600052602060002090565b946128ce84600052602060002090565b91815b818110612909575095836001959697106128f0575b505050811b019055565b015460001960f88460031b161c191690553880806128e6565b9192600180602092868b0154815501940192016128d1565b509050565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b80546001600160a01b0319166001600160a01b03909216919091179055565b60ff60a01b191660a09190911b60ff60a01b161790565b9061289b9015158254612967565b90600160401b81116102905781548183558082106129a957505050565b61032792600052600a600960206000209260038380848801048601960602806129d7575b5001040190612798565b6000198601908154906000199060200360031b1c169055386129cd565b90808214612a96578054906001600160401b03821161029057612a29612a3591612a1e848661298c565b600052602060002090565b92600052602060002090565b91600a82049181549160005b848110612a79575050600a8302808203612a5d575b5050505050565b60039060001992030260031b1b19169101553880808080612a56565b600191820180546001600160f01b03909516878301559101612a41565b5050565b90612b5457818103612aaa575050565b60048083612abb6103279585612841565b612ad460018060a01b0360018301541660018601612948565b612b3360028501612b1560028401612af560018060a01b0382541684612948565b612b0960ff825460a01c1615158454612967565b83555460a81c60ff1690565b90805460ff60a81b191691151560a81b60ff60a81b16919091179055565b612b4c612b436003830154610392565b60038601612948565b0191016129f4565b612782565b634e487b7160e01b600052603160045260246000fd5b612b798154610225565b9081612b83575050565b81601f60009311600114612b95575055565b81835260208320612bb191601f0160051c810190600101612798565b808252602082209081548360011b9084198560031b1c191617905555565b6003548015612c425760001901612be7816003610533565b612b545780612bf7600492612b6f565b6000600182015560006002820155600060038201550180546000825580612c20575b5050600355565b612c3b91600052600a60096020600020920104810190612798565b3880612c19565b612b59565b9060ff801983541691151516179055565b60005b60035480821015612cfb57612c7c6001612c74846104f0565b500154610392565b6001600160a01b038481169291168214612c9a575050600101612c5b565b92612cc7612cd493612cc1612cba612cb56115139698612756565b6104f0565b50916104f0565b90612a9a565b612ccf612bcf565b610b89565b7f78e0a2ffcdfbbb49ba5c8050d8630fab2176d825e8360809db049cd98f462a78600080a2565b60405162461bcd60e51b8152602060048201526014602482015273111156081c9bdd5d195c881b9bdd08199bdd5b9960621b604482015280606481015b0390fd5b6001600160a01b039091169052565b60405190612d5882610295565b6060604083828152600060208201520152565b15612d7257565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b80511561050f5760200190565b80516001101561050f5760400190565b80516002101561050f5760600190565b805182101561050f5760209160051b010190565b60405160809190612e0183826102cb565b6003815291601f1901366020840137565b612e1c60026118c7565b90612e2a60405192836102cb565b6002825281601f19612e3c60026118c7565b019060005b828110612e4d57505050565b602090604051612e5c81610275565b600081526000838201526060604082015260608082015260006080820152600060a082015282828501015201612e41565b60405160609190612e9e83826102cb565b6002815291601f19018260005b828110612eb757505050565b806060602080938501015201612eab565b516001600160a01b031690565b15612edc57565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b9060ff61289b91168254612967565b90612b5457818103612f32575050565b600460ff8184612f456103279686612841565b612f556001820160018701612841565b60028501612f82848060028501612f7560018060a01b0382541686612948565b5460a01c16168254612967565b9055612f946003820160038701612841565b0154169101612c47565b6001548015612c425760001901612fb6816001610533565b612b5457600481612fc8600093612b6f565b612fd460018201612b6f565b826002820155612fe660038201612b6f565b0155600155565b6040519061010082016001600160401b0381118382101761029057604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b60ff9261309b96929795989461306d61307693613059614b36565b6040519a6130668c610275565b3691611b5b565b89523691611b5b565b60208701526001600160a01b0390961660408601908152951660608501523691611b5b565b6080820152600160a082015281516001600160a01b031660009081526002602052604090205460ff16613117576130f0816130d86130f69361556d565b6130e861210f61150e8651610392565b519251610392565b916156ad565b6001600160a01b0390911690600080516020615af4833981519152600080a3565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b1561315a57565b60405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b6044820152606490fd5b1561319557565b606460405162461bcd60e51b815260206004820152602060248201527f616d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152fd5b604051606091906131ea83826102cb565b6002815291601f1901366020840137565b6040519061320a6020836102cb565b6000808352366020840137565b602081830312610220578051906001600160401b03821161022057019080601f8301121561022057815161324a816118c7565b9261325860405194856102cb565b81845260208085019260051b82010192831161022057602001905b8282106132805750505090565b8151815260209182019101613273565b91926080936132b592979695978452602084015260a0604084015260a0830190610e41565b6001600160a01b0390951660608201520152565b606090602081526015602082015274158c881cddd85c081d1bc81155120819985a5b1959605a1b60408201520190565b9291909598969793949760018060a01b038916926133188415156123e9565b6001600160a01b038516801594909385159390918685613aa2575b613a63575b6009546001600160a01b031695613350871515612429565b8780613a4e575b8015613a2a575b61388b575050858061387a575b613375901561246e565b85156138735784915b6001600160a01b038b1661386c5785945b8790613855575b61339f906124b9565b6001600160a01b038b1680159061383e575b6133ba906124ff565b86156138385750349a5b6133cf8c151561318e565b86156137d6576001600160a01b0386163b1561022057604051630d0e30db60e41b8152600081600481346001600160a01b038c165af1801561096a576137c1575b505b61343460208d8c604051938492839263095ea7b360e01b8452600484016126b1565b038160006001600160a01b0389165af1801561096a578f948c938f9389936137a4575b50613464610af686610b89565b156136555750916134a1969161347c96959493615a7c565b9a5b6134878c613ab3565b976001600160a01b038b16159290918a908690889061484c565b6001600160a01b0387166135d957506134bc610af686610b89565b613555575b5091613543939187936134ed600080808087600080516020615b548339815191529e5af16108bd6126e1565b1561354f57506000945b6001600160a01b03811661354957506000955b604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b0390a190565b9561350a565b946134f7565b969093909290916001600160a01b0388163b1561022057604051632e1a7d4d60e01b815260048101839052976000908990602490829084906001600160a01b03165af194851561096a57600080516020615b5483398151915298613543966135c4575b509193975091936134c1565b8061095e60006135d3936102cb565b386135b8565b979391949290506020604051809963a9059cbb60e01b825281600081613603888b600484016126b1565b03926001600160a01b03165af194851561096a57600080516020615b548339815191529861354396613636575b506134ed565b61364e9060203d6020116109f8576109e981836102cb565b5038613630565b95945061367161366c61366788612daf565b612ec8565b610392565b15801561378e575b61375f575b891561369c57916134a19691613696969594936158b6565b9a61347e565b91949392916001600160a01b038e166137505750506040516318cbafe560e01b815294600094869485946136d7945092309260048701613290565b0381836001600160a01b038c165af16000918161372b575b5061370d5760405162461bcd60e51b815280612d38600482016132c9565b6137248161371e6134a19351612756565b90612ddc565b519a61347e565b6137499192503d806000833e61374181836102cb565b810190613217565b90386136ef565b946134a19691613696966158b6565b94506137696131d9565b61377b8661377683612daf565b612d3c565b6137888261377683612dbc565b9461367e565b5061379e61366c61366788612dbc565b15613679565b6137bc9060203d6020116109f8576109e981836102cb565b613457565b8061095e60006137d0936102cb565b38613410565b6137f860208d604051809381926323b872dd60e01b8352303360048501612595565b038160006001600160a01b0389165af1801561096a57613819575b50613412565b6138319060203d6020116109f8576109e981836102cb565b5038613813565b9a6133c4565b506133ba61384e610af68d610b6f565b90506133b1565b5061339f613865610af68a610b6f565b9050613396565b8a9461338f565b869161337e565b506001600160a01b038a161561336b565b995099505095505050955096505085600014613a24575034945b1561395d5750506001600160a01b0381163b1561022057604051630d0e30db60e41b815290600082600481876001600160a01b0386165af190811561096a57613911936020938693613948575b50600060405180968195829463a9059cbb60e01b8452600484016126b1565b03926001600160a01b03165af1801561096a5761392c575090565b6139449060203d6020116109f8576109e981836102cb565b5090565b8061095e6000613957936102cb565b386138f2565b6040516323b872dd60e01b81529193506020908290816000816139858a303360048501612595565b03925af1801561096a57613a07575b506001600160a01b0381163b1561022057604051632e1a7d4d60e01b815260048101849052906000908290602490829084906001600160a01b03165af1801561096a5760008085610f3895829583956139f3575b505af16108bd6126e1565b8061095e85613a01936102cb565b386139e8565b613a1f9060203d6020116109f8576109e981836102cb565b613994565b946138a5565b506001600160a01b0387168114801561335e57506001600160a01b038c161561335e565b506001600160a01b038c811690881614613357565b613a858c613a7661366c61366783612daf565b159081613a8a575b5015613153565b613338565b613a9b915061366761366c91612dbc565b158d613a7e565b506001600160a01b038b1615613333565b90612710613ac360065484612630565b0480830392831161262b579190565b15613ad957565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b81519192916001600160401b03811161029057613b2d816128718454610225565b6020601f8211600114613b5057819061289b939495600092611cc357505061282e565b601f19821690613b6584600052602060002090565b9160005b818110613ba057509583600195969710613b8757505050811b019055565b015160001960f88460031b161c191690553880806128e6565b9192602060018192868b015181550194019201613b69565b93919590949295613bc7614b36565b6001600160a01b038116978815613ca25786613c43613c4d94612ccf93613c3c613c5299613c24613c579e613c0c8e8d613c7e575b613c046118a8565b993691611b5b565b8852613c1b8a60208a01612d3c565b60408801612d3c565b60016060870152891515608087015260a08601612d3c565b3691613d6a565b60c0820152613eb4565b612c47565b614018565b7f2175f84b6c6dcc917bbec41b7f62cf11694eacf7a87f2fd2eda7e36d4c2c58b2600080a3565b613c926001600160a01b0386161515613ce0565b613c9d871515613d25565b613bfc565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420726f75746572206164647265737360501b6044820152606490fd5b15613ce757565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642071756f746572206164647265737360501b6044820152606490fd5b15613d2c57565b60405162461bcd60e51b81526020600482015260166024820152754d7573742070726f766964652066656520746965727360501b6044820152606490fd5b929190613d76816118c7565b93613d8460405195866102cb565b602085838152019160051b810192831161022057905b828210613da657505050565b602080918335613db58161187f565b815201910190613d9a565b9062ffffff809160031b9316831b921b19161790565b815190916001600160401b038211610290576020613e0591613df8848661298c565b0192600052602060002090565b600a82049160005b838110613e705750600a8302900380613e27575b50505050565b9260009360005b818110613e4357505050015538808080613e21565b9091946020613e66600192613e5b895162ffffff1690565b908560030290613dc0565b9601929101613e2e565b6000805b600a8110613e89575083820155600101613e0d565b95906020613eab600192613ea0855162ffffff1690565b908a60030290613dc0565b92019601613e74565b90600354600160401b81101561029057806001613ed692016003556003610533565b612b5457825180519093906001600160401b03811161029057613f0381613efd8554610225565b856127f4565b6020601f8211600114613fa25791613f2e8260c0936004956103279899600092611cc357505061282e565b84555b613f4a613f416020830151610392565b60018601612948565b613f8960028501613f67613f616040850151610392565b82612948565b613f7d613f776060850151151590565b8261297e565b60808301511515612b15565b613f99612b4360a0830151610392565b01519101613dd6565b601f19821695613fb785600052602060002090565b9660005b8181106140005750926103279697600495936001938360c09710613fe7575b505050811b018455613f31565b015160001960f88460031b161c19169055388080613fda565b83830151895560019098019760209384019301613fbb565b81604051928392833781016000815203902090565b1561403457565b60405162461bcd60e51b8152602060048201526012602482015271139bc81d1bdad95b9cc81c1c9bdd9a59195960721b6044820152606490fd5b903590601e198136030182121561022057018035906001600160401b0382116102205760200191813603831361022057565b9092916001600160401b038111610290576140bf816128718454610225565b6000601f82116001146140ed57819061289b9394956000926140e257505061282e565b013590503880611c8b565b601f1982169461410284600052602060002090565b91805b87811061413c57508360019596971061412257505050811b019055565b0135600019600384901b60f8161c191690553880806128e6565b90926020600181928686013581550194019101614105565b35610f3881611783565b35610f388161158b565b90600154600160401b8110156102905780600161418a92016001556001610533565b612b5457614198838061406e565b9093906001600160401b038111610290576141b781613efd8554610225565b6000601f8211600114614251576004926141e58361424a9460a094610327999a6000926140e257505061282e565b85555b6142026141f8602083018361406e565b90600188016140a0565b61422a60028601614218613f61604085016126a7565b61422460608401614154565b90612f13565b61424461423a608083018361406e565b90600388016140a0565b0161415e565b9101612c47565b601f1982169061426685600052602060002090565b91815b8181106142b257508360a09361032798996004979461424a9760019510614298575b505050811b0185556141e8565b0135600019600384901b60f8161c1916905538808061428b565b9192602060018192868c013581550194019201614269565b600019811461262b5760010190565b604051815480825290929183906142f96020830191600052602060002090565b926000905b80600983011061445d57610327945491818110614447575b81811061442d575b818110614413575b8181106143f9575b8181106143df575b8181106143c5575b8181106143ab575b818110614391575b818110614377575b10614364575b5003836102cb565b60d81c62ffffff1681526020013861435c565b60c083901c62ffffff168452926001906020019301614356565b60a883901c62ffffff16845292600190602001930161434e565b609083901c62ffffff168452926001906020019301614346565b607883901c62ffffff16845292600190602001930161433e565b606083901c62ffffff168452926001906020019301614336565b604883901c62ffffff16845292600190602001930161432e565b603083901c62ffffff168452926001906020019301614326565b601883901c62ffffff16845292600190602001930161431e565b62ffffff83168452926001906020019301614316565b91600a91935061014060019161450a87546144818362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b0194019201859293916142fe565b6000806040516020810190637b3338ad60e11b8252600b6024820152826044820152604481526145496064826102cb565b51906a636f6e736f6c652e6c6f675afa50565b903590601e198136030182121561022057018035906001600160401b03821161022057602001918160051b3603831361022057565b906080926132b5919695949683526000602084015260a0604084015260a0830190610e41565b35610f388161187f565b929190946145ef6020836145d4866126a7565b60405163095ea7b360e01b81529384928392600484016126b1565b038160006001600160a01b038a165af1801561096a5761482f575b506146176080840161415e565b1561463c5750610f389461463660a061462f856126a7565b94016145b7565b93615982565b909290156147825791816000949361466561465e60406146ae9996018461455c565b36916118de565b938451158015614766575b8015614741575b614708575b505061468e61366c61366c87936126a7565b92604051968795869485936318cbafe560e01b8552309160048601614591565b03925af1600091816146eb575b506146d95760405162461bcd60e51b815280612d38600482016132c9565b8061371e6146e79251612756565b5190565b6147019192503d806000833e61374181836102cb565b90386146bb565b8692945061366c61468e9261473861366c9361472f6147256131d9565b9361377685612daf565b61377683612dbc565b9593505061467c565b5060018060a01b0361475f6136676147598851612756565b88612ddc565b1615614677565b506001600160a01b0361477b61366787612daf565b1615614670565b909291610f389461479961465e604087018761455c565b948551158015614813575b80156147ee575b6147bf575b6147b9906126a7565b926157bf565b94506147b96147cc6131d9565b6147d98561377683612daf565b6147e68361377683612dbc565b9590506147b0565b5060018060a01b0361480c6136676148068951612756565b89612ddc565b16156147ab565b506001600160a01b0361482861366788612daf565b16156147a4565b6148479060203d6020116109f8576109e981836102cb565b61460a565b9493929195600554906148638260ff9060a01c1690565b80614b14575b15614ab45750506001600160a01b03868116949082168581146149f6575085106149b6576148af906148a661489c6131d9565b9761377689612daf565b61377687612dbc565b47936020604051809563095ea7b360e01b8252816000816148d48789600484016126b1565b03925af1801561096a5761490c966000958692614999575b506040516318cbafe560e01b815297889586948593309160048601614591565b03926001600160a01b03165af191821561096a5761493092614980575b5047612775565b80614939575b50565b61494761366c600754610392565b803b15610220576000906004604051809481936306f4a2cd60e41b83525af1801561096a5715614936578061095e6000610327936102cb565b614994903d806000833e61374181836102cb565b614929565b6149b19060203d6020116109f8576109e981836102cb565b6148ec565b5050506149cd925090602091611e49600554610392565b03925af1801561096a576149de5750565b6149369060203d6020116109f8576109e981836102cb565b9596505066038d7ea4c6800086109350614aa29250505057803b1561022057604051632e1a7d4d60e01b815260048101839052906000908290602490829084905af1801561096a57614a8d575b50614a5261366c600754610392565b803b15610220576000906004604051809481936306f4a2cd60e41b83525af1801561096a57614a7e5750565b8061095e6000610327936102cb565b8061095e6000614a9c936102cb565b38614a43565b6149cd91602091611e49600554610392565b935093505050929192600014614aea575050600080808061032794614ae061366c61366c600554610392565b5af16108bd6126e1565b91602091611e49614afa94610392565b03926001600160a01b03165af1801561096a576149de5750565b506007546001600160a01b0390614b2e9061366c90610392565b161515614869565b6000546001600160a01b03163303614b4a57565b63118cdaa760e01b6000523360045260246000fd5b90614b69826118c7565b614b7660405191826102cb565b8281528092614b87601f19916118c7565b019060005b828110614b9857505050565b602090614ba3612fed565b82828501015201614b8c565b604090610f38939281528160208201520190610e41565b919091805483101561050f576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b90816020910312610220575190565b919060035490614c44614c3f83612615565b614b5f565b93600093845b848110614c5b575050505050815290565b614c83614c7f6002614c73849a95969799989a6104f0565b50015460a01c60ff1690565b1590565b61512557614ca16002614c95836104f0565b50015460a81c60ff1690565b15614e9557614cb761366c6003612c74846104f0565b6001600160a01b03169660005b6004614ccf846104f0565b500154811015614e8357876000808888614d3a614d0a614cfb886004614cf48d6104f0565b5001614bc6565b905462ffffff9160031b1c1690565b614d2c60405193849289602085019763f7729d4360e01b895260248601614be8565b03601f1981018352826102cb565b51908d622dc6c0fa614d4a6126e1565b90614d5a575b5050600101614cc4565b9782614e5e86614e79948b614d7c8e6001999f60208091518301019101614c1e565b614e30614e13614cfb614d8e876104f0565b50986004614cf4614da28f612c748c6104f0565b99612cb5614dae6131fb565b99614e05614dc3614cfb8888614cf4886104f0565b9c6040519d8e9360208501606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b03601f1981018c528b6102cb565b94614e25614e1f6118b7565b986102ee565b885260208801612d3c565b8c60408701526060860152608085015260a0840152614e5260c0840160019052565b62ffffff1660e0830152565b614e688288612ddc565b52614e738187612ddc565b506142ca565b9690508738614d50565b50949593929196506001905b01614c4a565b614ea760099795969493929754610392565b614eaf6131d9565b614ebc8561377683612daf565b614ec98661377683612dbc565b614eeb614ed4612df0565b92614ee28761377686612daf565b61377684612dbc565b614ef88661377684612dcc565b614f00612df0565b91614f0e8661377685612daf565b614f25614f1c600a54610392565b61377685612dbc565b614f328761377685612dcc565b614f4661366c61366c6001612c74886104f0565b9160405163d06ca61f60e01b815260008180614f66858b60048401614baf565b0381875afa6000918161510a575b506150e057505060405163d06ca61f60e01b815260008180614f9a858a60048401614baf565b0381865afa600091816150c5575b5061509b5750506000604051809263d06ca61f60e01b82528180614fd0878a60048401614baf565b03915afa60009181615080575b50614fed575b5050600190614e8f565b968261507892819961503861501a6150146001612c7461500d829b6104f0565b50976104f0565b92612dcc565b519161502d6150276118b7565b956102ee565b855260208501612d3c565b866040840152606083015260808201526150506126cc565b60a0820152600060c0820152600060e082015261506d828b612ddc565b52614e73818a612ddc565b959038614fe3565b61509491923d8091833e61374181836102cb565b9038614fdd565b6150bf93508499925090849161503861501a6150146001612c7461500d829b6104f0565b95614e8f565b6150d991923d8091833e61374181836102cb565b9038614fa8565b6150bf9450859a935085925061503861501a6151046001612c7461500d829b6104f0565b92612dbc565b61511e91923d8091833e61374181836102cb565b9038614f74565b60019096949593929196614e8f565b91929060035492615147614c3f85612615565b9460009485905b80821061516057505050505050815290565b615178614c7f6002614c73859b9697989a999b6104f0565b6155295761518a6002614c95846104f0565b156152a957966151a161366c6003612c74856104f0565b6001600160a01b03169760005b60046151b9856104f0565b50015481101561529457886000808c8a8a6152016151df614cfb896004614cf48f6104f0565b614d2c6040519384928a602085019763f7729d4360e01b895260248601614be8565b5191622dc6c0fa6152106126e1565b90615220575b50506001016151ae565b98826152758761528a948c6152416001989f60208082518301019101614c1e565b615253614e13614cfb614d8e876104f0565b8d60408701526060860152608085015260a0840152614e5260c0840160019052565b61527f8289612ddc565b52614e738188612ddc565b9790508838615216565b5095969493929750906001905b01909461514e565b949593929196906152bb600954610392565b6152c36131d9565b6152d08661377683612daf565b6152dd8761377683612dbc565b6152f66152e8612df0565b92614ee28861377686612daf565b6153038761377684612dcc565b61530b612df0565b916153198761377685612daf565b615327614f1c600a54610392565b6153348861377685612dcc565b61534861366c61366c6001612c74886104f0565b9160405163d06ca61f60e01b81528660008280615369868d60048401614baf565b0381885afa6000928161550e575b506154da57505060405163d06ca61f60e01b8152905085600082806153a0868c60048401614baf565b0381875afa600092816154bf575b50615483579150506000604051809363d06ca61f60e01b825281806153d7888c60048401614baf565b03915afa60009281615468575b506153f5575b5050506001906152a1565b615400575b836153ea565b978261546092819a61542061501a6150146001612c7461500d829b6104f0565b876040840152606083015260808201526154386126cc565b60a0820152600060c0820152600060e0820152615455828c612ddc565b52614e73818b612ddc565b9690386153fa565b61547c91933d8091833e61374181836102cb565b91386153e4565b9193509150615497575b50506001906152a1565b97826154b792819a61542061501a6150146001612c7461500d829b6104f0565b96903861548d565b6154d391933d8091833e61374181836102cb565b91386153ae565b9250925092506154ee5750506001906152a1565b97826154b792819a61542061501a6151046001612c7461500d829b6104f0565b61552291933d8091833e61374181836102cb565b9138615377565b949593929196906001906152a1565b600080546001600160a01b039283166001600160a01b0319821681178355921690600080516020615b148339815191529080a3565b90600154600160401b8110156102905780600161558f92016001556001610533565b612b5457825180519093906001600160401b038111610290576155b681613efd8554610225565b6020601f8211600114615634576004926155e48361424a9460a094610327999a600092611cc357505061282e565b85555b6155f8602082015160018701613b0c565b61561c6002860161560f613f616040850151610392565b606083015160ff16614224565b61562d608082015160038701613b0c565b0151151590565b601f1982169561564985600052602060002090565b9660005b818110615695575083610327979860a0946004979461424a976001951061567c575b505050811b0185556155e7565b015160001960f88460031b161c1916905538808061566f565b8383015189556001909801976020938401930161564d565b6156c59060206040519282848094519384920161039e565b810103902090565b156156d457565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b1561571657565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b1561576e57565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b615848956158276000969594936157fe88946157df6002865110156156cd565b6157eb61366786612daf565b6001600160a01b0390811691161461570f565b61581461366761580e8551612756565b85612ddc565b6001600160a01b03908116911614615767565b6040516338ed173960e01b8152968795869485933091869060048701613290565b03926001600160a01b03165af160009181615899575b506146d95760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b6158af9192503d806000833e61374181836102cb565b903861585e565b926158f760009697939594926158e188946158d56002885110156156cd565b6157eb61366788612daf565b6158146136676158f18751612756565b87612ddc565b615848604051978896879586946338ed173960e01b8652309260048701613290565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b90916000956159bb6020966159af6159fa97966159a76159a06118b7565b9788612d3c565b898701612d3c565b62ffffff166040850152565b6159c83060608501612d3c565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b835260048301615919565b03926001600160a01b03165af160009181615a4b575b50610f385760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b615a6e91925060203d602011615a75575b615a6681836102cb565b810190614c1e565b9038615a10565b503d615a5c565b91600096615ab5602097615aa96159fa989795615aa1615a9a6118b7565b9889612d3c565b8a8801612d3c565b62ffffff166040860152565b615ac23060608601612d3c565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b83526004830161591956fe6d97a31531bdb3c43d920bc996ec8b9fd7733f5f55a81cd74700f88631fc60328be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3b37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da264697066735822122038c242ebf6eca6c7c34bc20018258d61e23ab5120bba7856790424c78b49ad2764736f6c634300081c0033
Deployed Bytecode
0x60806040526004361015610010575b005b60003560e01c806309a477c7146102105780630ae9c2771461020b578063124e694c14610206578063124f1ead14610201578063240028e8146101fc5780632a5c792a146101f75780634c984d38146101f25780634d24df9d146101ed5780634f64b2be146101e85780635fa7b584146101e3578063715018a6146101de5780637765fd0d146101d957806381ee0715146101d457806386f75f62146101cf578063880cdc31146101ca5780638a142ea4146101c55780638cf106e1146101c05780638da5cb5b146101bb57806399a5d747146101b65780639dd373b9146101b15780639ed12c31146101ac578063b1db3096146101a7578063b5d52d1a146101a2578063ba1471321461019d578063c74b92ca14610198578063cea9d26f14610193578063d2f0ee8b1461018e578063ee99205c14610189578063f05c5fed14610184578063f2fde38b1461017f578063fccdfe4f1461017a5763fda493c90361000e5761228d565b61203c565b61201f565b611fba565b611f91565b611e98565b611e2c565b611d9f565b611d79565b611d50565b611be7565b611b09565b611a7f565b611a51565b611a28565b6119e6565b61194f565b611824565b61178e565b611734565b611629565b611544565b61144f565b6113d5565b610fba565b610d94565b610ca1565b610ba3565b610b42565b610656565b610598565b6103e6565b600091031261022057565b600080fd5b90600182811c92168015610255575b602083101461023f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610234565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b0382111761029057604052565b61025f565b606081019081106001600160401b0382111761029057604052565b60e081019081106001600160401b0382111761029057604052565b601f909101601f19168101906001600160401b0382119082101761029057604052565b906040519182600082549261030284610225565b80845293600181169081156103705750600114610329575b50610327925003836102cb565b565b90506000929192526020600020906000915b818310610354575050906020610327928201013861031a565b602091935080600191548385890101520191019091849261033b565b90506020925061032794915060ff191682840152151560051b8201013861031a565b6001600160a01b031690565b60005b8381106103b15750506000910152565b81810151838201526020016103a1565b906020916103da8151809281855285808601910161039e565b601f01601f1916010190565b3461022057600036600319011261022057604051600060085461040881610225565b80845290600181169081156104b65750600114610469575b61045a83610430818503826102cb565b60018060a01b036009541660018060a01b03600a54166040519384936060855260608501906103c1565b91602084015260408301520390f35b60086000908152600080516020615b34833981519152939250905b80821061049c57509091508101602001610430610420565b919260018160209254838588010152019101909291610484565b60ff191660208086019190915291151560051b840190910191506104309050610420565b634e487b7160e01b600052603260045260246000fd5b60035481101561050f5760036000526005602060002091020190600090565b6104da565b60015481101561050f5760016000526005602060002091020190600090565b805482101561050f576000526005602060002091020190600090565b949196959261056960a0959260c0885260c08801906103c1565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b3461022057602036600319011261022057600435600354811015610220576105bf906104f0565b506105c9816102ee565b60018201546002830154600390930154604051938493610611936001600160a01b039384169360a884901c60ff9081169460a081901c9091169390821692909116908761054f565b0390f35b6001600160a01b0381160361022057565b9181601f84011215610220578235916001600160401b038311610220576020808501948460051b01011161022057565b6101003660031901126102205761066e600435610615565b610679602435610615565b6044356064356084356001600160401b0381116102205761069e903690600401610626565b9190926106ac60a435610615565b60c4359160e435946000956106c28615156123a8565b6106d860a4356001600160a01b031615156123e9565b6009546001600160a01b0316946106f0861515612429565b6004356001600160a01b03161580610b2f575b61070d901561246e565b6004356001600160a01b0316610b265785965b6024356001600160a01b0316610b1d5786945b6004356001600160a01b0316801590610b04575b610750906124b9565b6024356001600160a01b0316801590610ae4575b61076d906124ff565b6004356001600160a01b0316610ade5734965b61078b881515612546565b6004356001600160a01b0316610a7a57506001600160a01b0388163b15610a7657604051630d0e30db60e41b81528a81600481346001600160a01b038e165af1801561096a57610a62575b505b89986107e2614518565b8a905b8b8483106109ff5750505091610838939161080761082d9796948b101561265e565b85896108326108158d613ab3565b9a6024356001600160a01b03161598919590916125d8565b6126a7565b9261484c565b6024356001600160a01b031661097357506001600160a01b0383163b1561096f57604051632e1a7d4d60e01b8152600481018290529285908490602490829084906001600160a01b03165af1801561096a5761061195600080516020615b548339815191529461092a92610950575b506108c3818080808760a4355af16108bd6126e1565b50612711565b6004356001600160a01b031661094757805b6024356001600160a01b031661093d57925b604080516001600160a01b039384168152948316602086015284019490945260608301939093526000608083015260a43590921660a082015290819060c0820190565b0390a16040519081529081906020820190565b50602435926108e7565b600435906108d5565b8061095e83610964936102cb565b80610215565b386108a7565b6125b7565b8480fd5b60405163a9059cbb60e01b81529350602090849081888161099a8760a435600484016126b1565b03926001600160a01b03165af1801561096a5761061195600080516020615b548339815191529461092a926109d0575b506108c3565b6109f19060203d6020116109f8575b6109e981836102cb565b810190612580565b50386109ca565b503d6109df565b829b610a5489888c878f610a3a610a32610a4d92610a5a9a8f610a2860019e9f6020928c6125e8565b0190503590612630565b612710900490565b918c8a8060a01b036024351615966125e8565b91896145c1565b90612651565b9a01906107e5565b8061095e8c610a70936102cb565b386107d6565b8980fd5b6020610a9e918c60405180809581946323b872dd60e01b8352303360048501612595565b03916004356001600160a01b03165af1801561096a57610abf575b506107d8565b610ad79060203d6020116109f8576109e981836102cb565b5038610ab9565b86610780565b5061076d610afd610af6602435610b6f565b5460ff1690565b9050610764565b50610750610b16610af6600435610b6f565b9050610747565b60243594610733565b60043596610720565b506024356001600160a01b031615610703565b346102205760203660031901126102205761000e600435610b6281610615565b610b6a614b36565b612c58565b6001600160a01b0316600090815260026020526040902090565b6001600160a01b0316600090815260046020526040902090565b3461022057602036600319011261022057600435610bc081610615565b60018060a01b03166000526002602052602060ff604060002054166040519015158152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610c1857505050505090565b9091929394602080600192603f1985820301865288519060a080610c8a610c5b610c4b865160c0875260c08701906103c1565b87870151868203898801526103c1565b8880841b03604087015116604086015260ff6060870151166060860152608086015185820360808701526103c1565b930151151591015297019301930191939290610c09565b3461022057600036600319011261022057600154610cbe816118c7565b90610ccc60405192836102cb565b808252600160009081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6602084015b838310610d1157604051806106118782610be5565b60056020600192604051610d2481610275565b610d2d866102ee565b8152610d3a8587016102ee565b81840152600286015460a086811b879003821660408401521c60ff166060820152610d67600387016102ee565b6080820152610d86610d7d600488015460ff1690565b151560a0830152565b815201920192019190610cfc565b3461022057602036600319011261022057600435610db181610615565b610db9614b36565b6001600160a01b03168015610dde57600580546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b606090600319011261022057600435610e2d81610615565b90602435610e3a81610615565b9060443590565b906020808351928381520192019060005b818110610e5f5750505090565b82516001600160a01b0316845260209384019390920191600101610e52565b9080602083519182815201916020808360051b8301019401926000915b838310610eaa57505050505090565b9091929394602080610ec8600193601f1986820301875289516103c1565b97019301930191939290610e9b565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b828210610f3b5750505050926040846020610f3895960151828401520151906060601f1982850301910152610e7e565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610f99610f87604087015160c0604088015260c0870190610e41565b606087015186820360608801526103c1565b94608081015115156080860152015116910152970192019201909291610f08565b3461022057610fde610fcb36610e15565b9291908391610fd8612d4b565b50614c2d565b610fea81511515612d6b565b60005b610ff78251612756565b81101561108d5761100781612643565b82518110156110845780606061101f60019386612ddc565b510151606061102e8587612ddc565b5101511061103d575b01611007565b6110478385612ddc565b516110528286612ddc565b5161105d8587612ddc565b526110688486612ddc565b506110738286612ddc565b5261107e8185612ddc565b50611037565b50600101610fed565b50600090611099612d4b565b906000905b805182101561136d576110b082612643565b8151811015611362576110c1612df0565b926109c46110ce85612daf565b526113886110db85612dbc565b52611d4c6110e885612dcc565b5260005b84518110156113575761111561110f610a326111088489612ddc565b518b612630565b89612775565b5061116d61113f610a32606061112b8689612ddc565b510151611138858a612ddc565b5190612630565b610a54610a326060611151888a612ddc565b510151611167611161878c612ddc565b51612765565b90612630565b87811161117e575b506001016110ec565b965086611189612e12565b8752611193612e8d565b604088019081526111a48487612ddc565b51602001516111b290610392565b6111bc8489612ddc565b516111c78689612ddc565b51608001516111d6878a612ddc565b5160a001516111e5888b612ddc565b5160c001511515916111f7898c612ddc565b5160e0015162ffffff169361120a611899565b956112159087612d3c565b6020860152604085015260608401521515608083015262ffffff1660a082015288519061124182612daf565b5261124b90612daf565b506112568587612ddc565b5160200161126390612ec8565b61126d8489612ddc565b5161127790612765565b6112818789612ddc565b5160800151611290888a612ddc565b5160a0015161129f898b612ddc565b5160c001511515916112b18a8c612ddc565b5160e0015162ffffff16936112c4611899565b956112cf9087612d3c565b6020860152604085015260608401521515608083015262ffffff1660a08201528851906112fb82612dbc565b5261130590612dbc565b506113108487612ddc565b515181519061131e82612daf565b5261132890612daf565b506113338587612ddc565b515190519061134182612dbc565b5261134b90612dbc565b50602087015238611175565b5092506001016110b0565b50906001019061109e565b604051806106118582610ed7565b949060a0946113ad6113cd959461139f60ff949b9a9b60c08b5260c08b01906103c1565b9089820360208b01526103c1565b93600180881b0316604088015216606086015284820360808601526103c1565b931515910152565b3461022057602036600319011261022057600435600154811015610220576113fc90610514565b50611406816102ee565b90610611611416600183016102ee565b9160028101549060ff600461142d600384016102ee565b920154169160405195869560ff8360a01c169260018060a01b0316918761137b565b346102205760203660031901126102205760043561146c81610615565b611474614b36565b6001600160a01b03811660008181526002602052604090205490919061149c9060ff16612ed5565b60005b6001548082101561000e57836114b483610514565b50600201546001600160a01b03906114cb90610392565b16146114da575060010161149f565b91611506611513926115006114f96114f461151d97612756565b610514565b5091610514565b90612f22565b61150e612f9e565b610b6f565b805460ff19169055565b7f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd3600080a2005b346102205760003660031901126102205761155d614b36565b600080546001600160a01b0319811682556001600160a01b0316600080516020615b148339815191528280a3005b8015150361022057565b610f38906020815261010060e06116116115fb6115be87518560208801526101208701906103c1565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a0880152610e41565b60a0870151858203601f190160c08701526103c1565b60c086015115158483015294015162ffffff16910152565b346102205760803660031901126102205760043561164681610615565b6116766024359161165683610615565b6044356064359384926116688461158b565b611670612fed565b50615134565b9061168382511515612d6b565b600090801561172c57815b90825b84518110156117125781156116da578260606116ad8388612ddc565b510151116116c0575b6001905b01611691565b9250905060606116d08385612ddc565b51015190826116b6565b8260406116e78388612ddc565b510151106116f8575b6001906116ba565b9250905060406117088385612ddc565b51015190826116f0565b61061161171f8587612ddc565b5160405191829182611595565b60001961168e565b3461022057600036600319011261022057602060405166038d7ea4c680008152f35b9181601f84011215610220578235916001600160401b038311610220576020838186019501011161022057565b60ff81160361022057565b346102205760a0366003190112610220576004356001600160401b038111610220576117be903690600401611756565b6024356001600160401b038111610220576117dd903690600401611756565b6044939193356117ec81610615565b606435916117f983611783565b608435956001600160401b0387116102205761181c61000e973690600401611756565b96909561303e565b346102205760203660031901126102205760043561184181610615565b611849614b36565b611851614b36565b6001600160a01b038116156118695761000e90615538565b631e4fbdf760e01b600052600060045260246000fd5b62ffffff81160361022057565b60e435906103278261187f565b6040519061032760c0836102cb565b6040519061032760e0836102cb565b60405190610327610100836102cb565b6001600160401b0381116102905760051b60200190565b9291906118ea816118c7565b936118f860405195866102cb565b602085838152019160051b810192831161022057905b82821061191a57505050565b60208091833561192981610615565b81520191019061190e565b9080601f8301121561022057816020610f38933591016118de565b6101403660031901126102205760043561196881610615565b6024359061197582610615565b6044359060643560843561198881610615565b60a43561199481610615565b60c435906119a061188c565b926101043561012435979095906001600160401b03891161022057610611996119d06119d69a3690600401611934565b986132f9565b6040519081529081906020820190565b3461022057602036600319011261022057600435611a0381610615565b60018060a01b03166000526004602052602060ff604060002054166040519015158152f35b34610220576000366003190112610220576000546040516001600160a01b039091168152602090f35b3461022057602036600319011261022057611a6d600435613ab3565b60408051928352602083019190915290f35b3461022057602036600319011261022057600435611a9c81610615565b611aa4614b36565b6001600160a01b03168015611ac957600780546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a59081cdd185ada5b99c818dbdb9d1c9858dd60421b6044820152606490fd5b3461022057602036600319011261022057611b3b600435611b298161158b565b611b31614b36565b1515600554612967565b600555005b6001600160401b03811161029057601f01601f191660200190565b929192611b6782611b40565b91611b7560405193846102cb565b829481845281830111610220578281602093846000960137010152565b606060031982011261022057600435906001600160401b038211610220578060238301121561022057816024611bcd93600401359101611b5b565b90602435611bda81610615565b90604435610f3881610615565b3461022057611bf536611b92565b9190611bff614b36565b6001600160a01b031690611c14821515613ad2565b60408051611c2181610295565b828152602081019384526001600160a01b0390941693019283528051906001600160401b03821161029057611c6082611c5b600854610225565b6127af565b602090601f8311600114611cce57611ca193611c928461000e9795611c9695611c9c95600092611cc3575b505061282e565b6008555b51610392565b612926565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b015190503880611c8b565b6008600052601f1983169190600080516020615b348339815191529260005b818110611d38575084611c9694611c9c94611ca1989461000e9a9860019510611d1f575b505050811b01600855611c96565b015160001960f88460031b161c19169055388080611d11565b92936020600181928786015181550195019301611ced565b34610220576000366003190112610220576005546040516001600160a01b039091168152602090f35b3461022057600036600319011261022057602060ff60055460a01c166040519015158152f35b346102205760c0366003190112610220576004356001600160401b03811161022057611dcf903690600401611756565b60243591611ddc83610615565b604435611de881610615565b606435611df48161158b565b60843591611e0183610615565b60a435956001600160401b03871161022057611e2461000e973690600401610626565b969095613bb8565b3461022057611e676020611e3f36610e15565b9190611e49614b36565b600060405180968195829463a9059cbb60e01b8452600484016126b1565b03926001600160a01b03165af1801561096a57611e8057005b61000e9060203d6020116109f8576109e981836102cb565b3461022057611ea636611b92565b9091611eb0614b36565b611ec46001600160a01b0384161515613ad2565b8051906001600160401b03821161029057611ee482611c5b600854610225565b602090601f8311600114611f165782611ca19361000e9693611f0e93600092611cc357505061282e565b600855612926565b6008600052601f1983169190600080516020615b348339815191529260005b818110611f795750926001928592611ca19661000e999610611f60575b505050811b01600855612926565b015160001960f88460031b161c19169055388080611f52565b92936020600181928786015181550195019301611f35565b34610220576000366003190112610220576007546040516001600160a01b039091168152602090f35b3461022057602036600319011261022057600435611fd6614b36565b60648111611fe357600655005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b346102205760203660031901126102205760043561184981610615565b34610220576020366003190112610220576004356001600160401b0381116102205761206c903690600401610626565b90612075614b36565b61208082151561402d565b6000916000915b8183106120bd57838061209657005b7f0e18d302d46528f9fe1ca287fbdc60b7b9d0a6d9ed00fc3f6303e98683a0bac6600080a2005b9091926120dc610af661150e60406120d68888886125e8565b016126a7565b612177576121216001916120f96120f48787876125e8565b614168565b61211c61210f61150e60406120d68a8a8a6125e8565b805460ff19166001179055565b6142ca565b936121526121396121338387876125e8565b8061406e565b61214c60406120d6868a8a9796976125e8565b92614018565b90838060a01b031690600080516020615af4833981519152600080a35b019190612087565b9260019061216f565b906020808351928381520192019060005b81811061219e5750505090565b825162ffffff16845260209384019390920191600101612191565b602081016020825282518091526040820191602060408360051b8301019401926000915b8383106121ec57505050505090565b909192939460208061227e600193603f1986820301875289519060c061221b835160e0845260e08401906103c1565b92878060a01b03868201511686840152878060a01b03604082015116604084015260608101511515606084015261225b6080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c0818403910152612180565b970193019301919392906121dd565b34610220576000366003190112610220576003546122aa816118c7565b906122b860405192836102cb565b808252600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602084015b8383106122fd576040518061061187826121b9565b60056020600192604051612310816102b0565b612319866102ee565b8152848060a01b03858701541683820152612370612367600288015461234a61234182610392565b60408601612d3c565b61235e60a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b6123896123806003880154610392565b60a08301612d3c565b612395600487016142d9565b60c08201528152019201920191906122e8565b156123af57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b156123f057565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b1561243057565b60405162461bcd60e51b815260206004820152601660248201527515dc985c1c1959081b985d1a5d99481b9bdd081cd95d60521b6044820152606490fd5b1561247557565b60405162461bcd60e51b815260206004820152601c60248201527b43616e6e6f742073776170206e617469766520746f206e617469766560201b6044820152606490fd5b156124c057565b60405162461bcd60e51b81526020600482015260176024820152762ab739bab83837b93a32b21034b7383aba103a37b5b2b760491b6044820152606490fd5b1561250657565b60405162461bcd60e51b81526020600482015260186024820152772ab739bab83837b93a32b21037baba383aba103a37b5b2b760411b6044820152606490fd5b1561254d57565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b908160209103126102205751610f388161158b565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b90359060be1981360301821215610220570190565b901561050f5780610f38916125c3565b9082101561050f57610f389160051b8101906125c3565b634e487b7160e01b600052601160045260246000fd5b9060038202918083046003149015171561262b57565b6125ff565b8181029291811591840414171561262b57565b906001820180921161262b57565b9190820180921161262b57565b1561266557565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b35610f3881610615565b6001600160a01b039091168152602081019190915260400190565b604051906126db6020836102cb565b60008252565b3d1561270c573d906126f282611b40565b9161270060405193846102cb565b82523d6000602084013e565b606090565b1561271857565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b60001981019190821161262b57565b6127100390612710821161262b57565b9190820391821161262b57565b634e487b7160e01b600052600060045260246000fd5b8181106127a3575050565b60008155600101612798565b90601f82116127bc575050565b6103279160086000526020600020906020601f840160051c830193106127ea575b601f0160051c0190612798565b90915081906127dd565b9190601f811161280357505050565b610327926000526020600020906020601f840160051c830193106127ea57601f0160051c0190612798565b8160011b916000199060031b1c19161790565b919091828114612921576128558354610225565b6001600160401b03811161029057612877816128718454610225565b846127f4565b600093601f82116001146128aa5761289b929394829160009261289f57505061282e565b9055565b015490503880611c8b565b6128be601f19831691600052602060002090565b946128ce84600052602060002090565b91815b818110612909575095836001959697106128f0575b505050811b019055565b015460001960f88460031b161c191690553880806128e6565b9192600180602092868b0154815501940192016128d1565b509050565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b80546001600160a01b0319166001600160a01b03909216919091179055565b60ff60a01b191660a09190911b60ff60a01b161790565b9061289b9015158254612967565b90600160401b81116102905781548183558082106129a957505050565b61032792600052600a600960206000209260038380848801048601960602806129d7575b5001040190612798565b6000198601908154906000199060200360031b1c169055386129cd565b90808214612a96578054906001600160401b03821161029057612a29612a3591612a1e848661298c565b600052602060002090565b92600052602060002090565b91600a82049181549160005b848110612a79575050600a8302808203612a5d575b5050505050565b60039060001992030260031b1b19169101553880808080612a56565b600191820180546001600160f01b03909516878301559101612a41565b5050565b90612b5457818103612aaa575050565b60048083612abb6103279585612841565b612ad460018060a01b0360018301541660018601612948565b612b3360028501612b1560028401612af560018060a01b0382541684612948565b612b0960ff825460a01c1615158454612967565b83555460a81c60ff1690565b90805460ff60a81b191691151560a81b60ff60a81b16919091179055565b612b4c612b436003830154610392565b60038601612948565b0191016129f4565b612782565b634e487b7160e01b600052603160045260246000fd5b612b798154610225565b9081612b83575050565b81601f60009311600114612b95575055565b81835260208320612bb191601f0160051c810190600101612798565b808252602082209081548360011b9084198560031b1c191617905555565b6003548015612c425760001901612be7816003610533565b612b545780612bf7600492612b6f565b6000600182015560006002820155600060038201550180546000825580612c20575b5050600355565b612c3b91600052600a60096020600020920104810190612798565b3880612c19565b612b59565b9060ff801983541691151516179055565b60005b60035480821015612cfb57612c7c6001612c74846104f0565b500154610392565b6001600160a01b038481169291168214612c9a575050600101612c5b565b92612cc7612cd493612cc1612cba612cb56115139698612756565b6104f0565b50916104f0565b90612a9a565b612ccf612bcf565b610b89565b7f78e0a2ffcdfbbb49ba5c8050d8630fab2176d825e8360809db049cd98f462a78600080a2565b60405162461bcd60e51b8152602060048201526014602482015273111156081c9bdd5d195c881b9bdd08199bdd5b9960621b604482015280606481015b0390fd5b6001600160a01b039091169052565b60405190612d5882610295565b6060604083828152600060208201520152565b15612d7257565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b80511561050f5760200190565b80516001101561050f5760400190565b80516002101561050f5760600190565b805182101561050f5760209160051b010190565b60405160809190612e0183826102cb565b6003815291601f1901366020840137565b612e1c60026118c7565b90612e2a60405192836102cb565b6002825281601f19612e3c60026118c7565b019060005b828110612e4d57505050565b602090604051612e5c81610275565b600081526000838201526060604082015260608082015260006080820152600060a082015282828501015201612e41565b60405160609190612e9e83826102cb565b6002815291601f19018260005b828110612eb757505050565b806060602080938501015201612eab565b516001600160a01b031690565b15612edc57565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b9060ff61289b91168254612967565b90612b5457818103612f32575050565b600460ff8184612f456103279686612841565b612f556001820160018701612841565b60028501612f82848060028501612f7560018060a01b0382541686612948565b5460a01c16168254612967565b9055612f946003820160038701612841565b0154169101612c47565b6001548015612c425760001901612fb6816001610533565b612b5457600481612fc8600093612b6f565b612fd460018201612b6f565b826002820155612fe660038201612b6f565b0155600155565b6040519061010082016001600160401b0381118382101761029057604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b60ff9261309b96929795989461306d61307693613059614b36565b6040519a6130668c610275565b3691611b5b565b89523691611b5b565b60208701526001600160a01b0390961660408601908152951660608501523691611b5b565b6080820152600160a082015281516001600160a01b031660009081526002602052604090205460ff16613117576130f0816130d86130f69361556d565b6130e861210f61150e8651610392565b519251610392565b916156ad565b6001600160a01b0390911690600080516020615af4833981519152600080a3565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b1561315a57565b60405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b6044820152606490fd5b1561319557565b606460405162461bcd60e51b815260206004820152602060248201527f616d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152fd5b604051606091906131ea83826102cb565b6002815291601f1901366020840137565b6040519061320a6020836102cb565b6000808352366020840137565b602081830312610220578051906001600160401b03821161022057019080601f8301121561022057815161324a816118c7565b9261325860405194856102cb565b81845260208085019260051b82010192831161022057602001905b8282106132805750505090565b8151815260209182019101613273565b91926080936132b592979695978452602084015260a0604084015260a0830190610e41565b6001600160a01b0390951660608201520152565b606090602081526015602082015274158c881cddd85c081d1bc81155120819985a5b1959605a1b60408201520190565b9291909598969793949760018060a01b038916926133188415156123e9565b6001600160a01b038516801594909385159390918685613aa2575b613a63575b6009546001600160a01b031695613350871515612429565b8780613a4e575b8015613a2a575b61388b575050858061387a575b613375901561246e565b85156138735784915b6001600160a01b038b1661386c5785945b8790613855575b61339f906124b9565b6001600160a01b038b1680159061383e575b6133ba906124ff565b86156138385750349a5b6133cf8c151561318e565b86156137d6576001600160a01b0386163b1561022057604051630d0e30db60e41b8152600081600481346001600160a01b038c165af1801561096a576137c1575b505b61343460208d8c604051938492839263095ea7b360e01b8452600484016126b1565b038160006001600160a01b0389165af1801561096a578f948c938f9389936137a4575b50613464610af686610b89565b156136555750916134a1969161347c96959493615a7c565b9a5b6134878c613ab3565b976001600160a01b038b16159290918a908690889061484c565b6001600160a01b0387166135d957506134bc610af686610b89565b613555575b5091613543939187936134ed600080808087600080516020615b548339815191529e5af16108bd6126e1565b1561354f57506000945b6001600160a01b03811661354957506000955b604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b0390a190565b9561350a565b946134f7565b969093909290916001600160a01b0388163b1561022057604051632e1a7d4d60e01b815260048101839052976000908990602490829084906001600160a01b03165af194851561096a57600080516020615b5483398151915298613543966135c4575b509193975091936134c1565b8061095e60006135d3936102cb565b386135b8565b979391949290506020604051809963a9059cbb60e01b825281600081613603888b600484016126b1565b03926001600160a01b03165af194851561096a57600080516020615b548339815191529861354396613636575b506134ed565b61364e9060203d6020116109f8576109e981836102cb565b5038613630565b95945061367161366c61366788612daf565b612ec8565b610392565b15801561378e575b61375f575b891561369c57916134a19691613696969594936158b6565b9a61347e565b91949392916001600160a01b038e166137505750506040516318cbafe560e01b815294600094869485946136d7945092309260048701613290565b0381836001600160a01b038c165af16000918161372b575b5061370d5760405162461bcd60e51b815280612d38600482016132c9565b6137248161371e6134a19351612756565b90612ddc565b519a61347e565b6137499192503d806000833e61374181836102cb565b810190613217565b90386136ef565b946134a19691613696966158b6565b94506137696131d9565b61377b8661377683612daf565b612d3c565b6137888261377683612dbc565b9461367e565b5061379e61366c61366788612dbc565b15613679565b6137bc9060203d6020116109f8576109e981836102cb565b613457565b8061095e60006137d0936102cb565b38613410565b6137f860208d604051809381926323b872dd60e01b8352303360048501612595565b038160006001600160a01b0389165af1801561096a57613819575b50613412565b6138319060203d6020116109f8576109e981836102cb565b5038613813565b9a6133c4565b506133ba61384e610af68d610b6f565b90506133b1565b5061339f613865610af68a610b6f565b9050613396565b8a9461338f565b869161337e565b506001600160a01b038a161561336b565b995099505095505050955096505085600014613a24575034945b1561395d5750506001600160a01b0381163b1561022057604051630d0e30db60e41b815290600082600481876001600160a01b0386165af190811561096a57613911936020938693613948575b50600060405180968195829463a9059cbb60e01b8452600484016126b1565b03926001600160a01b03165af1801561096a5761392c575090565b6139449060203d6020116109f8576109e981836102cb565b5090565b8061095e6000613957936102cb565b386138f2565b6040516323b872dd60e01b81529193506020908290816000816139858a303360048501612595565b03925af1801561096a57613a07575b506001600160a01b0381163b1561022057604051632e1a7d4d60e01b815260048101849052906000908290602490829084906001600160a01b03165af1801561096a5760008085610f3895829583956139f3575b505af16108bd6126e1565b8061095e85613a01936102cb565b386139e8565b613a1f9060203d6020116109f8576109e981836102cb565b613994565b946138a5565b506001600160a01b0387168114801561335e57506001600160a01b038c161561335e565b506001600160a01b038c811690881614613357565b613a858c613a7661366c61366783612daf565b159081613a8a575b5015613153565b613338565b613a9b915061366761366c91612dbc565b158d613a7e565b506001600160a01b038b1615613333565b90612710613ac360065484612630565b0480830392831161262b579190565b15613ad957565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b81519192916001600160401b03811161029057613b2d816128718454610225565b6020601f8211600114613b5057819061289b939495600092611cc357505061282e565b601f19821690613b6584600052602060002090565b9160005b818110613ba057509583600195969710613b8757505050811b019055565b015160001960f88460031b161c191690553880806128e6565b9192602060018192868b015181550194019201613b69565b93919590949295613bc7614b36565b6001600160a01b038116978815613ca25786613c43613c4d94612ccf93613c3c613c5299613c24613c579e613c0c8e8d613c7e575b613c046118a8565b993691611b5b565b8852613c1b8a60208a01612d3c565b60408801612d3c565b60016060870152891515608087015260a08601612d3c565b3691613d6a565b60c0820152613eb4565b612c47565b614018565b7f2175f84b6c6dcc917bbec41b7f62cf11694eacf7a87f2fd2eda7e36d4c2c58b2600080a3565b613c926001600160a01b0386161515613ce0565b613c9d871515613d25565b613bfc565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420726f75746572206164647265737360501b6044820152606490fd5b15613ce757565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642071756f746572206164647265737360501b6044820152606490fd5b15613d2c57565b60405162461bcd60e51b81526020600482015260166024820152754d7573742070726f766964652066656520746965727360501b6044820152606490fd5b929190613d76816118c7565b93613d8460405195866102cb565b602085838152019160051b810192831161022057905b828210613da657505050565b602080918335613db58161187f565b815201910190613d9a565b9062ffffff809160031b9316831b921b19161790565b815190916001600160401b038211610290576020613e0591613df8848661298c565b0192600052602060002090565b600a82049160005b838110613e705750600a8302900380613e27575b50505050565b9260009360005b818110613e4357505050015538808080613e21565b9091946020613e66600192613e5b895162ffffff1690565b908560030290613dc0565b9601929101613e2e565b6000805b600a8110613e89575083820155600101613e0d565b95906020613eab600192613ea0855162ffffff1690565b908a60030290613dc0565b92019601613e74565b90600354600160401b81101561029057806001613ed692016003556003610533565b612b5457825180519093906001600160401b03811161029057613f0381613efd8554610225565b856127f4565b6020601f8211600114613fa25791613f2e8260c0936004956103279899600092611cc357505061282e565b84555b613f4a613f416020830151610392565b60018601612948565b613f8960028501613f67613f616040850151610392565b82612948565b613f7d613f776060850151151590565b8261297e565b60808301511515612b15565b613f99612b4360a0830151610392565b01519101613dd6565b601f19821695613fb785600052602060002090565b9660005b8181106140005750926103279697600495936001938360c09710613fe7575b505050811b018455613f31565b015160001960f88460031b161c19169055388080613fda565b83830151895560019098019760209384019301613fbb565b81604051928392833781016000815203902090565b1561403457565b60405162461bcd60e51b8152602060048201526012602482015271139bc81d1bdad95b9cc81c1c9bdd9a59195960721b6044820152606490fd5b903590601e198136030182121561022057018035906001600160401b0382116102205760200191813603831361022057565b9092916001600160401b038111610290576140bf816128718454610225565b6000601f82116001146140ed57819061289b9394956000926140e257505061282e565b013590503880611c8b565b601f1982169461410284600052602060002090565b91805b87811061413c57508360019596971061412257505050811b019055565b0135600019600384901b60f8161c191690553880806128e6565b90926020600181928686013581550194019101614105565b35610f3881611783565b35610f388161158b565b90600154600160401b8110156102905780600161418a92016001556001610533565b612b5457614198838061406e565b9093906001600160401b038111610290576141b781613efd8554610225565b6000601f8211600114614251576004926141e58361424a9460a094610327999a6000926140e257505061282e565b85555b6142026141f8602083018361406e565b90600188016140a0565b61422a60028601614218613f61604085016126a7565b61422460608401614154565b90612f13565b61424461423a608083018361406e565b90600388016140a0565b0161415e565b9101612c47565b601f1982169061426685600052602060002090565b91815b8181106142b257508360a09361032798996004979461424a9760019510614298575b505050811b0185556141e8565b0135600019600384901b60f8161c1916905538808061428b565b9192602060018192868c013581550194019201614269565b600019811461262b5760010190565b604051815480825290929183906142f96020830191600052602060002090565b926000905b80600983011061445d57610327945491818110614447575b81811061442d575b818110614413575b8181106143f9575b8181106143df575b8181106143c5575b8181106143ab575b818110614391575b818110614377575b10614364575b5003836102cb565b60d81c62ffffff1681526020013861435c565b60c083901c62ffffff168452926001906020019301614356565b60a883901c62ffffff16845292600190602001930161434e565b609083901c62ffffff168452926001906020019301614346565b607883901c62ffffff16845292600190602001930161433e565b606083901c62ffffff168452926001906020019301614336565b604883901c62ffffff16845292600190602001930161432e565b603083901c62ffffff168452926001906020019301614326565b601883901c62ffffff16845292600190602001930161431e565b62ffffff83168452926001906020019301614316565b91600a91935061014060019161450a87546144818362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b0194019201859293916142fe565b6000806040516020810190637b3338ad60e11b8252600b6024820152826044820152604481526145496064826102cb565b51906a636f6e736f6c652e6c6f675afa50565b903590601e198136030182121561022057018035906001600160401b03821161022057602001918160051b3603831361022057565b906080926132b5919695949683526000602084015260a0604084015260a0830190610e41565b35610f388161187f565b929190946145ef6020836145d4866126a7565b60405163095ea7b360e01b81529384928392600484016126b1565b038160006001600160a01b038a165af1801561096a5761482f575b506146176080840161415e565b1561463c5750610f389461463660a061462f856126a7565b94016145b7565b93615982565b909290156147825791816000949361466561465e60406146ae9996018461455c565b36916118de565b938451158015614766575b8015614741575b614708575b505061468e61366c61366c87936126a7565b92604051968795869485936318cbafe560e01b8552309160048601614591565b03925af1600091816146eb575b506146d95760405162461bcd60e51b815280612d38600482016132c9565b8061371e6146e79251612756565b5190565b6147019192503d806000833e61374181836102cb565b90386146bb565b8692945061366c61468e9261473861366c9361472f6147256131d9565b9361377685612daf565b61377683612dbc565b9593505061467c565b5060018060a01b0361475f6136676147598851612756565b88612ddc565b1615614677565b506001600160a01b0361477b61366787612daf565b1615614670565b909291610f389461479961465e604087018761455c565b948551158015614813575b80156147ee575b6147bf575b6147b9906126a7565b926157bf565b94506147b96147cc6131d9565b6147d98561377683612daf565b6147e68361377683612dbc565b9590506147b0565b5060018060a01b0361480c6136676148068951612756565b89612ddc565b16156147ab565b506001600160a01b0361482861366788612daf565b16156147a4565b6148479060203d6020116109f8576109e981836102cb565b61460a565b9493929195600554906148638260ff9060a01c1690565b80614b14575b15614ab45750506001600160a01b03868116949082168581146149f6575085106149b6576148af906148a661489c6131d9565b9761377689612daf565b61377687612dbc565b47936020604051809563095ea7b360e01b8252816000816148d48789600484016126b1565b03925af1801561096a5761490c966000958692614999575b506040516318cbafe560e01b815297889586948593309160048601614591565b03926001600160a01b03165af191821561096a5761493092614980575b5047612775565b80614939575b50565b61494761366c600754610392565b803b15610220576000906004604051809481936306f4a2cd60e41b83525af1801561096a5715614936578061095e6000610327936102cb565b614994903d806000833e61374181836102cb565b614929565b6149b19060203d6020116109f8576109e981836102cb565b6148ec565b5050506149cd925090602091611e49600554610392565b03925af1801561096a576149de5750565b6149369060203d6020116109f8576109e981836102cb565b9596505066038d7ea4c6800086109350614aa29250505057803b1561022057604051632e1a7d4d60e01b815260048101839052906000908290602490829084905af1801561096a57614a8d575b50614a5261366c600754610392565b803b15610220576000906004604051809481936306f4a2cd60e41b83525af1801561096a57614a7e5750565b8061095e6000610327936102cb565b8061095e6000614a9c936102cb565b38614a43565b6149cd91602091611e49600554610392565b935093505050929192600014614aea575050600080808061032794614ae061366c61366c600554610392565b5af16108bd6126e1565b91602091611e49614afa94610392565b03926001600160a01b03165af1801561096a576149de5750565b506007546001600160a01b0390614b2e9061366c90610392565b161515614869565b6000546001600160a01b03163303614b4a57565b63118cdaa760e01b6000523360045260246000fd5b90614b69826118c7565b614b7660405191826102cb565b8281528092614b87601f19916118c7565b019060005b828110614b9857505050565b602090614ba3612fed565b82828501015201614b8c565b604090610f38939281528160208201520190610e41565b919091805483101561050f576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b90816020910312610220575190565b919060035490614c44614c3f83612615565b614b5f565b93600093845b848110614c5b575050505050815290565b614c83614c7f6002614c73849a95969799989a6104f0565b50015460a01c60ff1690565b1590565b61512557614ca16002614c95836104f0565b50015460a81c60ff1690565b15614e9557614cb761366c6003612c74846104f0565b6001600160a01b03169660005b6004614ccf846104f0565b500154811015614e8357876000808888614d3a614d0a614cfb886004614cf48d6104f0565b5001614bc6565b905462ffffff9160031b1c1690565b614d2c60405193849289602085019763f7729d4360e01b895260248601614be8565b03601f1981018352826102cb565b51908d622dc6c0fa614d4a6126e1565b90614d5a575b5050600101614cc4565b9782614e5e86614e79948b614d7c8e6001999f60208091518301019101614c1e565b614e30614e13614cfb614d8e876104f0565b50986004614cf4614da28f612c748c6104f0565b99612cb5614dae6131fb565b99614e05614dc3614cfb8888614cf4886104f0565b9c6040519d8e9360208501606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b03601f1981018c528b6102cb565b94614e25614e1f6118b7565b986102ee565b885260208801612d3c565b8c60408701526060860152608085015260a0840152614e5260c0840160019052565b62ffffff1660e0830152565b614e688288612ddc565b52614e738187612ddc565b506142ca565b9690508738614d50565b50949593929196506001905b01614c4a565b614ea760099795969493929754610392565b614eaf6131d9565b614ebc8561377683612daf565b614ec98661377683612dbc565b614eeb614ed4612df0565b92614ee28761377686612daf565b61377684612dbc565b614ef88661377684612dcc565b614f00612df0565b91614f0e8661377685612daf565b614f25614f1c600a54610392565b61377685612dbc565b614f328761377685612dcc565b614f4661366c61366c6001612c74886104f0565b9160405163d06ca61f60e01b815260008180614f66858b60048401614baf565b0381875afa6000918161510a575b506150e057505060405163d06ca61f60e01b815260008180614f9a858a60048401614baf565b0381865afa600091816150c5575b5061509b5750506000604051809263d06ca61f60e01b82528180614fd0878a60048401614baf565b03915afa60009181615080575b50614fed575b5050600190614e8f565b968261507892819961503861501a6150146001612c7461500d829b6104f0565b50976104f0565b92612dcc565b519161502d6150276118b7565b956102ee565b855260208501612d3c565b866040840152606083015260808201526150506126cc565b60a0820152600060c0820152600060e082015261506d828b612ddc565b52614e73818a612ddc565b959038614fe3565b61509491923d8091833e61374181836102cb565b9038614fdd565b6150bf93508499925090849161503861501a6150146001612c7461500d829b6104f0565b95614e8f565b6150d991923d8091833e61374181836102cb565b9038614fa8565b6150bf9450859a935085925061503861501a6151046001612c7461500d829b6104f0565b92612dbc565b61511e91923d8091833e61374181836102cb565b9038614f74565b60019096949593929196614e8f565b91929060035492615147614c3f85612615565b9460009485905b80821061516057505050505050815290565b615178614c7f6002614c73859b9697989a999b6104f0565b6155295761518a6002614c95846104f0565b156152a957966151a161366c6003612c74856104f0565b6001600160a01b03169760005b60046151b9856104f0565b50015481101561529457886000808c8a8a6152016151df614cfb896004614cf48f6104f0565b614d2c6040519384928a602085019763f7729d4360e01b895260248601614be8565b5191622dc6c0fa6152106126e1565b90615220575b50506001016151ae565b98826152758761528a948c6152416001989f60208082518301019101614c1e565b615253614e13614cfb614d8e876104f0565b8d60408701526060860152608085015260a0840152614e5260c0840160019052565b61527f8289612ddc565b52614e738188612ddc565b9790508838615216565b5095969493929750906001905b01909461514e565b949593929196906152bb600954610392565b6152c36131d9565b6152d08661377683612daf565b6152dd8761377683612dbc565b6152f66152e8612df0565b92614ee28861377686612daf565b6153038761377684612dcc565b61530b612df0565b916153198761377685612daf565b615327614f1c600a54610392565b6153348861377685612dcc565b61534861366c61366c6001612c74886104f0565b9160405163d06ca61f60e01b81528660008280615369868d60048401614baf565b0381885afa6000928161550e575b506154da57505060405163d06ca61f60e01b8152905085600082806153a0868c60048401614baf565b0381875afa600092816154bf575b50615483579150506000604051809363d06ca61f60e01b825281806153d7888c60048401614baf565b03915afa60009281615468575b506153f5575b5050506001906152a1565b615400575b836153ea565b978261546092819a61542061501a6150146001612c7461500d829b6104f0565b876040840152606083015260808201526154386126cc565b60a0820152600060c0820152600060e0820152615455828c612ddc565b52614e73818b612ddc565b9690386153fa565b61547c91933d8091833e61374181836102cb565b91386153e4565b9193509150615497575b50506001906152a1565b97826154b792819a61542061501a6150146001612c7461500d829b6104f0565b96903861548d565b6154d391933d8091833e61374181836102cb565b91386153ae565b9250925092506154ee5750506001906152a1565b97826154b792819a61542061501a6151046001612c7461500d829b6104f0565b61552291933d8091833e61374181836102cb565b9138615377565b949593929196906001906152a1565b600080546001600160a01b039283166001600160a01b0319821681178355921690600080516020615b148339815191529080a3565b90600154600160401b8110156102905780600161558f92016001556001610533565b612b5457825180519093906001600160401b038111610290576155b681613efd8554610225565b6020601f8211600114615634576004926155e48361424a9460a094610327999a600092611cc357505061282e565b85555b6155f8602082015160018701613b0c565b61561c6002860161560f613f616040850151610392565b606083015160ff16614224565b61562d608082015160038701613b0c565b0151151590565b601f1982169561564985600052602060002090565b9660005b818110615695575083610327979860a0946004979461424a976001951061567c575b505050811b0185556155e7565b015160001960f88460031b161c1916905538808061566f565b8383015189556001909801976020938401930161564d565b6156c59060206040519282848094519384920161039e565b810103902090565b156156d457565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b1561571657565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b1561576e57565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b615848956158276000969594936157fe88946157df6002865110156156cd565b6157eb61366786612daf565b6001600160a01b0390811691161461570f565b61581461366761580e8551612756565b85612ddc565b6001600160a01b03908116911614615767565b6040516338ed173960e01b8152968795869485933091869060048701613290565b03926001600160a01b03165af160009181615899575b506146d95760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b6158af9192503d806000833e61374181836102cb565b903861585e565b926158f760009697939594926158e188946158d56002885110156156cd565b6157eb61366788612daf565b6158146136676158f18751612756565b87612ddc565b615848604051978896879586946338ed173960e01b8652309260048701613290565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b90916000956159bb6020966159af6159fa97966159a76159a06118b7565b9788612d3c565b898701612d3c565b62ffffff166040850152565b6159c83060608501612d3c565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b835260048301615919565b03926001600160a01b03165af160009181615a4b575b50610f385760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b615a6e91925060203d602011615a75575b615a6681836102cb565b810190614c1e565b9038615a10565b503d615a5c565b91600096615ab5602097615aa96159fa989795615aa1615a9a6118b7565b9889612d3c565b8a8801612d3c565b62ffffff166040860152565b615ac23060608601612d3c565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b83526004830161591956fe6d97a31531bdb3c43d920bc996ec8b9fd7733f5f55a81cd74700f88631fc60328be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3b37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da264697066735822122038c242ebf6eca6c7c34bc20018258d61e23ab5120bba7856790424c78b49ad2764736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.