Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
DeFi
Overview
Max Total Supply
11,000,000 CTLS
Holders
468 (0.00%)
Market
Price
$0.00 @ 0.000000 ETH
Onchain Market Cap
$12,298.77
Circulating Supply Market Cap
$11,625.96
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.351941634090566491 CTLSValue
$0.00 ( ~0 Eth) [0.0000%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ChainToolsV2
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-14 */ //SPDX-License-Identifier: UNLICENSED /* CHAINTOOLS 2023. DEFI REIMAGINED 2023 ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 2021 ⣰⣾⣿⣶⡄⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀2019⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠹⣿V4⡄⡷⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⠀⠀⠀⠀⠀⠀⠀⠀ ⣤⣾⣿⣷⣦⡀⠀⠀⠀⠀ ⣿⣿⡏⠁⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣿⣿⣿⣷⡀⠀⠀⠀⠀ ⢀⣿⣿⣿⣿⣿⠄⠀⠀⠀ ⣰⣿⣿⣧⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣾⣿⣿⣿⣿⣿⣿⡄⠀⠀ ⢀⣴⣿⣿⣿⠟⠛⠋⠀⠀⠀ ⢸⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣿⣿⣿⣿⣿⠟⠉⠉⠉⠁⢀⣴⣿⣿V3⣿⣿⠀⠀⠀⠀⠀ ⣾⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⣾⣿⣿⣿⣿⣿⠛⠀⠀⠀⠀⠀ ⣾⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀ ⣿⣿⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⠀ ⠀⠀⠀ 2017⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿V2⣿⣿⡿⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀ ⢹⣿ ⣿⣿⣿⣿⠙⢿⣆⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣴⣦⣤⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⠛⠿⠿⠶⠶⣶⠀ ⣿ ⢸⣿⣿⣿⣿⣆⠹⠇⠀⠀ ⠀⠀⠀⠀⠀⠀⢀⣠⣴⣿⣿⣿⣿⣷⡆⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⡇⠉⠛⢿⣷⡄⠀⠀⠀⢸⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀ ⠹⠇⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀ ⠀⠀⠀⠀⣠⣴⣿⣿V1⣿⣿⣿⡏⠛⠃⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣇⠀⠀⠘⠋⠁⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀ ⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀ ⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀ ⠸⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀ ⠀⣿⣿⡟⢿⣿⣿⠀⠀⠀⠀ ⠀⢸⣿⣿⣿⣿⣿⠛⠉⠙⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀ ⢈⣿⣿⡟⢹⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⡿⠈⣿⣿⡟⠀⠀⠀⠀⠀ ⢸⣿⣿⠀⢸⣿⣿⠀⠀⠀⠀ ⠀⠀⠹⣿⣿⣿⣿⣷⡀⠀⠻⣿⣿⣿⣿⣶⣄⠀⠀⠀⢰⣿⣿⡟⠁⣾⣿⣿⠀⠀⠀⠀⠀⠀⢀⣶⣿⠟⠋⠀⢼⣿⣿⠃⠀⠀⠀⠀⠀ ⣿⣿⠁⠀⢹⣿⣿⠀⠀⠀⠀ ⠀⢀⣴⣿⡿⠋⢹⣿⡇⠀⠀⠈⠙⣿⣇⠙⣿⣷⠀⠀⢸⣿⡟⠀⠀⢻⣿⡏⠀⠀⠀⠀⠀⢀⣼⡿⠁⠀⠀⠀⠘⣿⣿⠀⠀⠀⠀⠀ ⢨⣿⡇⠀⠀⠀⣿⣿⠀⠀⠀⠀ ⣴⣿⡟⠉⠀⠀⣾⣿⡇⠀⠀⠀⠀⢈⣿⡄⠀⠉⠀⠀⣼⣿⡆⠀⠀⢸⣿⣷⠀⠀⠀⠀⢴⣿⣿⠀⠀⠀⠀⠀⠀⣿⣯⡀⠀⠀⠀⠀ ⢸⣿⣇⠀⠀⠀⢺⣿⡄⠀⠀⠀ ⠈⠻⠷⠄⠀⠀⣿⣿⣷⣤⣠⠀⠀⠈⠽⠷⠀⠀⠀⠸⠟⠛⠛⠒⠶⠸⣿⣿⣷⣦⣤⣄⠈⠻⠷⠄⠀⠀⠀⠾⠿⠿⣿⣶⣤⠀ ⠘⠛⠛⠛⠒⠀⠸⠿⠿⠦ Telegram: https://t.me/ChaintoolsOfficial Website: https://www.chaintools.ai/ Whitepaper: https://chaintools-whitepaper.gitbook.io/ Twitter: https://twitter.com/ChaintoolsTech dApp: https://www.chaintools.wtf/ */ pragma solidity ^0.8.19; // import "forge-std/console.sol"; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } interface IUniswapV2Router02 { function getAmountsOut(uint256 amountIn, address[] memory path) external view returns (uint256[] memory amounts); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); } interface IV2Pair { function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function token0() external view returns (address); function burn(address to) external returns (uint256 amount0, uint256 amount1); } interface IV3Pool { function liquidity() external view returns (uint128 Liq); struct Info { uint128 liquidity; uint256 feeGrowthInside0LastX128; uint256 feeGrowthInside1LastX128; uint128 tokensOwed0; uint128 tokensOwed1; } function initialize(uint160 sqrtPriceX96) external; function positions(bytes32 key) external view returns (IV3Pool.Info memory liqInfo); function swap( address recipient, bool zeroForOne, int256 amountSpecified, uint160 sqrtPriceLimitX96, bytes memory data ) external returns (int256 amount0, int256 amount1); function burn( int24 tickLower, int24 tickUpper, uint128 amount ) external returns (uint256 amount0, uint256 amount1); function collect( address recipient, int24 tickLower, int24 tickUpper, uint128 amount0Requested, uint128 amount1Requested ) external returns (uint128 amount0, uint128 amount1); function token0() external view returns (address); function token1() external view returns (address); function slot0() external view returns ( uint160, int24, uint16, uint16, uint16, uint8, bool ); function flash( address recipient, uint256 amount0, uint256 amount1, bytes calldata data ) external; function uniswapV3FlashCallback( uint256 fee0, uint256 fee1, bytes memory data ) external; function mint( address recipient, int24 tickLower, int24 tickUpper, uint128 amount, bytes calldata data ) external returns (uint256 amount0, uint256 amount1); } interface IWETH { function withdraw(uint256 wad) external; function approve(address who, uint256 wad) external returns (bool); function deposit() external payable; function transfer(address dst, uint256 wad) external returns (bool); function balanceOf(address _owner) external view returns (uint256); } interface IQuoterV2 { function quoteExactInputSingle( address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96 ) external returns (uint256 amountOut); } interface IV3Factory { function getPool( address token0, address token1, uint24 poolFee ) external view returns (address); function createPool( address tokenA, address tokenB, uint24 fee ) external returns (address); } interface INonfungiblePositionManager { function ownerOf(uint256 tokenId) external view returns (address owner); function setApprovalForAll(address operator, bool approved) external; struct IncreaseLiquidityParams { uint256 tokenId; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } function increaseLiquidity( INonfungiblePositionManager.IncreaseLiquidityParams calldata params ) external returns ( uint128 liquidity, uint256 amount0, uint256 amount1 ); function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) external; function transferFrom( address from, address to, uint256 tokenId ) external; function factory() external view returns (address); struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } function mint(MintParams calldata mp) external payable returns ( uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1 ); function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1); struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; } struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } function decreaseLiquidity(DecreaseLiquidityParams calldata dl) external returns (uint256 amount0, uint256 amount1); function positions(uint256 tokenId) external view returns ( uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1 ); } interface IRouterV3 { function factory() external view returns (address); function WETH9() external view returns (address); struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } function exactOutputSingle(ExactOutputSingleParams calldata params) external returns (uint256 amountIn); function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); } interface YieldVault { function getDeviation(uint256 amountIn, uint256 startTickDeviation) external view returns (uint256 adjusted); function getCurrentTick() external view returns (int24 cTick); function getStartTickDeviation(int24 currentTick) external view returns (uint256 perc); function findPoolFee(address token0, address token1) external view returns (uint24 poolFee); function getPosition(uint256 tokenId) external view returns ( address token0, address token1, uint128 liquidity ); function getTickDistance(uint256 flag) external view returns (int24 tickDistance); function findApprovalToken(address pool) external view returns (address token); function findApprovalToken(address token0, address token1) external view returns (address token); function buyback( uint256 flag, uint128 internalWETHAmt, uint128 internalCTLSAmt, address to, uint256 id ) external returns (uint256 t0, uint256 t1); function keeper() external view returns (address); } interface YieldBooster { function preventFragmentations(address pool) external; } interface TickMaths { function getSqrtRatioAtTick(int24 tick) external pure returns (uint160 sqrtPriceX96); } contract ChainToolsV2 is Context, IERC20, IERC20Metadata { IUniswapV2Router02 internal immutable router; INonfungiblePositionManager internal immutable positionManager; YieldBooster internal YIELD_BOOSTER; YieldVault internal YIELD_VAULT; TickMaths internal immutable TickMath; address internal immutable uniswapV3Pool; address internal immutable multiSig; address internal immutable WETH; address internal immutable v3Router; address internal immutable apest; uint256 internal immutable _MAX_SUPPLY; uint256 internal immutable _totalSupply; uint256 internal immutable _cap; uint8 internal tokenomicsOn; uint32 internal startStamp; uint32 internal lastRewardStamp; uint80 internal issuanceRate; mapping(address => uint256) internal _balances; mapping(address => mapping(address => uint256)) internal _allowances; mapping(address => bool) internal isTaxExcluded; mapping(address => bool) internal badPool; mapping(address => address) internal upperRef; mapping(address => uint256) internal sandwichLock; event zapIn( address indexed from, uint256 tokenId, uint256 flag, uint256 amtETHIn, uint256 amtTokensIn ); event referralPaid(address indexed from, address indexed to, uint256 amt); error MinMax(); error ZeroAddress(); error Auth(); error Sando(); constructor(address _apest, address _tickMaths) { TickMath = TickMaths(_tickMaths); multiSig = 0xb0Df68E0bf4F54D06A4a448735D2a3d7D97A2222; apest = _apest; tokenomicsOn = 1; issuanceRate = 10e18; v3Router = 0xE592427A0AEce92De3Edee1F18E0157C05861564; router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); WETH = IRouterV3(v3Router).WETH9(); positionManager = INonfungiblePositionManager( 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 ); uniswapV3Pool = IV3Factory(positionManager.factory()).createPool( WETH, address(this), 10000 ); require(IV3Pool(uniswapV3Pool).token0() == WETH, "token0pool0"); //Initial supply uint256 forLiquidityBootstrap = 1_000_000e18; _balances[ 0x0000000000000000000000000000000000C0FFEE ] = forLiquidityBootstrap; emit Transfer( address(0), address(0x0000000000000000000000000000000000C0FFEE), forLiquidityBootstrap ); uint256 forMigration = 8_200_000e18; _balances[apest] += forMigration; emit Transfer(address(0), address(apest), forMigration); uint256 forLp = 600_000e18; _balances[address(this)] += forLp; emit Transfer(address(0), address(this), forLp); uint256 forMarketing = 1_000_000e18; _balances[0xb0Df68E0bf4F54D06A4a448735D2a3d7D97A2222] += forMarketing; emit Transfer( address(0), 0xb0Df68E0bf4F54D06A4a448735D2a3d7D97A2222, forMarketing ); uint256 forYieldBoosting = 200_000e18; _balances[address(this)] += forYieldBoosting; emit Transfer(address(0), address(this), forMarketing); int24 startTick = 98140; IV3Pool(uniswapV3Pool).initialize( TickMath.getSqrtRatioAtTick(startTick) ); IERC20(WETH).approve(address(positionManager), type(uint256).max); IERC20(WETH).approve(v3Router, type(uint256).max); _allowances[address(this)][v3Router] = type(uint256).max; _allowances[address(this)][address(positionManager)] = type(uint256) .max; isTaxExcluded[v3Router] = true; isTaxExcluded[multiSig] = true; isTaxExcluded[address(this)] = true; _totalSupply = forLiquidityBootstrap + forMigration + forLp + forMarketing + forYieldBoosting; _MAX_SUPPLY = _totalSupply; _cap = _MAX_SUPPLY; } function prepareFomo(address yieldVault, address yieldBooster) external { if (msg.sender != apest) revert Auth(); if (startStamp != 0) revert MinMax(); //Compounder YIELD_VAULT = YieldVault(yieldVault); isTaxExcluded[address(YIELD_VAULT)] = true; _allowances[address(YIELD_VAULT)][address(positionManager)] = type( uint256 ).max; _allowances[address(YIELD_VAULT)][address(v3Router)] = type(uint256) .max; //Yield Booster YIELD_BOOSTER = YieldBooster(payable(yieldBooster)); _allowances[address(YIELD_BOOSTER)][address(positionManager)] = type( uint256 ).max; isTaxExcluded[address(YIELD_BOOSTER)] = true; _basicTransfer(address(this), address(YIELD_BOOSTER), 200_000e18); YIELD_BOOSTER.preventFragmentations(address(0)); } receive() external payable {} function preparePool() external payable { if (msg.sender != apest) revert Auth(); startStamp = uint32(block.timestamp); int24 tick = 98140; uint256 forLp = 600_000e18; tick = (tick / 200) * 200; uint256 a0; uint256 a1; IWETH(WETH).deposit{value: msg.value}(); (, , a0, a1) = positionManager.mint( INonfungiblePositionManager.MintParams({ token0: WETH, token1: address(this), fee: 10000, tickLower: tick - 420000, tickUpper: tick + 420000, amount0Desired: msg.value - 1e7, amount1Desired: forLp, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: block.timestamp }) ); positionManager.setApprovalForAll(address(YIELD_VAULT), true); uint256 leftOver2 = forLp - a1; (, , , a1) = positionManager.mint( INonfungiblePositionManager.MintParams({ token0: WETH, token1: address(this), fee: 10000, tickLower: tick - 420000, tickUpper: tick - 200, amount0Desired: 0, amount1Desired: leftOver2, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: block.timestamp }) ); IRouterV3(v3Router).exactInputSingle( IRouterV3.ExactInputSingleParams({ tokenIn: WETH, tokenOut: address(this), fee: 10000, recipient: multiSig, deadline: block.timestamp, amountIn: 1e7 - 1, amountOutMinimum: 0, sqrtPriceLimitX96: 0 }) ); uint256 leftOver = IERC20(WETH).balanceOf(address(this)); if (leftOver != 0) { IERC20(WETH).transfer(multiSig, leftOver - 1); } startStamp = 0; } function openTrading() external { startStamp = uint32(block.timestamp); lastRewardStamp = uint32(block.timestamp); } function name() public view virtual override returns (string memory) { return "ChainTools"; } function symbol() public view virtual override returns (string memory) { return "CTLS"; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address to, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), to, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _approve(from, spender, _allowances[from][spender] - amount); _transfer(from, to, amount); return true; } function _basicTransfer( address sender, address recipient, uint256 amount ) internal returns (bool) { _balances[sender] -= amount; unchecked { _balances[recipient] += amount; } if ( sender != address(YIELD_BOOSTER) && recipient != address(YIELD_BOOSTER) && recipient != address(positionManager) ) emit Transfer(sender, recipient, amount); return true; } function _approve( address owner, address spender, uint256 amount ) internal virtual { if (owner == address(0)) revert ZeroAddress(); if (spender == address(0)) revert ZeroAddress(); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function multiTransfer(address[] calldata to, uint256[] calldata amounts) external { uint256 size = to.length; require(size == amounts.length, "Length"); if (msg.sender != apest) { require(startStamp != 0, "notOpenYet"); require(sandwichLock[msg.sender] != block.number, "altSando"); } for (uint256 i; i < size; ) { unchecked { _basicTransfer(msg.sender, to[i], amounts[i]); ++i; } } } function _transfer( address sender, address recipient, uint256 amount ) internal returns (bool) { //determine trader address trader = sender == uniswapV3Pool ? recipient : sender; if (sender != uniswapV3Pool && recipient != uniswapV3Pool) trader = sender; if (startStamp == 0) { revert MinMax(); } if ( recipient == uniswapV3Pool || recipient == address(positionManager) || isTaxExcluded[sender] || isTaxExcluded[recipient] ) { return _basicTransfer(sender, recipient, amount); } if ( trader != address(this) && trader != address(YIELD_BOOSTER) && trader != address(positionManager) && trader != address(YIELD_VAULT) ) { //One Block Delay [Sandwich Protection] if (sandwichLock[trader] < block.number) { sandwichLock[trader] = block.number + 1; } else { revert Sando(); } } if (tokenomicsOn != 0) { if (amount < 1e8 || amount > 2_000_000e18) revert MinMax(); } else { return _basicTransfer(sender, recipient, amount); } //Normal Transfer if ( sender != uniswapV3Pool && sender != address(positionManager) && recipient != uniswapV3Pool ) { if (badPool[recipient]) revert Auth(); try this.swapBack() {} catch {} return _basicTransfer(sender, recipient, amount); } unchecked { if (sender != uniswapV3Pool) { try this.swapBack() {} catch {} } } _balances[sender] -= amount; //Tax & Final transfer amounts unchecked { uint256 tFee = amount / 20; if ( //Only first 10 minutes block.timestamp < startStamp + 10 minutes ) { //Sniper bots funding lp rewards tFee *= 2; } amount -= tFee; //if sender is not position manager tax go to contract if (sender != address(positionManager)) { _balances[address(this)] += tFee; } else if (sender == address(positionManager)) { address ref = upperRef[recipient] != address(0) ? upperRef[recipient] : multiSig; uint256 rFee0 = tFee / 5; _balances[ref] += rFee0; tFee -= rFee0; _balances[address(YIELD_BOOSTER)] += tFee; emit Transfer(recipient, ref, tFee); emit referralPaid(recipient, ref, rFee0); } _balances[recipient] += amount; } emit Transfer(sender, recipient, amount); return true; } function swapBack() public { unchecked { uint256 fullAmount = _balances[address(this)]; if (fullAmount < _totalSupply / 2000) { return; } if ( msg.sender != address(this) && msg.sender != address(YIELD_VAULT) && msg.sender != address(YIELD_BOOSTER) ) revert Auth(); //0.20% max per swap uint256 maxSwap = _totalSupply / 500; if (fullAmount > maxSwap) { fullAmount = maxSwap; } IRouterV3(v3Router).exactInputSingle( IRouterV3.ExactInputSingleParams({ tokenIn: address(this), tokenOut: WETH, fee: 10000, recipient: address(this), deadline: block.timestamp, amountIn: fullAmount, amountOutMinimum: 0, sqrtPriceLimitX96: 0 }) ); } } function sendLPRewards() internal { unchecked { address sendToken = WETH; assembly { let bal := balance(address()) if gt(bal, 1000000000000) { let inputMem := mload(0x40) mstore(inputMem, 0xd0e30db) pop(call(gas(), sendToken, bal, inputMem, 0x4, 0, 0)) } } uint256 fin = IERC20(WETH).balanceOf(address(this)) - 1; address toMsig = multiSig; address toPool = uniswapV3Pool; assembly { if gt(fin, 1000000000000) { let inputMem := mload(0x40) mstore( inputMem, 0xa9059cbb00000000000000000000000000000000000000000000000000000000 ) mstore(add(inputMem, 0x04), toMsig) mstore(add(inputMem, 0x24), div(mul(fin, 65), 100)) pop(call(gas(), sendToken, 0, inputMem, 0x44, 0, 0)) mstore( inputMem, 0xa9059cbb00000000000000000000000000000000000000000000000000000000 ) mstore(add(inputMem, 0x04), toPool) mstore(add(inputMem, 0x24), div(mul(fin, 35), 100)) pop(call(gas(), sendToken, 0, inputMem, 0x44, 0, 0)) } } } } function flashReward() external { if ( msg.sender != address(this) && msg.sender != address(YIELD_VAULT) && msg.sender != address(multiSig) && msg.sender != address(YIELD_BOOSTER) ) revert Auth(); if (IV3Pool(uniswapV3Pool).liquidity() != 0) { IV3Pool(uniswapV3Pool).flash(address(this), 0, 0, ""); } } function uniswapV3FlashCallback( uint256, uint256, bytes calldata ) external { if (msg.sender != uniswapV3Pool) revert Auth(); uint256 secondsPassed = block.timestamp - lastRewardStamp; if (secondsPassed > 30 minutes) { sendLPRewards(); lastRewardStamp = uint32(block.timestamp); if (issuanceRate == 0) return; uint256 pending = (secondsPassed / 60) * issuanceRate; if ( _balances[0x0000000000000000000000000000000000C0FFEE] >= pending ) { unchecked { _balances[ 0x0000000000000000000000000000000000C0FFEE ] -= pending; _balances[uniswapV3Pool] += pending; emit Transfer( 0x0000000000000000000000000000000000C0FFEE, uniswapV3Pool, pending ); } } } } function _collectLPRewards(uint256 tokenId) internal returns (uint256 c0, uint256 c1) { (c0, c1) = positionManager.collect( INonfungiblePositionManager.CollectParams({ tokenId: tokenId, recipient: address(this), amount0Max: type(uint128).max, amount1Max: type(uint128).max }) ); } function _decreasePosition(uint256 tokenId, uint128 liquidity) internal returns (uint256 a0, uint256 a1) { positionManager.decreaseLiquidity( INonfungiblePositionManager.DecreaseLiquidityParams({ tokenId: tokenId, liquidity: liquidity, amount0Min: 0, amount1Min: 0, deadline: block.timestamp }) ); (a0, a1) = _collectLPRewards(tokenId); } function _swapV3( address tokenIn, address tokenOut, uint24 poolFee, uint256 amountIn, uint256 minOut ) internal returns (uint256 out) { if (tokenIn != WETH && tokenIn != address(this)) { tokenIn.call( abi.encodeWithSelector( IERC20.approve.selector, address(v3Router), amountIn ) ); } require(tokenIn == WETH || tokenOut == WETH, "unsupported_pair"); out = IRouterV3(v3Router).exactInputSingle( IRouterV3.ExactInputSingleParams({ tokenIn: tokenIn, tokenOut: tokenOut, fee: poolFee, recipient: address(this), deadline: block.timestamp, amountIn: amountIn, amountOutMinimum: minOut, sqrtPriceLimitX96: 0 }) ); } function zapFromV3LPToken( uint256 tokenId, uint256 minOut, uint256 minOut2, uint256 flag, address ref ) external payable returns (uint256 tokenIdNew) { if (positionManager.ownerOf(tokenId) != msg.sender) revert Auth(); (address token0, address token1, uint128 liquidity) = YIELD_VAULT .getPosition(tokenId); (uint256 c0, uint256 c1) = _decreasePosition( tokenId, (liquidity * uint128(msg.value)) / 100 ); uint256 gotOut = _swapV3( token0 == WETH ? token1 : token0, WETH, YIELD_VAULT.findPoolFee(token0, token1), token0 == WETH ? c1 : c0, minOut ); uint256 totalWETH = token0 == WETH ? c0 + gotOut : c1 + gotOut; address _weth = WETH; assembly { let inputMem := mload(0x40) mstore( inputMem, 0x2e1a7d4d00000000000000000000000000000000000000000000000000000000 ) mstore(add(inputMem, 0x04), totalWETH) pop(call(gas(), _weth, 0, inputMem, 0x24, 0, 0)) } return this.zapFromETH{value: totalWETH}(minOut2, msg.sender, flag, ref); } function _mintPosition( uint256 amt0Desired, uint256 amount1Desired, uint256 flag, address to ) internal returns ( uint256 tokenId, uint256 amt0Consumed, uint256 amt1Consumed ) { int24 tick = YIELD_VAULT.getCurrentTick(); int24 tickDist = YieldVault(YIELD_VAULT).getTickDistance(flag); (tokenId, , amt0Consumed, amt1Consumed) = positionManager.mint( INonfungiblePositionManager.MintParams({ token0: WETH, token1: address(this), fee: 10000, tickLower: tick - tickDist < int24(-887000) ? int24(-887000) : tick - tickDist, tickUpper: tick + tickDist > int24(887000) ? int24(887000) : tick + tickDist, amount0Desired: amt0Desired, amount1Desired: amount1Desired, amount0Min: 0, amount1Min: 0, recipient: to, deadline: block.timestamp }) ); } function _zapFromWETH( uint256 minOut, uint256 finalAmt, uint256 flag, address to ) internal returns (uint256 tokenId) { unchecked { uint256 startTickDeviation = YIELD_VAULT.getStartTickDeviation( YIELD_VAULT.getCurrentTick() ); uint256 gotTokens; uint256 deviationAmt = YIELD_VAULT.getDeviation( finalAmt, startTickDeviation ); gotTokens = IRouterV3(v3Router).exactInputSingle( IRouterV3.ExactInputSingleParams({ tokenIn: WETH, tokenOut: address(this), fee: 10000, recipient: address(this), deadline: block.timestamp, amountIn: deviationAmt, amountOutMinimum: minOut, sqrtPriceLimitX96: 0 }) ); finalAmt -= deviationAmt; uint256 a1Out; (tokenId, deviationAmt, a1Out) = _mintPosition( finalAmt, gotTokens, flag, to ); if (a1Out > gotTokens) revert MinMax(); if (deviationAmt > finalAmt) revert MinMax(); address sendToken = WETH; assembly { let refundAmtWETH := sub(finalAmt, deviationAmt) if gt(refundAmtWETH, 100000000000000) { let inputMem := mload(0x40) mstore( inputMem, 0xa9059cbb00000000000000000000000000000000000000000000000000000000 ) mstore(add(inputMem, 0x04), to) mstore(add(inputMem, 0x24), refundAmtWETH) pop(call(gas(), sendToken, 0, inputMem, 0x44, 0, 0)) } } if (gotTokens - a1Out >= 1e18) _basicTransfer(address(this), to, gotTokens - a1Out); emit zapIn(to, tokenId, flag, deviationAmt, gotTokens); } } function zapFromETH( uint256 minOut, address to, uint256 flag, address upper ) external payable returns (uint256 tokenId) { address _d = address(YIELD_BOOSTER); address cUpper = upperRef[tx.origin]; //handle referrals { if ( upper != tx.origin && cUpper == address(0) && upper != address(0) ) { upperRef[tx.origin] = upper; } if (upperRef[tx.origin] == address(0)) { cUpper = _d; } else { cUpper = upperRef[tx.origin]; } } unchecked { uint256 finalAmt = msg.value; uint256 forReferral = finalAmt / 100; //1% finalAmt -= (forReferral * 3); //3% taxx address sendToken = WETH; assembly { if eq(_d, cUpper) { pop(call(10000, _d, mul(forReferral, 3), "", 0, 0, 0)) } if not(eq(_d, cUpper)) { pop(call(10000, _d, mul(forReferral, 2), "", 0, 0, 0)) pop(call(10000, cUpper, forReferral, "", 0, 0, 0)) } let inputMem := mload(0x40) //wrap eth mstore(inputMem, 0xd0e30db) pop(call(gas(), sendToken, finalAmt, inputMem, 0x4, 0, 0)) } emit referralPaid(to, cUpper, forReferral); return _zapFromWETH(minOut, finalAmt, flag, to); } } //Protocol FUNCTIONS function adjustFomo( uint16 flag, uint256 amount, address who ) external { if (flag == 5) { //prevent liquidity fragmentation if (msg.sender != address(YIELD_BOOSTER)) revert Auth(); require(IV3Pool(who).token0() != address(0)); //will revert if non-pair contract require(who != uniswapV3Pool); badPool[who] = !badPool[who]; } else { if (msg.sender != multiSig) revert Auth(); if (flag == 0) { //Shutdown tokenomics [emergency only!] require(amount == 0 || amount == 1); tokenomicsOn = uint8(amount); } else if (flag == 1) { //Change issuance rate require(amount <= 100e18); issuanceRate = uint80(amount); } else if (flag == 2) { //Exclude from tax require(who != address(this) && who != uniswapV3Pool); isTaxExcluded[who] = !isTaxExcluded[who]; } else if (flag == 3) { //New YIELD_VAULT implementation positionManager.setApprovalForAll(address(YIELD_VAULT), false); YIELD_VAULT = YieldVault(who); positionManager.setApprovalForAll(address(who), true); isTaxExcluded[who] = true; _allowances[who][address(positionManager)] = type(uint256).max; } else if (flag == 4) { //Unlock LP require(block.timestamp >= startStamp + (1 days * 30 * 4)); positionManager.transferFrom(address(this), multiSig, amount); } else if (flag == 5) { //new Yield Booster implementation YIELD_BOOSTER = YieldBooster(who); isTaxExcluded[who] = true; } } } //GETTERS function getIsTaxExcluded(address who) external view returns (bool) { return isTaxExcluded[who]; } function getUpperRef(address who) external view returns (address) { return upperRef[who]; } function getYieldBooster() external view returns (address yb) { return address(YIELD_BOOSTER); } function MAX_SUPPLY() external view returns (uint256) { return _MAX_SUPPLY; } function cap() external view returns (uint256) { return _cap; } function getV3Pool() external view returns (address pool) { pool = uniswapV3Pool; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_apest","type":"address"},{"internalType":"address","name":"_tickMaths","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Auth","type":"error"},{"inputs":[],"name":"MinMax","type":"error"},{"inputs":[],"name":"Sando","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"referralPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"flag","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amtETHIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amtTokensIn","type":"uint256"}],"name":"zapIn","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"flag","type":"uint16"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"who","type":"address"}],"name":"adjustFomo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flashReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getIsTaxExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getUpperRef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getV3Pool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getYieldBooster","outputs":[{"internalType":"address","name":"yb","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"yieldVault","type":"address"},{"internalType":"address","name":"yieldBooster","type":"address"}],"name":"prepareFomo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"preparePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"swapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"uniswapV3FlashCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"address","name":"upper","type":"address"}],"name":"zapFromETH","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"uint256","name":"minOut2","type":"uint256"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"address","name":"ref","type":"address"}],"name":"zapFromV3LPToken","outputs":[{"internalType":"uint256","name":"tokenIdNew","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101e060405234801562000011575f80fd5b5060405162005839380380620058398339810160408190526200003491620007c1565b6001600160a01b0380821660c05273b0df68e0bf4f54d06a4a448735d2a3d7d97a2222610100528216610160526001805460ff60a01b1916600160a01b179055600280546001600160501b031916678ac7230489e8000017905573e592427a0aece92de3edee1f18e0157c05861564610140819052737a250d5630b4cf539739df2c5dacb4c659f2488d608052604080516312a9293f60e21b81529051634aa4a4fc916004808201926020929091908290030181865afa158015620000fb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001219190620007fe565b6001600160a01b03166101205273c36442b4a4522e871399cd717abdd847ab11fe8860a08190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000182573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001a89190620007fe565b6101205160405163a167129560e01b81526001600160a01b039182166004820152306024820152612710604482015291169063a1671295906064016020604051808303815f875af115801562000200573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002269190620007fe565b6001600160a01b031660e0816001600160a01b031681525050610120516001600160a01b031660e0516001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002b19190620007fe565b6001600160a01b031614620002fa5760405162461bcd60e51b815260206004820152600b60248201526a0746f6b656e30706f6f6c360ac1b604482015260640160405180910390fd5b62c0ffee5f8181526003602090815269d3c21bcecceda10000007f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23819055604051818152909392915f8051602062005819833981519152910160405180910390a3610160516001600160a01b03165f90815260036020526040812080546a06c86ae4062a02f5000000928392916200039490849062000823565b9091555050610160516040518281526001600160a01b03909116905f905f80516020620058198339815191529060200160405180910390a3305f9081526003602052604081208054697f0e10af47c1c700000092839291620003f890849062000823565b909155505060405181815230905f905f80516020620058198339815191529060200160405180910390a373b0df68e0bf4f54d06a4a448735d2a3d7d97a22225f90815260036020527ff15a87fc0e765107903eace54ace4fa23e1b5bd6fe67abc24d32ea55cf0d1cec805469d3c21bcecceda1000000928392916200047f90849062000823565b909155505060405181815273b0df68e0bf4f54d06a4a448735d2a3d7d97a2222905f905f80516020620058198339815191529060200160405180910390a3305f9081526003602052604081208054692a5a058fc295ed00000092839291620004e990849062000823565b909155505060405182815230905f905f80516020620058198339815191529060200160405180910390a360e05160c05160405163986cfba360e01b815262017f5c60048201819052926001600160a01b039081169263f637731d9291169063986cfba390602401602060405180830381865afa1580156200056c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005929190620007fe565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b158015620005d1575f80fd5b505af1158015620005e4573d5f803e3d5ffd5b50506101205160a05160405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529116925063095ea7b391506044016020604051808303815f875af11580156200063c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000662919062000849565b50610120516101405160405163095ea7b360e01b81526001600160a01b0391821660048201525f19602482015291169063095ea7b3906044016020604051808303815f875af1158015620006b8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620006de919062000849565b50305f818152600460209081526040808320610140516001600160a01b039081168086529184528285205f199081905560a051821686528386205590845260059092528083208054600160ff19918216811790925561010051909316845281842080548416821790559383529091208054909116909117905581838562000766888a62000823565b62000772919062000823565b6200077e919062000823565b6200078a919062000823565b6101a08190526101808190526101c052506200086a9650505050505050565b6001600160a01b0381168114620007be575f80fd5b50565b5f8060408385031215620007d3575f80fd5b8251620007e081620007a9565b6020840151909250620007f381620007a9565b809150509250929050565b5f602082840312156200080f575f80fd5b81516200081c81620007a9565b9392505050565b808201808211156200084357634e487b7160e01b5f52601160045260245ffd5b92915050565b5f602082840312156200085a575f80fd5b815180151581146200081c575f80fd5b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614d6d62000aac5f395f61039e01525f81816102510152818161154f015261160001525f61036c01525f8181610bc301528181611be9015261267d01525f8181611713015281816121e20152818161281901528181612bb301528181612e760152613c8a01525f8181610846015281816108ef0152818161095b015281816109bf01528181610a2e01528181611652015281816118ad01528181611cb301528181611d7801528181611fb2015281816120f5015281816122820152818161231f01528181612b3801528181612ca401528181612cf901528181613bf901528181613e0701528181613f0501528181613f92015261435501525f8181610f7201528181611429015281816119e20152818161212b015281816123460152818161388a015261400001525f818161064701528181610eb0015281816110bd01528181611a6101528181611b4c0152818161244b015281816125da01528181613053015281816130b001528181613107015281816131ba015281816134b2015281816135610152818161367c015261402101525f50505f81816106c9015281816111c301528181611295015281816113490152818161145801528181611d3001528181611efe01528181611f6a015281816127bc01528181612aa101528181612f8a0152818161320f0152818161331c015281816135090152818161379e0152818161380a0152818161416c015261430d01525f5050614d6d5ff3fe608060405260043610610191575f3560e01c80636ac5eeee116100dc578063b44f9efd11610087578063e9cbafb011610062578063e9cbafb0146105b7578063ea7a61c9146105d6578063edd14343146105f5578063f5247e9b14610639575f80fd5b8063b44f9efd146104c1578063c9567bf9146104c9578063dd62ed3e14610566575f80fd5b806395d89b41116100b757806395d89b41146104495780639a2bb3461461048e578063a9059cbb146104a2575f80fd5b80636ac5eeee146103e157806370a08231146103f55780637a3e349514610436575f80fd5b806323b872dd1161013c57806332cb6b0c1161011757806332cb6b0c1461035e578063355274ea1461039057806362995397146103c2575f80fd5b806323b872dd146102e05780632ddeb94d146102ff578063313ce56714610343575f80fd5b806318160ddd1161016c57806318160ddd1461024357806318bd21b9146102755780631e89d545146102bf575f80fd5b806306fdde031461019c578063095ea7b3146101f3578063167d585314610222575f80fd5b3661019857005b5f80fd5b3480156101a7575f80fd5b5060408051808201909152600a81527f436861696e546f6f6c730000000000000000000000000000000000000000000060208201525b6040516101ea9190614525565b60405180910390f35b3480156101fe575f80fd5b5061021261020d366004614599565b61066b565b60405190151581526020016101ea565b6102356102303660046145c3565b610681565b6040519081526020016101ea565b34801561024e575f80fd5b507f0000000000000000000000000000000000000000000000000000000000000000610235565b348015610280575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b3480156102ca575f80fd5b506102de6102d9366004614654565b610b3c565b005b3480156102eb575f80fd5b506102126102fa3660046146bb565b610d4e565b34801561030a575f80fd5b5061029a6103193660046146f9565b73ffffffffffffffffffffffffffffffffffffffff9081165f908152600760205260409020541690565b34801561034e575f80fd5b50604051601281526020016101ea565b348015610369575f80fd5b507f0000000000000000000000000000000000000000000000000000000000000000610235565b34801561039b575f80fd5b507f0000000000000000000000000000000000000000000000000000000000000000610235565b3480156103cd575f80fd5b506102de6103dc366004614714565b610daf565b3480156103ec575f80fd5b506102de61153b565b348015610400575f80fd5b5061023561040f3660046146f9565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b610235610444366004614759565b611780565b348015610454575f80fd5b5060408051808201909152600481527f43544c530000000000000000000000000000000000000000000000000000000060208201526101dd565b348015610499575f80fd5b506102de61199b565b3480156104ad575f80fd5b506102126104bc366004614599565b611bbb565b6102de611bd1565b3480156104d4575f80fd5b50600180547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004263ffffffff169081027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff169190911779010000000000000000000000000000000000000000000000000091909102179055005b348015610571575f80fd5b506102356105803660046147a0565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b3480156105c2575f80fd5b506102de6105d13660046147d7565b612433565b3480156105e1575f80fd5b506102de6105f03660046147a0565b612665565b348015610600575f80fd5b5061021261060f3660046146f9565b73ffffffffffffffffffffffffffffffffffffffff165f9081526005602052604090205460ff1690565b348015610644575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061029a565b5f61067733848461290e565b5060015b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690525f90339073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa15801561070e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107329190614850565b73ffffffffffffffffffffffffffffffffffffffff161461077f576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040517feb02c301000000000000000000000000000000000000000000000000000000008152600481018890525f918291829173ffffffffffffffffffffffffffffffffffffffff169063eb02c30190602401606060405180830381865afa1580156107f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610814919061488f565b919450925090505f8061083c8b606461082d3487614901565b6108379190614962565b612a15565b915091505f6109ba7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461089d578661089f565b855b6001546040517fc95e542b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015289811660248301527f000000000000000000000000000000000000000000000000000000000000000092169063c95e542b90604401602060405180830381865afa158015610935573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109599190614990565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146109b257866109b4565b855b8f612b35565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610a1f57610a1a82846149b2565b610a29565b610a2982856149b2565b90505f7f000000000000000000000000000000000000000000000000000000000000000090506040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081528260048201525f806024835f865af150506040517f7a3e3495000000000000000000000000000000000000000000000000000000008152600481018d9052336024820152604481018c905273ffffffffffffffffffffffffffffffffffffffff8b1660648201523090637a3e349590849060840160206040518083038185885af1158015610b05573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610b2a91906149c5565b9e9d5050505050505050505050505050565b82818114610bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c656e677468000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cea576001547501000000000000000000000000000000000000000000900463ffffffff165f03610c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f744f70656e596574000000000000000000000000000000000000000000006044820152606401610ba2565b335f90815260086020526040902054439003610cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f616c7453616e646f0000000000000000000000000000000000000000000000006044820152606401610ba2565b5f5b81811015610d4657610d3d33878784818110610d0a57610d0a6149dc565b9050602002016020810190610d1f91906146f9565b868685818110610d3157610d316149dc565b90506020020135612eed565b50600101610cec565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600460209081526040808320338085529252822054610d969086908390610d91908790614a09565b61290e565b610da185858561304f565b5060019150505b9392505050565b8261ffff16600503610f5a575f5473ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8f9190614850565b73ffffffffffffffffffffffffffffffffffffffff1603610eae575f80fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f05575f80fd5b73ffffffffffffffffffffffffffffffffffffffff165f908152600660205260409020805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790555050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610fc9576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8261ffff165f0361103257811580610fe15750816001145b610fe9575f80fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff851602179055505050565b8261ffff1660010361108e5768056bc75e2d63100000821115611053575f80fd5b600280547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001669ffffffffffffffffffff8416179055505050565b8261ffff166002036111695773ffffffffffffffffffffffffffffffffffffffff8116301480159061110c57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611114575f80fd5b73ffffffffffffffffffffffffffffffffffffffff165f908152600560205260409020805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790555050565b8261ffff1660030361139a576001546040517fa22cb46500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201525f60248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a22cb465906044015f604051808303815f87803b158015611206575f80fd5b505af1158015611218573d5f803e3d5ffd5b5050600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85811691821783556040517fa22cb465000000000000000000000000000000000000000000000000000000008152600481019290925260248201929092527f0000000000000000000000000000000000000000000000000000000000000000909116925063a22cb46591506044015f604051808303815f87803b1580156112da575f80fd5b505af11580156112ec573d5f803e3d5ffd5b50505073ffffffffffffffffffffffffffffffffffffffff8083165f90815260056020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600482528083207f00000000000000000000000000000000000000000000000000000000000000009094168352929052207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905550505050565b8261ffff166004036114b4576001546113d5907501000000000000000000000000000000000000000000900463ffffffff16629e3400614a1c565b63ffffffff164210156113e6575f80fd5b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064015f604051808303815f87803b158015611499575f80fd5b505af11580156114ab573d5f803e3d5ffd5b50505050505050565b8261ffff16600503611536575f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b505050565b305f908152600360205260409020546107d07f0000000000000000000000000000000000000000000000000000000000000000048110156115795750565b3330148015906115a1575060015473ffffffffffffffffffffffffffffffffffffffff163314155b80156115c457505f5473ffffffffffffffffffffffffffffffffffffffff163314155b156115fb576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101f47f0000000000000000000000000000000000000000000000000000000000000000048082111561162c578091505b60408051610100810182523080825273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166020840190815261271084860190815260608501938452426080860190815260a086018981525f60c0880181815260e0890191825298517f414bf389000000000000000000000000000000000000000000000000000000008152975186166004890152935185166024880152915162ffffff16604487015293518316606486015292516084850152915160a4840152925160c483015251821660e48201527f00000000000000000000000000000000000000000000000000000000000000009091169063414bf38990610104016020604051808303815f875af115801561175c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153691906149c5565b5f8054328083526007602052604083205473ffffffffffffffffffffffffffffffffffffffff9283169290811691908516148015906117d3575073ffffffffffffffffffffffffffffffffffffffff8116155b80156117f4575073ffffffffffffffffffffffffffffffffffffffff841615155b1561184657325f90815260076020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b325f9081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1661187657508061189d565b50325f9081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff165b60036064349081049182029003907f00000000000000000000000000000000000000000000000000000000000000008385036118e2575f805f806003860289612710f1505b8385141915611905575f805f806002860289612710f1505f805f808588612710f1505b604051630d0e30db81525f8060048387865af150508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167faa63193cea477530e577a5b8c61efd36b21b453c430fdb45e1b7e9fadca44bb78460405161197991815260200190565b60405180910390a361198d8a848a8c613a38565b9a9950505050505050505050565b3330148015906119c3575060015473ffffffffffffffffffffffffffffffffffffffff163314155b8015611a0557503373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614155b8015611a2857505f5473ffffffffffffffffffffffffffffffffffffffff163314155b15611a5f576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aec9190614a40565b6fffffffffffffffffffffffffffffffff1615611bb9576040517f490e6cbc0000000000000000000000000000000000000000000000000000000081523060048201525f60248201819052604482018190526080606483015260848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063490e6cbc9060a4015f604051808303815f87803b158015611ba2575f80fd5b505af1158015611bb4573d5f803e3d5ffd5b505050505b565b5f611bc733848461304f565b5060019392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611c40576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004263ffffffff160217905562017f5c697f0e10af47c1c7000000611ca260c883614a59565b611cad9060c8614acc565b91505f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611d17575f80fd5b505af1158015611d29573d5f803e3d5ffd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001620668a088611dea9190614aeb565b60020b8152602001611dff88620668a0614b2c565b60020b8152602001611e146298968034614a09565b81526020018681526020015f81526020015f81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b8152600401611e679190614b6d565b6080604051808303815f875af1158015611e83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea79190614c58565b600180546040517fa22cb46500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101929092529296509094507f0000000000000000000000000000000000000000000000000000000000000000909116925063a22cb46591506044015f604051808303815f87803b158015611f43575f80fd5b505af1158015611f55573d5f803e3d5ffd5b505050505f8184611f669190614a09565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001620668a0896120249190614aeb565b60020b815260200161203760c88a614aeb565b60020b81526020015f81526020018481526020015f81526020015f81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b81526004016120939190614b6d565b6080604051808303815f875af11580156120af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d39190614c58565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116825230602083019081526127108385019081527f000000000000000000000000000000000000000000000000000000000000000083166060850190815242608086019081526298967f60a087019081525f60c0880181815260e0890191825298517f414bf389000000000000000000000000000000000000000000000000000000008152975187166004890152945186166024880152925162ffffff1660448701529051841660648601525160848501525160a4840152925160c48301529151821660e48201529196507f000000000000000000000000000000000000000000000000000000000000000016935063414bf38992506101040190506020604051808303815f875af115801561222d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225191906149c5565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156122dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230091906149c5565b905080156124035773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000612370600185614a09565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156123dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124019190614c91565b505b5050600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff16905550505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146124a2576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f906124d490790100000000000000000000000000000000000000000000000000900463ffffffff1642614a09565b905061070881111561265e576124e8613f03565b600180547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000004263ffffffff160217905560025469ffffffffffffffffffff165f0361254f5750611bb4565b6002545f9069ffffffffffffffffffff1661256b603c84614cb0565b6125759190614cc3565b62c0ffee5f5260036020527f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23549091508111610d465760036020527f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23805482900390557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff165f8181526040908190208054840190555162c0ffee907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126549085815260200190565b60405180910390a3505b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146126d4576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001547501000000000000000000000000000000000000000000900463ffffffff161561272d576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811784555f90815260056020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116891790915587548616855260048084528286207f000000000000000000000000000000000000000000000000000000000000000088168088529085528387207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908190558a54891688528286528488207f00000000000000000000000000000000000000000000000000000000000000008a168952865284882081905587548c8a169a168a17885598875290845282862090865283528185209690965583548516845291905281208054909316909317909155905461289391309116692a5a058fc295ed000000612eed565b505f80546040517f760a3ce8000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169063760a3ce8906024015f604051808303815f87803b1580156128fc575f80fd5b505af1158015610d46573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff831661295b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166129a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6040805160a0810182528381526fffffffffffffffffffffffffffffffff838116602083019081525f83850181815260608501828152426080870190815296517f0c49ccbe0000000000000000000000000000000000000000000000000000000081529551600487015292519093166024850152915160448401525160648301529151608482015281907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630c49ccbe9060a40160408051808303815f875af1158015612afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b1f9190614cda565b5050612b2a846140d5565b909590945092505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612ba8575073ffffffffffffffffffffffffffffffffffffffff86163014155b15612ca257604080517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081166024830152604480830187905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915191881691612c609190614cfc565b5f604051808303815f865af19150503d805f8114612c99576040519150601f19603f3d011682016040523d82523d5f602084013e612c9e565b606091505b5050505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480612d4757507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b612dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f756e737570706f727465645f70616972000000000000000000000000000000006044820152606401610ba2565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff88811682528781166020830190815262ffffff8881168486019081523060608601908152426080870190815260a087018b815260c088018b81525f60e08a0190815299517f414bf3890000000000000000000000000000000000000000000000000000000081529851881660048a0152955187166024890152925190931660448701525184166064860152905160848501525160a48401525160c48301529151821660e48201527f00000000000000000000000000000000000000000000000000000000000000009091169063414bf38990610104016020604051808303815f875af1158015612ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee391906149c5565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040812080548391908390612f23908490614a09565b909155505073ffffffffffffffffffffffffffffffffffffffff8084165f90815260036020526040812080548501905554858216911614801590612f8157505f5473ffffffffffffffffffffffffffffffffffffffff848116911614155b8015612fd957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611bc7578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161303d91815260200190565b60405180910390a35060019392505050565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146130aa57846130ac565b835b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561315657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561315e5750835b6001547501000000000000000000000000000000000000000000900463ffffffff165f036131b8576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061325d57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061328c575073ffffffffffffffffffffffffffffffffffffffff85165f9081526005602052604090205460ff165b806132bb575073ffffffffffffffffffffffffffffffffffffffff84165f9081526005602052604090205460ff165b156132d3576132cb858585612eed565b915050610da8565b73ffffffffffffffffffffffffffffffffffffffff8116301480159061331357505f5473ffffffffffffffffffffffffffffffffffffffff828116911614155b801561336b57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613392575060015473ffffffffffffffffffffffffffffffffffffffff828116911614155b1561342a5773ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260409020544311156133f8576133ce4360016149b2565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604090205561342a565b6040517fc81ae82a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015474010000000000000000000000000000000000000000900460ff16156134a5576305f5e10083108061346957506a01a784379d99db4200000083115b156134a0576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134b0565b6132cb858585612eed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561355857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156135b057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561367a5773ffffffffffffffffffffffffffffffffffffffff84165f9081526006602052604090205460ff1615613614576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16636ac5eeee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613659575f80fd5b505af192505050801561366a575060015b156134a5576132cb858585612eed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614613725573073ffffffffffffffffffffffffffffffffffffffff16636ac5eeee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613712575f80fd5b505af1925050508015613723575060015b505b73ffffffffffffffffffffffffffffffffffffffff85165f9081526003602052604081208054859290613759908490614a09565b909155505060015460148404907501000000000000000000000000000000000000000000900463ffffffff9081166102580116421015613797576002025b80840393507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461380857305f9081526003602052604090208054820190556139c2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036139c25773ffffffffffffffffffffffffffffffffffffffff8581165f908152600760205260408120549091166138ae577f00000000000000000000000000000000000000000000000000000000000000006138d6565b73ffffffffffffffffffffffffffffffffffffffff8087165f90815260076020526040902054165b73ffffffffffffffffffffffffffffffffffffffff8082165f818152600360209081526040808320805460058a0490810190915583548616845292819020805498849003988901905551878152949550909391928a16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a38173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167faa63193cea477530e577a5b8c61efd36b21b453c430fdb45e1b7e9fadca44bb7836040516139b791815260200190565b60405180910390a350505b5073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a259087815260200190565b60405180910390a3506001949350505050565b600154604080517f53aad1d900000000000000000000000000000000000000000000000000000000815290515f92839273ffffffffffffffffffffffffffffffffffffffff90911691633dc63b739183916353aad1d9916004808201926020929091908290030181865afa158015613ab2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ad69190614d17565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815260029190910b6004820152602401602060405180830381865afa158015613b2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b4f91906149c5565b6001546040517f7a5a542000000000000000000000000000000000000000000000000000000000815260048101889052602481018390529192505f91829173ffffffffffffffffffffffffffffffffffffffff1690637a5a542090604401602060405180830381865afa158015613bc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bec91906149c5565b60408051610100810182527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081168252306020830181905261271083850152606083015242608083015260a0820184905260c082018c90525f60e083015291517f414bf3890000000000000000000000000000000000000000000000000000000081529293507f0000000000000000000000000000000000000000000000000000000000000000919091169163414bf38991613d36916004015f6101008201905073ffffffffffffffffffffffffffffffffffffffff80845116835280602085015116602084015262ffffff60408501511660408401528060608501511660608401526080840151608084015260a084015160a084015260c084015160c08401528060e08501511660e08401525092915050565b6020604051808303815f875af1158015613d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d7691906149c5565b915080870396505f613d8a888489896141e1565b9196509250905082811115613dcb576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87821115613e05576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000828903655af3107a4000811115613e75576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528860048201528160248201525f806044835f875af150505b50670de0b6b3a764000082850310613e9657613e943088848703612eed565b505b60408051878152602081018a90529081018490526060810185905273ffffffffffffffffffffffffffffffffffffffff8816907fd5928c9413a900ce1d8ea824af263af41ba51a2f90976ca72e9a7f2a68786f979060800160405180910390a25050505050949350505050565b7f0000000000000000000000000000000000000000000000000000000000000000303164e8d4a51000811115613f4957604051630d0e30db81525f8060048385875af150505b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9060019073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ffb91906149c5565b0390507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000064e8d4a51000831115611bb4576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528260048201526064604185020460248201525f806044835f895af1507fa9059cbb0000000000000000000000000000000000000000000000000000000081528160048201526064602385020460248201525f806044835f895af1505050505050565b6040805160808101825282815230602082019081526fffffffffffffffffffffffffffffffff8284018181526060840182815294517ffc6f786500000000000000000000000000000000000000000000000000000000815293516004850152915173ffffffffffffffffffffffffffffffffffffffff9081166024850152915181166044840152925190921660648201525f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063fc6f78659060840160408051808303815f875af11580156141b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d79190614cda565b9094909350915050565b5f805f8060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166353aad1d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561424f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142739190614d17565b6001546040517f396a28ba000000000000000000000000000000000000000000000000000000008152600481018990529192505f9173ffffffffffffffffffffffffffffffffffffffff9091169063396a28ba90602401602060405180830381865afa1580156142e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143099190614d17565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff1681526020017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2772860020b85876143e89190614aeb565b60020b126143ff576143fa8587614aeb565b614421565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff277285b60020b8152602001620d88d86144378688614b2c565b60020b1361444e576144498587614b2c565b614453565b620d88d85b60020b81526020018c81526020018b81526020015f81526020015f81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b81526004016144af9190614b6d565b6080604051808303815f875af11580156144cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144ef9190614c58565b929c909b5091995090975050505050505050565b5f5b8381101561451d578181015183820152602001614505565b50505f910152565b602081525f8251806020840152614543816040850160208701614503565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114614596575f80fd5b50565b5f80604083850312156145aa575f80fd5b82356145b581614575565b946020939093013593505050565b5f805f805f60a086880312156145d7575f80fd5b8535945060208601359350604086013592506060860135915060808601356145fe81614575565b809150509295509295909350565b5f8083601f84011261461c575f80fd5b50813567ffffffffffffffff811115614633575f80fd5b6020830191508360208260051b850101111561464d575f80fd5b9250929050565b5f805f8060408587031215614667575f80fd5b843567ffffffffffffffff8082111561467e575f80fd5b61468a8883890161460c565b909650945060208701359150808211156146a2575f80fd5b506146af8782880161460c565b95989497509550505050565b5f805f606084860312156146cd575f80fd5b83356146d881614575565b925060208401356146e881614575565b929592945050506040919091013590565b5f60208284031215614709575f80fd5b8135610da881614575565b5f805f60608486031215614726575f80fd5b833561ffff81168114614737575f80fd5b925060208401359150604084013561474e81614575565b809150509250925092565b5f805f806080858703121561476c575f80fd5b84359350602085013561477e81614575565b925060408501359150606085013561479581614575565b939692955090935050565b5f80604083850312156147b1575f80fd5b82356147bc81614575565b915060208301356147cc81614575565b809150509250929050565b5f805f80606085870312156147ea575f80fd5b8435935060208501359250604085013567ffffffffffffffff8082111561480f575f80fd5b818701915087601f830112614822575f80fd5b813581811115614830575f80fd5b886020828501011115614841575f80fd5b95989497505060200194505050565b5f60208284031215614860575f80fd5b8151610da881614575565b80516fffffffffffffffffffffffffffffffff8116811461488a575f80fd5b919050565b5f805f606084860312156148a1575f80fd5b83516148ac81614575565b60208501519093506148bd81614575565b91506148cb6040850161486b565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821602808216919082811461492d5761492d6148d4565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6fffffffffffffffffffffffffffffffff8084168061498457614984614935565b92169190910492915050565b5f602082840312156149a0575f80fd5b815162ffffff81168114610da8575f80fd5b8082018082111561067b5761067b6148d4565b5f602082840312156149d5575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561067b5761067b6148d4565b63ffffffff818116838216019080821115614a3957614a396148d4565b5092915050565b5f60208284031215614a50575f80fd5b610da88261486b565b5f8160020b8360020b80614a6f57614a6f614935565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000083141615614ac357614ac36148d4565b90059392505050565b5f8260020b8260020b028060020b9150808214614a3957614a396148d4565b600282810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008112627fffff8213171561067b5761067b6148d4565b600281810b9083900b01627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008212171561067b5761067b6148d4565b815173ffffffffffffffffffffffffffffffffffffffff16815261016081016020830151614bb3602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151614bca604084018262ffffff169052565b506060830151614bdf606084018260020b9052565b506080830151614bf4608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151614c478285018273ffffffffffffffffffffffffffffffffffffffff169052565b505061014092830151919092015290565b5f805f8060808587031215614c6b575f80fd5b84519350614c7b6020860161486b565b6040860151606090960151949790965092505050565b5f60208284031215614ca1575f80fd5b81518015158114610da8575f80fd5b5f82614cbe57614cbe614935565b500490565b808202811582820484141761067b5761067b6148d4565b5f8060408385031215614ceb575f80fd5b505080516020909101519092909150565b5f8251614d0d818460208701614503565b9190910192915050565b5f60208284031215614d27575f80fd5b81518060020b8114610da8575f80fdfea2646970667358221220fb8badff437aa9a7dd33288b7e2a376e3b0985736d5275e9fb693176c26504db64736f6c63430008150033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000633347e08e48901b3c2f4200884a1feddac5195600000000000000000000000002d30a0c5790e03016165f851994093656a57aef
Deployed Bytecode
0x608060405260043610610191575f3560e01c80636ac5eeee116100dc578063b44f9efd11610087578063e9cbafb011610062578063e9cbafb0146105b7578063ea7a61c9146105d6578063edd14343146105f5578063f5247e9b14610639575f80fd5b8063b44f9efd146104c1578063c9567bf9146104c9578063dd62ed3e14610566575f80fd5b806395d89b41116100b757806395d89b41146104495780639a2bb3461461048e578063a9059cbb146104a2575f80fd5b80636ac5eeee146103e157806370a08231146103f55780637a3e349514610436575f80fd5b806323b872dd1161013c57806332cb6b0c1161011757806332cb6b0c1461035e578063355274ea1461039057806362995397146103c2575f80fd5b806323b872dd146102e05780632ddeb94d146102ff578063313ce56714610343575f80fd5b806318160ddd1161016c57806318160ddd1461024357806318bd21b9146102755780631e89d545146102bf575f80fd5b806306fdde031461019c578063095ea7b3146101f3578063167d585314610222575f80fd5b3661019857005b5f80fd5b3480156101a7575f80fd5b5060408051808201909152600a81527f436861696e546f6f6c730000000000000000000000000000000000000000000060208201525b6040516101ea9190614525565b60405180910390f35b3480156101fe575f80fd5b5061021261020d366004614599565b61066b565b60405190151581526020016101ea565b6102356102303660046145c3565b610681565b6040519081526020016101ea565b34801561024e575f80fd5b507f00000000000000000000000000000000000000000009195731e2ce35eb000000610235565b348015610280575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b3480156102ca575f80fd5b506102de6102d9366004614654565b610b3c565b005b3480156102eb575f80fd5b506102126102fa3660046146bb565b610d4e565b34801561030a575f80fd5b5061029a6103193660046146f9565b73ffffffffffffffffffffffffffffffffffffffff9081165f908152600760205260409020541690565b34801561034e575f80fd5b50604051601281526020016101ea565b348015610369575f80fd5b507f00000000000000000000000000000000000000000009195731e2ce35eb000000610235565b34801561039b575f80fd5b507f00000000000000000000000000000000000000000009195731e2ce35eb000000610235565b3480156103cd575f80fd5b506102de6103dc366004614714565b610daf565b3480156103ec575f80fd5b506102de61153b565b348015610400575f80fd5b5061023561040f3660046146f9565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b610235610444366004614759565b611780565b348015610454575f80fd5b5060408051808201909152600481527f43544c530000000000000000000000000000000000000000000000000000000060208201526101dd565b348015610499575f80fd5b506102de61199b565b3480156104ad575f80fd5b506102126104bc366004614599565b611bbb565b6102de611bd1565b3480156104d4575f80fd5b50600180547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004263ffffffff169081027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff169190911779010000000000000000000000000000000000000000000000000091909102179055005b348015610571575f80fd5b506102356105803660046147a0565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b3480156105c2575f80fd5b506102de6105d13660046147d7565b612433565b3480156105e1575f80fd5b506102de6105f03660046147a0565b612665565b348015610600575f80fd5b5061021261060f3660046146f9565b73ffffffffffffffffffffffffffffffffffffffff165f9081526005602052604090205460ff1690565b348015610644575f80fd5b507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08561029a565b5f61067733848461290e565b5060015b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690525f90339073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe881690636352211e90602401602060405180830381865afa15801561070e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107329190614850565b73ffffffffffffffffffffffffffffffffffffffff161461077f576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040517feb02c301000000000000000000000000000000000000000000000000000000008152600481018890525f918291829173ffffffffffffffffffffffffffffffffffffffff169063eb02c30190602401606060405180830381865afa1580156107f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610814919061488f565b919450925090505f8061083c8b606461082d3487614901565b6108379190614962565b612a15565b915091505f6109ba7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461089d578661089f565b855b6001546040517fc95e542b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015289811660248301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292169063c95e542b90604401602060405180830381865afa158015610935573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109599190614990565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146109b257866109b4565b855b8f612b35565b90505f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610a1f57610a1a82846149b2565b610a29565b610a2982856149b2565b90505f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290506040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081528260048201525f806024835f865af150506040517f7a3e3495000000000000000000000000000000000000000000000000000000008152600481018d9052336024820152604481018c905273ffffffffffffffffffffffffffffffffffffffff8b1660648201523090637a3e349590849060840160206040518083038185885af1158015610b05573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610b2a91906149c5565b9e9d5050505050505050505050505050565b82818114610bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c656e677468000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000633347e08e48901b3c2f4200884a1feddac519561614610cea576001547501000000000000000000000000000000000000000000900463ffffffff165f03610c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f744f70656e596574000000000000000000000000000000000000000000006044820152606401610ba2565b335f90815260086020526040902054439003610cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f616c7453616e646f0000000000000000000000000000000000000000000000006044820152606401610ba2565b5f5b81811015610d4657610d3d33878784818110610d0a57610d0a6149dc565b9050602002016020810190610d1f91906146f9565b868685818110610d3157610d316149dc565b90506020020135612eed565b50600101610cec565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600460209081526040808320338085529252822054610d969086908390610d91908790614a09565b61290e565b610da185858561304f565b5060019150505b9392505050565b8261ffff16600503610f5a575f5473ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8f9190614850565b73ffffffffffffffffffffffffffffffffffffffff1603610eae575f80fd5b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f05575f80fd5b73ffffffffffffffffffffffffffffffffffffffff165f908152600660205260409020805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790555050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a22221614610fc9576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8261ffff165f0361103257811580610fe15750816001145b610fe9575f80fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff851602179055505050565b8261ffff1660010361108e5768056bc75e2d63100000821115611053575f80fd5b600280547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001669ffffffffffffffffffff8416179055505050565b8261ffff166002036111695773ffffffffffffffffffffffffffffffffffffffff8116301480159061110c57507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611114575f80fd5b73ffffffffffffffffffffffffffffffffffffffff165f908152600560205260409020805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790555050565b8261ffff1660030361139a576001546040517fa22cb46500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201525f60248201527f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe889091169063a22cb465906044015f604051808303815f87803b158015611206575f80fd5b505af1158015611218573d5f803e3d5ffd5b5050600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85811691821783556040517fa22cb465000000000000000000000000000000000000000000000000000000008152600481019290925260248201929092527f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88909116925063a22cb46591506044015f604051808303815f87803b1580156112da575f80fd5b505af11580156112ec573d5f803e3d5ffd5b50505073ffffffffffffffffffffffffffffffffffffffff8083165f90815260056020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600482528083207f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe889094168352929052207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905550505050565b8261ffff166004036114b4576001546113d5907501000000000000000000000000000000000000000000900463ffffffff16629e3400614a1c565b63ffffffff164210156113e6575f80fd5b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a222281166024830152604482018490527f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8816906323b872dd906064015f604051808303815f87803b158015611499575f80fd5b505af11580156114ab573d5f803e3d5ffd5b50505050505050565b8261ffff16600503611536575f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b505050565b305f908152600360205260409020546107d07f00000000000000000000000000000000000000000009195731e2ce35eb000000048110156115795750565b3330148015906115a1575060015473ffffffffffffffffffffffffffffffffffffffff163314155b80156115c457505f5473ffffffffffffffffffffffffffffffffffffffff163314155b156115fb576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101f47f00000000000000000000000000000000000000000009195731e2ce35eb000000048082111561162c578091505b60408051610100810182523080825273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281166020840190815261271084860190815260608501938452426080860190815260a086018981525f60c0880181815260e0890191825298517f414bf389000000000000000000000000000000000000000000000000000000008152975186166004890152935185166024880152915162ffffff16604487015293518316606486015292516084850152915160a4840152925160c483015251821660e48201527f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615649091169063414bf38990610104016020604051808303815f875af115801561175c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153691906149c5565b5f8054328083526007602052604083205473ffffffffffffffffffffffffffffffffffffffff9283169290811691908516148015906117d3575073ffffffffffffffffffffffffffffffffffffffff8116155b80156117f4575073ffffffffffffffffffffffffffffffffffffffff841615155b1561184657325f90815260076020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b325f9081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1661187657508061189d565b50325f9081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff165b60036064349081049182029003907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28385036118e2575f805f806003860289612710f1505b8385141915611905575f805f806002860289612710f1505f805f808588612710f1505b604051630d0e30db81525f8060048387865af150508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167faa63193cea477530e577a5b8c61efd36b21b453c430fdb45e1b7e9fadca44bb78460405161197991815260200190565b60405180910390a361198d8a848a8c613a38565b9a9950505050505050505050565b3330148015906119c3575060015473ffffffffffffffffffffffffffffffffffffffff163314155b8015611a0557503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a22221614155b8015611a2857505f5473ffffffffffffffffffffffffffffffffffffffff163314155b15611a5f576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff16631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aec9190614a40565b6fffffffffffffffffffffffffffffffff1615611bb9576040517f490e6cbc0000000000000000000000000000000000000000000000000000000081523060048201525f60248201819052604482018190526080606483015260848201527f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff169063490e6cbc9060a4015f604051808303815f87803b158015611ba2575f80fd5b505af1158015611bb4573d5f803e3d5ffd5b505050505b565b5f611bc733848461304f565b5060019392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000633347e08e48901b3c2f4200884a1feddac519561614611c40576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004263ffffffff160217905562017f5c697f0e10af47c1c7000000611ca260c883614a59565b611cad9060c8614acc565b91505f807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611d17575f80fd5b505af1158015611d29573d5f803e3d5ffd5b50505050507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001620668a088611dea9190614aeb565b60020b8152602001611dff88620668a0614b2c565b60020b8152602001611e146298968034614a09565b81526020018681526020015f81526020015f81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b8152600401611e679190614b6d565b6080604051808303815f875af1158015611e83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea79190614c58565b600180546040517fa22cb46500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101929092529296509094507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88909116925063a22cb46591506044015f604051808303815f87803b158015611f43575f80fd5b505af1158015611f55573d5f803e3d5ffd5b505050505f8184611f669190614a09565b90507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001620668a0896120249190614aeb565b60020b815260200161203760c88a614aeb565b60020b81526020015f81526020018481526020015f81526020015f81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b81526004016120939190614b6d565b6080604051808303815f875af11580156120af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d39190614c58565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116825230602083019081526127108385019081527f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a222283166060850190815242608086019081526298967f60a087019081525f60c0880181815260e0890191825298517f414bf389000000000000000000000000000000000000000000000000000000008152975187166004890152945186166024880152925162ffffff1660448701529051841660648601525160848501525160a4840152925160c48301529151821660e48201529196507f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156416935063414bf38992506101040190506020604051808303815f875af115801561222d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225191906149c5565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156122dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230091906149c5565b905080156124035773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21663a9059cbb7f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a2222612370600185614a09565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156123dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124019190614c91565b505b5050600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff16905550505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08516146124a2576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f906124d490790100000000000000000000000000000000000000000000000000900463ffffffff1642614a09565b905061070881111561265e576124e8613f03565b600180547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000004263ffffffff160217905560025469ffffffffffffffffffff165f0361254f5750611bb4565b6002545f9069ffffffffffffffffffff1661256b603c84614cb0565b6125759190614cc3565b62c0ffee5f5260036020527f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23549091508111610d465760036020527f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23805482900390557f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff165f8181526040908190208054840190555162c0ffee907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126549085815260200190565b60405180910390a3505b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000633347e08e48901b3c2f4200884a1feddac5195616146126d4576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001547501000000000000000000000000000000000000000000900463ffffffff161561272d576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811784555f90815260056020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116891790915587548616855260048084528286207f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8888168088529085528387207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908190558a54891688528286528488207f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615648a168952865284882081905587548c8a169a168a17885598875290845282862090865283528185209690965583548516845291905281208054909316909317909155905461289391309116692a5a058fc295ed000000612eed565b505f80546040517f760a3ce8000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169063760a3ce8906024015f604051808303815f87803b1580156128fc575f80fd5b505af1158015610d46573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff831661295b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166129a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6040805160a0810182528381526fffffffffffffffffffffffffffffffff838116602083019081525f83850181815260608501828152426080870190815296517f0c49ccbe0000000000000000000000000000000000000000000000000000000081529551600487015292519093166024850152915160448401525160648301529151608482015281907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1690630c49ccbe9060a40160408051808303815f875af1158015612afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b1f9190614cda565b5050612b2a846140d5565b909590945092505050565b5f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612ba8575073ffffffffffffffffffffffffffffffffffffffff86163014155b15612ca257604080517f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff9081166024830152604480830187905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915191881691612c609190614cfc565b5f604051808303815f865af19150503d805f8114612c99576040519150601f19603f3d011682016040523d82523d5f602084013e612c9e565b606091505b5050505b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480612d4757507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b612dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f756e737570706f727465645f70616972000000000000000000000000000000006044820152606401610ba2565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff88811682528781166020830190815262ffffff8881168486019081523060608601908152426080870190815260a087018b815260c088018b81525f60e08a0190815299517f414bf3890000000000000000000000000000000000000000000000000000000081529851881660048a0152955187166024890152925190931660448701525184166064860152905160848501525160a48401525160c48301529151821660e48201527f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615649091169063414bf38990610104016020604051808303815f875af1158015612ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee391906149c5565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040812080548391908390612f23908490614a09565b909155505073ffffffffffffffffffffffffffffffffffffffff8084165f90815260036020526040812080548501905554858216911614801590612f8157505f5473ffffffffffffffffffffffffffffffffffffffff848116911614155b8015612fd957507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611bc7578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161303d91815260200190565b60405180910390a35060019392505050565b5f807f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146130aa57846130ac565b835b90507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561315657507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561315e5750835b6001547501000000000000000000000000000000000000000000900463ffffffff165f036131b8576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061325d57507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061328c575073ffffffffffffffffffffffffffffffffffffffff85165f9081526005602052604090205460ff165b806132bb575073ffffffffffffffffffffffffffffffffffffffff84165f9081526005602052604090205460ff165b156132d3576132cb858585612eed565b915050610da8565b73ffffffffffffffffffffffffffffffffffffffff8116301480159061331357505f5473ffffffffffffffffffffffffffffffffffffffff828116911614155b801561336b57507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613392575060015473ffffffffffffffffffffffffffffffffffffffff828116911614155b1561342a5773ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260409020544311156133f8576133ce4360016149b2565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604090205561342a565b6040517fc81ae82a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015474010000000000000000000000000000000000000000900460ff16156134a5576305f5e10083108061346957506a01a784379d99db4200000083115b156134a0576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134b0565b6132cb858585612eed565b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561355857507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156135b057507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561367a5773ffffffffffffffffffffffffffffffffffffffff84165f9081526006602052604090205460ff1615613614576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16636ac5eeee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613659575f80fd5b505af192505050801561366a575060015b156134a5576132cb858585612eed565b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614613725573073ffffffffffffffffffffffffffffffffffffffff16636ac5eeee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613712575f80fd5b505af1925050508015613723575060015b505b73ffffffffffffffffffffffffffffffffffffffff85165f9081526003602052604081208054859290613759908490614a09565b909155505060015460148404907501000000000000000000000000000000000000000000900463ffffffff9081166102580116421015613797576002025b80840393507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461380857305f9081526003602052604090208054820190556139c2565b7f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036139c25773ffffffffffffffffffffffffffffffffffffffff8581165f908152600760205260408120549091166138ae577f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a22226138d6565b73ffffffffffffffffffffffffffffffffffffffff8087165f90815260076020526040902054165b73ffffffffffffffffffffffffffffffffffffffff8082165f818152600360209081526040808320805460058a0490810190915583548616845292819020805498849003988901905551878152949550909391928a16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a38173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167faa63193cea477530e577a5b8c61efd36b21b453c430fdb45e1b7e9fadca44bb7836040516139b791815260200190565b60405180910390a350505b5073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a259087815260200190565b60405180910390a3506001949350505050565b600154604080517f53aad1d900000000000000000000000000000000000000000000000000000000815290515f92839273ffffffffffffffffffffffffffffffffffffffff90911691633dc63b739183916353aad1d9916004808201926020929091908290030181865afa158015613ab2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ad69190614d17565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815260029190910b6004820152602401602060405180830381865afa158015613b2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b4f91906149c5565b6001546040517f7a5a542000000000000000000000000000000000000000000000000000000000815260048101889052602481018390529192505f91829173ffffffffffffffffffffffffffffffffffffffff1690637a5a542090604401602060405180830381865afa158015613bc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bec91906149c5565b60408051610100810182527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff9081168252306020830181905261271083850152606083015242608083015260a0820184905260c082018c90525f60e083015291517f414bf3890000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564919091169163414bf38991613d36916004015f6101008201905073ffffffffffffffffffffffffffffffffffffffff80845116835280602085015116602084015262ffffff60408501511660408401528060608501511660608401526080840151608084015260a084015160a084015260c084015160c08401528060e08501511660e08401525092915050565b6020604051808303815f875af1158015613d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d7691906149c5565b915080870396505f613d8a888489896141e1565b9196509250905082811115613dcb576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87821115613e05576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2828903655af3107a4000811115613e75576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528860048201528160248201525f806044835f875af150505b50670de0b6b3a764000082850310613e9657613e943088848703612eed565b505b60408051878152602081018a90529081018490526060810185905273ffffffffffffffffffffffffffffffffffffffff8816907fd5928c9413a900ce1d8ea824af263af41ba51a2f90976ca72e9a7f2a68786f979060800160405180910390a25050505050949350505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2303164e8d4a51000811115613f4957604051630d0e30db81525f8060048385875af150505b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9060019073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a0823190602401602060405180830381865afa158015613fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ffb91906149c5565b0390507f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a22227f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08564e8d4a51000831115611bb4576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528260048201526064604185020460248201525f806044835f895af1507fa9059cbb0000000000000000000000000000000000000000000000000000000081528160048201526064602385020460248201525f806044835f895af1505050505050565b6040805160808101825282815230602082019081526fffffffffffffffffffffffffffffffff8284018181526060840182815294517ffc6f786500000000000000000000000000000000000000000000000000000000815293516004850152915173ffffffffffffffffffffffffffffffffffffffff9081166024850152915181166044840152925190921660648201525f9182917f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe889091169063fc6f78659060840160408051808303815f875af11580156141b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d79190614cda565b9094909350915050565b5f805f8060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166353aad1d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561424f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142739190614d17565b6001546040517f396a28ba000000000000000000000000000000000000000000000000000000008152600481018990529192505f9173ffffffffffffffffffffffffffffffffffffffff9091169063396a28ba90602401602060405180830381865afa1580156142e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143099190614d17565b90507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff1681526020017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2772860020b85876143e89190614aeb565b60020b126143ff576143fa8587614aeb565b614421565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff277285b60020b8152602001620d88d86144378688614b2c565b60020b1361444e576144498587614b2c565b614453565b620d88d85b60020b81526020018c81526020018b81526020015f81526020015f81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b81526004016144af9190614b6d565b6080604051808303815f875af11580156144cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144ef9190614c58565b929c909b5091995090975050505050505050565b5f5b8381101561451d578181015183820152602001614505565b50505f910152565b602081525f8251806020840152614543816040850160208701614503565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114614596575f80fd5b50565b5f80604083850312156145aa575f80fd5b82356145b581614575565b946020939093013593505050565b5f805f805f60a086880312156145d7575f80fd5b8535945060208601359350604086013592506060860135915060808601356145fe81614575565b809150509295509295909350565b5f8083601f84011261461c575f80fd5b50813567ffffffffffffffff811115614633575f80fd5b6020830191508360208260051b850101111561464d575f80fd5b9250929050565b5f805f8060408587031215614667575f80fd5b843567ffffffffffffffff8082111561467e575f80fd5b61468a8883890161460c565b909650945060208701359150808211156146a2575f80fd5b506146af8782880161460c565b95989497509550505050565b5f805f606084860312156146cd575f80fd5b83356146d881614575565b925060208401356146e881614575565b929592945050506040919091013590565b5f60208284031215614709575f80fd5b8135610da881614575565b5f805f60608486031215614726575f80fd5b833561ffff81168114614737575f80fd5b925060208401359150604084013561474e81614575565b809150509250925092565b5f805f806080858703121561476c575f80fd5b84359350602085013561477e81614575565b925060408501359150606085013561479581614575565b939692955090935050565b5f80604083850312156147b1575f80fd5b82356147bc81614575565b915060208301356147cc81614575565b809150509250929050565b5f805f80606085870312156147ea575f80fd5b8435935060208501359250604085013567ffffffffffffffff8082111561480f575f80fd5b818701915087601f830112614822575f80fd5b813581811115614830575f80fd5b886020828501011115614841575f80fd5b95989497505060200194505050565b5f60208284031215614860575f80fd5b8151610da881614575565b80516fffffffffffffffffffffffffffffffff8116811461488a575f80fd5b919050565b5f805f606084860312156148a1575f80fd5b83516148ac81614575565b60208501519093506148bd81614575565b91506148cb6040850161486b565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821602808216919082811461492d5761492d6148d4565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6fffffffffffffffffffffffffffffffff8084168061498457614984614935565b92169190910492915050565b5f602082840312156149a0575f80fd5b815162ffffff81168114610da8575f80fd5b8082018082111561067b5761067b6148d4565b5f602082840312156149d5575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561067b5761067b6148d4565b63ffffffff818116838216019080821115614a3957614a396148d4565b5092915050565b5f60208284031215614a50575f80fd5b610da88261486b565b5f8160020b8360020b80614a6f57614a6f614935565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000083141615614ac357614ac36148d4565b90059392505050565b5f8260020b8260020b028060020b9150808214614a3957614a396148d4565b600282810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008112627fffff8213171561067b5761067b6148d4565b600281810b9083900b01627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008212171561067b5761067b6148d4565b815173ffffffffffffffffffffffffffffffffffffffff16815261016081016020830151614bb3602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151614bca604084018262ffffff169052565b506060830151614bdf606084018260020b9052565b506080830151614bf4608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151614c478285018273ffffffffffffffffffffffffffffffffffffffff169052565b505061014092830151919092015290565b5f805f8060808587031215614c6b575f80fd5b84519350614c7b6020860161486b565b6040860151606090960151949790965092505050565b5f60208284031215614ca1575f80fd5b81518015158114610da8575f80fd5b5f82614cbe57614cbe614935565b500490565b808202811582820484141761067b5761067b6148d4565b5f8060408385031215614ceb575f80fd5b505080516020909101519092909150565b5f8251614d0d818460208701614503565b9190910192915050565b5f60208284031215614d27575f80fd5b81518060020b8114610da8575f80fdfea2646970667358221220fb8badff437aa9a7dd33288b7e2a376e3b0985736d5275e9fb693176c26504db64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000633347e08e48901b3c2f4200884a1feddac5195600000000000000000000000002d30a0c5790e03016165f851994093656a57aef
-----Decoded View---------------
Arg [0] : _apest (address): 0x633347e08E48901B3C2f4200884a1fEddAc51956
Arg [1] : _tickMaths (address): 0x02d30A0c5790e03016165f851994093656a57aEF
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000633347e08e48901b3c2f4200884a1feddac51956
Arg [1] : 00000000000000000000000002d30a0c5790e03016165f851994093656a57aef
Deployed Bytecode Sourcemap
14461:28458:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21859:107;;;;;;;;;;-1:-1:-1;21939:19:0;;;;;;;;;;;;;;;;;21859:107;;;;;;;:::i;:::-;;;;;;;;22906:210;;;;;;;;;;-1:-1:-1;22906:210:0;;;;;:::i;:::-;;:::i;:::-;;;1373:14:1;;1366:22;1348:41;;1336:2;1321:18;22906:210:0;1208:187:1;33977:1302:0;;;;;;:::i;:::-;;:::i;:::-;;;2072:25:1;;;2060:2;2045:18;33977:1302:0;1926:177:1;22186:108:0;;;;;;;;;;-1:-1:-1;22274:12:0;22186:108;;42517:110;;;;;;;;;;-1:-1:-1;42567:10:0;42605:13;;;42517:110;;;2416:42:1;2404:55;;;2386:74;;2374:2;2359:18;42517:110:0;2240:226:1;24296:544:0;;;;;;;;;;-1:-1:-1;24296:544:0;;;;;:::i;:::-;;:::i;:::-;;23124:317;;;;;;;;;;-1:-1:-1;23124:317:0;;;;;:::i;:::-;;:::i;42404:105::-;;;;;;;;;;-1:-1:-1;42404:105:0;;;;;:::i;:::-;42488:13;;;;42461:7;42488:13;;;:8;:13;;;;;;;;42404:105;22085:93;;;;;;;;;;-1:-1:-1;22085:93:0;;22168:2;4476:36:1;;4464:2;4449:18;22085:93:0;4334:184:1;42635:91:0;;;;;;;;;;-1:-1:-1;42707:11:0;42635:91;;42734:77;;;;;;;;;;-1:-1:-1;42799:4:0;42734:77;;40340:1921;;;;;;;;;;-1:-1:-1;40340:1921:0;;;;;:::i;:::-;;:::i;27925:1087::-;;;;;;;;;;;;;:::i;22302:177::-;;;;;;;;;;-1:-1:-1;22302:177:0;;;;;:::i;:::-;22453:18;;22421:7;22453:18;;;:9;:18;;;;;;;22302:177;38686:1620;;;;;;:::i;:::-;;:::i;21974:103::-;;;;;;;;;;-1:-1:-1;22056:13:0;;;;;;;;;;;;;;;;;21974:103;;30537:408;;;;;;;;;;;;;:::i;22487:202::-;;;;;;;;;;-1:-1:-1;22487:202:0;;;;;:::i;:::-;;:::i;19533:2171::-;;;:::i;21712:139::-;;;;;;;;;;-1:-1:-1;21755:10:0;:36;;21802:41;;21755:36;21775:15;21755:36;;;;;21802:41;;;;;;;;;;;;;;24296:544;22697:201;;;;;;;;;;-1:-1:-1;22697:201:0;;;;;:::i;:::-;22863:18;;;;22831:7;22863:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22697:201;30953:1073;;;;;;;;;;-1:-1:-1;30953:1073:0;;;;;:::i;:::-;;:::i;18577:911::-;;;;;;;;;;-1:-1:-1;18577:911:0;;;;;:::i;:::-;;:::i;42284:112::-;;;;;;;;;;-1:-1:-1;42284:112:0;;;;;:::i;:::-;42370:18;;42346:4;42370:18;;;:13;:18;;;;;;;;;42284:112;42819:97;;;;;;;;;;-1:-1:-1;42895:13:0;42819:97;;22906:210;23025:4;23047:39;4708:10;23070:7;23079:6;23047:8;:39::i;:::-;-1:-1:-1;23104:4:0;22906:210;;;;;:::o;33977:1302::-;34193:32;;;;;;;;2072:25:1;;;34158:18:0;;34229:10;;34193:46;:15;:23;;;;2045:18:1;;34193:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;34189:65;;34248:6;;;;;;;;;;;;;;34189:65;34319:11;;:46;;;;;;;;2072:25:1;;;34266:14:0;;;;;;34319:11;;;:37;;2045:18:1;;34319:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34265:100;;-1:-1:-1;34265:100:0;-1:-1:-1;34265:100:0;-1:-1:-1;34377:10:0;;34403:103;34435:7;34492:3;34458:30;34478:9;34265:100;34458:30;:::i;:::-;34457:38;;;;:::i;:::-;34403:17;:103::i;:::-;34376:130;;;;34519:14;34536:198;34568:4;34558:14;;:6;:14;;;:32;;34584:6;34558:32;;;34575:6;34558:32;34624:11;;:39;;;;;:11;8723:15:1;;;34624:39:0;;;8705:34:1;8775:15;;;8755:18;;;8748:43;34605:4:0;;34624:11;;:23;;8617:18:1;;34624:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34688:4;34678:14;;:6;:14;;;:24;;34700:2;34678:24;;;34695:2;34678:24;34717:6;34536:7;:198::i;:::-;34519:215;;34747:17;34777:4;34767:14;;:6;:14;;;:42;;34798:11;34803:6;34798:2;:11;:::i;:::-;34767:42;;;34784:11;34789:6;34784:2;:11;:::i;:::-;34747:62;;34820:13;34836:4;34820:20;;34897:4;34891:11;34968:66;34941:8;34916:133;35091:9;35084:4;35074:8;35070:19;35063:38;35160:1;35157;35151:4;35141:8;35138:1;35131:5;35124;35119:43;-1:-1:-1;;35206:65:0;;;;;;;;9446:25:1;;;35249:10:0;9548:18:1;;;9541:43;9600:18;;;9593:34;;;35206:15:0;9663::1;;9643:18;;;9636:43;35206:4:0;;:15;;35229:9;;9418:19:1;;35206:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35186:85;33977:1302;-1:-1:-1;;;;;;;;;;;;;;33977:1302:0:o;24296:544::-;24419:2;24447:22;;;24439:41;;;;;;;10081:2:1;24439:41:0;;;10063:21:1;10120:1;10100:18;;;10093:29;10158:8;10138:18;;;10131:36;10184:18;;24439:41:0;;;;;;;;;24495:10;:19;24509:5;24495:19;;24491:166;;24539:10;;;;;;;24553:1;24539:15;24531:38;;;;;;;10415:2:1;24531:38:0;;;10397:21:1;10454:2;10434:18;;;10427:30;10493:12;10473:18;;;10466:40;10523:18;;24531:38:0;10213:334:1;24531:38:0;24605:10;24592:24;;;;:12;:24;;;;;;24620:12;24592:40;;24584:61;;;;;;;10754:2:1;24584:61:0;;;10736:21:1;10793:1;10773:18;;;10766:29;10831:10;10811:18;;;10804:38;10859:18;;24584:61:0;10552:331:1;24584:61:0;24672:9;24667:166;24687:4;24683:1;:8;24667:166;;;24739:45;24754:10;24766:2;;24769:1;24766:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24773:7;;24781:1;24773:10;;;;;;;:::i;:::-;;;;;;;24739:14;:45::i;:::-;-1:-1:-1;24803:3:0;;24667:166;;;;24393:447;24296:544;;;;:::o;23124:317::-;23337:17;;;23255:4;23337:17;;;:11;:17;;;;;;;;4708:10;23337:26;;;;;;;;23313:60;;23337:17;;4708:10;;23337:35;;23366:6;;23337:35;:::i;:::-;23313:8;:60::i;:::-;23384:27;23394:4;23400:2;23404:6;23384:9;:27::i;:::-;;23429:4;23422:11;;;23124:317;;;;;;:::o;40340:1921::-;40460:4;:9;;40468:1;40460:9;40456:1798;;40559:13;;;;40537:10;:36;40533:55;;40582:6;;;;;;;;;;;;;;40533:55;40644:1;40611:35;;40619:3;40611:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;40603:44;;;;;;40712:13;40705:20;;:3;:20;;;40697:29;;;;;;40757:12;;;;;;:7;:12;;;;;;;;;;40756:13;40741:28;;;;;;;-1:-1:-1;;40340:1921:0:o;40456:1798::-;40806:10;:22;40820:8;40806:22;;40802:41;;40837:6;;;;;;;;;;;;;;40802:41;40864:4;:9;;40872:1;40864:9;40860:1383;;40959:11;;;:26;;;40974:6;40984:1;40974:11;40959:26;40951:35;;;;;;41005:12;:28;;;;;;;;;;;;40340:1921;;;:::o;40860:1383::-;41059:4;:9;;41067:1;41059:9;41055:1188;;41147:6;41137;:16;;41129:25;;;;;;41173:12;:29;;;;;;;;;;40340:1921;;;:::o;41055:1188::-;41228:4;:9;;41236:1;41228:9;41224:1019;;41302:20;;;41317:4;41302:20;;;;:44;;;41333:13;41326:20;;:3;:20;;;;41302:44;41294:53;;;;;;41388:18;;;;;;:13;:18;;;;;;;;;;41387:19;41366:40;;;;;;;-1:-1:-1;;40340:1921:0:o;41224:1019::-;41432:4;:9;;41440:1;41432:9;41428:815;;41554:11;;41512:62;;;;;:33;41554:11;;;41512:62;;;11378:74:1;41554:11:0;11468:18:1;;;11461:50;41512:15:0;:33;;;;;;11351:18:1;;41512:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41593:11:0;:29;;;;;;;;;;;;;41641:53;;;;;;;;11378:74:1;;;;11468:18;;;11461:50;;;;41641:15:0;:33;;;;-1:-1:-1;41641:33:0;;-1:-1:-1;11351:18:1;;41641:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41713:18:0;;;;;;;;:13;:18;;;;;;;;:25;;;;41734:4;41713:25;;;41757:11;:16;;;;;41782:15;41757:42;;;;;;;;;41802:17;41757:62;;-1:-1:-1;40340:1921:0;;;:::o;41428:815::-;41845:4;:9;;41853:1;41845:9;41841:402;;41931:10;;:30;;:10;;;;;41945:15;41931:30;:::i;:::-;41912:49;;:15;:49;;41904:58;;;;;;41981:61;;;;;42018:4;41981:61;;;11962:34:1;41981:28:0;42025:8;12032:15:1;;12012:18;;;12005:43;12064:18;;;12057:34;;;41981:15:0;:28;;;;11874:18:1;;41981:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40340:1921;;;:::o;41841:402::-;42068:4;:9;;42076:1;42068:9;42064:179;;42150:13;:33;;;;;;;;;;;;42202:18;;:13;:18;;;;;:25;;;;-1:-1:-1;42202:25:0;;;42064:179;40340:1921;;;:::o;27925:1087::-;28027:4;27988:18;28009:24;;;:9;:24;;;;;;28080:4;28065:12;:19;28052:10;:32;28048:79;;;28105:7;27925:1087::o;28048:79::-;28165:10;28187:4;28165:27;;;;:82;;-1:-1:-1;28235:11:0;;;;28213:10;:34;;28165:82;:139;;;;-1:-1:-1;28290:13:0;;;;28268:10;:36;;28165:139;28143:190;;;28327:6;;;;;;;;;;;;;;28143:190;28415:3;28400:12;:18;28439:20;;;28435:81;;;28493:7;28480:20;;28435:81;28587:391;;;;;;;;28660:4;28587:391;;;28532:36;28698:4;28587:391;;;;;;;;28730:5;28587:391;;;;;;;;;;;;28815:15;28587:391;;;;;;;;;;;;-1:-1:-1;28587:391:0;;;;;;;;;;;;28532:461;;;;;12507:13:1;;12503:22;;28532:461:0;;;12485:41:1;12568:24;;12564:33;;12542:20;;;12535:63;12640:24;;12666:8;12636:39;12614:20;;;12607:69;12718:24;;12714:33;;12692:20;;;12685:63;12786:24;;12764:20;;;12757:54;12849:24;;12827:20;;;12820:54;12912:24;;12890:20;;;12883:54;12979:24;12975:33;;12953:20;;;12946:63;28542:8:0;28532:36;;;;;;12396:19:1;;28532:461:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38686:1620::-;38832:15;38881:13;;38932:9;38923:19;;;:8;:19;;;;;;38881:13;;;;;38923:19;;;;39018:18;;;;;;;:59;;-1:-1:-1;39057:20:0;;;;39018:59;:99;;;;-1:-1:-1;39098:19:0;;;;;39018:99;38996:199;;;39161:9;39152:19;;;;:8;:19;;;;;:27;;;;:19;:27;;;;;38996:199;39222:9;39244:1;39213:19;;;:8;:19;;;;;;:33;:19;39209:154;;-1:-1:-1;39276:2:0;39209:154;;;-1:-1:-1;39337:9:0;39328:19;;;;:8;:19;;;;;;;;39209:154;39537:1;39487:3;39430:9;39476:14;;;39523:15;;;39510:29;;;39584:4;39634:14;;;39631:114;;39723:1;39720;39717;39713:2;39709:1;39696:11;39692:19;39688:2;39681:5;39676:49;39672:54;39631:114;39779:6;39775:2;39772:14;39768:19;39765:191;;;39862:1;39859;39856;39852:2;39848:1;39835:11;39831:19;39827:2;39820:5;39815:49;39811:54;39934:1;39931;39928;39924:2;39911:11;39903:6;39896:5;39891:45;39887:50;39765:191;39998:4;39992:11;40066:9;40056:8;40049:27;40149:1;40146;40141:3;40131:8;40121;40110:9;40103:5;40098:53;40094:58;;40205:6;40188:37;;40201:2;40188:37;;;40213:11;40188:37;;;;2072:25:1;;2060:2;2045:18;;1926:177;40188:37:0;;;;;;;;40247:40;40260:6;40268:8;40278:4;40284:2;40247:12;:40::i;:::-;40240:47;38686:1620;-1:-1:-1;;;;;;;;;;38686:1620:0:o;30537:408::-;30598:10;30620:4;30598:27;;;;:78;;-1:-1:-1;30664:11:0;;;;30642:10;:34;;30598:78;:126;;;;-1:-1:-1;30693:10:0;:31;30715:8;30693:31;;;30598:126;:179;;;;-1:-1:-1;30763:13:0;;;;30741:10;:36;;30598:179;30580:222;;;30796:6;;;;;;;;;;;;;;30580:222;30825:13;30817:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;30813:125;;30873:53;;;;;30910:4;30873:53;;;13516:74:1;30917:1:0;13606:18:1;;;13599:34;;;13649:18;;;13642:34;;;13712:3;13692:18;;;13685:31;13732:19;;;13725:30;30881:13:0;30873:28;;;;;13772:19:1;;30873:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30813:125;30537:408::o;22487:202::-;22602:4;22624:35;4708:10;22648:2;22652:6;22624:9;:35::i;:::-;-1:-1:-1;22677:4:0;;22487:202;-1:-1:-1;;;22487:202:0:o;19533:2171::-;19588:10;:19;19602:5;19588:19;;19584:38;;19616:6;;;;;;;;;;;;;;19584:38;19633:10;:36;;;;;19653:15;19633:36;;;;;;19695:5;19727:10;19756;19763:3;19695:5;19756:10;:::i;:::-;19755:18;;19770:3;19755:18;:::i;:::-;19748:25;;19784:10;19805;19832:4;19826:19;;;19853:9;19826:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19891:15;:20;;;19926:482;;;;;;;;19992:4;19926:482;;;;;;20031:4;19926:482;;;;;;20060:5;19926:482;;;;;;20102:6;20095:4;:13;;;;:::i;:::-;19926:482;;;;;;20138:13;:4;20145:6;20138:13;:::i;:::-;19926:482;;;;;;20186:15;20198:3;20186:9;:15;:::i;:::-;19926:482;;;;20236:5;19926:482;;;;20272:1;19926:482;;;;20304:1;19926:482;;;;20343:4;19926:482;;;;;;20377:15;19926:482;;;19891:528;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20474:11;;;20432:61;;;;;:33;20474:11;;;20432:61;;;11378:74:1;11468:18;;;11461:50;;;;19876:543:0;;-1:-1:-1;19876:543:0;;-1:-1:-1;20432:15:0;:33;;;;-1:-1:-1;20432:33:0;;-1:-1:-1;11351:18:1;;20432:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20506:17;20534:2;20526:5;:10;;;;:::i;:::-;20506:30;;20562:15;:20;;;20597:469;;;;;;;;20663:4;20597:469;;;;;;20702:4;20597:469;;;;;;20731:5;20597:469;;;;;;20773:6;20766:4;:13;;;;:::i;:::-;20597:469;;;;;;20809:10;20816:3;20809:4;:10;:::i;:::-;20597:469;;;;;;20854:1;20597:469;;;;20890:9;20597:469;;;;20930:1;20597:469;;;;20962:1;20597:469;;;;21001:4;20597:469;;;;;;21035:15;20597:469;;;20562:515;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21141:347;;;;;;;;21090:36;21202:4;21141:347;;;;21243:4;21141:347;;;;;;21272:5;21141:347;;;;;;21307:8;21141:347;;;;;;;;21344:15;21141:347;;;;;;21388:7;21141:347;;;;;;-1:-1:-1;21141:347:0;;;;;;;;;;;;21090:409;;;;;12507:13:1;;12503:22;;21090:409:0;;;12485:41:1;12568:24;;12564:33;;12542:20;;;12535:63;12640:24;;12666:8;12636:39;12614:20;;;12607:69;12718:24;;12714:33;;12692:20;;;12685:63;12786:24;12764:20;;;12757:54;12849:24;12827:20;;;12820:54;12912:24;;12890:20;;;12883:54;12979:24;;12975:33;;12953:20;;;12946:63;20549:528:0;;-1:-1:-1;21100:8:0;21090:36;;-1:-1:-1;21090:36:0;;-1:-1:-1;12396:19:1;;;-1:-1:-1;21090:409:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;21531:37:0;;;;;21562:4;21531:37;;;2386:74:1;21512:16:0;;21538:4;21531:22;;;;;2359:18:1;;21531:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21512:56;-1:-1:-1;21585:13:0;;21581:91;;21615:21;21622:4;21615:21;;21637:8;21647:12;21658:1;21647:8;:12;:::i;:::-;21615:45;;;;;;;;;;16860:42:1;16848:55;;;21615:45:0;;;16830:74:1;16920:18;;;16913:34;16803:18;;21615:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21581:91;-1:-1:-1;;21682:10:0;:14;;;;;;-1:-1:-1;;;;19533:2171:0:o;30953:1073::-;31077:10;:27;31091:13;31077:27;;31073:46;;31113:6;;;;;;;;;;;;;;31073:46;31172:15;;31130:21;;31154:33;;31172:15;;;;;31154;:33;:::i;:::-;31130:57;;31218:10;31202:13;:26;31198:821;;;31245:15;:13;:15::i;:::-;31275;:41;;;;;31300:15;31275:41;;;;;;31337:12;;;;-1:-1:-1;31337:17:0;31333:30;;31356:7;;;31333:30;31420:12;;31379:15;;31420:12;;31398:18;31414:2;31398:13;:18;:::i;:::-;31397:35;;;;:::i;:::-;31479:42;31469:53;;:9;:53;;;;31379;;-1:-1:-1;31469:64:0;-1:-1:-1;31447:561:0;;31601:9;:101;;;:112;;;;;;;31746:13;31601:101;31736:24;31601:101;31736:24;;;31601:101;31736:24;;;;:35;;;;;;31799:174;31637:42;;31799:174;;;;31706:7;2072:25:1;;2060:2;2045:18;;1926:177;31799:174:0;;;;;;;;31230:789;31198:821;31062:964;30953:1073;;;;:::o;18577:911::-;18664:10;:19;18678:5;18664:19;;18660:38;;18692:6;;;;;;;;;;;;;;18660:38;18713:10;;;;;;;:15;18709:36;;18737:8;;;;;;;;;;;;;;18709:36;18780:11;:36;;;;;;;;;;;;;;:11;18827:35;;;:13;:35;;;;;;;;:42;;;;;;;;;;;18900:11;;;;18880:33;;:11;:33;;;;;;18922:15;18880:59;;;;;;;;;;;18942:41;18880:103;;;;19014:11;;;;18994:33;;;;;;;;19036:8;18994:52;;;;;;;;;:86;;;19118:51;;;;;;;;;;;19182:35;;;;;;;;;:61;;;;;;;;:105;;;;19322:13;;;;19300:37;;;;;;;:44;;;;;;;;;;;19393:13;;19355:65;;19378:4;;19393:13;19409:10;19355:14;:65::i;:::-;-1:-1:-1;19433:13:0;;;:47;;;;;;;;2386:74:1;;;;19433:13:0;;;:35;;2359:18:1;;19433:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23954:334;24086:19;;;24082:45;;24114:13;;;;;;;;;;;;;;24082:45;24142:21;;;24138:47;;24172:13;;;;;;;;;;;;;;24138:47;24196:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24248:32;;2072:25:1;;;24248:32:0;;2045:18:1;24248:32:0;;;;;;;23954:334;;;:::o;32462:504::-;32649:250;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32649:250:0;;;;;;;;;;;;32868:15;32649:250;;;;;;32601:309;;;;;17783:13:1;;32601:309:0;;;17765:32:1;17839:24;;17835:65;;;17813:20;;;17806:95;17939:24;;17917:20;;;17910:54;18002:24;17980:20;;;17973:54;18065:24;;18043:20;;;18036:54;-1:-1:-1;;32601:15:0;:33;;;;;17737:19:1;;32601:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32932:26;32950:7;32932:17;:26::i;:::-;32921:37;;;;-1:-1:-1;32462:504:0;-1:-1:-1;;;32462:504:0:o;32974:995::-;33146:11;33185:4;33174:15;;:7;:15;;;;:43;;;;-1:-1:-1;33193:24:0;;;33212:4;33193:24;;33174:43;33170:280;;;33265:158;;;33364:8;33234:12;16848:55:1;;;33265:158:0;;;16830:74:1;16920:18;;;;16913:34;;;33265:158:0;;;;;;;;;;16803:18:1;;;;33265:158:0;;;;;;;;;33310:23;33265:158;;;33234:204;;:12;;;;:204;;33265:158;33234:204;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33170:280;33479:4;33468:15;;:7;:15;;;:35;;;;33499:4;33487:16;;:8;:16;;;33468:35;33460:64;;;;;;;18845:2:1;33460:64:0;;;18827:21:1;18884:2;18864:18;;;18857:30;18923:18;18903;;;18896:46;18959:18;;33460:64:0;18643:340:1;33460:64:0;33592:358;;;;;;;;33541:36;33592:358;;;;;;;;;;;;;;;;;;;;;;;;33766:4;33592:358;;;;;;33800:15;33592:358;;;;;;;;;;;;;;;;;;-1:-1:-1;33592:358:0;;;;;;33541:420;;;;;12507:13:1;;12503:22;;33541:420:0;;;12485:41:1;12568:24;;12564:33;;12542:20;;;12535:63;12640:24;;12636:39;;;12614:20;;;12607:69;12718:24;12714:33;;12692:20;;;12685:63;12786:24;;12764:20;;;12757:54;12849:24;12827:20;;;12820:54;12912:24;12890:20;;;12883:54;12979:24;;12975:33;;12953:20;;;12946:63;33551:8:0;33541:36;;;;;;12396:19:1;;33541:420:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33535:426;32974:995;-1:-1:-1;;;;;;32974:995:0:o;23449:497::-;23593:17;;;23576:4;23593:17;;;:9;:17;;;;;:27;;23614:6;;23593:17;23576:4;;23593:27;;23614:6;;23593:27;:::i;:::-;;;;-1:-1:-1;;23656:20:0;;;;;;;;:9;:20;;;;;:30;;;;;;23744:13;23726:32;;;23744:13;;23726:32;;;;:84;;-1:-1:-1;23796:13:0;;;23775:35;;;23796:13;;23775:35;;23726:84;:138;;;;;23848:15;23827:37;;:9;:37;;;;23726:138;23708:208;;;23898:9;23881:35;;23890:6;23881:35;;;23909:6;23881:35;;;;2072:25:1;;2060:2;2045:18;;1926:177;23881:35:0;;;;;;;;-1:-1:-1;23934:4:0;23449:497;;;;;:::o;24848:3069::-;24970:4;25015:14;25042:13;25032:23;;:6;:23;;;:44;;25070:6;25032:44;;;25058:9;25032:44;25015:61;;25101:13;25091:23;;:6;:23;;;;:53;;;;;25131:13;25118:26;;:9;:26;;;;25091:53;25087:87;;;-1:-1:-1;25168:6:0;25087:87;25191:10;;;;;;;25205:1;25191:15;25187:63;;25230:8;;;;;;;;;;;;;;25187:63;25293:13;25280:26;;:9;:26;;;:80;;;;25344:15;25323:37;;:9;:37;;;25280:80;:118;;;-1:-1:-1;25377:21:0;;;;;;;:13;:21;;;;;;;;25280:118;:159;;;-1:-1:-1;25415:24:0;;;;;;;:13;:24;;;;;;;;25280:159;25262:264;;;25473:41;25488:6;25496:9;25507:6;25473:14;:41::i;:::-;25466:48;;;;;25262:264;25556:23;;;25574:4;25556:23;;;;:72;;-1:-1:-1;25614:13:0;;;25596:32;;;25614:13;;25596:32;;25556:72;:123;;;;;25663:15;25645:34;;:6;:34;;;;25556:123;:170;;;;-1:-1:-1;25714:11:0;;;25696:30;;;25714:11;;25696:30;;25556:170;25538:449;;;25810:20;;;;;;;:12;:20;;;;;;25833:12;-1:-1:-1;25806:170:0;;;25889:16;:12;25904:1;25889:16;:::i;:::-;25866:20;;;;;;;:12;:20;;;;;:39;25806:170;;;25953:7;;;;;;;;;;;;;;25806:170;26003:12;;;;;;;:17;25999:189;;26050:3;26041:6;:12;:37;;;;26066:12;26057:6;:21;26041:37;26037:58;;;26087:8;;;;;;;;;;;;;;26037:58;25999:189;;;26135:41;26150:6;26158:9;26169:6;26135:14;:41::i;25999:189::-;26255:13;26245:23;;:6;:23;;;;:74;;;;;26303:15;26285:34;;:6;:34;;;;26245:74;:117;;;;;26349:13;26336:26;;:9;:26;;;;26245:117;26227:319;;;26393:18;;;;;;;:7;:18;;;;;;;;26389:37;;;26420:6;;;;;;;;;;;;;;26389:37;26445:4;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26441:31;;;26493:41;26508:6;26516:9;26527:6;26493:14;:41::i;26227:319::-;26597:13;26587:23;;:6;:23;;;26583:94;;26635:4;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26631:31;;26700:17;;;;;;;:9;:17;;;;;:27;;26721:6;;26700:17;:27;;26721:6;;26700:27;:::i;:::-;;;;-1:-1:-1;;26929:10:0;;26829:2;26820:11;;;26929:10;;;;;;;26942;26929:23;26911:41;:15;:41;26848:214;;;27045:1;27037:9;26848:214;27088:4;27078:14;;;;27197:15;27179:34;;:6;:34;;;27175:604;;27252:4;27234:24;;;;:9;:24;;;;;:32;;;;;;27175:604;;;27310:15;27292:34;;:6;:34;;;27288:491;;27361:33;:19;;;27347:11;27361:19;;;:8;:19;;;;;;27347:11;;27361:19;:108;;27461:8;27361:108;;;27418:19;;;;;;;;:8;:19;;;;;;;27361:108;27531:14;;;;27488:13;27531:14;;;:9;:14;;;;;;;;:23;;27511:1;27504:8;;27531:23;;;;;;27625:13;;;;27607:33;;;;;;:41;;27573:13;;;;27607:41;;;;;27674:30;2072:25:1;;;27347:122:0;;-1:-1:-1;27504:8:0;;27531:14;;27674:30;;;;;2045:18:1;27674:30:0;;;;;;;27752:3;27728:35;;27741:9;27728:35;;;27757:5;27728:35;;;;2072:25:1;;2060:2;2045:18;;1926:177;27728:35:0;;;;;;;;27328:451;;27288:491;-1:-1:-1;27795:20:0;;;;;;;;:9;:20;;;;;;;:30;;;;;;27852:35;27795:20;;27852:35;;;;;;;27819:6;2072:25:1;;2060:2;2045:18;;1926:177;27852:35:0;;;;;;;;-1:-1:-1;27905:4:0;;24848:3069;-1:-1:-1;;;;24848:3069:0:o;36482:2196::-;36707:11;;36759:28;;;;;;;;36625:15;;;;36707:11;;;;;:33;;:11;;36759:26;;:28;;;;;;;;;;;;;;;36707:11;36759:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36707:95;;;;;;;;;;19441:1:1;19430:21;;;;36707:95:0;;;19412:40:1;19385:18;;36707:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36876:11;;:103;;;;;;;;19637:25:1;;;19678:18;;;19671:34;;;36678:124:0;;-1:-1:-1;36819:17:0;;;;36876:11;;;:24;;19610:18:1;;36876:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37061:398;;;;;;;;37126:4;37006:36;37061:398;;;;;37171:4;37061:398;;;;;;37204:5;37061:398;;;;;;;;37289:15;37061:398;;;;;;;;;;;;;;;;-1:-1:-1;37061:398:0;;;;37006:468;;;;;36853:126;;-1:-1:-1;37016:8:0;37006:36;;;;;;;:468;;;;12369:4:1;12411:3;12400:9;12396:19;12388:27;;12434:42;12522:2;12513:6;12507:13;12503:22;12492:9;12485:41;12594:2;12586:4;12578:6;12574:17;12568:24;12564:33;12557:4;12546:9;12542:20;12535:63;12666:8;12658:4;12650:6;12646:17;12640:24;12636:39;12629:4;12618:9;12614:20;12607:69;12744:2;12736:4;12728:6;12724:17;12718:24;12714:33;12707:4;12696:9;12692:20;12685:63;12804:4;12796:6;12792:17;12786:24;12779:4;12768:9;12764:20;12757:54;12867:4;12859:6;12855:17;12849:24;12842:4;12831:9;12827:20;12820:54;12930:4;12922:6;12918:17;12912:24;12905:4;12894:9;12890:20;12883:54;13005:2;12997:4;12989:6;12985:17;12979:24;12975:33;12968:4;12957:9;12953:20;12946:63;;12199:816;;;;;37006:468:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36994:480;;37501:12;37489:24;;;;37528:13;37589:127;37621:8;37648:9;37676:4;37699:2;37589:13;:127::i;:::-;37556:160;;-1:-1:-1;37556:160:0;-1:-1:-1;37556:160:0;-1:-1:-1;37737:17:0;;;37733:38;;;37763:8;;;;;;;;;;;;;;37733:38;37805:8;37790:12;:23;37786:44;;;37822:8;;;;;;;;;;;;;;37786:44;37867:4;37935:27;;;38001:15;37983:34;;37980:477;;;38063:4;38057:11;38158:66;38123:8;38090:157;38297:2;38290:4;38280:8;38276:19;38269:31;38350:13;38343:4;38333:8;38329:19;38322:42;38435:1;38432;38426:4;38416:8;38413:1;38402:9;38395:5;38390:47;38386:52;;37980:477;;38513:4;38504:5;38492:9;:17;:25;38488:100;;38536:52;38559:4;38566:2;38582:5;38570:9;:17;38536:14;:52::i;:::-;;38488:100;38610:49;;;19947:25:1;;;20003:2;19988:18;;19981:34;;;20031:18;;;20024:34;;;20089:2;20074:18;;20067:34;;;38610:49:0;;;;;;19934:3:1;19919:19;38610:49:0;;;;;;;36653:2018;;;;;36482:2196;;;;;;:::o;29020:1509::-;29110:4;29176:9;29168:18;29215:13;29207:22;;29204:219;;;29275:4;29269:11;29319:9;29309:8;29302:27;29401:1;29398;29393:3;29383:8;29378:3;29367:9;29360:5;29355:48;29351:53;;29204:219;-1:-1:-1;29466:37:0;;;;;29497:4;29466:37;;;2386:74:1;29452:11:0;;29506:1;;29466:22;29473:4;29466:22;;;;2359:18:1;;29466:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;-1:-1:-1;29539:8:0;29579:13;29646;29638:22;;29635:861;;;29706:4;29700:11;29801:66;29766:8;29733:157;29940:6;29933:4;29923:8;29919:19;29912:35;30015:3;30010:2;30005:3;30001:12;29997:22;29990:4;29980:8;29976:19;29969:51;30091:1;30088;30082:4;30072:8;30069:1;30058:9;30051:5;30046:47;30042:52;30184:66;30149:8;30116:157;30323:6;30316:4;30306:8;30302:19;30295:35;30398:3;30393:2;30388:3;30384:12;30380:22;30373:4;30363:8;30359:19;30352:51;30474:1;30471;30465:4;30455:8;30452:1;30441:9;30434:5;30429:47;30425:52;;29616:895;;;;29020:1509::o;32034:420::-;32203:232;;;;;;;;;;;32318:4;32203:232;;;;;;32354:17;32203:232;;;;;;;;;;;;32165:281;;;;;20337:13:1;;32165:281:0;;;20319:32:1;20393:24;;32165:23:0;20389:73:1;;;20367:20;;;20360:103;20492:24;;20607:21;;20585:20;;;20578:51;20671:24;;20667:33;;;20645:20;;;20638:63;-1:-1:-1;;;;32165:15:0;:23;;;;;;20291:19:1;;32165:281:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32154:292;;;;-1:-1:-1;32034:420:0;-1:-1:-1;;32034:420:0:o;35287:1187::-;35474:15;35504:20;35539;35587:10;35600:11;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35667:11;;35656:45;;;;;;;;2072:25:1;;;35587:41:0;;-1:-1:-1;35639:14:0;;35667:11;;;;;35656:39;;2045:18:1;;35656:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35639:62;;35754:15;:20;;;35789:666;;;;;;;;35855:4;35789:666;;;;;;35894:4;35789:666;;;;;;35923:5;35789:666;;;;;;35982:7;35958:32;;35965:8;35958:4;:15;;;;:::i;:::-;:32;;;:109;;36052:15;36059:8;36052:4;:15;:::i;:::-;35958:109;;;36020:7;35958:109;35789:666;;;;;;36121:6;36097:15;36104:8;36097:4;:15;:::i;:::-;:31;;;:107;;36189:15;36196:8;36189:4;:15;:::i;:::-;36097:107;;;36158:6;36097:107;35789:666;;;;;;36239:11;35789:666;;;;36285:14;35789:666;;;;36330:1;35789:666;;;;36362:1;35789:666;;;;36393:2;35789:666;;;;;;36424:15;35789:666;;;35754:712;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35712:754;;;;-1:-1:-1;35712:754:0;;-1:-1:-1;35287:1187:0;;-1:-1:-1;;;;;;;;35287:1187:0:o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:455::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;640:2;628:15;645:66;624:88;609:104;;;;715:2;605:113;;269:455;-1:-1:-1;;269:455:1:o;729:154::-;815:42;808:5;804:54;797:5;794:65;784:93;;873:1;870;863:12;784:93;729:154;:::o;888:315::-;956:6;964;1017:2;1005:9;996:7;992:23;988:32;985:52;;;1033:1;1030;1023:12;985:52;1072:9;1059:23;1091:31;1116:5;1091:31;:::i;:::-;1141:5;1193:2;1178:18;;;;1165:32;;-1:-1:-1;;;888:315:1:o;1400:521::-;1495:6;1503;1511;1519;1527;1580:3;1568:9;1559:7;1555:23;1551:33;1548:53;;;1597:1;1594;1587:12;1548:53;1633:9;1620:23;1610:33;;1690:2;1679:9;1675:18;1662:32;1652:42;;1741:2;1730:9;1726:18;1713:32;1703:42;;1792:2;1781:9;1777:18;1764:32;1754:42;;1846:3;1835:9;1831:19;1818:33;1860:31;1885:5;1860:31;:::i;:::-;1910:5;1900:15;;;1400:521;;;;;;;;:::o;2471:367::-;2534:8;2544:6;2598:3;2591:4;2583:6;2579:17;2575:27;2565:55;;2616:1;2613;2606:12;2565:55;-1:-1:-1;2639:20:1;;2682:18;2671:30;;2668:50;;;2714:1;2711;2704:12;2668:50;2751:4;2743:6;2739:17;2727:29;;2811:3;2804:4;2794:6;2791:1;2787:14;2779:6;2775:27;2771:38;2768:47;2765:67;;;2828:1;2825;2818:12;2765:67;2471:367;;;;;:::o;2843:773::-;2965:6;2973;2981;2989;3042:2;3030:9;3021:7;3017:23;3013:32;3010:52;;;3058:1;3055;3048:12;3010:52;3098:9;3085:23;3127:18;3168:2;3160:6;3157:14;3154:34;;;3184:1;3181;3174:12;3154:34;3223:70;3285:7;3276:6;3265:9;3261:22;3223:70;:::i;:::-;3312:8;;-1:-1:-1;3197:96:1;-1:-1:-1;3400:2:1;3385:18;;3372:32;;-1:-1:-1;3416:16:1;;;3413:36;;;3445:1;3442;3435:12;3413:36;;3484:72;3548:7;3537:8;3526:9;3522:24;3484:72;:::i;:::-;2843:773;;;;-1:-1:-1;3575:8:1;-1:-1:-1;;;;2843:773:1:o;3621:456::-;3698:6;3706;3714;3767:2;3755:9;3746:7;3742:23;3738:32;3735:52;;;3783:1;3780;3773:12;3735:52;3822:9;3809:23;3841:31;3866:5;3841:31;:::i;:::-;3891:5;-1:-1:-1;3948:2:1;3933:18;;3920:32;3961:33;3920:32;3961:33;:::i;:::-;3621:456;;4013:7;;-1:-1:-1;;;4067:2:1;4052:18;;;;4039:32;;3621:456::o;4082:247::-;4141:6;4194:2;4182:9;4173:7;4169:23;4165:32;4162:52;;;4210:1;4207;4200:12;4162:52;4249:9;4236:23;4268:31;4293:5;4268:31;:::i;4523:481::-;4599:6;4607;4615;4668:2;4656:9;4647:7;4643:23;4639:32;4636:52;;;4684:1;4681;4674:12;4636:52;4723:9;4710:23;4773:6;4766:5;4762:18;4755:5;4752:29;4742:57;;4795:1;4792;4785:12;4742:57;4818:5;-1:-1:-1;4870:2:1;4855:18;;4842:32;;-1:-1:-1;4926:2:1;4911:18;;4898:32;4939:33;4898:32;4939:33;:::i;:::-;4991:7;4981:17;;;4523:481;;;;;:::o;5009:525::-;5095:6;5103;5111;5119;5172:3;5160:9;5151:7;5147:23;5143:33;5140:53;;;5189:1;5186;5179:12;5140:53;5225:9;5212:23;5202:33;;5285:2;5274:9;5270:18;5257:32;5298:31;5323:5;5298:31;:::i;:::-;5348:5;-1:-1:-1;5400:2:1;5385:18;;5372:32;;-1:-1:-1;5456:2:1;5441:18;;5428:32;5469:33;5428:32;5469:33;:::i;:::-;5009:525;;;;-1:-1:-1;5009:525:1;;-1:-1:-1;;5009:525:1:o;5539:388::-;5607:6;5615;5668:2;5656:9;5647:7;5643:23;5639:32;5636:52;;;5684:1;5681;5674:12;5636:52;5723:9;5710:23;5742:31;5767:5;5742:31;:::i;:::-;5792:5;-1:-1:-1;5849:2:1;5834:18;;5821:32;5862:33;5821:32;5862:33;:::i;:::-;5914:7;5904:17;;;5539:388;;;;;:::o;5932:727::-;6020:6;6028;6036;6044;6097:2;6085:9;6076:7;6072:23;6068:32;6065:52;;;6113:1;6110;6103:12;6065:52;6149:9;6136:23;6126:33;;6206:2;6195:9;6191:18;6178:32;6168:42;;6261:2;6250:9;6246:18;6233:32;6284:18;6325:2;6317:6;6314:14;6311:34;;;6341:1;6338;6331:12;6311:34;6379:6;6368:9;6364:22;6354:32;;6424:7;6417:4;6413:2;6409:13;6405:27;6395:55;;6446:1;6443;6436:12;6395:55;6486:2;6473:16;6512:2;6504:6;6501:14;6498:34;;;6528:1;6525;6518:12;6498:34;6573:7;6568:2;6559:6;6555:2;6551:15;6547:24;6544:37;6541:57;;;6594:1;6591;6584:12;6541:57;5932:727;;;;-1:-1:-1;;6625:2:1;6617:11;;-1:-1:-1;;;5932:727:1:o;6664:251::-;6734:6;6787:2;6775:9;6766:7;6762:23;6758:32;6755:52;;;6803:1;6800;6793:12;6755:52;6835:9;6829:16;6854:31;6879:5;6854:31;:::i;6920:192::-;6999:13;;7052:34;7041:46;;7031:57;;7021:85;;7102:1;7099;7092:12;7021:85;6920:192;;;:::o;7117:470::-;7205:6;7213;7221;7274:2;7262:9;7253:7;7249:23;7245:32;7242:52;;;7290:1;7287;7280:12;7242:52;7322:9;7316:16;7341:31;7366:5;7341:31;:::i;:::-;7441:2;7426:18;;7420:25;7391:5;;-1:-1:-1;7454:33:1;7420:25;7454:33;:::i;:::-;7506:7;-1:-1:-1;7532:49:1;7577:2;7562:18;;7532:49;:::i;:::-;7522:59;;7117:470;;;;;:::o;7592:184::-;7644:77;7641:1;7634:88;7741:4;7738:1;7731:15;7765:4;7762:1;7755:15;7781:274;7853:34;7919:10;;;7931;;;7915:27;7962:20;;;;7853:34;8001:24;;;7991:58;;8029:18;;:::i;:::-;7991:58;;7781:274;;;;:::o;8060:184::-;8112:77;8109:1;8102:88;8209:4;8206:1;8199:15;8233:4;8230:1;8223:15;8249:216;8289:1;8315:34;8376:2;8373:1;8369:10;8398:3;8388:37;;8405:18;;:::i;:::-;8443:10;;8439:20;;;;;8249:216;-1:-1:-1;;8249:216:1:o;8802:278::-;8871:6;8924:2;8912:9;8903:7;8899:23;8895:32;8892:52;;;8940:1;8937;8930:12;8892:52;8972:9;8966:16;9022:8;9015:5;9011:20;9004:5;9001:31;8991:59;;9046:1;9043;9036:12;9085:125;9150:9;;;9171:10;;;9168:36;;;9184:18;;:::i;9690:184::-;9760:6;9813:2;9801:9;9792:7;9788:23;9784:32;9781:52;;;9829:1;9826;9819:12;9781:52;-1:-1:-1;9852:16:1;;9690:184;-1:-1:-1;9690:184:1:o;10888:::-;10940:77;10937:1;10930:88;11037:4;11034:1;11027:15;11061:4;11058:1;11051:15;11077:128;11144:9;;;11165:11;;;11162:37;;;11179:18;;:::i;11522:172::-;11589:10;11619;;;11631;;;11615:27;;11654:11;;;11651:37;;;11668:18;;:::i;:::-;11651:37;11522:172;;;;:::o;13020:208::-;13090:6;13143:2;13131:9;13122:7;13118:23;13114:32;13111:52;;;13159:1;13156;13149:12;13111:52;13182:40;13212:9;13182:40;:::i;13802:389::-;13840:1;13881;13878;13867:16;13917:1;13914;13903:16;13938:3;13928:37;;13945:18;;:::i;:::-;14066:66;14061:3;14058:75;13989:66;13984:3;13981:75;13977:157;13974:183;;;14137:18;;:::i;:::-;14171:14;;;13802:389;-1:-1:-1;;;13802:389:1:o;14196:237::-;14234:7;14311:1;14308;14297:16;14293:1;14290;14279:16;14275:39;14348:11;14345:1;14334:26;14323:37;;14391:11;14382:7;14379:24;14369:58;;14407:18;;:::i;14438:247::-;14536:1;14525:16;;;14507;;;;14503:39;14567:66;14557:77;;14646:8;14636:19;;14554:102;14551:128;;;14659:18;;:::i;14690:243::-;14786:1;14757:16;;;14775;;;;14753:39;14816:8;14807:18;;14836:66;14827:76;;14804:100;14801:126;;;14907:18;;:::i;15034:1220::-;15254:13;;2185:42;2174:54;2162:67;;15222:3;15207:19;;15326:4;15318:6;15314:17;15308:24;15341:54;15389:4;15378:9;15374:20;15360:12;2185:42;2174:54;2162:67;;2108:127;15341:54;;15444:4;15436:6;15432:17;15426:24;15459:55;15508:4;15497:9;15493:20;15477:14;12178:8;12167:20;12155:33;;12102:92;15459:55;;15563:4;15555:6;15551:17;15545:24;15578:54;15626:4;15615:9;15611:20;15595:14;15013:1;15002:20;14990:33;;14938:91;15578:54;;15681:4;15673:6;15669:17;15663:24;15696:54;15744:4;15733:9;15729:20;15713:14;15013:1;15002:20;14990:33;;14938:91;15696:54;;15806:4;15798:6;15794:17;15788:24;15781:4;15770:9;15766:20;15759:54;15869:4;15861:6;15857:17;15851:24;15844:4;15833:9;15829:20;15822:54;15932:4;15924:6;15920:17;15914:24;15907:4;15896:9;15892:20;15885:54;15958:6;16018:2;16010:6;16006:15;16000:22;15995:2;15984:9;15980:18;15973:50;;16042:6;16097:2;16089:6;16085:15;16079:22;16110:54;16160:2;16149:9;16145:18;16129:14;2185:42;2174:54;2162:67;;2108:127;16110:54;-1:-1:-1;;16183:6:1;16231:15;;;16225:22;16205:18;;;;16198:50;15034:1220;:::o;16259:392::-;16356:6;16364;16372;16380;16433:3;16421:9;16412:7;16408:23;16404:33;16401:53;;;16450:1;16447;16440:12;16401:53;16479:9;16473:16;16463:26;;16508:49;16553:2;16542:9;16538:18;16508:49;:::i;:::-;16597:2;16582:18;;16576:25;16641:2;16626:18;;;16620:25;16259:392;;16498:59;;-1:-1:-1;16259:392:1;-1:-1:-1;;;16259:392:1:o;16958:277::-;17025:6;17078:2;17066:9;17057:7;17053:23;17049:32;17046:52;;;17094:1;17091;17084:12;17046:52;17126:9;17120:16;17179:5;17172:13;17165:21;17158:5;17155:32;17145:60;;17201:1;17198;17191:12;17240:120;17280:1;17306;17296:35;;17311:18;;:::i;:::-;-1:-1:-1;17345:9:1;;17240:120::o;17365:168::-;17438:9;;;17469;;17486:15;;;17480:22;;17466:37;17456:71;;17507:18;;:::i;18101:245::-;18180:6;18188;18241:2;18229:9;18220:7;18216:23;18212:32;18209:52;;;18257:1;18254;18247:12;18209:52;-1:-1:-1;;18280:16:1;;18336:2;18321:18;;;18315:25;18280:16;;18315:25;;-1:-1:-1;18101:245:1:o;18351:287::-;18480:3;18518:6;18512:13;18534:66;18593:6;18588:3;18581:4;18573:6;18569:17;18534:66;:::i;:::-;18616:16;;;;;18351:287;-1:-1:-1;;18351:287:1:o;18988:277::-;19056:6;19109:2;19097:9;19088:7;19084:23;19080:32;19077:52;;;19125:1;19122;19115:12;19077:52;19157:9;19151:16;19210:5;19207:1;19196:20;19189:5;19186:31;19176:59;;19231:1;19228;19221:12
Swarm Source
ipfs://fb8badff437aa9a7dd33288b7e2a376e3b0985736d5275e9fb693176c26504db
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.