Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 59 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Eth | 15955017 | 673 days ago | IN | 0 ETH | 0.00047198 | ||||
Swap Assets | 15955011 | 673 days ago | IN | 0 ETH | 0.01589641 | ||||
Withdraw Eth | 15945052 | 674 days ago | IN | 0 ETH | 0.00047753 | ||||
Payback | 15936756 | 676 days ago | IN | 0.44386979 ETH | 0.00568923 | ||||
Withdraw Eth | 15930974 | 676 days ago | IN | 0 ETH | 0.00046022 | ||||
Loan Ether | 15924009 | 677 days ago | IN | 0 ETH | 0.00849579 | ||||
Payback | 15920347 | 678 days ago | IN | 0.17945531 ETH | 0.00468425 | ||||
Loan Ether | 15920124 | 678 days ago | IN | 0 ETH | 0.00939662 | ||||
Update Native To... | 15919699 | 678 days ago | IN | 0 ETH | 0.00057147 | ||||
Update Native To... | 15919678 | 678 days ago | IN | 0 ETH | 0.00058613 | ||||
Loan Ether | 15910181 | 679 days ago | IN | 0 ETH | 0.00520958 | ||||
Payback | 15906044 | 680 days ago | IN | 0.16083556 ETH | 0.00278325 | ||||
Transfer | 15902737 | 680 days ago | IN | 1 ETH | 0.00028294 | ||||
Loan Ether | 15902342 | 680 days ago | IN | 0 ETH | 0.00563269 | ||||
Payback | 15902322 | 680 days ago | IN | 0.12245745 ETH | 0.00257351 | ||||
Loan Ether | 15898906 | 681 days ago | IN | 0 ETH | 0.00916939 | ||||
Payback | 15888629 | 682 days ago | IN | 0.35606907 ETH | 0.0052563 | ||||
Loan Ether | 15888612 | 682 days ago | IN | 0 ETH | 0.01286418 | ||||
Update Eth Limit | 15888588 | 682 days ago | IN | 0 ETH | 0.00081147 | ||||
Loan Ether | 15888108 | 682 days ago | IN | 0 ETH | 0.00666143 | ||||
Loan Ether | 15888103 | 682 days ago | IN | 0 ETH | 0.00617241 | ||||
Loan Ether | 15888062 | 682 days ago | IN | 0 ETH | 0.00592956 | ||||
Payback | 15887895 | 682 days ago | IN | 0.00055377 ETH | 0.00103783 | ||||
Payback | 15887887 | 682 days ago | IN | 0.00166097 ETH | 0.00122752 | ||||
Loan Ether | 15887866 | 682 days ago | IN | 0 ETH | 0.00456854 |
Latest 16 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15955017 | 673 days ago | 0.48304268 ETH | ||||
15955011 | 673 days ago | 0.47370817 ETH | ||||
15955011 | 673 days ago | 0.00933451 ETH | ||||
15945052 | 674 days ago | 0.44386979 ETH | ||||
15930974 | 676 days ago | 1.31333723 ETH | ||||
15924009 | 677 days ago | 0.6016749 ETH | ||||
15920124 | 678 days ago | 0.41483158 ETH | ||||
15910181 | 679 days ago | 0.17255318 ETH | ||||
15902342 | 680 days ago | 0.15464958 ETH | ||||
15898906 | 681 days ago | 0.11774755 ETH | ||||
15888612 | 682 days ago | 0.34237411 ETH | ||||
15888108 | 682 days ago | 0.00076891 ETH | ||||
15888103 | 682 days ago | 0.00051261 ETH | ||||
15888062 | 682 days ago | 0.00051261 ETH | ||||
15887866 | 682 days ago | 0.00051754 ETH | ||||
15887843 | 682 days ago | 0.00155231 ETH |
Loading...
Loading
Contract Name:
Loan
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-02 */ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.7.0 <0.9.0; // TODO(zx): Replace all instances of SafeMath with OZ implementation library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; assert(a == b * c + (a % b)); // There is no case in which this doesn't hold return c; } // Only used in the BondingCalculator.sol function sqrrt(uint256 a) internal pure returns (uint256 c) { if (a > 3) { c = a; uint256 b = add(div(a, 2), 1); while (b < c) { c = b; b = div(add(div(a, b), b), 2); } } else if (a != 0) { c = 1; } } } interface IERC20 { function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract Loan is Ownable, ReentrancyGuard { using SafeMath for uint256; uint256 public loanMaxEth; uint256 public loanMinEth; uint256 public nativeTokenMin; address public nativeTokenAddress; address public operator; struct LoanPool { uint256 loanDuration; uint256 loanLimit; uint256 loanLimitNative; uint256 repayRate; bool closed; } struct LoanRequest { address borrower; address token; uint256 loanAmount; uint256 collateralAmount; uint256 paybackAmount; uint256 loanDueDate; uint256 duration; uint256 loanId; bool isPayback; } uint256 public lastSwapTs; mapping(address => address[]) public swapPaths; mapping(address => uint256) public userLoansCount; mapping(address => mapping(uint256 => LoanRequest)) public loans; address[] public collateralTokens; address[] public loanUsers; mapping(address => uint256) public loanPoolLength; mapping(address => mapping(uint256 => LoanPool)) public loanPools; IUniswapV2Router02 public immutable uniswapV2Router; event NewAddLoanPool( address collateralToken, uint256 loanDuration, uint256 loanLimit, uint256 loanLimitNative, uint256 repayRate ); event NewLoanEther( address indexed borrower, uint256 loanAmount, uint256 collateralAmount, uint256 paybackAmount, uint256 loanDueDate, uint256 duration ); event PayBack( address borrower, bool paybackSuccess, uint256 paybackTime, uint256 paybackAmount, uint256 returnCollateralAmount ); event Received(address, uint256); event UpdatePairToken(address collateralToken, address[] swapPath); constructor( address _nativeTokenAddress, address _routerAddress, uint256 _nativeMin ) { loanMaxEth = 10 ** 18; loanMinEth = 10 ** 17; nativeTokenMin = _nativeMin; nativeTokenAddress = _nativeTokenAddress; operator = msg.sender; IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( _routerAddress ); uniswapV2Router = _uniswapV2Router; } // Operator CAN do modifier modifier onlyOperator() { require(operator == msg.sender, "operator: caller is not the operator"); _; } modifier onlyOwnerOrOperator() { require( (msg.sender == owner()) || (msg.sender == operator), "Not owner or operator" ); _; } receive() external payable { emit Received(msg.sender, msg.value); } function addLoanPool( address _collateralToken, uint256 _loanDuration, uint256 _loanLimit, uint256 _loanLimitNative, uint256 _repayRate, address[] memory _path ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); require(_loanLimit < 100, "add: Can't over 100% limit"); require(_loanLimitNative < 100, "add: Can't over 100% limit"); require(_repayRate >= 100, "add: shold be over 100%"); bool isColToken = isCollateralToken(_collateralToken); if (!isColToken) { collateralTokens.push(_collateralToken); swapPaths[_collateralToken] = _path; } LoanPool memory newLoanPool; newLoanPool.loanDuration = _loanDuration; newLoanPool.loanLimit = _loanLimit; newLoanPool.loanLimitNative = _loanLimitNative; newLoanPool.repayRate = _repayRate; newLoanPool.closed = false; uint256 loanPoolLen = loanPoolLength[_collateralToken]; loanPools[_collateralToken][loanPoolLen] = newLoanPool; loanPoolLength[_collateralToken]++; emit NewAddLoanPool( _collateralToken, _loanDuration, _loanLimit, _loanLimitNative, _repayRate ); } function updateLoanPool( address _collateralToken, uint256 _index, uint256 _loanDuration, uint256 _loanLimit, uint256 _loanLimitNative, uint256 _repayRate ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); uint256 loanIdLen = loanPoolLength[_collateralToken]; require(_index < loanIdLen, "update: No valid index"); require(_loanLimit < 100, "add: Can't over 100% limit"); require(_loanLimitNative < 100, "add: Can't over 100% limit"); require(_repayRate >= 100, "add: shold be over 100%"); loanPools[_collateralToken][_index].loanDuration = _loanDuration; loanPools[_collateralToken][_index].loanLimit = _loanLimit; loanPools[_collateralToken][_index].loanLimitNative = _loanLimitNative; loanPools[_collateralToken][_index].repayRate = _repayRate; } function updateSwapPath(address _collateralToken, address[] memory _path) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); swapPaths[_collateralToken] = _path; emit UpdatePairToken(_collateralToken, _path); } function setLoanPoolClose( address _collateralToken, uint256 _loanPoolId, bool _closed ) public onlyOwner { require( _collateralToken != address(0), "update: Zero collateral address" ); bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "update: No collateral token"); uint256 loanIdLen = loanPoolLength[_collateralToken]; require(_loanPoolId < loanIdLen, "set: No valid loan pool id"); loanPools[_collateralToken][_loanPoolId].closed = _closed; } function isCollateralToken(address _addr) public view returns (bool) { uint256 len = collateralTokens.length; bool isToken = false; for (uint256 i = 0; i < len; i++) { if (_addr == collateralTokens[i]) { isToken = true; break; } } return isToken; } function isNativeTokenHolder(address _user) public view returns (bool) { uint256 balance = IERC20(nativeTokenAddress).balanceOf(_user); if (balance > nativeTokenMin) { return true; } return false; } function updateNativeToken(address _tokenAddress, uint256 _min) public onlyOwner { require(_tokenAddress != address(0), "native: zero token address"); nativeTokenAddress = _tokenAddress; nativeTokenMin = _min; } function updateEthLimit(uint256 _loanMaxEth, uint256 _loanMinEth) public onlyOwner { loanMaxEth = _loanMaxEth; loanMinEth = _loanMinEth; } // calculate require colleteral token amount by passing ether amount function countCollateralFromEther( address _collateralToken, uint256 _limit, uint256 _amount ) public view returns (uint256) { address[] memory path = swapPaths[_collateralToken]; uint256[] memory amounts = new uint256[](path.length); amounts = uniswapV2Router.getAmountsIn(_amount, path); uint256 result = amounts[0].div(_limit).mul(100); return result; } // calculate require ether amount by passing collateral amount function countEtherFromCollateral( address _collateralToken, uint256 _limit, uint256 _tokenAmount ) public view returns (uint256) { address[] memory path = swapPaths[_collateralToken]; uint256[] memory amounts = new uint256[](path.length); amounts = uniswapV2Router.getAmountsOut(_tokenAmount, path); uint256 result = amounts[path.length - 1].mul(_limit).div(100); return result; } function checkLoanEthLimit(uint256 _amount) public view returns (bool) { uint256 totalEth = address(this).balance; if (_amount <= loanMaxEth && _amount > loanMinEth && _amount < totalEth) { return true; } else { return false; } } function TokenTransfer( address _user, address _collateralToken, uint256 _tokenAmount ) private returns (bool) { bool transferred = IERC20(_collateralToken).transferFrom( _user, address(this), _tokenAmount ); return transferred; } function loanEther( address _collateralToken, uint256 _loanPoolId, uint256 _tokenAmount ) public nonReentrant { bool isColToken = isCollateralToken(_collateralToken); require(isColToken, "loanEther: No collateral token"); uint256 tokenAmount = _tokenAmount; address collateralToken = _collateralToken; uint256 loanPoolId = _loanPoolId; uint256 loanPoolLen = loanPoolLength[collateralToken]; require(loanPoolLen > loanPoolId, "loanEther: no valid loan Id"); require( !loanPools[_collateralToken][_loanPoolId].closed, "loanEther: Loan Pool is closed" ); uint256 balance = IERC20(collateralToken).balanceOf(msg.sender); require(balance > tokenAmount, "loanEther: not enough token balance"); bool isHolder = isNativeTokenHolder(msg.sender); uint256 limit = !isHolder ? loanPools[collateralToken][loanPoolId].loanLimit : loanPools[collateralToken][loanPoolId].loanLimitNative; uint256 beforeBalance = IERC20(collateralToken).balanceOf( address(this) ); require( TokenTransfer(msg.sender, collateralToken, tokenAmount), "loanEther: Transfer token from user to contract failed" ); uint256 afterBalance = IERC20(collateralToken).balanceOf(address(this)); uint256 tokenAmountReal = afterBalance - beforeBalance; uint256 ethAmountReal = countEtherFromCollateral( collateralToken, limit, tokenAmountReal ); bool isOldUser = false; for (uint256 i = 0; i < loanUsers.length; i++) { if (loanUsers[i] == msg.sender) { isOldUser = true; break; } } if (isOldUser == false) { loanUsers.push(msg.sender); } require( checkLoanEthLimit(ethAmountReal), "loanEther: not enough liquidity or can't borrow limited ETH amount" ); LoanRequest memory newLoan; newLoan.borrower = msg.sender; newLoan.loanAmount = ethAmountReal; newLoan.collateralAmount = tokenAmountReal; newLoan.loanId = userLoansCount[msg.sender]; newLoan.isPayback = false; newLoan.token = collateralToken; uint256 repayRate = loanPools[collateralToken][loanPoolId].repayRate; uint256 loanDuration = loanPools[collateralToken][loanPoolId] .loanDuration; newLoan.paybackAmount = ethAmountReal.mul(repayRate).div(100); newLoan.loanDueDate = block.timestamp + loanDuration; newLoan.duration = loanDuration; loans[msg.sender][userLoansCount[msg.sender]] = newLoan; userLoansCount[msg.sender]++; payable(msg.sender).transfer(ethAmountReal); emit NewLoanEther( msg.sender, newLoan.loanAmount, newLoan.collateralAmount, newLoan.paybackAmount, newLoan.loanDueDate, newLoan.duration ); } function payback(uint256 _id) public payable nonReentrant { LoanRequest storage loanReq = loans[msg.sender][_id]; address collateralToken = loanReq.token; require( loanReq.borrower == msg.sender, "payback: Only borrower can payback" ); require(!loanReq.isPayback, "payback: payback already"); require( block.timestamp <= loanReq.loanDueDate, "payback: exceed due date" ); require( msg.value >= loanReq.paybackAmount, "payback: Not enough ether" ); loanReq.isPayback = true; require( IERC20(collateralToken).transfer( msg.sender, loanReq.collateralAmount ), "payback: Transfer collateral from contract to user failed" ); emit PayBack( msg.sender, loanReq.isPayback, block.timestamp, loanReq.paybackAmount, loanReq.collateralAmount ); } function getAllUserLoans(address _user) public view returns (LoanRequest[] memory) { LoanRequest[] memory requests = new LoanRequest[]( userLoansCount[_user] ); for (uint256 i = 0; i < userLoansCount[_user]; i++) { requests[i] = loans[_user][i]; } return requests; } function getUserOngoingLoans(address _user) public view returns (LoanRequest[] memory) { LoanRequest[] memory ongoing = new LoanRequest[](userLoansCount[_user]); for (uint256 i = 0; i < userLoansCount[_user]; i++) { LoanRequest memory req = loans[_user][i]; if (!req.isPayback && req.loanDueDate > block.timestamp) { ongoing[i] = req; } } return ongoing; } function getUserOverdueLoans(address _user) public view returns (LoanRequest[] memory) { LoanRequest[] memory overdue = new LoanRequest[](userLoansCount[_user]); for (uint256 i = 0; i < userLoansCount[_user]; i++) { LoanRequest memory req = loans[_user][i]; if (!req.isPayback && req.loanDueDate < block.timestamp) { overdue[i] = req; } } return overdue; } function getUserOverdueLoansFrom(address _user, uint256 _from) public view returns (LoanRequest[] memory) { LoanRequest[] memory overdue = new LoanRequest[](userLoansCount[_user]); for (uint256 i = 0; i < userLoansCount[_user]; i++) { LoanRequest memory req = loans[_user][i]; if ( !req.isPayback && req.loanDueDate < block.timestamp && _from < req.loanDueDate ) { overdue[i] = req; } } return overdue; } function countSwapAmount(address _token) public view returns (uint256) { uint256 tokenSwapAmount; for (uint256 k = 0; k < loanUsers.length; k++) { address user = loanUsers[k]; LoanRequest[] memory loanUser = getUserOverdueLoansFrom( user, lastSwapTs ); for (uint256 i = 0; i < loanUser.length; i++) { if (_token == loanUser[i].token) { tokenSwapAmount = tokenSwapAmount.add( loanUser[i].collateralAmount ); } } } return tokenSwapAmount; } function isSwappable() public view returns (bool) { uint256 totalSwapAmount = 0; bool isEnable; for (uint256 i = 0; i < collateralTokens.length; i++) { uint256 tokenAmount = countSwapAmount(collateralTokens[i]); totalSwapAmount = totalSwapAmount.add(tokenAmount); } if (totalSwapAmount > 0) { isEnable = true; } return isEnable; } function swapAssets() public onlyOperator { for (uint256 i = 0; i < collateralTokens.length; i++) { uint256 tokenAmount = countSwapAmount(collateralTokens[i]); if (tokenAmount > 0) { IERC20(collateralTokens[i]).approve( address(uniswapV2Router), tokenAmount ); address[] memory path = swapPaths[collateralTokens[i]]; uniswapV2Router .swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } } lastSwapTs = block.timestamp; } function transferOperator(address _opeator) public onlyOwner { require(_opeator != address(0), "operator: Zero Address"); operator = _opeator; } function withdrawEth(uint256 _amount) external onlyOwnerOrOperator { uint256 totalEth = address(this).balance; require( _amount <= totalEth, "withdraw: Can't exceed more than totalLiquidity" ); address payable _owner = payable(msg.sender); _owner.transfer(_amount); } function emergencyWithdrawToken(address _token, uint256 _amount) external onlyOwnerOrOperator { IERC20(_token).transfer(msg.sender, _amount); } function recoverERC20(address _token) public onlyOperator { bool isColToken = isCollateralToken(_token); if (!isColToken) { uint256 balance = IERC20(_token).balanceOf(address(this)); IERC20(_token).transfer(msg.sender, balance); } } function getCollateralLen() public view returns (uint256) { return collateralTokens.length; } function getTotalLiquidity() public view returns (uint256) { return address(this).balance; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nativeTokenAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"uint256","name":"_nativeMin","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayRate","type":"uint256"}],"name":"NewAddLoanPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"NewLoanEther","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":"borrower","type":"address"},{"indexed":false,"internalType":"bool","name":"paybackSuccess","type":"bool"},{"indexed":false,"internalType":"uint256","name":"paybackTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnCollateralAmount","type":"uint256"}],"name":"PayBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address[]","name":"swapPath","type":"address[]"}],"name":"UpdatePairToken","type":"event"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanDuration","type":"uint256"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"addLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"checkLoanEthLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"countCollateralFromEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"countEtherFromCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"countSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAllUserLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralLen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOngoingLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOverdueLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_from","type":"uint256"}],"name":"getUserOverdueLoansFrom","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isCollateralToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isNativeTokenHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwappable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanPoolId","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"loanEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"loanMaxEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanMinEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loanPoolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanPools","outputs":[{"internalType":"uint256","name":"loanDuration","type":"uint256"},{"internalType":"uint256","name":"loanLimit","type":"uint256"},{"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"repayRate","type":"uint256"},{"internalType":"bool","name":"closed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loans","outputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"payback","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanPoolId","type":"uint256"},{"internalType":"bool","name":"_closed","type":"bool"}],"name":"setLoanPoolClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_opeator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_loanMaxEth","type":"uint256"},{"internalType":"uint256","name":"_loanMinEth","type":"uint256"}],"name":"updateEthLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_loanDuration","type":"uint256"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"}],"name":"updateLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"updateNativeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"updateSwapPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLoansCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620039c3380380620039c38339810160408190526200003491620000e5565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055670de0b6b3a764000060025567016345785d8a0000600355600455600580546001600160a01b039384166001600160a01b03199182161790915560068054909116331790551660805262000126565b80516001600160a01b0381168114620000e057600080fd5b919050565b600080600060608486031215620000fb57600080fd5b6200010684620000c8565b92506200011660208501620000c8565b9150604084015190509250925092565b6080516138656200015e600039600081816102b601528181611398015281816114c201528181612aa30152612d1e01526138656000f3fe6080604052600436106102605760003560e01c80637eff539411610144578063a846c2fd116100b6578063e31323ac1161007a578063e31323ac14610807578063e39f9f2a1461081d578063e7177ece1461089f578063ed921a14146108bf578063f2fde38b146108df578063f8915391146108ff57600080fd5b8063a846c2fd1461077f578063acc4565914610792578063b8118bbe146107a7578063c311d049146107c7578063db8bb3a1146107e757600080fd5b80639e8c708e116101085780639e8c708e146106d45780639f4749af146106f4578063a007945e1461070a578063a12af8961461071f578063a4c3b0911461073f578063a803180d1461075f57600080fd5b80637eff539414610578578063888eb1ee146105985780638a918694146105b85780638da5cb5b146105e557806398c61c371461060357600080fd5b806344b8044a116101dd578063570ca735116101a1578063570ca735146104ce57806360ab8988146104ee57806367f7b06f1461050e5780636df9d3791461052e578063715018a614610543578063769db6151461055857600080fd5b806344b8044a1461041b5780634766162c1461044b5780634c0a79fb1461046b5780634d0047ee146104985780634e509f74146104b857600080fd5b8063293308f111610224578063293308f11461037757806329605e77146103a55780632cd1d250146103c55780632f759d91146103db57806335c7e9251461040857600080fd5b80631694505e146102a4578063172c48c7146102f55780631fffb6981461031557806324350de314610337578063274dca921461035757600080fd5b3661029f57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b3480156102b057600080fd5b506102d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030157600080fd5b506102d86103103660046130c6565b61091f565b34801561032157600080fd5b506103356103303660046131d8565b610949565b005b34801561034357600080fd5b5061033561035236600461324b565b610bd3565b34801561036357600080fd5b50610335610372366004613295565b610d78565b34801561038357600080fd5b506103976103923660046132b7565b610dad565b6040519081526020016102ec565b3480156103b157600080fd5b506103356103c03660046132b7565b610e9e565b3480156103d157600080fd5b5061039760045481565b3480156103e757600080fd5b506103fb6103f63660046132b7565b610f39565b6040516102ec91906132d2565b34801561041457600080fd5b5047610397565b34801561042757600080fd5b5061043b6104363660046130c6565b61108f565b60405190151581526020016102ec565b34801561045757600080fd5b5061043b6104663660046132b7565b6110c9565b34801561047757600080fd5b506103976104863660046132b7565b60096020526000908152604090205481565b3480156104a457600080fd5b506005546102d8906001600160a01b031681565b3480156104c457600080fd5b5061039760035481565b3480156104da57600080fd5b506006546102d8906001600160a01b031681565b3480156104fa57600080fd5b50610335610509366004613389565b61112f565b34801561051a57600080fd5b506103356105293660046133c9565b61124b565b34801561053a57600080fd5b506103356112f1565b34801561054f57600080fd5b50610335611550565b34801561056457600080fd5b506103fb6105733660046132b7565b6115c4565b34801561058457600080fd5b506103356105933660046133f3565b61172f565b3480156105a457600080fd5b506103356105b3366004613426565b611eaa565b3480156105c457600080fd5b506103976105d33660046132b7565b600d6020526000908152604090205481565b3480156105f157600080fd5b506000546001600160a01b03166102d8565b34801561060f57600080fd5b5061068361061e3660046133c9565b600a6020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff1689565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352608086019190915260a085015260c084015260e08301521515610100820152610120016102ec565b3480156106e057600080fd5b506103356106ef3660046132b7565b611f8c565b34801561070057600080fd5b5061039760025481565b34801561071657600080fd5b50600b54610397565b34801561072b57600080fd5b506103fb61073a3660046132b7565b6120ae565b34801561074b57600080fd5b5061033561075a3660046133c9565b612219565b34801561076b57600080fd5b506102d861077a3660046130c6565b6122f6565b61033561078d3660046130c6565b612306565b34801561079e57600080fd5b5061043b612642565b3480156107b357600080fd5b5061043b6107c23660046132b7565b61269d565b3480156107d357600080fd5b506103356107e23660046130c6565b612724565b3480156107f357600080fd5b506102d86108023660046133c9565b612823565b34801561081357600080fd5b5061039760075481565b34801561082957600080fd5b506108756108383660046133c9565b600e602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016102ec565b3480156108ab57600080fd5b506103fb6108ba3660046133c9565b61285b565b3480156108cb57600080fd5b506103976108da3660046133f3565b6129d5565b3480156108eb57600080fd5b506103356108fa3660046132b7565b612b66565b34801561090b57600080fd5b5061039761091a3660046133f3565b612c50565b600b818154811061092f57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461097c5760405162461bcd60e51b815260040161097390613474565b60405180910390fd5b6001600160a01b0386166109a25760405162461bcd60e51b8152600401610973906134a9565b606484106109c25760405162461bcd60e51b8152600401610973906134e0565b606483106109e25760405162461bcd60e51b8152600401610973906134e0565b6064821015610a2d5760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610973565b6000610a38876110c9565b905080610aa957600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03891690811790915560009081526008602090815260409091208351610aa792850190612fec565b505b610add6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b86815260208082018781526040808401888152606085018881526000608087018181526001600160a01b038f16808352600d8089528684208054600e8b528886208187528b529785208b518155985160018a0155955160028901559351600388015590516004909601805460ff191696151596909617909555938452909352825490929091610b6b8361352d565b9091555050604080516001600160a01b038b168152602081018a905290810188905260608101879052608081018690527f4cb98f3b8ae6aaa3e3a10d19c96b00eac0ed7b5b7415a40edf7583c26c24914b9060a00160405180910390a1505050505050505050565b6000546001600160a01b03163314610bfd5760405162461bcd60e51b815260040161097390613474565b6001600160a01b038616610c235760405162461bcd60e51b8152600401610973906134a9565b6000610c2e876110c9565b905080610c4d5760405162461bcd60e51b815260040161097390613546565b6001600160a01b0387166000908152600d6020526040902054808710610cae5760405162461bcd60e51b81526020600482015260166024820152750eae0c8c2e8ca74409cde40ecc2d8d2c840d2dcc8caf60531b6044820152606401610973565b60648510610cce5760405162461bcd60e51b8152600401610973906134e0565b60648410610cee5760405162461bcd60e51b8152600401610973906134e0565b6064831015610d395760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610973565b50506001600160a01b03959095166000908152600e60209081526040808320968352959052939093209182556001820155600281019190915560030155565b6000546001600160a01b03163314610da25760405162461bcd60e51b815260040161097390613474565b600291909155600355565b60008060005b600c54811015610e97576000600c8281548110610dd257610dd261357d565b60009182526020822001546007546001600160a01b039091169250610df890839061285b565b905060005b8151811015610e8157818181518110610e1857610e1861357d565b6020026020010151602001516001600160a01b0316876001600160a01b031603610e6f57610e6c828281518110610e5157610e5161357d565b60200260200101516060015186612ddc90919063ffffffff16565b94505b80610e798161352d565b915050610dfd565b5050508080610e8f9061352d565b915050610db3565b5092915050565b6000546001600160a01b03163314610ec85760405162461bcd60e51b815260040161097390613474565b6001600160a01b038116610f175760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610973565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff811115610f6e57610f6e6130fb565b604051908082528060200260200182016040528015610fa757816020015b610f94613051565b815260200190600190039081610f8c5790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16151561010082015282518390839081106110715761107161357d565b602002602001018190525080806110879061352d565b915050610fad565b600254600090479083118015906110a7575060035483115b80156110b257508083105b156110c05750600192915050565b50600092915050565b600b5460009081805b8281101561112757600b81815481106110ed576110ed61357d565b6000918252602090912001546001600160a01b03908116908616036111155760019150611127565b8061111f8161352d565b9150506110d2565b509392505050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260040161097390613474565b6001600160a01b03831661117f5760405162461bcd60e51b8152600401610973906134a9565b600061118a846110c9565b9050806111a95760405162461bcd60e51b815260040161097390613546565b6001600160a01b0384166000908152600d60205260409020548084106112115760405162461bcd60e51b815260206004820152601a60248201527f7365743a204e6f2076616c6964206c6f616e20706f6f6c2069640000000000006044820152606401610973565b50506001600160a01b03929092166000908152600e6020908152604080832093835292905220600401805460ff1916911515919091179055565b6000546001600160a01b031633146112755760405162461bcd60e51b815260040161097390613474565b6001600160a01b0382166112cb5760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610973565b600580546001600160a01b0319166001600160a01b039390931692909217909155600455565b6006546001600160a01b0316331461131b5760405162461bcd60e51b815260040161097390613593565b60005b600b5481101561154957600061135a600b83815481106113405761134061357d565b6000918252602090912001546001600160a01b0316610dad565b9050801561153657600b82815481106113755761137561357d565b60009182526020909120015460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156113f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141591906135d7565b50600060086000600b858154811061142f5761142f61357d565b60009182526020808320909101546001600160a01b031683528281019390935260409182019020805482518185028101850190935280835291929091908301828280156114a557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611487575b505060405163791ac94760e01b8152939450506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263791ac947925061150291508590600090869030904290600401613638565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b50505050505b50806115418161352d565b91505061131e565b5042600755565b6000546001600160a01b0316331461157a5760405162461bcd60e51b815260040161097390613474565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff8111156115f9576115f96130fb565b60405190808252806020026020018201604052801561163257816020015b61161f613051565b8152602001906001900390816116175790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526116f85750428160a00151115b1561171c57808383815181106117105761171061357d565b60200260200101819052505b50806117278161352d565b915050611638565b6002600154036117815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610973565b60026001556000611791846110c9565b9050806117e05760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204e6f20636f6c6c61746572616c20746f6b656e00006044820152606401610973565b6001600160a01b0384166000908152600d602052604090205482908590859081811161184e5760405162461bcd60e51b815260206004820152601b60248201527f6c6f616e45746865723a206e6f2076616c6964206c6f616e20496400000000006044820152606401610973565b6001600160a01b0388166000908152600e602090815260408083208a845290915290206004015460ff16156118c55760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610973565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561190c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119309190613674565b905084811161198d5760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610973565b60006119983361269d565b9050600081156119ce576001600160a01b0386166000908152600e602090815260408083208884529091529020600201546119f6565b6001600160a01b0386166000908152600e602090815260408083208884529091529020600101545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a649190613674565b9050611a7133888a612e42565b611adc5760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610973565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b479190613674565b90506000611b55838361368d565b90506000611b648a8684612c50565b90506000805b600c54811015611bc657336001600160a01b0316600c8281548110611b9157611b9161357d565b6000918252602090912001546001600160a01b031603611bb45760019150611bc6565b80611bbe8161352d565b915050611b6a565b50801515600003611c1457600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b031916331790555b611c1d8261108f565b611c9a5760405162461bcd60e51b815260206004820152604260248201527f6c6f616e45746865723a206e6f7420656e6f756768206c69717569646974792060448201527f6f722063616e277420626f72726f77206c696d697465642045544820616d6f756064820152611b9d60f21b608482015260a401610973565b611ca2613051565b338082526040808301859052606083018690526000918252600960209081528183205460e085015261010084018390526001600160a01b038f168185018190528352600e81528183208e84529052902060038101549054611d0e6064611d088785612ec9565b90612f4b565b6080840152611d1d81426136a0565b60a0840190815260c08401828152336000818152600a602090815260408083206009808452828520805486529184528285208b5181546001600160a01b039182166001600160a01b0319918216178355868e0151600184018054919093169116179055928b0151600284015560608b0151600384015560808b01516004840155965160058301559451600682015560e089015160078201556101008901516008909101805491151560ff19909216919091179055918152929052805491611de38361352d565b9091555050604051339086156108fc029087906000818181858888f19350505050158015611e15573d6000803e3d6000fd5b50336001600160a01b03167f6ec47479b666ea2a5d4da977be8256c787c5724698308bd3c981e7dcd2285fa48460400151856060015186608001518760a001518860c00151604051611e89959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a25050600180555050505050505050505050505050505050565b6000546001600160a01b03163314611ed45760405162461bcd60e51b815260040161097390613474565b6001600160a01b038216611efa5760405162461bcd60e51b8152600401610973906134a9565b6000611f05836110c9565b905080611f245760405162461bcd60e51b815260040161097390613546565b6001600160a01b03831660009081526008602090815260409091208351611f4d92850190612fec565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f588383604051611f7f9291906136b3565b60405180910390a1505050565b6006546001600160a01b03163314611fb65760405162461bcd60e51b815260040161097390613593565b6000611fc1826110c9565b9050806120aa576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120339190613674565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015612083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a791906135d7565b50505b5050565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff8111156120e3576120e36130fb565b60405190808252806020026020018201604052801561211c57816020015b612109613051565b8152602001906001900390816121015790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526121e25750428160a00151105b1561220657808383815181106121fa576121fa61357d565b60200260200101819052505b50806122118161352d565b915050612122565b6000546001600160a01b031633148061223c57506006546001600160a01b031633145b6122805760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610973565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f191906135d7565b505050565b600c818154811061092f57600080fd5b6002600154036123585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610973565b60026001908155336000818152600a6020908152604080832086845290915290209182015482546001600160a01b03918216929116146123e55760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610973565b600882015460ff161561243a5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610973565b816005015442111561248e5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a2065786365656420647565206461746500000000000000006044820152606401610973565b81600401543410156124e25760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610973565b60088201805460ff19166001179055600382015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b0382169063a9059cbb906044016020604051808303816000875af1158015612544573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256891906135d7565b6125da5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610973565b6008820154600483015460038401546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b60008080805b600b5481101561268c57600061266a600b83815481106113405761134061357d565b90506126768482612ddc565b93505080806126849061352d565b915050612648565b508115612697575060015b92915050565b6005546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa1580156126eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270f9190613674565b90506004548111156110c05750600192915050565b6000546001600160a01b031633148061274757506006546001600160a01b031633145b61278b5760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610973565b47808211156127f45760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610973565b6040513390819084156108fc029085906000818181858888f193505050501580156120a7573d6000803e3d6000fd5b6008602052816000526040600020818154811061283f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0382166000908152600960205260408120546060919067ffffffffffffffff811115612890576128906130fb565b6040519080825280602002602001820160405280156128c957816020015b6128b6613051565b8152602001906001900390816128ae5790505b50905060005b6001600160a01b038516600090815260096020526040902054811015611127576001600160a01b038086166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16158015610100830181905261298f5750428160a00151105b801561299e57508060a0015185105b156129c257808383815181106129b6576129b661357d565b60200260200101819052505b50806129cd8161352d565b9150506128cf565b6001600160a01b038316600090815260086020908152604080832080548251818502810185019093528083528493830182828015612a3c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a1e575b505050505090506000815167ffffffffffffffff811115612a5f57612a5f6130fb565b604051908082528060200260200182016040528015612a88578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631f00ca7490612ada90879086906004016136d7565b600060405180830381865afa158015612af7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b1f91908101906136f0565b90506000612b5b6064612b558885600081518110612b3f57612b3f61357d565b6020026020010151612f4b90919063ffffffff16565b90612ec9565b979650505050505050565b6000546001600160a01b03163314612b905760405162461bcd60e51b815260040161097390613474565b6001600160a01b038116612bf55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610973565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600090815260086020908152604080832080548251818502810185019093528083528493830182828015612cb757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c99575b505050505090506000815167ffffffffffffffff811115612cda57612cda6130fb565b604051908082528060200260200182016040528015612d03578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f90612d5590879086906004016136d7565b600060405180830381865afa158015612d72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d9a91908101906136f0565b90506000612b5b6064611d08888560018851612db6919061368d565b81518110612dc657612dc661357d565b6020026020010151612ec990919063ffffffff16565b600080612de983856136a0565b905083811015612e3b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610973565b9392505050565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af1158015612e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec091906135d7565b95945050505050565b600082600003612edb57506000612697565b6000612ee78385613776565b905082612ef485836137a3565b14612e3b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610973565b6000612e3b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183612fa95760405162461bcd60e51b815260040161097391906137b7565b506000612fb684866137a3565b9050612fc28486613805565b612fcc8286613776565b612fd691906136a0565b8514612fe457612fe4613819565b949350505050565b828054828255906000526020600020908101928215613041579160200282015b8281111561304157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061300c565b5061304d9291506130b1565b5090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5b8082111561304d57600081556001016130b2565b6000602082840312156130d857600080fd5b5035919050565b80356001600160a01b03811681146130f657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561313a5761313a6130fb565b604052919050565b600067ffffffffffffffff82111561315c5761315c6130fb565b5060051b60200190565b600082601f83011261317757600080fd5b8135602061318c61318783613142565b613111565b82815260059290921b840181019181810190868411156131ab57600080fd5b8286015b848110156131cd576131c0816130df565b83529183019183016131af565b509695505050505050565b60008060008060008060c087890312156131f157600080fd5b6131fa876130df565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561323257600080fd5b61323e89828a01613166565b9150509295509295509295565b60008060008060008060c0878903121561326457600080fd5b61326d876130df565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080604083850312156132a857600080fd5b50508035926020909101359150565b6000602082840312156132c957600080fd5b612e3b826130df565b602080825282518282018190526000919060409081850190868401855b8281101561336b57815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101009081015115159085015261012090930192908501906001016132ef565b5091979650505050505050565b801515811461338657600080fd5b50565b60008060006060848603121561339e57600080fd5b6133a7846130df565b92506020840135915060408401356133be81613378565b809150509250925092565b600080604083850312156133dc57600080fd5b6133e5836130df565b946020939093013593505050565b60008060006060848603121561340857600080fd5b613411846130df565b95602085013595506040909401359392505050565b6000806040838503121561343957600080fd5b613442836130df565b9150602083013567ffffffffffffffff81111561345e57600080fd5b61346a85828601613166565b9150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161353f5761353f613517565b5060010190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6000602082840312156135e957600080fd5b8151612e3b81613378565b600081518084526020808501945080840160005b8381101561362d5781516001600160a01b031687529582019590820190600101613608565b509495945050505050565b85815284602082015260a06040820152600061365760a08301866135f4565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561368657600080fd5b5051919050565b8181038181111561269757612697613517565b8082018082111561269757612697613517565b6001600160a01b0383168152604060208201819052600090612fe4908301846135f4565b828152604060208201526000612fe460408301846135f4565b6000602080838503121561370357600080fd5b825167ffffffffffffffff81111561371a57600080fd5b8301601f8101851361372b57600080fd5b805161373961318782613142565b81815260059190911b8201830190838101908783111561375857600080fd5b928401925b82841015612b5b5783518252928401929084019061375d565b808202811582820484141761269757612697613517565b634e487b7160e01b600052601260045260246000fd5b6000826137b2576137b261378d565b500490565b600060208083528351808285015260005b818110156137e4578581018301518582016040015282016137c8565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826138145761381461378d565b500690565b634e487b7160e01b600052600160045260246000fdfea26469706673582212206c0cbcf552323b1621e997c4d0a53688cbcf3d54515338adda293f2f5126b1c564736f6c63430008110033000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec070000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000024f2beb1aa000
Deployed Bytecode
0x6080604052600436106102605760003560e01c80637eff539411610144578063a846c2fd116100b6578063e31323ac1161007a578063e31323ac14610807578063e39f9f2a1461081d578063e7177ece1461089f578063ed921a14146108bf578063f2fde38b146108df578063f8915391146108ff57600080fd5b8063a846c2fd1461077f578063acc4565914610792578063b8118bbe146107a7578063c311d049146107c7578063db8bb3a1146107e757600080fd5b80639e8c708e116101085780639e8c708e146106d45780639f4749af146106f4578063a007945e1461070a578063a12af8961461071f578063a4c3b0911461073f578063a803180d1461075f57600080fd5b80637eff539414610578578063888eb1ee146105985780638a918694146105b85780638da5cb5b146105e557806398c61c371461060357600080fd5b806344b8044a116101dd578063570ca735116101a1578063570ca735146104ce57806360ab8988146104ee57806367f7b06f1461050e5780636df9d3791461052e578063715018a614610543578063769db6151461055857600080fd5b806344b8044a1461041b5780634766162c1461044b5780634c0a79fb1461046b5780634d0047ee146104985780634e509f74146104b857600080fd5b8063293308f111610224578063293308f11461037757806329605e77146103a55780632cd1d250146103c55780632f759d91146103db57806335c7e9251461040857600080fd5b80631694505e146102a4578063172c48c7146102f55780631fffb6981461031557806324350de314610337578063274dca921461035757600080fd5b3661029f57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b3480156102b057600080fd5b506102d87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030157600080fd5b506102d86103103660046130c6565b61091f565b34801561032157600080fd5b506103356103303660046131d8565b610949565b005b34801561034357600080fd5b5061033561035236600461324b565b610bd3565b34801561036357600080fd5b50610335610372366004613295565b610d78565b34801561038357600080fd5b506103976103923660046132b7565b610dad565b6040519081526020016102ec565b3480156103b157600080fd5b506103356103c03660046132b7565b610e9e565b3480156103d157600080fd5b5061039760045481565b3480156103e757600080fd5b506103fb6103f63660046132b7565b610f39565b6040516102ec91906132d2565b34801561041457600080fd5b5047610397565b34801561042757600080fd5b5061043b6104363660046130c6565b61108f565b60405190151581526020016102ec565b34801561045757600080fd5b5061043b6104663660046132b7565b6110c9565b34801561047757600080fd5b506103976104863660046132b7565b60096020526000908152604090205481565b3480156104a457600080fd5b506005546102d8906001600160a01b031681565b3480156104c457600080fd5b5061039760035481565b3480156104da57600080fd5b506006546102d8906001600160a01b031681565b3480156104fa57600080fd5b50610335610509366004613389565b61112f565b34801561051a57600080fd5b506103356105293660046133c9565b61124b565b34801561053a57600080fd5b506103356112f1565b34801561054f57600080fd5b50610335611550565b34801561056457600080fd5b506103fb6105733660046132b7565b6115c4565b34801561058457600080fd5b506103356105933660046133f3565b61172f565b3480156105a457600080fd5b506103356105b3366004613426565b611eaa565b3480156105c457600080fd5b506103976105d33660046132b7565b600d6020526000908152604090205481565b3480156105f157600080fd5b506000546001600160a01b03166102d8565b34801561060f57600080fd5b5061068361061e3660046133c9565b600a6020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff1689565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352608086019190915260a085015260c084015260e08301521515610100820152610120016102ec565b3480156106e057600080fd5b506103356106ef3660046132b7565b611f8c565b34801561070057600080fd5b5061039760025481565b34801561071657600080fd5b50600b54610397565b34801561072b57600080fd5b506103fb61073a3660046132b7565b6120ae565b34801561074b57600080fd5b5061033561075a3660046133c9565b612219565b34801561076b57600080fd5b506102d861077a3660046130c6565b6122f6565b61033561078d3660046130c6565b612306565b34801561079e57600080fd5b5061043b612642565b3480156107b357600080fd5b5061043b6107c23660046132b7565b61269d565b3480156107d357600080fd5b506103356107e23660046130c6565b612724565b3480156107f357600080fd5b506102d86108023660046133c9565b612823565b34801561081357600080fd5b5061039760075481565b34801561082957600080fd5b506108756108383660046133c9565b600e602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016102ec565b3480156108ab57600080fd5b506103fb6108ba3660046133c9565b61285b565b3480156108cb57600080fd5b506103976108da3660046133f3565b6129d5565b3480156108eb57600080fd5b506103356108fa3660046132b7565b612b66565b34801561090b57600080fd5b5061039761091a3660046133f3565b612c50565b600b818154811061092f57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461097c5760405162461bcd60e51b815260040161097390613474565b60405180910390fd5b6001600160a01b0386166109a25760405162461bcd60e51b8152600401610973906134a9565b606484106109c25760405162461bcd60e51b8152600401610973906134e0565b606483106109e25760405162461bcd60e51b8152600401610973906134e0565b6064821015610a2d5760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610973565b6000610a38876110c9565b905080610aa957600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03891690811790915560009081526008602090815260409091208351610aa792850190612fec565b505b610add6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b86815260208082018781526040808401888152606085018881526000608087018181526001600160a01b038f16808352600d8089528684208054600e8b528886208187528b529785208b518155985160018a0155955160028901559351600388015590516004909601805460ff191696151596909617909555938452909352825490929091610b6b8361352d565b9091555050604080516001600160a01b038b168152602081018a905290810188905260608101879052608081018690527f4cb98f3b8ae6aaa3e3a10d19c96b00eac0ed7b5b7415a40edf7583c26c24914b9060a00160405180910390a1505050505050505050565b6000546001600160a01b03163314610bfd5760405162461bcd60e51b815260040161097390613474565b6001600160a01b038616610c235760405162461bcd60e51b8152600401610973906134a9565b6000610c2e876110c9565b905080610c4d5760405162461bcd60e51b815260040161097390613546565b6001600160a01b0387166000908152600d6020526040902054808710610cae5760405162461bcd60e51b81526020600482015260166024820152750eae0c8c2e8ca74409cde40ecc2d8d2c840d2dcc8caf60531b6044820152606401610973565b60648510610cce5760405162461bcd60e51b8152600401610973906134e0565b60648410610cee5760405162461bcd60e51b8152600401610973906134e0565b6064831015610d395760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610973565b50506001600160a01b03959095166000908152600e60209081526040808320968352959052939093209182556001820155600281019190915560030155565b6000546001600160a01b03163314610da25760405162461bcd60e51b815260040161097390613474565b600291909155600355565b60008060005b600c54811015610e97576000600c8281548110610dd257610dd261357d565b60009182526020822001546007546001600160a01b039091169250610df890839061285b565b905060005b8151811015610e8157818181518110610e1857610e1861357d565b6020026020010151602001516001600160a01b0316876001600160a01b031603610e6f57610e6c828281518110610e5157610e5161357d565b60200260200101516060015186612ddc90919063ffffffff16565b94505b80610e798161352d565b915050610dfd565b5050508080610e8f9061352d565b915050610db3565b5092915050565b6000546001600160a01b03163314610ec85760405162461bcd60e51b815260040161097390613474565b6001600160a01b038116610f175760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610973565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff811115610f6e57610f6e6130fb565b604051908082528060200260200182016040528015610fa757816020015b610f94613051565b815260200190600190039081610f8c5790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16151561010082015282518390839081106110715761107161357d565b602002602001018190525080806110879061352d565b915050610fad565b600254600090479083118015906110a7575060035483115b80156110b257508083105b156110c05750600192915050565b50600092915050565b600b5460009081805b8281101561112757600b81815481106110ed576110ed61357d565b6000918252602090912001546001600160a01b03908116908616036111155760019150611127565b8061111f8161352d565b9150506110d2565b509392505050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260040161097390613474565b6001600160a01b03831661117f5760405162461bcd60e51b8152600401610973906134a9565b600061118a846110c9565b9050806111a95760405162461bcd60e51b815260040161097390613546565b6001600160a01b0384166000908152600d60205260409020548084106112115760405162461bcd60e51b815260206004820152601a60248201527f7365743a204e6f2076616c6964206c6f616e20706f6f6c2069640000000000006044820152606401610973565b50506001600160a01b03929092166000908152600e6020908152604080832093835292905220600401805460ff1916911515919091179055565b6000546001600160a01b031633146112755760405162461bcd60e51b815260040161097390613474565b6001600160a01b0382166112cb5760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610973565b600580546001600160a01b0319166001600160a01b039390931692909217909155600455565b6006546001600160a01b0316331461131b5760405162461bcd60e51b815260040161097390613593565b60005b600b5481101561154957600061135a600b83815481106113405761134061357d565b6000918252602090912001546001600160a01b0316610dad565b9050801561153657600b82815481106113755761137561357d565b60009182526020909120015460405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156113f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141591906135d7565b50600060086000600b858154811061142f5761142f61357d565b60009182526020808320909101546001600160a01b031683528281019390935260409182019020805482518185028101850190935280835291929091908301828280156114a557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611487575b505060405163791ac94760e01b8152939450506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169263791ac947925061150291508590600090869030904290600401613638565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b50505050505b50806115418161352d565b91505061131e565b5042600755565b6000546001600160a01b0316331461157a5760405162461bcd60e51b815260040161097390613474565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff8111156115f9576115f96130fb565b60405190808252806020026020018201604052801561163257816020015b61161f613051565b8152602001906001900390816116175790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526116f85750428160a00151115b1561171c57808383815181106117105761171061357d565b60200260200101819052505b50806117278161352d565b915050611638565b6002600154036117815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610973565b60026001556000611791846110c9565b9050806117e05760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204e6f20636f6c6c61746572616c20746f6b656e00006044820152606401610973565b6001600160a01b0384166000908152600d602052604090205482908590859081811161184e5760405162461bcd60e51b815260206004820152601b60248201527f6c6f616e45746865723a206e6f2076616c6964206c6f616e20496400000000006044820152606401610973565b6001600160a01b0388166000908152600e602090815260408083208a845290915290206004015460ff16156118c55760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610973565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561190c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119309190613674565b905084811161198d5760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610973565b60006119983361269d565b9050600081156119ce576001600160a01b0386166000908152600e602090815260408083208884529091529020600201546119f6565b6001600160a01b0386166000908152600e602090815260408083208884529091529020600101545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a649190613674565b9050611a7133888a612e42565b611adc5760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610973565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b479190613674565b90506000611b55838361368d565b90506000611b648a8684612c50565b90506000805b600c54811015611bc657336001600160a01b0316600c8281548110611b9157611b9161357d565b6000918252602090912001546001600160a01b031603611bb45760019150611bc6565b80611bbe8161352d565b915050611b6a565b50801515600003611c1457600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b031916331790555b611c1d8261108f565b611c9a5760405162461bcd60e51b815260206004820152604260248201527f6c6f616e45746865723a206e6f7420656e6f756768206c69717569646974792060448201527f6f722063616e277420626f72726f77206c696d697465642045544820616d6f756064820152611b9d60f21b608482015260a401610973565b611ca2613051565b338082526040808301859052606083018690526000918252600960209081528183205460e085015261010084018390526001600160a01b038f168185018190528352600e81528183208e84529052902060038101549054611d0e6064611d088785612ec9565b90612f4b565b6080840152611d1d81426136a0565b60a0840190815260c08401828152336000818152600a602090815260408083206009808452828520805486529184528285208b5181546001600160a01b039182166001600160a01b0319918216178355868e0151600184018054919093169116179055928b0151600284015560608b0151600384015560808b01516004840155965160058301559451600682015560e089015160078201556101008901516008909101805491151560ff19909216919091179055918152929052805491611de38361352d565b9091555050604051339086156108fc029087906000818181858888f19350505050158015611e15573d6000803e3d6000fd5b50336001600160a01b03167f6ec47479b666ea2a5d4da977be8256c787c5724698308bd3c981e7dcd2285fa48460400151856060015186608001518760a001518860c00151604051611e89959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a25050600180555050505050505050505050505050505050565b6000546001600160a01b03163314611ed45760405162461bcd60e51b815260040161097390613474565b6001600160a01b038216611efa5760405162461bcd60e51b8152600401610973906134a9565b6000611f05836110c9565b905080611f245760405162461bcd60e51b815260040161097390613546565b6001600160a01b03831660009081526008602090815260409091208351611f4d92850190612fec565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f588383604051611f7f9291906136b3565b60405180910390a1505050565b6006546001600160a01b03163314611fb65760405162461bcd60e51b815260040161097390613593565b6000611fc1826110c9565b9050806120aa576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120339190613674565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015612083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a791906135d7565b50505b5050565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff8111156120e3576120e36130fb565b60405190808252806020026020018201604052801561211c57816020015b612109613051565b8152602001906001900390816121015790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526121e25750428160a00151105b1561220657808383815181106121fa576121fa61357d565b60200260200101819052505b50806122118161352d565b915050612122565b6000546001600160a01b031633148061223c57506006546001600160a01b031633145b6122805760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610973565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f191906135d7565b505050565b600c818154811061092f57600080fd5b6002600154036123585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610973565b60026001908155336000818152600a6020908152604080832086845290915290209182015482546001600160a01b03918216929116146123e55760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610973565b600882015460ff161561243a5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610973565b816005015442111561248e5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a2065786365656420647565206461746500000000000000006044820152606401610973565b81600401543410156124e25760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610973565b60088201805460ff19166001179055600382015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b0382169063a9059cbb906044016020604051808303816000875af1158015612544573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256891906135d7565b6125da5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610973565b6008820154600483015460038401546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b60008080805b600b5481101561268c57600061266a600b83815481106113405761134061357d565b90506126768482612ddc565b93505080806126849061352d565b915050612648565b508115612697575060015b92915050565b6005546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa1580156126eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270f9190613674565b90506004548111156110c05750600192915050565b6000546001600160a01b031633148061274757506006546001600160a01b031633145b61278b5760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610973565b47808211156127f45760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610973565b6040513390819084156108fc029085906000818181858888f193505050501580156120a7573d6000803e3d6000fd5b6008602052816000526040600020818154811061283f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0382166000908152600960205260408120546060919067ffffffffffffffff811115612890576128906130fb565b6040519080825280602002602001820160405280156128c957816020015b6128b6613051565b8152602001906001900390816128ae5790505b50905060005b6001600160a01b038516600090815260096020526040902054811015611127576001600160a01b038086166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16158015610100830181905261298f5750428160a00151105b801561299e57508060a0015185105b156129c257808383815181106129b6576129b661357d565b60200260200101819052505b50806129cd8161352d565b9150506128cf565b6001600160a01b038316600090815260086020908152604080832080548251818502810185019093528083528493830182828015612a3c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a1e575b505050505090506000815167ffffffffffffffff811115612a5f57612a5f6130fb565b604051908082528060200260200182016040528015612a88578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690631f00ca7490612ada90879086906004016136d7565b600060405180830381865afa158015612af7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b1f91908101906136f0565b90506000612b5b6064612b558885600081518110612b3f57612b3f61357d565b6020026020010151612f4b90919063ffffffff16565b90612ec9565b979650505050505050565b6000546001600160a01b03163314612b905760405162461bcd60e51b815260040161097390613474565b6001600160a01b038116612bf55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610973565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600090815260086020908152604080832080548251818502810185019093528083528493830182828015612cb757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c99575b505050505090506000815167ffffffffffffffff811115612cda57612cda6130fb565b604051908082528060200260200182016040528015612d03578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f90612d5590879086906004016136d7565b600060405180830381865afa158015612d72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d9a91908101906136f0565b90506000612b5b6064611d08888560018851612db6919061368d565b81518110612dc657612dc661357d565b6020026020010151612ec990919063ffffffff16565b600080612de983856136a0565b905083811015612e3b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610973565b9392505050565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af1158015612e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec091906135d7565b95945050505050565b600082600003612edb57506000612697565b6000612ee78385613776565b905082612ef485836137a3565b14612e3b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610973565b6000612e3b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183612fa95760405162461bcd60e51b815260040161097391906137b7565b506000612fb684866137a3565b9050612fc28486613805565b612fcc8286613776565b612fd691906136a0565b8514612fe457612fe4613819565b949350505050565b828054828255906000526020600020908101928215613041579160200282015b8281111561304157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061300c565b5061304d9291506130b1565b5090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5b8082111561304d57600081556001016130b2565b6000602082840312156130d857600080fd5b5035919050565b80356001600160a01b03811681146130f657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561313a5761313a6130fb565b604052919050565b600067ffffffffffffffff82111561315c5761315c6130fb565b5060051b60200190565b600082601f83011261317757600080fd5b8135602061318c61318783613142565b613111565b82815260059290921b840181019181810190868411156131ab57600080fd5b8286015b848110156131cd576131c0816130df565b83529183019183016131af565b509695505050505050565b60008060008060008060c087890312156131f157600080fd5b6131fa876130df565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561323257600080fd5b61323e89828a01613166565b9150509295509295509295565b60008060008060008060c0878903121561326457600080fd5b61326d876130df565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080604083850312156132a857600080fd5b50508035926020909101359150565b6000602082840312156132c957600080fd5b612e3b826130df565b602080825282518282018190526000919060409081850190868401855b8281101561336b57815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101009081015115159085015261012090930192908501906001016132ef565b5091979650505050505050565b801515811461338657600080fd5b50565b60008060006060848603121561339e57600080fd5b6133a7846130df565b92506020840135915060408401356133be81613378565b809150509250925092565b600080604083850312156133dc57600080fd5b6133e5836130df565b946020939093013593505050565b60008060006060848603121561340857600080fd5b613411846130df565b95602085013595506040909401359392505050565b6000806040838503121561343957600080fd5b613442836130df565b9150602083013567ffffffffffffffff81111561345e57600080fd5b61346a85828601613166565b9150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161353f5761353f613517565b5060010190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6000602082840312156135e957600080fd5b8151612e3b81613378565b600081518084526020808501945080840160005b8381101561362d5781516001600160a01b031687529582019590820190600101613608565b509495945050505050565b85815284602082015260a06040820152600061365760a08301866135f4565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561368657600080fd5b5051919050565b8181038181111561269757612697613517565b8082018082111561269757612697613517565b6001600160a01b0383168152604060208201819052600090612fe4908301846135f4565b828152604060208201526000612fe460408301846135f4565b6000602080838503121561370357600080fd5b825167ffffffffffffffff81111561371a57600080fd5b8301601f8101851361372b57600080fd5b805161373961318782613142565b81815260059190911b8201830190838101908783111561375857600080fd5b928401925b82841015612b5b5783518252928401929084019061375d565b808202811582820484141761269757612697613517565b634e487b7160e01b600052601260045260246000fd5b6000826137b2576137b261378d565b500490565b600060208083528351808285015260005b818110156137e4578581018301518582016040015282016137c8565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826138145761381461378d565b500690565b634e487b7160e01b600052600160045260246000fdfea26469706673582212206c0cbcf552323b1621e997c4d0a53688cbcf3d54515338adda293f2f5126b1c564736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec070000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000024f2beb1aa000
-----Decoded View---------------
Arg [0] : _nativeTokenAddress (address): 0xe13879194578C6F1A591a96C45B65022c43CEc07
Arg [1] : _routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _nativeMin (uint256): 650000000000000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec07
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 00000000000000000000000000000000000000000000000000024f2beb1aa000
Deployed Bytecode Sourcemap
16876:18760:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19675:31;;;19684:10;188:51:1;;19696:9:0;270:2:1;255:18;;248:34;19675:31:0;;161:18:1;19675:31:0;;;;;;;16876:18760;;;;;18013:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;483:32:1;;;465:51;;453:2;438:18;18013:51:0;;;;;;;;17810:33;;;;;;;;;;-1:-1:-1;17810:33:0;;;;;:::i;:::-;;:::i;19722:1414::-;;;;;;;;;;-1:-1:-1;19722:1414:0;;;;;:::i;:::-;;:::i;:::-;;21144:1113;;;;;;;;;;-1:-1:-1;21144:1113:0;;;;;:::i;:::-;;:::i;24251:161::-;;;;;;;;;;-1:-1:-1;24251:161:0;;;;;:::i;:::-;;:::i;32430:679::-;;;;;;;;;;-1:-1:-1;32430:679:0;;;;;:::i;:::-;;:::i;:::-;;;4197:25:1;;;4185:2;4170:18;32430:679:0;4051:177:1;34423:167:0;;;;;;;;;;-1:-1:-1;34423:167:0;;;;;:::i;:::-;;:::i;17024:29::-;;;;;;;;;;;;;;;;30457:374;;;;;;;;;;-1:-1:-1;30457:374:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35527:106::-;;;;;;;;;;-1:-1:-1;35604:21:0;35527:106;;25479:296;;;;;;;;;;-1:-1:-1;25479:296:0;;;;;:::i;:::-;;:::i;:::-;;;5951:14:1;;5944:22;5926:41;;5914:2;5899:18;25479:296:0;5786:187:1;23351:358:0;;;;;;;;;;-1:-1:-1;23351:358:0;;;;;:::i;:::-;;:::i;17681:49::-;;;;;;;;;;-1:-1:-1;17681:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;17060:33;;;;;;;;;;-1:-1:-1;17060:33:0;;;;-1:-1:-1;;;;;17060:33:0;;;16991:25;;;;;;;;;;;;;;;;17100:23;;;;;;;;;;-1:-1:-1;17100:23:0;;;;-1:-1:-1;;;;;17100:23:0;;;22746:597;;;;;;;;;;-1:-1:-1;22746:597:0;;;;;:::i;:::-;;:::i;23977:266::-;;;;;;;;;;-1:-1:-1;23977:266:0;;;;;:::i;:::-;;:::i;33562:853::-;;;;;;;;;;;;;:::i;13698:148::-;;;;;;;;;;;;;:::i;30839:485::-;;;;;;;;;;-1:-1:-1;30839:485:0;;;;;:::i;:::-;;:::i;26124:3204::-;;;;;;;;;;-1:-1:-1;26124:3204:0;;;;;:::i;:::-;;:::i;22265:473::-;;;;;;;;;;-1:-1:-1;22265:473:0;;;;;:::i;:::-;;:::i;17883:49::-;;;;;;;;;;-1:-1:-1;17883:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;13056:79;;;;;;;;;;-1:-1:-1;13094:7:0;13121:6;-1:-1:-1;;;;;13121:6:0;13056:79;;17737:64;;;;;;;;;;-1:-1:-1;17737:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17737:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7923:15:1;;;7905:34;;7975:15;;;;7970:2;7955:18;;7948:43;8007:18;;;8000:34;;;;8065:2;8050:18;;8043:34;;;;8108:3;8093:19;;8086:35;;;;7885:3;8137:19;;8130:35;8196:3;8181:19;;8174:35;8240:3;8225:19;;8218:35;8297:14;8290:22;8284:3;8269:19;;8262:51;7854:3;7839:19;17737:64:0;7502:817:1;35114:290:0;;;;;;;;;;-1:-1:-1;35114:290:0;;;;;:::i;:::-;;:::i;16958:25::-;;;;;;;;;;;;;;;;35412:107;;;;;;;;;;-1:-1:-1;35488:16:0;:23;35412:107;;31332:485;;;;;;;;;;-1:-1:-1;31332:485:0;;;;;:::i;:::-;;:::i;34949:157::-;;;;;;;;;;-1:-1:-1;34949:157:0;;;;;:::i;:::-;;:::i;17850:26::-;;;;;;;;;;-1:-1:-1;17850:26:0;;;;;:::i;:::-;;:::i;29336:1113::-;;;;;;:::i;:::-;;:::i;33117:437::-;;;;;;;;;;;;;:::i;23717:252::-;;;;;;;;;;-1:-1:-1;23717:252:0;;;;;:::i;:::-;;:::i;34598:343::-;;;;;;;;;;-1:-1:-1;34598:343:0;;;;;:::i;:::-;;:::i;17628:46::-;;;;;;;;;;-1:-1:-1;17628:46:0;;;;;:::i;:::-;;:::i;17596:25::-;;;;;;;;;;;;;;;;17939:65;;;;;;;;;;-1:-1:-1;17939:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8577:25:1;;;8633:2;8618:18;;8611:34;;;;8661:18;;;8654:34;;;;8719:2;8704:18;;8697:34;8775:14;8768:22;8762:3;8747:19;;8740:51;8564:3;8549:19;17939:65:0;8324:473:1;31825:597:0;;;;;;;;;;-1:-1:-1;31825:597:0;;;;;:::i;:::-;;:::i;24494:438::-;;;;;;;;;;-1:-1:-1;24494:438:0;;;;;:::i;:::-;;:::i;14001:281::-;;;;;;;;;;-1:-1:-1;14001:281:0;;;;;:::i;:::-;;:::i;25008:463::-;;;;;;;;;;-1:-1:-1;25008:463:0;;;;;:::i;:::-;;:::i;17810:33::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17810:33:0;;-1:-1:-1;17810:33:0;:::o;19722:1414::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;19993:30:0;::::1;19971:111;;;;-1:-1:-1::0;;;19971:111:0::1;;;;;;;:::i;:::-;20114:3;20101:10;:16;20093:55;;;;-1:-1:-1::0;;;20093:55:0::1;;;;;;;:::i;:::-;20186:3;20167:16;:22;20159:61;;;;-1:-1:-1::0;;;20159:61:0::1;;;;;;;:::i;:::-;20253:3;20239:10;:17;;20231:53;;;::::0;-1:-1:-1;;;20231:53:0;;10080:2:1;20231:53:0::1;::::0;::::1;10062:21:1::0;10119:2;10099:18;;;10092:30;-1:-1:-1;;;10138:18:1;;;10131:53;10201:18;;20231:53:0::1;9878:347:1::0;20231:53:0::1;20297:15;20315:35;20333:16;20315:17;:35::i;:::-;20297:53;;20366:10;20361:133;;20393:16;:39:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;20393:39:0::1;-1:-1:-1::0;;;;;20393:39:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20447:27:0;;;:9:::1;20393:39;20447:27:::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;20361:133;20504:27;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20504:27:0::1;20542:40:::0;;;20593:21:::1;::::0;;::::1;:34:::0;;;20640:27:::1;::::0;;::::1;:46:::0;;;20697:21:::1;::::0;::::1;:34:::0;;;-1:-1:-1;20742:18:0::1;::::0;::::1;:26:::0;;;-1:-1:-1;;;;;20801:32:0;::::1;::::0;;;:14:::1;:32:::0;;;;;;;;20846:9:::1;:27:::0;;;;;:40;;;;;;;;:54;;;;;;20742:26;20846:54;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;20846:54:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;20911:32;;;;;;:34;;20801:32;;20911:34;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;20963:165:0::1;::::0;;-1:-1:-1;;;;;10779:32:1;;10761:51;;10843:2;10828:18;;10821:34;;;10871:18;;;10864:34;;;10929:2;10914:18;;10907:34;;;10972:3;10957:19;;10950:35;;;20963:165:0::1;::::0;10748:3:1;10733:19;20963:165:0::1;;;;;;;19960:1176;;;19722:1414:::0;;;;;;:::o;21144:1113::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21410:30:0;::::1;21388:111;;;;-1:-1:-1::0;;;21388:111:0::1;;;;;;;:::i;:::-;21510:15;21528:35;21546:16;21528:17;:35::i;:::-;21510:53;;21582:10;21574:50;;;;-1:-1:-1::0;;;21574:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21655:32:0;::::1;21635:17;21655:32:::0;;;:14:::1;:32;::::0;;;;;21706:18;;::::1;21698:53;;;::::0;-1:-1:-1;;;21698:53:0;;11554:2:1;21698:53:0::1;::::0;::::1;11536:21:1::0;11593:2;11573:18;;;11566:30;-1:-1:-1;;;11612:18:1;;;11605:52;11674:18;;21698:53:0::1;11352:346:1::0;21698:53:0::1;21783:3;21770:10;:16;21762:55;;;;-1:-1:-1::0;;;21762:55:0::1;;;;;;;:::i;:::-;21855:3;21836:16;:22;21828:61;;;;-1:-1:-1::0;;;21828:61:0::1;;;;;;;:::i;:::-;21922:3;21908:10;:17;;21900:53;;;::::0;-1:-1:-1;;;21900:53:0;;10080:2:1;21900:53:0::1;::::0;::::1;10062:21:1::0;10119:2;10099:18;;;10092:30;-1:-1:-1;;;10138:18:1;;;10131:53;10201:18;;21900:53:0::1;9878:347:1::0;21900:53:0::1;-1:-1:-1::0;;;;;;;21966:27:0;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;;;;;;;;;:64;;;22041:45:::1;::::0;::::1;:58:::0;22110:51:::1;::::0;::::1;:70:::0;;;;22191:45:::1;;:58:::0;21144:1113::o;24251:161::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;24345:10:::1;:24:::0;;;;24380:10:::1;:24:::0;24251:161::o;32430:679::-;32492:7;32512:23;32551:9;32546:523;32570:9;:16;32566:20;;32546:523;;;32608:12;32623:9;32633:1;32623:12;;;;;;;;:::i;:::-;;;;;;;;;;32747:10;;-1:-1:-1;;;;;32623:12:0;;;;-1:-1:-1;32682:90:0;;32623:12;;32682:23;:90::i;:::-;32650:122;;32792:9;32787:271;32811:8;:15;32807:1;:19;32787:271;;;32866:8;32875:1;32866:11;;;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1;;;;;32856:27:0;:6;-1:-1:-1;;;;;32856:27:0;;32852:191;;32926:97;32972:8;32981:1;32972:11;;;;;;;;:::i;:::-;;;;;;;:28;;;32926:15;:19;;:97;;;;:::i;:::-;32908:115;;32852:191;32828:3;;;;:::i;:::-;;;;32787:271;;;;32593:476;;32588:3;;;;;:::i;:::-;;;;32546:523;;;-1:-1:-1;33086:15:0;32430:679;-1:-1:-1;;32430:679:0:o;34423:167::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34503:22:0;::::1;34495:57;;;::::0;-1:-1:-1;;;34495:57:0;;12037:2:1;34495:57:0::1;::::0;::::1;12019:21:1::0;12076:2;12056:18;;;12049:30;-1:-1:-1;;;12095:18:1;;;12088:52;12157:18;;34495:57:0::1;11835:346:1::0;34495:57:0::1;34563:8;:19:::0;;-1:-1:-1;;;;;;34563:19:0::1;-1:-1:-1::0;;;;;34563:19:0;;;::::1;::::0;;;::::1;::::0;;34423:167::o;30457:374::-;-1:-1:-1;;;;;30647:21:0;;30583:29;30647:21;;;:14;:21;;;;;;30545:20;;30583:29;30615:64;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;30583:96;;30695:9;30690:108;-1:-1:-1;;;;;30714:21:0;;;;;;:14;:21;;;;;;30710:25;;30690:108;;;-1:-1:-1;;;;;30771:12:0;;;;;;;:5;:12;;;;;;;;:15;;;;;;;;;30757:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;;:8;;30784:1;;30757:11;;;;;;:::i;:::-;;;;;;:29;;;;30737:3;;;;;:::i;:::-;;;;30690:108;;25479:296;25627:10;;25544:4;;25580:21;;25616;;;;;:45;;;25651:10;;25641:7;:20;25616:45;:67;;;;;25675:8;25665:7;:18;25616:67;25612:156;;;-1:-1:-1;25707:4:0;;25479:296;-1:-1:-1;;25479:296:0:o;25612:156::-;-1:-1:-1;25751:5:0;;25479:296;-1:-1:-1;;25479:296:0:o;23351:358::-;23445:16;:23;23414:4;;;;23510:167;23534:3;23530:1;:7;23510:167;;;23572:16;23589:1;23572:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23572:19:0;;;23563:28;;;;23559:107;;23622:4;23612:14;;23645:5;;23559:107;23539:3;;;;:::i;:::-;;;;23510:167;;;-1:-1:-1;23694:7:0;23351:358;-1:-1:-1;;;23351:358:0:o;22746:597::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22917:30:0;::::1;22895:111;;;;-1:-1:-1::0;;;22895:111:0::1;;;;;;;:::i;:::-;23017:15;23035:35;23053:16;23035:17;:35::i;:::-;23017:53;;23089:10;23081:50;;;;-1:-1:-1::0;;;23081:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23162:32:0;::::1;23142:17;23162:32:::0;;;:14:::1;:32;::::0;;;;;23213:23;;::::1;23205:62;;;::::0;-1:-1:-1;;;23205:62:0;;12388:2:1;23205:62:0::1;::::0;::::1;12370:21:1::0;12427:2;12407:18;;;12400:30;12466:28;12446:18;;;12439:56;12512:18;;23205:62:0::1;12186:350:1::0;23205:62:0::1;-1:-1:-1::0;;;;;;;23278:27:0;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:40;;;;;;;:47:::1;;:57:::0;;-1:-1:-1;;23278:57:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22746:597::o;23977:266::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24100:27:0;::::1;24092:66;;;::::0;-1:-1:-1;;;24092:66:0;;12743:2:1;24092:66:0::1;::::0;::::1;12725:21:1::0;12782:2;12762:18;;;12755:30;12821:28;12801:18;;;12794:56;12867:18;;24092:66:0::1;12541:350:1::0;24092:66:0::1;24169:18;:34:::0;;-1:-1:-1;;;;;;24169:34:0::1;-1:-1:-1::0;;;;;24169:34:0;;;::::1;::::0;;;::::1;::::0;;;24214:14:::1;:21:::0;23977:266::o;33562:853::-;19349:8;;-1:-1:-1;;;;;19349:8:0;19361:10;19349:22;19341:71;;;;-1:-1:-1;;;19341:71:0;;;;;;;:::i;:::-;33620:9:::1;33615:754;33639:16;:23:::0;33635:27;::::1;33615:754;;;33684:19;33706:36;33722:16;33739:1;33722:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;33722:19:0::1;33706:15;:36::i;:::-;33684:58:::0;-1:-1:-1;33761:15:0;;33757:601:::1;;33804:16;33821:1;33804:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;33797:135:::1;::::0;-1:-1:-1;;;33797:135:0;;-1:-1:-1;;;;;33863:15:0::1;206:32:1::0;;33797:135:0::1;::::0;::::1;188:51:1::0;255:18;;;248:34;;;33804:19:0;;::::1;::::0;33797:35:::1;::::0;161:18:1;;33797:135:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33951:21;33975:9;:30;33985:16;34002:1;33985:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;33985:19:0::1;33975:30:::0;;;;::::1;::::0;;;;;;;;;;33951:54;;;;;;::::1;::::0;;;;;;;;;;;;33975:30;;33951:54;;::::1;33975:30:::0;33951:54;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33951:54:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;34024:318:0::1;::::0;-1:-1:-1;;;34024:318:0;;33951:54;;-1:-1:-1;;;;;;;34024:15:0::1;:88;::::0;::::1;::::0;-1:-1:-1;34024:318:0::1;::::0;-1:-1:-1;34139:11:0;;34177:1:::1;::::0;33951:54;;34272:4:::1;::::0;34304:15:::1;::::0;34024:318:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33778:580;33757:601;-1:-1:-1::0;33664:3:0;::::1;::::0;::::1;:::i;:::-;;;;33615:754;;;-1:-1:-1::0;34392:15:0::1;34379:10;:28:::0;33562:853::o;13698:148::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;13805:1:::1;13789:6:::0;;13768:40:::1;::::0;-1:-1:-1;;;;;13789:6:0;;::::1;::::0;13768:40:::1;::::0;13805:1;;13768:40:::1;13836:1;13819:19:::0;;-1:-1:-1;;;;;;13819:19:0::1;::::0;;13698:148::o;30839:485::-;-1:-1:-1;;;;;31018:21:0;;30969:28;31018:21;;;:14;:21;;;;;;30931:20;;30969:28;31000:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;30969:71;;31056:9;31051:241;-1:-1:-1;;;;;31075:21:0;;;;;;:14;:21;;;;;;31071:25;;31051:241;;;-1:-1:-1;;;;;31143:12:0;;;31118:22;31143:12;;;:5;:12;;;;;;;;:15;;;;;;;;;31118:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31177:51;;;31213:15;31195:3;:15;;;:33;31177:51;31173:108;;;31262:3;31249:7;31257:1;31249:10;;;;;;;;:::i;:::-;;;;;;:16;;;;31173:108;-1:-1:-1;31098:3:0;;;;:::i;:::-;;;;31051:241;;26124:3204;15931:1;16527:7;;:19;16519:63;;;;-1:-1:-1;;;16519:63:0;;14806:2:1;16519:63:0;;;14788:21:1;14845:2;14825:18;;;14818:30;14884:33;14864:18;;;14857:61;14935:18;;16519:63:0;14604:355:1;16519:63:0;15931:1;16660:7;:18;26279:15:::1;26297:35;26315:16:::0;26297:17:::1;:35::i;:::-;26279:53;;26351:10;26343:53;;;::::0;-1:-1:-1;;;26343:53:0;;15166:2:1;26343:53:0::1;::::0;::::1;15148:21:1::0;15205:2;15185:18;;;15178:30;15244:32;15224:18;;;15217:60;15294:18;;26343:53:0::1;14964:354:1::0;26343:53:0::1;-1:-1:-1::0;;;;;26572:31:0;::::1;26409:19;26572:31:::0;;;:14:::1;:31;::::0;;;;;26431:12;;26480:16;;26528:11;;26624:24;;::::1;26616:64;;;::::0;-1:-1:-1;;;26616:64:0;;15525:2:1;26616:64:0::1;::::0;::::1;15507:21:1::0;15564:2;15544:18;;;15537:30;15603:29;15583:18;;;15576:57;15650:18;;26616:64:0::1;15323:351:1::0;26616:64:0::1;-1:-1:-1::0;;;;;26714:27:0;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:40;;;;;;;;:47:::1;;::::0;::::1;;26713:48;26691:128;;;::::0;-1:-1:-1;;;26691:128:0;;15881:2:1;26691:128:0::1;::::0;::::1;15863:21:1::0;15920:2;15900:18;;;15893:30;15959:32;15939:18;;;15932:60;16009:18;;26691:128:0::1;15679:354:1::0;26691:128:0::1;26850:45;::::0;-1:-1:-1;;;26850:45:0;;26884:10:::1;26850:45;::::0;::::1;465:51:1::0;26832:15:0::1;::::0;-1:-1:-1;;;;;26850:33:0;::::1;::::0;::::1;::::0;438:18:1;;26850:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26832:63;;26924:11;26914:7;:21;26906:69;;;::::0;-1:-1:-1;;;26906:69:0;;16429:2:1;26906:69:0::1;::::0;::::1;16411:21:1::0;16468:2;16448:18;;;16441:30;16507:34;16487:18;;;16480:62;-1:-1:-1;;;16558:18:1;;;16551:33;16601:19;;26906:69:0::1;16227:399:1::0;26906:69:0::1;26988:13;27004:31;27024:10;27004:19;:31::i;:::-;26988:47;;27046:13;27063:8;27062:9;:143;;-1:-1:-1::0;;;;;27151:26:0;::::1;;::::0;;;:9:::1;:26;::::0;;;;;;;:38;;;;;;;;:54:::1;;::::0;27062:143:::1;;;-1:-1:-1::0;;;;;27087:26:0;::::1;;::::0;;;:9:::1;:26;::::0;;;;;;;:38;;;;;;;;:48:::1;;::::0;27062:143:::1;27240:72;::::0;-1:-1:-1;;;27240:72:0;;27296:4:::1;27240:72;::::0;::::1;465:51:1::0;27046:159:0;;-1:-1:-1;27216:21:0::1;::::0;-1:-1:-1;;;;;27240:33:0;::::1;::::0;::::1;::::0;438:18:1;;27240:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27216:96;;27347:55;27361:10;27373:15;27390:11;27347:13;:55::i;:::-;27325:159;;;::::0;-1:-1:-1;;;27325:159:0;;16833:2:1;27325:159:0::1;::::0;::::1;16815:21:1::0;16872:2;16852:18;;;16845:30;16911:34;16891:18;;;16884:62;-1:-1:-1;;;16962:18:1;;;16955:52;17024:19;;27325:159:0::1;16631:418:1::0;27325:159:0::1;27528:48;::::0;-1:-1:-1;;;27528:48:0;;27570:4:::1;27528:48;::::0;::::1;465:51:1::0;27505:20:0::1;::::0;-1:-1:-1;;;;;27528:33:0;::::1;::::0;::::1;::::0;438:18:1;;27528:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27505:71:::0;-1:-1:-1;27587:23:0::1;27613:28;27628:13:::0;27505:71;27613:28:::1;:::i;:::-;27587:54;;27652:21;27676:115;27715:15;27745:5;27765:15;27676:24;:115::i;:::-;27652:139;;27802:14;27840:9:::0;27835:180:::1;27859:9;:16:::0;27855:20;::::1;27835:180;;;27917:10;-1:-1:-1::0;;;;;27901:26:0::1;:9;27911:1;27901:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27901:12:0::1;:26:::0;27897:107:::1;;27960:4;27948:16;;27983:5;;27897:107;27877:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27835:180;;;-1:-1:-1::0;28029:18:0;::::1;;28042:5;28029:18:::0;28025:77:::1;;28064:9;:26:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;28064:26:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;28064:26:0::1;28079:10;28064:26;::::0;;28025:77:::1;28134:32;28152:13;28134:17;:32::i;:::-;28112:148;;;::::0;-1:-1:-1;;;28112:148:0;;17389:2:1;28112:148:0::1;::::0;::::1;17371:21:1::0;17428:2;17408:18;;;17401:30;17467:34;17447:18;;;17440:62;17538:34;17518:18;;;17511:62;-1:-1:-1;;;17589:19:1;;;17582:33;17632:19;;28112:148:0::1;17187:470:1::0;28112:148:0::1;28271:26;;:::i;:::-;28327:10;28308:29:::0;;;28348:18:::1;::::0;;::::1;:34:::0;;;28393:24:::1;::::0;::::1;:42:::0;;;-1:-1:-1;28463:26:0;;;:14:::1;:26;::::0;;;;;;;28446:14:::1;::::0;::::1;:43:::0;28500:17:::1;::::0;::::1;:25:::0;;;-1:-1:-1;;;;;28536:31:0;::::1;:13:::0;;::::1;:31:::0;;;28598:26;;:9:::1;:26:::0;;;;;:38;;;;;;;:48:::1;::::0;::::1;::::0;28680:65;;28780:37:::1;28813:3;28780:28;28348:34:::0;28598:48;28780:17:::1;:28::i;:::-;:32:::0;::::1;:37::i;:::-;28756:21;::::0;::::1;:61:::0;28850:30:::1;28868:12:::0;28850:15:::1;:30;:::i;:::-;28828:19;::::0;::::1;:52:::0;;;28891:16:::1;::::0;::::1;:31:::0;;;28941:10:::1;-1:-1:-1::0;28935:17:0;;;:5:::1;:17;::::0;;;;;;;28953:14:::1;:26:::0;;;;;;;;28935:45;;;;;;;;:55;;;;-1:-1:-1;;;;;28935:55:0;;::::1;-1:-1:-1::0;;;;;;28935:55:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;28935:55:0;;::::1;::::0;;;::::1;::::0;;29001:26;;;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;29040:43:0::1;::::0;29048:10:::1;::::0;29040:43;::::1;;;::::0;29069:13;;29040:43:::1;::::0;;;29069:13;29048:10;29040:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;29126:10;-1:-1:-1::0;;;;;29099:221:0::1;;29151:7;:18;;;29184:7;:24;;;29223:7;:21;;;29259:7;:19;;;29293:7;:16;;;29099:221;;;;;;;;;18051:25:1::0;;;18107:2;18092:18;;18085:34;;;;18150:2;18135:18;;18128:34;;;;18193:2;18178:18;;18171:34;18236:3;18221:19;;18214:35;18038:3;18023:19;;17792:463;29099:221:0::1;;;;;;;;-1:-1:-1::0;;15887:1:0;16839:22;;-1:-1:-1;;;;;;;;;;;;;;;;;26124:3204:0:o;22265:473::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22412:30:0;::::1;22390:111;;;;-1:-1:-1::0;;;22390:111:0::1;;;;;;;:::i;:::-;22512:15;22530:35;22548:16;22530:17;:35::i;:::-;22512:53;;22584:10;22576:50;;;;-1:-1:-1::0;;;22576:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22637:27:0;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;22690:40;22706:16;22724:5;22690:40;;;;;;;:::i;:::-;;;;;;;;22379:359;22265:473:::0;;:::o;35114:290::-;19349:8;;-1:-1:-1;;;;;19349:8:0;19361:10;19349:22;19341:71;;;;-1:-1:-1;;;19341:71:0;;;;;;;:::i;:::-;35183:15:::1;35201:25;35219:6;35201:17;:25::i;:::-;35183:43;;35242:10;35237:160;;35287:39;::::0;-1:-1:-1;;;35287:39:0;;35320:4:::1;35287:39;::::0;::::1;465:51:1::0;35269:15:0::1;::::0;-1:-1:-1;;;;;35287:24:0;::::1;::::0;::::1;::::0;438:18:1;;35287:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35341:44;::::0;-1:-1:-1;;;35341:44:0;;35365:10:::1;35341:44;::::0;::::1;188:51:1::0;255:18;;;248:34;;;35269:57:0;;-1:-1:-1;;;;;;35341:23:0;::::1;::::0;::::1;::::0;161:18:1;;35341:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35254:143;35237:160;35172:232;35114:290:::0;:::o;31332:485::-;-1:-1:-1;;;;;31511:21:0;;31462:28;31511:21;;;:14;:21;;;;;;31424:20;;31462:28;31493:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;31462:71;;31549:9;31544:241;-1:-1:-1;;;;;31568:21:0;;;;;;:14;:21;;;;;;31564:25;;31544:241;;;-1:-1:-1;;;;;31636:12:0;;;31611:22;31636:12;;;:5;:12;;;;;;;;:15;;;;;;;;;31611:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31670:51;;;31706:15;31688:3;:15;;;:33;31670:51;31666:108;;;31755:3;31742:7;31750:1;31742:10;;;;;;;;:::i;:::-;;;;;;:16;;;;31666:108;-1:-1:-1;31591:3:0;;;;:::i;:::-;;;;31544:241;;34949:157;13094:7;13121:6;-1:-1:-1;;;;;13121:6:0;19505:10;:21;;19504:51;;-1:-1:-1;19546:8:0;;-1:-1:-1;;;;;19546:8:0;19532:10;:22;19504:51;19482:122;;;;-1:-1:-1;;;19482:122:0;;18825:2:1;19482:122:0;;;18807:21:1;18864:2;18844:18;;;18837:30;-1:-1:-1;;;18883:18:1;;;18876:51;18944:18;;19482:122:0;18623:345:1;19482:122:0;35054:44:::1;::::0;-1:-1:-1;;;35054:44:0;;35078:10:::1;35054:44;::::0;::::1;188:51:1::0;255:18;;;248:34;;;-1:-1:-1;;;;;35054:23:0;::::1;::::0;::::1;::::0;161:18:1;;35054:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34949:157:::0;;:::o;17850:26::-;;;;;;;;;;;;29336:1113;15931:1;16527:7;;:19;16519:63;;;;-1:-1:-1;;;16519:63:0;;14806:2:1;16519:63:0;;;14788:21:1;14845:2;14825:18;;;14818:30;14884:33;14864:18;;;14857:61;14935:18;;16519:63:0;14604:355:1;16519:63:0;15931:1;16660:7;:18;;;29473:10:::1;29437:27;29467:17:::0;;;:5:::1;:17;::::0;;;;;;;:22;;;;;;;;29526:13;;::::1;::::0;29572:16;;-1:-1:-1;;;;;29526:13:0;;::::1;::::0;29572:16;::::1;:30;29550:114;;;::::0;-1:-1:-1;;;29550:114:0;;19175:2:1;29550:114:0::1;::::0;::::1;19157:21:1::0;19214:2;19194:18;;;19187:30;19253:34;19233:18;;;19226:62;-1:-1:-1;;;19304:18:1;;;19297:32;19346:19;;29550:114:0::1;18973:398:1::0;29550:114:0::1;29684:17;::::0;::::1;::::0;::::1;;29683:18;29675:55;;;::::0;-1:-1:-1;;;29675:55:0;;19578:2:1;29675:55:0::1;::::0;::::1;19560:21:1::0;19617:2;19597:18;;;19590:30;19656:26;19636:18;;;19629:54;19700:18;;29675:55:0::1;19376:348:1::0;29675:55:0::1;29782:7;:19;;;29763:15;:38;;29741:112;;;::::0;-1:-1:-1;;;29741:112:0;;19931:2:1;29741:112:0::1;::::0;::::1;19913:21:1::0;19970:2;19950:18;;;19943:30;20009:26;19989:18;;;19982:54;20053:18;;29741:112:0::1;19729:348:1::0;29741:112:0::1;29899:7;:21;;;29886:9;:34;;29864:109;;;::::0;-1:-1:-1;;;29864:109:0;;20284:2:1;29864:109:0::1;::::0;::::1;20266:21:1::0;20323:2;20303:18;;;20296:30;20362:27;20342:18;;;20335:55;20407:18;;29864:109:0::1;20082:349:1::0;29864:109:0::1;29984:17;::::0;::::1;:24:::0;;-1:-1:-1;;29984:24:0::1;30004:4;29984:24;::::0;;30121::::1;::::0;::::1;::::0;30041:119:::1;::::0;-1:-1:-1;;;30041:119:0;;30092:10:::1;30041:119;::::0;::::1;188:51:1::0;255:18;;;248:34;;;;-1:-1:-1;;;;;30041:32:0;::::1;::::0;::::1;::::0;161:18:1;;30041:119:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30019:226;;;::::0;-1:-1:-1;;;30019:226:0;;20638:2:1;30019:226:0::1;::::0;::::1;20620:21:1::0;20677:2;20657:18;;;20650:30;20716:34;20696:18;;;20689:62;20787:27;20767:18;;;20760:55;20832:19;;30019:226:0::1;20436:421:1::0;30019:226:0::1;30308:17;::::0;::::1;::::0;30370:21:::1;::::0;::::1;::::0;30406:24:::1;::::0;::::1;::::0;30261:180:::1;::::0;;30283:10:::1;21115:51:1::0;;30308:17:0::1;::::0;;::::1;21209:14:1::0;21202:22;21197:2;21182:18;;21175:50;30340:15:0::1;21241:18:1::0;;;21234:34;21299:2;21284:18;;21277:34;;;;21342:3;21327:19;;21320:35;30261:180:0;::::1;::::0;;;;21102:3:1;30261:180:0;;::::1;-1:-1:-1::0;;15887:1:0;16839:22;;-1:-1:-1;29336:1113:0:o;33117:437::-;33161:4;;;;33240:204;33264:16;:23;33260:27;;33240:204;;;33309:19;33331:36;33347:16;33364:1;33347:19;;;;;;;;:::i;33331:36::-;33309:58;-1:-1:-1;33400:32:0;:15;33309:58;33400:19;:32::i;:::-;33382:50;;33294:150;33289:3;;;;;:::i;:::-;;;;33240:204;;;-1:-1:-1;33458:19:0;;33454:67;;-1:-1:-1;33505:4:0;33454:67;33538:8;33117:437;-1:-1:-1;;33117:437:0:o;23717:252::-;23824:18;;23817:43;;-1:-1:-1;;;23817:43:0;;-1:-1:-1;;;;;483:32:1;;;23817:43:0;;;465:51:1;23782:4:0;;;;23824:18;;;23817:36;;438:18:1;;23817:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23799:61;;23885:14;;23875:7;:24;23871:68;;;-1:-1:-1;23923:4:0;;23717:252;-1:-1:-1;;23717:252:0:o;34598:343::-;13094:7;13121:6;-1:-1:-1;;;;;13121:6:0;19505:10;:21;;19504:51;;-1:-1:-1;19546:8:0;;-1:-1:-1;;;;;19546:8:0;19532:10;:22;19504:51;19482:122;;;;-1:-1:-1;;;19482:122:0;;18825:2:1;19482:122:0;;;18807:21:1;18864:2;18844:18;;;18837:30;-1:-1:-1;;;18883:18:1;;;18876:51;18944:18;;19482:122:0;18623:345:1;19482:122:0;34695:21:::1;34749:19:::0;;::::1;;34727:116;;;::::0;-1:-1:-1;;;34727:116:0;;21568:2:1;34727:116:0::1;::::0;::::1;21550:21:1::0;21607:2;21587:18;;;21580:30;21646:34;21626:18;;;21619:62;-1:-1:-1;;;21697:18:1;;;21690:45;21752:19;;34727:116:0::1;21366:411:1::0;34727:116:0::1;34909:24;::::0;34887:10:::1;::::0;;;34909:24;::::1;;;::::0;34925:7;;34854:22:::1;34909:24:::0;34854:22;34909:24;34925:7;34887:10;34909:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;17628:46:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17628:46:0;;-1:-1:-1;17628:46:0;;-1:-1:-1;17628:46:0:o;31825:597::-;-1:-1:-1;;;;;32023:21:0;;31974:28;32023:21;;;:14;:21;;;;;;31936:20;;31974:28;32005:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;31974:71;;32061:9;32056:334;-1:-1:-1;;;;;32080:21:0;;;;;;:14;:21;;;;;;32076:25;;32056:334;;;-1:-1:-1;;;;;32148:12:0;;;32123:22;32148:12;;;:5;:12;;;;;;;;:15;;;;;;;;;32123:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32200:68;;;32253:15;32235:3;:15;;;:33;32200:68;:112;;;;;32297:3;:15;;;32289:5;:23;32200:112;32178:201;;;32360:3;32347:7;32355:1;32347:10;;;;;;;;:::i;:::-;;;;;;:16;;;;32178:201;-1:-1:-1;32103:3:0;;;;:::i;:::-;;;;32056:334;;24494:438;-1:-1:-1;;;;;24686:27:0;;24642:7;24686:27;;;:9;:27;;;;;;;;24662:51;;;;;;;;;;;;;;;;;24642:7;;24662:51;;24686:27;24662:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24662:51:0;;;;;;;;;;;;;;;;;;;;;;;24724:24;24765:4;:11;24751:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24751:26:0;-1:-1:-1;24798:43:0;;-1:-1:-1;;;24798:43:0;;24724:53;;-1:-1:-1;;;;;;24798:15:0;:28;;;;:43;;24827:7;;24836:4;;24798:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24798:43:0;;;;;;;;;;;;:::i;:::-;24788:53;;24852:14;24869:31;24896:3;24869:22;24884:6;24869:7;24877:1;24869:10;;;;;;;;:::i;:::-;;;;;;;:14;;:22;;;;:::i;:::-;:26;;:31::i;:::-;24852:48;24494:438;-1:-1:-1;;;;;;;24494:438:0:o;14001:281::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14104:22:0;::::1;14082:110;;;::::0;-1:-1:-1;;;14082:110:0;;23207:2:1;14082:110:0::1;::::0;::::1;23189:21:1::0;23246:2;23226:18;;;23219:30;23285:34;23265:18;;;23258:62;-1:-1:-1;;;23336:18:1;;;23329:36;23382:19;;14082:110:0::1;23005:402:1::0;14082:110:0::1;14229:6;::::0;;14208:38:::1;::::0;-1:-1:-1;;;;;14208:38:0;;::::1;::::0;14229:6;::::1;::::0;14208:38:::1;::::0;::::1;14257:6;:17:::0;;-1:-1:-1;;;;;;14257:17:0::1;-1:-1:-1::0;;;;;14257:17:0;;;::::1;::::0;;;::::1;::::0;;14001:281::o;25008:463::-;-1:-1:-1;;;;;25205:27:0;;25161:7;25205:27;;;:9;:27;;;;;;;;25181:51;;;;;;;;;;;;;;;;;25161:7;;25181:51;;25205:27;25181:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25181:51:0;;;;;;;;;;;;;;;;;;;;;;;25243:24;25284:4;:11;25270:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25270:26:0;-1:-1:-1;25317:49:0;;-1:-1:-1;;;25317:49:0;;25243:53;;-1:-1:-1;;;;;;25317:15:0;:29;;;;:49;;25347:12;;25361:4;;25317:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25317:49:0;;;;;;;;;;;;:::i;:::-;25307:59;;25377:14;25394:45;25435:3;25394:36;25423:6;25394:7;25416:1;25402:4;:11;:15;;;;:::i;:::-;25394:24;;;;;;;;:::i;:::-;;;;;;;:28;;:36;;;;:::i;170:181::-;228:7;;260:5;264:1;260;:5;:::i;:::-;248:17;;289:1;284;:6;;276:46;;;;-1:-1:-1;;;276:46:0;;23614:2:1;276:46:0;;;23596:21:1;23653:2;23633:18;;;23626:30;23692:29;23672:18;;;23665:57;23739:18;;276:46:0;23412:351:1;276:46:0;342:1;170:181;-1:-1:-1;;;170:181:0:o;25783:333::-;25956:123;;-1:-1:-1;;;25956:123:0;;-1:-1:-1;;;;;24026:15:1;;;25956:123:0;;;24008:34:1;26036:4:0;24058:18:1;;;24051:43;24110:18;;;24103:34;;;25920:4:0;;;;25956:37;;;;;23943:18:1;;25956:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25937:142;25783:333;-1:-1:-1;;;;;25783:333:0:o;737:250::-;795:7;819:1;824;819:6;815:47;;-1:-1:-1;849:1:0;842:8;;815:47;874:9;886:5;890:1;886;:5;:::i;:::-;874:17;-1:-1:-1;919:1:0;910:5;914:1;874:17;910:5;:::i;:::-;:10;902:56;;;;-1:-1:-1;;;902:56:0;;24780:2:1;902:56:0;;;24762:21:1;24819:2;24799:18;;;24792:30;24858:34;24838:18;;;24831:62;-1:-1:-1;;;24909:18:1;;;24902:31;24950:19;;902:56:0;24578:397:1;995:132:0;1053:7;1080:39;1084:1;1087;1080:39;;;;;;;;;;;;;;;;;1255:7;1290:12;1283:5;1275:28;;;;-1:-1:-1;;;1275:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1314:9:0;1326:5;1330:1;1326;:5;:::i;:::-;1314:17;-1:-1:-1;1363:5:0;1367:1;1363;:5;:::i;:::-;1354;1358:1;1354;:5;:::i;:::-;:15;;;;:::i;:::-;1349:1;:20;1342:28;;;;:::i;:::-;1437:1;1135:311;-1:-1:-1;;;;1135:311:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;527:180:1;586:6;639:2;627:9;618:7;614:23;610:32;607:52;;;655:1;652;645:12;607:52;-1:-1:-1;678:23:1;;527:180;-1:-1:-1;527:180:1:o;920:173::-;988:20;;-1:-1:-1;;;;;1037:31:1;;1027:42;;1017:70;;1083:1;1080;1073:12;1017:70;920:173;;;:::o;1098:127::-;1159:10;1154:3;1150:20;1147:1;1140:31;1190:4;1187:1;1180:15;1214:4;1211:1;1204:15;1230:275;1301:2;1295:9;1366:2;1347:13;;-1:-1:-1;;1343:27:1;1331:40;;1401:18;1386:34;;1422:22;;;1383:62;1380:88;;;1448:18;;:::i;:::-;1484:2;1477:22;1230:275;;-1:-1:-1;1230:275:1:o;1510:183::-;1570:4;1603:18;1595:6;1592:30;1589:56;;;1625:18;;:::i;:::-;-1:-1:-1;1670:1:1;1666:14;1682:4;1662:25;;1510:183::o;1698:668::-;1752:5;1805:3;1798:4;1790:6;1786:17;1782:27;1772:55;;1823:1;1820;1813:12;1772:55;1859:6;1846:20;1885:4;1909:60;1925:43;1965:2;1925:43;:::i;:::-;1909:60;:::i;:::-;2003:15;;;2089:1;2085:10;;;;2073:23;;2069:32;;;2034:12;;;;2113:15;;;2110:35;;;2141:1;2138;2131:12;2110:35;2177:2;2169:6;2165:15;2189:148;2205:6;2200:3;2197:15;2189:148;;;2271:23;2290:3;2271:23;:::i;:::-;2259:36;;2315:12;;;;2222;;2189:148;;;-1:-1:-1;2355:5:1;1698:668;-1:-1:-1;;;;;;1698:668:1:o;2371:697::-;2500:6;2508;2516;2524;2532;2540;2593:3;2581:9;2572:7;2568:23;2564:33;2561:53;;;2610:1;2607;2600:12;2561:53;2633:29;2652:9;2633:29;:::i;:::-;2623:39;;2709:2;2698:9;2694:18;2681:32;2671:42;;2760:2;2749:9;2745:18;2732:32;2722:42;;2811:2;2800:9;2796:18;2783:32;2773:42;;2862:3;2851:9;2847:19;2834:33;2824:43;;2918:3;2907:9;2903:19;2890:33;2946:18;2938:6;2935:30;2932:50;;;2978:1;2975;2968:12;2932:50;3001:61;3054:7;3045:6;3034:9;3030:22;3001:61;:::i;:::-;2991:71;;;2371:697;;;;;;;;:::o;3073:529::-;3177:6;3185;3193;3201;3209;3217;3270:3;3258:9;3249:7;3245:23;3241:33;3238:53;;;3287:1;3284;3277:12;3238:53;3310:29;3329:9;3310:29;:::i;:::-;3300:39;3386:2;3371:18;;3358:32;;-1:-1:-1;3437:2:1;3422:18;;3409:32;;3488:2;3473:18;;3460:32;;-1:-1:-1;3539:3:1;3524:19;;3511:33;;-1:-1:-1;3591:3:1;3576:19;3563:33;;-1:-1:-1;3073:529:1;-1:-1:-1;;;3073:529:1:o;3607:248::-;3675:6;3683;3736:2;3724:9;3715:7;3711:23;3707:32;3704:52;;;3752:1;3749;3742:12;3704:52;-1:-1:-1;;3775:23:1;;;3845:2;3830:18;;;3817:32;;-1:-1:-1;3607:248:1:o;3860:186::-;3919:6;3972:2;3960:9;3951:7;3947:23;3943:32;3940:52;;;3988:1;3985;3978:12;3940:52;4011:29;4030:9;4011:29;:::i;4329:1452::-;4558:2;4610:21;;;4680:13;;4583:18;;;4702:22;;;4529:4;;4558:2;4743;;4761:18;;;;4802:15;;;4529:4;4845:910;4859:6;4856:1;4853:13;4845:910;;;4918:13;;5002:9;;-1:-1:-1;;;;;4998:18:1;;;4986:31;;5061:11;;;5055:18;5051:27;5037:12;;;5030:49;5119:11;;;5113:18;5099:12;;;5092:40;5155:4;5199:11;;;5193:18;5179:12;;;5172:40;5235:4;5279:11;;;5273:18;5259:12;;;5252:40;4962:3;5359:11;;;5353:18;5339:12;;;5332:40;5395:4;5439:11;;;5433:18;5419:12;;;5412:40;5475:4;5519:11;;;5513:18;5499:12;;;5492:40;5556:6;5601:12;;;5595:19;4303:13;4296:21;5657:13;;;4284:34;5700:6;5691:16;;;;5730:15;;;;4881:1;4874:9;4845:910;;;-1:-1:-1;5772:3:1;;4329:1452;-1:-1:-1;;;;;;;4329:1452:1:o;5978:118::-;6064:5;6057:13;6050:21;6043:5;6040:32;6030:60;;6086:1;6083;6076:12;6030:60;5978:118;:::o;6101:383::-;6175:6;6183;6191;6244:2;6232:9;6223:7;6219:23;6215:32;6212:52;;;6260:1;6257;6250:12;6212:52;6283:29;6302:9;6283:29;:::i;:::-;6273:39;;6359:2;6348:9;6344:18;6331:32;6321:42;;6413:2;6402:9;6398:18;6385:32;6426:28;6448:5;6426:28;:::i;:::-;6473:5;6463:15;;;6101:383;;;;;:::o;6489:254::-;6557:6;6565;6618:2;6606:9;6597:7;6593:23;6589:32;6586:52;;;6634:1;6631;6624:12;6586:52;6657:29;6676:9;6657:29;:::i;:::-;6647:39;6733:2;6718:18;;;;6705:32;;-1:-1:-1;;;6489:254:1:o;6748:322::-;6825:6;6833;6841;6894:2;6882:9;6873:7;6869:23;6865:32;6862:52;;;6910:1;6907;6900:12;6862:52;6933:29;6952:9;6933:29;:::i;:::-;6923:39;7009:2;6994:18;;6981:32;;-1:-1:-1;7060:2:1;7045:18;;;7032:32;;6748:322;-1:-1:-1;;;6748:322:1:o;7075:422::-;7168:6;7176;7229:2;7217:9;7208:7;7204:23;7200:32;7197:52;;;7245:1;7242;7235:12;7197:52;7268:29;7287:9;7268:29;:::i;:::-;7258:39;;7348:2;7337:9;7333:18;7320:32;7375:18;7367:6;7364:30;7361:50;;;7407:1;7404;7397:12;7361:50;7430:61;7483:7;7474:6;7463:9;7459:22;7430:61;:::i;:::-;7420:71;;;7075:422;;;;;:::o;8802:356::-;9004:2;8986:21;;;9023:18;;;9016:30;9082:34;9077:2;9062:18;;9055:62;9149:2;9134:18;;8802:356::o;9163:355::-;9365:2;9347:21;;;9404:2;9384:18;;;9377:30;9443:33;9438:2;9423:18;;9416:61;9509:2;9494:18;;9163:355::o;9523:350::-;9725:2;9707:21;;;9764:2;9744:18;;;9737:30;9803:28;9798:2;9783:18;;9776:56;9864:2;9849:18;;9523:350::o;10230:127::-;10291:10;10286:3;10282:20;10279:1;10272:31;10322:4;10319:1;10312:15;10346:4;10343:1;10336:15;10362:135;10401:3;10422:17;;;10419:43;;10442:18;;:::i;:::-;-1:-1:-1;10489:1:1;10478:13;;10362:135::o;10996:351::-;11198:2;11180:21;;;11237:2;11217:18;;;11210:30;11276:29;11271:2;11256:18;;11249:57;11338:2;11323:18;;10996:351::o;11703:127::-;11764:10;11759:3;11755:20;11752:1;11745:31;11795:4;11792:1;11785:15;11819:4;11816:1;11809:15;12896:400;13098:2;13080:21;;;13137:2;13117:18;;;13110:30;13176:34;13171:2;13156:18;;13149:62;-1:-1:-1;;;13242:2:1;13227:18;;13220:34;13286:3;13271:19;;12896:400::o;13301:245::-;13368:6;13421:2;13409:9;13400:7;13396:23;13392:32;13389:52;;;13437:1;13434;13427:12;13389:52;13469:9;13463:16;13488:28;13510:5;13488:28;:::i;13551:461::-;13604:3;13642:5;13636:12;13669:6;13664:3;13657:19;13695:4;13724:2;13719:3;13715:12;13708:19;;13761:2;13754:5;13750:14;13782:1;13792:195;13806:6;13803:1;13800:13;13792:195;;;13871:13;;-1:-1:-1;;;;;13867:39:1;13855:52;;13927:12;;;;13962:15;;;;13903:1;13821:9;13792:195;;;-1:-1:-1;14003:3:1;;13551:461;-1:-1:-1;;;;;13551:461:1:o;14017:582::-;14316:6;14305:9;14298:25;14359:6;14354:2;14343:9;14339:18;14332:34;14402:3;14397:2;14386:9;14382:18;14375:31;14279:4;14423:57;14475:3;14464:9;14460:19;14452:6;14423:57;:::i;:::-;-1:-1:-1;;;;;14516:32:1;;;;14511:2;14496:18;;14489:60;-1:-1:-1;14580:3:1;14565:19;14558:35;14415:65;14017:582;-1:-1:-1;;;14017:582:1:o;16038:184::-;16108:6;16161:2;16149:9;16140:7;16136:23;16132:32;16129:52;;;16177:1;16174;16167:12;16129:52;-1:-1:-1;16200:16:1;;16038:184;-1:-1:-1;16038:184:1:o;17054:128::-;17121:9;;;17142:11;;;17139:37;;;17156:18;;:::i;17662:125::-;17727:9;;;17748:10;;;17745:36;;;17761:18;;:::i;18260:358::-;-1:-1:-1;;;;;18467:32:1;;18449:51;;18536:2;18531;18516:18;;18509:30;;;-1:-1:-1;;18556:56:1;;18593:18;;18585:6;18556:56;:::i;21782:332::-;21989:6;21978:9;21971:25;22032:2;22027;22016:9;22012:18;22005:30;21952:4;22052:56;22104:2;22093:9;22089:18;22081:6;22052:56;:::i;22119:881::-;22214:6;22245:2;22288;22276:9;22267:7;22263:23;22259:32;22256:52;;;22304:1;22301;22294:12;22256:52;22337:9;22331:16;22370:18;22362:6;22359:30;22356:50;;;22402:1;22399;22392:12;22356:50;22425:22;;22478:4;22470:13;;22466:27;-1:-1:-1;22456:55:1;;22507:1;22504;22497:12;22456:55;22536:2;22530:9;22559:60;22575:43;22615:2;22575:43;:::i;22559:60::-;22653:15;;;22735:1;22731:10;;;;22723:19;;22719:28;;;22684:12;;;;22759:19;;;22756:39;;;22791:1;22788;22781:12;22756:39;22815:11;;;;22835:135;22851:6;22846:3;22843:15;22835:135;;;22917:10;;22905:23;;22868:12;;;;22948;;;;22835:135;;24148:168;24221:9;;;24252;;24269:15;;;24263:22;;24249:37;24239:71;;24290:18;;:::i;24321:127::-;24382:10;24377:3;24373:20;24370:1;24363:31;24413:4;24410:1;24403:15;24437:4;24434:1;24427:15;24453:120;24493:1;24519;24509:35;;24524:18;;:::i;:::-;-1:-1:-1;24558:9:1;;24453:120::o;24980:548::-;25092:4;25121:2;25150;25139:9;25132:21;25182:6;25176:13;25225:6;25220:2;25209:9;25205:18;25198:34;25250:1;25260:140;25274:6;25271:1;25268:13;25260:140;;;25369:14;;;25365:23;;25359:30;25335:17;;;25354:2;25331:26;25324:66;25289:10;;25260:140;;;25264:3;25449:1;25444:2;25435:6;25424:9;25420:22;25416:31;25409:42;25519:2;25512;25508:7;25503:2;25495:6;25491:15;25487:29;25476:9;25472:45;25468:54;25460:62;;;;24980:548;;;;:::o;25533:112::-;25565:1;25591;25581:35;;25596:18;;:::i;:::-;-1:-1:-1;25630:9:1;;25533:112::o;25650:127::-;25711:10;25706:3;25702:20;25699:1;25692:31;25742:4;25739:1;25732:15;25766:4;25763:1;25756:15
Swarm Source
ipfs://6c0cbcf552323b1621e997c4d0a53688cbcf3d54515338adda293f2f5126b1c5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.