UXLINK's UXSwap V1.0 (Legacy) contract on Arbitrum. This nametag was submitted by Kleros Scout.
Latest 25 from a total of 167,474 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Exact Input... | 307757858 | 340 days ago | IN | 0 ETH | 0.00000289 | ||||
| Swap Exact Input... | 307756240 | 340 days ago | IN | 0 ETH | 0.00000287 | ||||
| Swap Exact Input... | 307749024 | 340 days ago | IN | 0 ETH | 0.00000292 | ||||
| Swap Exact Input... | 307747805 | 340 days ago | IN | 0 ETH | 0.00000291 | ||||
| Swap Exact Input... | 307746769 | 340 days ago | IN | 0 ETH | 0.00000292 | ||||
| Swap Exact Input... | 307746225 | 340 days ago | IN | 0 ETH | 0.00000291 | ||||
| Swap Exact Input... | 307744859 | 340 days ago | IN | 0 ETH | 0.00000286 | ||||
| Swap Exact Input... | 307742680 | 340 days ago | IN | 0 ETH | 0.00000287 | ||||
| Swap Exact Input... | 307740743 | 340 days ago | IN | 0 ETH | 0.00000287 | ||||
| Swap Exact Input... | 307739268 | 340 days ago | IN | 0 ETH | 0.0000029 | ||||
| Swap Exact Input... | 307737796 | 340 days ago | IN | 0 ETH | 0.00000288 | ||||
| Swap Exact Input... | 307732936 | 340 days ago | IN | 0 ETH | 0.00000509 | ||||
| Swap Exact Input... | 269602842 | 451 days ago | IN | 0 ETH | 0.00001794 | ||||
| Swap Exact Input... | 262257149 | 472 days ago | IN | 0 ETH | 0.00000299 | ||||
| Swap Exact Input... | 258595061 | 483 days ago | IN | 0 ETH | 0.00000458 | ||||
| Swap Exact Input... | 258578718 | 483 days ago | IN | 0 ETH | 0.0000028 | ||||
| Swap Exact Input... | 255141514 | 493 days ago | IN | 0 ETH | 0.00000428 | ||||
| Swap Exact Input... | 253131934 | 499 days ago | IN | 0 ETH | 0.00002136 | ||||
| Swap Exact Input... | 253131353 | 499 days ago | IN | 0 ETH | 0.0000148 | ||||
| Swap Exact Input... | 242113634 | 531 days ago | IN | 0 ETH | 0.00003387 | ||||
| Swap Exact Input... | 240781562 | 535 days ago | IN | 0 ETH | 0.00000497 | ||||
| Swap Exact Input... | 240332390 | 536 days ago | IN | 0 ETH | 0.00000229 | ||||
| Swap Exact Input... | 240317783 | 536 days ago | IN | 0 ETH | 0.00000214 | ||||
| Swap Exact Input... | 237484435 | 545 days ago | IN | 0 ETH | 0.00000207 | ||||
| Swap Exact Input... | 237484316 | 545 days ago | IN | 0 ETH | 0.00000224 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
UXSwapV1
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.19;
pragma abicoder v2;
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import '@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol';
import '@uniswap/v3-periphery/contracts/interfaces/IQuoterV2.sol';
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import './libs/ISwapRouter02.sol';
contract UXSwapV1 {
// Anti-bot and anti-whale mappings and variables
mapping(address => bool) _blacklist;
// Uniswap V3: Router 2
ISwapRouter02 public swapRouterV3;
address public constant UNISWAP_V3_ROUTER = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;
address public constant UNISWAP_V3_QUOTER2 = 0x61fFE014bA17989E743c5F6cB21bF9697530B21e;
// set the pool fee to 0.3%.
uint24 public constant defaultPoolFee = 3000;
IUniswapV2Router02 public uniswapRouter;
address public WETH = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6;
//address of the uniswap v2 router
address private constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
// Commission in percentage (e.g., 10 for 1%)
uint256 public commissionPercentage;
address public revCommissionWallet;
uint256 public deadlineDelayTime;
/// @notice Addresses of super operators
mapping(address => bool) public superOperators;
/// @notice Requires sender to be contract super operator
modifier isSuperOperator() {
// Ensure sender is super operator
require(superOperators[msg.sender], "Not super operator");
_;
}
/// events
event RevCommissionWalletUpated(
address newWallet,
address oldWallet
);
event TradeSuccess(
address trader,
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOut,
address to,
uint256 commission,
int256 code
);
/// constructor
constructor() {
superOperators[msg.sender] = true;
swapRouterV3 = ISwapRouter02(UNISWAP_V3_ROUTER);
uniswapRouter = IUniswapV2Router02(
UNISWAP_V2_ROUTER
);
revCommissionWallet = msg.sender;
deadlineDelayTime = 300;
commissionPercentage = 10;
}
receive() external payable {}
///
function quoted(address tokenIn, address tokenOut, uint256 amountIn, uint24 poolFee) public returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate) {
IQuoterV2 quoter = IQuoterV2(UNISWAP_V3_QUOTER2);
IQuoterV2.QuoteExactInputSingleParams memory quoterParams;
quoterParams.tokenIn = tokenIn;
quoterParams.tokenOut = tokenOut;
quoterParams.amountIn = amountIn;
quoterParams.fee = poolFee;
quoterParams.sqrtPriceLimitX96 = 0;
(amountOut,sqrtPriceX96After,initializedTicksCrossed,gasEstimate) = quoter.quoteExactInputSingle(quoterParams);
}
/// @dev The calling address must approve this contract to spend at least `amountIn` worth of its tokenIn for this function to succeed.
/// @return amountOut The amount of tokenOut received.
function swapExactInputSingle(address tokenIn, address tokenOut, uint256 amountIn, uint24 poolFee, uint256 amountOutMinimum, address recipient, int256 code) external returns (uint256 amountOut) {
require(!_blacklist[msg.sender], "User is on the blacklist.");
// msg.sender must approve this contract
// Transfer the specified amount of tokenIn to this contract.
TransferHelper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
// Calculating the fee
uint256 commission = calculateCommission(amountIn);
uint256 amountInAfterCommission = amountIn - commission;
// Approve the router to spend tokenIn.
TransferHelper.safeApprove(tokenIn, address(swapRouterV3), amountInAfterCommission);
ISwapRouter02.ExactInputSingleParams memory params =
ISwapRouter02.ExactInputSingleParams({
tokenIn: tokenIn,
tokenOut: tokenOut,
fee: poolFee,
recipient:recipient,
amountIn: amountInAfterCommission,
amountOutMinimum: amountOutMinimum,
sqrtPriceLimitX96: 0
});
// swap.
amountOut = swapRouterV3.exactInputSingle(params);
if (commission > 0) {
// Transfer the fee to the revCommissionWallet
TransferHelper.safeTransfer(tokenIn, revCommissionWallet, commission);
}
//
TransferHelper.safeApprove(tokenIn, address(swapRouterV3), 0);
emit TradeSuccess(msg.sender,tokenIn,tokenOut,amountIn,amountOut,recipient,commission,code);
}
/// @notice swapInputMultiplePools swaps a fixed amount of tokenIn for a maximum possible amount of tokenOut through an intermediary pool.
/// @dev The calling address must approve this contract to spend at least `amountIn` worth of its tokenIn for this function to succeed.
/// @return amountOut The amount of tokenOut received after the swap.
function swapExactInputMultihop(address[] memory _path, uint24[] memory _fee, uint256 amountIn, uint256 amountOutMinimum, address recipient, int256 code) external returns (uint256 amountOut) {
require(!_blacklist[msg.sender], "User is on the blacklist.");
require(_path.length > 1, "_path invalid!");
require(_path.length == _fee.length+1, "_path or _fee invalid!");
address tokenIn = _path[0];
address tokenOut = _path[_path.length-1];
// Transfer `amountIn` of tokenIn to this contract.
TransferHelper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
// Calculating the fee
uint256 commission = calculateCommission(amountIn);
uint256 amountInAfterCommission = amountIn - commission;
// Approve the router to spend tokenIn.
TransferHelper.safeApprove(tokenIn, address(swapRouterV3), amountInAfterCommission);
ISwapRouter02.ExactInputParams memory params =
ISwapRouter02.ExactInputParams({
path: _encodePathV3(_path,_fee),
recipient: recipient,
amountIn: amountInAfterCommission,
amountOutMinimum: amountOutMinimum
});
// Executes the swap.
amountOut = swapRouterV3.exactInput(params);
if (commission > 0) {
TransferHelper.safeTransfer(tokenIn, revCommissionWallet, commission);
}
TransferHelper.safeApprove(tokenIn, address(swapRouterV3), 0);
emit TradeSuccess(msg.sender,tokenIn,tokenOut,amountIn,amountOut,recipient,commission,code);
}
function _encodePathV3(address[] memory _path, uint24[] memory _fees) internal pure returns (bytes memory path) {
path = abi.encodePacked(_path[0]);
for(uint i = 0; i < _fees.length; i++){
path = abi.encodePacked(path, _fees[i], _path[i+1]);
}
}
function tradeForETH(
address tokenIn,
uint256 amountIn,
uint256 amountOutMin,
address to,
int256 code
) external {
require(!_blacklist[msg.sender], "User is on the blacklist.");
// Transfer the specified amount of tokenIn to this contract.
TransferHelper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
address[] memory path = new address[](2);
path[0] = tokenIn;
path[1] = WETH;
// Calculating the fee
uint256 commission = calculateCommission(amountIn);
uint256 amountInAfterCommission = amountIn - commission;
// Approve the router to spend tokenIn.
TransferHelper.safeApprove(tokenIn, address(uniswapRouter), amountInAfterCommission);
uint256 deadline = block.timestamp + deadlineDelayTime;
uint[] memory amounts = uniswapRouter.swapExactTokensForETH(
amountInAfterCommission,
amountOutMin,
path,
to,
deadline
);
if (commission > 0) {
// Transfer the fee to the revCommissionWallet
TransferHelper.safeTransfer(tokenIn, revCommissionWallet, commission);
}
//
TransferHelper.safeApprove(tokenIn, address(uniswapRouter), 0);
emit TradeSuccess(msg.sender,tokenIn,path[1],amountIn,amounts[1],to,commission,code);
}
function trade(
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOutMin,
address to,
int256 code
) external {
require(!_blacklist[msg.sender], "User is on the blacklist.");
// Assuming you've already approved this contract to spend `amountIn` of `tokenIn`
// Transfer the specified amount of tokenIn to this contract.
TransferHelper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
address[] memory path = new address[](2);
path[0] = tokenIn;
path[1] = tokenOut;
// Calculating the fee
uint256 commission = calculateCommission(amountIn);
uint256 amountInAfterCommission = amountIn - commission;
// Approve the router to spend tokenIn.
TransferHelper.safeApprove(tokenIn, address(uniswapRouter), amountInAfterCommission);
uint256 deadline = block.timestamp + deadlineDelayTime;
uint[] memory amounts = uniswapRouter.swapExactTokensForTokens(
amountInAfterCommission,
amountOutMin,
path,
to,
deadline
);
if (commission > 0) {
// Transfer the fee to the revCommissionWallet
TransferHelper.safeTransfer(tokenIn, revCommissionWallet, commission);
}
TransferHelper.safeApprove(tokenIn, address(uniswapRouter), 0);
emit TradeSuccess(msg.sender,tokenIn,tokenOut,amountIn,amounts[1],to,commission,code);
}
function tradeSupportingFee(
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOutMin,
address to,
int256 code
) external {
require(!_blacklist[msg.sender], "User is on the blacklist.");
// Assuming you've already approved this contract to spend `amountIn` of `tokenIn`
// Transfer the specified amount of tokenIn to this contract.
TransferHelper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
address[] memory path = new address[](2);
path[0] = tokenIn;
path[1] = tokenOut;
// Calculating the fee
uint256 commission = calculateCommission(amountIn);
uint256 amountInAfterCommission = amountIn - commission;
// Approve the router to spend tokenIn.
TransferHelper.safeApprove(tokenIn, address(uniswapRouter), amountInAfterCommission);
uint256 deadline = block.timestamp + deadlineDelayTime;
uniswapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
amountInAfterCommission,
amountOutMin,
path,
to,
deadline
);
if (commission > 0) {
// Transfer the fee to the revCommissionWallet
TransferHelper.safeTransfer(tokenIn, revCommissionWallet, commission);
}
TransferHelper.safeApprove(tokenIn, address(uniswapRouter), 0);
emit TradeSuccess(msg.sender,tokenIn,tokenOut,amountIn,0,to,commission,code);
}
function tradeETH(
address tokenOut,
uint256 amountOutMin,
address to,
int256 code
) external payable {
require(!_blacklist[msg.sender], "User is on the blacklist.");
address[] memory path = new address[](2);
path[0] = WETH;
path[1] = tokenOut;
uint256 amountIn = msg.value;
require(amountIn > 0, "No ETH sent");
uint256 commission = calculateCommission(amountIn);
uint256 amountInAfterCommission = amountIn - commission;
// Perform the swap
uint256 deadline = block.timestamp + deadlineDelayTime;
uint[] memory amounts = uniswapRouter.swapExactETHForTokens{value: amountInAfterCommission}(
amountOutMin,
path,
to,
deadline
);
if (commission > 0) {
(bool success, ) = revCommissionWallet.call{value: commission}("");
require(success, "ETH transfer failed");
}
emit TradeSuccess(msg.sender,WETH,tokenOut,amountIn,amounts[1],to,commission,code);
}
function tradeETHSupportingFee(
address tokenOut,
uint256 amountOutMin,
address to,
int256 code
) external payable {
require(!_blacklist[msg.sender], "User is on the blacklist.");
address[] memory path = new address[](2);
path[0] = WETH;
path[1] = tokenOut;
uint256 amountIn = msg.value;
require(amountIn > 0, "No ETH sent");
uint256 commission = calculateCommission(amountIn);
uint256 amountInAfterCommission = amountIn - commission;
// Perform the swap
uint256 deadline = block.timestamp + deadlineDelayTime;
uniswapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountInAfterCommission}(
amountOutMin,
path,
to,
deadline
);
if (commission > 0) {
(bool success, ) = revCommissionWallet.call{value: commission}("");
require(success, "ETH transfer failed");
}
emit TradeSuccess(msg.sender,WETH,tokenOut,amountIn,0,to,commission,code);
}
function setCommissionPercentage(uint256 _commissionPercentage)
external
isSuperOperator
{
require(
_commissionPercentage <= 1000,
"Commission percentage must be less than or equal to 100"
);
commissionPercentage = _commissionPercentage;
}
function calculateCommission(uint256 amount) internal view returns (uint256) {
return (amount * commissionPercentage) / 1000;
}
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to
) external {
uint256 deadline = block.timestamp + deadlineDelayTime;
uniswapRouter.addLiquidity(
tokenA,
tokenB,
amountADesired,
amountBDesired,
amountAMin,
amountBMin,
to,
deadline
);
}
/// Getters to allow the same blacklist to be used also by other contracts ///////
function getBlackListStatus(address _maker) external view returns (bool) {
return _blacklist[_maker];
}
function addToBlacklist(address _user) public isSuperOperator {
require(!_blacklist[_user], "User is already on the blacklist.");
require(
_user != address(UNISWAP_V2_ROUTER),
"Cannot blacklist token's v2 router."
);
_blacklist[_user] = true;
}
function removeFromBlacklist(address _user) public isSuperOperator {
require(_blacklist[_user], "User is not on the blacklist.");
delete _blacklist[_user];
}
/// @notice Allows super operator to update super operator
function authorizeOperator(address _operator) external isSuperOperator {
superOperators[_operator] = true;
}
/// @notice Allows super operator to update super operator
function revokeOperator(address _operator) external isSuperOperator {
superOperators[_operator] = false;
}
function setDeadlineDelayTime(uint256 _time) external isSuperOperator {
deadlineDelayTime = _time;
}
function setRevCommissionWallet(address _to) external isSuperOperator {
emit RevCommissionWalletUpated(_to, revCommissionWallet);
revCommissionWallet = _to;
}
function withdrawStuckToken(address _token, address _to) external isSuperOperator {
require(_token != address(0), "_token address cannot be 0");
uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
TransferHelper.safeTransfer(_token, _to, _contractBalance);
}
function withdrawStuckEth(address toAddr) external isSuperOperator {
(bool success, ) = toAddr.call{
value: address(this).balance
} ("");
require(success);
}
function setUniswapRouterV2(address _addr) external isSuperOperator{
uniswapRouter = IUniswapV2Router02(_addr);
}
function setUniswapRouterV3(address _addr) external isSuperOperator{
swapRouterV3 = ISwapRouter02(_addr);
}
function setWETH(address tokenAddr) external isSuperOperator{
WETH = tokenAddr;
}
function factory() external view returns (address) {
return uniswapRouter.factory();
}
function quote(uint amountA, uint reserveA, uint reserveB) external view returns (uint amountB) {
return uniswapRouter.quote(amountA,reserveA,reserveB);
}
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external view returns (uint amountOut){
return uniswapRouter.getAmountOut(amountIn,reserveIn,reserveOut);
}
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external view returns (uint amountIn) {
return uniswapRouter.getAmountIn(amountOut,reserveIn,reserveOut);
}
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts) {
return uniswapRouter.getAmountsOut(amountIn,path);
}
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts) {
return uniswapRouter.getAmountsIn(amountOut,path);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.7.5;
pragma abicoder v2;
/// @title QuoterV2 Interface
/// @notice Supports quoting the calculated amounts from exact input or exact output swaps.
/// @notice For each pool also tells you the number of initialized ticks crossed and the sqrt price of the pool after the swap.
/// @dev These functions are not marked view because they rely on calling non-view functions and reverting
/// to compute the result. They are also not gas efficient and should not be called on-chain.
interface IQuoterV2 {
/// @notice Returns the amount out received for a given exact input swap without executing the swap
/// @param path The path of the swap, i.e. each token pair and the pool fee
/// @param amountIn The amount of the first token to swap
/// @return amountOut The amount of the last token that would be received
/// @return sqrtPriceX96AfterList List of the sqrt price after the swap for each pool in the path
/// @return initializedTicksCrossedList List of the initialized ticks that the swap crossed for each pool in the path
/// @return gasEstimate The estimate of the gas that the swap consumes
function quoteExactInput(bytes memory path, uint256 amountIn)
external
returns (
uint256 amountOut,
uint160[] memory sqrtPriceX96AfterList,
uint32[] memory initializedTicksCrossedList,
uint256 gasEstimate
);
struct QuoteExactInputSingleParams {
address tokenIn;
address tokenOut;
uint256 amountIn;
uint24 fee;
uint160 sqrtPriceLimitX96;
}
/// @notice Returns the amount out received for a given exact input but for a swap of a single pool
/// @param params The params for the quote, encoded as `QuoteExactInputSingleParams`
/// tokenIn The token being swapped in
/// tokenOut The token being swapped out
/// fee The fee of the token pool to consider for the pair
/// amountIn The desired input amount
/// sqrtPriceLimitX96 The price limit of the pool that cannot be exceeded by the swap
/// @return amountOut The amount of `tokenOut` that would be received
/// @return sqrtPriceX96After The sqrt price of the pool after the swap
/// @return initializedTicksCrossed The number of initialized ticks that the swap crossed
/// @return gasEstimate The estimate of the gas that the swap consumes
function quoteExactInputSingle(QuoteExactInputSingleParams memory params)
external
returns (
uint256 amountOut,
uint160 sqrtPriceX96After,
uint32 initializedTicksCrossed,
uint256 gasEstimate
);
/// @notice Returns the amount in required for a given exact output swap without executing the swap
/// @param path The path of the swap, i.e. each token pair and the pool fee. Path must be provided in reverse order
/// @param amountOut The amount of the last token to receive
/// @return amountIn The amount of first token required to be paid
/// @return sqrtPriceX96AfterList List of the sqrt price after the swap for each pool in the path
/// @return initializedTicksCrossedList List of the initialized ticks that the swap crossed for each pool in the path
/// @return gasEstimate The estimate of the gas that the swap consumes
function quoteExactOutput(bytes memory path, uint256 amountOut)
external
returns (
uint256 amountIn,
uint160[] memory sqrtPriceX96AfterList,
uint32[] memory initializedTicksCrossedList,
uint256 gasEstimate
);
struct QuoteExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint256 amount;
uint24 fee;
uint160 sqrtPriceLimitX96;
}
/// @notice Returns the amount in required to receive the given exact output amount but for a swap of a single pool
/// @param params The params for the quote, encoded as `QuoteExactOutputSingleParams`
/// tokenIn The token being swapped in
/// tokenOut The token being swapped out
/// fee The fee of the token pool to consider for the pair
/// amountOut The desired output amount
/// sqrtPriceLimitX96 The price limit of the pool that cannot be exceeded by the swap
/// @return amountIn The amount required as the input for the swap in order to receive `amountOut`
/// @return sqrtPriceX96After The sqrt price of the pool after the swap
/// @return initializedTicksCrossed The number of initialized ticks that the swap crossed
/// @return gasEstimate The estimate of the gas that the swap consumes
function quoteExactOutputSingle(QuoteExactOutputSingleParams memory params)
external
returns (
uint256 amountIn,
uint160 sqrtPriceX96After,
uint32 initializedTicksCrossed,
uint256 gasEstimate
);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0;
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
library TransferHelper {
/// @notice Transfers tokens from the targeted address to the given destination
/// @notice Errors with 'STF' if transfer fails
/// @param token The contract address of the token to be transferred
/// @param from The originating address from which the tokens will be transferred
/// @param to The destination address of the transfer
/// @param value The amount to be transferred
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
(bool success, bytes memory data) =
token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
}
/// @notice Transfers tokens from msg.sender to a recipient
/// @dev Errors with ST if transfer fails
/// @param token The contract address of the token which will be transferred
/// @param to The recipient of the transfer
/// @param value The value of the transfer
function safeTransfer(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
}
/// @notice Approves the stipulated contract to spend the given allowance in the given token
/// @dev Errors with 'SA' if transfer fails
/// @param token The contract address of the token to be approved
/// @param to The target of the approval
/// @param value The amount of the given token the target will be allowed to spend
function safeApprove(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
}
/// @notice Transfers ETH to the recipient address
/// @dev Fails with `STE`
/// @param to The destination of the transfer
/// @param value The value to be transferred
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'STE');
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.19;
pragma abicoder v2;
/// @title Router token swapping functionality
interface ISwapRouter02 {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another token
/// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,
/// and swap the entire amount, enabling contracts to send tokens before calling this function.
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
/// @return amountOut The amount of the received token
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
/// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,
/// and swap the entire amount, enabling contracts to send tokens before calling this function.
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
/// @return amountOut The amount of the received token
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another token
/// that may remain in the router after the swap.
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
/// @return amountIn The amount of the input token
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 amountOut;
uint256 amountInMaximum;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
/// that may remain in the router after the swap.
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
/// @return amountIn The amount of the input token
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"RevCommissionWalletUpated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"commission","type":"uint256"},{"indexed":false,"internalType":"int256","name":"code","type":"int256"}],"name":"TradeSuccess","type":"event"},{"inputs":[],"name":"UNISWAP_V3_QUOTER2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_V3_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commissionPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadlineDelayTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultPoolFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_maker","type":"address"}],"name":"getBlackListStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"name":"quoted","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceX96After","type":"uint160"},{"internalType":"uint32","name":"initializedTicksCrossed","type":"uint32"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revCommissionWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_commissionPercentage","type":"uint256"}],"name":"setCommissionPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setDeadlineDelayTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"setRevCommissionWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setUniswapRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setUniswapRouterV3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"setWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"superOperators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint24[]","name":"_fee","type":"uint24[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int256","name":"code","type":"int256"}],"name":"swapExactInputMultihop","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int256","name":"code","type":"int256"}],"name":"swapExactInputSingle","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapRouterV3","outputs":[{"internalType":"contract ISwapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"int256","name":"code","type":"int256"}],"name":"trade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"int256","name":"code","type":"int256"}],"name":"tradeETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"int256","name":"code","type":"int256"}],"name":"tradeETHSupportingFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"int256","name":"code","type":"int256"}],"name":"tradeForETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"int256","name":"code","type":"int256"}],"name":"tradeSupportingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAddr","type":"address"}],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405273b4fbf271143f4fbf7b91a5ded31805e42b2208d6600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561006557600080fd5b506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507368b3465833fb72a70ecdf485e0e4c7bd8665fc45600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061012c600681905550600a600481905550615a6280620001ca6000396000f3fe6080604052600436106102295760003560e01c806386a466cc11610123578063adcf72dd116100ab578063d06ca61f1161006f578063d06ca61f14610819578063d575fe6414610856578063e4528b0414610881578063f65844b3146108be578063fad8b32a146108e757610230565b8063adcf72dd14610734578063b631e80b14610771578063bc205ad31461079c578063c45a0155146107c5578063ca3d6539146107f057610230565b8063975cf85d116100f2578063975cf85d1461063d5780639adf6415146106665780639f40c9a71461068f578063ad5c4648146106cc578063ad615dec146106f757610230565b806386a466cc1461059557806388d9ef7e146105be5780638b385a6f146105e9578063959b8c3f1461061457610230565b8063537df3b6116101b1578063700417e611610175578063700417e6146104bd578063735de9f7146104e85780637ca8448a146105135780637cbfb20b1461053c57806385f8c2591461055857610230565b8063537df3b6146103c357806359bf1abe146103ec5780635b769f3c146104295780636b9e97e4146104525780636f60a6dd1461049257610230565b806330d1de80116101f857806330d1de80146102f457806339b87c8f1461031d57806341c64a2f1461034657806342153e421461037157806344337ea11461039a57610230565b8063054d50d4146102355780630b6a421d1461027257806316802fef1461029b5780631f00ca74146102b757610230565b3661023057005b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613b94565b610910565b6040516102699190613bf6565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613ca5565b6109bb565b005b6102b560048036038101906102b09190613d32565b610d1c565b005b3480156102c357600080fd5b506102de60048036038101906102d99190613dfe565b611142565b6040516102eb9190613f1c565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190613ca5565b6111f2565b005b34801561032957600080fd5b50610344600480360381019061033f9190613f3e565b61151e565b005b34801561035257600080fd5b5061035b6115f9565b6040516103689190613f7a565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190613f95565b611611565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190614010565b6119ae565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190614010565b611ba2565b005b3480156103f857600080fd5b50610413600480360381019061040e9190614010565b611d0a565b6040516104209190614058565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190614010565b611d5f565b005b34801561045e57600080fd5b50610479600480360381019061047491906140ae565b611e2f565b6040516104899493929190614143565b60405180910390f35b34801561049e57600080fd5b506104a7611fb8565b6040516104b49190614197565b60405180910390f35b3480156104c957600080fd5b506104d2611fbe565b6040516104df9190613bf6565b60405180910390f35b3480156104f457600080fd5b506104fd611fc4565b60405161050a9190614211565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190614010565b611fea565b005b61055660048036038101906105519190613d32565b6120f0565b005b34801561056457600080fd5b5061057f600480360381019061057a9190613b94565b6124e1565b60405161058c9190613bf6565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190613f3e565b61258c565b005b3480156105ca57600080fd5b506105d3612622565b6040516105e09190613f7a565b60405180910390f35b3480156105f557600080fd5b506105fe61263a565b60405161060b9190613f7a565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190614010565b612660565b005b34801561064957600080fd5b50610664600480360381019061065f9190614010565b612747565b005b34801561067257600080fd5b5061068d60048036038101906106889190614010565b612871565b005b34801561069b57600080fd5b506106b660048036038101906106b19190614010565b612941565b6040516106c39190614058565b60405180910390f35b3480156106d857600080fd5b506106e1612961565b6040516106ee9190613f7a565b60405180910390f35b34801561070357600080fd5b5061071e60048036038101906107199190613b94565b612987565b60405161072b9190613bf6565b60405180910390f35b34801561074057600080fd5b5061075b6004803603810190610756919061443e565b612a32565b6040516107689190613bf6565b60405180910390f35b34801561077d57600080fd5b50610786612d93565b6040516107939190614524565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be919061453f565b612db9565b005b3480156107d157600080fd5b506107da612f42565b6040516107e79190613f7a565b60405180910390f35b3480156107fc57600080fd5b506108176004803603810190610812919061457f565b612fda565b005b34801561082557600080fd5b50610840600480360381019061083b9190613dfe565b6130a5565b60405161084d9190613f1c565b60405180910390f35b34801561086257600080fd5b5061086b613155565b6040516108789190613bf6565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190614621565b61315b565b6040516108b59190613bf6565b60405180910390f35b3480156108ca57600080fd5b506108e560048036038101906108e09190614010565b61342c565b005b3480156108f357600080fd5b5061090e60048036038101906109099190614010565b6134fc565b005b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663054d50d48585856040518463ffffffff1660e01b8152600401610971939291906146c3565b602060405180830381865afa15801561098e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b2919061470f565b90509392505050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e90614799565b60405180910390fd5b610a53863330876135e3565b6000600267ffffffffffffffff811115610a7057610a6f61423d565b5b604051908082528060200260200182016040528015610a9e5781602001602082028036833780820191505090505b5090508681600081518110610ab657610ab56147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508581600181518110610b0557610b046147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000610b4a8661373b565b905060008187610b5a9190614817565b9050610b8989600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b600060065442610b99919061484b565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed1739848a888b876040518663ffffffff1660e01b8152600401610c0095949392919061493d565b6000604051808303816000875af1158015610c1f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c489190614a5a565b90506000841115610c8157610c808b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866138b4565b5b610caf8b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d5957338c8c8c85600181518110610ce857610ce76147b9565b5b60200260200101518c8a8d604051610d07989796959493929190614ab2565b60405180910390a15050505050505050505050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f90614799565b60405180910390fd5b6000600267ffffffffffffffff811115610dc557610dc461423d565b5b604051908082528060200260200182016040528015610df35781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110610e2d57610e2c6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508481600181518110610e7c57610e7b6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600034905060008111610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef590614b7c565b60405180910390fd5b6000610f098261373b565b905060008183610f199190614817565b9050600060065442610f2b919061484b565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ff36ab5848b898c876040518663ffffffff1660e01b8152600401610f919493929190614b9c565b60006040518083038185885af1158015610faf573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250810190610fd99190614a5a565b905060008411156110b4576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560405161102c90614c19565b60006040518083038185875af1925050503d8060008114611069576040519150601f19603f3d011682016040523d82523d6000602084013e61106e565b606091505b50509050806110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990614c7a565b60405180910390fd5b505b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d595733600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168c888560018151811061110f5761110e6147b9565b5b60200260200101518d8a8e60405161112e989796959493929190614ab2565b60405180910390a150505050505050505050565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f00ca748585856040518463ffffffff1660e01b81526004016111a393929190614d25565b600060405180830381865afa1580156111c0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111e99190614a5a565b90509392505050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590614799565b60405180910390fd5b61128a863330876135e3565b6000600267ffffffffffffffff8111156112a7576112a661423d565b5b6040519080825280602002602001820160405280156112d55781602001602082028036833780820191505090505b50905086816000815181106112ed576112ec6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050858160018151811061133c5761133b6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006113818661373b565b9050600081876113919190614817565b90506113c089600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b6000600654426113d0919061484b565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958389878a866040518663ffffffff1660e01b815260040161143595949392919061493d565b600060405180830381600087803b15801561144f57600080fd5b505af1158015611463573d6000803e3d6000fd5b50505050600083111561149e5761149d8a600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856138b4565b5b6114cc8a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d5957338b8b8b60008b898c60405161150a989796959493929190614d92565b60405180910390a150505050505050505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a190614e5c565b60405180910390fd5b6103e88111156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690614eee565b60405180910390fd5b8060048190555050565b7368b3465833fb72a70ecdf485e0e4c7bd8665fc4581565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169490614799565b60405180910390fd5b6116a9853330876135e3565b6000600267ffffffffffffffff8111156116c6576116c561423d565b5b6040519080825280602002602001820160405280156116f45781602001602082028036833780820191505090505b509050858160008151811061170c5761170b6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061177d5761177c6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006117c28661373b565b9050600081876117d29190614817565b905061180188600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b600060065442611811919061484b565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe5848a888b876040518663ffffffff1660e01b815260040161187895949392919061493d565b6000604051808303816000875af1158015611897573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118c09190614a5a565b905060008411156118f9576118f88a600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866138b4565b5b6119278a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d5957338b8760018151811061195e5761195d6147b9565b5b60200260200101518c8560018151811061197b5761197a6147b9565b5b60200260200101518c8a8d60405161199a989796959493929190614ab2565b60405180910390a150505050505050505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3190614e5c565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614f80565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f90615012565b60405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590614e5c565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb09061507e565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290614e5c565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060007361ffe014ba17989e743c5f6cb21bf9697530b21e9050611e56613ad4565b89816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505088816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508781604001818152505086816060019062ffffff16908162ffffff16815250506000816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1663c6a5026a826040518263ffffffff1660e01b8152600401611f589190615124565b6080604051808303816000875af1158015611f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9b9190615197565b809650819750829850839950505050505050945094509450949050565b610bb881565b60065481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90614e5c565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff164760405161209c90614c19565b60006040518083038185875af1925050503d80600081146120d9576040519150601f19603f3d011682016040523d82523d6000602084013e6120de565b606091505b50509050806120ec57600080fd5b5050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561217c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217390614799565b60405180910390fd5b6000600267ffffffffffffffff8111156121995761219861423d565b5b6040519080825280602002602001820160405280156121c75781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110612201576122006147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084816001815181106122505761224f6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000349050600081116122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c990614b7c565b60405180910390fd5b60006122dd8261373b565b9050600081836122ed9190614817565b90506000600654426122ff919061484b565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de95838a888b866040518663ffffffff1660e01b81526004016123639493929190614b9c565b6000604051808303818588803b15801561237c57600080fd5b505af1158015612390573d6000803e3d6000fd5b5050505050600083111561246e576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516123e690614c19565b60006040518083038185875af1925050503d8060008114612423576040519150601f19603f3d011682016040523d82523d6000602084013e612428565b606091505b505090508061246c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246390614c7a565b60405180910390fd5b505b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d595733600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b8760008c898d6040516124ce989796959493929190614d92565b60405180910390a1505050505050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385f8c2598585856040518463ffffffff1660e01b8152600401612542939291906146c3565b602060405180830381865afa15801561255f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612583919061470f565b90509392505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614e5c565b60405180910390fd5b8060068190555050565b7361ffe014ba17989e743c5f6cb21bf9697530b21e81565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e390614e5c565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca90614e5c565b60405180910390fd5b7ebd16bcdf3b904dfb2120cf2649278a396c663cf195d0729d0a8de7bb34fddd81600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516128259291906151fe565b60405180910390a180600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f490614e5c565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad615dec8585856040518463ffffffff1660e01b81526004016129e8939291906146c3565b602060405180830381865afa158015612a05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a29919061470f565b90509392505050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614799565b60405180910390fd5b6001875111612b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afb90615273565b60405180910390fd5b60018651612b12919061484b565b875114612b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4b906152df565b60405180910390fd5b600087600081518110612b6a57612b696147b9565b5b6020026020010151905060008860018a51612b859190614817565b81518110612b9657612b956147b9565b5b60200260200101519050612bac8233308a6135e3565b6000612bb78861373b565b905060008189612bc79190614817565b9050612bf684600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b60006040518060800160405280612c0d8e8e613a09565b81526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018a8152509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b858183f826040518263ffffffff1660e01b8152600401612c9591906153e1565b6020604051808303816000875af1158015612cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd8919061470f565b95506000831115612d1157612d1085600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856138b4565b5b612d3f85600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d59573386868d8a8d898e604051612d7c989796959493929190614ab2565b60405180910390a150505050509695505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3c90614e5c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab9061544f565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612eef9190613f7a565b602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061470f565b9050612f3d8383836138b4565b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd59190615484565b905090565b600060065442612fea919061484b565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e3370089898989898989896040518963ffffffff1660e01b81526004016130559897969594939291906154b1565b6060604051808303816000875af1158015613074573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613098919061552f565b5050505050505050505050565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f8585856040518463ffffffff1660e01b815260040161310693929190614d25565b600060405180830381865afa158015613123573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061314c9190614a5a565b90509392505050565b60045481565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156131e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e090614799565b60405180910390fd5b6131f5883330896135e3565b60006132008761373b565b9050600081886132109190614817565b905061323f8a600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b60006040518060e001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018962ffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001838152602001888152602001600073ffffffffffffffffffffffffffffffffffffffff168152509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166304e45aaf826040518263ffffffff1660e01b815260040161332f9190615610565b6020604051808303816000875af115801561334e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613372919061470f565b935060008311156133ab576133aa8b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856138b4565b5b6133d98b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d5957338c8c8c888b898c604051613416989796959493929190614ab2565b60405180910390a1505050979650505050505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166134b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134af90614e5c565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357f90614e5c565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b86868660405160240161361a9392919061562b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516136849190615693565b6000604051808303816000865af19150503d80600081146136c1576040519150601f19603f3d011682016040523d82523d6000602084013e6136c6565b606091505b50915091508180156136f457506000815114806136f35750808060200190518101906136f291906156d6565b5b5b613733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372a9061574f565b60405180910390fd5b505050505050565b60006103e86004548361374e919061576f565b61375891906157e0565b9050919050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b8585604051602401613794929190615811565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516137fe9190615693565b6000604051808303816000865af19150503d806000811461383b576040519150601f19603f3d011682016040523d82523d6000602084013e613840565b606091505b509150915081801561386e575060008151148061386d57508080602001905181019061386c91906156d6565b5b5b6138ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a490615886565b60405180910390fd5b5050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016138e9929190615811565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516139539190615693565b6000604051808303816000865af19150503d8060008114613990576040519150601f19603f3d011682016040523d82523d6000602084013e613995565b606091505b50915091508180156139c357506000815114806139c25750808060200190518101906139c191906156d6565b5b5b613a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f9906158f2565b60405180910390fd5b5050505050565b606082600081518110613a1f57613a1e6147b9565b5b6020026020010151604051602001613a37919061595a565b604051602081830303815290604052905060005b8251811015613acd5781838281518110613a6857613a676147b9565b5b602002602001015185600184613a7e919061484b565b81518110613a8f57613a8e6147b9565b5b6020026020010151604051602001613aa9939291906159ab565b60405160208183030381529060405291508080613ac5906159e4565b915050613a4b565b5092915050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600062ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613b7181613b5e565b8114613b7c57600080fd5b50565b600081359050613b8e81613b68565b92915050565b600080600060608486031215613bad57613bac613b54565b5b6000613bbb86828701613b7f565b9350506020613bcc86828701613b7f565b9250506040613bdd86828701613b7f565b9150509250925092565b613bf081613b5e565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c3c82613c11565b9050919050565b613c4c81613c31565b8114613c5757600080fd5b50565b600081359050613c6981613c43565b92915050565b6000819050919050565b613c8281613c6f565b8114613c8d57600080fd5b50565b600081359050613c9f81613c79565b92915050565b60008060008060008060c08789031215613cc257613cc1613b54565b5b6000613cd089828a01613c5a565b9650506020613ce189828a01613c5a565b9550506040613cf289828a01613b7f565b9450506060613d0389828a01613b7f565b9350506080613d1489828a01613c5a565b92505060a0613d2589828a01613c90565b9150509295509295509295565b60008060008060808587031215613d4c57613d4b613b54565b5b6000613d5a87828801613c5a565b9450506020613d6b87828801613b7f565b9350506040613d7c87828801613c5a565b9250506060613d8d87828801613c90565b91505092959194509250565b600080fd5b600080fd5b600080fd5b60008083601f840112613dbe57613dbd613d99565b5b8235905067ffffffffffffffff811115613ddb57613dda613d9e565b5b602083019150836020820283011115613df757613df6613da3565b5b9250929050565b600080600060408486031215613e1757613e16613b54565b5b6000613e2586828701613b7f565b935050602084013567ffffffffffffffff811115613e4657613e45613b59565b5b613e5286828701613da8565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e9381613b5e565b82525050565b6000613ea58383613e8a565b60208301905092915050565b6000602082019050919050565b6000613ec982613e5e565b613ed38185613e69565b9350613ede83613e7a565b8060005b83811015613f0f578151613ef68882613e99565b9750613f0183613eb1565b925050600181019050613ee2565b5085935050505092915050565b60006020820190508181036000830152613f368184613ebe565b905092915050565b600060208284031215613f5457613f53613b54565b5b6000613f6284828501613b7f565b91505092915050565b613f7481613c31565b82525050565b6000602082019050613f8f6000830184613f6b565b92915050565b600080600080600060a08688031215613fb157613fb0613b54565b5b6000613fbf88828901613c5a565b9550506020613fd088828901613b7f565b9450506040613fe188828901613b7f565b9350506060613ff288828901613c5a565b925050608061400388828901613c90565b9150509295509295909350565b60006020828403121561402657614025613b54565b5b600061403484828501613c5a565b91505092915050565b60008115159050919050565b6140528161403d565b82525050565b600060208201905061406d6000830184614049565b92915050565b600062ffffff82169050919050565b61408b81614073565b811461409657600080fd5b50565b6000813590506140a881614082565b92915050565b600080600080608085870312156140c8576140c7613b54565b5b60006140d687828801613c5a565b94505060206140e787828801613c5a565b93505060406140f887828801613b7f565b925050606061410987828801614099565b91505092959194509250565b61411e81613c11565b82525050565b600063ffffffff82169050919050565b61413d81614124565b82525050565b60006080820190506141586000830187613be7565b6141656020830186614115565b6141726040830185614134565b61417f6060830184613be7565b95945050505050565b61419181614073565b82525050565b60006020820190506141ac6000830184614188565b92915050565b6000819050919050565b60006141d76141d26141cd84613c11565b6141b2565b613c11565b9050919050565b60006141e9826141bc565b9050919050565b60006141fb826141de565b9050919050565b61420b816141f0565b82525050565b60006020820190506142266000830184614202565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142758261422c565b810181811067ffffffffffffffff821117156142945761429361423d565b5b80604052505050565b60006142a7613b4a565b90506142b3828261426c565b919050565b600067ffffffffffffffff8211156142d3576142d261423d565b5b602082029050602081019050919050565b60006142f76142f2846142b8565b61429d565b9050808382526020820190506020840283018581111561431a57614319613da3565b5b835b81811015614343578061432f8882613c5a565b84526020840193505060208101905061431c565b5050509392505050565b600082601f83011261436257614361613d99565b5b81356143728482602086016142e4565b91505092915050565b600067ffffffffffffffff8211156143965761439561423d565b5b602082029050602081019050919050565b60006143ba6143b58461437b565b61429d565b905080838252602082019050602084028301858111156143dd576143dc613da3565b5b835b8181101561440657806143f28882614099565b8452602084019350506020810190506143df565b5050509392505050565b600082601f83011261442557614424613d99565b5b81356144358482602086016143a7565b91505092915050565b60008060008060008060c0878903121561445b5761445a613b54565b5b600087013567ffffffffffffffff81111561447957614478613b59565b5b61448589828a0161434d565b965050602087013567ffffffffffffffff8111156144a6576144a5613b59565b5b6144b289828a01614410565b95505060406144c389828a01613b7f565b94505060606144d489828a01613b7f565b93505060806144e589828a01613c5a565b92505060a06144f689828a01613c90565b9150509295509295509295565b600061450e826141de565b9050919050565b61451e81614503565b82525050565b60006020820190506145396000830184614515565b92915050565b6000806040838503121561455657614555613b54565b5b600061456485828601613c5a565b925050602061457585828601613c5a565b9150509250929050565b600080600080600080600060e0888a03121561459e5761459d613b54565b5b60006145ac8a828b01613c5a565b97505060206145bd8a828b01613c5a565b96505060406145ce8a828b01613b7f565b95505060606145df8a828b01613b7f565b94505060806145f08a828b01613b7f565b93505060a06146018a828b01613b7f565b92505060c06146128a828b01613c5a565b91505092959891949750929550565b600080600080600080600060e0888a0312156146405761463f613b54565b5b600061464e8a828b01613c5a565b975050602061465f8a828b01613c5a565b96505060406146708a828b01613b7f565b95505060606146818a828b01614099565b94505060806146928a828b01613b7f565b93505060a06146a38a828b01613c5a565b92505060c06146b48a828b01613c90565b91505092959891949750929550565b60006060820190506146d86000830186613be7565b6146e56020830185613be7565b6146f26040830184613be7565b949350505050565b60008151905061470981613b68565b92915050565b60006020828403121561472557614724613b54565b5b6000614733848285016146fa565b91505092915050565b600082825260208201905092915050565b7f55736572206973206f6e2074686520626c61636b6c6973742e00000000000000600082015250565b600061478360198361473c565b915061478e8261474d565b602082019050919050565b600060208201905081810360008301526147b281614776565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061482282613b5e565b915061482d83613b5e565b9250828203905081811115614845576148446147e8565b5b92915050565b600061485682613b5e565b915061486183613b5e565b9250828201905080821115614879576148786147e8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6148b481613c31565b82525050565b60006148c683836148ab565b60208301905092915050565b6000602082019050919050565b60006148ea8261487f565b6148f4818561488a565b93506148ff8361489b565b8060005b8381101561493057815161491788826148ba565b9750614922836148d2565b925050600181019050614903565b5085935050505092915050565b600060a0820190506149526000830188613be7565b61495f6020830187613be7565b818103604083015261497181866148df565b90506149806060830185613f6b565b61498d6080830184613be7565b9695505050505050565b600067ffffffffffffffff8211156149b2576149b161423d565b5b602082029050602081019050919050565b60006149d66149d184614997565b61429d565b905080838252602082019050602084028301858111156149f9576149f8613da3565b5b835b81811015614a225780614a0e88826146fa565b8452602084019350506020810190506149fb565b5050509392505050565b600082601f830112614a4157614a40613d99565b5b8151614a518482602086016149c3565b91505092915050565b600060208284031215614a7057614a6f613b54565b5b600082015167ffffffffffffffff811115614a8e57614a8d613b59565b5b614a9a84828501614a2c565b91505092915050565b614aac81613c6f565b82525050565b600061010082019050614ac8600083018b613f6b565b614ad5602083018a613f6b565b614ae26040830189613f6b565b614aef6060830188613be7565b614afc6080830187613be7565b614b0960a0830186613f6b565b614b1660c0830185613be7565b614b2360e0830184614aa3565b9998505050505050505050565b7f4e6f204554482073656e74000000000000000000000000000000000000000000600082015250565b6000614b66600b8361473c565b9150614b7182614b30565b602082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b6000608082019050614bb16000830187613be7565b8181036020830152614bc381866148df565b9050614bd26040830185613f6b565b614bdf6060830184613be7565b95945050505050565b600081905092915050565b50565b6000614c03600083614be8565b9150614c0e82614bf3565b600082019050919050565b6000614c2482614bf6565b9150819050919050565b7f455448207472616e73666572206661696c656400000000000000000000000000600082015250565b6000614c6460138361473c565b9150614c6f82614c2e565b602082019050919050565b60006020820190508181036000830152614c9381614c57565b9050919050565b6000819050919050565b6000614cb36020840184613c5a565b905092915050565b6000602082019050919050565b6000614cd4838561488a565b9350614cdf82614c9a565b8060005b85811015614d1857614cf58284614ca4565b614cff88826148ba565b9750614d0a83614cbb565b925050600181019050614ce3565b5085925050509392505050565b6000604082019050614d3a6000830186613be7565b8181036020830152614d4d818486614cc8565b9050949350505050565b6000819050919050565b6000614d7c614d77614d7284614d57565b6141b2565b613b5e565b9050919050565b614d8c81614d61565b82525050565b600061010082019050614da8600083018b613f6b565b614db5602083018a613f6b565b614dc26040830189613f6b565b614dcf6060830188613be7565b614ddc6080830187614d83565b614de960a0830186613f6b565b614df660c0830185613be7565b614e0360e0830184614aa3565b9998505050505050505050565b7f4e6f74207375706572206f70657261746f720000000000000000000000000000600082015250565b6000614e4660128361473c565b9150614e5182614e10565b602082019050919050565b60006020820190508181036000830152614e7581614e39565b9050919050565b7f436f6d6d697373696f6e2070657263656e74616765206d757374206265206c6560008201527f7373207468616e206f7220657175616c20746f20313030000000000000000000602082015250565b6000614ed860378361473c565b9150614ee382614e7c565b604082019050919050565b60006020820190508181036000830152614f0781614ecb565b9050919050565b7f5573657220697320616c7265616479206f6e2074686520626c61636b6c69737460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f6a60218361473c565b9150614f7582614f0e565b604082019050919050565b60006020820190508181036000830152614f9981614f5d565b9050919050565b7f43616e6e6f7420626c61636b6c69737420746f6b656e277320763220726f757460008201527f65722e0000000000000000000000000000000000000000000000000000000000602082015250565b6000614ffc60238361473c565b915061500782614fa0565b604082019050919050565b6000602082019050818103600083015261502b81614fef565b9050919050565b7f55736572206973206e6f74206f6e2074686520626c61636b6c6973742e000000600082015250565b6000615068601d8361473c565b915061507382615032565b602082019050919050565b600060208201905081810360008301526150978161505b565b9050919050565b6150a781614073565b82525050565b6150b681613c11565b82525050565b60a0820160008201516150d260008501826148ab565b5060208201516150e560208501826148ab565b5060408201516150f86040850182613e8a565b50606082015161510b606085018261509e565b50608082015161511e60808501826150ad565b50505050565b600060a08201905061513960008301846150bc565b92915050565b61514881613c11565b811461515357600080fd5b50565b6000815190506151658161513f565b92915050565b61517481614124565b811461517f57600080fd5b50565b6000815190506151918161516b565b92915050565b600080600080608085870312156151b1576151b0613b54565b5b60006151bf878288016146fa565b94505060206151d087828801615156565b93505060406151e187828801615182565b92505060606151f2878288016146fa565b91505092959194509250565b60006040820190506152136000830185613f6b565b6152206020830184613f6b565b9392505050565b7f5f7061746820696e76616c696421000000000000000000000000000000000000600082015250565b600061525d600e8361473c565b915061526882615227565b602082019050919050565b6000602082019050818103600083015261528c81615250565b9050919050565b7f5f70617468206f72205f66656520696e76616c69642100000000000000000000600082015250565b60006152c960168361473c565b91506152d482615293565b602082019050919050565b600060208201905081810360008301526152f8816152bc565b9050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561533957808201518184015260208101905061531e565b60008484015250505050565b6000615350826152ff565b61535a818561530a565b935061536a81856020860161531b565b6153738161422c565b840191505092915050565b6000608083016000830151848203600086015261539b8282615345565b91505060208301516153b060208601826148ab565b5060408301516153c36040860182613e8a565b5060608301516153d66060860182613e8a565b508091505092915050565b600060208201905081810360008301526153fb818461537e565b905092915050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000615439601a8361473c565b915061544482615403565b602082019050919050565b600060208201905081810360008301526154688161542c565b9050919050565b60008151905061547e81613c43565b92915050565b60006020828403121561549a57615499613b54565b5b60006154a88482850161546f565b91505092915050565b6000610100820190506154c7600083018b613f6b565b6154d4602083018a613f6b565b6154e16040830189613be7565b6154ee6060830188613be7565b6154fb6080830187613be7565b61550860a0830186613be7565b61551560c0830185613f6b565b61552260e0830184613be7565b9998505050505050505050565b60008060006060848603121561554857615547613b54565b5b6000615556868287016146fa565b9350506020615567868287016146fa565b9250506040615578868287016146fa565b9150509250925092565b60e08201600082015161559860008501826148ab565b5060208201516155ab60208501826148ab565b5060408201516155be604085018261509e565b5060608201516155d160608501826148ab565b5060808201516155e46080850182613e8a565b5060a08201516155f760a0850182613e8a565b5060c082015161560a60c08501826150ad565b50505050565b600060e0820190506156256000830184615582565b92915050565b60006060820190506156406000830186613f6b565b61564d6020830185613f6b565b61565a6040830184613be7565b949350505050565b600061566d826152ff565b6156778185614be8565b935061568781856020860161531b565b80840191505092915050565b600061569f8284615662565b915081905092915050565b6156b38161403d565b81146156be57600080fd5b50565b6000815190506156d0816156aa565b92915050565b6000602082840312156156ec576156eb613b54565b5b60006156fa848285016156c1565b91505092915050565b7f5354460000000000000000000000000000000000000000000000000000000000600082015250565b600061573960038361473c565b915061574482615703565b602082019050919050565b600060208201905081810360008301526157688161572c565b9050919050565b600061577a82613b5e565b915061578583613b5e565b925082820261579381613b5e565b915082820484148315176157aa576157a96147e8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006157eb82613b5e565b91506157f683613b5e565b925082615806576158056157b1565b5b828204905092915050565b60006040820190506158266000830185613f6b565b6158336020830184613be7565b9392505050565b7f5341000000000000000000000000000000000000000000000000000000000000600082015250565b600061587060028361473c565b915061587b8261583a565b602082019050919050565b6000602082019050818103600083015261589f81615863565b9050919050565b7f5354000000000000000000000000000000000000000000000000000000000000600082015250565b60006158dc60028361473c565b91506158e7826158a6565b602082019050919050565b6000602082019050818103600083015261590b816158cf565b9050919050565b60008160601b9050919050565b600061592a82615912565b9050919050565b600061593c8261591f565b9050919050565b61595461594f82613c31565b615931565b82525050565b60006159668284615943565b60148201915081905092915050565b60008160e81b9050919050565b600061598d82615975565b9050919050565b6159a56159a082614073565b615982565b82525050565b60006159b78286615662565b91506159c38285615994565b6003820191506159d38284615943565b601482019150819050949350505050565b60006159ef82613b5e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a2157615a206147e8565b5b60018201905091905056fea26469706673582212203fee6331ee170b4fb4b5d540d77a456c7ea5c0a97ddb0081235a9fdd187f6dc864736f6c63430008130033
Deployed Bytecode
0x6080604052600436106102295760003560e01c806386a466cc11610123578063adcf72dd116100ab578063d06ca61f1161006f578063d06ca61f14610819578063d575fe6414610856578063e4528b0414610881578063f65844b3146108be578063fad8b32a146108e757610230565b8063adcf72dd14610734578063b631e80b14610771578063bc205ad31461079c578063c45a0155146107c5578063ca3d6539146107f057610230565b8063975cf85d116100f2578063975cf85d1461063d5780639adf6415146106665780639f40c9a71461068f578063ad5c4648146106cc578063ad615dec146106f757610230565b806386a466cc1461059557806388d9ef7e146105be5780638b385a6f146105e9578063959b8c3f1461061457610230565b8063537df3b6116101b1578063700417e611610175578063700417e6146104bd578063735de9f7146104e85780637ca8448a146105135780637cbfb20b1461053c57806385f8c2591461055857610230565b8063537df3b6146103c357806359bf1abe146103ec5780635b769f3c146104295780636b9e97e4146104525780636f60a6dd1461049257610230565b806330d1de80116101f857806330d1de80146102f457806339b87c8f1461031d57806341c64a2f1461034657806342153e421461037157806344337ea11461039a57610230565b8063054d50d4146102355780630b6a421d1461027257806316802fef1461029b5780631f00ca74146102b757610230565b3661023057005b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613b94565b610910565b6040516102699190613bf6565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613ca5565b6109bb565b005b6102b560048036038101906102b09190613d32565b610d1c565b005b3480156102c357600080fd5b506102de60048036038101906102d99190613dfe565b611142565b6040516102eb9190613f1c565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190613ca5565b6111f2565b005b34801561032957600080fd5b50610344600480360381019061033f9190613f3e565b61151e565b005b34801561035257600080fd5b5061035b6115f9565b6040516103689190613f7a565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190613f95565b611611565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190614010565b6119ae565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190614010565b611ba2565b005b3480156103f857600080fd5b50610413600480360381019061040e9190614010565b611d0a565b6040516104209190614058565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190614010565b611d5f565b005b34801561045e57600080fd5b50610479600480360381019061047491906140ae565b611e2f565b6040516104899493929190614143565b60405180910390f35b34801561049e57600080fd5b506104a7611fb8565b6040516104b49190614197565b60405180910390f35b3480156104c957600080fd5b506104d2611fbe565b6040516104df9190613bf6565b60405180910390f35b3480156104f457600080fd5b506104fd611fc4565b60405161050a9190614211565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190614010565b611fea565b005b61055660048036038101906105519190613d32565b6120f0565b005b34801561056457600080fd5b5061057f600480360381019061057a9190613b94565b6124e1565b60405161058c9190613bf6565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190613f3e565b61258c565b005b3480156105ca57600080fd5b506105d3612622565b6040516105e09190613f7a565b60405180910390f35b3480156105f557600080fd5b506105fe61263a565b60405161060b9190613f7a565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190614010565b612660565b005b34801561064957600080fd5b50610664600480360381019061065f9190614010565b612747565b005b34801561067257600080fd5b5061068d60048036038101906106889190614010565b612871565b005b34801561069b57600080fd5b506106b660048036038101906106b19190614010565b612941565b6040516106c39190614058565b60405180910390f35b3480156106d857600080fd5b506106e1612961565b6040516106ee9190613f7a565b60405180910390f35b34801561070357600080fd5b5061071e60048036038101906107199190613b94565b612987565b60405161072b9190613bf6565b60405180910390f35b34801561074057600080fd5b5061075b6004803603810190610756919061443e565b612a32565b6040516107689190613bf6565b60405180910390f35b34801561077d57600080fd5b50610786612d93565b6040516107939190614524565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be919061453f565b612db9565b005b3480156107d157600080fd5b506107da612f42565b6040516107e79190613f7a565b60405180910390f35b3480156107fc57600080fd5b506108176004803603810190610812919061457f565b612fda565b005b34801561082557600080fd5b50610840600480360381019061083b9190613dfe565b6130a5565b60405161084d9190613f1c565b60405180910390f35b34801561086257600080fd5b5061086b613155565b6040516108789190613bf6565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190614621565b61315b565b6040516108b59190613bf6565b60405180910390f35b3480156108ca57600080fd5b506108e560048036038101906108e09190614010565b61342c565b005b3480156108f357600080fd5b5061090e60048036038101906109099190614010565b6134fc565b005b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663054d50d48585856040518463ffffffff1660e01b8152600401610971939291906146c3565b602060405180830381865afa15801561098e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b2919061470f565b90509392505050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e90614799565b60405180910390fd5b610a53863330876135e3565b6000600267ffffffffffffffff811115610a7057610a6f61423d565b5b604051908082528060200260200182016040528015610a9e5781602001602082028036833780820191505090505b5090508681600081518110610ab657610ab56147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508581600181518110610b0557610b046147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000610b4a8661373b565b905060008187610b5a9190614817565b9050610b8989600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b600060065442610b99919061484b565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed1739848a888b876040518663ffffffff1660e01b8152600401610c0095949392919061493d565b6000604051808303816000875af1158015610c1f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c489190614a5a565b90506000841115610c8157610c808b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866138b4565b5b610caf8b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d5957338c8c8c85600181518110610ce857610ce76147b9565b5b60200260200101518c8a8d604051610d07989796959493929190614ab2565b60405180910390a15050505050505050505050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f90614799565b60405180910390fd5b6000600267ffffffffffffffff811115610dc557610dc461423d565b5b604051908082528060200260200182016040528015610df35781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110610e2d57610e2c6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508481600181518110610e7c57610e7b6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600034905060008111610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef590614b7c565b60405180910390fd5b6000610f098261373b565b905060008183610f199190614817565b9050600060065442610f2b919061484b565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ff36ab5848b898c876040518663ffffffff1660e01b8152600401610f919493929190614b9c565b60006040518083038185885af1158015610faf573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250810190610fd99190614a5a565b905060008411156110b4576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560405161102c90614c19565b60006040518083038185875af1925050503d8060008114611069576040519150601f19603f3d011682016040523d82523d6000602084013e61106e565b606091505b50509050806110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990614c7a565b60405180910390fd5b505b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d595733600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168c888560018151811061110f5761110e6147b9565b5b60200260200101518d8a8e60405161112e989796959493929190614ab2565b60405180910390a150505050505050505050565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f00ca748585856040518463ffffffff1660e01b81526004016111a393929190614d25565b600060405180830381865afa1580156111c0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111e99190614a5a565b90509392505050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590614799565b60405180910390fd5b61128a863330876135e3565b6000600267ffffffffffffffff8111156112a7576112a661423d565b5b6040519080825280602002602001820160405280156112d55781602001602082028036833780820191505090505b50905086816000815181106112ed576112ec6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050858160018151811061133c5761133b6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006113818661373b565b9050600081876113919190614817565b90506113c089600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b6000600654426113d0919061484b565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958389878a866040518663ffffffff1660e01b815260040161143595949392919061493d565b600060405180830381600087803b15801561144f57600080fd5b505af1158015611463573d6000803e3d6000fd5b50505050600083111561149e5761149d8a600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856138b4565b5b6114cc8a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d5957338b8b8b60008b898c60405161150a989796959493929190614d92565b60405180910390a150505050505050505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a190614e5c565b60405180910390fd5b6103e88111156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690614eee565b60405180910390fd5b8060048190555050565b7368b3465833fb72a70ecdf485e0e4c7bd8665fc4581565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169490614799565b60405180910390fd5b6116a9853330876135e3565b6000600267ffffffffffffffff8111156116c6576116c561423d565b5b6040519080825280602002602001820160405280156116f45781602001602082028036833780820191505090505b509050858160008151811061170c5761170b6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061177d5761177c6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006117c28661373b565b9050600081876117d29190614817565b905061180188600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b600060065442611811919061484b565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe5848a888b876040518663ffffffff1660e01b815260040161187895949392919061493d565b6000604051808303816000875af1158015611897573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118c09190614a5a565b905060008411156118f9576118f88a600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866138b4565b5b6119278a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d5957338b8760018151811061195e5761195d6147b9565b5b60200260200101518c8560018151811061197b5761197a6147b9565b5b60200260200101518c8a8d60405161199a989796959493929190614ab2565b60405180910390a150505050505050505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3190614e5c565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614f80565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f90615012565b60405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590614e5c565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb09061507e565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290614e5c565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060007361ffe014ba17989e743c5f6cb21bf9697530b21e9050611e56613ad4565b89816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505088816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508781604001818152505086816060019062ffffff16908162ffffff16815250506000816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1663c6a5026a826040518263ffffffff1660e01b8152600401611f589190615124565b6080604051808303816000875af1158015611f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9b9190615197565b809650819750829850839950505050505050945094509450949050565b610bb881565b60065481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90614e5c565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff164760405161209c90614c19565b60006040518083038185875af1925050503d80600081146120d9576040519150601f19603f3d011682016040523d82523d6000602084013e6120de565b606091505b50509050806120ec57600080fd5b5050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561217c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217390614799565b60405180910390fd5b6000600267ffffffffffffffff8111156121995761219861423d565b5b6040519080825280602002602001820160405280156121c75781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110612201576122006147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084816001815181106122505761224f6147b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000349050600081116122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c990614b7c565b60405180910390fd5b60006122dd8261373b565b9050600081836122ed9190614817565b90506000600654426122ff919061484b565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de95838a888b866040518663ffffffff1660e01b81526004016123639493929190614b9c565b6000604051808303818588803b15801561237c57600080fd5b505af1158015612390573d6000803e3d6000fd5b5050505050600083111561246e576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516123e690614c19565b60006040518083038185875af1925050503d8060008114612423576040519150601f19603f3d011682016040523d82523d6000602084013e612428565b606091505b505090508061246c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246390614c7a565b60405180910390fd5b505b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d595733600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b8760008c898d6040516124ce989796959493929190614d92565b60405180910390a1505050505050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385f8c2598585856040518463ffffffff1660e01b8152600401612542939291906146c3565b602060405180830381865afa15801561255f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612583919061470f565b90509392505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614e5c565b60405180910390fd5b8060068190555050565b7361ffe014ba17989e743c5f6cb21bf9697530b21e81565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e390614e5c565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca90614e5c565b60405180910390fd5b7ebd16bcdf3b904dfb2120cf2649278a396c663cf195d0729d0a8de7bb34fddd81600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516128259291906151fe565b60405180910390a180600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f490614e5c565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad615dec8585856040518463ffffffff1660e01b81526004016129e8939291906146c3565b602060405180830381865afa158015612a05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a29919061470f565b90509392505050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614799565b60405180910390fd5b6001875111612b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afb90615273565b60405180910390fd5b60018651612b12919061484b565b875114612b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4b906152df565b60405180910390fd5b600087600081518110612b6a57612b696147b9565b5b6020026020010151905060008860018a51612b859190614817565b81518110612b9657612b956147b9565b5b60200260200101519050612bac8233308a6135e3565b6000612bb78861373b565b905060008189612bc79190614817565b9050612bf684600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b60006040518060800160405280612c0d8e8e613a09565b81526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018a8152509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b858183f826040518263ffffffff1660e01b8152600401612c9591906153e1565b6020604051808303816000875af1158015612cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd8919061470f565b95506000831115612d1157612d1085600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856138b4565b5b612d3f85600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d59573386868d8a8d898e604051612d7c989796959493929190614ab2565b60405180910390a150505050509695505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3c90614e5c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab9061544f565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612eef9190613f7a565b602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061470f565b9050612f3d8383836138b4565b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd59190615484565b905090565b600060065442612fea919061484b565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e3370089898989898989896040518963ffffffff1660e01b81526004016130559897969594939291906154b1565b6060604051808303816000875af1158015613074573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613098919061552f565b5050505050505050505050565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f8585856040518463ffffffff1660e01b815260040161310693929190614d25565b600060405180830381865afa158015613123573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061314c9190614a5a565b90509392505050565b60045481565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156131e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e090614799565b60405180910390fd5b6131f5883330896135e3565b60006132008761373b565b9050600081886132109190614817565b905061323f8a600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361375f565b60006040518060e001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018962ffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001838152602001888152602001600073ffffffffffffffffffffffffffffffffffffffff168152509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166304e45aaf826040518263ffffffff1660e01b815260040161332f9190615610565b6020604051808303816000875af115801561334e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613372919061470f565b935060008311156133ab576133aa8b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856138b4565b5b6133d98b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061375f565b7fdded0876e2a1e27079e8092b309d654da8318c61e03d8664329e4f6baa9d5957338c8c8c888b898c604051613416989796959493929190614ab2565b60405180910390a1505050979650505050505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166134b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134af90614e5c565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357f90614e5c565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b86868660405160240161361a9392919061562b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516136849190615693565b6000604051808303816000865af19150503d80600081146136c1576040519150601f19603f3d011682016040523d82523d6000602084013e6136c6565b606091505b50915091508180156136f457506000815114806136f35750808060200190518101906136f291906156d6565b5b5b613733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372a9061574f565b60405180910390fd5b505050505050565b60006103e86004548361374e919061576f565b61375891906157e0565b9050919050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b8585604051602401613794929190615811565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516137fe9190615693565b6000604051808303816000865af19150503d806000811461383b576040519150601f19603f3d011682016040523d82523d6000602084013e613840565b606091505b509150915081801561386e575060008151148061386d57508080602001905181019061386c91906156d6565b5b5b6138ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a490615886565b60405180910390fd5b5050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016138e9929190615811565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516139539190615693565b6000604051808303816000865af19150503d8060008114613990576040519150601f19603f3d011682016040523d82523d6000602084013e613995565b606091505b50915091508180156139c357506000815114806139c25750808060200190518101906139c191906156d6565b5b5b613a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f9906158f2565b60405180910390fd5b5050505050565b606082600081518110613a1f57613a1e6147b9565b5b6020026020010151604051602001613a37919061595a565b604051602081830303815290604052905060005b8251811015613acd5781838281518110613a6857613a676147b9565b5b602002602001015185600184613a7e919061484b565b81518110613a8f57613a8e6147b9565b5b6020026020010151604051602001613aa9939291906159ab565b60405160208183030381529060405291508080613ac5906159e4565b915050613a4b565b5092915050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600062ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613b7181613b5e565b8114613b7c57600080fd5b50565b600081359050613b8e81613b68565b92915050565b600080600060608486031215613bad57613bac613b54565b5b6000613bbb86828701613b7f565b9350506020613bcc86828701613b7f565b9250506040613bdd86828701613b7f565b9150509250925092565b613bf081613b5e565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c3c82613c11565b9050919050565b613c4c81613c31565b8114613c5757600080fd5b50565b600081359050613c6981613c43565b92915050565b6000819050919050565b613c8281613c6f565b8114613c8d57600080fd5b50565b600081359050613c9f81613c79565b92915050565b60008060008060008060c08789031215613cc257613cc1613b54565b5b6000613cd089828a01613c5a565b9650506020613ce189828a01613c5a565b9550506040613cf289828a01613b7f565b9450506060613d0389828a01613b7f565b9350506080613d1489828a01613c5a565b92505060a0613d2589828a01613c90565b9150509295509295509295565b60008060008060808587031215613d4c57613d4b613b54565b5b6000613d5a87828801613c5a565b9450506020613d6b87828801613b7f565b9350506040613d7c87828801613c5a565b9250506060613d8d87828801613c90565b91505092959194509250565b600080fd5b600080fd5b600080fd5b60008083601f840112613dbe57613dbd613d99565b5b8235905067ffffffffffffffff811115613ddb57613dda613d9e565b5b602083019150836020820283011115613df757613df6613da3565b5b9250929050565b600080600060408486031215613e1757613e16613b54565b5b6000613e2586828701613b7f565b935050602084013567ffffffffffffffff811115613e4657613e45613b59565b5b613e5286828701613da8565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e9381613b5e565b82525050565b6000613ea58383613e8a565b60208301905092915050565b6000602082019050919050565b6000613ec982613e5e565b613ed38185613e69565b9350613ede83613e7a565b8060005b83811015613f0f578151613ef68882613e99565b9750613f0183613eb1565b925050600181019050613ee2565b5085935050505092915050565b60006020820190508181036000830152613f368184613ebe565b905092915050565b600060208284031215613f5457613f53613b54565b5b6000613f6284828501613b7f565b91505092915050565b613f7481613c31565b82525050565b6000602082019050613f8f6000830184613f6b565b92915050565b600080600080600060a08688031215613fb157613fb0613b54565b5b6000613fbf88828901613c5a565b9550506020613fd088828901613b7f565b9450506040613fe188828901613b7f565b9350506060613ff288828901613c5a565b925050608061400388828901613c90565b9150509295509295909350565b60006020828403121561402657614025613b54565b5b600061403484828501613c5a565b91505092915050565b60008115159050919050565b6140528161403d565b82525050565b600060208201905061406d6000830184614049565b92915050565b600062ffffff82169050919050565b61408b81614073565b811461409657600080fd5b50565b6000813590506140a881614082565b92915050565b600080600080608085870312156140c8576140c7613b54565b5b60006140d687828801613c5a565b94505060206140e787828801613c5a565b93505060406140f887828801613b7f565b925050606061410987828801614099565b91505092959194509250565b61411e81613c11565b82525050565b600063ffffffff82169050919050565b61413d81614124565b82525050565b60006080820190506141586000830187613be7565b6141656020830186614115565b6141726040830185614134565b61417f6060830184613be7565b95945050505050565b61419181614073565b82525050565b60006020820190506141ac6000830184614188565b92915050565b6000819050919050565b60006141d76141d26141cd84613c11565b6141b2565b613c11565b9050919050565b60006141e9826141bc565b9050919050565b60006141fb826141de565b9050919050565b61420b816141f0565b82525050565b60006020820190506142266000830184614202565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142758261422c565b810181811067ffffffffffffffff821117156142945761429361423d565b5b80604052505050565b60006142a7613b4a565b90506142b3828261426c565b919050565b600067ffffffffffffffff8211156142d3576142d261423d565b5b602082029050602081019050919050565b60006142f76142f2846142b8565b61429d565b9050808382526020820190506020840283018581111561431a57614319613da3565b5b835b81811015614343578061432f8882613c5a565b84526020840193505060208101905061431c565b5050509392505050565b600082601f83011261436257614361613d99565b5b81356143728482602086016142e4565b91505092915050565b600067ffffffffffffffff8211156143965761439561423d565b5b602082029050602081019050919050565b60006143ba6143b58461437b565b61429d565b905080838252602082019050602084028301858111156143dd576143dc613da3565b5b835b8181101561440657806143f28882614099565b8452602084019350506020810190506143df565b5050509392505050565b600082601f83011261442557614424613d99565b5b81356144358482602086016143a7565b91505092915050565b60008060008060008060c0878903121561445b5761445a613b54565b5b600087013567ffffffffffffffff81111561447957614478613b59565b5b61448589828a0161434d565b965050602087013567ffffffffffffffff8111156144a6576144a5613b59565b5b6144b289828a01614410565b95505060406144c389828a01613b7f565b94505060606144d489828a01613b7f565b93505060806144e589828a01613c5a565b92505060a06144f689828a01613c90565b9150509295509295509295565b600061450e826141de565b9050919050565b61451e81614503565b82525050565b60006020820190506145396000830184614515565b92915050565b6000806040838503121561455657614555613b54565b5b600061456485828601613c5a565b925050602061457585828601613c5a565b9150509250929050565b600080600080600080600060e0888a03121561459e5761459d613b54565b5b60006145ac8a828b01613c5a565b97505060206145bd8a828b01613c5a565b96505060406145ce8a828b01613b7f565b95505060606145df8a828b01613b7f565b94505060806145f08a828b01613b7f565b93505060a06146018a828b01613b7f565b92505060c06146128a828b01613c5a565b91505092959891949750929550565b600080600080600080600060e0888a0312156146405761463f613b54565b5b600061464e8a828b01613c5a565b975050602061465f8a828b01613c5a565b96505060406146708a828b01613b7f565b95505060606146818a828b01614099565b94505060806146928a828b01613b7f565b93505060a06146a38a828b01613c5a565b92505060c06146b48a828b01613c90565b91505092959891949750929550565b60006060820190506146d86000830186613be7565b6146e56020830185613be7565b6146f26040830184613be7565b949350505050565b60008151905061470981613b68565b92915050565b60006020828403121561472557614724613b54565b5b6000614733848285016146fa565b91505092915050565b600082825260208201905092915050565b7f55736572206973206f6e2074686520626c61636b6c6973742e00000000000000600082015250565b600061478360198361473c565b915061478e8261474d565b602082019050919050565b600060208201905081810360008301526147b281614776565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061482282613b5e565b915061482d83613b5e565b9250828203905081811115614845576148446147e8565b5b92915050565b600061485682613b5e565b915061486183613b5e565b9250828201905080821115614879576148786147e8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6148b481613c31565b82525050565b60006148c683836148ab565b60208301905092915050565b6000602082019050919050565b60006148ea8261487f565b6148f4818561488a565b93506148ff8361489b565b8060005b8381101561493057815161491788826148ba565b9750614922836148d2565b925050600181019050614903565b5085935050505092915050565b600060a0820190506149526000830188613be7565b61495f6020830187613be7565b818103604083015261497181866148df565b90506149806060830185613f6b565b61498d6080830184613be7565b9695505050505050565b600067ffffffffffffffff8211156149b2576149b161423d565b5b602082029050602081019050919050565b60006149d66149d184614997565b61429d565b905080838252602082019050602084028301858111156149f9576149f8613da3565b5b835b81811015614a225780614a0e88826146fa565b8452602084019350506020810190506149fb565b5050509392505050565b600082601f830112614a4157614a40613d99565b5b8151614a518482602086016149c3565b91505092915050565b600060208284031215614a7057614a6f613b54565b5b600082015167ffffffffffffffff811115614a8e57614a8d613b59565b5b614a9a84828501614a2c565b91505092915050565b614aac81613c6f565b82525050565b600061010082019050614ac8600083018b613f6b565b614ad5602083018a613f6b565b614ae26040830189613f6b565b614aef6060830188613be7565b614afc6080830187613be7565b614b0960a0830186613f6b565b614b1660c0830185613be7565b614b2360e0830184614aa3565b9998505050505050505050565b7f4e6f204554482073656e74000000000000000000000000000000000000000000600082015250565b6000614b66600b8361473c565b9150614b7182614b30565b602082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b6000608082019050614bb16000830187613be7565b8181036020830152614bc381866148df565b9050614bd26040830185613f6b565b614bdf6060830184613be7565b95945050505050565b600081905092915050565b50565b6000614c03600083614be8565b9150614c0e82614bf3565b600082019050919050565b6000614c2482614bf6565b9150819050919050565b7f455448207472616e73666572206661696c656400000000000000000000000000600082015250565b6000614c6460138361473c565b9150614c6f82614c2e565b602082019050919050565b60006020820190508181036000830152614c9381614c57565b9050919050565b6000819050919050565b6000614cb36020840184613c5a565b905092915050565b6000602082019050919050565b6000614cd4838561488a565b9350614cdf82614c9a565b8060005b85811015614d1857614cf58284614ca4565b614cff88826148ba565b9750614d0a83614cbb565b925050600181019050614ce3565b5085925050509392505050565b6000604082019050614d3a6000830186613be7565b8181036020830152614d4d818486614cc8565b9050949350505050565b6000819050919050565b6000614d7c614d77614d7284614d57565b6141b2565b613b5e565b9050919050565b614d8c81614d61565b82525050565b600061010082019050614da8600083018b613f6b565b614db5602083018a613f6b565b614dc26040830189613f6b565b614dcf6060830188613be7565b614ddc6080830187614d83565b614de960a0830186613f6b565b614df660c0830185613be7565b614e0360e0830184614aa3565b9998505050505050505050565b7f4e6f74207375706572206f70657261746f720000000000000000000000000000600082015250565b6000614e4660128361473c565b9150614e5182614e10565b602082019050919050565b60006020820190508181036000830152614e7581614e39565b9050919050565b7f436f6d6d697373696f6e2070657263656e74616765206d757374206265206c6560008201527f7373207468616e206f7220657175616c20746f20313030000000000000000000602082015250565b6000614ed860378361473c565b9150614ee382614e7c565b604082019050919050565b60006020820190508181036000830152614f0781614ecb565b9050919050565b7f5573657220697320616c7265616479206f6e2074686520626c61636b6c69737460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f6a60218361473c565b9150614f7582614f0e565b604082019050919050565b60006020820190508181036000830152614f9981614f5d565b9050919050565b7f43616e6e6f7420626c61636b6c69737420746f6b656e277320763220726f757460008201527f65722e0000000000000000000000000000000000000000000000000000000000602082015250565b6000614ffc60238361473c565b915061500782614fa0565b604082019050919050565b6000602082019050818103600083015261502b81614fef565b9050919050565b7f55736572206973206e6f74206f6e2074686520626c61636b6c6973742e000000600082015250565b6000615068601d8361473c565b915061507382615032565b602082019050919050565b600060208201905081810360008301526150978161505b565b9050919050565b6150a781614073565b82525050565b6150b681613c11565b82525050565b60a0820160008201516150d260008501826148ab565b5060208201516150e560208501826148ab565b5060408201516150f86040850182613e8a565b50606082015161510b606085018261509e565b50608082015161511e60808501826150ad565b50505050565b600060a08201905061513960008301846150bc565b92915050565b61514881613c11565b811461515357600080fd5b50565b6000815190506151658161513f565b92915050565b61517481614124565b811461517f57600080fd5b50565b6000815190506151918161516b565b92915050565b600080600080608085870312156151b1576151b0613b54565b5b60006151bf878288016146fa565b94505060206151d087828801615156565b93505060406151e187828801615182565b92505060606151f2878288016146fa565b91505092959194509250565b60006040820190506152136000830185613f6b565b6152206020830184613f6b565b9392505050565b7f5f7061746820696e76616c696421000000000000000000000000000000000000600082015250565b600061525d600e8361473c565b915061526882615227565b602082019050919050565b6000602082019050818103600083015261528c81615250565b9050919050565b7f5f70617468206f72205f66656520696e76616c69642100000000000000000000600082015250565b60006152c960168361473c565b91506152d482615293565b602082019050919050565b600060208201905081810360008301526152f8816152bc565b9050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561533957808201518184015260208101905061531e565b60008484015250505050565b6000615350826152ff565b61535a818561530a565b935061536a81856020860161531b565b6153738161422c565b840191505092915050565b6000608083016000830151848203600086015261539b8282615345565b91505060208301516153b060208601826148ab565b5060408301516153c36040860182613e8a565b5060608301516153d66060860182613e8a565b508091505092915050565b600060208201905081810360008301526153fb818461537e565b905092915050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000615439601a8361473c565b915061544482615403565b602082019050919050565b600060208201905081810360008301526154688161542c565b9050919050565b60008151905061547e81613c43565b92915050565b60006020828403121561549a57615499613b54565b5b60006154a88482850161546f565b91505092915050565b6000610100820190506154c7600083018b613f6b565b6154d4602083018a613f6b565b6154e16040830189613be7565b6154ee6060830188613be7565b6154fb6080830187613be7565b61550860a0830186613be7565b61551560c0830185613f6b565b61552260e0830184613be7565b9998505050505050505050565b60008060006060848603121561554857615547613b54565b5b6000615556868287016146fa565b9350506020615567868287016146fa565b9250506040615578868287016146fa565b9150509250925092565b60e08201600082015161559860008501826148ab565b5060208201516155ab60208501826148ab565b5060408201516155be604085018261509e565b5060608201516155d160608501826148ab565b5060808201516155e46080850182613e8a565b5060a08201516155f760a0850182613e8a565b5060c082015161560a60c08501826150ad565b50505050565b600060e0820190506156256000830184615582565b92915050565b60006060820190506156406000830186613f6b565b61564d6020830185613f6b565b61565a6040830184613be7565b949350505050565b600061566d826152ff565b6156778185614be8565b935061568781856020860161531b565b80840191505092915050565b600061569f8284615662565b915081905092915050565b6156b38161403d565b81146156be57600080fd5b50565b6000815190506156d0816156aa565b92915050565b6000602082840312156156ec576156eb613b54565b5b60006156fa848285016156c1565b91505092915050565b7f5354460000000000000000000000000000000000000000000000000000000000600082015250565b600061573960038361473c565b915061574482615703565b602082019050919050565b600060208201905081810360008301526157688161572c565b9050919050565b600061577a82613b5e565b915061578583613b5e565b925082820261579381613b5e565b915082820484148315176157aa576157a96147e8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006157eb82613b5e565b91506157f683613b5e565b925082615806576158056157b1565b5b828204905092915050565b60006040820190506158266000830185613f6b565b6158336020830184613be7565b9392505050565b7f5341000000000000000000000000000000000000000000000000000000000000600082015250565b600061587060028361473c565b915061587b8261583a565b602082019050919050565b6000602082019050818103600083015261589f81615863565b9050919050565b7f5354000000000000000000000000000000000000000000000000000000000000600082015250565b60006158dc60028361473c565b91506158e7826158a6565b602082019050919050565b6000602082019050818103600083015261590b816158cf565b9050919050565b60008160601b9050919050565b600061592a82615912565b9050919050565b600061593c8261591f565b9050919050565b61595461594f82613c31565b615931565b82525050565b60006159668284615943565b60148201915081905092915050565b60008160e81b9050919050565b600061598d82615975565b9050919050565b6159a56159a082614073565b615982565b82525050565b60006159b78286615662565b91506159c38285615994565b6003820191506159d38284615943565b601482019150819050949350505050565b60006159ef82613b5e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a2157615a206147e8565b5b60018201905091905056fea26469706673582212203fee6331ee170b4fb4b5d540d77a456c7ea5c0a97ddb0081235a9fdd187f6dc864736f6c63430008130033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.