Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Multiple Tok... | 10624374 | 25 hrs ago | IN | 0 S | 0.01701018 | ||||
Add Dex | 10623408 | 25 hrs ago | IN | 0 S | 0.00727776 | ||||
Add Dex | 10623310 | 25 hrs ago | IN | 0 S | 0.00728106 | ||||
Add Dex | 10623111 | 25 hrs ago | IN | 0 S | 0.01058519 | ||||
Add Dex | 10622980 | 25 hrs ago | IN | 0 S | 0.0072804 | ||||
Add Dex | 10622831 | 25 hrs ago | IN | 0 S | 0.00727842 | ||||
Add Dex | 10622718 | 25 hrs ago | IN | 0 S | 0.01063238 | ||||
Add Dex | 10622431 | 25 hrs ago | IN | 0 S | 0.00822156 | ||||
Add Wrapped | 10621693 | 25 hrs ago | IN | 0 S | 0.00512292 |
Loading...
Loading
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 mapping(uint256 => WrappedNatives) public wrappedByChain; // 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(uint256 chain) internal view returns (address) { if(wrappedByChain[chain]._address != address(0)) { return wrappedByChain[chain]._address; } return address(0); } 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, uint256 chain ) internal view returns (Quote[] memory) { Quote[] memory quotes = new Quote[](supportedDexes[chain].length * 3); uint256 validQuotes = 0; for (uint i = 0; i < supportedDexes[chain].length; i++) { if (!supportedDexes[chain][i].active) continue; //account for v3 if(supportedDexes[chain][i].isV3) { IV3Quoter quoter = IV3Quoter(supportedDexes[chain][i].quoter); for (uint j = 0; j < supportedDexes[chain][i].feeTiers.length; j++) { // Encode the function call data bytes memory callData = abi.encodeWithSelector( quoter.quoteExactInputSingle.selector, tokenIn, tokenOut, supportedDexes[chain][i].feeTiers[j], amount, 0 ); // Use low-level staticcall to simulate the function (bool success, bytes memory result) = address(quoter).staticcall(callData); if (success) { uint256 amountOut = abi.decode(result, (uint256)); quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amountOut, path: new address[](0), v3Path: abi.encodePacked(tokenIn, supportedDexes[chain][i].feeTiers[j], tokenOut), isV3: true, feeTier: supportedDexes[chain][i].feeTiers[j] }); validQuotes++; } } } else { // Existing V2 quote logic address WBNB = getWrappedNative(chain); // 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] = wrappedByChain[chain].stableCoin; stablePath[2] = tokenOut; IRouter router = IRouter(supportedDexes[chain][i].routerAddress); try router.getAmountsOut(amount, path) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][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[chain][i].name, dexRouter: supportedDexes[chain][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[chain][i].name, dexRouter: supportedDexes[chain][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, uint256 chain ) public view returns (SplitQuote memory) { // Get all possible quotes first Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, true, chain); 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, uint256 chain ) external view returns (Quote memory) { Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, isExactIn, chain); 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, uint256 chain ) external payable returns (uint256) { require(recipient != address(0), "Invalid recipient"); require(!(path[0] == address(0) && path[1] == address(0)), "Invalid path"); address wrappedNative = getWrappedNative(chain); 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); } // Approve router to spend tokens IERC20(actualTokenIn).approve(router, amountIn); 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, uint256 chain ) external payable returns (uint256) { console.log(1); require(routes.length > 0, "No routes provided"); require(recipient != address(0), "Invalid recipient"); console.log(2); address wrappedNative = getWrappedNative(chain); require(wrappedNative != address(0), "Wrapped native not set"); console.log(3); bool isNativeIn = tokenIn == address(0); bool isNativeOut = tokenOut == address(0); require(!(isNativeIn && isNativeOut), "Cannot swap native to native"); console.log(4); // Real tokens to use in swap logic address actualTokenIn = isNativeIn ? wrappedNative : tokenIn; address actualTokenOut = isNativeOut ? wrappedNative : tokenOut; console.log(5); // Validate tokens require(isNativeIn || isSupportedToken[tokenIn], "Unsupported input token"); require(isNativeOut || isSupportedToken[tokenOut], "Unsupported output token"); console.log(6); uint256 swapAmount = isNativeIn ? msg.value : amountIn; require(swapAmount > 0, "Zero amount"); console.log(7); // Handle native input (convert to wrapped) if (isNativeIn) { console.log(8); IWeth(wrappedNative).deposit{value: msg.value}(); } else { console.log(9); // Transfer ERC20 tokens from sender IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); } console.log(10); // Process all routes and track total output uint256 totalAmountOut; console.log(11, totalAmountOut); for(uint i = 0; i < routes.length; i++) { console.log(12); uint256 routeAmountIn = (swapAmount * routes[i].percentage) / 10000; totalAmountOut += _processRoute( actualTokenIn, actualTokenOut, routeAmountIn, routes[i], deadline, isNativeOut ); } console.log(13); 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); console.log(14); // 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, uint256 chain) internal view returns (IDEXStructs.DEX memory) { require(_dexRouter != address(0), "Invalid router address"); for (uint256 i = 0; i < supportedDexes[chain].length; i++) { if (supportedDexes[chain][i].routerAddress == _dexRouter) { return supportedDexes[chain][i]; } } revert("DEX not found"); } //For wrapped function addWrapped(string memory name, address _address, address stable, uint256 chain) external onlyOwner { require(_address != address(0), "bad address"); wrappedByChain[chain] = WrappedNatives(name, _address, stable); } function updateWrapped(string memory name, address _address, address stable, uint256 chain) external onlyOwner { require(_address != address(0), "bad address"); wrappedByChain[chain].name = name; wrappedByChain[chain]._address = _address; wrappedByChain[chain].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 { mapping(uint256 => 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, uint256 indexed chainId); event DexUpdated(uint256 indexed index, string indexed name, uint256 indexed chainId); event DexRemoved(string indexed name, uint256 indexed chainId); constructor(address _someAddress) TokenManager(_someAddress) {} function addDex( string calldata name, address router, address factory, bool isV3, address quoter, uint24[] calldata feeTiers, uint256 chain ) 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[chain].push(IDEXStructs.DEX({ name: name, routerAddress: router, factory: factory, active: true, isV3: isV3, quoter: quoter, feeTiers: feeTiers })); isV3Router[router] = isV3; emit DexAdded(name, router, chain); } function removeDex(string calldata name, uint256 chain) external onlyOwner { bytes32 nameHash = keccak256(bytes(name)); IDEXStructs.DEX[] storage dexes = supportedDexes[chain]; for (uint i = 0; i < dexes.length; i++) { if (keccak256(bytes(dexes[i].name)) == nameHash) { address routerToRemove = dexes[i].routerAddress; dexes[i] = dexes[dexes.length - 1]; dexes.pop(); isV3Router[routerToRemove] = false; emit DexRemoved(name, chain); return; } } revert("DEX not found"); } function getDexes(uint256 chain) external view returns (IDEXStructs.DEX[] memory) { return supportedDexes[chain]; } }
// 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; uint256 chainId; string logouri; bool active; } mapping(uint256 => Token[]) public tokensByChain; // chainId => Token[] mapping(address => bool) public isSupportedToken; // shows that a token is supported event TokenAdded(string indexed symbol, address indexed tokenAddress, uint256 indexed chainId); event TokenRemoved(address indexed tokenAddress, uint256 indexed chainId); event TokenUpdated(string indexed symbol, address indexed tokenAddress, uint256 indexed chainId); event MultipleTokensAdded(uint256 indexed count, uint256 indexed chainId); constructor(address _someAddress) Ownable(_someAddress) {} function addToken( string calldata symbol, string calldata name, address tokenAddress, uint8 decimals, uint256 chainId, string calldata logoUri ) external onlyOwner { _addSingleToken( Token({ symbol: symbol, name: name, tokenAddress: tokenAddress, decimals: decimals, chainId: chainId, logouri: logoUri, active: true }) ); } function _addSingleToken(Token memory newToken) private { require(!isSupportedToken[newToken.tokenAddress], "Token already exists"); require(newToken.tokenAddress != address(0), "Invalid token address"); tokensByChain[newToken.chainId].push(newToken); isSupportedToken[newToken.tokenAddress] = true; emit TokenAdded(newToken.symbol, newToken.tokenAddress, newToken.chainId); } function addMultipleTokens( Token[] calldata tokens ) external onlyOwner { require(tokens.length > 0, "No tokens provided"); uint256 addedCount = 0; uint256 chainId = tokens[0].chainId; for (uint256 i = 0; i < tokens.length; i++) { if (isSupportedToken[tokens[i].tokenAddress] || tokens[i].tokenAddress == address(0)) { continue; } tokensByChain[tokens[i].chainId].push(tokens[i]); isSupportedToken[tokens[i].tokenAddress] = true; addedCount++; emit TokenAdded(tokens[i].symbol, tokens[i].tokenAddress, tokens[i].chainId); } if (addedCount > 0) { emit MultipleTokensAdded(addedCount, chainId); } } function removeToken(address tokenAddress, uint256 chainId) external onlyOwner { require(isSupportedToken[tokenAddress], "Token not found"); Token[] storage tokens = tokensByChain[chainId]; for (uint i = 0; i < tokens.length; i++) { if (tokens[i].tokenAddress == tokenAddress) { tokens[i] = tokens[tokens.length - 1]; tokens.pop(); isSupportedToken[tokenAddress] = false; emit TokenRemoved(tokenAddress, chainId); break; } } } function getAllTokens(uint256 chainId) external view returns (Token[] memory) { return tokensByChain[chainId]; } }
// 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
[{"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"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"DexAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"DexRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"DexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"chainId","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"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"symbol","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"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[]"},{"internalType":"uint256","name":"chain","type":"uint256"}],"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":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct TokenManager.Token[]","name":"tokens","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":"uint256","name":"chainId","type":"uint256"},{"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"},{"internalType":"uint256","name":"chain","type":"uint256"}],"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"},{"internalType":"uint256","name":"chain","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[]"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"executeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"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":"uint256","name":"chainId","type":"uint256"},{"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"},{"internalType":"uint256","name":"chain","type":"uint256"}],"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"},{"internalType":"uint256","name":"chain","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":[{"internalType":"uint256","name":"chain","type":"uint256"}],"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":"string","name":"name","type":"string"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"removeDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"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"},{"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"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensByChain","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":"uint256","name":"chainId","type":"uint256"},{"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"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"updateWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrappedByChain","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
608080604052346093573315607d5760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36014600655600580546001600160a81b0319163360ff60a01b1916179055615f2f90816100998239f35b631e4fbdf760e01b600052600060045260246000fd5b600080fdfe60806040526004361015610010575b005b60003560e01c806303a56b321461021057806313baf1e61461020b5780632182e46714610206578063240028e8146102015780632688807c146101fc5780634c984d38146101f757806359e63b23146101f25780635bc4e0ec146101ed5780635f524ea3146101e85780636c96b2bf146101e3578063715018a6146101de57806381ee0715146101d957806384b06bc0146101d4578063880cdc31146101cf5780638cf106e1146101ca5780638da5cb5b146101c557806399a5d747146101c05780639dd373b9146101bb5780639ed12c31146101b6578063a7d87c0e146101b1578063b0fa3694146101ac578063b24266cb146101a7578063b26baa5f146101a2578063b5d52d1a1461019d578063ba14713214610198578063cc21392e14610193578063cea9d26f1461018e578063ee99205c14610189578063f05c5fed14610184578063f2fde38b1461017f578063f71918771461017a5763fa972c660361000e57611f60565b611e58565b611dbb565b611d56565b611d2d565b611c8e565b611b8f565b611a9d565b611a74565b6118ce565b611787565b611677565b61159f565b611568565b6114de565b6114b0565b611487565b611445565b6113ea565b61135f565b61129b565b611254565b6111c4565b611096565b610f28565b610de0565b610c52565b610859565b61069e565b6105cf565b610493565b610411565b6000526001602052604060002090565b6000526008602052604060002090565b6000526003602052604060002090565b90600182811c92168015610275575b602083101461025f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610254565b600052602060002090565b634e487b7160e01b600052604160045260246000fd5b60e081019081106001600160401b038211176102bb57604052565b61028a565b606081019081106001600160401b038211176102bb57604052565b60c081019081106001600160401b038211176102bb57604052565b601f909101601f19168101906001600160401b038211908210176102bb57604052565b906040519182600082549261032d84610245565b808452936001811690811561039b5750600114610354575b50610352925003836102f6565b565b90506000929192526020600020906000915b81831061037f5750509060206103529282010138610345565b6020919350806001915483858901015201910190918492610366565b90506020925061035294915060ff191682840152151560051b82010138610345565b6001600160a01b031690565b60005b8381106103dc5750506000910152565b81810151838201526020016103cc565b90602091610405815180928185528580860191016103c9565b601f01601f1916010190565b3461047d57602036600319011261047d57600435600052600860205261046e604060002061043e81610319565b60018201546002909201546040516060808252909485946001600160a01b039081169493169290918501906103ec565b91602084015260408301520390f35b600080fd5b6001600160a01b0381160361047d57565b3461047d57604036600319011261047d576004356104b081610482565b602435906104bc61437a565b6001600160a01b0381166000818152600260205260409020546104e19060ff16611ff0565b6104ea83610215565b9160005b83548082101561000e57836105038387611ee2565b50600201546001600160a01b039061051a906103bd565b161461052957506001016104ee565b610570939461055c610566949361055661054e61054861056196612044565b85611ee2565b509184611ee2565b90612229565b61234e565b61066a565b805460ff19169055565b7fbe9bb4bdca0a094babd75e3a98b1d2e2390633430d0a2f6e2b9970e2ee03fb2e600080a3005b9181601f8401121561047d578235916001600160401b03831161047d576020838186019501011161047d57565b60ff81160361047d57565b3461047d5760c036600319011261047d576004356001600160401b03811161047d576105ff903690600401610597565b6024356001600160401b03811161047d5761061e903690600401610597565b60449391933561062d81610482565b6064359061063a826105c4565b60a4359560843593906001600160401b03881161047d5761066261000e983690600401610597565b9790966123a5565b6001600160a01b0316600090815260026020526040902090565b6001600160a01b0316600090815260046020526040902090565b3461047d57602036600319011261047d576004356106bb81610482565b60018060a01b03166000526002602052602060ff604060002054166040519015158152f35b906020808351928381520192019060005b8181106106fe5750505090565b82516001600160a01b03168452602093840193909201916001016106f1565b9080602083519182815201916020808360051b8301019401926000915b83831061074957505050505090565b9091929394602080610767600193601f1986820301875289516103ec565b9701930193019193929061073a565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b8282106107da57505050509260408460206107d795960151828401520151906060601f198285030191015261071d565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610838610826604087015160c0604088015260c08701906106e0565b606087015186820360608801526103ec565b946080810151151560808601520151169101529701920192019092916107a7565b3461047d57608036600319011261047d5760043561087681610482565b6108a36024359161088683610482565b604435809361089460643590565b9261089d6124cb565b50614691565b6108af815115156124eb565b60005b6108bc8251612044565b811015610952576108cc8161252f565b8251811015610949578060606108e460019386612577565b51015160606108f38587612577565b51015110610902575b016108cc565b61090c8385612577565b516109178286612577565b516109228587612577565b5261092d8486612577565b506109388286612577565b526109438185612577565b506108fc565b506001016108b2565b5060009061095e6124cb565b906000905b8051821015610c40576109758261252f565b8151811015610c355761098661258b565b926109c46109938561254a565b526113886109a085612557565b52611d4c6109ad85612567565b5260005b8451811015610c2a576109e26109dc6109d46109cd8489612577565b518b6122db565b612710900490565b89612068565b50610a40610a0c6109d460606109f88689612577565b510151610a05858a612577565b51906122db565b610a3a6109d46060610a1e888a612577565b510151610a34610a2e878c612577565b51612058565b906122db565b9061253d565b878111610a51575b506001016109b1565b965086610a5c6125ad565b8752610a66612628565b60408801908152610a778487612577565b5160200151610a85906103bd565b610a8f8489612577565b51610a9a8689612577565b5160800151610aa9878a612577565b5160a00151610ab8888b612577565b5160c00151151591610aca898c612577565b5160e0015162ffffff1693610add610fba565b95610ae890876124bc565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610b148261254a565b52610b1e9061254a565b50610b298587612577565b51602001610b3690612663565b610b408489612577565b51610b4a90612058565b610b548789612577565b5160800151610b63888a612577565b5160a00151610b72898b612577565b5160c00151151591610b848a8c612577565b5160e0015162ffffff1693610b97610fba565b95610ba290876124bc565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610bce82612557565b52610bd890612557565b50610be38487612577565b5151815190610bf18261254a565b52610bfb9061254a565b50610c068587612577565b5151905190610c1482612557565b52610c1e90612557565b50602087015238610a48565b509250600101610975565b509060010190610963565b60405180610c4e8582610776565b0390f35b3461047d57602036600319011261047d57600435610c6f81610482565b610c7761437a565b6001600160a01b03168015610c9c57600580546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b906020808351928381520192019060005b818110610cf15750505090565b825162ffffff16845260209384019390920191600101610ce4565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610d3f57505050505090565b9091929394602080610dd1600193603f1986820301875289519060c0610d6e835160e0845260e08401906103ec565b92878060a01b03868201511686840152878060a01b036040820151166040840152606081015115156060840152610dae6080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c0818403910152610cd3565b97019301930191939290610d30565b3461047d57602036600319011261047d57600435600052600360205260406000208054610e0c816112d7565b91610e1a60405193846102f6565b818352602083019060005260206000206000915b838310610e435760405180610c4e8782610d0c565b60056020600192604051610e56816102a0565b610e5f86610319565b8152848060a01b03858701541683820152610eb6610ead6002880154610e90610e87826103bd565b604086016124bc565b610ea460a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b610ecf610ec660038801546103bd565b60a083016124bc565b610edb60048701612670565b60c0820152815201920192019190610e2e565b8015150361047d57565b9181601f8401121561047d578235916001600160401b03831161047d576020808501948460051b01011161047d57565b3461047d5760e036600319011261047d576004356001600160401b03811161047d57610f58903690600401610597565b90602435610f6581610482565b60443592610f7284610482565b606435610f7e81610eee565b60843590610f8b82610482565b60a435956001600160401b03871161047d57610fae61000e973690600401610ef8565b95909460c435976128a9565b6040519061035260c0836102f6565b6040519061035260e0836102f6565b60405190610352610100836102f6565b6001600160401b0381116102bb57601f01601f191660200190565b92919261100f82610fe8565b9161101d60405193846102f6565b82948184528183011161047d578281602093846000960137010152565b608060031982011261047d57600435906001600160401b03821161047d578060238301121561047d5781602461107593600401359101611003565b9060243561108281610482565b9060443561108f81610482565b9060643590565b3461047d576110a43661103a565b926110b092919261437a565b6110c46001600160a01b0383161515612e6e565b6000848152600860205260409020815190916001600160401b0382116102bb576110f8826110f28554610245565b856120a2565b602090601f831160011461114e57936111389361112a8461000e999561113e95600299600092611143575b50506120e7565b90555b600161113884610225565b016121d3565b610225565b015190503880611123565b601f198316919061115e8561027f565b9260005b8181106111ac57508461113e9460029894611138989461000e9c9860019510611193575b505050811b01905561112d565b015160001960f88460031b161c19169055388080611186565b92936020600181928786015181550195019301611162565b61012036600319011261047d576004356111dd81610482565b602435906111ea82610482565b6064359160843591906044356001600160401b03841161047d57610c4e94611219611239953690600401610ef8565b9060a4359261122784610482565b60c4359460e4359661010435986131f8565b6040519081529081906020820190565b600091031261047d57565b3461047d57600036600319011261047d5761126d61437a565b600080546001600160a01b0319811682556001600160a01b0316600080516020615eba8339815191528280a3005b3461047d57600036600319011261047d57602060405166038d7ea4c680008152f35b62ffffff81160361047d57565b60e43590610352826112bd565b6001600160401b0381116102bb5760051b60200190565b9291906112fa816112d7565b9361130860405195866102f6565b602085838152019160051b810192831161047d57905b82821061132a57505050565b60208091833561133981610482565b81520191019061131e565b9080601f8301121561047d578160206107d7933591016112ee565b61016036600319011261047d5760043561137881610482565b60243561138481610482565b604435916064359160843561139881610482565b60a4356113a481610482565b60c4356113af6112ca565b916101043561012435979094906001600160401b03891161047d57610c4e996113df6112399a3690600401611344565b9761014435996137b2565b3461047d57602036600319011261047d5760043561140781610482565b61140f61437a565b61141761437a565b6001600160a01b0381161561142f5761000e90615a23565b631e4fbdf760e01b600052600060045260246000fd5b3461047d57602036600319011261047d5760043561146281610482565b60018060a01b03166000526004602052602060ff604060002054166040519015158152f35b3461047d57600036600319011261047d576000546040516001600160a01b039091168152602090f35b3461047d57602036600319011261047d576114cc600435613d88565b60408051928352602083019190915290f35b3461047d57602036600319011261047d576004356114fb81610482565b61150361437a565b6001600160a01b0316801561152857600780546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a59081cdd185ada5b99c818dbdb9d1c9858dd60421b6044820152606490fd5b3461047d57602036600319011261047d5761159a60043561158881610eee565b61159061437a565b15156005546121f2565b600555005b3461047d57604036600319011261047d576004356001600160401b03811161047d576115d261000e913690600401610597565b602435916115de61437a565b613f3f565b6107d7906020815261010060e061165f61164961160c87518560208801526101208701906103ec565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a08801526106e0565b60a0870151858203601f190160c08701526103ec565b60c086015115158483015294015162ffffff16910152565b3461047d5760a036600319011261047d5760043561169481610482565b6116c9602435916116a483610482565b604435926064359384916116b783610eee565b608435936116c3614044565b50614c54565b906116d6825115156124eb565b600090801561177f57815b90825b845181101561176557811561172d578260606117008388612577565b51015111611713575b6001905b016116e4565b9250905060606117238385612577565b5101519082611709565b82604061173a8388612577565b5101511061174b575b60019061170d565b92509050604061175b8385612577565b5101519082611743565b610c4e6117728587612577565b51604051918291826115e3565b6000196116e1565b3461047d576117953661103a565b929161179f61437a565b6001600160a01b0316926117b4841515612e6e565b604051926117c1846102c0565b835260208301938452604083019160018060a01b0316825260005260086020526040600020915192835160018060401b0381116102bb5761180c816118068654610245565b866120a2565b6020601f8211600114611857576118476118509361183e84600297956118419561000e9b6000926111435750506120e7565b87555b516103bd565b600186016121d3565b91016121d3565b601f198216956118668661027f565b9660005b8181106118b657509360018461000e99611841956118479560029a986118509a1061189d575b505050811b018755611841565b015160001960f88460031b161c19169055388080611890565b8383015189556001909801976020938401930161186a565b3461047d57602036600319011261047d576004356001600160401b03811161047d576118fe903690600401610ef8565b61190661437a565b611911811515614095565b600090608061192082856140d6565b01359282915b80831061195e575050508061193757005b7f12ee4d3ca844fd5718529d46d685ee6b4112a6e0193c4a15b1564877c182d522600080a3005b90919261198461197d61056160406119778887896140f1565b01613149565b5460ff1690565b8015611a54575b611a4b576119e86001916119c06119af60806119a889888a6140f1565b0135610215565b6119ba8887896140f1565b90614207565b6119e36119d661056160406119778a898b6140f1565b805460ff19166001179055565b61436b565b936119fd6119f78285876140f1565b80614113565b611a26611a10604061197786898b6140f1565b916080611a1e86898b6140f1565b013593612e59565b90848060a01b031690600080516020615e9a833981519152600080a45b019190611926565b92600190611a43565b506001600160a01b03611a6d60406119778786886140f1565b161561198b565b3461047d57600036600319011261047d576005546040516001600160a01b039091168152602090f35b3461047d57600036600319011261047d57602060ff60055460a01c166040519015158152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b838310611af657505050505090565b9091929394602080600192603f19858203018652611b8089519160c080611b76611b3c611b2c875160e0875260e08701906103ec565b888801518682038a8801526103ec565b898060a01b03604088015116604086015260ff60608801511660608601526080870151608086015260a087015185820360a08701526103ec565b9401511515910152565b97019301930191939290611ae7565b3461047d57602036600319011261047d57600435600052600160205260406000208054611bbb816112d7565b91611bc960405193846102f6565b818352602083019060005260206000206000915b838310611bf25760405180610c4e8782611ac3565b60066020600192604051611c05816102a0565b611c0e86610319565b8152611c1b858701610319565b83820152611c4b611c416002880154878060a01b038116604085015260ff9060a01c1690565b60ff166060830152565b60038601546080820152611c6160048701610319565b60a0820152611c80611c77600588015460ff1690565b151560c0830152565b815201920192019190611bdd565b3461047d57606036600319011261047d57611ce76020600435611cb081610482565b60243590611cbd82610482565b60443591611cc961437a565b600060405180968195829463a9059cbb60e01b845260048401613153565b03926001600160a01b03165af18015611d2857611d0057005b61000e9060203d602011611d21575b611d1981836102f6565b810190613080565b503d611d0f565b6130b7565b3461047d57600036600319011261047d576007546040516001600160a01b039091168152602090f35b3461047d57602036600319011261047d57600435611d7261437a565b60648111611d7f57600655005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b3461047d57602036600319011261047d5760043561140f81610482565b634e487b7160e01b600052603260045260246000fd5b8054821015611e0a576000526005602060002091020190600090565b611dd8565b9491969592611e2960a0959260c0885260c08801906103ec565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b3461047d57604036600319011261047d57600435602435906000526003602052604060002090815481101561047d57611e9091611dee565b50611e9a81610319565b60018201546002830154600390930154604051938493610c4e936001600160a01b039384169360a884901c60ff9081169460a081901c90911693908216929091169087611e0f565b8054821015611e0a576000526006602060002091020190600090565b9591611f5894611f3060ff92611f2260c099959c9b9c60e08c5260e08c01906103ec565b908a820360208c01526103ec565b6001600160a01b039095166040890152166060870152608086015284820360a08601526103ec565b931515910152565b3461047d57604036600319011261047d57600435602435906000526001602052604060002090815481101561047d57611f9891611ee2565b50611fa281610319565b90610c4e611fb260018301610319565b91600281015490600381015460ff6005611fce60048501610319565b930154169260405196879660ff8360a01c169260018060a01b03169188611efe565b15611ff757565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b60001981019190821161205357565b61202e565b6127100390612710821161205357565b9190820391821161205357565b634e487b7160e01b600052600060045260246000fd5b818110612096575050565b6000815560010161208b565b9190601f81116120b157505050565b610352926000526020600020906020601f840160051c830193106120dd575b601f0160051c019061208b565b90915081906120d0565b8160011b916000199060031b1c19161790565b9190918281146121ce5761210e8354610245565b6001600160401b0381116102bb576121308161212a8454610245565b846120a2565b600093601f82116001146121635761215492939482916000926121585750506120e7565b9055565b015490503880611123565b612171601f1983169161027f565b9461217b8461027f565b91815b8181106121b65750958360019596971061219d575b505050811b019055565b015460001960f88460031b161c19169055388080612193565b9192600180602092868b01548155019401920161217e565b509050565b80546001600160a01b0319166001600160a01b03909216919091179055565b60ff60a01b191660a09190911b60ff60a01b161790565b9060ff612154911682546121f2565b9060ff801983541691151516179055565b906122aa57818103612239575050565b600560ff818461224c61035296866120fa565b61225c60018201600187016120fa565b61228660028601846002840161227b60018060a01b03825416846121d3565b5460a01c1690612209565b600381015460038601556122a060048201600487016120fa565b0154169101612218565b612075565b634e487b7160e01b600052603160045260246000fd5b9060038202918083046003149015171561205357565b8181029291811591840414171561205357565b6122f88154610245565b9081612302575050565b81601f60009311600114612314575055565b8183526020832061233091601f0160051c81019060010161208b565b808252602082209081548360011b9084198560031b1c191617905555565b805480156123a05760001901906123658282611ee2565b6122aa576005816123776000936122ee565b612383600182016122ee565b82600282015582600382015561239b600482016122ee565b015555565b6122af565b612493956123e561249b989994612411966123dc60ff959d96999d6123c861437a565b6040519a6123d58c6102a0565b3691611003565b89523691611003565b60208701526001600160a01b039099166040860190815298166060850152608084019687523691611003565b60a0820152600160c082015284516001600160a01b03166000908152600260205260409020546124489060ff16156143a3565b1590565b8451612468906001600160a01b0390612460906103bd565b1615156143e6565b61247b816124768651610215565b61442a565b61248b6119d661056187516103bd565b5193516103bd565b91519261456c565b6001600160a01b0390911690600080516020615e9a833981519152600080a4565b6001600160a01b039091169052565b604051906124d8826102c0565b6060604083828152600060208201520152565b156124f257565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b906001820180921161205357565b9190820180921161205357565b805115611e0a5760200190565b805160011015611e0a5760400190565b805160021015611e0a5760600190565b8051821015611e0a5760209160051b010190565b6040516080919061259c83826102f6565b6003815291601f1901366020840137565b6125b760026112d7565b906125c560405192836102f6565b6002825281601f196125d760026112d7565b019060005b8281106125e857505050565b6020906040516125f7816102db565b600081526000838201526060604082015260608082015260006080820152600060a0820152828285010152016125dc565b6040516060919061263983826102f6565b6002815291601f19018260005b82811061265257505050565b806060602080938501015201612646565b516001600160a01b031690565b6040518154808252909291839061268a602083019161027f565b926000905b8060098301106127ee576103529454918181106127d8575b8181106127be575b8181106127a4575b81811061278a575b818110612770575b818110612756575b81811061273c575b818110612722575b818110612708575b106126f5575b5003836102f6565b60d81c62ffffff168152602001386126ed565b60c083901c62ffffff1684529260019060200193016126e7565b60a883901c62ffffff1684529260019060200193016126df565b609083901c62ffffff1684529260019060200193016126d7565b607883901c62ffffff1684529260019060200193016126cf565b606083901c62ffffff1684529260019060200193016126c7565b604883901c62ffffff1684529260019060200193016126bf565b603083901c62ffffff1684529260019060200193016126b7565b601883901c62ffffff1684529260019060200193016126af565b62ffffff831684529260019060200193016126a7565b91600a91935061014060019161289b87546128128362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b01940192018592939161268f565b9391969596949290946128ba61437a565b6001600160a01b0381169789908790879086906128d88d15156129ad565b6129629b61294261295d9a61292a6129589a6129126129016129539b6129499961298957610235565b9861290a610fc9565b9a3691611003565b89526129218b60208b016124bc565b604089016124bc565b600160608801528a1515608088015260a087016124bc565b3691612a7c565b60c0830152612ce9565b610684565b612218565b612e59565b7fa996cb2fb76f06529d6a56403f6ae3a1669ece05b5e092b2960759b229f520d1600080a4565b61299d6001600160a01b03871615156129f2565b6129a8881515612a37565b610235565b156129b457565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420726f75746572206164647265737360501b6044820152606490fd5b156129f957565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642071756f746572206164647265737360501b6044820152606490fd5b15612a3e57565b60405162461bcd60e51b81526020600482015260166024820152754d7573742070726f766964652066656520746965727360501b6044820152606490fd5b929190612a88816112d7565b93612a9660405195866102f6565b602085838152019160051b810192831161047d57905b828210612ab857505050565b602080918335612ac7816112bd565b815201910190612aac565b81519192916001600160401b0381116102bb57612af38161212a8454610245565b6020601f8211600114612b165781906121549394956000926111435750506120e7565b601f19821690612b258461027f565b9160005b818110612b6057509583600195969710612b4757505050811b019055565b015160001960f88460031b161c19169055388080612193565b9192602060018192868b015181550194019201612b29565b9061215490151582546121f2565b90600160401b81116102bb578154818355808210612ba357505050565b61035292600052600a60096020600020926003838084880104860196060280612bd1575b500104019061208b565b6000198601908154906000199060200360031b1c16905538612bc7565b62ffffff9160031b1c1690565b9062ffffff809160031b9316831b921b19161790565b815190916001600160401b0382116102bb576020612c3a91612c338486612b86565b019261027f565b600a82049160005b838110612ca55750600a8302900380612c5c575b50505050565b9260009360005b818110612c7857505050015538808080612c56565b9091946020612c9b600192612c90895162ffffff1690565b908560030290612bfb565b9601929101612c63565b6000805b600a8110612cbe575083820155600101612c42565b95906020612ce0600192612cd5855162ffffff1690565b908a60030290612bfb565b92019601612ca9565b8054919291600160401b8110156102bb57612d0991600182018155611dee565b6122aa57825180519093906001600160401b0381116102bb57612d30816110f28554610245565b6020601f8211600114612de95791612d5b8260c09360049561035298996000926111435750506120e7565b84555b612d6e61184760208301516103bd565b612dc760028501612d8b612d8560408501516103bd565b826121d3565b612da1612d9b6060850151151590565b82612b78565b608083015115155b90805460ff60a81b191691151560a81b60ff60a81b16919091179055565b612de0612dd760a08301516103bd565b600386016121d3565b01519101612c11565b601f19821695612df88561027f565b9660005b818110612e415750926103529697600495936001938360c09710612e28575b505050811b018455612d5e565b015160001960f88460031b161c19169055388080612e1b565b83830151895560019098019760209384019301612dfc565b81604051928392833781016000815203902090565b15612e7557565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b15612eaf57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b15612ef057565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b15612f3057565b60405162461bcd60e51b815260206004820152601660248201527515dc985c1c1959081b985d1a5d99481b9bdd081cd95d60521b6044820152606490fd5b15612f7557565b60405162461bcd60e51b815260206004820152601c60248201527b43616e6e6f742073776170206e617469766520746f206e617469766560201b6044820152606490fd5b15612fc057565b60405162461bcd60e51b81526020600482015260176024820152762ab739bab83837b93a32b21034b7383aba103a37b5b2b760491b6044820152606490fd5b1561300657565b60405162461bcd60e51b81526020600482015260186024820152772ab739bab83837b93a32b21037baba383aba103a37b5b2b760411b6044820152606490fd5b1561304d57565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b9081602091031261047d57516107d781610eee565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b9015611e0a5780359060be198136030182121561047d570190565b9190811015611e0a5760051b8101359060be198136030182121561047d570190565b1561310757565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b356107d781610482565b6001600160a01b039091168152602081019190915260400190565b6040519061317d6020836102f6565b60008252565b3d156131ae573d9061319482610fe8565b916131a260405193846102f6565b82523d6000602084013e565b606090565b156131ba57565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b91969861323a909895939196949861320e6151d7565b613219851515612ea8565b61322d6001600160a01b0387161515612ee9565b613235615205565b6153f1565b9761324f6001600160a01b038a161515612f29565b61325761522e565b6001600160a01b03831695861580613646575b6132749015612f6e565b61327c615257565b8661363f57899a5b6001600160a01b038916613638578a935b61329d615280565b881589613621575b6132ae90612fb9565b6001600160a01b038a1680159061360a575b6132c990612fff565b6132d16152a9565b8861360457349a5b6132e48c1515613046565b6132ec6152d2565b89806135a15750506132fc615324565b6001600160a01b038c163b1561047d57600460008d60405192838092630d0e30db60e41b8252349060018060a01b03165af18015611d285761358c575b505b61334361534d565b60009c61334e615434565b6000905b8882106135315750509089858d8f61339e6133886133a3926133836133a99b9a9961337b61539f565b821015613100565b613d88565b9c6001600160a01b0390961615989095906130c3565b613149565b92615739565b6133b16153c8565b6001600160a01b0386166134b957506001600160a01b0387163b1561047d57604051632e1a7d4d60e01b815260048101839052966000908890602490829084906001600160a01b03165af1938415611d2857600080516020615eda8339815191529761348c9561349e575b50613437600080808087895af1613431613183565b506131b3565b61349857506000935b6001600160a01b03811661349257506000945b604080516001600160a01b039687168152968616602088015286015260608501526000608085015290911660a0830152819060c0820190565b0390a190565b94613453565b93613440565b806134ad60006134b3936102f6565b80611249565b3861341c565b60405163a9059cbb60e01b815297506020908890816000816134df888a60048401613153565b03926001600160a01b03165af1938415611d2857600080516020615eda8339815191529761348c95613512575b50613437565b61352a9060203d602011611d2157611d1981836102f6565b503861350c565b909d6135848f91610a3a8f8f889061357c8f9760019861356d8f966109d490613558615376565b602061356586868c6130de565b0135906122db565b938a8060a01b031615956130de565b908d896154c9565b9e0190613352565b806134ad600061359b936102f6565b38613339565b6135d06020916000936135b26152fb565b6040519485809481936323b872dd60e01b8352303360048501613095565b03925af18015611d28576135e5575b5061333b565b6135fd9060203d602011611d2157611d1981836102f6565b50386135df565b8a6132d9565b506132c961361a61197d8c61066a565b90506132c0565b506132ae61363161197d8861066a565b90506132a5565b8893613295565b839a613284565b506001600160a01b0388161561326a565b1561365e57565b60405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b6044820152606490fd5b604051606091906136a383826102f6565b6002815291601f1901366020840137565b604051906136c36020836102f6565b6000808352366020840137565b60208183031261047d578051906001600160401b03821161047d57019080601f8301121561047d578151613703816112d7565b9261371160405194856102f6565b81845260208085019260051b82010192831161047d57602001905b8282106137395750505090565b815181526020918201910161372c565b919260809361376e92979695978452602084015260a0604084015260a08301906106e0565b6001600160a01b0390951660608201520152565b606090602081526015602082015274158c881cddd85c081d1bc81155120819985a5b1959605a1b60408201520190565b939891979495996137fe90979391976137d460018060a01b0389161515612ee9565b6137ed6137e86137e38661254a565b612663565b6103bd565b1580613d6d575b6132359015613657565b926138136001600160a01b0385161515612f29565b6001600160a01b0385161580613d5c575b61382e9015612f6e565b6001600160a01b038516613d555783905b6001600160a01b038916613d4e5784935b6001600160a01b038716801590613d37575b61386b90612fb9565b6001600160a01b038a16801590613d20575b61388690612fff565b6001600160a01b038716613d1a57349a5b6138a28c1515613046565b6001600160a01b038816613cb3576001600160a01b0387163b1561047d57604051630d0e30db60e41b8152600081600481346001600160a01b038d165af1918215611d28578e60209261391194613c9e575b505b60405163095ea7b360e01b8152938492839260048401613153565b038160006001600160a01b0389165af18015611d28578e948e938e938993613c81575b5061394161197d86610684565b15613b3057509161397e969161395996959493615e07565b995b6139648b613d88565b966001600160a01b038a16159290918c9086908890615739565b6001600160a01b038616613ab4575061399961197d88610684565b613a34575b509481600080516020615eda833981519152966139c96000808080899861348c9a5af1613431613183565b6001600160a01b038116613a2e57506000945b6001600160a01b038116613a2857506000955b604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b956139ef565b946139dc565b959092916001600160a01b0387163b1561047d57604051632e1a7d4d60e01b815260048101829052966000908890602490829084906001600160a01b03165af1938415611d2857600080516020615eda8339815191529761348c95613a9f575b50919650919261399e565b806134ad6000613aae936102f6565b38613a94565b60405163a9059cbb60e01b8152979294939150602090889081600081613ade878a60048401613153565b03926001600160a01b03165af1938415611d2857600080516020615eda8339815191529761348c95613b11575b506139c9565b613b299060203d602011611d2157611d1981836102f6565b5038613b0b565b959450613b426137e86137e38861254a565b158015613c6b575b613c3c575b6001600160a01b038a16613b75579161397e9691613b6f96959493615c41565b9961395b565b91949392916001600160a01b038d16613c2d5750506040516318cbafe560e01b81529460009486948594613bb0945092309260048701613749565b0381836001600160a01b038e165af160009181613c08575b50613bea5760405162461bcd60e51b815280613be660048201613782565b0390fd5b613c0181613bfb61397e9351612044565b90612577565b519961395b565b613c269192503d806000833e613c1e81836102f6565b8101906136d0565b9038613bc8565b9461397e9691613b6f96615c41565b9450613c46613692565b613c5886613c538361254a565b6124bc565b613c6582613c5383612557565b94613b4f565b50613c7b6137e86137e388612557565b15613b4a565b613c999060203d602011611d2157611d1981836102f6565b613934565b806134ad6000613cad936102f6565b386138f4565b6040516323b872dd60e01b815260208180613cd385303360048501613095565b038160006001600160a01b038e165af1918215611d28578e60209261391194613cfd575b506138f6565b613d1390843d8611611d2157611d1981836102f6565b5038613cf7565b8a613897565b50613886613d3061197d8c61066a565b905061387d565b5061386b613d4761197d8961066a565b9050613862565b8893613850565b849061383f565b506001600160a01b03881615613824565b50613235613d806137e86137e387612557565b1590506137f4565b90612710613d98600654846122db565b04808303928311612053579190565b90808214613e3d578054906001600160401b0382116102bb57613dd6613ddc91613dd18486612b86565b61027f565b9261027f565b91600a82049181549160005b848110613e20575050600a8302808203613e04575b5050505050565b60039060001992030260031b1b19169101553880808080613dfd565b600191820180546001600160f01b03909516878301559101613de8565b5050565b906122aa57818103613e51575050565b60048083613e6261035295856120fa565b613e7b60018060a01b03600183015416600186016121d3565b613ebc60028501612da960028401613e9c60018060a01b03825416846121d3565b613eb060ff825460a01c16151584546121f2565b83555460a81c60ff1690565b613ecc612dd760038301546103bd565b019101613da7565b805480156123a0576000190190613eeb8282611dee565b6122aa5780613efb6004926122ee565b6000600182015560006002820155600060038201550180546000825580613f2157505055565b613f3c91600052600a6009602060002092010481019061208b565b55565b9190613f4c368285611003565b6020815191012092613f5d83610235565b9360005b85548082101561400f5782613f7f613f79848a611dee565b50610319565b6020815191012014613f945750600101613f61565b61295d925061295387613fe384613fdd613fd5613fcf613fc96001613fe89e9f6105669b613fc191611dee565b5001546103bd565b97612044565b85611dee565b509184611dee565b90613e41565b613ed4565b7f920794705994e7d9e02cbb96f6a4492a1b379bc6c7aefb7a8ebc2f3fcc84fc72600080a3565b60405162461bcd60e51b815260206004820152600d60248201526c111156081b9bdd08199bdd5b99609a1b6044820152606490fd5b6040519061010082016001600160401b038111838210176102bb57604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b1561409c57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81d1bdad95b9cc81c1c9bdd9a59195960721b6044820152606490fd5b9015611e0a5780359060de198136030182121561047d570190565b9190811015611e0a5760051b8101359060de198136030182121561047d570190565b903590601e198136030182121561047d57018035906001600160401b03821161047d5760200191813603831361047d57565b9092916001600160401b0381116102bb576141648161212a8454610245565b6000601f82116001146141925781906121549394956000926141875750506120e7565b013590503880611123565b601f198216946141a18461027f565b91805b8781106141db5750836001959697106141c157505050811b019055565b0135600019600384901b60f8161c19169055388080612193565b909260206001819286860135815501940191016141a4565b356107d7816105c4565b356107d781610eee565b8054919291600160401b8110156102bb5761422791600182018155611ee2565b6122aa576142358380614113565b9093906001600160401b0381116102bb57614254816110f28554610245565b6000601f82116001146142f857600592614282836142f19460c094610352999a6000926141875750506120e7565b85555b61429f6142956020830183614113565b9060018801614145565b6142c7600286016142b5612d8560408501613149565b6142c1606084016141f3565b90612209565b608081013560038601556142eb6142e160a0830183614113565b9060048801614145565b016141fd565b9101612218565b601f198216906143078561027f565b91815b81811061435357508360c0936103529899600597946142f19760019510614339575b505050811b018555614285565b0135600019600384901b60f8161c1916905538808061432c565b9192602060018192868c01358155019401920161430a565b60001981146120535760010190565b6000546001600160a01b0316330361438e57565b63118cdaa760e01b6000523360045260246000fd5b156143aa57565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b156143ed57565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606490fd5b8054919291600160401b8110156102bb5761444a91600182018155611ee2565b6122aa57825180519093906001600160401b0381116102bb57614471816110f28554610245565b6020601f82116001146144f95760059261449f836142f19460c094610352999a6000926111435750506120e7565b85555b6144b3602082015160018701612ad2565b6144d7600286016144ca612d8560408501516103bd565b606083015160ff166142c1565b608081015160038601556144f260a082015160048701612ad2565b0151151590565b601f198216956145088561027f565b9660005b818110614554575083610352979860c094600597946142f1976001951061453b575b505050811b0185556144a2565b015160001960f88460031b161c1916905538808061452e565b8383015189556001909801976020938401930161450c565b614584906020604051928284809451938492016103c9565b810103902090565b90614596826112d7565b6145a360405191826102f6565b82815280926145b4601f19916112d7565b019060005b8281106145c557505050565b6020906145d0614044565b828285010152016145b9565b6040906107d79392815281602082015201906106e0565b9190918054831015611e0a576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b9081602091031261047d575190565b606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b93929091936146b06146ab6146a584610235565b546122c5565b61458c565b9160009384925b6146c083610235565b54841015614c49576146ee61244460026146e2876146dd88610235565b611dee565b50015460a01c60ff1690565b614c3f576147106002614704866146dd87610235565b50015460a81c60ff1690565b1561492a5761472a6137e86003613fc1876146dd88610235565b6001600160a01b03169660005b896004614747886146dd89610235565b50015482101561491957600080916147a16147af6147806147798760046147728f8f6146dd90610235565b50016145f3565b9054612bee565b92604051928391602083019563f7729d4360e01b87528c8c60248601614615565b03601f1981018352826102f6565b51908c5afa6147bc613183565b906147cb575b50600101614737565b8098919851810160200190602001906147e39161464b565b866147ed87610235565b906147f791611dee565b5090858c896148058a610235565b9061480f91611dee565b506001015461481d906103bd565b926148266136b4565b918d8c6148328d610235565b9061483c91611dee565b506004019061484a916145f3565b90549061485691612bee565b89604051958692602084019261486b9361465a565b03601f198101855261487d90856102f6565b8d8c6148888d610235565b9061489291611dee565b50600401906148a0916145f3565b9054906148ac91612bee565b946148b5610fd8565b966148bf90610319565b87526148ce90602088016124bc565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e08201526148fd8289612577565b526149088188612577565b506149129061436b565b96386147c2565b50509360019197505b0192956146b7565b9592614935836153f1565b61493d613692565b886149478261254a565b90614951916124bc565b8361495b82612557565b90614965916124bc565b61496d61258b565b91896149788461254a565b90614982916124bc565b61498b83612557565b90614995916124bc565b8361499f83612567565b906149a9916124bc565b6149b161258b565b91896149bc8461254a565b906149c6916124bc565b6149cf86610225565b600201546001600160a01b03166149e584612557565b906149ef916124bc565b846149f984612567565b90614a03916124bc565b83614a0d87610235565b90614a1791611dee565b5060010154614a25906103bd565b614a2e906103bd565b614a37906103bd565b918b8360405180809363d06ca61f60e01b8252856004830191614a59926145dc565b03815a93600094fa60009181614c24575b50614bf2575050614a936000828d604051938492839263d06ca61f60e01b8452600484016145dc565b0381865afa60009181614bd7575b50614ba5575050600082614acc928c60405180958194829363d06ca61f60e01b8452600484016145dc565b03915afa60009181614b8a575b50614ae9575b5050600190614922565b9684614b82928499614b3c614b1e614b186001613fc18a6146dd614b11849d6146dd8c610235565b5099610235565b92612567565b5191614b31614b2b610fd8565b95610319565b8552602085016124bc565b8c604084015260608301526080820152614b5461316e565b60a0820152600060c0820152600060e0820152614b718289612577565b52614b7c8188612577565b5061436b565b959038614adf565b614b9e91923d8091833e613c1e81836102f6565b9038614ad9565b614bd1935084999250908691614b3c614b1e614b186001613fc18a6146dd614b11849d6146dd8c610235565b95614922565b614beb91923d8091833e613c1e81836102f6565b9038614aa1565b614bd19450859a9350879250614b3c614b1e614c1e6001613fc18a6146dd614b11849d6146dd8c610235565b92612557565b614c3891923d8091833e613c1e81836102f6565b9038614a6a565b9592600190614922565b505050918152925050565b929394909194614c696146ab6146a583610235565b9260009485935b614c7984610235565b548510156151ca57614c9661244460026146e2886146dd89610235565b6151be57614cac6002614704876146dd88610235565b15614eb05796614cc76137e86003613fc1886146dd89610235565b6001600160a01b03169760005b8a6004614ce4896146dd8a610235565b500154821015614e9c57600080916147a1614d31614d106147798760048f8f906146dd61477292610235565b92604051928391602083019563f7729d4360e01b87528d8d60248601614615565b51908d5afa614d3e613183565b90614d4d575b50600101614cd4565b809991995181016020019060200190614d659161464b565b8b868b8a614d728b610235565b90614d7c91611dee565b50938b614d888c610235565b90614d9291611dee565b5060010154614da0906103bd565b93614da96136b4565b928d8d8282614db783610235565b90614dc191611dee565b5060040190614dcf916145f3565b905490614ddb91612bee565b8d6040519889926020840192614df09361465a565b03601f1981018852614e0290886102f6565b614e0b90610235565b90614e1591611dee565b5060040190614e23916145f3565b905490614e2f91612bee565b94614e38610fd8565b96614e4290610319565b8752614e5190602088016124bc565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e0820152614e80828a612577565b52614e8b8189612577565b50614e959061436b565b9738614d44565b5050946001919298505b0193969096614c70565b93614ebd849892986153f1565b614ec5613692565b9089614ed08361254a565b90614eda916124bc565b84614ee483612557565b90614eee916124bc565b614ef661258b565b908a614f018361254a565b90614f0b916124bc565b614f1482612557565b90614f1e916124bc565b84614f2882612567565b90614f32916124bc565b838b614f3c61258b565b928c614f478561254a565b90614f51916124bc565b614f5a89610225565b600201546001600160a01b0316614f7085612557565b90614f7a916124bc565b87614f8485612567565b90614f8e916124bc565b85614f988a610235565b90614fa291611dee565b5060010154614fb0906103bd565b614fb9906103bd565b614fc2906103bd565b60405163d06ca61f60e01b8152909590868180614fe38588600484016145dc565b03815a93600094fa600091816151a3575b5061516757505060405163d06ca61f60e01b81526000818061501a8587600484016145dc565b0381895afa6000918161514c575b5061510857505082615054939460009260405180968194829363d06ca61f60e01b8452600484016145dc565b03915afa600092816150ed575b50615072575b505050600190614ea6565b61507d575b83615067565b97856150e592849a6150a5614b1e614b186001613fc18a6146dd614b11849d6146dd8c610235565b8d6040840152606083015260808201526150bd61316e565b60a0820152600060c0820152600060e08201526150da828a612577565b52614b7c8189612577565b969038615077565b61510191933d8091833e613c1e81836102f6565b9138615061565b935093505061511c575b5050600190614ea6565b978561514492849a6150a5614b1e614b186001613fc18a6146dd614b11849d6146dd8c610235565b969038615112565b61516091923d8091833e613c1e81836102f6565b9038615028565b94509450505061517b575050600190614ea6565b978561514492849a6150a5614b1e614c1e6001613fc18a6146dd614b11849d6146dd8c610235565b6151b791923d8091833e613c1e81836102f6565b9038614ff4565b93600190979197614ea6565b9750505050509150815290565b61035260405163f82c50f160e01b602082015260016024820152602481526152006044826102f6565b615e7e565b61035260405163f82c50f160e01b602082015260026024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260036024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260046024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260056024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260066024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260076024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260096024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260086024820152602481526152006044826102f6565b61035260405163f82c50f160e01b6020820152600a6024820152602481526152006044826102f6565b61035260405163f82c50f160e01b6020820152600c6024820152602481526152006044826102f6565b61035260405163f82c50f160e01b6020820152600d6024820152602481526152006044826102f6565b61035260405163f82c50f160e01b6020820152600e6024820152602481526152006044826102f6565b6000818152600860205260409020600101546001600160a01b03166154165750600090565b6000908152600860205260409020600101546001600160a01b031690565b610352604051637b3338ad60e11b6020820152600b602482015260006044820152604481526152006064826102f6565b903590601e198136030182121561047d57018035906001600160401b03821161047d57602001918160051b3603831361047d57565b9060809261376e919695949683526000602084015260a0604084015260a08301906106e0565b356107d7816112bd565b929190946154dc6020836138f686613149565b038160006001600160a01b038a165af18015611d285761571c575b50615504608084016141fd565b1561552957506107d79461552360a061551c85613149565b94016154bf565b93615d0d565b9092901561566f5791816000949361555261554b604061559b99960184615464565b36916112ee565b938451158015615653575b801561562e575b6155f5575b505061557b6137e86137e88793613149565b92604051968795869485936318cbafe560e01b8552309160048601615499565b03925af1600091816155d8575b506155c65760405162461bcd60e51b815280613be660048201613782565b80613bfb6155d49251612044565b5190565b6155ee9192503d806000833e613c1e81836102f6565b90386155a8565b869294506137e861557b926156256137e89361561c615612613692565b93613c538561254a565b613c5383612557565b95935050615569565b5060018060a01b0361564c6137e36156468851612044565b88612577565b1615615564565b506001600160a01b036156686137e38761254a565b161561555d565b9092916107d79461568661554b6040870187615464565b948551158015615700575b80156156db575b6156ac575b6156a690613149565b92615b4a565b94506156a66156b9613692565b6156c685613c538361254a565b6156d383613c5383612557565b95905061569d565b5060018060a01b036156f96137e36156f38951612044565b89612577565b1615615698565b506001600160a01b036157156137e38861254a565b1615615691565b6157349060203d602011611d2157611d1981836102f6565b6154f7565b9493929195600554906157508260ff9060a01c1690565b80615a01575b156159a15750506001600160a01b03868116949082168581146158e3575085106158a35761579c90615793615789613692565b97613c538961254a565b613c5387612557565b47936020604051809563095ea7b360e01b8252816000816157c1878960048401613153565b03925af18015611d28576157f9966000958692615886575b506040516318cbafe560e01b815297889586948593309160048601615499565b03926001600160a01b03165af1918215611d285761581d9261586d575b5047612068565b80615826575b50565b6158346137e86007546103bd565b803b1561047d576000906004604051809481936306f4a2cd60e41b83525af18015611d28571561582357806134ad6000610352936102f6565b615881903d806000833e613c1e81836102f6565b615816565b61589e9060203d602011611d2157611d1981836102f6565b6157d9565b5050506158ba925090602091611cc96005546103bd565b03925af18015611d28576158cb5750565b6158239060203d602011611d2157611d1981836102f6565b9596505066038d7ea4c680008610935061598f9250505057803b1561047d57604051632e1a7d4d60e01b815260048101839052906000908290602490829084905af18015611d285761597a575b5061593f6137e86007546103bd565b803b1561047d576000906004604051809481936306f4a2cd60e41b83525af18015611d285761596b5750565b806134ad6000610352936102f6565b806134ad6000615989936102f6565b38615930565b6158ba91602091611cc96005546103bd565b9350935050509291926000146159d75750506000808080610352946159cd6137e86137e86005546103bd565b5af1613431613183565b91602091611cc96159e7946103bd565b03926001600160a01b03165af18015611d28576158cb5750565b506007546001600160a01b0390615a1b906137e8906103bd565b161515615756565b600080546001600160a01b039283166001600160a01b0319821681178355921690600080516020615eba8339815191529080a3565b15615a5f57565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b15615aa157565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b15615af957565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b615bd395615bb2600096959493615b898894615b6a600286511015615a58565b615b766137e38661254a565b6001600160a01b03908116911614615a9a565b615b9f6137e3615b998551612044565b85612577565b6001600160a01b03908116911614615af2565b6040516338ed173960e01b8152968795869485933091869060048701613749565b03926001600160a01b03165af160009181615c24575b506155c65760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b615c3a9192503d806000833e613c1e81836102f6565b9038615be9565b92615c826000969793959492615c6c8894615c60600288511015615a58565b615b766137e38861254a565b615b9f6137e3615c7c8751612044565b87612577565b615bd3604051978896879586946338ed173960e01b8652309260048701613749565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b9091600095615d46602096615d3a615d859796615d32615d2b610fd8565b97886124bc565b8987016124bc565b62ffffff166040850152565b615d5330606085016124bc565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b835260048301615ca4565b03926001600160a01b03165af160009181615dd6575b506107d75760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b615df991925060203d602011615e00575b615df181836102f6565b81019061464b565b9038615d9b565b503d615de7565b91600096615e40602097615e34615d85989795615e2c615e25610fd8565b98896124bc565b8a88016124bc565b62ffffff166040860152565b615e4d30606086016124bc565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b835260048301615ca4565b600080916020815191016a636f6e736f6c652e6c6f675afa5056fe021066d9f43780503f155e50fc23c3d3ac8ba8edd3fbc3aee45c67ddb5f707888be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0b37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da26469706673582212209569b3b0d106d7ccd596b9855f06742e9ce8c77fd4ea217ce1ce98b1f0b7e17264736f6c634300081c0033
Deployed Bytecode
0x60806040526004361015610010575b005b60003560e01c806303a56b321461021057806313baf1e61461020b5780632182e46714610206578063240028e8146102015780632688807c146101fc5780634c984d38146101f757806359e63b23146101f25780635bc4e0ec146101ed5780635f524ea3146101e85780636c96b2bf146101e3578063715018a6146101de57806381ee0715146101d957806384b06bc0146101d4578063880cdc31146101cf5780638cf106e1146101ca5780638da5cb5b146101c557806399a5d747146101c05780639dd373b9146101bb5780639ed12c31146101b6578063a7d87c0e146101b1578063b0fa3694146101ac578063b24266cb146101a7578063b26baa5f146101a2578063b5d52d1a1461019d578063ba14713214610198578063cc21392e14610193578063cea9d26f1461018e578063ee99205c14610189578063f05c5fed14610184578063f2fde38b1461017f578063f71918771461017a5763fa972c660361000e57611f60565b611e58565b611dbb565b611d56565b611d2d565b611c8e565b611b8f565b611a9d565b611a74565b6118ce565b611787565b611677565b61159f565b611568565b6114de565b6114b0565b611487565b611445565b6113ea565b61135f565b61129b565b611254565b6111c4565b611096565b610f28565b610de0565b610c52565b610859565b61069e565b6105cf565b610493565b610411565b6000526001602052604060002090565b6000526008602052604060002090565b6000526003602052604060002090565b90600182811c92168015610275575b602083101461025f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610254565b600052602060002090565b634e487b7160e01b600052604160045260246000fd5b60e081019081106001600160401b038211176102bb57604052565b61028a565b606081019081106001600160401b038211176102bb57604052565b60c081019081106001600160401b038211176102bb57604052565b601f909101601f19168101906001600160401b038211908210176102bb57604052565b906040519182600082549261032d84610245565b808452936001811690811561039b5750600114610354575b50610352925003836102f6565b565b90506000929192526020600020906000915b81831061037f5750509060206103529282010138610345565b6020919350806001915483858901015201910190918492610366565b90506020925061035294915060ff191682840152151560051b82010138610345565b6001600160a01b031690565b60005b8381106103dc5750506000910152565b81810151838201526020016103cc565b90602091610405815180928185528580860191016103c9565b601f01601f1916010190565b3461047d57602036600319011261047d57600435600052600860205261046e604060002061043e81610319565b60018201546002909201546040516060808252909485946001600160a01b039081169493169290918501906103ec565b91602084015260408301520390f35b600080fd5b6001600160a01b0381160361047d57565b3461047d57604036600319011261047d576004356104b081610482565b602435906104bc61437a565b6001600160a01b0381166000818152600260205260409020546104e19060ff16611ff0565b6104ea83610215565b9160005b83548082101561000e57836105038387611ee2565b50600201546001600160a01b039061051a906103bd565b161461052957506001016104ee565b610570939461055c610566949361055661054e61054861056196612044565b85611ee2565b509184611ee2565b90612229565b61234e565b61066a565b805460ff19169055565b7fbe9bb4bdca0a094babd75e3a98b1d2e2390633430d0a2f6e2b9970e2ee03fb2e600080a3005b9181601f8401121561047d578235916001600160401b03831161047d576020838186019501011161047d57565b60ff81160361047d57565b3461047d5760c036600319011261047d576004356001600160401b03811161047d576105ff903690600401610597565b6024356001600160401b03811161047d5761061e903690600401610597565b60449391933561062d81610482565b6064359061063a826105c4565b60a4359560843593906001600160401b03881161047d5761066261000e983690600401610597565b9790966123a5565b6001600160a01b0316600090815260026020526040902090565b6001600160a01b0316600090815260046020526040902090565b3461047d57602036600319011261047d576004356106bb81610482565b60018060a01b03166000526002602052602060ff604060002054166040519015158152f35b906020808351928381520192019060005b8181106106fe5750505090565b82516001600160a01b03168452602093840193909201916001016106f1565b9080602083519182815201916020808360051b8301019401926000915b83831061074957505050505090565b9091929394602080610767600193601f1986820301875289516103ec565b9701930193019193929061073a565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b8282106107da57505050509260408460206107d795960151828401520151906060601f198285030191015261071d565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610838610826604087015160c0604088015260c08701906106e0565b606087015186820360608801526103ec565b946080810151151560808601520151169101529701920192019092916107a7565b3461047d57608036600319011261047d5760043561087681610482565b6108a36024359161088683610482565b604435809361089460643590565b9261089d6124cb565b50614691565b6108af815115156124eb565b60005b6108bc8251612044565b811015610952576108cc8161252f565b8251811015610949578060606108e460019386612577565b51015160606108f38587612577565b51015110610902575b016108cc565b61090c8385612577565b516109178286612577565b516109228587612577565b5261092d8486612577565b506109388286612577565b526109438185612577565b506108fc565b506001016108b2565b5060009061095e6124cb565b906000905b8051821015610c40576109758261252f565b8151811015610c355761098661258b565b926109c46109938561254a565b526113886109a085612557565b52611d4c6109ad85612567565b5260005b8451811015610c2a576109e26109dc6109d46109cd8489612577565b518b6122db565b612710900490565b89612068565b50610a40610a0c6109d460606109f88689612577565b510151610a05858a612577565b51906122db565b610a3a6109d46060610a1e888a612577565b510151610a34610a2e878c612577565b51612058565b906122db565b9061253d565b878111610a51575b506001016109b1565b965086610a5c6125ad565b8752610a66612628565b60408801908152610a778487612577565b5160200151610a85906103bd565b610a8f8489612577565b51610a9a8689612577565b5160800151610aa9878a612577565b5160a00151610ab8888b612577565b5160c00151151591610aca898c612577565b5160e0015162ffffff1693610add610fba565b95610ae890876124bc565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610b148261254a565b52610b1e9061254a565b50610b298587612577565b51602001610b3690612663565b610b408489612577565b51610b4a90612058565b610b548789612577565b5160800151610b63888a612577565b5160a00151610b72898b612577565b5160c00151151591610b848a8c612577565b5160e0015162ffffff1693610b97610fba565b95610ba290876124bc565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610bce82612557565b52610bd890612557565b50610be38487612577565b5151815190610bf18261254a565b52610bfb9061254a565b50610c068587612577565b5151905190610c1482612557565b52610c1e90612557565b50602087015238610a48565b509250600101610975565b509060010190610963565b60405180610c4e8582610776565b0390f35b3461047d57602036600319011261047d57600435610c6f81610482565b610c7761437a565b6001600160a01b03168015610c9c57600580546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b906020808351928381520192019060005b818110610cf15750505090565b825162ffffff16845260209384019390920191600101610ce4565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610d3f57505050505090565b9091929394602080610dd1600193603f1986820301875289519060c0610d6e835160e0845260e08401906103ec565b92878060a01b03868201511686840152878060a01b036040820151166040840152606081015115156060840152610dae6080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c0818403910152610cd3565b97019301930191939290610d30565b3461047d57602036600319011261047d57600435600052600360205260406000208054610e0c816112d7565b91610e1a60405193846102f6565b818352602083019060005260206000206000915b838310610e435760405180610c4e8782610d0c565b60056020600192604051610e56816102a0565b610e5f86610319565b8152848060a01b03858701541683820152610eb6610ead6002880154610e90610e87826103bd565b604086016124bc565b610ea460a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b610ecf610ec660038801546103bd565b60a083016124bc565b610edb60048701612670565b60c0820152815201920192019190610e2e565b8015150361047d57565b9181601f8401121561047d578235916001600160401b03831161047d576020808501948460051b01011161047d57565b3461047d5760e036600319011261047d576004356001600160401b03811161047d57610f58903690600401610597565b90602435610f6581610482565b60443592610f7284610482565b606435610f7e81610eee565b60843590610f8b82610482565b60a435956001600160401b03871161047d57610fae61000e973690600401610ef8565b95909460c435976128a9565b6040519061035260c0836102f6565b6040519061035260e0836102f6565b60405190610352610100836102f6565b6001600160401b0381116102bb57601f01601f191660200190565b92919261100f82610fe8565b9161101d60405193846102f6565b82948184528183011161047d578281602093846000960137010152565b608060031982011261047d57600435906001600160401b03821161047d578060238301121561047d5781602461107593600401359101611003565b9060243561108281610482565b9060443561108f81610482565b9060643590565b3461047d576110a43661103a565b926110b092919261437a565b6110c46001600160a01b0383161515612e6e565b6000848152600860205260409020815190916001600160401b0382116102bb576110f8826110f28554610245565b856120a2565b602090601f831160011461114e57936111389361112a8461000e999561113e95600299600092611143575b50506120e7565b90555b600161113884610225565b016121d3565b610225565b015190503880611123565b601f198316919061115e8561027f565b9260005b8181106111ac57508461113e9460029894611138989461000e9c9860019510611193575b505050811b01905561112d565b015160001960f88460031b161c19169055388080611186565b92936020600181928786015181550195019301611162565b61012036600319011261047d576004356111dd81610482565b602435906111ea82610482565b6064359160843591906044356001600160401b03841161047d57610c4e94611219611239953690600401610ef8565b9060a4359261122784610482565b60c4359460e4359661010435986131f8565b6040519081529081906020820190565b600091031261047d57565b3461047d57600036600319011261047d5761126d61437a565b600080546001600160a01b0319811682556001600160a01b0316600080516020615eba8339815191528280a3005b3461047d57600036600319011261047d57602060405166038d7ea4c680008152f35b62ffffff81160361047d57565b60e43590610352826112bd565b6001600160401b0381116102bb5760051b60200190565b9291906112fa816112d7565b9361130860405195866102f6565b602085838152019160051b810192831161047d57905b82821061132a57505050565b60208091833561133981610482565b81520191019061131e565b9080601f8301121561047d578160206107d7933591016112ee565b61016036600319011261047d5760043561137881610482565b60243561138481610482565b604435916064359160843561139881610482565b60a4356113a481610482565b60c4356113af6112ca565b916101043561012435979094906001600160401b03891161047d57610c4e996113df6112399a3690600401611344565b9761014435996137b2565b3461047d57602036600319011261047d5760043561140781610482565b61140f61437a565b61141761437a565b6001600160a01b0381161561142f5761000e90615a23565b631e4fbdf760e01b600052600060045260246000fd5b3461047d57602036600319011261047d5760043561146281610482565b60018060a01b03166000526004602052602060ff604060002054166040519015158152f35b3461047d57600036600319011261047d576000546040516001600160a01b039091168152602090f35b3461047d57602036600319011261047d576114cc600435613d88565b60408051928352602083019190915290f35b3461047d57602036600319011261047d576004356114fb81610482565b61150361437a565b6001600160a01b0316801561152857600780546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a59081cdd185ada5b99c818dbdb9d1c9858dd60421b6044820152606490fd5b3461047d57602036600319011261047d5761159a60043561158881610eee565b61159061437a565b15156005546121f2565b600555005b3461047d57604036600319011261047d576004356001600160401b03811161047d576115d261000e913690600401610597565b602435916115de61437a565b613f3f565b6107d7906020815261010060e061165f61164961160c87518560208801526101208701906103ec565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a08801526106e0565b60a0870151858203601f190160c08701526103ec565b60c086015115158483015294015162ffffff16910152565b3461047d5760a036600319011261047d5760043561169481610482565b6116c9602435916116a483610482565b604435926064359384916116b783610eee565b608435936116c3614044565b50614c54565b906116d6825115156124eb565b600090801561177f57815b90825b845181101561176557811561172d578260606117008388612577565b51015111611713575b6001905b016116e4565b9250905060606117238385612577565b5101519082611709565b82604061173a8388612577565b5101511061174b575b60019061170d565b92509050604061175b8385612577565b5101519082611743565b610c4e6117728587612577565b51604051918291826115e3565b6000196116e1565b3461047d576117953661103a565b929161179f61437a565b6001600160a01b0316926117b4841515612e6e565b604051926117c1846102c0565b835260208301938452604083019160018060a01b0316825260005260086020526040600020915192835160018060401b0381116102bb5761180c816118068654610245565b866120a2565b6020601f8211600114611857576118476118509361183e84600297956118419561000e9b6000926111435750506120e7565b87555b516103bd565b600186016121d3565b91016121d3565b601f198216956118668661027f565b9660005b8181106118b657509360018461000e99611841956118479560029a986118509a1061189d575b505050811b018755611841565b015160001960f88460031b161c19169055388080611890565b8383015189556001909801976020938401930161186a565b3461047d57602036600319011261047d576004356001600160401b03811161047d576118fe903690600401610ef8565b61190661437a565b611911811515614095565b600090608061192082856140d6565b01359282915b80831061195e575050508061193757005b7f12ee4d3ca844fd5718529d46d685ee6b4112a6e0193c4a15b1564877c182d522600080a3005b90919261198461197d61056160406119778887896140f1565b01613149565b5460ff1690565b8015611a54575b611a4b576119e86001916119c06119af60806119a889888a6140f1565b0135610215565b6119ba8887896140f1565b90614207565b6119e36119d661056160406119778a898b6140f1565b805460ff19166001179055565b61436b565b936119fd6119f78285876140f1565b80614113565b611a26611a10604061197786898b6140f1565b916080611a1e86898b6140f1565b013593612e59565b90848060a01b031690600080516020615e9a833981519152600080a45b019190611926565b92600190611a43565b506001600160a01b03611a6d60406119778786886140f1565b161561198b565b3461047d57600036600319011261047d576005546040516001600160a01b039091168152602090f35b3461047d57600036600319011261047d57602060ff60055460a01c166040519015158152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b838310611af657505050505090565b9091929394602080600192603f19858203018652611b8089519160c080611b76611b3c611b2c875160e0875260e08701906103ec565b888801518682038a8801526103ec565b898060a01b03604088015116604086015260ff60608801511660608601526080870151608086015260a087015185820360a08701526103ec565b9401511515910152565b97019301930191939290611ae7565b3461047d57602036600319011261047d57600435600052600160205260406000208054611bbb816112d7565b91611bc960405193846102f6565b818352602083019060005260206000206000915b838310611bf25760405180610c4e8782611ac3565b60066020600192604051611c05816102a0565b611c0e86610319565b8152611c1b858701610319565b83820152611c4b611c416002880154878060a01b038116604085015260ff9060a01c1690565b60ff166060830152565b60038601546080820152611c6160048701610319565b60a0820152611c80611c77600588015460ff1690565b151560c0830152565b815201920192019190611bdd565b3461047d57606036600319011261047d57611ce76020600435611cb081610482565b60243590611cbd82610482565b60443591611cc961437a565b600060405180968195829463a9059cbb60e01b845260048401613153565b03926001600160a01b03165af18015611d2857611d0057005b61000e9060203d602011611d21575b611d1981836102f6565b810190613080565b503d611d0f565b6130b7565b3461047d57600036600319011261047d576007546040516001600160a01b039091168152602090f35b3461047d57602036600319011261047d57600435611d7261437a565b60648111611d7f57600655005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b3461047d57602036600319011261047d5760043561140f81610482565b634e487b7160e01b600052603260045260246000fd5b8054821015611e0a576000526005602060002091020190600090565b611dd8565b9491969592611e2960a0959260c0885260c08801906103ec565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b3461047d57604036600319011261047d57600435602435906000526003602052604060002090815481101561047d57611e9091611dee565b50611e9a81610319565b60018201546002830154600390930154604051938493610c4e936001600160a01b039384169360a884901c60ff9081169460a081901c90911693908216929091169087611e0f565b8054821015611e0a576000526006602060002091020190600090565b9591611f5894611f3060ff92611f2260c099959c9b9c60e08c5260e08c01906103ec565b908a820360208c01526103ec565b6001600160a01b039095166040890152166060870152608086015284820360a08601526103ec565b931515910152565b3461047d57604036600319011261047d57600435602435906000526001602052604060002090815481101561047d57611f9891611ee2565b50611fa281610319565b90610c4e611fb260018301610319565b91600281015490600381015460ff6005611fce60048501610319565b930154169260405196879660ff8360a01c169260018060a01b03169188611efe565b15611ff757565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b60001981019190821161205357565b61202e565b6127100390612710821161205357565b9190820391821161205357565b634e487b7160e01b600052600060045260246000fd5b818110612096575050565b6000815560010161208b565b9190601f81116120b157505050565b610352926000526020600020906020601f840160051c830193106120dd575b601f0160051c019061208b565b90915081906120d0565b8160011b916000199060031b1c19161790565b9190918281146121ce5761210e8354610245565b6001600160401b0381116102bb576121308161212a8454610245565b846120a2565b600093601f82116001146121635761215492939482916000926121585750506120e7565b9055565b015490503880611123565b612171601f1983169161027f565b9461217b8461027f565b91815b8181106121b65750958360019596971061219d575b505050811b019055565b015460001960f88460031b161c19169055388080612193565b9192600180602092868b01548155019401920161217e565b509050565b80546001600160a01b0319166001600160a01b03909216919091179055565b60ff60a01b191660a09190911b60ff60a01b161790565b9060ff612154911682546121f2565b9060ff801983541691151516179055565b906122aa57818103612239575050565b600560ff818461224c61035296866120fa565b61225c60018201600187016120fa565b61228660028601846002840161227b60018060a01b03825416846121d3565b5460a01c1690612209565b600381015460038601556122a060048201600487016120fa565b0154169101612218565b612075565b634e487b7160e01b600052603160045260246000fd5b9060038202918083046003149015171561205357565b8181029291811591840414171561205357565b6122f88154610245565b9081612302575050565b81601f60009311600114612314575055565b8183526020832061233091601f0160051c81019060010161208b565b808252602082209081548360011b9084198560031b1c191617905555565b805480156123a05760001901906123658282611ee2565b6122aa576005816123776000936122ee565b612383600182016122ee565b82600282015582600382015561239b600482016122ee565b015555565b6122af565b612493956123e561249b989994612411966123dc60ff959d96999d6123c861437a565b6040519a6123d58c6102a0565b3691611003565b89523691611003565b60208701526001600160a01b039099166040860190815298166060850152608084019687523691611003565b60a0820152600160c082015284516001600160a01b03166000908152600260205260409020546124489060ff16156143a3565b1590565b8451612468906001600160a01b0390612460906103bd565b1615156143e6565b61247b816124768651610215565b61442a565b61248b6119d661056187516103bd565b5193516103bd565b91519261456c565b6001600160a01b0390911690600080516020615e9a833981519152600080a4565b6001600160a01b039091169052565b604051906124d8826102c0565b6060604083828152600060208201520152565b156124f257565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b906001820180921161205357565b9190820180921161205357565b805115611e0a5760200190565b805160011015611e0a5760400190565b805160021015611e0a5760600190565b8051821015611e0a5760209160051b010190565b6040516080919061259c83826102f6565b6003815291601f1901366020840137565b6125b760026112d7565b906125c560405192836102f6565b6002825281601f196125d760026112d7565b019060005b8281106125e857505050565b6020906040516125f7816102db565b600081526000838201526060604082015260608082015260006080820152600060a0820152828285010152016125dc565b6040516060919061263983826102f6565b6002815291601f19018260005b82811061265257505050565b806060602080938501015201612646565b516001600160a01b031690565b6040518154808252909291839061268a602083019161027f565b926000905b8060098301106127ee576103529454918181106127d8575b8181106127be575b8181106127a4575b81811061278a575b818110612770575b818110612756575b81811061273c575b818110612722575b818110612708575b106126f5575b5003836102f6565b60d81c62ffffff168152602001386126ed565b60c083901c62ffffff1684529260019060200193016126e7565b60a883901c62ffffff1684529260019060200193016126df565b609083901c62ffffff1684529260019060200193016126d7565b607883901c62ffffff1684529260019060200193016126cf565b606083901c62ffffff1684529260019060200193016126c7565b604883901c62ffffff1684529260019060200193016126bf565b603083901c62ffffff1684529260019060200193016126b7565b601883901c62ffffff1684529260019060200193016126af565b62ffffff831684529260019060200193016126a7565b91600a91935061014060019161289b87546128128362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b01940192018592939161268f565b9391969596949290946128ba61437a565b6001600160a01b0381169789908790879086906128d88d15156129ad565b6129629b61294261295d9a61292a6129589a6129126129016129539b6129499961298957610235565b9861290a610fc9565b9a3691611003565b89526129218b60208b016124bc565b604089016124bc565b600160608801528a1515608088015260a087016124bc565b3691612a7c565b60c0830152612ce9565b610684565b612218565b612e59565b7fa996cb2fb76f06529d6a56403f6ae3a1669ece05b5e092b2960759b229f520d1600080a4565b61299d6001600160a01b03871615156129f2565b6129a8881515612a37565b610235565b156129b457565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420726f75746572206164647265737360501b6044820152606490fd5b156129f957565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642071756f746572206164647265737360501b6044820152606490fd5b15612a3e57565b60405162461bcd60e51b81526020600482015260166024820152754d7573742070726f766964652066656520746965727360501b6044820152606490fd5b929190612a88816112d7565b93612a9660405195866102f6565b602085838152019160051b810192831161047d57905b828210612ab857505050565b602080918335612ac7816112bd565b815201910190612aac565b81519192916001600160401b0381116102bb57612af38161212a8454610245565b6020601f8211600114612b165781906121549394956000926111435750506120e7565b601f19821690612b258461027f565b9160005b818110612b6057509583600195969710612b4757505050811b019055565b015160001960f88460031b161c19169055388080612193565b9192602060018192868b015181550194019201612b29565b9061215490151582546121f2565b90600160401b81116102bb578154818355808210612ba357505050565b61035292600052600a60096020600020926003838084880104860196060280612bd1575b500104019061208b565b6000198601908154906000199060200360031b1c16905538612bc7565b62ffffff9160031b1c1690565b9062ffffff809160031b9316831b921b19161790565b815190916001600160401b0382116102bb576020612c3a91612c338486612b86565b019261027f565b600a82049160005b838110612ca55750600a8302900380612c5c575b50505050565b9260009360005b818110612c7857505050015538808080612c56565b9091946020612c9b600192612c90895162ffffff1690565b908560030290612bfb565b9601929101612c63565b6000805b600a8110612cbe575083820155600101612c42565b95906020612ce0600192612cd5855162ffffff1690565b908a60030290612bfb565b92019601612ca9565b8054919291600160401b8110156102bb57612d0991600182018155611dee565b6122aa57825180519093906001600160401b0381116102bb57612d30816110f28554610245565b6020601f8211600114612de95791612d5b8260c09360049561035298996000926111435750506120e7565b84555b612d6e61184760208301516103bd565b612dc760028501612d8b612d8560408501516103bd565b826121d3565b612da1612d9b6060850151151590565b82612b78565b608083015115155b90805460ff60a81b191691151560a81b60ff60a81b16919091179055565b612de0612dd760a08301516103bd565b600386016121d3565b01519101612c11565b601f19821695612df88561027f565b9660005b818110612e415750926103529697600495936001938360c09710612e28575b505050811b018455612d5e565b015160001960f88460031b161c19169055388080612e1b565b83830151895560019098019760209384019301612dfc565b81604051928392833781016000815203902090565b15612e7557565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b15612eaf57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b15612ef057565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b15612f3057565b60405162461bcd60e51b815260206004820152601660248201527515dc985c1c1959081b985d1a5d99481b9bdd081cd95d60521b6044820152606490fd5b15612f7557565b60405162461bcd60e51b815260206004820152601c60248201527b43616e6e6f742073776170206e617469766520746f206e617469766560201b6044820152606490fd5b15612fc057565b60405162461bcd60e51b81526020600482015260176024820152762ab739bab83837b93a32b21034b7383aba103a37b5b2b760491b6044820152606490fd5b1561300657565b60405162461bcd60e51b81526020600482015260186024820152772ab739bab83837b93a32b21037baba383aba103a37b5b2b760411b6044820152606490fd5b1561304d57565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b9081602091031261047d57516107d781610eee565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b9015611e0a5780359060be198136030182121561047d570190565b9190811015611e0a5760051b8101359060be198136030182121561047d570190565b1561310757565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b356107d781610482565b6001600160a01b039091168152602081019190915260400190565b6040519061317d6020836102f6565b60008252565b3d156131ae573d9061319482610fe8565b916131a260405193846102f6565b82523d6000602084013e565b606090565b156131ba57565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b91969861323a909895939196949861320e6151d7565b613219851515612ea8565b61322d6001600160a01b0387161515612ee9565b613235615205565b6153f1565b9761324f6001600160a01b038a161515612f29565b61325761522e565b6001600160a01b03831695861580613646575b6132749015612f6e565b61327c615257565b8661363f57899a5b6001600160a01b038916613638578a935b61329d615280565b881589613621575b6132ae90612fb9565b6001600160a01b038a1680159061360a575b6132c990612fff565b6132d16152a9565b8861360457349a5b6132e48c1515613046565b6132ec6152d2565b89806135a15750506132fc615324565b6001600160a01b038c163b1561047d57600460008d60405192838092630d0e30db60e41b8252349060018060a01b03165af18015611d285761358c575b505b61334361534d565b60009c61334e615434565b6000905b8882106135315750509089858d8f61339e6133886133a3926133836133a99b9a9961337b61539f565b821015613100565b613d88565b9c6001600160a01b0390961615989095906130c3565b613149565b92615739565b6133b16153c8565b6001600160a01b0386166134b957506001600160a01b0387163b1561047d57604051632e1a7d4d60e01b815260048101839052966000908890602490829084906001600160a01b03165af1938415611d2857600080516020615eda8339815191529761348c9561349e575b50613437600080808087895af1613431613183565b506131b3565b61349857506000935b6001600160a01b03811661349257506000945b604080516001600160a01b039687168152968616602088015286015260608501526000608085015290911660a0830152819060c0820190565b0390a190565b94613453565b93613440565b806134ad60006134b3936102f6565b80611249565b3861341c565b60405163a9059cbb60e01b815297506020908890816000816134df888a60048401613153565b03926001600160a01b03165af1938415611d2857600080516020615eda8339815191529761348c95613512575b50613437565b61352a9060203d602011611d2157611d1981836102f6565b503861350c565b909d6135848f91610a3a8f8f889061357c8f9760019861356d8f966109d490613558615376565b602061356586868c6130de565b0135906122db565b938a8060a01b031615956130de565b908d896154c9565b9e0190613352565b806134ad600061359b936102f6565b38613339565b6135d06020916000936135b26152fb565b6040519485809481936323b872dd60e01b8352303360048501613095565b03925af18015611d28576135e5575b5061333b565b6135fd9060203d602011611d2157611d1981836102f6565b50386135df565b8a6132d9565b506132c961361a61197d8c61066a565b90506132c0565b506132ae61363161197d8861066a565b90506132a5565b8893613295565b839a613284565b506001600160a01b0388161561326a565b1561365e57565b60405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b6044820152606490fd5b604051606091906136a383826102f6565b6002815291601f1901366020840137565b604051906136c36020836102f6565b6000808352366020840137565b60208183031261047d578051906001600160401b03821161047d57019080601f8301121561047d578151613703816112d7565b9261371160405194856102f6565b81845260208085019260051b82010192831161047d57602001905b8282106137395750505090565b815181526020918201910161372c565b919260809361376e92979695978452602084015260a0604084015260a08301906106e0565b6001600160a01b0390951660608201520152565b606090602081526015602082015274158c881cddd85c081d1bc81155120819985a5b1959605a1b60408201520190565b939891979495996137fe90979391976137d460018060a01b0389161515612ee9565b6137ed6137e86137e38661254a565b612663565b6103bd565b1580613d6d575b6132359015613657565b926138136001600160a01b0385161515612f29565b6001600160a01b0385161580613d5c575b61382e9015612f6e565b6001600160a01b038516613d555783905b6001600160a01b038916613d4e5784935b6001600160a01b038716801590613d37575b61386b90612fb9565b6001600160a01b038a16801590613d20575b61388690612fff565b6001600160a01b038716613d1a57349a5b6138a28c1515613046565b6001600160a01b038816613cb3576001600160a01b0387163b1561047d57604051630d0e30db60e41b8152600081600481346001600160a01b038d165af1918215611d28578e60209261391194613c9e575b505b60405163095ea7b360e01b8152938492839260048401613153565b038160006001600160a01b0389165af18015611d28578e948e938e938993613c81575b5061394161197d86610684565b15613b3057509161397e969161395996959493615e07565b995b6139648b613d88565b966001600160a01b038a16159290918c9086908890615739565b6001600160a01b038616613ab4575061399961197d88610684565b613a34575b509481600080516020615eda833981519152966139c96000808080899861348c9a5af1613431613183565b6001600160a01b038116613a2e57506000945b6001600160a01b038116613a2857506000955b604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b956139ef565b946139dc565b959092916001600160a01b0387163b1561047d57604051632e1a7d4d60e01b815260048101829052966000908890602490829084906001600160a01b03165af1938415611d2857600080516020615eda8339815191529761348c95613a9f575b50919650919261399e565b806134ad6000613aae936102f6565b38613a94565b60405163a9059cbb60e01b8152979294939150602090889081600081613ade878a60048401613153565b03926001600160a01b03165af1938415611d2857600080516020615eda8339815191529761348c95613b11575b506139c9565b613b299060203d602011611d2157611d1981836102f6565b5038613b0b565b959450613b426137e86137e38861254a565b158015613c6b575b613c3c575b6001600160a01b038a16613b75579161397e9691613b6f96959493615c41565b9961395b565b91949392916001600160a01b038d16613c2d5750506040516318cbafe560e01b81529460009486948594613bb0945092309260048701613749565b0381836001600160a01b038e165af160009181613c08575b50613bea5760405162461bcd60e51b815280613be660048201613782565b0390fd5b613c0181613bfb61397e9351612044565b90612577565b519961395b565b613c269192503d806000833e613c1e81836102f6565b8101906136d0565b9038613bc8565b9461397e9691613b6f96615c41565b9450613c46613692565b613c5886613c538361254a565b6124bc565b613c6582613c5383612557565b94613b4f565b50613c7b6137e86137e388612557565b15613b4a565b613c999060203d602011611d2157611d1981836102f6565b613934565b806134ad6000613cad936102f6565b386138f4565b6040516323b872dd60e01b815260208180613cd385303360048501613095565b038160006001600160a01b038e165af1918215611d28578e60209261391194613cfd575b506138f6565b613d1390843d8611611d2157611d1981836102f6565b5038613cf7565b8a613897565b50613886613d3061197d8c61066a565b905061387d565b5061386b613d4761197d8961066a565b9050613862565b8893613850565b849061383f565b506001600160a01b03881615613824565b50613235613d806137e86137e387612557565b1590506137f4565b90612710613d98600654846122db565b04808303928311612053579190565b90808214613e3d578054906001600160401b0382116102bb57613dd6613ddc91613dd18486612b86565b61027f565b9261027f565b91600a82049181549160005b848110613e20575050600a8302808203613e04575b5050505050565b60039060001992030260031b1b19169101553880808080613dfd565b600191820180546001600160f01b03909516878301559101613de8565b5050565b906122aa57818103613e51575050565b60048083613e6261035295856120fa565b613e7b60018060a01b03600183015416600186016121d3565b613ebc60028501612da960028401613e9c60018060a01b03825416846121d3565b613eb060ff825460a01c16151584546121f2565b83555460a81c60ff1690565b613ecc612dd760038301546103bd565b019101613da7565b805480156123a0576000190190613eeb8282611dee565b6122aa5780613efb6004926122ee565b6000600182015560006002820155600060038201550180546000825580613f2157505055565b613f3c91600052600a6009602060002092010481019061208b565b55565b9190613f4c368285611003565b6020815191012092613f5d83610235565b9360005b85548082101561400f5782613f7f613f79848a611dee565b50610319565b6020815191012014613f945750600101613f61565b61295d925061295387613fe384613fdd613fd5613fcf613fc96001613fe89e9f6105669b613fc191611dee565b5001546103bd565b97612044565b85611dee565b509184611dee565b90613e41565b613ed4565b7f920794705994e7d9e02cbb96f6a4492a1b379bc6c7aefb7a8ebc2f3fcc84fc72600080a3565b60405162461bcd60e51b815260206004820152600d60248201526c111156081b9bdd08199bdd5b99609a1b6044820152606490fd5b6040519061010082016001600160401b038111838210176102bb57604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b1561409c57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81d1bdad95b9cc81c1c9bdd9a59195960721b6044820152606490fd5b9015611e0a5780359060de198136030182121561047d570190565b9190811015611e0a5760051b8101359060de198136030182121561047d570190565b903590601e198136030182121561047d57018035906001600160401b03821161047d5760200191813603831361047d57565b9092916001600160401b0381116102bb576141648161212a8454610245565b6000601f82116001146141925781906121549394956000926141875750506120e7565b013590503880611123565b601f198216946141a18461027f565b91805b8781106141db5750836001959697106141c157505050811b019055565b0135600019600384901b60f8161c19169055388080612193565b909260206001819286860135815501940191016141a4565b356107d7816105c4565b356107d781610eee565b8054919291600160401b8110156102bb5761422791600182018155611ee2565b6122aa576142358380614113565b9093906001600160401b0381116102bb57614254816110f28554610245565b6000601f82116001146142f857600592614282836142f19460c094610352999a6000926141875750506120e7565b85555b61429f6142956020830183614113565b9060018801614145565b6142c7600286016142b5612d8560408501613149565b6142c1606084016141f3565b90612209565b608081013560038601556142eb6142e160a0830183614113565b9060048801614145565b016141fd565b9101612218565b601f198216906143078561027f565b91815b81811061435357508360c0936103529899600597946142f19760019510614339575b505050811b018555614285565b0135600019600384901b60f8161c1916905538808061432c565b9192602060018192868c01358155019401920161430a565b60001981146120535760010190565b6000546001600160a01b0316330361438e57565b63118cdaa760e01b6000523360045260246000fd5b156143aa57565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b156143ed57565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606490fd5b8054919291600160401b8110156102bb5761444a91600182018155611ee2565b6122aa57825180519093906001600160401b0381116102bb57614471816110f28554610245565b6020601f82116001146144f95760059261449f836142f19460c094610352999a6000926111435750506120e7565b85555b6144b3602082015160018701612ad2565b6144d7600286016144ca612d8560408501516103bd565b606083015160ff166142c1565b608081015160038601556144f260a082015160048701612ad2565b0151151590565b601f198216956145088561027f565b9660005b818110614554575083610352979860c094600597946142f1976001951061453b575b505050811b0185556144a2565b015160001960f88460031b161c1916905538808061452e565b8383015189556001909801976020938401930161450c565b614584906020604051928284809451938492016103c9565b810103902090565b90614596826112d7565b6145a360405191826102f6565b82815280926145b4601f19916112d7565b019060005b8281106145c557505050565b6020906145d0614044565b828285010152016145b9565b6040906107d79392815281602082015201906106e0565b9190918054831015611e0a576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b9081602091031261047d575190565b606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b93929091936146b06146ab6146a584610235565b546122c5565b61458c565b9160009384925b6146c083610235565b54841015614c49576146ee61244460026146e2876146dd88610235565b611dee565b50015460a01c60ff1690565b614c3f576147106002614704866146dd87610235565b50015460a81c60ff1690565b1561492a5761472a6137e86003613fc1876146dd88610235565b6001600160a01b03169660005b896004614747886146dd89610235565b50015482101561491957600080916147a16147af6147806147798760046147728f8f6146dd90610235565b50016145f3565b9054612bee565b92604051928391602083019563f7729d4360e01b87528c8c60248601614615565b03601f1981018352826102f6565b51908c5afa6147bc613183565b906147cb575b50600101614737565b8098919851810160200190602001906147e39161464b565b866147ed87610235565b906147f791611dee565b5090858c896148058a610235565b9061480f91611dee565b506001015461481d906103bd565b926148266136b4565b918d8c6148328d610235565b9061483c91611dee565b506004019061484a916145f3565b90549061485691612bee565b89604051958692602084019261486b9361465a565b03601f198101855261487d90856102f6565b8d8c6148888d610235565b9061489291611dee565b50600401906148a0916145f3565b9054906148ac91612bee565b946148b5610fd8565b966148bf90610319565b87526148ce90602088016124bc565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e08201526148fd8289612577565b526149088188612577565b506149129061436b565b96386147c2565b50509360019197505b0192956146b7565b9592614935836153f1565b61493d613692565b886149478261254a565b90614951916124bc565b8361495b82612557565b90614965916124bc565b61496d61258b565b91896149788461254a565b90614982916124bc565b61498b83612557565b90614995916124bc565b8361499f83612567565b906149a9916124bc565b6149b161258b565b91896149bc8461254a565b906149c6916124bc565b6149cf86610225565b600201546001600160a01b03166149e584612557565b906149ef916124bc565b846149f984612567565b90614a03916124bc565b83614a0d87610235565b90614a1791611dee565b5060010154614a25906103bd565b614a2e906103bd565b614a37906103bd565b918b8360405180809363d06ca61f60e01b8252856004830191614a59926145dc565b03815a93600094fa60009181614c24575b50614bf2575050614a936000828d604051938492839263d06ca61f60e01b8452600484016145dc565b0381865afa60009181614bd7575b50614ba5575050600082614acc928c60405180958194829363d06ca61f60e01b8452600484016145dc565b03915afa60009181614b8a575b50614ae9575b5050600190614922565b9684614b82928499614b3c614b1e614b186001613fc18a6146dd614b11849d6146dd8c610235565b5099610235565b92612567565b5191614b31614b2b610fd8565b95610319565b8552602085016124bc565b8c604084015260608301526080820152614b5461316e565b60a0820152600060c0820152600060e0820152614b718289612577565b52614b7c8188612577565b5061436b565b959038614adf565b614b9e91923d8091833e613c1e81836102f6565b9038614ad9565b614bd1935084999250908691614b3c614b1e614b186001613fc18a6146dd614b11849d6146dd8c610235565b95614922565b614beb91923d8091833e613c1e81836102f6565b9038614aa1565b614bd19450859a9350879250614b3c614b1e614c1e6001613fc18a6146dd614b11849d6146dd8c610235565b92612557565b614c3891923d8091833e613c1e81836102f6565b9038614a6a565b9592600190614922565b505050918152925050565b929394909194614c696146ab6146a583610235565b9260009485935b614c7984610235565b548510156151ca57614c9661244460026146e2886146dd89610235565b6151be57614cac6002614704876146dd88610235565b15614eb05796614cc76137e86003613fc1886146dd89610235565b6001600160a01b03169760005b8a6004614ce4896146dd8a610235565b500154821015614e9c57600080916147a1614d31614d106147798760048f8f906146dd61477292610235565b92604051928391602083019563f7729d4360e01b87528d8d60248601614615565b51908d5afa614d3e613183565b90614d4d575b50600101614cd4565b809991995181016020019060200190614d659161464b565b8b868b8a614d728b610235565b90614d7c91611dee565b50938b614d888c610235565b90614d9291611dee565b5060010154614da0906103bd565b93614da96136b4565b928d8d8282614db783610235565b90614dc191611dee565b5060040190614dcf916145f3565b905490614ddb91612bee565b8d6040519889926020840192614df09361465a565b03601f1981018852614e0290886102f6565b614e0b90610235565b90614e1591611dee565b5060040190614e23916145f3565b905490614e2f91612bee565b94614e38610fd8565b96614e4290610319565b8752614e5190602088016124bc565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e0820152614e80828a612577565b52614e8b8189612577565b50614e959061436b565b9738614d44565b5050946001919298505b0193969096614c70565b93614ebd849892986153f1565b614ec5613692565b9089614ed08361254a565b90614eda916124bc565b84614ee483612557565b90614eee916124bc565b614ef661258b565b908a614f018361254a565b90614f0b916124bc565b614f1482612557565b90614f1e916124bc565b84614f2882612567565b90614f32916124bc565b838b614f3c61258b565b928c614f478561254a565b90614f51916124bc565b614f5a89610225565b600201546001600160a01b0316614f7085612557565b90614f7a916124bc565b87614f8485612567565b90614f8e916124bc565b85614f988a610235565b90614fa291611dee565b5060010154614fb0906103bd565b614fb9906103bd565b614fc2906103bd565b60405163d06ca61f60e01b8152909590868180614fe38588600484016145dc565b03815a93600094fa600091816151a3575b5061516757505060405163d06ca61f60e01b81526000818061501a8587600484016145dc565b0381895afa6000918161514c575b5061510857505082615054939460009260405180968194829363d06ca61f60e01b8452600484016145dc565b03915afa600092816150ed575b50615072575b505050600190614ea6565b61507d575b83615067565b97856150e592849a6150a5614b1e614b186001613fc18a6146dd614b11849d6146dd8c610235565b8d6040840152606083015260808201526150bd61316e565b60a0820152600060c0820152600060e08201526150da828a612577565b52614b7c8189612577565b969038615077565b61510191933d8091833e613c1e81836102f6565b9138615061565b935093505061511c575b5050600190614ea6565b978561514492849a6150a5614b1e614b186001613fc18a6146dd614b11849d6146dd8c610235565b969038615112565b61516091923d8091833e613c1e81836102f6565b9038615028565b94509450505061517b575050600190614ea6565b978561514492849a6150a5614b1e614c1e6001613fc18a6146dd614b11849d6146dd8c610235565b6151b791923d8091833e613c1e81836102f6565b9038614ff4565b93600190979197614ea6565b9750505050509150815290565b61035260405163f82c50f160e01b602082015260016024820152602481526152006044826102f6565b615e7e565b61035260405163f82c50f160e01b602082015260026024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260036024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260046024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260056024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260066024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260076024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260096024820152602481526152006044826102f6565b61035260405163f82c50f160e01b602082015260086024820152602481526152006044826102f6565b61035260405163f82c50f160e01b6020820152600a6024820152602481526152006044826102f6565b61035260405163f82c50f160e01b6020820152600c6024820152602481526152006044826102f6565b61035260405163f82c50f160e01b6020820152600d6024820152602481526152006044826102f6565b61035260405163f82c50f160e01b6020820152600e6024820152602481526152006044826102f6565b6000818152600860205260409020600101546001600160a01b03166154165750600090565b6000908152600860205260409020600101546001600160a01b031690565b610352604051637b3338ad60e11b6020820152600b602482015260006044820152604481526152006064826102f6565b903590601e198136030182121561047d57018035906001600160401b03821161047d57602001918160051b3603831361047d57565b9060809261376e919695949683526000602084015260a0604084015260a08301906106e0565b356107d7816112bd565b929190946154dc6020836138f686613149565b038160006001600160a01b038a165af18015611d285761571c575b50615504608084016141fd565b1561552957506107d79461552360a061551c85613149565b94016154bf565b93615d0d565b9092901561566f5791816000949361555261554b604061559b99960184615464565b36916112ee565b938451158015615653575b801561562e575b6155f5575b505061557b6137e86137e88793613149565b92604051968795869485936318cbafe560e01b8552309160048601615499565b03925af1600091816155d8575b506155c65760405162461bcd60e51b815280613be660048201613782565b80613bfb6155d49251612044565b5190565b6155ee9192503d806000833e613c1e81836102f6565b90386155a8565b869294506137e861557b926156256137e89361561c615612613692565b93613c538561254a565b613c5383612557565b95935050615569565b5060018060a01b0361564c6137e36156468851612044565b88612577565b1615615564565b506001600160a01b036156686137e38761254a565b161561555d565b9092916107d79461568661554b6040870187615464565b948551158015615700575b80156156db575b6156ac575b6156a690613149565b92615b4a565b94506156a66156b9613692565b6156c685613c538361254a565b6156d383613c5383612557565b95905061569d565b5060018060a01b036156f96137e36156f38951612044565b89612577565b1615615698565b506001600160a01b036157156137e38861254a565b1615615691565b6157349060203d602011611d2157611d1981836102f6565b6154f7565b9493929195600554906157508260ff9060a01c1690565b80615a01575b156159a15750506001600160a01b03868116949082168581146158e3575085106158a35761579c90615793615789613692565b97613c538961254a565b613c5387612557565b47936020604051809563095ea7b360e01b8252816000816157c1878960048401613153565b03925af18015611d28576157f9966000958692615886575b506040516318cbafe560e01b815297889586948593309160048601615499565b03926001600160a01b03165af1918215611d285761581d9261586d575b5047612068565b80615826575b50565b6158346137e86007546103bd565b803b1561047d576000906004604051809481936306f4a2cd60e41b83525af18015611d28571561582357806134ad6000610352936102f6565b615881903d806000833e613c1e81836102f6565b615816565b61589e9060203d602011611d2157611d1981836102f6565b6157d9565b5050506158ba925090602091611cc96005546103bd565b03925af18015611d28576158cb5750565b6158239060203d602011611d2157611d1981836102f6565b9596505066038d7ea4c680008610935061598f9250505057803b1561047d57604051632e1a7d4d60e01b815260048101839052906000908290602490829084905af18015611d285761597a575b5061593f6137e86007546103bd565b803b1561047d576000906004604051809481936306f4a2cd60e41b83525af18015611d285761596b5750565b806134ad6000610352936102f6565b806134ad6000615989936102f6565b38615930565b6158ba91602091611cc96005546103bd565b9350935050509291926000146159d75750506000808080610352946159cd6137e86137e86005546103bd565b5af1613431613183565b91602091611cc96159e7946103bd565b03926001600160a01b03165af18015611d28576158cb5750565b506007546001600160a01b0390615a1b906137e8906103bd565b161515615756565b600080546001600160a01b039283166001600160a01b0319821681178355921690600080516020615eba8339815191529080a3565b15615a5f57565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b15615aa157565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b15615af957565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b615bd395615bb2600096959493615b898894615b6a600286511015615a58565b615b766137e38661254a565b6001600160a01b03908116911614615a9a565b615b9f6137e3615b998551612044565b85612577565b6001600160a01b03908116911614615af2565b6040516338ed173960e01b8152968795869485933091869060048701613749565b03926001600160a01b03165af160009181615c24575b506155c65760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b615c3a9192503d806000833e613c1e81836102f6565b9038615be9565b92615c826000969793959492615c6c8894615c60600288511015615a58565b615b766137e38861254a565b615b9f6137e3615c7c8751612044565b87612577565b615bd3604051978896879586946338ed173960e01b8652309260048701613749565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b9091600095615d46602096615d3a615d859796615d32615d2b610fd8565b97886124bc565b8987016124bc565b62ffffff166040850152565b615d5330606085016124bc565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b835260048301615ca4565b03926001600160a01b03165af160009181615dd6575b506107d75760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b615df991925060203d602011615e00575b615df181836102f6565b81019061464b565b9038615d9b565b503d615de7565b91600096615e40602097615e34615d85989795615e2c615e25610fd8565b98896124bc565b8a88016124bc565b62ffffff166040860152565b615e4d30606086016124bc565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b835260048301615ca4565b600080916020815191016a636f6e736f6c652e6c6f675afa5056fe021066d9f43780503f155e50fc23c3d3ac8ba8edd3fbc3aee45c67ddb5f707888be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0b37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da26469706673582212209569b3b0d106d7ccd596b9855f06742e9ce8c77fd4ea217ce1ce98b1f0b7e17264736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.