Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 923 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Invest Token For... | 14139966 | 1056 days ago | IN | 0.155 ETH | 0.06183616 | ||||
Invest Token For... | 14086926 | 1065 days ago | IN | 0.005 ETH | 0.05218869 | ||||
Add Liquidity Et... | 14016510 | 1075 days ago | IN | 0.00005247 ETH | 0.04228718 | ||||
Invest Token For... | 13963084 | 1084 days ago | IN | 0.005 ETH | 0.04573199 | ||||
Invest Token For... | 13961403 | 1084 days ago | IN | 0.005 ETH | 0.06863577 | ||||
Invest Token For... | 13961355 | 1084 days ago | IN | 0.04 ETH | 0.05548025 | ||||
Invest Token For... | 13941920 | 1087 days ago | IN | 0.005 ETH | 0.06752518 | ||||
Invest Token For... | 13909518 | 1092 days ago | IN | 0.005 ETH | 0.04063335 | ||||
Invest Token For... | 13896187 | 1094 days ago | IN | 3.005 ETH | 0.05081375 | ||||
Invest Token For... | 13896140 | 1094 days ago | IN | 0.505 ETH | 0.06439682 | ||||
Add Liquidity Et... | 13848603 | 1101 days ago | IN | 0.00192028 ETH | 0.02380219 | ||||
Invest Token For... | 13779157 | 1112 days ago | IN | 0.005 ETH | 0.04711061 | ||||
Invest Token For... | 13777997 | 1112 days ago | IN | 0.005 ETH | 0.04029223 | ||||
Invest Token For... | 13777955 | 1112 days ago | IN | 0.005 ETH | 0.04899317 | ||||
Invest Token For... | 13777935 | 1112 days ago | IN | 0.005 ETH | 0.03155153 | ||||
Invest Token For... | 13777900 | 1112 days ago | IN | 0.005 ETH | 0.0424319 | ||||
Invest Token For... | 13777871 | 1112 days ago | IN | 0.005 ETH | 0.04164456 | ||||
Invest Token For... | 13777838 | 1112 days ago | IN | 0.005 ETH | 0.03342646 | ||||
Invest Token For... | 13777773 | 1112 days ago | IN | 0.005 ETH | 0.04151042 | ||||
Invest Token For... | 13777732 | 1112 days ago | IN | 0.005 ETH | 0.03112755 | ||||
Invest Token For... | 13777682 | 1112 days ago | IN | 0.005 ETH | 0.03148877 | ||||
Invest Token For... | 13777595 | 1112 days ago | IN | 0.005 ETH | 0.03264989 | ||||
Invest Token For... | 13777557 | 1112 days ago | IN | 0.005 ETH | 0.04233799 | ||||
Invest Token For... | 13777525 | 1112 days ago | IN | 0.005 ETH | 0.03486673 | ||||
Invest Token For... | 13777225 | 1112 days ago | IN | 0.005 ETH | 0.03015739 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14139966 | 1056 days ago | 0.15 ETH | ||||
14139966 | 1056 days ago | 0.005 ETH | ||||
14086926 | 1065 days ago | 0.005 ETH | ||||
14016510 | 1075 days ago | 354 wei | ||||
14016510 | 1075 days ago | 354 wei | ||||
14016510 | 1075 days ago | 0.00005247 ETH | ||||
13963084 | 1084 days ago | 0.005 ETH | ||||
13961403 | 1084 days ago | 0.005 ETH | ||||
13961355 | 1084 days ago | 0.035 ETH | ||||
13961355 | 1084 days ago | 0.005 ETH | ||||
13941920 | 1087 days ago | 0.005 ETH | ||||
13909518 | 1092 days ago | 0.005 ETH | ||||
13896187 | 1094 days ago | 3 ETH | ||||
13896187 | 1094 days ago | 0.005 ETH | ||||
13896140 | 1094 days ago | 0.5 ETH | ||||
13896140 | 1094 days ago | 0.005 ETH | ||||
13848603 | 1101 days ago | 0 ETH | ||||
13848603 | 1101 days ago | 0 ETH | ||||
13848603 | 1101 days ago | 0.00192028 ETH | ||||
13779157 | 1112 days ago | 0.005 ETH | ||||
13777997 | 1112 days ago | 0.005 ETH | ||||
13777955 | 1112 days ago | 0.005 ETH | ||||
13777935 | 1112 days ago | 0.005 ETH | ||||
13777900 | 1112 days ago | 0.005 ETH | ||||
13777871 | 1112 days ago | 0.005 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.12
Contract Source Code (Vyper language format)
# Copyright (C) 2021 VolumeFi Software, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the Apache 2.0 License. # This program is distributed WITHOUT ANY WARRANTY without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # @author VolumeFi, Software Inc. # @notice This Vyper contract adds liquidity to any Uniswap V3 pool using ETH or any ERC20 Token. # SPDX-License-Identifier: Apache-2.0 # @version ^0.2.12 struct MintParams: token0: address token1: address fee: uint256 tickLower: int128 tickUpper: int128 amount0Desired: uint256 amount1Desired: uint256 amount0Min: uint256 amount1Min: uint256 recipient: address deadline: uint256 struct SingleMintParams: token0: address token1: address fee: uint256 tickLower: int128 tickUpper: int128 sqrtPriceAX96: uint256 sqrtPriceBX96: uint256 liquidityMin: uint256 recipient: address deadline: uint256 struct ModifyParams: fee: uint256 tickLower: int128 tickUpper: int128 recipient: address deadline: uint256 interface ERC20: def allowance(_owner: address, _spender: address) -> uint256: view interface ERC721: def transferFrom(_from: address, _to: address, _tokenId: uint256): payable interface NonfungiblePositionManager: def burn(tokenId: uint256): payable interface UniswapV2Factory: def getPair(tokenA: address, tokenB: address) -> address: view interface UniswapV2Pair: def token0() -> address: view def token1() -> address: view def getReserves() -> (uint256, uint256, uint256): view def mint(to: address) -> uint256: nonpayable interface WrappedEth: def deposit(): payable def withdraw(amount: uint256): nonpayable event AddedLiquidity: tokenId: indexed(uint256) token0: indexed(address) token1: indexed(address) liquidity: uint256 amount0: uint256 amount1: uint256 event NFLPModified: oldTokenId: indexed(uint256) newTokenId: indexed(uint256) event Paused: paused: bool event FeeChanged: newFee: uint256 NONFUNGIBLEPOSITIONMANAGER: constant(address) = 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 UNISWAPV3FACTORY: constant(address) = 0x1F98431c8aD98523631AE4a59f267346ea31F984 UNISWAPV2FACTORY: constant(address) = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f UNISWAPV2ROUTER02: constant(address) = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D VETH: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE WETH: constant(address) = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 APPROVE_MID: constant(Bytes[4]) = method_id("approve(address,uint256)") TRANSFER_MID: constant(Bytes[4]) = method_id("transfer(address,uint256)") TRANSFERFROM_MID: constant(Bytes[4]) = method_id("transferFrom(address,address,uint256)") CAIPIN_MID: constant(Bytes[4]) = method_id("createAndInitializePoolIfNecessary(address,address,uint24,uint160)") GETPOOL_MID: constant(Bytes[4]) = method_id("getPool(address,address,uint24)") SLOT0_MID: constant(Bytes[4]) = method_id("slot0()") MINT_MID: constant(Bytes[4]) = method_id("mint((address,address,uint24,int24,int24,uint256,uint256,uint256,uint256,address,uint256))") POSITIONS_MID: constant(Bytes[4]) = method_id("positions(uint256)") INCREASELIQUIDITY_MID: constant(Bytes[4]) = method_id("increaseLiquidity((uint256,uint256,uint256,uint256,uint256,uint256))") DECREASELIQUIDITY_MID: constant(Bytes[4]) = method_id("decreaseLiquidity((uint256,uint128,uint256,uint256,uint256))") COLLECT_MID: constant(Bytes[4]) = method_id("collect((uint256,address,uint128,uint128))") SWAPETFT_MID: constant(Bytes[4]) = method_id("swapExactTokensForTokens(uint256,uint256,address[],address,uint256)") paused: public(bool) admin: public(address) feeAddress: public(address) feeAmount: public(uint256) @external def __init__(): self.paused = False self.admin = msg.sender self.feeAddress = 0xf29399fB3311082d9F8e62b988cBA44a5a98ebeD self.feeAmount = 5 * 10 ** 15 @internal @pure def uintSqrt(x: uint256) -> uint256: if x > 3: z: uint256 = (x + 1) / 2 y: uint256 = x for i in range(256): if y == z: return y y = z z = (x / z + z) / 2 raise "Did not coverage" elif x == 0: return 0 else: return 1 @internal def safeApprove(_token: address, _spender: address, _value: uint256): _response: Bytes[32] = raw_call( _token, concat( APPROVE_MID, convert(_spender, bytes32), convert(_value, bytes32) ), max_outsize=32 ) # dev: failed approve if len(_response) > 0: assert convert(_response, bool), "Approve failed" # dev: failed approve @internal def safeTransfer(_token: address, _to: address, _value: uint256): _response: Bytes[32] = raw_call( _token, concat( TRANSFER_MID, convert(_to, bytes32), convert(_value, bytes32) ), max_outsize=32 ) # dev: failed transfer if len(_response) > 0: assert convert(_response, bool), "Transfer failed" # dev: failed transfer @internal def safeTransferFrom(_token: address, _from: address, _to: address, _value: uint256): _response: Bytes[32] = raw_call( _token, concat( TRANSFERFROM_MID, convert(_from, bytes32), convert(_to, bytes32), convert(_value, bytes32) ), max_outsize=32 ) # dev: failed transferFrom if len(_response) > 0: assert convert(_response, bool), "TransferFrom failed" # dev: failed transferFrom @internal def addLiquidity(_tokenId: uint256, sender: address, uniV3Params: MintParams, _sqrtPriceX96: uint256 = 0) -> (uint256, uint256, uint256): self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, uniV3Params.amount0Desired) self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, uniV3Params.amount1Desired) if _tokenId == 0: sqrtPriceX96: uint256 = _sqrtPriceX96 _response32: Bytes[32] = empty(Bytes[32]) if sqrtPriceX96 == 0: _response32 = raw_call( UNISWAPV3FACTORY, concat( GETPOOL_MID, convert(uniV3Params.token0, bytes32), convert(uniV3Params.token1, bytes32), convert(uniV3Params.fee, bytes32) ), max_outsize=32, is_static_call=True ) pool: address = convert(convert(_response32, bytes32), address) assert pool != ZERO_ADDRESS, "Pool does not exist" _response224: Bytes[224] = raw_call( pool, SLOT0_MID, max_outsize=224, is_static_call=True ) sqrtPriceX96 = convert(slice(_response224, 0, 32), uint256) assert sqrtPriceX96 != 0, "Pool does not initialized" _response32 = raw_call( NONFUNGIBLEPOSITIONMANAGER, concat( CAIPIN_MID, convert(uniV3Params.token0, bytes32), convert(uniV3Params.token1, bytes32), convert(uniV3Params.fee, bytes32), convert(sqrtPriceX96, bytes32) ), max_outsize=32 ) assert convert(convert(_response32, bytes32), address) != ZERO_ADDRESS, "Create Or Init Pool failed" _response128: Bytes[128] = raw_call( NONFUNGIBLEPOSITIONMANAGER, concat( MINT_MID, convert(uniV3Params.token0, bytes32), convert(uniV3Params.token1, bytes32), convert(uniV3Params.fee, bytes32), convert(uniV3Params.tickLower, bytes32), convert(uniV3Params.tickUpper, bytes32), convert(uniV3Params.amount0Desired, bytes32), convert(uniV3Params.amount1Desired, bytes32), convert(uniV3Params.amount0Min, bytes32), convert(uniV3Params.amount1Min, bytes32), convert(uniV3Params.recipient, bytes32), convert(uniV3Params.deadline, bytes32) ), max_outsize=128 ) tokenId: uint256 = convert(slice(_response128, 0, 32), uint256) liquidity: uint256 = convert(slice(_response128, 32, 32), uint256) amount0: uint256 = convert(slice(_response128, 64, 32), uint256) amount1: uint256 = convert(slice(_response128, 96, 32), uint256) log AddedLiquidity(tokenId, uniV3Params.token0, uniV3Params.token1, liquidity, amount0, amount1) return (amount0, amount1, liquidity) else: liquidity: uint256 = 0 amount0: uint256 = 0 amount1: uint256 = 0 _response96: Bytes[96] = raw_call( NONFUNGIBLEPOSITIONMANAGER, concat( INCREASELIQUIDITY_MID, convert(_tokenId, bytes32), convert(uniV3Params.amount0Desired, bytes32), convert(uniV3Params.amount1Desired, bytes32), convert(uniV3Params.amount0Min, bytes32), convert(uniV3Params.amount1Min, bytes32), convert(uniV3Params.deadline, bytes32) ), max_outsize=96 ) liquidity = convert(slice(_response96, 0, 32), uint256) amount0 = convert(slice(_response96, 32, 32), uint256) amount1 = convert(slice(_response96, 64, 32), uint256) log AddedLiquidity(_tokenId, uniV3Params.token0, uniV3Params.token1, liquidity, amount0, amount1) return (amount0, amount1, liquidity) @external @payable @nonreentrant('lock') def addLiquidityEthForUniV3(_tokenId: uint256, uniV3Params: MintParams): assert not self.paused, "Paused" assert convert(uniV3Params.token0, uint256) < convert(uniV3Params.token1, uint256), "Unsorted tokens" if uniV3Params.token0 == WETH: if msg.value > uniV3Params.amount0Desired: send(msg.sender, msg.value - uniV3Params.amount0Desired) else: assert msg.value == uniV3Params.amount0Desired, "Eth not enough" WrappedEth(WETH).deposit(value=uniV3Params.amount0Desired) self.safeTransferFrom(uniV3Params.token1, msg.sender, self, uniV3Params.amount1Desired) amount0: uint256 = 0 amount1: uint256 = 0 liquidity: uint256 = 0 (amount0, amount1, liquidity) = self.addLiquidity(_tokenId, msg.sender, uniV3Params) amount0 = uniV3Params.amount0Desired - amount0 amount1 = uniV3Params.amount1Desired - amount1 if amount0 > 0: WrappedEth(WETH).withdraw(amount0) send(msg.sender, amount0) self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, 0) if amount1 > 0: self.safeTransfer(uniV3Params.token1, msg.sender, amount1) self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, 0) else: assert uniV3Params.token1 == WETH, "Not Eth Pair" if msg.value > uniV3Params.amount1Desired: send(msg.sender, msg.value - uniV3Params.amount1Desired) else: assert msg.value == uniV3Params.amount1Desired, "Eth not enough" WrappedEth(WETH).deposit(value=uniV3Params.amount1Desired) self.safeTransferFrom(uniV3Params.token0, msg.sender, self, uniV3Params.amount0Desired) amount0: uint256 = 0 amount1: uint256 = 0 liquidity: uint256 = 0 (amount0, amount1, liquidity) = self.addLiquidity(_tokenId, msg.sender, uniV3Params) amount0 = uniV3Params.amount0Desired - amount0 amount1 = uniV3Params.amount1Desired - amount1 if amount0 > 0: self.safeTransfer(uniV3Params.token0, msg.sender, amount0) self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, 0) if amount1 > 0: WrappedEth(WETH).withdraw(amount1) send(msg.sender, amount1) self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, 0) @external @nonreentrant('lock') def addLiquidityForUniV3(_tokenId: uint256, uniV3Params: MintParams): assert not self.paused, "Paused" assert convert(uniV3Params.token0, uint256) < convert(uniV3Params.token1, uint256), "Unsorted tokens" self.safeTransferFrom(uniV3Params.token0, msg.sender, self, uniV3Params.amount0Desired) self.safeTransferFrom(uniV3Params.token1, msg.sender, self, uniV3Params.amount1Desired) amount0: uint256 = 0 amount1: uint256 = 0 liquidity: uint256 = 0 (amount0, amount1, liquidity) = self.addLiquidity(_tokenId, msg.sender, uniV3Params) amount0 = uniV3Params.amount0Desired - amount0 amount1 = uniV3Params.amount1Desired - amount1 if amount0 > 0: self.safeTransfer(uniV3Params.token0, msg.sender, amount0) self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, 0) if amount1 > 0: self.safeTransfer(uniV3Params.token1, msg.sender, amount1) self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, 0) @external @payable @nonreentrant('lock') def modifyPositionForUniV3NFLP(_tokenId: uint256, modifyParams: ModifyParams): assert _tokenId != 0, "Wrong Token ID" fee: uint256 = self.feeAmount if msg.value > fee: send(msg.sender, msg.value - fee) else: assert msg.value == fee, "Insufficient fee" send(self.feeAddress, fee) ERC721(NONFUNGIBLEPOSITIONMANAGER).transferFrom(msg.sender, self, _tokenId) _response384: Bytes[384] = raw_call( NONFUNGIBLEPOSITIONMANAGER, concat( POSITIONS_MID, convert(_tokenId, bytes32) ), max_outsize=384, is_static_call=True ) token0: address = convert(convert(slice(_response384, 64, 32), uint256), address) token1: address = convert(convert(slice(_response384, 96, 32), uint256), address) liquidity: uint256 = convert(slice(_response384, 224, 32), uint256) _response64: Bytes[64] = raw_call( NONFUNGIBLEPOSITIONMANAGER, concat( DECREASELIQUIDITY_MID, convert(_tokenId, bytes32), convert(liquidity, bytes32), convert(0, bytes32), convert(0, bytes32), convert(modifyParams.deadline, bytes32) ), max_outsize=64 ) _response64 = raw_call( NONFUNGIBLEPOSITIONMANAGER, concat( COLLECT_MID, convert(_tokenId, bytes32), convert(self, bytes32), convert(2 ** 128 - 1, bytes32), convert(2 ** 128 - 1, bytes32) ), max_outsize=64 ) amount0: uint256 = convert(slice(_response64, 0, 32), uint256) amount1: uint256 = convert(slice(_response64, 32, 32), uint256) NonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER).burn(_tokenId) sqrtPriceX96: uint256 = 0 _response32: Bytes[32] = raw_call( UNISWAPV3FACTORY, concat( GETPOOL_MID, convert(token0, bytes32), convert(token1, bytes32), convert(modifyParams.fee, bytes32) ), max_outsize=32, is_static_call=True ) pool: address = convert(convert(_response32, bytes32), address) if pool == ZERO_ADDRESS: sqrtPriceX96 = 2 ** 96 * self.uintSqrt(amount0) / self.uintSqrt(amount1) else: _response224: Bytes[224] = raw_call( pool, SLOT0_MID, max_outsize=224, is_static_call=True ) sqrtPriceX96 = convert(slice(_response224, 0, 32), uint256) if sqrtPriceX96 == 0: sqrtPriceX96 = 2 ** 96 * self.uintSqrt(amount1) / self.uintSqrt(amount1) _response32 = raw_call( NONFUNGIBLEPOSITIONMANAGER, concat( CAIPIN_MID, convert(token0, bytes32), convert(token1, bytes32), convert(modifyParams.fee, bytes32), convert(sqrtPriceX96, bytes32) ), max_outsize=32 ) assert convert(convert(_response32, bytes32), address) != ZERO_ADDRESS, "Create Or Init Pool failed" self.safeApprove(token0, NONFUNGIBLEPOSITIONMANAGER, amount0) self.safeApprove(token1, NONFUNGIBLEPOSITIONMANAGER, amount1) _response128: Bytes[128] = raw_call( NONFUNGIBLEPOSITIONMANAGER, concat( MINT_MID, convert(token0, bytes32), convert(token1, bytes32), convert(modifyParams.fee, bytes32), convert(modifyParams.tickLower, bytes32), convert(modifyParams.tickUpper, bytes32), convert(amount0, bytes32), convert(amount1, bytes32), convert(0, bytes32), convert(0, bytes32), convert(msg.sender, bytes32), convert(modifyParams.deadline, bytes32) ), max_outsize=128 ) tokenId: uint256 = convert(slice(_response128, 0, 32), uint256) liquiditynew: uint256 = convert(slice(_response128, 32, 32), uint256) amount0new: uint256 = convert(slice(_response128, 64, 32), uint256) amount1new: uint256 = convert(slice(_response128, 96, 32), uint256) if amount0 > amount0new: self.safeTransfer(token0, msg.sender, amount0 - amount0new) self.safeApprove(token0, NONFUNGIBLEPOSITIONMANAGER, 0) if amount1 > amount1new: self.safeTransfer(token1, msg.sender, amount1 - amount1new) self.safeApprove(token1, NONFUNGIBLEPOSITIONMANAGER, 0) log NFLPModified(_tokenId, tokenId) @internal def _token2Token(fromToken: address, toToken: address, tokens2Trade: uint256, deadline: uint256) -> uint256: if fromToken == toToken: return tokens2Trade self.safeApprove(fromToken, UNISWAPV2ROUTER02, tokens2Trade) _response: Bytes[128] = raw_call( UNISWAPV2ROUTER02, concat( SWAPETFT_MID, convert(tokens2Trade, bytes32), convert(0, bytes32), convert(160, bytes32), convert(self, bytes32), convert(deadline, bytes32), convert(2, bytes32), convert(fromToken, bytes32), convert(toToken, bytes32) ), max_outsize=128 ) tokenBought: uint256 = convert(slice(_response, 96, 32), uint256) self.safeApprove(fromToken, UNISWAPV2ROUTER02, 0) assert tokenBought > 0, "Error Swapping Token" return tokenBought # (X + fX') * (Y - Y') = X * Y # Y' / (X_toinvest - X') = p^2 = P # Quadratic equation solution for X' @internal @view def _getUserInForSqrtPriceX96(reserveIn: uint256, reserveOut: uint256, priceX96: uint256, toInvest: uint256) -> uint256: b: uint256 = reserveIn + (reserveOut * 997 / 1000 * 2 ** 96 / priceX96) - toInvest * 997 / 1000 return (self.uintSqrt(b * b + 4 * reserveIn * toInvest * 997 / 1000) - b) * 1000 / 1994 @internal @pure def _getPairTokens(pair: address) -> (address, address): token0: address = UniswapV2Pair(pair).token0() token1: address = UniswapV2Pair(pair).token1() return (token0, token1) @internal @view def _getLiquidityInPool(midToken: address, pair: address) -> uint256: res0: uint256 = 0 res1: uint256 = 0 token0: address = ZERO_ADDRESS token1: address = ZERO_ADDRESS blockTimestampLast: uint256 = 0 (res0, res1, blockTimestampLast) = UniswapV2Pair(pair).getReserves() (token0, token1) = self._getPairTokens(pair) if token0 == midToken: return res0 else: return res1 @internal @view def _getMidToken(midToken: address, token0: address, token1: address) -> address: pair0: address = UniswapV2Factory(UNISWAPV2FACTORY).getPair(midToken, token0) pair1: address = UniswapV2Factory(UNISWAPV2FACTORY).getPair(midToken, token1) eth0: uint256 = self._getLiquidityInPool(midToken, pair0) eth1: uint256 = self._getLiquidityInPool(midToken, pair1) if eth0 > eth1: return token0 else: return token1 @internal @view def _getVirtualPriceX96(sqrtPriceAX96: uint256, sqrtPriceX96: uint256, sqrtPriceBX96: uint256) -> uint256: ret: uint256 = (sqrtPriceBX96 - sqrtPriceX96) * 2 ** 96 / sqrtPriceBX96 * 2 ** 96 / sqrtPriceX96 * 2 ** 96 / (sqrtPriceX96 - sqrtPriceAX96) if ret > 2 ** 160: return 2 ** 160 else: return ret @external @payable @nonreentrant('lock') def investTokenForUniPair(_token: address, amount: uint256, _tokenId: uint256, _uniV3Params: SingleMintParams): assert not self.paused, "Paused" assert amount > 0, "Invalid input amount" uniV3Params: MintParams = MintParams({ token0: _uniV3Params.token0, token1: _uniV3Params.token1, fee: _uniV3Params.fee, tickLower: _uniV3Params.tickLower, tickUpper: _uniV3Params.tickUpper, amount0Desired: 0, amount1Desired: 0, amount0Min: 0, amount1Min: 0, recipient: _uniV3Params.recipient, deadline: _uniV3Params.deadline }) assert convert(uniV3Params.token0, uint256) < convert(uniV3Params.token1, uint256), "Unsorted tokens" fee: uint256 = self.feeAmount assert msg.value >= fee, "Insufficient fee" send(self.feeAddress, fee) msg_value: uint256 = msg.value msg_value -= fee token: address = _token _response32: Bytes[32] = empty(Bytes[32]) toInvest: uint256 = 0 midToken: address = WETH if token == VETH or token == ZERO_ADDRESS: if msg_value > amount: send(msg.sender, msg_value - amount) else: assert msg_value >= amount, "Insufficient value" WrappedEth(WETH).deposit(value=amount) token = WETH toInvest = amount #invest Token else: self.safeTransferFrom(token, msg.sender, self, amount) if msg_value > 0: send(msg.sender, msg_value) if token == WETH: toInvest = amount elif token != uniV3Params.token0 and token != uniV3Params.token1: toInvest = self._token2Token(token, WETH, amount, uniV3Params.deadline) else: midToken = token toInvest = amount if uniV3Params.token0 != WETH and uniV3Params.token1 != WETH and token != uniV3Params.token0 and token != uniV3Params.token1: midToken = self._getMidToken(WETH, uniV3Params.token0, uniV3Params.token1) toInvest = self._token2Token(WETH, midToken, toInvest, uniV3Params.deadline) res0: uint256 = 0 res1: uint256 = 0 blockTimestampLast: uint256 = 0 pair: address = UniswapV2Factory(UNISWAPV2FACTORY).getPair(uniV3Params.token0, uniV3Params.token1) endToken: address = ZERO_ADDRESS if midToken == uniV3Params.token0: (res0, res1, blockTimestampLast) = UniswapV2Pair(pair).getReserves() endToken = uniV3Params.token1 else: (res1, res0, blockTimestampLast) = UniswapV2Pair(pair).getReserves() endToken = uniV3Params.token0 sqrtPriceX96: uint256 = 0 _response32 = raw_call( UNISWAPV3FACTORY, concat( GETPOOL_MID, convert(uniV3Params.token0, bytes32), convert(uniV3Params.token1, bytes32), convert(uniV3Params.fee, bytes32) ), max_outsize=32, is_static_call=True ) pool: address = convert(convert(_response32, bytes32), address) assert pool != ZERO_ADDRESS, "Pool does not exist" _response224: Bytes[224] = raw_call( pool, SLOT0_MID, max_outsize=224, is_static_call=True ) sqrtPriceX96 = convert(slice(_response224, 0, 32), uint256) assert sqrtPriceX96 != 0, "Pool does not initialized" retAmount: uint256 = 0 swapAmount: uint256 = 0 if sqrtPriceX96 <= _uniV3Params.sqrtPriceAX96: if convert(midToken, uint256) > convert(endToken, uint256): swapAmount = toInvest elif sqrtPriceX96 >= _uniV3Params.sqrtPriceBX96: if convert(midToken, uint256) < convert(endToken, uint256): swapAmount = toInvest else: virtualPriceX96: uint256 = self._getVirtualPriceX96(_uniV3Params.sqrtPriceAX96, sqrtPriceX96, _uniV3Params.sqrtPriceBX96) if convert(midToken, uint256) > convert(endToken, uint256): swapAmount = self._getUserInForSqrtPriceX96(res0, res1, virtualPriceX96, toInvest) else: swapAmount = self._getUserInForSqrtPriceX96(res0, res1, 2 ** 192 / virtualPriceX96, toInvest) if swapAmount > toInvest: swapAmount = toInvest if swapAmount > 0: retAmount = self._token2Token(midToken, endToken, swapAmount, uniV3Params.deadline) if uniV3Params.token0 == midToken: uniV3Params.amount0Desired = toInvest - swapAmount uniV3Params.amount1Desired = retAmount else: uniV3Params.amount1Desired = toInvest - swapAmount uniV3Params.amount0Desired = retAmount amount0: uint256 = 0 amount1: uint256 = 0 liquidity: uint256 = 0 (amount0, amount1, liquidity) = self.addLiquidity(_tokenId, msg.sender, uniV3Params, sqrtPriceX96) assert liquidity >= _uniV3Params.liquidityMin, "High Slippage" amount0 = uniV3Params.amount0Desired - amount0 amount1 = uniV3Params.amount1Desired - amount1 if amount0 > 0: self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, 0) if amount1 > 0: self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, 0) # Admin functions @external def pause(_paused: bool): assert msg.sender == self.admin, "Not admin" self.paused = _paused log Paused(_paused) @external def newAdmin(_admin: address): assert msg.sender == self.admin, "Not admin" self.admin = _admin @external def newFeeAmount(_feeAmount: uint256): assert msg.sender == self.admin, "Not admin" self.feeAmount = _feeAmount log FeeChanged(_feeAmount) @external def newFeeAddress(_feeAddress: address): assert msg.sender == self.admin, "Not admin" self.feeAddress = _feeAddress @external @nonreentrant('lock') def batchWithdraw(token: address[8], amount: uint256[8], to: address[8]): assert msg.sender == self.admin, "Not admin" for i in range(8): if token[i] == VETH: send(to[i], amount[i]) elif token[i] != ZERO_ADDRESS: self.safeTransfer(token[i], to[i], amount[i]) @external @nonreentrant('lock') def withdraw(token: address, amount: uint256, to: address): assert msg.sender == self.admin, "Not admin" if token == VETH: send(to, amount) elif token != ZERO_ADDRESS: self.safeTransfer(token, to, amount) @external @payable def __default__(): assert msg.sender == WETH, "can't receive Eth"
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"AddedLiquidity","inputs":[{"name":"tokenId","type":"uint256","indexed":true},{"name":"token0","type":"address","indexed":true},{"name":"token1","type":"address","indexed":true},{"name":"liquidity","type":"uint256","indexed":false},{"name":"amount0","type":"uint256","indexed":false},{"name":"amount1","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NFLPModified","inputs":[{"name":"oldTokenId","type":"uint256","indexed":true},{"name":"newTokenId","type":"uint256","indexed":true}],"anonymous":false,"type":"event"},{"name":"Paused","inputs":[{"name":"paused","type":"bool","indexed":false}],"anonymous":false,"type":"event"},{"name":"FeeChanged","inputs":[{"name":"newFee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[],"outputs":[]},{"stateMutability":"payable","type":"function","name":"addLiquidityEthForUniV3","inputs":[{"name":"_tokenId","type":"uint256"},{"name":"uniV3Params","type":"tuple","components":[{"name":"token0","type":"address"},{"name":"token1","type":"address"},{"name":"fee","type":"uint256"},{"name":"tickLower","type":"int128"},{"name":"tickUpper","type":"int128"},{"name":"amount0Desired","type":"uint256"},{"name":"amount1Desired","type":"uint256"},{"name":"amount0Min","type":"uint256"},{"name":"amount1Min","type":"uint256"},{"name":"recipient","type":"address"},{"name":"deadline","type":"uint256"}]}],"outputs":[],"gas":314603},{"stateMutability":"nonpayable","type":"function","name":"addLiquidityForUniV3","inputs":[{"name":"_tokenId","type":"uint256"},{"name":"uniV3Params","type":"tuple","components":[{"name":"token0","type":"address"},{"name":"token1","type":"address"},{"name":"fee","type":"uint256"},{"name":"tickLower","type":"int128"},{"name":"tickUpper","type":"int128"},{"name":"amount0Desired","type":"uint256"},{"name":"amount1Desired","type":"uint256"},{"name":"amount0Min","type":"uint256"},{"name":"amount1Min","type":"uint256"},{"name":"recipient","type":"address"},{"name":"deadline","type":"uint256"}]}],"outputs":[],"gas":218568},{"stateMutability":"payable","type":"function","name":"modifyPositionForUniV3NFLP","inputs":[{"name":"_tokenId","type":"uint256"},{"name":"modifyParams","type":"tuple","components":[{"name":"fee","type":"uint256"},{"name":"tickLower","type":"int128"},{"name":"tickUpper","type":"int128"},{"name":"recipient","type":"address"},{"name":"deadline","type":"uint256"}]}],"outputs":[],"gas":623761},{"stateMutability":"payable","type":"function","name":"investTokenForUniPair","inputs":[{"name":"_token","type":"address"},{"name":"amount","type":"uint256"},{"name":"_tokenId","type":"uint256"},{"name":"_uniV3Params","type":"tuple","components":[{"name":"token0","type":"address"},{"name":"token1","type":"address"},{"name":"fee","type":"uint256"},{"name":"tickLower","type":"int128"},{"name":"tickUpper","type":"int128"},{"name":"sqrtPriceAX96","type":"uint256"},{"name":"sqrtPriceBX96","type":"uint256"},{"name":"liquidityMin","type":"uint256"},{"name":"recipient","type":"address"},{"name":"deadline","type":"uint256"}]}],"outputs":[],"gas":850715},{"stateMutability":"nonpayable","type":"function","name":"pause","inputs":[{"name":"_paused","type":"bool"}],"outputs":[],"gas":39131},{"stateMutability":"nonpayable","type":"function","name":"newAdmin","inputs":[{"name":"_admin","type":"address"}],"outputs":[],"gas":37814},{"stateMutability":"nonpayable","type":"function","name":"newFeeAmount","inputs":[{"name":"_feeAmount","type":"uint256"}],"outputs":[],"gas":39091},{"stateMutability":"nonpayable","type":"function","name":"newFeeAddress","inputs":[{"name":"_feeAddress","type":"address"}],"outputs":[],"gas":37874},{"stateMutability":"nonpayable","type":"function","name":"batchWithdraw","inputs":[{"name":"token","type":"address[8]"},{"name":"amount","type":"uint256[8]"},{"name":"to","type":"address[8]"}],"outputs":[],"gas":352187},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"to","type":"address"}],"outputs":[],"gas":96487},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"view","type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":2778},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2808},{"stateMutability":"view","type":"function","name":"feeAddress","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2838},{"stateMutability":"view","type":"function","name":"feeAmount","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2868}]
Contract Creation Code
60006000553360015573f29399fb3311082d9f8e62b988cba44a5a98ebed6002556611c37937e08000600355615c7056600436101561000d57613c6d565b600035601c5260005163f1ea417c81141561096d576004541561002f57600080fd5b6001600455600054151515610083576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6044356024351015156100d5576308c379a061014052602061016052600f610180527f556e736f7274656420746f6b656e7300000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260243514156104fd5760c43534111561012f5760006000600060003460c4358082101561011657600080fd5b80820390509050336000f161012a57600080fd5b61017f565b60c4353414151561017f576308c379a061014052602061016052600e610180527f457468206e6f7420656e6f7567680000000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61019e57600080fd5b60006000600463d0e30db06101405261015c60c43573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16101d357600080fd5b604435610140523361016052306101805260e4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c435610140518082101561035057600080fd5b808203905090506101405260e435610160518082101561036f57600080fd5b808203905090506101605260006101405111156104515773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6103a557600080fd5b600060006024632e1a7d4d6101a052610140516101c0526101bc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16103e157600080fd5b600060006000600061014051336000f16103fa57600080fd5b6101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b60006101605111156104f8576101405161016051610180516044356101a052336101c052610160516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b610966565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2604435141515610561576308c379a061014052602061016052600c610180527f4e6f7420457468205061697200000000000000000000000000000000000000006101a05261018050606461015cfd5b60e43534111561059d5760006000600060003460e4358082101561058457600080fd5b80820390509050336000f161059857600080fd5b6105ed565b60e435341415156105ed576308c379a061014052602061016052600e610180527f457468206e6f7420656e6f7567680000000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61060c57600080fd5b60006000600463d0e30db06101405261015c60e43573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161064157600080fd5b602435610140523361016052306101805260c4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c43561014051808210156107be57600080fd5b808203905090506101405260e43561016051808210156107dd57600080fd5b8082039050905061016052600061014051111561088f576101405161016051610180516024356101a052336101c052610140516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b60006101605111156109665773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6108ba57600080fd5b600060006024632e1a7d4d6101a052610160516101c0526101bc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16108f657600080fd5b600060006000600061016051336000f161090f57600080fd5b6101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000600455005b63e9b723ee811415611ef9576004541561098657600080fd5b60016004556000600435141515156109dd576308c379a061014052602061016052600e610180527f57726f6e6720546f6b656e2049440000000000000000000000000000000000006101a05261018050606461015cfd5b6003546101405261014051341115610a22576000600060006000346101405180821015610a0957600080fd5b80820390509050336000f1610a1d57600080fd5b610a73565b6101405134141515610a73576308c379a06101605260206101805260106101a0527f496e73756666696369656e7420666565000000000000000000000000000000006101c0526101a050606461017cfd5b6000600060006000610140516002546000f1610a8e57600080fd5b73c36442b4a4522e871399cd717abdd847ab11fe883b610aad57600080fd5b6000600060646323b872dd610160523361018052306101a0526004356101c05261017c600073c36442b4a4522e871399cd717abdd847ab11fe885af1610af257600080fd5b60006004610320527f99fbab88000000000000000000000000000000000000000000000000000000006103405261032060048060208461038001018260208501600060045af1505080518201915050600435602082610380010152602081019050806103805261038090508051602001806104008284600060045af1610b7757600080fd5b50506101806104a06104005161042073c36442b4a4522e871399cd717abdd847ab11fe885afa610ba657600080fd5b6101803d80821115610bb85780610bba565b815b90509050610480526104808051602001806101608284600060045af1610bdf57600080fd5b5050604060206020820661052001610160518284011115610bff57600080fd5b610180806105408260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610c3e57600080fd5b8091901215610c4c57600080fd5b806020036101000a82049050905090508060a01c15610c6a57600080fd5b80905061032052606060206020820661054001610160518284011115610c8f57600080fd5b610180806105608260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610cce57600080fd5b8091901215610cdc57600080fd5b806020036101000a82049050905090508060a01c15610cfa57600080fd5b8090506103405260e060206020820661056001610160518284011115610d1f57600080fd5b610180806105808260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610d5e57600080fd5b8091901215610d6c57600080fd5b806020036101000a82049050905090506103605260006004610400527f0c49ccbe000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050600435602082610460010152602081019050610360516020826104600101526020810190506000602082610460010152602081019050600060208261046001015260208101905060a435602082610460010152602081019050806104605261046090508051602001806105608284600060045af1610e4c57600080fd5b5050604061068061056051610580600073c36442b4a4522e871399cd717abdd847ab11fe885af1610e7c57600080fd5b60403d80821115610e8d5780610e8f565b815b90509050610660526106608051602001806103808284600060045af1610eb457600080fd5b505060006004610400527ffc6f7865000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050600435602082610460010152602081019050306020826104600101526020810190506fffffffffffffffffffffffffffffffff6020826104600101526020810190506fffffffffffffffffffffffffffffffff602082610460010152602081019050806104605261046090508051602001806105408284600060045af1610f8b57600080fd5b5050604061064061054051610560600073c36442b4a4522e871399cd717abdd847ab11fe885af1610fbb57600080fd5b60403d80821115610fcc5780610fce565b815b90509050610620526106208051602001806103808284600060045af1610ff357600080fd5b505060006020602082066104c00161038051828401111561101357600080fd5b6040806104e08260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561105157600080fd5b809190121561105f57600080fd5b806020036101000a82049050905090506104005260206020602082066104e00161038051828401111561109157600080fd5b6040806105008260206020880688030161038001600060045af15050818152809050905090508060200151600082518060209013156110cf57600080fd5b80919012156110dd57600080fd5b806020036101000a82049050905090506104205273c36442b4a4522e871399cd717abdd847ab11fe883b61111057600080fd5b6000600060246342966c68610440526004356104605261045c600073c36442b4a4522e871399cd717abdd847ab11fe885af161114b57600080fd5b600061044052600060046104c0527f1698ee82000000000000000000000000000000000000000000000000000000006104e0526104c060048060208461052001018260208501600060045af15050805182019150506103205160208261052001015260208101905061034051602082610520010152602081019050602435602082610520010152602081019050806105205261052090508051602001806105e08284600060045af16111fc57600080fd5b505060206106c06105e051610600731f98431c8ad98523631ae4a59f267346ea31f9845afa61122a57600080fd5b60203d8082111561123b578061123d565b815b905090506106a0526106a08051602001806104608284600060045af161126257600080fd5b5050610480518060a01c1561127657600080fd5b8090506104c0526104c05115156113ae576c010000000000000000000000006101406104e0525b6104e0515160206104e051016104e0526104e06104e05110156112bf5761129d565b61040051610500526105005160065801613cd1565b610560526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515611303576112e0565b61056051808202821582848304141761131b57600080fd5b80905090509050610140610580525b6105805151602061058051016105805261058061058051101561134c5761132a565b610420516105a0526105a05160065801613cd1565b61060052610560610580525b61058051526020610580510361058052610140610580511015156113905761136d565b61060051808061139f57600080fd5b820490509050610440526115f8565b6004610600527f3850c7bd00000000000000000000000000000000000000000000000000000000610620526106008051602001806106608284600060045af16113f657600080fd5b505060e06106e0610660516106806104c0515afa61141357600080fd5b60e03d808211156114245780611426565b815b905090506106c0526106c08051602001806104e08284600060045af161144b57600080fd5b50506000602060208206610740016104e051828401111561146b57600080fd5b60e080610760826020602088068803016104e001600060045af15050818152809050905090508060200151600082518060209013156114a957600080fd5b80919012156114b757600080fd5b806020036101000a8204905090509050610440526104405115156115f8576c01000000000000000000000000610140610600525b6106005151602061060051016106005261060061060051101561150d576114eb565b61042051610620526106205160065801613cd1565b610680526105e0610600525b61060051526020610600510361060052610140610600511015156115515761152e565b61068051808202821582848304141761156957600080fd5b809050905090506101406106a0525b6106a0515160206106a051016106a0526106a06106a051101561159a57611578565b610420516106c0526106c05160065801613cd1565b610720526106806106a0525b6106a0515260206106a051036106a0526101406106a0511015156115de576115bb565b6107205180806115ed57600080fd5b820490509050610440525b600060046104e0527f13ead56200000000000000000000000000000000000000000000000000000000610500526104e060048060208461054001018260208501600060045af1505080518201915050610320516020826105400101526020810190506103405160208261054001015260208101905060243560208261054001015260208101905061044051602082610540010152602081019050806105405261054090508051602001806106208284600060045af16116b657600080fd5b5050602061072061062051610640600073c36442b4a4522e871399cd717abdd847ab11fe885af16116e657600080fd5b60203d808211156116f757806116f9565b815b90509050610700526107008051602001806104608284600060045af161171e57600080fd5b50506000610480518060a01c1561173457600080fd5b80905014151515611784576308c379a06104e052602061050052601a610520527f437265617465204f7220496e697420506f6f6c206661696c6564000000000000610540526105205060646104fcfd5b6101406104e0525b6104e0515160206104e051016104e0526104e06104e05110156117ae5761178c565b610320516105005273c36442b4a4522e871399cd717abdd847ab11fe8861052052610400516105405261054051610520516105005160065801613e13565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515611817576117f4565b6000506101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561184457611822565b610340516105005273c36442b4a4522e871399cd717abdd847ab11fe8861052052610420516105405261054051610520516105005160065801613e13565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156118ad5761188a565b600050600060046105a0527f88316456000000000000000000000000000000000000000000000000000000006105c0526105a060048060208461060001018260208501600060045af150508051820191505061032051602082610600010152602081019050610340516020826106000101526020810190506024356020826106000101526020810190506044356020826106000101526020810190506064356020826106000101526020810190506104005160208261060001015260208101905061042051602082610600010152602081019050600060208261060001015260208101905060006020826106000101526020810190503360208261060001015260208101905060a435602082610600010152602081019050806106005261060090508051602001806107c08284600060045af16119e957600080fd5b505060806109a06107c0516107e0600073c36442b4a4522e871399cd717abdd847ab11fe885af1611a1957600080fd5b60803d80821115611a2a5780611a2c565b815b90509050610980526109808051602001806104e08284600060045af1611a5157600080fd5b505060006020602082066106a0016104e0518284011115611a7157600080fd5b6080806106c0826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611aaf57600080fd5b8091901215611abd57600080fd5b806020036101000a82049050905090506105a05260206020602082066106c0016104e0518284011115611aef57600080fd5b6080806106e0826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611b2d57600080fd5b8091901215611b3b57600080fd5b806020036101000a82049050905090506105c05260406020602082066106e0016104e0518284011115611b6d57600080fd5b608080610700826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611bab57600080fd5b8091901215611bb957600080fd5b806020036101000a82049050905090506105e0526060602060208206610700016104e0518284011115611beb57600080fd5b608080610720826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611c2957600080fd5b8091901215611c3757600080fd5b806020036101000a8204905090509050610600526105e051610400511115611d8857610140610620525b61062051516020610620510161062052610620610620511015611c8357611c61565b61032051610640523361066052610400516105e05180821015611ca557600080fd5b808203905090506106805261068051610660516106405160065801613fad565b610600610620525b6106205152602061062051036106205261014061062051101515611cf057611ccd565b600050610140610620525b61062051516020610620510161062052610620610620511015611d1d57611cfb565b610320516106405273c36442b4a4522e871399cd717abdd847ab11fe886106605260006106805261068051610660516106405160065801613e13565b610600610620525b6106205152602061062051036106205261014061062051101515611d8457611d61565b6000505b61060051610420511115611ec557610140610620525b61062051516020610620510161062052610620610620511015611dc057611d9e565b61034051610640523361066052610420516106005180821015611de257600080fd5b808203905090506106805261068051610660516106405160065801613fad565b610600610620525b6106205152602061062051036106205261014061062051101515611e2d57611e0a565b600050610140610620525b61062051516020610620510161062052610620610620511015611e5a57611e38565b610340516106405273c36442b4a4522e871399cd717abdd847ab11fe886106605260006106805261068051610660516106405160065801613e13565b610600610620525b6106205152602061062051036106205261014061062051101515611ec157611e9e565b6000505b6105a0516004357f6820c77d3eecf3f60a3c9b5ca02dfa0810415527df890f06d8a29412f96b693060006000a36000600455005b63e4c4ad988114156132615760045415611f1257600080fd5b600160045560043560a01c15611f2757600080fd5b600054151515611f76576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000602435111515611fc7576308c379a0610140526020610160526014610180527f496e76616c696420696e70757420616d6f756e740000000000000000000000006101a05261018050606461015cfd5b6101406064358152608435816020015260a435816040015260c435816060015260e435816080015260008160a0015260008160c0015260008160e0015260008161010001526101643581610120015261018435816101400152506101605161014051101515612075576308c379a06102a05260206102c052600f6102e0527f556e736f7274656420746f6b656e730000000000000000000000000000000000610300526102e05060646102bcfd5b6003546102a0526102a05134101515156120ce576308c379a06102c05260206102e0526010610300527f496e73756666696369656e742066656500000000000000000000000000000000610320526103005060646102dcfd5b60006000600060006102a0516002546000f16120e957600080fd5b346102c0526102c080516102a0518082101561210457600080fd5b808203905090508152506004356102e0526000602036610300375060006103605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102e051141561216457600161216a565b6102e051155b1561227e576024356102c05111156121b15760006000600060006102c0516024358082101561219857600080fd5b80820390509050336000f16121ac57600080fd5b612205565b6024356102c05110151515612205576308c379a06103a05260206103c05260126103e0527f496e73756666696369656e742076616c75650000000000000000000000000000610400526103e05060646103bcfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61222457600080fd5b60006000600463d0e30db06103a0526103bc60243573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161225957600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102e052602435610360526124c2565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102e0516103a052336103c052306103e05260243561040052610400516103e0516103c0516103a05160065801614147565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006102c05111156123705760006000600060006102c051336000f161237057600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102e051141561239b57602435610360526124c2565b610140516102e05118156123b857610160516102e05114156123bb565b60005b156124b2576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102e0516103a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103c0526024356103e0526102805161040052610400516103e0516103c0516103a05160065801615163565b6104605261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261046051610360526124c2565b6102e05161038052602435610360525b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261014051181561252d5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261016051181561252557610140516102e051181561251d57610160516102e0511415612520565b60005b612528565b60005b612530565b60005b15612706576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610360516103805173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103a052610140516103c052610160516103e0526103e0516103c0516103a0516006580161591a565b6104405261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261044051610380526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610360516103805173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103a052610380516103c052610360516103e0526102805161040052610400516103e0516103c0516103a05160065801615163565b6104605261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261046051610360525b6060366103a03760206104c0604463e6a43905610420526101405161044052610160516104605261043c735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa61275057600080fd5b601f3d1161275d57600080fd5b6000506104c05161040052600061042052610140516103805114156128075760606104a06004630902f1ac6104405261045c610400515afa61279e57600080fd5b605f3d116127ab57600080fd5b6104a080808080516105005250506020810190508080805161052052505060208101905080808051610540525050505060005061050080516103a05280602001516103c05280604001516103e05250610160516104205261288e565b60606104a06004630902f1ac6104405261045c610400515afa61282957600080fd5b605f3d1161283657600080fd5b6104a080808080516105005250506020810190508080805161052052505060208101905080808051610540525050505060005061050080516103c05280602001516103a05280604001516103e0525061014051610420525b60006104405260006004610460527f1698ee8200000000000000000000000000000000000000000000000000000000610480526104606004806020846104c001018260208501600060045af1505080518201915050610140516020826104c0010152602081019050610160516020826104c0010152602081019050610180516020826104c0010152602081019050806104c0526104c090508051602001806105808284600060045af161294057600080fd5b50506020610660610580516105a0731f98431c8ad98523631ae4a59f267346ea31f9845afa61296e57600080fd5b60203d8082111561297f5780612981565b815b90509050610640526106408051602001806103008284600060045af16129a657600080fd5b5050610320518060a01c156129ba57600080fd5b8090506104605260006104605114151515612a14576308c379a06104805260206104a05260136104c0527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006104e0526104c050606461049cfd5b60046105a0527f3850c7bd000000000000000000000000000000000000000000000000000000006105c0526105a08051602001806106008284600060045af1612a5c57600080fd5b505060e061068061060051610620610460515afa612a7957600080fd5b60e03d80821115612a8a5780612a8c565b815b90509050610660526106608051602001806104808284600060045af1612ab157600080fd5b505060006020602082066106e001610480518284011115612ad157600080fd5b60e0806107008260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315612b0f57600080fd5b8091901215612b1d57600080fd5b806020036101000a82049050905090506104405260006104405114151515612b84576308c379a06105a05260206105c05260196105e0527f506f6f6c20646f6573206e6f7420696e697469616c697a656400000000000000610600526105e05060646105bcfd5b6040366105a0376101043561044051111515612bb65761042051610380511115612bb157610360516105c0525b612de2565b6101243561044051101515612be15761042051610380511015612bdc57610360516105c0525b612de2565b610140610600525b61060051516020610600510161060052610600610600511015612c0b57612be9565b61010435610620526104405161064052610124356106605261066051610640516106205160065801615ae6565b6106c0526105e0610600525b6106005152602061060051036106005261014061060051101515612c6757612c44565b6106c0516105e05261042051610380511115612d1c57610140610600525b61060051516020610600510161060052610600610600511015612ca757612c85565b6103a051610620526103c051610640526105e05161066052610360516106805261068051610660516106405161062051600658016154e9565b6106e0526105e0610600525b6106005152602061060051036106005261014061060051101515612d0f57612cec565b6106e0516105c052612de2565b610140610600525b61060051516020610600510161060052610600610600511015612d4657612d24565b6103a051610620526103c0516106405278010000000000000000000000000000000000000000000000006105e0518080612d7f57600080fd5b82049050905061066052610360516106805261068051610660516106405161062051600658016154e9565b6106e0526105e0610600525b6106005152602061060051036106005261014061060051101515612dd957612db6565b6106e0516105c0525b610360516105c0511115612df957610360516105c0525b60006105c0511115612ea0576101406105e0525b6105e0515160206105e051016105e0526105e06105e0511015612e2f57612e0d565b610380516106005261042051610620526105c0516106405261028051610660526106605161064051610620516106005160065801615163565b6106c0526105c06105e0525b6105e0515260206105e051036105e0526101406105e051101515612e9757612e74565b6106c0516105a0525b61038051610140511415612edb57610360516105c05180821015612ec357600080fd5b808203905090506101e0526105a05161020052612f04565b610360516105c05180821015612ef057600080fd5b80820390509050610200526105a0516101e0525b6060366105e037610140610640525b61064051516020610640510161064052610640610640511015612f3557612f13565b6044356106605233610680526106a061014080518252806020015182602001528060400151826040015280606001518260600152806080015182608001528060a001518260a001528060c001518260c001528060e001518260e0015280610100015182610100015280610120015182610120015280610140015182610140015250506104405161080052610800516107e0516107c0516107a05161078051610760516107405161072051610700516106e0516106c0516106a05161068051610660516006580161434a565b61086052610880526108a052610620610640525b610640515260206106405103610640526101406106405110151561303757613014565b61086080808080516108c0525050602081019050808080516108e05250506020810190508080805161090052505050506108c080516105e052806020015161060052806040015161062052506101443561062051101515156130d8576308c379a061064052602061066052600d610680527f4869676820536c697070616765000000000000000000000000000000000000006106a05261068050606461065cfd5b6101e0516105e051808210156130ed57600080fd5b808203905090506105e05261020051610600518082101561310d57600080fd5b808203905090506106005260006105e05111156131b957610140610640525b6106405151602061064051016106405261064061064051101561314e5761312c565b610140516106605273c36442b4a4522e871399cd717abdd847ab11fe886106805260006106a0526106a051610680516106605160065801613e13565b610620610640525b61064051526020610640510361064052610140610640511015156131b557613192565b6000505b600061060051111561325a57610140610640525b610640515160206106405101610640526106406106405110156131ef576131cd565b610160516106605273c36442b4a4522e871399cd717abdd847ab11fe886106805260006106a0526106a051610680516106605160065801613e13565b610620610640525b610640515260206106405103610640526101406106405110151561325657613233565b6000505b6000600455005b63dd2bb8e181141561365b576004541561327a57600080fd5b6001600455341561328a57600080fd5b6000541515156132d9576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60443560243510151561332b576308c379a061014052602061016052600f610180527f556e736f7274656420746f6b656e7300000000000000000000000000000000006101a05261018050606461015cfd5b602435610140523361016052306101805260c4356101a0526101a05161018051610160516101405160065801614147565b600050604435610140523361016052306101805260e4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c43561014051808210156134dc57600080fd5b808203905090506101405260e43561016051808210156134fb57600080fd5b808203905090506101605260006101405111156135ad576101405161016051610180516024356101a052336101c052610140516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000610160511115613654576101405161016051610180516044356101a052336101c052610160516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000600455005b6302329a2981141561370857341561367257600080fd5b60043560011c1561368257600080fd5b600154331415156136d2576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600055600435610140527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd26020610140a1005b63a6ba31c181141561378757341561371f57600080fd5b60043560a01c1561372f57600080fd5b6001543314151561377f576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600155005b63361bc0ca81141561382457341561379e57600080fd5b600154331415156137ee576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600355600435610140527f6bbc57480a46553fa4d156ce702beef5f3ad66303b0ed1a5d4cb44966c6584c36020610140a1005b63775507568114156138a357341561383b57600080fd5b60043560a01c1561384b57600080fd5b6001543314151561389b576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600255005b63f42ce21c811415613ac957600454156138bc57600080fd5b600160045534156138cc57600080fd5b6000610120525b610120516004013560a01c156138e857600080fd5b6020610120510161012052610100610120511015613905576138d3565b6000610120525b61012051610204013560a01c1561392257600080fd5b602061012051016101205261010061012051101561393f5761390c565b6001543314151561398f576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b61014060006008818352015b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600461014051600881106139c357600080fd5b60200201351415613a1957600060006000600061010461014051600881106139ea57600080fd5b60200201356102046101405160088110613a0357600080fd5b60200201356000f1613a1457600080fd5b613ab0565b600060046101405160088110613a2e57600080fd5b60200201351815613ab0576101405160046101405160088110613a5057600080fd5b6020020135610160526102046101405160088110613a6d57600080fd5b6020020135610180526101046101405160088110613a8a57600080fd5b60200201356101a0526101a051610180516101605160065801613fad565b610140526000505b815160010180835281141561399b575b50506000600455005b6369328dec811415613bdf5760045415613ae257600080fd5b60016004553415613af257600080fd5b60043560a01c15613b0257600080fd5b60443560a01c15613b1257600080fd5b60015433141515613b62576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6004351415613b9f5760006000600060006024356044356000f1613b9a57600080fd5b613bd8565b60006004351815613bd85760043561014052604435610160526024356101805261018051610160516101405160065801613fad565b6000505b6000600455005b635c975abb811415613c02573415613bf657600080fd5b60005460005260206000f35b63f851a440811415613c25573415613c1957600080fd5b60015460005260206000f35b6341275358811415613c48573415613c3c57600080fd5b60025460005260206000f35b6369e15404811415613c6b573415613c5f57600080fd5b60035460005260206000f35b505b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc233141515613ccf576308c379a0610140526020610160526011610180527f63616e27742072656365697665204574680000000000000000000000000000006101a05261018050606461015cfd5b005b61016052610140526003610140511115613de757610140516001818183011015613cfa57600080fd5b8082019050905060028082049050905061018052610140516101a0526101c06000610100818352015b610180516101a0511415613d43576101a051600052505060005161016051565b610180516101a05261014051610180518080613d5e57600080fd5b82049050905061018051818183011015613d7757600080fd5b80820190509050600280820490509050610180525b8151600101808352811415613d23575b50506308c379a06101c05260206101e0526010610200527f446964206e6f7420636f76657261676500000000000000000000000000000000610220526102005060646101dcfd613e11565b610140511515613e035760006000526000516101605156613e11565b600160005260005161016051565b005b6101a05261014052610160526101805260006004610220527f095ea7b3000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613ebc57600080fd5b505060206103e0610320516103406000610140515af1613edb57600080fd5b60203d80821115613eec5780613eee565b815b905090506103c0526103c08051602001806101c08284600060045af1613f1357600080fd5b505060006101c0511115613fa7576101c0806020015160008251806020901315613f3c57600080fd5b8091901215613f4a57600080fd5b806020036101000a820490509050905015151515613fa7576308c379a061022052602061024052600e610260527f417070726f7665206661696c65640000000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af161405657600080fd5b505060206103e0610320516103406000610140515af161407557600080fd5b60203d808211156140865780614088565b815b905090506103c0526103c08051602001806101c08284600060045af16140ad57600080fd5b505060006101c0511115614141576101c08060200151600082518060209013156140d657600080fd5b80919012156140e457600080fd5b806020036101000a820490509050905015151515614141576308c379a061022052602061024052600f610260527f5472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b6101c0526101405261016052610180526101a05260006004610240527f23b872dd00000000000000000000000000000000000000000000000000000000610260526102406004806020846102a001018260208501600060045af1505080518201915050610160516020826102a0010152602081019050610180516020826102a00101526020810190506101a0516020826102a0010152602081019050806102a0526102a090508051602001806103608284600060045af161420757600080fd5b50506020610440610360516103806000610140515af161422657600080fd5b60203d808211156142375780614239565b815b90509050610420526104208051602001806101e08284600060045af161425e57600080fd5b505060006101e05111156142f2576101e080602001516000825180602090131561428757600080fd5b809190121561429557600080fd5b806020036101000a8204905090509050151515156142f2576308c379a0610240526020610260526013610280527f5472616e7366657246726f6d206661696c6564000000000000000000000000006102a05261028050606461025cfd5b6101c05156614342575b6103005260006102e0526101405261016052610180526101a0526101c0526101e05261020052610220526102405261026052610280526102a0526102c05260005061438e565b60001561438e575b610300526101405261016052610180526101a0526101c0526101e05261020052610220526102405261026052610280526102a0526102c0526102e05260005061438e565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610180516103205273c36442b4a4522e871399cd717abdd847ab11fe8861034052610220516103605261036051610340516103205160065801613e13565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516101a0516103205273c36442b4a4522e871399cd717abdd847ab11fe8861034052610240516103605261036051610340516103205160065801613e13565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052600050610140511515614def576102e05161032052600060203661034037506103205115156148165760006004610480527f1698ee82000000000000000000000000000000000000000000000000000000006104a0526104806004806020846104e001018260208501600060045af1505080518201915050610180516020826104e00101526020810190506101a0516020826104e00101526020810190506101c0516020826104e0010152602081019050806104e0526104e090508051602001806105a08284600060045af16145d257600080fd5b505060206106806105a0516105c0731f98431c8ad98523631ae4a59f267346ea31f9845afa61460057600080fd5b60203d808211156146115780614613565b815b90509050610660526106608051602001806103408284600060045af161463857600080fd5b5050610360518060a01c1561464c57600080fd5b8090506103a05260006103a051141515156146a6576308c379a06104805260206104a05260136104c0527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006104e0526104c050606461049cfd5b60046105a0527f3850c7bd000000000000000000000000000000000000000000000000000000006105c0526105a08051602001806106008284600060045af16146ee57600080fd5b505060e0610680610600516106206103a0515afa61470b57600080fd5b60e03d8082111561471c578061471e565b815b90509050610660526106608051602001806104808284600060045af161474357600080fd5b505060006020602082066106e00161048051828401111561476357600080fd5b60e0806107008260206020880688030161048001600060045af15050818152809050905090508060200151600082518060209013156147a157600080fd5b80919012156147af57600080fd5b806020036101000a82049050905090506103205260006103205114151515614816576308c379a06105a05260206105c05260196105e0527f506f6f6c20646f6573206e6f7420696e697469616c697a656400000000000000610600526105e05060646105bcfd5b60006004610480527f13ead562000000000000000000000000000000000000000000000000000000006104a0526104806004806020846104e001018260208501600060045af1505080518201915050610180516020826104e00101526020810190506101a0516020826104e00101526020810190506101c0516020826104e0010152602081019050610320516020826104e0010152602081019050806104e0526104e090508051602001806105c08284600060045af16148d557600080fd5b505060206106c06105c0516105e0600073c36442b4a4522e871399cd717abdd847ab11fe885af161490557600080fd5b60203d808211156149165780614918565b815b905090506106a0526106a08051602001806103408284600060045af161493d57600080fd5b50506000610360518060a01c1561495357600080fd5b809050141515156149a3576308c379a06104805260206104a052601a6104c0527f437265617465204f7220496e697420506f6f6c206661696c65640000000000006104e0526104c050606461049cfd5b60006004610540527f8831645600000000000000000000000000000000000000000000000000000000610560526105406004806020846105a001018260208501600060045af1505080518201915050610180516020826105a00101526020810190506101a0516020826105a00101526020810190506101c0516020826105a00101526020810190506101e0516020826105a0010152602081019050610200516020826105a0010152602081019050610220516020826105a0010152602081019050610240516020826105a0010152602081019050610260516020826105a0010152602081019050610280516020826105a00101526020810190506102a0516020826105a00101526020810190506102c0516020826105a0010152602081019050806105a0526105a090508051602001806107608284600060045af1614ae757600080fd5b5050608061094061076051610780600073c36442b4a4522e871399cd717abdd847ab11fe885af1614b1757600080fd5b60803d80821115614b285780614b2a565b815b90509050610920526109208051602001806104808284600060045af1614b4f57600080fd5b5050600060206020820661062001610480518284011115614b6f57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614bad57600080fd5b8091901215614bbb57600080fd5b806020036101000a82049050905090506103a052602060206020820661062001610480518284011115614bed57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614c2b57600080fd5b8091901215614c3957600080fd5b806020036101000a82049050905090506103c052604060206020820661062001610480518284011115614c6b57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614ca957600080fd5b8091901215614cb757600080fd5b806020036101000a82049050905090506103e052606060206020820661062001610480518284011115614ce957600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614d2757600080fd5b8091901215614d3557600080fd5b806020036101000a8204905090509050610400526103c051610540526103e0516105605261040051610580526101a051610180516103a0517f8608f0d1a9f263ba6515609d93d7510949b8477690ce655f3b813420049d3d846060610540a46105a06103e05181526104005181602001526103c0518160400152506060610600525b600061060051111515614dc957614de5565b602061060051036105a001516020610600510361060052614db7565b6103005156615161565b6060366103203760006004610420527f219f5d17000000000000000000000000000000000000000000000000000000006104405261042060048060208461048001018260208501600060045af150508051820191505061014051602082610480010152602081019050610220516020826104800101526020810190506102405160208261048001015260208101905061026051602082610480010152602081019050610280516020826104800101526020810190506102c051602082610480010152602081019050806104805261048090508051602001806105a08284600060045af1614edb57600080fd5b505060606106e06105a0516105c0600073c36442b4a4522e871399cd717abdd847ab11fe885af1614f0b57600080fd5b60603d80821115614f1c5780614f1e565b815b905090506106c0526106c08051602001806103808284600060045af1614f4357600080fd5b505060006020602082066104e001610380518284011115614f6357600080fd5b6060806105008260206020880688030161038001600060045af1505081815280905090509050806020015160008251806020901315614fa157600080fd5b8091901215614faf57600080fd5b806020036101000a82049050905090506103205260206020602082066104e001610380518284011115614fe157600080fd5b6060806105008260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561501f57600080fd5b809190121561502d57600080fd5b806020036101000a82049050905090506103405260406020602082066104e00161038051828401111561505f57600080fd5b6060806105008260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561509d57600080fd5b80919012156150ab57600080fd5b806020036101000a8204905090509050610360526103205161042052610340516104405261036051610460526101a05161018051610140517f8608f0d1a9f263ba6515609d93d7510949b8477690ce655f3b813420049d3d846060610420a46104806103405181526103605181602001526103205181604001525060606104e0525b60006104e05111151561513f5761515b565b60206104e05103610480015160206104e051036104e05261512d565b61030051565b005b6101c0526101405261016052610180526101a0526101605161014051141561519557610180516000526000516101c051565b6101405161016051610180516101a0516101c051610140516101e052737a250d5630b4cf539739df2c5dacb4c659f2488d61020052610180516102205261022051610200516101e05160065801613e13565b6101c0526101a052610180526101605261014052600050600060046102a0527f38ed1739000000000000000000000000000000000000000000000000000000006102c0526102a060048060208461030001018260208501600060045af150508051820191505061018051602082610300010152602081019050600060208261030001015260208101905060a0602082610300010152602081019050306020826103000101526020810190506101a05160208261030001015260208101905060026020826103000101526020810190506101405160208261030001015260208101905061016051602082610300010152602081019050806103005261030090508051602001806104608284600060045af161530057600080fd5b505060806105e0610460516104806000737a250d5630b4cf539739df2c5dacb4c659f2488d5af161533057600080fd5b60803d808211156153415780615343565b815b905090506105c0526105c08051602001806101e08284600060045af161536857600080fd5b505060606020602082066103a0016101e051828401111561538857600080fd5b6080806103c0826020602088068803016101e001600060045af15050818152809050905090508060200151600082518060209013156153c657600080fd5b80919012156153d457600080fd5b806020036101000a82049050905090506102a0526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610140516102c052737a250d5630b4cf539739df2c5dacb4c659f2488d6102e052600061030052610300516102e0516102c05160065801613e13565b6102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006102a0511115156154d9576308c379a06102c05260206102e0526014610300527f4572726f72205377617070696e6720546f6b656e000000000000000000000000610320526103005060646102dcfd5b6102a0516000526000516101c051565b6101c0526101405261016052610180526101a05261014051610160516103e5808202821582848304141761551c57600080fd5b809050905090506103e8808204905090506c01000000000000000000000000808202821582848304141761554f57600080fd5b8090509050905061018051808061556557600080fd5b82049050905081818301101561557a57600080fd5b808201905090506101a0516103e5808202821582848304141761559c57600080fd5b809050905090506103e880820490509050808210156155ba57600080fd5b808203905090506101e0526101405161016051610180516101a0516101c0516101e0516101e0516101e05180820282158284830414176155f957600080fd5b80905090509050600461014051808202821582848304141761561a57600080fd5b809050905090506101a051808202821582848304141761563957600080fd5b809050905090506103e5808202821582848304141761565757600080fd5b809050905090506103e88082049050905081818301101561567757600080fd5b80820190509050610200526102005160065801613cd1565b610260526101e0526101c0526101a052610180526101605261014052610260516101e051808210156156c057600080fd5b808203905090506103e880820282158284830414176156de57600080fd5b809050905090506107ca808204905090506000526000516101c051565b610160526101405260206102006004630dfe16816101a0526101bc610140515afa61572557600080fd5b601f3d1161573257600080fd5b60005061020051610180526020610220600463d21220a76101c0526101dc610140515afa61575f57600080fd5b601f3d1161576c57600080fd5b600050610220516101a0526102006101805181526101a0518160200152506040610240525b6000610240511115156157a3576157bf565b6020610240510361020001516020610240510361024052615791565b61016051565b61018052610140526101605260a0366101a03760606102a06004630902f1ac6102405261025c610160515afa6157fa57600080fd5b605f3d1161580757600080fd5b6102a080808080516103005250506020810190508080805161032052505060208101905080808051610340525050505060005061030080516101a05280602001516101c052806040015161022052506101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261024051600658016156fb565b6102a0526102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102a080808080516102e05250506020810190508080805161030052505050506102e080516101e05280602001516102005250610140516101e0511415615908576101a0516000526000516101805156615918565b6101c05160005260005161018051565b005b6101a0526101405261016052610180526020610280604463e6a439056101e052610140516102005261016051610220526101fc735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa61596d57600080fd5b601f3d1161597a57600080fd5b600050610280516101c05260206102a0604463e6a43905610200526101405161022052610180516102405261021c735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa6159c857600080fd5b601f3d116159d557600080fd5b6000506102a0516101e0526101405161016051610180516101a0516101c0516101e0516102005161014051610220526101c051610240526102405161022051600658016157c5565b6102a052610200526101e0526101c0526101a0526101805261016052610140526102a051610200526101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101e051610260526102605161024051600658016157c5565b6102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102c0516102205261022051610200511115615ad457610160516000526000516101a05156615ae4565b610180516000526000516101a051565b005b6101a052610140526101605261018052610180516101605180821015615b0b57600080fd5b808203905090506c010000000000000000000000008082028215828483041417615b3457600080fd5b80905090509050610180518080615b4a57600080fd5b8204905090506c010000000000000000000000008082028215828483041417615b7257600080fd5b80905090509050610160518080615b8857600080fd5b8204905090506c010000000000000000000000008082028215828483041417615bb057600080fd5b80905090509050610160516101405180821015615bcc57600080fd5b808203905090508080615bde57600080fd5b8204905090506101c052740100000000000000000000000000000000000000006101c0511115615c2e57740100000000000000000000000000000000000000006000526000516101a05156615c3e565b6101c0516000526000516101a051565b005b610030615c7003610030600039610030615c70036000f3
Deployed Bytecode
0x600436101561000d57613c6d565b600035601c5260005163f1ea417c81141561096d576004541561002f57600080fd5b6001600455600054151515610083576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6044356024351015156100d5576308c379a061014052602061016052600f610180527f556e736f7274656420746f6b656e7300000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260243514156104fd5760c43534111561012f5760006000600060003460c4358082101561011657600080fd5b80820390509050336000f161012a57600080fd5b61017f565b60c4353414151561017f576308c379a061014052602061016052600e610180527f457468206e6f7420656e6f7567680000000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61019e57600080fd5b60006000600463d0e30db06101405261015c60c43573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16101d357600080fd5b604435610140523361016052306101805260e4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c435610140518082101561035057600080fd5b808203905090506101405260e435610160518082101561036f57600080fd5b808203905090506101605260006101405111156104515773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6103a557600080fd5b600060006024632e1a7d4d6101a052610140516101c0526101bc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16103e157600080fd5b600060006000600061014051336000f16103fa57600080fd5b6101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b60006101605111156104f8576101405161016051610180516044356101a052336101c052610160516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b610966565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2604435141515610561576308c379a061014052602061016052600c610180527f4e6f7420457468205061697200000000000000000000000000000000000000006101a05261018050606461015cfd5b60e43534111561059d5760006000600060003460e4358082101561058457600080fd5b80820390509050336000f161059857600080fd5b6105ed565b60e435341415156105ed576308c379a061014052602061016052600e610180527f457468206e6f7420656e6f7567680000000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61060c57600080fd5b60006000600463d0e30db06101405261015c60e43573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161064157600080fd5b602435610140523361016052306101805260c4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c43561014051808210156107be57600080fd5b808203905090506101405260e43561016051808210156107dd57600080fd5b8082039050905061016052600061014051111561088f576101405161016051610180516024356101a052336101c052610140516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b60006101605111156109665773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6108ba57600080fd5b600060006024632e1a7d4d6101a052610160516101c0526101bc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16108f657600080fd5b600060006000600061016051336000f161090f57600080fd5b6101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000600455005b63e9b723ee811415611ef9576004541561098657600080fd5b60016004556000600435141515156109dd576308c379a061014052602061016052600e610180527f57726f6e6720546f6b656e2049440000000000000000000000000000000000006101a05261018050606461015cfd5b6003546101405261014051341115610a22576000600060006000346101405180821015610a0957600080fd5b80820390509050336000f1610a1d57600080fd5b610a73565b6101405134141515610a73576308c379a06101605260206101805260106101a0527f496e73756666696369656e7420666565000000000000000000000000000000006101c0526101a050606461017cfd5b6000600060006000610140516002546000f1610a8e57600080fd5b73c36442b4a4522e871399cd717abdd847ab11fe883b610aad57600080fd5b6000600060646323b872dd610160523361018052306101a0526004356101c05261017c600073c36442b4a4522e871399cd717abdd847ab11fe885af1610af257600080fd5b60006004610320527f99fbab88000000000000000000000000000000000000000000000000000000006103405261032060048060208461038001018260208501600060045af1505080518201915050600435602082610380010152602081019050806103805261038090508051602001806104008284600060045af1610b7757600080fd5b50506101806104a06104005161042073c36442b4a4522e871399cd717abdd847ab11fe885afa610ba657600080fd5b6101803d80821115610bb85780610bba565b815b90509050610480526104808051602001806101608284600060045af1610bdf57600080fd5b5050604060206020820661052001610160518284011115610bff57600080fd5b610180806105408260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610c3e57600080fd5b8091901215610c4c57600080fd5b806020036101000a82049050905090508060a01c15610c6a57600080fd5b80905061032052606060206020820661054001610160518284011115610c8f57600080fd5b610180806105608260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610cce57600080fd5b8091901215610cdc57600080fd5b806020036101000a82049050905090508060a01c15610cfa57600080fd5b8090506103405260e060206020820661056001610160518284011115610d1f57600080fd5b610180806105808260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610d5e57600080fd5b8091901215610d6c57600080fd5b806020036101000a82049050905090506103605260006004610400527f0c49ccbe000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050600435602082610460010152602081019050610360516020826104600101526020810190506000602082610460010152602081019050600060208261046001015260208101905060a435602082610460010152602081019050806104605261046090508051602001806105608284600060045af1610e4c57600080fd5b5050604061068061056051610580600073c36442b4a4522e871399cd717abdd847ab11fe885af1610e7c57600080fd5b60403d80821115610e8d5780610e8f565b815b90509050610660526106608051602001806103808284600060045af1610eb457600080fd5b505060006004610400527ffc6f7865000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050600435602082610460010152602081019050306020826104600101526020810190506fffffffffffffffffffffffffffffffff6020826104600101526020810190506fffffffffffffffffffffffffffffffff602082610460010152602081019050806104605261046090508051602001806105408284600060045af1610f8b57600080fd5b5050604061064061054051610560600073c36442b4a4522e871399cd717abdd847ab11fe885af1610fbb57600080fd5b60403d80821115610fcc5780610fce565b815b90509050610620526106208051602001806103808284600060045af1610ff357600080fd5b505060006020602082066104c00161038051828401111561101357600080fd5b6040806104e08260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561105157600080fd5b809190121561105f57600080fd5b806020036101000a82049050905090506104005260206020602082066104e00161038051828401111561109157600080fd5b6040806105008260206020880688030161038001600060045af15050818152809050905090508060200151600082518060209013156110cf57600080fd5b80919012156110dd57600080fd5b806020036101000a82049050905090506104205273c36442b4a4522e871399cd717abdd847ab11fe883b61111057600080fd5b6000600060246342966c68610440526004356104605261045c600073c36442b4a4522e871399cd717abdd847ab11fe885af161114b57600080fd5b600061044052600060046104c0527f1698ee82000000000000000000000000000000000000000000000000000000006104e0526104c060048060208461052001018260208501600060045af15050805182019150506103205160208261052001015260208101905061034051602082610520010152602081019050602435602082610520010152602081019050806105205261052090508051602001806105e08284600060045af16111fc57600080fd5b505060206106c06105e051610600731f98431c8ad98523631ae4a59f267346ea31f9845afa61122a57600080fd5b60203d8082111561123b578061123d565b815b905090506106a0526106a08051602001806104608284600060045af161126257600080fd5b5050610480518060a01c1561127657600080fd5b8090506104c0526104c05115156113ae576c010000000000000000000000006101406104e0525b6104e0515160206104e051016104e0526104e06104e05110156112bf5761129d565b61040051610500526105005160065801613cd1565b610560526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515611303576112e0565b61056051808202821582848304141761131b57600080fd5b80905090509050610140610580525b6105805151602061058051016105805261058061058051101561134c5761132a565b610420516105a0526105a05160065801613cd1565b61060052610560610580525b61058051526020610580510361058052610140610580511015156113905761136d565b61060051808061139f57600080fd5b820490509050610440526115f8565b6004610600527f3850c7bd00000000000000000000000000000000000000000000000000000000610620526106008051602001806106608284600060045af16113f657600080fd5b505060e06106e0610660516106806104c0515afa61141357600080fd5b60e03d808211156114245780611426565b815b905090506106c0526106c08051602001806104e08284600060045af161144b57600080fd5b50506000602060208206610740016104e051828401111561146b57600080fd5b60e080610760826020602088068803016104e001600060045af15050818152809050905090508060200151600082518060209013156114a957600080fd5b80919012156114b757600080fd5b806020036101000a8204905090509050610440526104405115156115f8576c01000000000000000000000000610140610600525b6106005151602061060051016106005261060061060051101561150d576114eb565b61042051610620526106205160065801613cd1565b610680526105e0610600525b61060051526020610600510361060052610140610600511015156115515761152e565b61068051808202821582848304141761156957600080fd5b809050905090506101406106a0525b6106a0515160206106a051016106a0526106a06106a051101561159a57611578565b610420516106c0526106c05160065801613cd1565b610720526106806106a0525b6106a0515260206106a051036106a0526101406106a0511015156115de576115bb565b6107205180806115ed57600080fd5b820490509050610440525b600060046104e0527f13ead56200000000000000000000000000000000000000000000000000000000610500526104e060048060208461054001018260208501600060045af1505080518201915050610320516020826105400101526020810190506103405160208261054001015260208101905060243560208261054001015260208101905061044051602082610540010152602081019050806105405261054090508051602001806106208284600060045af16116b657600080fd5b5050602061072061062051610640600073c36442b4a4522e871399cd717abdd847ab11fe885af16116e657600080fd5b60203d808211156116f757806116f9565b815b90509050610700526107008051602001806104608284600060045af161171e57600080fd5b50506000610480518060a01c1561173457600080fd5b80905014151515611784576308c379a06104e052602061050052601a610520527f437265617465204f7220496e697420506f6f6c206661696c6564000000000000610540526105205060646104fcfd5b6101406104e0525b6104e0515160206104e051016104e0526104e06104e05110156117ae5761178c565b610320516105005273c36442b4a4522e871399cd717abdd847ab11fe8861052052610400516105405261054051610520516105005160065801613e13565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515611817576117f4565b6000506101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561184457611822565b610340516105005273c36442b4a4522e871399cd717abdd847ab11fe8861052052610420516105405261054051610520516105005160065801613e13565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156118ad5761188a565b600050600060046105a0527f88316456000000000000000000000000000000000000000000000000000000006105c0526105a060048060208461060001018260208501600060045af150508051820191505061032051602082610600010152602081019050610340516020826106000101526020810190506024356020826106000101526020810190506044356020826106000101526020810190506064356020826106000101526020810190506104005160208261060001015260208101905061042051602082610600010152602081019050600060208261060001015260208101905060006020826106000101526020810190503360208261060001015260208101905060a435602082610600010152602081019050806106005261060090508051602001806107c08284600060045af16119e957600080fd5b505060806109a06107c0516107e0600073c36442b4a4522e871399cd717abdd847ab11fe885af1611a1957600080fd5b60803d80821115611a2a5780611a2c565b815b90509050610980526109808051602001806104e08284600060045af1611a5157600080fd5b505060006020602082066106a0016104e0518284011115611a7157600080fd5b6080806106c0826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611aaf57600080fd5b8091901215611abd57600080fd5b806020036101000a82049050905090506105a05260206020602082066106c0016104e0518284011115611aef57600080fd5b6080806106e0826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611b2d57600080fd5b8091901215611b3b57600080fd5b806020036101000a82049050905090506105c05260406020602082066106e0016104e0518284011115611b6d57600080fd5b608080610700826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611bab57600080fd5b8091901215611bb957600080fd5b806020036101000a82049050905090506105e0526060602060208206610700016104e0518284011115611beb57600080fd5b608080610720826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611c2957600080fd5b8091901215611c3757600080fd5b806020036101000a8204905090509050610600526105e051610400511115611d8857610140610620525b61062051516020610620510161062052610620610620511015611c8357611c61565b61032051610640523361066052610400516105e05180821015611ca557600080fd5b808203905090506106805261068051610660516106405160065801613fad565b610600610620525b6106205152602061062051036106205261014061062051101515611cf057611ccd565b600050610140610620525b61062051516020610620510161062052610620610620511015611d1d57611cfb565b610320516106405273c36442b4a4522e871399cd717abdd847ab11fe886106605260006106805261068051610660516106405160065801613e13565b610600610620525b6106205152602061062051036106205261014061062051101515611d8457611d61565b6000505b61060051610420511115611ec557610140610620525b61062051516020610620510161062052610620610620511015611dc057611d9e565b61034051610640523361066052610420516106005180821015611de257600080fd5b808203905090506106805261068051610660516106405160065801613fad565b610600610620525b6106205152602061062051036106205261014061062051101515611e2d57611e0a565b600050610140610620525b61062051516020610620510161062052610620610620511015611e5a57611e38565b610340516106405273c36442b4a4522e871399cd717abdd847ab11fe886106605260006106805261068051610660516106405160065801613e13565b610600610620525b6106205152602061062051036106205261014061062051101515611ec157611e9e565b6000505b6105a0516004357f6820c77d3eecf3f60a3c9b5ca02dfa0810415527df890f06d8a29412f96b693060006000a36000600455005b63e4c4ad988114156132615760045415611f1257600080fd5b600160045560043560a01c15611f2757600080fd5b600054151515611f76576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000602435111515611fc7576308c379a0610140526020610160526014610180527f496e76616c696420696e70757420616d6f756e740000000000000000000000006101a05261018050606461015cfd5b6101406064358152608435816020015260a435816040015260c435816060015260e435816080015260008160a0015260008160c0015260008160e0015260008161010001526101643581610120015261018435816101400152506101605161014051101515612075576308c379a06102a05260206102c052600f6102e0527f556e736f7274656420746f6b656e730000000000000000000000000000000000610300526102e05060646102bcfd5b6003546102a0526102a05134101515156120ce576308c379a06102c05260206102e0526010610300527f496e73756666696369656e742066656500000000000000000000000000000000610320526103005060646102dcfd5b60006000600060006102a0516002546000f16120e957600080fd5b346102c0526102c080516102a0518082101561210457600080fd5b808203905090508152506004356102e0526000602036610300375060006103605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102e051141561216457600161216a565b6102e051155b1561227e576024356102c05111156121b15760006000600060006102c0516024358082101561219857600080fd5b80820390509050336000f16121ac57600080fd5b612205565b6024356102c05110151515612205576308c379a06103a05260206103c05260126103e0527f496e73756666696369656e742076616c75650000000000000000000000000000610400526103e05060646103bcfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61222457600080fd5b60006000600463d0e30db06103a0526103bc60243573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161225957600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102e052602435610360526124c2565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102e0516103a052336103c052306103e05260243561040052610400516103e0516103c0516103a05160065801614147565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006102c05111156123705760006000600060006102c051336000f161237057600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102e051141561239b57602435610360526124c2565b610140516102e05118156123b857610160516102e05114156123bb565b60005b156124b2576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102e0516103a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103c0526024356103e0526102805161040052610400516103e0516103c0516103a05160065801615163565b6104605261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261046051610360526124c2565b6102e05161038052602435610360525b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261014051181561252d5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261016051181561252557610140516102e051181561251d57610160516102e0511415612520565b60005b612528565b60005b612530565b60005b15612706576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610360516103805173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103a052610140516103c052610160516103e0526103e0516103c0516103a0516006580161591a565b6104405261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261044051610380526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610360516103805173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103a052610380516103c052610360516103e0526102805161040052610400516103e0516103c0516103a05160065801615163565b6104605261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261046051610360525b6060366103a03760206104c0604463e6a43905610420526101405161044052610160516104605261043c735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa61275057600080fd5b601f3d1161275d57600080fd5b6000506104c05161040052600061042052610140516103805114156128075760606104a06004630902f1ac6104405261045c610400515afa61279e57600080fd5b605f3d116127ab57600080fd5b6104a080808080516105005250506020810190508080805161052052505060208101905080808051610540525050505060005061050080516103a05280602001516103c05280604001516103e05250610160516104205261288e565b60606104a06004630902f1ac6104405261045c610400515afa61282957600080fd5b605f3d1161283657600080fd5b6104a080808080516105005250506020810190508080805161052052505060208101905080808051610540525050505060005061050080516103c05280602001516103a05280604001516103e0525061014051610420525b60006104405260006004610460527f1698ee8200000000000000000000000000000000000000000000000000000000610480526104606004806020846104c001018260208501600060045af1505080518201915050610140516020826104c0010152602081019050610160516020826104c0010152602081019050610180516020826104c0010152602081019050806104c0526104c090508051602001806105808284600060045af161294057600080fd5b50506020610660610580516105a0731f98431c8ad98523631ae4a59f267346ea31f9845afa61296e57600080fd5b60203d8082111561297f5780612981565b815b90509050610640526106408051602001806103008284600060045af16129a657600080fd5b5050610320518060a01c156129ba57600080fd5b8090506104605260006104605114151515612a14576308c379a06104805260206104a05260136104c0527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006104e0526104c050606461049cfd5b60046105a0527f3850c7bd000000000000000000000000000000000000000000000000000000006105c0526105a08051602001806106008284600060045af1612a5c57600080fd5b505060e061068061060051610620610460515afa612a7957600080fd5b60e03d80821115612a8a5780612a8c565b815b90509050610660526106608051602001806104808284600060045af1612ab157600080fd5b505060006020602082066106e001610480518284011115612ad157600080fd5b60e0806107008260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315612b0f57600080fd5b8091901215612b1d57600080fd5b806020036101000a82049050905090506104405260006104405114151515612b84576308c379a06105a05260206105c05260196105e0527f506f6f6c20646f6573206e6f7420696e697469616c697a656400000000000000610600526105e05060646105bcfd5b6040366105a0376101043561044051111515612bb65761042051610380511115612bb157610360516105c0525b612de2565b6101243561044051101515612be15761042051610380511015612bdc57610360516105c0525b612de2565b610140610600525b61060051516020610600510161060052610600610600511015612c0b57612be9565b61010435610620526104405161064052610124356106605261066051610640516106205160065801615ae6565b6106c0526105e0610600525b6106005152602061060051036106005261014061060051101515612c6757612c44565b6106c0516105e05261042051610380511115612d1c57610140610600525b61060051516020610600510161060052610600610600511015612ca757612c85565b6103a051610620526103c051610640526105e05161066052610360516106805261068051610660516106405161062051600658016154e9565b6106e0526105e0610600525b6106005152602061060051036106005261014061060051101515612d0f57612cec565b6106e0516105c052612de2565b610140610600525b61060051516020610600510161060052610600610600511015612d4657612d24565b6103a051610620526103c0516106405278010000000000000000000000000000000000000000000000006105e0518080612d7f57600080fd5b82049050905061066052610360516106805261068051610660516106405161062051600658016154e9565b6106e0526105e0610600525b6106005152602061060051036106005261014061060051101515612dd957612db6565b6106e0516105c0525b610360516105c0511115612df957610360516105c0525b60006105c0511115612ea0576101406105e0525b6105e0515160206105e051016105e0526105e06105e0511015612e2f57612e0d565b610380516106005261042051610620526105c0516106405261028051610660526106605161064051610620516106005160065801615163565b6106c0526105c06105e0525b6105e0515260206105e051036105e0526101406105e051101515612e9757612e74565b6106c0516105a0525b61038051610140511415612edb57610360516105c05180821015612ec357600080fd5b808203905090506101e0526105a05161020052612f04565b610360516105c05180821015612ef057600080fd5b80820390509050610200526105a0516101e0525b6060366105e037610140610640525b61064051516020610640510161064052610640610640511015612f3557612f13565b6044356106605233610680526106a061014080518252806020015182602001528060400151826040015280606001518260600152806080015182608001528060a001518260a001528060c001518260c001528060e001518260e0015280610100015182610100015280610120015182610120015280610140015182610140015250506104405161080052610800516107e0516107c0516107a05161078051610760516107405161072051610700516106e0516106c0516106a05161068051610660516006580161434a565b61086052610880526108a052610620610640525b610640515260206106405103610640526101406106405110151561303757613014565b61086080808080516108c0525050602081019050808080516108e05250506020810190508080805161090052505050506108c080516105e052806020015161060052806040015161062052506101443561062051101515156130d8576308c379a061064052602061066052600d610680527f4869676820536c697070616765000000000000000000000000000000000000006106a05261068050606461065cfd5b6101e0516105e051808210156130ed57600080fd5b808203905090506105e05261020051610600518082101561310d57600080fd5b808203905090506106005260006105e05111156131b957610140610640525b6106405151602061064051016106405261064061064051101561314e5761312c565b610140516106605273c36442b4a4522e871399cd717abdd847ab11fe886106805260006106a0526106a051610680516106605160065801613e13565b610620610640525b61064051526020610640510361064052610140610640511015156131b557613192565b6000505b600061060051111561325a57610140610640525b610640515160206106405101610640526106406106405110156131ef576131cd565b610160516106605273c36442b4a4522e871399cd717abdd847ab11fe886106805260006106a0526106a051610680516106605160065801613e13565b610620610640525b610640515260206106405103610640526101406106405110151561325657613233565b6000505b6000600455005b63dd2bb8e181141561365b576004541561327a57600080fd5b6001600455341561328a57600080fd5b6000541515156132d9576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60443560243510151561332b576308c379a061014052602061016052600f610180527f556e736f7274656420746f6b656e7300000000000000000000000000000000006101a05261018050606461015cfd5b602435610140523361016052306101805260c4356101a0526101a05161018051610160516101405160065801614147565b600050604435610140523361016052306101805260e4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c43561014051808210156134dc57600080fd5b808203905090506101405260e43561016051808210156134fb57600080fd5b808203905090506101605260006101405111156135ad576101405161016051610180516024356101a052336101c052610140516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000610160511115613654576101405161016051610180516044356101a052336101c052610160516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000600455005b6302329a2981141561370857341561367257600080fd5b60043560011c1561368257600080fd5b600154331415156136d2576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600055600435610140527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd26020610140a1005b63a6ba31c181141561378757341561371f57600080fd5b60043560a01c1561372f57600080fd5b6001543314151561377f576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600155005b63361bc0ca81141561382457341561379e57600080fd5b600154331415156137ee576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600355600435610140527f6bbc57480a46553fa4d156ce702beef5f3ad66303b0ed1a5d4cb44966c6584c36020610140a1005b63775507568114156138a357341561383b57600080fd5b60043560a01c1561384b57600080fd5b6001543314151561389b576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600255005b63f42ce21c811415613ac957600454156138bc57600080fd5b600160045534156138cc57600080fd5b6000610120525b610120516004013560a01c156138e857600080fd5b6020610120510161012052610100610120511015613905576138d3565b6000610120525b61012051610204013560a01c1561392257600080fd5b602061012051016101205261010061012051101561393f5761390c565b6001543314151561398f576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b61014060006008818352015b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600461014051600881106139c357600080fd5b60200201351415613a1957600060006000600061010461014051600881106139ea57600080fd5b60200201356102046101405160088110613a0357600080fd5b60200201356000f1613a1457600080fd5b613ab0565b600060046101405160088110613a2e57600080fd5b60200201351815613ab0576101405160046101405160088110613a5057600080fd5b6020020135610160526102046101405160088110613a6d57600080fd5b6020020135610180526101046101405160088110613a8a57600080fd5b60200201356101a0526101a051610180516101605160065801613fad565b610140526000505b815160010180835281141561399b575b50506000600455005b6369328dec811415613bdf5760045415613ae257600080fd5b60016004553415613af257600080fd5b60043560a01c15613b0257600080fd5b60443560a01c15613b1257600080fd5b60015433141515613b62576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6004351415613b9f5760006000600060006024356044356000f1613b9a57600080fd5b613bd8565b60006004351815613bd85760043561014052604435610160526024356101805261018051610160516101405160065801613fad565b6000505b6000600455005b635c975abb811415613c02573415613bf657600080fd5b60005460005260206000f35b63f851a440811415613c25573415613c1957600080fd5b60015460005260206000f35b6341275358811415613c48573415613c3c57600080fd5b60025460005260206000f35b6369e15404811415613c6b573415613c5f57600080fd5b60035460005260206000f35b505b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc233141515613ccf576308c379a0610140526020610160526011610180527f63616e27742072656365697665204574680000000000000000000000000000006101a05261018050606461015cfd5b005b61016052610140526003610140511115613de757610140516001818183011015613cfa57600080fd5b8082019050905060028082049050905061018052610140516101a0526101c06000610100818352015b610180516101a0511415613d43576101a051600052505060005161016051565b610180516101a05261014051610180518080613d5e57600080fd5b82049050905061018051818183011015613d7757600080fd5b80820190509050600280820490509050610180525b8151600101808352811415613d23575b50506308c379a06101c05260206101e0526010610200527f446964206e6f7420636f76657261676500000000000000000000000000000000610220526102005060646101dcfd613e11565b610140511515613e035760006000526000516101605156613e11565b600160005260005161016051565b005b6101a05261014052610160526101805260006004610220527f095ea7b3000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613ebc57600080fd5b505060206103e0610320516103406000610140515af1613edb57600080fd5b60203d80821115613eec5780613eee565b815b905090506103c0526103c08051602001806101c08284600060045af1613f1357600080fd5b505060006101c0511115613fa7576101c0806020015160008251806020901315613f3c57600080fd5b8091901215613f4a57600080fd5b806020036101000a820490509050905015151515613fa7576308c379a061022052602061024052600e610260527f417070726f7665206661696c65640000000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af161405657600080fd5b505060206103e0610320516103406000610140515af161407557600080fd5b60203d808211156140865780614088565b815b905090506103c0526103c08051602001806101c08284600060045af16140ad57600080fd5b505060006101c0511115614141576101c08060200151600082518060209013156140d657600080fd5b80919012156140e457600080fd5b806020036101000a820490509050905015151515614141576308c379a061022052602061024052600f610260527f5472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b6101c0526101405261016052610180526101a05260006004610240527f23b872dd00000000000000000000000000000000000000000000000000000000610260526102406004806020846102a001018260208501600060045af1505080518201915050610160516020826102a0010152602081019050610180516020826102a00101526020810190506101a0516020826102a0010152602081019050806102a0526102a090508051602001806103608284600060045af161420757600080fd5b50506020610440610360516103806000610140515af161422657600080fd5b60203d808211156142375780614239565b815b90509050610420526104208051602001806101e08284600060045af161425e57600080fd5b505060006101e05111156142f2576101e080602001516000825180602090131561428757600080fd5b809190121561429557600080fd5b806020036101000a8204905090509050151515156142f2576308c379a0610240526020610260526013610280527f5472616e7366657246726f6d206661696c6564000000000000000000000000006102a05261028050606461025cfd5b6101c05156614342575b6103005260006102e0526101405261016052610180526101a0526101c0526101e05261020052610220526102405261026052610280526102a0526102c05260005061438e565b60001561438e575b610300526101405261016052610180526101a0526101c0526101e05261020052610220526102405261026052610280526102a0526102c0526102e05260005061438e565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610180516103205273c36442b4a4522e871399cd717abdd847ab11fe8861034052610220516103605261036051610340516103205160065801613e13565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516101a0516103205273c36442b4a4522e871399cd717abdd847ab11fe8861034052610240516103605261036051610340516103205160065801613e13565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052600050610140511515614def576102e05161032052600060203661034037506103205115156148165760006004610480527f1698ee82000000000000000000000000000000000000000000000000000000006104a0526104806004806020846104e001018260208501600060045af1505080518201915050610180516020826104e00101526020810190506101a0516020826104e00101526020810190506101c0516020826104e0010152602081019050806104e0526104e090508051602001806105a08284600060045af16145d257600080fd5b505060206106806105a0516105c0731f98431c8ad98523631ae4a59f267346ea31f9845afa61460057600080fd5b60203d808211156146115780614613565b815b90509050610660526106608051602001806103408284600060045af161463857600080fd5b5050610360518060a01c1561464c57600080fd5b8090506103a05260006103a051141515156146a6576308c379a06104805260206104a05260136104c0527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006104e0526104c050606461049cfd5b60046105a0527f3850c7bd000000000000000000000000000000000000000000000000000000006105c0526105a08051602001806106008284600060045af16146ee57600080fd5b505060e0610680610600516106206103a0515afa61470b57600080fd5b60e03d8082111561471c578061471e565b815b90509050610660526106608051602001806104808284600060045af161474357600080fd5b505060006020602082066106e00161048051828401111561476357600080fd5b60e0806107008260206020880688030161048001600060045af15050818152809050905090508060200151600082518060209013156147a157600080fd5b80919012156147af57600080fd5b806020036101000a82049050905090506103205260006103205114151515614816576308c379a06105a05260206105c05260196105e0527f506f6f6c20646f6573206e6f7420696e697469616c697a656400000000000000610600526105e05060646105bcfd5b60006004610480527f13ead562000000000000000000000000000000000000000000000000000000006104a0526104806004806020846104e001018260208501600060045af1505080518201915050610180516020826104e00101526020810190506101a0516020826104e00101526020810190506101c0516020826104e0010152602081019050610320516020826104e0010152602081019050806104e0526104e090508051602001806105c08284600060045af16148d557600080fd5b505060206106c06105c0516105e0600073c36442b4a4522e871399cd717abdd847ab11fe885af161490557600080fd5b60203d808211156149165780614918565b815b905090506106a0526106a08051602001806103408284600060045af161493d57600080fd5b50506000610360518060a01c1561495357600080fd5b809050141515156149a3576308c379a06104805260206104a052601a6104c0527f437265617465204f7220496e697420506f6f6c206661696c65640000000000006104e0526104c050606461049cfd5b60006004610540527f8831645600000000000000000000000000000000000000000000000000000000610560526105406004806020846105a001018260208501600060045af1505080518201915050610180516020826105a00101526020810190506101a0516020826105a00101526020810190506101c0516020826105a00101526020810190506101e0516020826105a0010152602081019050610200516020826105a0010152602081019050610220516020826105a0010152602081019050610240516020826105a0010152602081019050610260516020826105a0010152602081019050610280516020826105a00101526020810190506102a0516020826105a00101526020810190506102c0516020826105a0010152602081019050806105a0526105a090508051602001806107608284600060045af1614ae757600080fd5b5050608061094061076051610780600073c36442b4a4522e871399cd717abdd847ab11fe885af1614b1757600080fd5b60803d80821115614b285780614b2a565b815b90509050610920526109208051602001806104808284600060045af1614b4f57600080fd5b5050600060206020820661062001610480518284011115614b6f57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614bad57600080fd5b8091901215614bbb57600080fd5b806020036101000a82049050905090506103a052602060206020820661062001610480518284011115614bed57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614c2b57600080fd5b8091901215614c3957600080fd5b806020036101000a82049050905090506103c052604060206020820661062001610480518284011115614c6b57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614ca957600080fd5b8091901215614cb757600080fd5b806020036101000a82049050905090506103e052606060206020820661062001610480518284011115614ce957600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614d2757600080fd5b8091901215614d3557600080fd5b806020036101000a8204905090509050610400526103c051610540526103e0516105605261040051610580526101a051610180516103a0517f8608f0d1a9f263ba6515609d93d7510949b8477690ce655f3b813420049d3d846060610540a46105a06103e05181526104005181602001526103c0518160400152506060610600525b600061060051111515614dc957614de5565b602061060051036105a001516020610600510361060052614db7565b6103005156615161565b6060366103203760006004610420527f219f5d17000000000000000000000000000000000000000000000000000000006104405261042060048060208461048001018260208501600060045af150508051820191505061014051602082610480010152602081019050610220516020826104800101526020810190506102405160208261048001015260208101905061026051602082610480010152602081019050610280516020826104800101526020810190506102c051602082610480010152602081019050806104805261048090508051602001806105a08284600060045af1614edb57600080fd5b505060606106e06105a0516105c0600073c36442b4a4522e871399cd717abdd847ab11fe885af1614f0b57600080fd5b60603d80821115614f1c5780614f1e565b815b905090506106c0526106c08051602001806103808284600060045af1614f4357600080fd5b505060006020602082066104e001610380518284011115614f6357600080fd5b6060806105008260206020880688030161038001600060045af1505081815280905090509050806020015160008251806020901315614fa157600080fd5b8091901215614faf57600080fd5b806020036101000a82049050905090506103205260206020602082066104e001610380518284011115614fe157600080fd5b6060806105008260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561501f57600080fd5b809190121561502d57600080fd5b806020036101000a82049050905090506103405260406020602082066104e00161038051828401111561505f57600080fd5b6060806105008260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561509d57600080fd5b80919012156150ab57600080fd5b806020036101000a8204905090509050610360526103205161042052610340516104405261036051610460526101a05161018051610140517f8608f0d1a9f263ba6515609d93d7510949b8477690ce655f3b813420049d3d846060610420a46104806103405181526103605181602001526103205181604001525060606104e0525b60006104e05111151561513f5761515b565b60206104e05103610480015160206104e051036104e05261512d565b61030051565b005b6101c0526101405261016052610180526101a0526101605161014051141561519557610180516000526000516101c051565b6101405161016051610180516101a0516101c051610140516101e052737a250d5630b4cf539739df2c5dacb4c659f2488d61020052610180516102205261022051610200516101e05160065801613e13565b6101c0526101a052610180526101605261014052600050600060046102a0527f38ed1739000000000000000000000000000000000000000000000000000000006102c0526102a060048060208461030001018260208501600060045af150508051820191505061018051602082610300010152602081019050600060208261030001015260208101905060a0602082610300010152602081019050306020826103000101526020810190506101a05160208261030001015260208101905060026020826103000101526020810190506101405160208261030001015260208101905061016051602082610300010152602081019050806103005261030090508051602001806104608284600060045af161530057600080fd5b505060806105e0610460516104806000737a250d5630b4cf539739df2c5dacb4c659f2488d5af161533057600080fd5b60803d808211156153415780615343565b815b905090506105c0526105c08051602001806101e08284600060045af161536857600080fd5b505060606020602082066103a0016101e051828401111561538857600080fd5b6080806103c0826020602088068803016101e001600060045af15050818152809050905090508060200151600082518060209013156153c657600080fd5b80919012156153d457600080fd5b806020036101000a82049050905090506102a0526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610140516102c052737a250d5630b4cf539739df2c5dacb4c659f2488d6102e052600061030052610300516102e0516102c05160065801613e13565b6102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006102a0511115156154d9576308c379a06102c05260206102e0526014610300527f4572726f72205377617070696e6720546f6b656e000000000000000000000000610320526103005060646102dcfd5b6102a0516000526000516101c051565b6101c0526101405261016052610180526101a05261014051610160516103e5808202821582848304141761551c57600080fd5b809050905090506103e8808204905090506c01000000000000000000000000808202821582848304141761554f57600080fd5b8090509050905061018051808061556557600080fd5b82049050905081818301101561557a57600080fd5b808201905090506101a0516103e5808202821582848304141761559c57600080fd5b809050905090506103e880820490509050808210156155ba57600080fd5b808203905090506101e0526101405161016051610180516101a0516101c0516101e0516101e0516101e05180820282158284830414176155f957600080fd5b80905090509050600461014051808202821582848304141761561a57600080fd5b809050905090506101a051808202821582848304141761563957600080fd5b809050905090506103e5808202821582848304141761565757600080fd5b809050905090506103e88082049050905081818301101561567757600080fd5b80820190509050610200526102005160065801613cd1565b610260526101e0526101c0526101a052610180526101605261014052610260516101e051808210156156c057600080fd5b808203905090506103e880820282158284830414176156de57600080fd5b809050905090506107ca808204905090506000526000516101c051565b610160526101405260206102006004630dfe16816101a0526101bc610140515afa61572557600080fd5b601f3d1161573257600080fd5b60005061020051610180526020610220600463d21220a76101c0526101dc610140515afa61575f57600080fd5b601f3d1161576c57600080fd5b600050610220516101a0526102006101805181526101a0518160200152506040610240525b6000610240511115156157a3576157bf565b6020610240510361020001516020610240510361024052615791565b61016051565b61018052610140526101605260a0366101a03760606102a06004630902f1ac6102405261025c610160515afa6157fa57600080fd5b605f3d1161580757600080fd5b6102a080808080516103005250506020810190508080805161032052505060208101905080808051610340525050505060005061030080516101a05280602001516101c052806040015161022052506101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261024051600658016156fb565b6102a0526102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102a080808080516102e05250506020810190508080805161030052505050506102e080516101e05280602001516102005250610140516101e0511415615908576101a0516000526000516101805156615918565b6101c05160005260005161018051565b005b6101a0526101405261016052610180526020610280604463e6a439056101e052610140516102005261016051610220526101fc735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa61596d57600080fd5b601f3d1161597a57600080fd5b600050610280516101c05260206102a0604463e6a43905610200526101405161022052610180516102405261021c735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa6159c857600080fd5b601f3d116159d557600080fd5b6000506102a0516101e0526101405161016051610180516101a0516101c0516101e0516102005161014051610220526101c051610240526102405161022051600658016157c5565b6102a052610200526101e0526101c0526101a0526101805261016052610140526102a051610200526101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101e051610260526102605161024051600658016157c5565b6102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102c0516102205261022051610200511115615ad457610160516000526000516101a05156615ae4565b610180516000526000516101a051565b005b6101a052610140526101605261018052610180516101605180821015615b0b57600080fd5b808203905090506c010000000000000000000000008082028215828483041417615b3457600080fd5b80905090509050610180518080615b4a57600080fd5b8204905090506c010000000000000000000000008082028215828483041417615b7257600080fd5b80905090509050610160518080615b8857600080fd5b8204905090506c010000000000000000000000008082028215828483041417615bb057600080fd5b80905090509050610160516101405180821015615bcc57600080fd5b808203905090508080615bde57600080fd5b8204905090506101c052740100000000000000000000000000000000000000006101c0511115615c2e57740100000000000000000000000000000000000000006000526000516101a05156615c3e565b6101c0516000526000516101a051565b00
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.