From 50854d246ac98398ab79ed5b878812e9294b27c6 Mon Sep 17 00:00:00 2001 From: David Minarsch Date: Tue, 29 Oct 2024 10:28:44 +0530 Subject: [PATCH 01/13] chore: further refactor to account for multi-chain version --- contracts/MemeBase.sol | 28 +++++---- contracts/MemeCelo.sol | 31 +++++----- contracts/MemeFactory.sol | 117 ++++++++++++++++++-------------------- 3 files changed, 88 insertions(+), 88 deletions(-) diff --git a/contracts/MemeBase.sol b/contracts/MemeBase.sol index 1814ede..c3451a3 100644 --- a/contracts/MemeBase.sol +++ b/contracts/MemeBase.sol @@ -73,6 +73,11 @@ abstract contract MemeBase is MemeFactory { address public immutable l2TokenRelayer; // Oracle address address public immutable oracle; + // Token transfer gas limit for L1 + // This is safe as the value is practically bigger than observed ones on numerous chains + uint32 public constant TOKEN_GAS_LIMIT = 300_000; + // WETH token address + address public immutable weth; /// @dev MemeBase constructor constructor( @@ -86,19 +91,20 @@ abstract contract MemeBase is MemeFactory { address _l2TokenRelayer, address _oracle, bytes32 _balancerPoolId - ) MemeFactory(_olas, _usdc, _weth, _router, _factory, _balancerVault, _minNativeTokenValue) { + ) MemeFactory(_olas, _usdc, _router, _factory, _balancerVault, _minNativeTokenValue) { + weth = _weth; l2TokenRelayer = _l2TokenRelayer; oracle = _oracle; balancerPoolId = _balancerPoolId; } /// @dev Buys USDC on UniswapV2 using ETH amount. - /// @param ethAmount Input ETH amount. + /// @param nativeTokenAmount Input ETH amount. /// @return Stable token amount bought. - function _buyStableToken(uint256 ethAmount, uint256) internal override returns (uint256) { + function _convertToReferenceToken(uint256 nativeTokenAmount, uint256) internal override returns (uint256) { address[] memory path = new address[](2); path[0] = weth; - path[1] = usdc; + path[1] = referenceToken; // Calculate price by Oracle (, int256 answerPrice, , , ) = IOracle(oracle).latestRoundData(); @@ -106,9 +112,9 @@ abstract contract MemeBase is MemeFactory { // Oracle returns 8 decimals, USDC has 6 decimals, need to additionally divide by 100 // ETH: 18 decimals, USDC leftovers: 2 decimals, percentage: 2 decimals; denominator = 18 + 2 + 2 = 22 - uint256 limit = uint256(answerPrice) * ethAmount * SLIPPAGE / 1e22; + uint256 limit = uint256(answerPrice) * nativeTokenAmount * SLIPPAGE / 1e22; // Swap ETH for USDC - uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: ethAmount }( + uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: nativeTokenAmount }( limit, path, address(this), @@ -120,16 +126,16 @@ abstract contract MemeBase is MemeFactory { } /// @dev Buys OLAS on Balancer. - /// @param usdcAmount USDC amount. + /// @param referenceTokenAmount USDC amount. /// @param limit OLAS minimum amount depending on the desired slippage. /// @return Obtained OLAS amount. - function _buyOLAS(uint256 usdcAmount, uint256 limit) internal override returns (uint256) { + function _buyOLAS(uint256 referenceTokenAmount, uint256 limit) internal override returns (uint256) { // Approve usdc for the Balancer Vault - IERC20(usdc).approve(balancerVault, usdcAmount); + IERC20(referenceToken).approve(balancerVault, referenceTokenAmount); // Prepare Balancer data - IBalancer.SingleSwap memory singleSwap = IBalancer.SingleSwap(balancerPoolId, IBalancer.SwapKind.GIVEN_IN, usdc, - olas, usdcAmount, "0x"); + IBalancer.SingleSwap memory singleSwap = IBalancer.SingleSwap(balancerPoolId, IBalancer.SwapKind.GIVEN_IN, referenceToken, + olas, referenceTokenAmount, "0x"); IBalancer.FundManagement memory fundManagement = IBalancer.FundManagement(address(this), false, payable(address(this)), false); diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index b4a27ec..4684f54 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -57,7 +57,7 @@ abstract contract MemeCelo is MemeFactory { /// @dev MemeBase constructor constructor( address _olas, - address _usdc, + address _cusd, address _weth, address _router, address _factory, @@ -65,18 +65,19 @@ abstract contract MemeCelo is MemeFactory { uint256 _minNativeTokenValue, address _l2TokenRelayer, address _oracle - ) MemeFactory(_olas, _usdc, _weth, _router, _factory, _balancerVault, _minNativeTokenValue) { + ) MemeFactory(_olas, _cusd, _router, _factory, _balancerVault, _minNativeTokenValue) { + weth = _weth; // probably wrapped CELO? l2TokenRelayer = _l2TokenRelayer; oracle = _oracle; } - /// @dev Buys USDC on UniswapV2 using Celo amount. - /// @param celoAmount Input Celo amount. + /// @dev Buys cUSD on UniswapV2 using Celo amount. + /// @param nativeTokenAmount Input Celo amount. /// @return Stable token amount bought. - function _buyStableToken(uint256 celoAmount, uint256) internal override returns (uint256) { + function _convertToReferenceToken(uint256 nativeTokenAmount, uint256) internal override returns (uint256) { address[] memory path = new address[](2); - path[0] = weth; - path[1] = usdc; + path[0] = weth; // probably wrapped CELO? + path[1] = cusd; // Calculate price by Oracle (, int256 answerPrice, , , ) = IOracle(oracle).latestRoundData(); @@ -84,32 +85,32 @@ abstract contract MemeCelo is MemeFactory { // Oracle returns 8 decimals, USDC has 6 decimals, need to additionally divide by 100 // ETH: 18 decimals, USDC leftovers: 2 decimals, percentage: 2 decimals; denominator = 18 + 2 + 2 = 22 - uint256 limit = uint256(answerPrice) * celoAmount * SLIPPAGE / 1e22; + uint256 limit = uint256(answerPrice) * nativeTokenAmount * SLIPPAGE / 1e22; // Swap ETH for USDC - uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: celoAmount }( + uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: nativeTokenAmount }( limit, path, address(this), block.timestamp ); - // Return the USDC amount bought + // Return the cUSD amount bought return amounts[1]; } /// @dev Buys OLAS on UniswapV2. - /// @param usdcAmount USDC amount. + /// @param referenceTokenAmount CELO amount. /// @return Obtained OLAS amount. - function _buyOLAS(uint256 usdcAmount, uint256 limit) internal override returns (uint256) { + function _buyOLAS(uint256 referenceTokenAmount, uint256 limit) internal override returns (uint256) { address[] memory path = new address[](2); - path[0] = usdc; + path[0] = cusd; path[1] = olas; // Calculate price by Oracle //(, int256 answerPrice, , , ) = IOracle(oracle).latestRoundData(); //require(answerPrice > 0, "Oracle price is incorrect"); - // Swap USDC for + // Swap cUSD for // this will go via two pools - not a problem as ubeswap has both uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: usdcAmount }( limit, path, @@ -117,7 +118,7 @@ abstract contract MemeCelo is MemeFactory { block.timestamp ); - // Return the USDC amount bought + // Return the OLAS amount bought return amounts[1]; } diff --git a/contracts/MemeFactory.sol b/contracts/MemeFactory.sol index 03d8c43..2b928ff 100644 --- a/contracts/MemeFactory.sol +++ b/contracts/MemeFactory.sol @@ -25,7 +25,7 @@ interface IUniswap { /// @title MemeFactory - a smart contract factory for Meme Token creation /// @dev This contract let's: -/// 1) Any msg.sender summons a meme by contributing at least 0.01 ETH. +/// 1) Any msg.sender summons a meme by contributing at least 0.01 ETH (or equivalent native asset for other chains). /// 2) Within 24h of a meme being summoned, any msg.sender can heart a meme (thereby becoming a hearter). /// This requires the msg.sender to send a non-zero ETH value, which gets recorded as a contribution. /// 3) After 24h of a meme being summoned, any msg.sender can unleash the meme. This creates a liquidity pool for @@ -33,7 +33,7 @@ interface IUniswap { /// contributions. /// 4) After the meme is being unleashed any hearter can collect their share of the meme token. /// 5) After 48h of a meme being summoned, any msg.sender can purge the uncollected meme token allocations of hearters. -/// @notice 10% of the ETH contributed to a meme gets converted into USDC upon unleashing of the meme, that can later be +/// @notice 10% of the ETH contributed to a meme gets converted into USDC (or other reference token) upon unleashing of the meme, that can later be /// converted to OLAS and scheduled for burning (on Ethereum mainnet). The remainder of the ETH contributed (90%) /// is converted to USDC and contributed to an LP, together with 50% of the token supply of the meme. /// The remaining 50% of the meme token supply goes to hearters. The LP token is held forever by MemeBase, @@ -53,7 +53,7 @@ interface IUniswap { /// $SMTH to be burned. abstract contract MemeFactory { event OLASJourneyToAscendance(address indexed olas, uint256 amount); - event Summoned(address indexed summoner, address indexed memeToken, uint256 ethContributed); + event Summoned(address indexed summoner, address indexed memeToken, uint256 nativeTokenContributed); event Hearted(address indexed hearter, address indexed memeToken, uint256 amount); event Unleashed(address indexed unleasher, address indexed memeToken, address indexed lpPairAddress, uint256 liquidity, uint256 burnPercentageOfStable); @@ -62,8 +62,8 @@ abstract contract MemeFactory { // Meme Summon struct struct MemeSummon { - // ETH contributed to the meme launch - uint256 ethContributed; + // Native token contributed to the meme launch + uint256 nativeTokenContributed; // Summon timestamp uint256 summonTime; // Unleash timestamp @@ -86,9 +86,6 @@ abstract contract MemeFactory { uint256 public constant LP_PERCENTAGE = 50; // L1 OLAS Burner address address public constant OLAS_BURNER = 0x51eb65012ca5cEB07320c497F4151aC207FEa4E0; - // Token transfer gas limit for L1 - // This is safe as the value is practically bigger than observed ones on numerous chains - uint32 public constant TOKEN_GAS_LIMIT = 300_000; // Meme token decimals uint8 public constant DECIMALS = 18; @@ -96,10 +93,8 @@ abstract contract MemeFactory { uint256 public immutable minNativeTokenValue; // OLAS token address address public immutable olas; - // USDC token address - address public immutable usdc; - // WETH token address - address public immutable weth; + // Reference token address + address public immutable referenceToken; // Uniswap V2 router address address public immutable router; // Uniswap V2 factory address @@ -109,12 +104,12 @@ abstract contract MemeFactory { // Number of meme tokens uint256 public numTokens; - // USDC scheduled to be converted to OLAS for Ascendance + // Reference token scheduled to be converted to OLAS for Ascendance uint256 public scheduledForAscendance; // Map of meme token => Meme summon struct mapping(address => MemeSummon) public memeSummons; - // Map of mem token => (map of hearter => ETH balance) + // Map of mem token => (map of hearter => native token balance) mapping(address => mapping(address => uint256)) public memeHearters; // Map of account => activity counter mapping(address => uint256) public mapAccountActivities; @@ -124,32 +119,30 @@ abstract contract MemeFactory { /// @dev MemeBase constructor constructor( address _olas, - address _usdc, - address _weth, + address _referenceToken, address _router, address _factory, address _balancerVault, uint256 _minNativeTokenValue ) { olas = _olas; - usdc = _usdc; - weth = _weth; + referenceToken = _referenceToken; router = _router; factory = _factory; balancerVault = _balancerVault; minNativeTokenValue = _minNativeTokenValue; } - /// @dev Buys USDC on UniswapV2 using ETH amount. - /// @param ethAmount Input ETH amount. - /// @return USDC amount bought. - function _buyStableToken(uint256 ethAmount, uint256) internal virtual returns (uint256); + /// @dev Converts contributed native token to reference token. + /// @param nativeTokenAmount Input native token amount. + /// @return reference token amount converted to. + function _convertToReferenceToken(uint256 nativeTokenAmount, uint256) internal virtual returns (uint256); - /// @dev Buys OLAS on Balancer. - /// @param usdcAmount USDC amount. + /// @dev Buys OLAS on DEX. + /// @param reference token amount. /// @param limit OLAS minimum amount depending on the desired slippage. /// @return Obtained OLAS amount. - function _buyOLAS(uint256 usdcAmount, uint256 limit) internal virtual returns (uint256); + function _buyOLAS(uint256 referenceTokenAmount, uint256 limit) internal virtual returns (uint256); /// @dev Bridges OLAS amount back to L1 and burns. /// @param OLASAmount OLAS amount. @@ -162,31 +155,31 @@ abstract contract MemeFactory { bytes memory bridgePayload ) internal virtual returns (uint256); - /// @dev Creates USDC + meme token LP and adds liquidity. + /// @dev Creates reference token + meme token LP and adds liquidity. /// @param memeToken Meme token address. - /// @param usdcAmount USDC amount. + /// @param referenceTokenAmount Reference token amount. /// @param memeTokenAmount Meme token amount. - /// @return pair USDC + meme token LP address. + /// @return pair reference token + meme token LP address. /// @return liquidity Obtained LP liquidity. function _createUniswapPair( address memeToken, - uint256 usdcAmount, + uint256 referenceTokenAmount, uint256 memeTokenAmount ) internal returns (address pair, uint256 liquidity) { // Create the LP - pair = IUniswap(factory).createPair(usdc, memeToken); + pair = IUniswap(factory).createPair(referenceToken, memeToken); // Approve tokens for router - IERC20(usdc).approve(router, usdcAmount); + IERC20(referenceToken).approve(router, referenceTokenAmount); IERC20(memeToken).approve(router, memeTokenAmount); - // Add USDC + meme token liquidity + // Add reference token + meme token liquidity (, , liquidity) = IUniswap(router).addLiquidity( - usdc, + referenceToken, memeToken, - usdcAmount, + referenceTokenAmount, memeTokenAmount, - 0, // Accept any amount of USDC + 0, // Accept any amount of reference token 0, // Accept any amount of meme token address(this), block.timestamp @@ -197,18 +190,18 @@ abstract contract MemeFactory { /// @param memeToken Meme token address. /// @param heartersAmount Total hearters meme token amount. /// @param hearterContribution Hearter contribution. - /// @param totalETHCommitted Total ETH contributed for the token launch. + /// @param totalNativeTokenCommitted Total native token contributed for the token launch. function _collect( address memeToken, uint256 heartersAmount, uint256 hearterContribution, - uint256 totalETHCommitted + uint256 totalNativeTokenCommitted ) internal { // Get meme token instance Meme memeTokenInstance = Meme(memeToken); // Allocate corresponding meme token amount to the hearter - uint256 allocation = (heartersAmount * hearterContribution) / totalETHCommitted; + uint256 allocation = (heartersAmount * hearterContribution) / totalNativeTokenCommitted; // Zero the allocation memeHearters[memeToken][msg.sender] = 0; @@ -228,7 +221,7 @@ abstract contract MemeFactory { string memory symbol, uint256 totalSupply ) external payable { - // Check for minimum ETH value + // Check for minimum native token value require(msg.value >= minNativeTokenValue, "Minimum native token value is required to summon"); // Check for minimum total supply require(totalSupply >= MIN_TOTAL_SUPPLY, "Minimum total supply is not met"); @@ -251,26 +244,26 @@ abstract contract MemeFactory { emit Summoned(msg.sender, memeToken, msg.value); } - /// @dev Hearts the meme token with ETH contribution. + /// @dev Hearts the meme token with native token contribution. /// @param memeToken Meme token address. function heartThisMeme(address memeToken) external payable { // Check for zero value - require(msg.value > 0, "ETH amount must be greater than zero"); + require(msg.value > 0, "Native token amount must be greater than zero"); // Get the meme summon info MemeSummon storage memeSummon = memeSummons[memeToken]; - // Get the total ETH committed to this meme - uint256 totalETHCommitted = memeSummon.ethContributed; + // Get the total native token committed to this meme + uint256 totalNativeTokenCommitted = memeSummon.nativeTokenContributed; // Check that the meme has been summoned - require(totalETHCommitted > 0, "Meme not yet summoned"); + require(totalNativeTokenCommitted > 0, "Meme not yet summoned"); // Check if the token has been unleashed require(memeSummon.unleashTime == 0, "Meme already unleashed"); // Update meme token map values - totalETHCommitted += msg.value; - memeSummon.ethContributed = totalETHCommitted; + totalNativeTokenCommitted += msg.value; + memeSummon.nativeTokenContributed = totalNativeTokenCommitted; memeHearters[memeToken][msg.sender] += msg.value; // Record msg.sender activity @@ -281,29 +274,29 @@ abstract contract MemeFactory { /// @dev Unleashes the meme token. /// @param memeToken Meme token address. - /// @param limit Stable token minimum amount depending on the desired slippage, if applicable. + /// @param limit Reference token minimum amount depending on the desired slippage, if applicable. function unleashThisMeme(address memeToken, uint256 limit) external { // Get the meme summon info MemeSummon storage memeSummon = memeSummons[memeToken]; - // Get the total ETH committed to this meme - uint256 totalETHCommitted = memeSummon.ethContributed; + // Get the total native token amount committed to this meme + uint256 totalNativeTokenCommitted = memeSummon.nativeTokenContributed; // Check if the meme has been summoned require(memeSummon.summonTime > 0, "Meme not summoned"); // Check the unleash timestamp require(block.timestamp >= memeSummon.summonTime + UNLEASH_DELAY, "Cannot unleash yet"); - // Buy USDC with the the total ETH committed + // Buy reference token with the the total native token committed // This might not be needed in other implementations, and the function would return the given value - uint256 usdcAmount = _buyStableToken(totalETHCommitted, limit); + uint256 referenceTokenAmount = _convertToReferenceToken(totalNativeTokenCommitted, limit); - // Put aside USDC to buy OLAS with the burn percentage of the total ETH committed - uint256 burnPercentageOfUSDC = (usdcAmount * OLAS_BURN_PERCENTAGE) / 100; - scheduledForAscendance += burnPercentageOfUSDC; + // Put aside reference token to buy OLAS with the burn percentage of the total native token amount committed + uint256 burnPercentageOfReferenceToken = (referenceTokenAmount * OLAS_BURN_PERCENTAGE) / 100; + scheduledForAscendance += burnPercentageOfReferenceToken; - // Adjust USDC amount - usdcAmount -= burnPercentageOfUSDC; + // Adjust reference token amount + referenceTokenAmount -= burnPercentageOfReferenceToken; // Calculate LP token allocation according to LP percentage and distribution to supporters Meme memeTokenInstance = Meme(memeToken); @@ -312,7 +305,7 @@ abstract contract MemeFactory { uint256 heartersAmount = totalSupply - lpTokenAmount; // Create Uniswap pair with LP allocation - (address pool, uint256 liquidity) = _createUniswapPair(memeToken, usdcAmount, lpTokenAmount); + (address pool, uint256 liquidity) = _createUniswapPair(memeToken, referenceTokenAmount, lpTokenAmount); // Record the actual meme unleash time memeSummon.unleashTime = block.timestamp; @@ -325,10 +318,10 @@ abstract contract MemeFactory { // Allocate to the token hearter unleashing the meme uint256 hearterContribution = memeHearters[memeToken][msg.sender]; if (hearterContribution > 0) { - _collect(memeToken, hearterContribution, heartersAmount, totalETHCommitted); + _collect(memeToken, hearterContribution, heartersAmount, totalNativeTokenCommitted); } - emit Unleashed(msg.sender, memeToken, pool, liquidity, burnPercentageOfUSDC); + emit Unleashed(msg.sender, memeToken, pool, liquidity, burnPercentageOfReferenceToken); } /// @dev Collects meme token allocation. @@ -351,7 +344,7 @@ abstract contract MemeFactory { mapAccountActivities[msg.sender]++; // Collect the token - _collect(memeToken, hearterContribution, memeSummon.heartersAmount, memeSummon.ethContributed); + _collect(memeToken, hearterContribution, memeSummon.heartersAmount, memeSummon.nativeTokenContributed); } /// @dev Purges uncollected meme token allocation. @@ -381,7 +374,7 @@ abstract contract MemeFactory { emit Purged(memeToken, remainingBalance); } - /// @dev Converts collected USDC to OLAS and bridges OLAS to Ethereum mainnet for burn. + /// @dev Converts collected reference token to OLAS and bridges OLAS to Ethereum mainnet for burn. /// @param limit OLAS minimum amount depending on the desired slippage. /// @param tokenGasLimit Token gas limit for bridging OLAS to L1. /// @param bridgePayload Optional additional bridge payload. @@ -406,6 +399,6 @@ abstract contract MemeFactory { } } - /// @dev Allows the contract to receive ETH + /// @dev Allows the contract to receive native token receive() external payable {} } From 796a2b937d901ea766b4956fc919ce544d6413de Mon Sep 17 00:00:00 2001 From: David Minarsch Date: Tue, 29 Oct 2024 10:39:58 +0530 Subject: [PATCH 02/13] chore: remove unneeded var --- contracts/MemeBase.sol | 3 +-- contracts/MemeCelo.sol | 3 +-- contracts/MemeFactory.sol | 2 -- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/contracts/MemeBase.sol b/contracts/MemeBase.sol index c3451a3..1a3032a 100644 --- a/contracts/MemeBase.sol +++ b/contracts/MemeBase.sol @@ -87,11 +87,10 @@ abstract contract MemeBase is MemeFactory { address _router, address _factory, address _balancerVault, - uint256 _minNativeTokenValue, address _l2TokenRelayer, address _oracle, bytes32 _balancerPoolId - ) MemeFactory(_olas, _usdc, _router, _factory, _balancerVault, _minNativeTokenValue) { + ) MemeFactory(_olas, _usdc, _router, _factory, _balancerVault) { weth = _weth; l2TokenRelayer = _l2TokenRelayer; oracle = _oracle; diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index 4684f54..810b5bb 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -62,10 +62,9 @@ abstract contract MemeCelo is MemeFactory { address _router, address _factory, address _balancerVault, - uint256 _minNativeTokenValue, address _l2TokenRelayer, address _oracle - ) MemeFactory(_olas, _cusd, _router, _factory, _balancerVault, _minNativeTokenValue) { + ) MemeFactory(_olas, _cusd, _router, _factory, _balancerVault) { weth = _weth; // probably wrapped CELO? l2TokenRelayer = _l2TokenRelayer; oracle = _oracle; diff --git a/contracts/MemeFactory.sol b/contracts/MemeFactory.sol index 2b928ff..3f0d4bc 100644 --- a/contracts/MemeFactory.sol +++ b/contracts/MemeFactory.sol @@ -123,14 +123,12 @@ abstract contract MemeFactory { address _router, address _factory, address _balancerVault, - uint256 _minNativeTokenValue ) { olas = _olas; referenceToken = _referenceToken; router = _router; factory = _factory; balancerVault = _balancerVault; - minNativeTokenValue = _minNativeTokenValue; } /// @dev Converts contributed native token to reference token. From 1f8be5aef1583850277dd617c9dd6be9d26a709e Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 10:57:48 +0000 Subject: [PATCH 03/13] refactor: finalizing both approaches --- contracts/MemeBase.sol | 24 ++++++++++++++---------- contracts/MemeCelo.sol | 29 ++++++++++++++--------------- contracts/MemeFactory.sol | 34 +++++++++++++++++++++++++++------- 3 files changed, 55 insertions(+), 32 deletions(-) diff --git a/contracts/MemeBase.sol b/contracts/MemeBase.sol index 1a3032a..579191c 100644 --- a/contracts/MemeBase.sol +++ b/contracts/MemeBase.sol @@ -66,34 +66,38 @@ interface IUniswap { abstract contract MemeBase is MemeFactory { // Slippage parameter (3%) uint256 public constant SLIPPAGE = 97; - - // Balancer Pool Id - bytes32 public immutable balancerPoolId; - // L2 token relayer bridge address - address public immutable l2TokenRelayer; - // Oracle address - address public immutable oracle; // Token transfer gas limit for L1 // This is safe as the value is practically bigger than observed ones on numerous chains uint32 public constant TOKEN_GAS_LIMIT = 300_000; + // WETH token address address public immutable weth; + // L2 token relayer bridge address + address public immutable l2TokenRelayer; + // Oracle address + address public immutable oracle; + // Balancer Vault address + address public immutable balancerVault; + // Balancer Pool Id + bytes32 public immutable balancerPoolId; /// @dev MemeBase constructor constructor( address _olas, address _usdc, - address _weth, address _router, address _factory, - address _balancerVault, + uint256 _minNativeTokenValue, + address _weth, address _l2TokenRelayer, address _oracle, + address _balancerVault, bytes32 _balancerPoolId - ) MemeFactory(_olas, _usdc, _router, _factory, _balancerVault) { + ) MemeFactory(_olas, _usdc, _router, _factory, _minNativeTokenValue) { weth = _weth; l2TokenRelayer = _l2TokenRelayer; oracle = _oracle; + balancerVault = _balancerVault; balancerPoolId = _balancerPoolId; } diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index 810b5bb..f3a84e5 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -46,6 +46,8 @@ abstract contract MemeCelo is MemeFactory { // Ethereum mainnet chain Id in Wormhole format uint16 public constant WORMHOLE_ETH_CHAIN_ID = 2; + // WCELO token address + address public immutable wcelo; // L2 token relayer bridge address address public immutable l2TokenRelayer; // Oracle address @@ -57,15 +59,15 @@ abstract contract MemeCelo is MemeFactory { /// @dev MemeBase constructor constructor( address _olas, - address _cusd, - address _weth, + address _referenceToken, + address _wcelo, address _router, address _factory, - address _balancerVault, + uint256 _minNativeTokenValue, address _l2TokenRelayer, address _oracle - ) MemeFactory(_olas, _cusd, _router, _factory, _balancerVault) { - weth = _weth; // probably wrapped CELO? + ) MemeFactory(_olas, _referenceToken, _router, _factory, _minNativeTokenValue) { + wcelo = _wcelo; l2TokenRelayer = _l2TokenRelayer; oracle = _oracle; } @@ -75,8 +77,8 @@ abstract contract MemeCelo is MemeFactory { /// @return Stable token amount bought. function _convertToReferenceToken(uint256 nativeTokenAmount, uint256) internal override returns (uint256) { address[] memory path = new address[](2); - path[0] = weth; // probably wrapped CELO? - path[1] = cusd; + path[0] = wcelo; + path[1] = referenceToken; // Calculate price by Oracle (, int256 answerPrice, , , ) = IOracle(oracle).latestRoundData(); @@ -101,16 +103,13 @@ abstract contract MemeCelo is MemeFactory { /// @param referenceTokenAmount CELO amount. /// @return Obtained OLAS amount. function _buyOLAS(uint256 referenceTokenAmount, uint256 limit) internal override returns (uint256) { - address[] memory path = new address[](2); - path[0] = cusd; - path[1] = olas; - - // Calculate price by Oracle - //(, int256 answerPrice, , , ) = IOracle(oracle).latestRoundData(); - //require(answerPrice > 0, "Oracle price is incorrect"); + address[] memory path = new address[](3); + path[0] = referenceToken; + path[1] = wcelo; + path[2] = olas; // Swap cUSD for // this will go via two pools - not a problem as ubeswap has both - uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: usdcAmount }( + uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: referenceTokenAmount }( limit, path, address(this), diff --git a/contracts/MemeFactory.sol b/contracts/MemeFactory.sol index 3f0d4bc..761eb02 100644 --- a/contracts/MemeFactory.sol +++ b/contracts/MemeFactory.sol @@ -99,13 +99,13 @@ abstract contract MemeFactory { address public immutable router; // Uniswap V2 factory address address public immutable factory; - // Balancer Vault address - address public immutable balancerVault; // Number of meme tokens uint256 public numTokens; // Reference token scheduled to be converted to OLAS for Ascendance uint256 public scheduledForAscendance; + // Reentrancy lock + uint256 internal _locked = 1; // Map of meme token => Meme summon struct mapping(address => MemeSummon) public memeSummons; @@ -116,19 +116,19 @@ abstract contract MemeFactory { // Set of all meme tokens created by this contract address[] public memeTokens; - /// @dev MemeBase constructor + /// @dev MemeFactory constructor constructor( address _olas, address _referenceToken, address _router, address _factory, - address _balancerVault, + uint256 _minNativeTokenValue ) { olas = _olas; referenceToken = _referenceToken; router = _router; factory = _factory; - balancerVault = _balancerVault; + minNativeTokenValue = _minNativeTokenValue; } /// @dev Converts contributed native token to reference token. @@ -137,7 +137,7 @@ abstract contract MemeFactory { function _convertToReferenceToken(uint256 nativeTokenAmount, uint256) internal virtual returns (uint256); /// @dev Buys OLAS on DEX. - /// @param reference token amount. + /// @param referenceTokenAmount Reference token amount. /// @param limit OLAS minimum amount depending on the desired slippage. /// @return Obtained OLAS amount. function _buyOLAS(uint256 referenceTokenAmount, uint256 limit) internal virtual returns (uint256); @@ -240,6 +240,7 @@ abstract contract MemeFactory { mapAccountActivities[msg.sender]++; emit Summoned(msg.sender, memeToken, msg.value); + emit Hearted(msg.sender, memeToken, msg.value); } /// @dev Hearts the meme token with native token contribution. @@ -274,6 +275,9 @@ abstract contract MemeFactory { /// @param memeToken Meme token address. /// @param limit Reference token minimum amount depending on the desired slippage, if applicable. function unleashThisMeme(address memeToken, uint256 limit) external { + require(_locked == 1, "Reentrancy guard"); + _locked == 2; + // Get the meme summon info MemeSummon storage memeSummon = memeSummons[memeToken]; @@ -320,11 +324,16 @@ abstract contract MemeFactory { } emit Unleashed(msg.sender, memeToken, pool, liquidity, burnPercentageOfReferenceToken); + + _locked = 1; } /// @dev Collects meme token allocation. /// @param memeToken Meme token address. function collectThisMeme(address memeToken) external { + require(_locked == 1, "Reentrancy guard"); + _locked == 2; + // Get the meme summon info MemeSummon memory memeSummon = memeSummons[memeToken]; @@ -343,11 +352,16 @@ abstract contract MemeFactory { // Collect the token _collect(memeToken, hearterContribution, memeSummon.heartersAmount, memeSummon.nativeTokenContributed); + + _locked = 1; } /// @dev Purges uncollected meme token allocation. /// @param memeToken Meme token address. function purgeThisMeme(address memeToken) external { + require(_locked == 1, "Reentrancy guard"); + _locked == 2; + // Get the meme summon info MemeSummon memory memeSummon = memeSummons[memeToken]; @@ -370,6 +384,8 @@ abstract contract MemeFactory { memeTokenInstance.burn(remainingBalance); emit Purged(memeToken, remainingBalance); + + _locked = 1; } /// @dev Converts collected reference token to OLAS and bridges OLAS to Ethereum mainnet for burn. @@ -377,7 +393,9 @@ abstract contract MemeFactory { /// @param tokenGasLimit Token gas limit for bridging OLAS to L1. /// @param bridgePayload Optional additional bridge payload. function scheduleOLASForAscendance(uint256 limit, uint256 tokenGasLimit, bytes memory bridgePayload) external payable { - // TODO reentrancy throughout the contract + require(_locked == 1, "Reentrancy guard"); + _locked == 2; + require(scheduledForAscendance > 0, "Nothing to burn"); // Record msg.sender activity @@ -395,6 +413,8 @@ abstract contract MemeFactory { // solhint-disable-next-line avoid-low-level-calls tx.origin.call{value: leftovers}(""); } + + _locked == 1; } /// @dev Allows the contract to receive native token From b6f82c962692931cc48a901b7f4c39f66e9bcf46 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 11:14:36 +0000 Subject: [PATCH 04/13] feat and chore: activity checker contract and configs --- contracts/MemeActivityChecker.sol | 73 +++++++++++++++++++ contracts/MemeCelo.sol | 2 +- scripts/deployment/deploy_01_meme_base.js | 4 +- scripts/deployment/deploy_02_meme_celo.js | 75 ++++++++++++++++++++ scripts/deployment/globals_base_mainnet.json | 2 +- scripts/deployment/globals_base_sepolia.json | 2 +- scripts/deployment/verify_01_meme_base.js | 2 +- 7 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 contracts/MemeActivityChecker.sol create mode 100644 scripts/deployment/deploy_02_meme_celo.js diff --git a/contracts/MemeActivityChecker.sol b/contracts/MemeActivityChecker.sol new file mode 100644 index 0000000..d631568 --- /dev/null +++ b/contracts/MemeActivityChecker.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +// Meme Factory interface +interface IMemeFactory { + function mapAccountActivities(address multisig) external view returns (uint256); +} + +/// @dev Zero address. +error ZeroAddress(); + +/// @dev Zero value. +error ZeroValue(); + +/// @title MemeActivityChecker - Smart contract for meme contract interaction service staking activity check +/// @author Aleksandr Kuperman - +/// @author Andrey Lebedev - +/// @author David Vilela - +contract MemeActivityChecker { + // Liveness ratio in the format of 1e18 + uint256 public immutable livenessRatio; + // Meme Factory contract address + address public immutable memeFactory; + + /// @dev StakingNativeToken initialization. + /// @param _memeFactory Meme Factory contract address. + /// @param _livenessRatio Liveness ratio in the format of 1e18. + constructor(address _memeFactory, uint256 _livenessRatio) { + // Check the zero address + if (_memeFactory == address(0)) { + revert ZeroAddress(); + } + + // Check for zero value + if (_livenessRatio == 0) { + revert ZeroValue(); + } + + memeFactory = _memeFactory; + livenessRatio = _livenessRatio; + } + + /// @dev Gets service multisig nonces. + /// @param multisig Service multisig address. + /// @return nonces Set of a single service multisig nonce. + function getMultisigNonces(address multisig) external view virtual returns (uint256[] memory nonces) { + nonces = new uint256[](1); + // The nonce is equal to the meme factory contract interaction corresponding to a multisig activity + nonces[0] = IMemeFactory(memeFactory).mapAccountActivities(multisig); + } + + /// @dev Checks if the service multisig liveness ratio passes the defined liveness threshold. + /// @notice The formula for calculating the ratio is the following: + /// currentNonce - service multisig nonce at time now (block.timestamp); + /// lastNonce - service multisig nonce at the previous checkpoint or staking time (tsStart); + /// ratio = (currentNonce - lastNonce) / (block.timestamp - tsStart). + /// @param curNonces Current service multisig set of a single nonce. + /// @param lastNonces Last service multisig set of a single nonce. + /// @param ts Time difference between current and last timestamps. + /// @return ratioPass True, if the liveness ratio passes the check. + function isRatioPass( + uint256[] memory curNonces, + uint256[] memory lastNonces, + uint256 ts + ) external view virtual returns (bool ratioPass) { + // If the checkpoint was called in the exact same block, the ratio is zero + // If the current nonce is not greater than the last nonce, the ratio is zero + if (ts > 0 && curNonces[0] > lastNonces[0]) { + uint256 ratio = ((curNonces[0] - lastNonces[0]) * 1e18) / ts; + ratioPass = (ratio >= livenessRatio); + } + } +} \ No newline at end of file diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index f3a84e5..49938ad 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -60,10 +60,10 @@ abstract contract MemeCelo is MemeFactory { constructor( address _olas, address _referenceToken, - address _wcelo, address _router, address _factory, uint256 _minNativeTokenValue, + address _wcelo, address _l2TokenRelayer, address _oracle ) MemeFactory(_olas, _referenceToken, _router, _factory, _minNativeTokenValue) { diff --git a/scripts/deployment/deploy_01_meme_base.js b/scripts/deployment/deploy_01_meme_base.js index 9bab0d5..e0b6f31 100644 --- a/scripts/deployment/deploy_01_meme_base.js +++ b/scripts/deployment/deploy_01_meme_base.js @@ -44,8 +44,8 @@ async function main() { const MemeBase = await ethers.getContractFactory("MemeBase"); console.log("You are signing the following transaction: MemeBase.connect(EOA).deploy()"); const memeBase = await MemeBase.connect(EOA).deploy(parsedData.olasAddress, parsedData.usdcAddress, - parsedData.wethAddress, parsedData.routerAddress, parsedData.factoryAddress, parsedData.l2StandardBridgeAddress, - parsedData.oracleAddress, parsedData.balancerVaultAddress, parsedData.balancerPoolId); + parsedData.routerAddress, parsedData.factoryAddress, parsedData.minNativeTokenValue, parsedData.wethAddress, + parsedData.l2TokenBridgeAddress, parsedData.oracleAddress, parsedData.balancerVaultAddress, parsedData.balancerPoolId); const result = await memeBase.deployed(); // Transaction details diff --git a/scripts/deployment/deploy_02_meme_celo.js b/scripts/deployment/deploy_02_meme_celo.js new file mode 100644 index 0000000..6a94ef1 --- /dev/null +++ b/scripts/deployment/deploy_02_meme_celo.js @@ -0,0 +1,75 @@ +/*global process*/ + +const { ethers } = require("hardhat"); +const { LedgerSigner } = require("@anders-t/ethers-ledger"); + +async function main() { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + let parsedData = JSON.parse(dataFromJSON); + const useLedger = parsedData.useLedger; + const derivationPath = parsedData.derivationPath; + const providerName = parsedData.providerName; + + let networkURL = parsedData.networkURL; + if (providerName === "polygon") { + if (!process.env.ALCHEMY_API_KEY_MATIC) { + console.log("set ALCHEMY_API_KEY_MATIC env variable"); + } + networkURL += process.env.ALCHEMY_API_KEY_MATIC; + } else if (providerName === "polygonAmoy") { + if (!process.env.ALCHEMY_API_KEY_AMOY) { + console.log("set ALCHEMY_API_KEY_AMOY env variable"); + return; + } + networkURL += process.env.ALCHEMY_API_KEY_AMOY; + } + + const provider = new ethers.providers.JsonRpcProvider(networkURL); + const signers = await ethers.getSigners(); + + let EOA; + if (useLedger) { + EOA = new LedgerSigner(provider, derivationPath); + } else { + EOA = signers[0]; + } + // EOA address + const deployer = await EOA.getAddress(); + console.log("EOA is:", deployer); + + // Transaction signing and execution + console.log("2. EOA to deploy MemeCelo"); + const MemeCelo = await ethers.getContractFactory("MemeCelo"); + console.log("You are signing the following transaction: MemeCelo.connect(EOA).deploy()"); + const memeCelo = await MemeCelo.connect(EOA).deploy(parsedData.olasAddress, parsedData.cusdAddress, + parsedData.routerAddress, parsedData.factoryAddress, parsedData.minNativeTokenValue, parsedData.wceloAddress, + parsedData.l2TokenBridgeAddress, parsedData.oracleAddress); + const result = await memeCelo.deployed(); + + // Transaction details + console.log("Contract deployment: MemeCelo"); + console.log("Contract address:", memeCelo.address); + console.log("Transaction:", result.deployTransaction.hash); + + // Wait for half a minute for the transaction completion + await new Promise(r => setTimeout(r, 30000)); + + // Writing updated parameters back to the JSON file + parsedData.memeCeloAddress = memeCelo.address; + fs.writeFileSync(globalsFile, JSON.stringify(parsedData)); + + // Contract verification + if (parsedData.contractVerification) { + const execSync = require("child_process").execSync; + execSync("npx hardhat verify --constructor-args scripts/deployment/verify_02_meme_celo.js --network " + providerName + " " + memeCelo.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/globals_base_mainnet.json b/scripts/deployment/globals_base_mainnet.json index dc45fe3..39989f1 100644 --- a/scripts/deployment/globals_base_mainnet.json +++ b/scripts/deployment/globals_base_mainnet.json @@ -1 +1 @@ -{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"base","networkURL":"https://mainnet.base.org","gasPriceInGwei":"2","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","usdcAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","wethAddress":"0x4200000000000000000000000000000000000006","routerAddress":"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24","factoryAddress":"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6","l2StandardBridgeAddress":"0x4200000000000000000000000000000000000010","oracleAddress":"0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70","balancerVaultAddress":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","balancerPoolId":"0x5332584890d6e415a6dc910254d6430b8aab7e69000200000000000000000103"} \ No newline at end of file +{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"base","networkURL":"https://mainnet.base.org","gasPriceInGwei":"2","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","usdcAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","wethAddress":"0x4200000000000000000000000000000000000006","routerAddress":"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24","factoryAddress":"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6","l2TokenBridgeAddress":"0x4200000000000000000000000000000000000010","oracleAddress":"0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70","balancerVaultAddress":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","balancerPoolId":"0x5332584890d6e415a6dc910254d6430b8aab7e69000200000000000000000103"} \ No newline at end of file diff --git a/scripts/deployment/globals_base_sepolia.json b/scripts/deployment/globals_base_sepolia.json index 1dfb7dd..5033d5b 100644 --- a/scripts/deployment/globals_base_sepolia.json +++ b/scripts/deployment/globals_base_sepolia.json @@ -1 +1 @@ -{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"baseSepolia","networkURL":"https://sepolia.base.org","gasPriceInGwei":"1","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","usdcAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","wethAddress":"0x4200000000000000000000000000000000000006","routerAddress":"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24","factoryAddress":"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6","l2StandardBridgeAddress":"0x4200000000000000000000000000000000000010","balancerVaultAddress":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","balancerPoolId":"0x5332584890d6e415a6dc910254d6430b8aab7e69000200000000000000000103","oracleAddress":"0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70"} \ No newline at end of file +{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"baseSepolia","networkURL":"https://sepolia.base.org","gasPriceInGwei":"1","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","usdcAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","wethAddress":"0x4200000000000000000000000000000000000006","routerAddress":"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24","factoryAddress":"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6","l2TokenBridgeAddress":"0x4200000000000000000000000000000000000010","balancerVaultAddress":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","balancerPoolId":"0x5332584890d6e415a6dc910254d6430b8aab7e69000200000000000000000103","oracleAddress":"0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70"} \ No newline at end of file diff --git a/scripts/deployment/verify_01_meme_base.js b/scripts/deployment/verify_01_meme_base.js index 36f4bc2..de6751e 100644 --- a/scripts/deployment/verify_01_meme_base.js +++ b/scripts/deployment/verify_01_meme_base.js @@ -9,7 +9,7 @@ module.exports = [ parsedData.wethAddress, parsedData.routerAddress, parsedData.factoryAddress, - parsedData.l2StandardBridgeAddress, + parsedData.l2TokenBridgeAddress, parsedData.oracleAddress, parsedData.balancerVaultAddress, parsedData.balancerPoolId From 0339df3390012034dae8a4590d4eff7f811f1f83 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 11:15:19 +0000 Subject: [PATCH 05/13] chore: activity checker configs --- .../deploy_03_meme_activity_checker.js | 77 +++++++++++++++++++ .../globals_base_mainnet_meme_alpha.json | 42 ++++++++++ .../globals_celo_mainnet_meme_alpha.json | 40 ++++++++++ .../verify_03_meme_activity_checker.js | 11 +++ 4 files changed, 170 insertions(+) create mode 100644 scripts/deployment/deploy_03_meme_activity_checker.js create mode 100644 scripts/deployment/globals_base_mainnet_meme_alpha.json create mode 100644 scripts/deployment/globals_celo_mainnet_meme_alpha.json create mode 100644 scripts/deployment/verify_03_meme_activity_checker.js diff --git a/scripts/deployment/deploy_03_meme_activity_checker.js b/scripts/deployment/deploy_03_meme_activity_checker.js new file mode 100644 index 0000000..681a7c5 --- /dev/null +++ b/scripts/deployment/deploy_03_meme_activity_checker.js @@ -0,0 +1,77 @@ +/*global process*/ + +const { ethers } = require("hardhat"); +const { LedgerSigner } = require("@anders-t/ethers-ledger"); + +async function main() { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + let parsedData = JSON.parse(dataFromJSON); + const useLedger = parsedData.useLedger; + const derivationPath = parsedData.derivationPath; + const providerName = parsedData.providerName; + const gasPriceInGwei = parsedData.gasPriceInGwei; + const memeFactoryAddress = parsedData.memeFactoryAddress; + const livenessRatio = parsedData.livenessRatio; + + let networkURL = parsedData.networkURL; + if (providerName === "polygon") { + if (!process.env.ALCHEMY_API_KEY_MATIC) { + console.log("set ALCHEMY_API_KEY_MATIC env variable"); + } + networkURL += process.env.ALCHEMY_API_KEY_MATIC; + } else if (providerName === "polygonAmoy") { + if (!process.env.ALCHEMY_API_KEY_AMOY) { + console.log("set ALCHEMY_API_KEY_AMOY env variable"); + return; + } + networkURL += process.env.ALCHEMY_API_KEY_AMOY; + } + + const provider = new ethers.providers.JsonRpcProvider(networkURL); + const signers = await ethers.getSigners(); + + let EOA; + if (useLedger) { + EOA = new LedgerSigner(provider, derivationPath); + } else { + EOA = signers[0]; + } + // EOA address + const deployer = await EOA.getAddress(); + console.log("EOA is:", deployer); + + // Transaction signing and execution + console.log("2. EOA to deploy MemeActivityChecker"); + const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); + const MemeActivityChecker = await ethers.getContractFactory("MemeActivityChecker"); + console.log("You are signing the following transaction: MemeActivityChecker.connect(EOA).deploy()"); + const memeActivityChecker = await MemeActivityChecker.connect(EOA).deploy(memeFactoryAddress, + livenessRatio, { gasPrice }); + const result = await memeActivityChecker.deployed(); + + // Transaction details + console.log("Contract deployment: MemeActivityChecker"); + console.log("Contract address:", memeActivityChecker.address); + console.log("Transaction:", result.deployTransaction.hash); + // Wait half a minute for the transaction completion + await new Promise(r => setTimeout(r, 30000)); + + // Writing updated parameters back to the JSON file + parsedData.memeActivityCheckerAddress = memeActivityChecker.address; + fs.writeFileSync(globalsFile, JSON.stringify(parsedData)); + + // Contract verification + if (parsedData.contractVerification) { + const execSync = require("child_process").execSync; + execSync("npx hardhat verify --constructor-args scripts/deployment/verify_03_meme_activity_checker.js --network " + providerName + " " + memeActivityChecker.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/globals_base_mainnet_meme_alpha.json b/scripts/deployment/globals_base_mainnet_meme_alpha.json new file mode 100644 index 0000000..0660223 --- /dev/null +++ b/scripts/deployment/globals_base_mainnet_meme_alpha.json @@ -0,0 +1,42 @@ +{ + "contractVerification":true, + "useLedger":true, + "derivationPath":"m/44'/60'/2'/0/0", + "providerName":"base", + "networkURL":"https://mainnet.base.org", + "gasPriceInGwei":"2", + "bridgeMediatorAddress":"0xE49CB081e8d96920C38aA7AB90cb0294ab4Bc8EA", + "gnosisSafeAddress":"0x69f4D1788e39c87893C980c06EdF4b7f686e2938", + "gnosisSafeProxyFactoryAddress":"0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC", + "fallbackHandlerAddress":"0x017062a1dE2FE6b99BE3d9d37841FeD19F573804", + "olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416", + "multisigProxyHash130":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000", + "serviceRegistryAddress":"0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE", + "serviceRegistryTokenUtilityAddress":"0x34C895f302D0b5cf52ec0Edd3945321EB0f83dd5", + "serviceManagerTokenAddress":"0x63e66d7ad413C01A7b49C7FF4e3Bb765C4E4bd1b", + "gnosisSafeMultisigImplementationAddress":"0xBb7e1D6Cb6F243D6bdE81CE92a9f2aFF7Fbe7eac", + "stakingTokenAddress":"0xEB5638eefE289691EcE01943f768EDBF96258a80", + "stakingFactoryAddress":"0x1cEe30D08943EB58EFF84DD1AB44a6ee6FEff63a", + "memeFactoryAddress":"", + "livenessRatio":"34722222222222", + "memeActivityCheckerAddress":"", + "stakingParams": + { + "metadataHash":"", + "maxNumServices":"100", + "rewardsPerSecond":"4398148148152", + "minStakingDeposit":"50000000000000000000", + "minNumStakingPeriods":"3", + "maxNumInactivityPeriods":"3", + "livenessPeriod":"86400", + "timeForEmissions":"2592000", + "numAgentInstances":"1", + "agentIds":[], + "threshold":"0", + "configHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "proxyHash":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000", + "serviceRegistry":"0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE", + "activityChecker":"" + }, + "stakingTokenInstanceAddress":"" +} \ No newline at end of file diff --git a/scripts/deployment/globals_celo_mainnet_meme_alpha.json b/scripts/deployment/globals_celo_mainnet_meme_alpha.json new file mode 100644 index 0000000..6b9a9c9 --- /dev/null +++ b/scripts/deployment/globals_celo_mainnet_meme_alpha.json @@ -0,0 +1,40 @@ +{ + "contractVerification":true, + "useLedger":true, + "derivationPath":"m/44'/60'/2'/0/0", + "providerName":"celo", + "networkURL":"https://forno.celo.org", + "gasPriceInGwei":"2", + "bridgeMediatorAddress":"0x397125902ED2cA2d42104F621f448A2cE1bC8Fb7", + "gnosisSafeAddress":"0x69f4D1788e39c87893C980c06EdF4b7f686e2938", + "gnosisSafeProxyFactoryAddress":"0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC", + "olasAddress":"0xaCFfAe8e57Ec6E394Eb1b41939A8CF7892DbDc51", + "multisigProxyHash130":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000", + "serviceRegistryAddress":"0xE3607b00E75f6405248323A9417ff6b39B244b50", + "serviceRegistryTokenUtilityAddress":"0x3d77596beb0f130a4415df3D2D8232B3d3D31e44", + "serviceManagerTokenAddress":"0x34C895f302D0b5cf52ec0Edd3945321EB0f83dd5", + "stakingTokenAddress":"0xe1E1B286EbE95b39F785d8069f2248ae9C41b7a9", + "stakingFactoryAddress":"0x1c2cD884127b080F940b7546c1e9aaf525b1FA55", + "memeFactoryAddress":"", + "livenessRatio":"34722222222222", + "memeActivityCheckerAddress":"", + "stakingParams": + { + "metadataHash":"", + "maxNumServices":"100", + "rewardsPerSecond":"4398148148152", + "minStakingDeposit":"50000000000000000000", + "minNumStakingPeriods":"3", + "maxNumInactivityPeriods":"3", + "livenessPeriod":"86400", + "timeForEmissions":"2592000", + "numAgentInstances":"1", + "agentIds":[], + "threshold":"0", + "configHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "proxyHash":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000", + "serviceRegistry":"0xE3607b00E75f6405248323A9417ff6b39B244b50", + "activityChecker":"" + }, + "stakingTokenInstanceAddress":"" +} \ No newline at end of file diff --git a/scripts/deployment/verify_03_meme_activity_checker.js b/scripts/deployment/verify_03_meme_activity_checker.js new file mode 100644 index 0000000..1e6ef38 --- /dev/null +++ b/scripts/deployment/verify_03_meme_activity_checker.js @@ -0,0 +1,11 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); +const memeFactoryAddress = parsedData.memeFactoryAddress; +const livenessRatio = parsedData.livenessRatio; + +module.exports = [ + memeFactoryAddress, + livenessRatio +]; \ No newline at end of file From 114a4cdfba5773d4bae467fd50c9fa41df856e8e Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 12:36:17 +0000 Subject: [PATCH 06/13] refactor and chore: code refactor and scripts --- abis/0.8.28/MemeBase.json | 85 ++- abis/0.8.28/MemeCelo.json | 683 +++++++++++++++++++ contracts/MemeBase.sol | 4 +- contracts/MemeCelo.sol | 49 +- scripts/deployment/deploy_02_meme_celo.js | 2 +- scripts/deployment/globals_base_mainnet.json | 2 +- scripts/deployment/globals_celo_mainnet.json | 1 + scripts/deployment/verify_01_meme_base.js | 3 +- scripts/deployment/verify_02_meme_celo.js | 15 + 9 files changed, 789 insertions(+), 55 deletions(-) create mode 100644 abis/0.8.28/MemeCelo.json create mode 100644 scripts/deployment/globals_celo_mainnet.json create mode 100644 scripts/deployment/verify_02_meme_celo.js diff --git a/abis/0.8.28/MemeBase.json b/abis/0.8.28/MemeBase.json index 863e3d4..b8f7c5f 100644 --- a/abis/0.8.28/MemeBase.json +++ b/abis/0.8.28/MemeBase.json @@ -17,17 +17,22 @@ }, { "internalType": "address", - "name": "_weth", + "name": "_router", "type": "address" }, { "internalType": "address", - "name": "_router", + "name": "_factory", "type": "address" }, + { + "internalType": "uint256", + "name": "_minNativeTokenValue", + "type": "uint256" + }, { "internalType": "address", - "name": "_factory", + "name": "_weth", "type": "address" }, { @@ -160,7 +165,7 @@ { "indexed": false, "internalType": "uint256", - "name": "ethContributed", + "name": "nativeTokenContributed", "type": "uint256" } ], @@ -197,7 +202,7 @@ { "indexed": false, "internalType": "uint256", - "name": "burnPercentageOfUSDC", + "name": "burnPercentageOfStable", "type": "uint256" } ], @@ -243,19 +248,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "MIN_ETH_VALUE", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "MIN_TOTAL_SUPPLY", @@ -480,7 +472,7 @@ "outputs": [ { "internalType": "uint256", - "name": "ethContributed", + "name": "nativeTokenContributed", "type": "uint256" }, { @@ -521,6 +513,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "minNativeTokenValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "numTokens", @@ -573,6 +578,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "referenceToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "router", @@ -597,11 +615,16 @@ "internalType": "uint256", "name": "tokenGasLimit", "type": "uint256" + }, + { + "internalType": "bytes", + "name": "bridgePayload", + "type": "bytes" } ], "name": "scheduleOLASForAscendance", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { @@ -646,6 +669,11 @@ "internalType": "address", "name": "memeToken", "type": "address" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" } ], "name": "unleashThisMeme", @@ -653,19 +681,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "usdc", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "weth", @@ -684,8 +699,8 @@ "type": "receive" } ], - "bytecode": "0x6101a0604052348015610010575f5ffd5b50604051613d94380380613d9483398101604081905261002f9161008d565b6001600160a01b0398891660a05296881660c05294871660e052928616610100529085166101205284166101405283166101605290911661018052608052610128565b80516001600160a01b0381168114610088575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f6101208a8c0312156100a6575f5ffd5b6100af8a610072565b98506100bd60208b01610072565b97506100cb60408b01610072565b96506100d960608b01610072565b95506100e760808b01610072565b94506100f560a08b01610072565b935061010360c08b01610072565b925061011160e08b01610072565b91506101008a015190509295985092959850929598565b60805160a05160c05160e0516101005161012051610140516101605161018051613b6d6102275f395f81816102dc0152818161156c015261172d01525f81816104af0152611b7a01525f8181610530015281816117f2015261196501525f818161058b0152611dfe01525f818161068f01528181611ca601528181611ea501528181611f81015261208f01525f81816103d00152611a9e01525f818161039d0152818161159d0152818161165701528181611b0b01528181611dca01528181611ed7015261203801525f81816101f90152818161167e01528181611821015281816119920152611a0501525f818161060701526116160152613b6d5ff3fe6080604052600436106101dd575f3560e01c80637dc0d1d0116100fd578063c694067211610092578063f74e481b11610062578063f74e481b14610629578063f76c603714610648578063f887ea401461067e578063ffa1ad74146106b1575f5ffd5b8063c6940672146105ad578063d1b0c288146105cc578063dab346ff146105e2578063dbbb64b9146105f6575f5ffd5b8063a7be1b50116100cd578063a7be1b501461051f578063b1bd3c9514610552578063be399e2b14610565578063c45a01551461057a575f5ffd5b80637dc0d1d01461049e5780638b9ee610146104d15780638e499bcf146104f85780639823bb131461050c575f5ffd5b80633d0cc37511610173578063466ffbce11610143578063466ffbce1461041d5780634c1c6cbf1461043c5780635122c409146104675780636c00857b14610484575f5ffd5b80633d0cc3751461036d5780633e413bee1461038c5780633fc8cef3146103bf57806340b67a9b146103f2575f5ffd5b80632e0f2625116101ae5780632e0f2625146102fe57806334e74a051461032457806335f9f8d91461034557806336b4134a14610359575f5ffd5b806231d115146101e85780630a42f8bd1461024557806314c7312b14610269578063158274a5146102cb575f5ffd5b366101e457005b5f5ffd5b3480156101f3575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610250575f5ffd5b5061025b6202a30081565b60405190815260200161023c565b348015610274575f5ffd5b506102ab61028336600461225e565b600260208190525f918252604090912080546001820154928201546003909201549092919084565b60408051948552602085019390935291830152606082015260800161023c565b3480156102d6575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610309575f5ffd5b50610312601281565b60405160ff909116815260200161023c565b34801561032f575f5ffd5b5061034361033e366004612280565b610706565b005b348015610350575f5ffd5b5061025b603281565b348015610364575f5ffd5b5061025b606181565b348015610378575f5ffd5b5061034361038736600461225e565b6107b7565b348015610397575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ca575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103fd575f5ffd5b5061025b61040c36600461225e565b60046020525f908152604090205481565b348015610428575f5ffd5b5061021b6104373660046122a0565b610b25565b348015610447575f5ffd5b50610452620493e081565b60405163ffffffff909116815260200161023c565b348015610472575f5ffd5b5061025b69d3c21bcecceda100000081565b34801561048f575f5ffd5b5061025b662386f26fc1000081565b3480156104a9575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dc575f5ffd5b5061021b7351eb65012ca5ceb07320c497f4151ac207fea4e081565b348015610503575f5ffd5b5061025b5f5481565b61034361051a36600461225e565b610b5a565b34801561052a575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b6103436105603660046123bd565b610da8565b348015610570575f5ffd5b5061025b60015481565b348015610585575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b8575f5ffd5b506103436105c736600461225e565b611031565b3480156105d7575f5ffd5b5061025b6201518081565b3480156105ed575f5ffd5b5061025b600a81565b348015610601575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610634575f5ffd5b5061034361064336600461225e565b611308565b348015610653575f5ffd5b5061025b61066236600461242b565b600360209081525f928352604080842090915290825290205481565b348015610689575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106bc575f5ffd5b506106f96040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023c91906124ae565b5f60015411610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e000000000000000000000000000000000060448201526064015b60405180910390fd5b335f908152600460205260408120805491610790836124ed565b91905055505f6107a26001548461152f565b5f60015590506107b281836117b5565b505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526002602081815260409283902083516080810185528154815260018201549281018390529281015493830193909352600390920154606082015290610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161076d565b6202a30081602001516108869190612524565b4211610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161076d565b335f90815260046020526040812080549161092e836124ed565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561099f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c39190612537565b90505f8111610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161076d565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610ab9575f5ffd5b505af1158015610acb573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610b1791815260200190565b60405180910390a250505050565b60058181548110610b34575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f3411610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45544820616d6f756e74206d7573742062652067726561746572207468616e2060448201527f7a65726f00000000000000000000000000000000000000000000000000000000606482015260840161076d565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600260205260409020805480610c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161076d565b600282015415610ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161076d565b610ceb3482612524565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600360209081526040808320338452909152812080549293503492909190610d32908490612524565b9091555050335f908152600460205260408120805491610d51836124ed565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b662386f26fc10000341015610e3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d696e696d756d204554482076616c756520697320726571756972656420746f60448201527f2073756d6d6f6e00000000000000000000000000000000000000000000000000606482015260840161076d565b69d3c21bcecceda1000000811015610eb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161076d565b5f8383601284604051610ec59061222d565b610ed2949392919061254e565b604051809103905ff080158015610eeb573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260028086528985209851895595516001808a0191909155925195880195909555516003968701559482528581203382528252858120939093556005805494850181557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090940180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091559154815560049091529081208054929350839291610fd8836124ed565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a35050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600260205260409020805460018201546110c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161076d565b6201518082600101546110d59190612524565b42101561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161076d565b5f61114882611a78565b90505f6064611158600a84612589565b61116291906125a0565b90508060015f8282546111759190612524565b90915550611185905081836125d8565b91505f8590505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f99190612537565b90505f6064611209603284612589565b61121391906125a0565b90505f61122082846125d8565b90505f5f61122f8b8986611d8d565b4260028d015560038c01859055335f908152600460205260408120805493955091935061125b836124ed565b909155505073ffffffffffffffffffffffffffffffffffffffff8b165f90815260036020908152604080832033845290915290205480156112a2576112a28c82868d612108565b60408051838152602081018a905273ffffffffffffffffffffffffffffffffffffffff80861692908f169133917fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768910160405180910390a4505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260026020818152604092839020835160808101855281548152600182015492810192909252918201549281018390526003909101546060820152906113c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161076d565b6202a30081602001516113d79190612524565b421115611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161076d565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360209081526040808320338452909152902054806114fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161076d565b335f908152600460205260408120805491611517836124ed565b91905055506107b283828460600151855f0151612108565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156115e5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160991906125eb565b506040805160c0810182527f000000000000000000000000000000000000000000000000000000000000000081525f602080830182905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116848601527f0000000000000000000000000000000000000000000000000000000000000000811660608086019190915260808086018a905286518088018852600281527f30780000000000000000000000000000000000000000000000000000000000008186015260a087015286519081018752308082529381018590528087019390935282019290925292517f52bbbe290000000000000000000000000000000000000000000000000000000081529192917f0000000000000000000000000000000000000000000000000000000000000000909116906352bbbe299061176a90859085908990429060040161260a565b6020604051808303815f875af1158015611786573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117aa9190612537565b925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015611867573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188b91906125eb565b50620493e081101561189d5750620493e05b5f826040516024016118b191815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c6800000000000000000000000000000000000000000000000000000000179052517fa3a7954800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3a79548906119d6907f0000000000000000000000000000000000000000000000000000000000000000907351eb65012ca5ceb07320c497f4151ac207fea4e090889088908890600401612739565b5f604051808303815f87803b1580156119ed575f5ffd5b505af11580156119ff573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e84604051611a6b91815260200190565b60405180910390a2505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611acf57611acf6127a0565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611b3d57611b3d6127a0565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611be2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0691906127eb565b5050509150505f8113611c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161076d565b5f69021e19e0c9bab24000006061611c8d8785612589565b611c979190612589565b611ca191906125a0565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab587848730426040518663ffffffff1660e01b8152600401611d049493929190612839565b5f6040518083038185885af1158015611d1f573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611d6591908101906128bc565b905080600181518110611d7a57611d7a6127a0565b6020026020010151945050505050919050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af1158015611e44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e68919061295d565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611f1f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4391906125eb565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af1158015611fd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffa91906125eb565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af11580156120d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fa9190612978565b939793965092945050505050565b835f826121158587612589565b61211f91906125a0565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526003602090815260408083203380855292528083209290925590517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af11580156121b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d791906125eb565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b611194806129a483390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461225b575f5ffd5b50565b5f6020828403121561226e575f5ffd5b81356122798161223a565b9392505050565b5f5f60408385031215612291575f5ffd5b50508035926020909101359150565b5f602082840312156122b0575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561232b5761232b6122b7565b604052919050565b5f82601f830112612342575f5ffd5b813567ffffffffffffffff81111561235c5761235c6122b7565b61238d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016122e4565b8181528460208386010111156123a1575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f606084860312156123cf575f5ffd5b833567ffffffffffffffff8111156123e5575f5ffd5b6123f186828701612333565b935050602084013567ffffffffffffffff81111561240d575f5ffd5b61241986828701612333565b93969395505050506040919091013590565b5f5f6040838503121561243c575f5ffd5b82356124478161223a565b915060208301356124578161223a565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6122796020830184612462565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361251d5761251d6124c0565b5060010190565b808201808211156117af576117af6124c0565b5f60208284031215612547575f5ffd5b5051919050565b608081525f6125606080830187612462565b82810360208401526125728187612462565b60ff95909516604084015250506060015292915050565b80820281158282048414176117af576117af6124c0565b5f826125d3577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b818103818111156117af576117af6124c0565b5f602082840312156125fb575f5ffd5b81518015158114612279575f5ffd5b60e08152845160e08201525f602086015160028110612650577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610100830152604086015173ffffffffffffffffffffffffffffffffffffffff16610120830152606086015161269f61014084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608086015161016083015260a086015160c06101808401526126c66101a0840182612462565b915050612727602083018673ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526060810151151560608301525050565b60a082019390935260c0015292915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015263ffffffff8316606082015260a060808201525f61279560a0830184612462565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805169ffffffffffffffffffff811681146127e6575f5ffd5b919050565b5f5f5f5f5f60a086880312156127ff575f5ffd5b612808866127cd565b6020870151604088015160608901519297509095509350915061282d608087016127cd565b90509295509295909350565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b8181101561289057835173ffffffffffffffffffffffffffffffffffffffff1683526020938401939092019160010161285c565b505073ffffffffffffffffffffffffffffffffffffffff95909516604084015250506060015292915050565b5f602082840312156128cc575f5ffd5b815167ffffffffffffffff8111156128e2575f5ffd5b8201601f810184136128f2575f5ffd5b805167ffffffffffffffff81111561290c5761290c6122b7565b8060051b61291c602082016122e4565b91825260208184018101929081019087841115612937575f5ffd5b6020850194505b838510156127955784518083526020958601959093509091019061293e565b5f6020828403121561296d575f5ffd5b81516122798161223a565b5f5f5f6060848603121561298a575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a26469706673582212205dd01b65e45960b1fb062dc5a34dc1d00da63bd8aa41a7ff236e9b2fe1faf76a64736f6c634300081c0033", - "deployedBytecode": "0x6080604052600436106101dd575f3560e01c80637dc0d1d0116100fd578063c694067211610092578063f74e481b11610062578063f74e481b14610629578063f76c603714610648578063f887ea401461067e578063ffa1ad74146106b1575f5ffd5b8063c6940672146105ad578063d1b0c288146105cc578063dab346ff146105e2578063dbbb64b9146105f6575f5ffd5b8063a7be1b50116100cd578063a7be1b501461051f578063b1bd3c9514610552578063be399e2b14610565578063c45a01551461057a575f5ffd5b80637dc0d1d01461049e5780638b9ee610146104d15780638e499bcf146104f85780639823bb131461050c575f5ffd5b80633d0cc37511610173578063466ffbce11610143578063466ffbce1461041d5780634c1c6cbf1461043c5780635122c409146104675780636c00857b14610484575f5ffd5b80633d0cc3751461036d5780633e413bee1461038c5780633fc8cef3146103bf57806340b67a9b146103f2575f5ffd5b80632e0f2625116101ae5780632e0f2625146102fe57806334e74a051461032457806335f9f8d91461034557806336b4134a14610359575f5ffd5b806231d115146101e85780630a42f8bd1461024557806314c7312b14610269578063158274a5146102cb575f5ffd5b366101e457005b5f5ffd5b3480156101f3575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610250575f5ffd5b5061025b6202a30081565b60405190815260200161023c565b348015610274575f5ffd5b506102ab61028336600461225e565b600260208190525f918252604090912080546001820154928201546003909201549092919084565b60408051948552602085019390935291830152606082015260800161023c565b3480156102d6575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610309575f5ffd5b50610312601281565b60405160ff909116815260200161023c565b34801561032f575f5ffd5b5061034361033e366004612280565b610706565b005b348015610350575f5ffd5b5061025b603281565b348015610364575f5ffd5b5061025b606181565b348015610378575f5ffd5b5061034361038736600461225e565b6107b7565b348015610397575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ca575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103fd575f5ffd5b5061025b61040c36600461225e565b60046020525f908152604090205481565b348015610428575f5ffd5b5061021b6104373660046122a0565b610b25565b348015610447575f5ffd5b50610452620493e081565b60405163ffffffff909116815260200161023c565b348015610472575f5ffd5b5061025b69d3c21bcecceda100000081565b34801561048f575f5ffd5b5061025b662386f26fc1000081565b3480156104a9575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dc575f5ffd5b5061021b7351eb65012ca5ceb07320c497f4151ac207fea4e081565b348015610503575f5ffd5b5061025b5f5481565b61034361051a36600461225e565b610b5a565b34801561052a575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b6103436105603660046123bd565b610da8565b348015610570575f5ffd5b5061025b60015481565b348015610585575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b8575f5ffd5b506103436105c736600461225e565b611031565b3480156105d7575f5ffd5b5061025b6201518081565b3480156105ed575f5ffd5b5061025b600a81565b348015610601575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610634575f5ffd5b5061034361064336600461225e565b611308565b348015610653575f5ffd5b5061025b61066236600461242b565b600360209081525f928352604080842090915290825290205481565b348015610689575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106bc575f5ffd5b506106f96040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023c91906124ae565b5f60015411610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e000000000000000000000000000000000060448201526064015b60405180910390fd5b335f908152600460205260408120805491610790836124ed565b91905055505f6107a26001548461152f565b5f60015590506107b281836117b5565b505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526002602081815260409283902083516080810185528154815260018201549281018390529281015493830193909352600390920154606082015290610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161076d565b6202a30081602001516108869190612524565b4211610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161076d565b335f90815260046020526040812080549161092e836124ed565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561099f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c39190612537565b90505f8111610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161076d565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610ab9575f5ffd5b505af1158015610acb573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610b1791815260200190565b60405180910390a250505050565b60058181548110610b34575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f3411610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45544820616d6f756e74206d7573742062652067726561746572207468616e2060448201527f7a65726f00000000000000000000000000000000000000000000000000000000606482015260840161076d565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600260205260409020805480610c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161076d565b600282015415610ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161076d565b610ceb3482612524565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600360209081526040808320338452909152812080549293503492909190610d32908490612524565b9091555050335f908152600460205260408120805491610d51836124ed565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b662386f26fc10000341015610e3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d696e696d756d204554482076616c756520697320726571756972656420746f60448201527f2073756d6d6f6e00000000000000000000000000000000000000000000000000606482015260840161076d565b69d3c21bcecceda1000000811015610eb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161076d565b5f8383601284604051610ec59061222d565b610ed2949392919061254e565b604051809103905ff080158015610eeb573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260028086528985209851895595516001808a0191909155925195880195909555516003968701559482528581203382528252858120939093556005805494850181557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090940180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091559154815560049091529081208054929350839291610fd8836124ed565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a35050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600260205260409020805460018201546110c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161076d565b6201518082600101546110d59190612524565b42101561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161076d565b5f61114882611a78565b90505f6064611158600a84612589565b61116291906125a0565b90508060015f8282546111759190612524565b90915550611185905081836125d8565b91505f8590505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f99190612537565b90505f6064611209603284612589565b61121391906125a0565b90505f61122082846125d8565b90505f5f61122f8b8986611d8d565b4260028d015560038c01859055335f908152600460205260408120805493955091935061125b836124ed565b909155505073ffffffffffffffffffffffffffffffffffffffff8b165f90815260036020908152604080832033845290915290205480156112a2576112a28c82868d612108565b60408051838152602081018a905273ffffffffffffffffffffffffffffffffffffffff80861692908f169133917fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768910160405180910390a4505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260026020818152604092839020835160808101855281548152600182015492810192909252918201549281018390526003909101546060820152906113c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161076d565b6202a30081602001516113d79190612524565b421115611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161076d565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360209081526040808320338452909152902054806114fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161076d565b335f908152600460205260408120805491611517836124ed565b91905055506107b283828460600151855f0151612108565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156115e5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160991906125eb565b506040805160c0810182527f000000000000000000000000000000000000000000000000000000000000000081525f602080830182905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116848601527f0000000000000000000000000000000000000000000000000000000000000000811660608086019190915260808086018a905286518088018852600281527f30780000000000000000000000000000000000000000000000000000000000008186015260a087015286519081018752308082529381018590528087019390935282019290925292517f52bbbe290000000000000000000000000000000000000000000000000000000081529192917f0000000000000000000000000000000000000000000000000000000000000000909116906352bbbe299061176a90859085908990429060040161260a565b6020604051808303815f875af1158015611786573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117aa9190612537565b925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015611867573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188b91906125eb565b50620493e081101561189d5750620493e05b5f826040516024016118b191815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c6800000000000000000000000000000000000000000000000000000000179052517fa3a7954800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3a79548906119d6907f0000000000000000000000000000000000000000000000000000000000000000907351eb65012ca5ceb07320c497f4151ac207fea4e090889088908890600401612739565b5f604051808303815f87803b1580156119ed575f5ffd5b505af11580156119ff573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e84604051611a6b91815260200190565b60405180910390a2505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611acf57611acf6127a0565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611b3d57611b3d6127a0565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611be2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0691906127eb565b5050509150505f8113611c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161076d565b5f69021e19e0c9bab24000006061611c8d8785612589565b611c979190612589565b611ca191906125a0565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab587848730426040518663ffffffff1660e01b8152600401611d049493929190612839565b5f6040518083038185885af1158015611d1f573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611d6591908101906128bc565b905080600181518110611d7a57611d7a6127a0565b6020026020010151945050505050919050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af1158015611e44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e68919061295d565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611f1f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4391906125eb565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af1158015611fd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffa91906125eb565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af11580156120d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fa9190612978565b939793965092945050505050565b835f826121158587612589565b61211f91906125a0565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526003602090815260408083203380855292528083209290925590517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af11580156121b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d791906125eb565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b611194806129a483390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461225b575f5ffd5b50565b5f6020828403121561226e575f5ffd5b81356122798161223a565b9392505050565b5f5f60408385031215612291575f5ffd5b50508035926020909101359150565b5f602082840312156122b0575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561232b5761232b6122b7565b604052919050565b5f82601f830112612342575f5ffd5b813567ffffffffffffffff81111561235c5761235c6122b7565b61238d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016122e4565b8181528460208386010111156123a1575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f606084860312156123cf575f5ffd5b833567ffffffffffffffff8111156123e5575f5ffd5b6123f186828701612333565b935050602084013567ffffffffffffffff81111561240d575f5ffd5b61241986828701612333565b93969395505050506040919091013590565b5f5f6040838503121561243c575f5ffd5b82356124478161223a565b915060208301356124578161223a565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6122796020830184612462565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361251d5761251d6124c0565b5060010190565b808201808211156117af576117af6124c0565b5f60208284031215612547575f5ffd5b5051919050565b608081525f6125606080830187612462565b82810360208401526125728187612462565b60ff95909516604084015250506060015292915050565b80820281158282048414176117af576117af6124c0565b5f826125d3577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b818103818111156117af576117af6124c0565b5f602082840312156125fb575f5ffd5b81518015158114612279575f5ffd5b60e08152845160e08201525f602086015160028110612650577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610100830152604086015173ffffffffffffffffffffffffffffffffffffffff16610120830152606086015161269f61014084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608086015161016083015260a086015160c06101808401526126c66101a0840182612462565b915050612727602083018673ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526060810151151560608301525050565b60a082019390935260c0015292915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015263ffffffff8316606082015260a060808201525f61279560a0830184612462565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805169ffffffffffffffffffff811681146127e6575f5ffd5b919050565b5f5f5f5f5f60a086880312156127ff575f5ffd5b612808866127cd565b6020870151604088015160608901519297509095509350915061282d608087016127cd565b90509295509295909350565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b8181101561289057835173ffffffffffffffffffffffffffffffffffffffff1683526020938401939092019160010161285c565b505073ffffffffffffffffffffffffffffffffffffffff95909516604084015250506060015292915050565b5f602082840312156128cc575f5ffd5b815167ffffffffffffffff8111156128e2575f5ffd5b8201601f810184136128f2575f5ffd5b805167ffffffffffffffff81111561290c5761290c6122b7565b8060051b61291c602082016122e4565b91825260208184018101929081019087841115612937575f5ffd5b6020850194505b838510156127955784518083526020958601959093509091019061293e565b5f6020828403121561296d575f5ffd5b81516122798161223a565b5f5f5f6060848603121561298a575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a26469706673582212205dd01b65e45960b1fb062dc5a34dc1d00da63bd8aa41a7ff236e9b2fe1faf76a64736f6c634300081c0033", + "bytecode": "0x6101c06040526001600255348015610015575f5ffd5b506040516140f53803806140f583398101604081905261003491610098565b6001600160a01b03998a1660a05297891660c05295881660e05293871661010052608092909252851661012052841661014052831661016052909116610180526101a05261013e565b80516001600160a01b0381168114610093575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d0312156100b2575f5ffd5b6100bb8b61007d565b99506100c960208c0161007d565b98506100d760408c0161007d565b97506100e560608c0161007d565b965060808b015195506100fa60a08c0161007d565b945061010860c08c0161007d565b935061011660e08c0161007d565b92506101256101008c0161007d565b91506101208b015190509295989b9194979a5092959850565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613ea761024e5f395f818161061401526118d201525f818161030f0152818161182801526119e901525f81816104890152611e4001525f818161053d01528181611aae0152611c2601525f81816103b10152611d6401525f818161059801526120c501525f818161069c01528181611f6c0152818161216c01528181612248015261235601525f818161027a015281816118590152818161191301528181611dd1015281816120910152818161219e01526122ff01525f81816101f90152818161193a01528181611adf01528181611c530152611cc601525f818161050a0152610ee70152613ea75ff3fe6080604052600436106101dd575f3560e01c80638b9ee610116100fd578063cf4ffb7e11610092578063f74e481b11610062578063f74e481b14610636578063f76c603714610655578063f887ea401461068b578063ffa1ad74146106be575f5ffd5b8063cf4ffb7e146105ba578063d1b0c288146105d9578063dab346ff146105ef578063dbbb64b914610603575f5ffd5b8063a7be1b50116100cd578063a7be1b501461052c578063b1bd3c951461055f578063be399e2b14610572578063c45a015514610587575f5ffd5b80638b9ee610146104ab5780638e499bcf146104d25780639823bb13146104e6578063a5ae390c146104f9575f5ffd5b80633d0cc375116101735780634c1c6cbf116101435780634c1c6cbf1461041d5780635122c40914610448578063709a5c9c146104655780637dc0d1d014610478575f5ffd5b80633d0cc3751461037f5780633fc8cef3146103a057806340b67a9b146103d3578063466ffbce146103fe575f5ffd5b8063158274a5116101ae578063158274a5146102fe5780632e0f26251461033157806335f9f8d91461035757806336b4134a1461036b575f5ffd5b806231d115146101e85780630a42f8bd146102455780631265b6511461026957806314c7312b1461029c575f5ffd5b366101e457005b5f5ffd5b3480156101f3575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610250575f5ffd5b5061025b6202a30081565b60405190815260200161023c565b348015610274575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a7575f5ffd5b506102de6102b6366004612524565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b60408051948552602085019390935291830152606082015260800161023c565b348015610309575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033c575f5ffd5b50610345601281565b60405160ff909116815260200161023c565b348015610362575f5ffd5b5061025b603281565b348015610376575f5ffd5b5061025b606181565b34801561038a575f5ffd5b5061039e610399366004612524565b610713565b005b3480156103ab575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103de575f5ffd5b5061025b6103ed366004612524565b60056020525f908152604090205481565b348015610409575f5ffd5b5061021b610418366004612546565b610af5565b348015610428575f5ffd5b50610433620493e081565b60405163ffffffff909116815260200161023c565b348015610453575f5ffd5b5061025b69d3c21bcecceda100000081565b61039e610473366004612650565b610b2a565b348015610483575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b6575f5ffd5b5061021b7351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104dd575f5ffd5b5061025b5f5481565b61039e6104f4366004612524565b610c96565b348015610504575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610537575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b61039e61056d3660046126cd565b610ee5565b34801561057d575f5ffd5b5061025b60015481565b348015610592575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c5575f5ffd5b5061039e6105d436600461273b565b6111d6565b3480156105e4575f5ffd5b5061025b6201518081565b3480156105fa575f5ffd5b5061025b600a81565b34801561060e575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610641575f5ffd5b5061039e610650366004612524565b61154f565b348015610660575f5ffd5b5061025b61066f366004612765565b600460209081525f928352604080842090915290825290205481565b348015610696575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c9575f5ffd5b506107066040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023c91906127e8565b600254600114610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6202a30081602001516108519190612827565b42116108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161077b565b335f9081526005602052604081208054916108f98361283a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561096a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098e9190612871565b90505f8111610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161077b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a84575f5ffd5b505af1158015610a96573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ae291815260200190565b60405180910390a2505060016002555050565b60068181548110610b04575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b5f60015411610c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161077b565b335f908152600560205260408120805491610c1b8361283a565b91905055505f610c2d600154856117eb565b5f6001819055909150610c41828585611a71565b90508015610c8f57604051329082905f81818185875af1925050503d805f8114610c86576040519150601f19603f3d011682016040523d82523d5f602084013e610c8b565b606091505b5050505b5050505050565b5f3411610d25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161077b565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161077b565b610e283482612827565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e6f908490612827565b9091555050335f908152600560205260408120805491610e8e8361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b69d3c21bcecceda1000000811015611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161077b565b5f838360128460405161101b906124f3565b6110289493929190612888565b604051809103905ff080158015611041573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916111308361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260409020805460018201546112d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6201518082600101546112e69190612827565b42101561134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161077b565b5f61135a8285611d3e565b90505f606461136a600a846128c3565b61137491906128da565b90508060015f8282546113879190612827565b9091555061139790508183612912565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140b9190612871565b90505f606461141b6032846128c3565b61142591906128da565b90505f6114328284612912565b90505f5f6114418c8986612054565b4260028d015560038c01859055335f908152600560205260408120805493955091935061146d8361283a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f90815260046020908152604080832033845290915290205480156114b4576114b48d82868d6123cf565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611533929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161077b565b6202a30081602001516116899190612827565b421115611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600460209081526040808320338452909152902054806117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161077b565b335f9081526005602052604081208054916117c98361283a565b91905055506117e183828460600151855f01516123cf565b5050600160025550565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156118a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c59190612925565b506040805160c0810182527f000000000000000000000000000000000000000000000000000000000000000081525f602080830182905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116848601527f0000000000000000000000000000000000000000000000000000000000000000811660608086019190915260808086018a905286518088018852600281527f30780000000000000000000000000000000000000000000000000000000000008186015260a087015286519081018752308082529381018590528087019390935282019290925292517f52bbbe290000000000000000000000000000000000000000000000000000000081529192917f0000000000000000000000000000000000000000000000000000000000000000909116906352bbbe2990611a26908590859089904290600401612944565b6020604051808303815f875af1158015611a42573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a669190612871565b925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612925565b50620493e0831015611b5e57620493e092505b5f84604051602401611b7291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c6800000000000000000000000000000000000000000000000000000000179052517fa3a7954800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3a7954890611c97907f0000000000000000000000000000000000000000000000000000000000000000907351eb65012ca5ceb07320c497f4151ac207fea4e0908a908a908890600401612a73565b5f604051808303815f87803b158015611cae575f5ffd5b505af1158015611cc0573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e86604051611d2c91815260200190565b60405180910390a25034949350505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d9557611d95612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611e0357611e03612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611ea8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ecc9190612b25565b5050509150505f8113611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161077b565b5f69021e19e0c9bab24000006061611f5388856128c3565b611f5d91906128c3565b611f6791906128da565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab588848730426040518663ffffffff1660e01b8152600401611fca9493929190612b73565b5f6040518083038185885af1158015611fe5573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261202b9190810190612bf6565b90508060018151811061204057612040612ada565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af115801561210b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212f9190612c97565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156121e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220a9190612925565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561229d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c19190612925565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561239d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c19190612cb2565b939793965092945050505050565b835f826123dc85876128c3565b6123e691906128da565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612479573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249d9190612925565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612cde83390190565b73ffffffffffffffffffffffffffffffffffffffff81168114612521575f5ffd5b50565b5f60208284031215612534575f5ffd5b813561253f81612500565b9392505050565b5f60208284031215612556575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d1576125d161255d565b604052919050565b5f5f67ffffffffffffffff8411156125f3576125f361255d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126268161258a565b91505082815283838301111561263a575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f60608486031215612662575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612686575f5ffd5b8401601f81018613612696575f5ffd5b6126a5868235602084016125d9565b9150509250925092565b5f82601f8301126126be575f5ffd5b61253f838335602085016125d9565b5f5f5f606084860312156126df575f5ffd5b833567ffffffffffffffff8111156126f5575f5ffd5b612701868287016126af565b935050602084013567ffffffffffffffff81111561271d575f5ffd5b612729868287016126af565b93969395505050506040919091013590565b5f5f6040838503121561274c575f5ffd5b823561275781612500565b946020939093013593505050565b5f5f60408385031215612776575f5ffd5b823561278181612500565b9150602083013561279181612500565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61253f602083018461279c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611a6b57611a6b6127fa565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361286a5761286a6127fa565b5060010190565b5f60208284031215612881575f5ffd5b5051919050565b608081525f61289a608083018761279c565b82810360208401526128ac818761279c565b60ff95909516604084015250506060015292915050565b8082028115828204841417611a6b57611a6b6127fa565b5f8261290d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611a6b57611a6b6127fa565b5f60208284031215612935575f5ffd5b8151801515811461253f575f5ffd5b60e08152845160e08201525f60208601516002811061298a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610100830152604086015173ffffffffffffffffffffffffffffffffffffffff1661012083015260608601516129d961014084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608086015161016083015260a086015160c0610180840152612a006101a084018261279c565b915050612a61602083018673ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526060810151151560608301525050565b60a082019390935260c0015292915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015263ffffffff8316606082015260a060808201525f612acf60a083018461279c565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805169ffffffffffffffffffff81168114612b20575f5ffd5b919050565b5f5f5f5f5f60a08688031215612b39575f5ffd5b612b4286612b07565b60208701516040880151606089015192975090955093509150612b6760808701612b07565b90509295509295909350565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b81811015612bca57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612b96565b505073ffffffffffffffffffffffffffffffffffffffff95909516604084015250506060015292915050565b5f60208284031215612c06575f5ffd5b815167ffffffffffffffff811115612c1c575f5ffd5b8201601f81018413612c2c575f5ffd5b805167ffffffffffffffff811115612c4657612c4661255d565b8060051b612c566020820161258a565b91825260208184018101929081019087841115612c71575f5ffd5b6020850194505b83851015612acf57845180835260209586019590935090910190612c78565b5f60208284031215612ca7575f5ffd5b815161253f81612500565b5f5f5f60608486031215612cc4575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a26469706673582212205a44da7098040048e8e75c152df7966b2da848ba8a0319b56e72b4b95b6eab0b64736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106101dd575f3560e01c80638b9ee610116100fd578063cf4ffb7e11610092578063f74e481b11610062578063f74e481b14610636578063f76c603714610655578063f887ea401461068b578063ffa1ad74146106be575f5ffd5b8063cf4ffb7e146105ba578063d1b0c288146105d9578063dab346ff146105ef578063dbbb64b914610603575f5ffd5b8063a7be1b50116100cd578063a7be1b501461052c578063b1bd3c951461055f578063be399e2b14610572578063c45a015514610587575f5ffd5b80638b9ee610146104ab5780638e499bcf146104d25780639823bb13146104e6578063a5ae390c146104f9575f5ffd5b80633d0cc375116101735780634c1c6cbf116101435780634c1c6cbf1461041d5780635122c40914610448578063709a5c9c146104655780637dc0d1d014610478575f5ffd5b80633d0cc3751461037f5780633fc8cef3146103a057806340b67a9b146103d3578063466ffbce146103fe575f5ffd5b8063158274a5116101ae578063158274a5146102fe5780632e0f26251461033157806335f9f8d91461035757806336b4134a1461036b575f5ffd5b806231d115146101e85780630a42f8bd146102455780631265b6511461026957806314c7312b1461029c575f5ffd5b366101e457005b5f5ffd5b3480156101f3575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610250575f5ffd5b5061025b6202a30081565b60405190815260200161023c565b348015610274575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a7575f5ffd5b506102de6102b6366004612524565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b60408051948552602085019390935291830152606082015260800161023c565b348015610309575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033c575f5ffd5b50610345601281565b60405160ff909116815260200161023c565b348015610362575f5ffd5b5061025b603281565b348015610376575f5ffd5b5061025b606181565b34801561038a575f5ffd5b5061039e610399366004612524565b610713565b005b3480156103ab575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103de575f5ffd5b5061025b6103ed366004612524565b60056020525f908152604090205481565b348015610409575f5ffd5b5061021b610418366004612546565b610af5565b348015610428575f5ffd5b50610433620493e081565b60405163ffffffff909116815260200161023c565b348015610453575f5ffd5b5061025b69d3c21bcecceda100000081565b61039e610473366004612650565b610b2a565b348015610483575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b6575f5ffd5b5061021b7351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104dd575f5ffd5b5061025b5f5481565b61039e6104f4366004612524565b610c96565b348015610504575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610537575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b61039e61056d3660046126cd565b610ee5565b34801561057d575f5ffd5b5061025b60015481565b348015610592575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c5575f5ffd5b5061039e6105d436600461273b565b6111d6565b3480156105e4575f5ffd5b5061025b6201518081565b3480156105fa575f5ffd5b5061025b600a81565b34801561060e575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610641575f5ffd5b5061039e610650366004612524565b61154f565b348015610660575f5ffd5b5061025b61066f366004612765565b600460209081525f928352604080842090915290825290205481565b348015610696575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c9575f5ffd5b506107066040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023c91906127e8565b600254600114610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6202a30081602001516108519190612827565b42116108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161077b565b335f9081526005602052604081208054916108f98361283a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561096a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098e9190612871565b90505f8111610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161077b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a84575f5ffd5b505af1158015610a96573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ae291815260200190565b60405180910390a2505060016002555050565b60068181548110610b04575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b5f60015411610c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161077b565b335f908152600560205260408120805491610c1b8361283a565b91905055505f610c2d600154856117eb565b5f6001819055909150610c41828585611a71565b90508015610c8f57604051329082905f81818185875af1925050503d805f8114610c86576040519150601f19603f3d011682016040523d82523d5f602084013e610c8b565b606091505b5050505b5050505050565b5f3411610d25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161077b565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161077b565b610e283482612827565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e6f908490612827565b9091555050335f908152600560205260408120805491610e8e8361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b69d3c21bcecceda1000000811015611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161077b565b5f838360128460405161101b906124f3565b6110289493929190612888565b604051809103905ff080158015611041573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916111308361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260409020805460018201546112d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6201518082600101546112e69190612827565b42101561134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161077b565b5f61135a8285611d3e565b90505f606461136a600a846128c3565b61137491906128da565b90508060015f8282546113879190612827565b9091555061139790508183612912565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140b9190612871565b90505f606461141b6032846128c3565b61142591906128da565b90505f6114328284612912565b90505f5f6114418c8986612054565b4260028d015560038c01859055335f908152600560205260408120805493955091935061146d8361283a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f90815260046020908152604080832033845290915290205480156114b4576114b48d82868d6123cf565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611533929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161077b565b6202a30081602001516116899190612827565b421115611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600460209081526040808320338452909152902054806117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161077b565b335f9081526005602052604081208054916117c98361283a565b91905055506117e183828460600151855f01516123cf565b5050600160025550565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156118a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c59190612925565b506040805160c0810182527f000000000000000000000000000000000000000000000000000000000000000081525f602080830182905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116848601527f0000000000000000000000000000000000000000000000000000000000000000811660608086019190915260808086018a905286518088018852600281527f30780000000000000000000000000000000000000000000000000000000000008186015260a087015286519081018752308082529381018590528087019390935282019290925292517f52bbbe290000000000000000000000000000000000000000000000000000000081529192917f0000000000000000000000000000000000000000000000000000000000000000909116906352bbbe2990611a26908590859089904290600401612944565b6020604051808303815f875af1158015611a42573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a669190612871565b925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612925565b50620493e0831015611b5e57620493e092505b5f84604051602401611b7291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c6800000000000000000000000000000000000000000000000000000000179052517fa3a7954800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3a7954890611c97907f0000000000000000000000000000000000000000000000000000000000000000907351eb65012ca5ceb07320c497f4151ac207fea4e0908a908a908890600401612a73565b5f604051808303815f87803b158015611cae575f5ffd5b505af1158015611cc0573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e86604051611d2c91815260200190565b60405180910390a25034949350505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d9557611d95612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611e0357611e03612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611ea8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ecc9190612b25565b5050509150505f8113611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161077b565b5f69021e19e0c9bab24000006061611f5388856128c3565b611f5d91906128c3565b611f6791906128da565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab588848730426040518663ffffffff1660e01b8152600401611fca9493929190612b73565b5f6040518083038185885af1158015611fe5573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261202b9190810190612bf6565b90508060018151811061204057612040612ada565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af115801561210b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212f9190612c97565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156121e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220a9190612925565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561229d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c19190612925565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561239d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c19190612cb2565b939793965092945050505050565b835f826123dc85876128c3565b6123e691906128da565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612479573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249d9190612925565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612cde83390190565b73ffffffffffffffffffffffffffffffffffffffff81168114612521575f5ffd5b50565b5f60208284031215612534575f5ffd5b813561253f81612500565b9392505050565b5f60208284031215612556575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d1576125d161255d565b604052919050565b5f5f67ffffffffffffffff8411156125f3576125f361255d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126268161258a565b91505082815283838301111561263a575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f60608486031215612662575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612686575f5ffd5b8401601f81018613612696575f5ffd5b6126a5868235602084016125d9565b9150509250925092565b5f82601f8301126126be575f5ffd5b61253f838335602085016125d9565b5f5f5f606084860312156126df575f5ffd5b833567ffffffffffffffff8111156126f5575f5ffd5b612701868287016126af565b935050602084013567ffffffffffffffff81111561271d575f5ffd5b612729868287016126af565b93969395505050506040919091013590565b5f5f6040838503121561274c575f5ffd5b823561275781612500565b946020939093013593505050565b5f5f60408385031215612776575f5ffd5b823561278181612500565b9150602083013561279181612500565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61253f602083018461279c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611a6b57611a6b6127fa565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361286a5761286a6127fa565b5060010190565b5f60208284031215612881575f5ffd5b5051919050565b608081525f61289a608083018761279c565b82810360208401526128ac818761279c565b60ff95909516604084015250506060015292915050565b8082028115828204841417611a6b57611a6b6127fa565b5f8261290d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611a6b57611a6b6127fa565b5f60208284031215612935575f5ffd5b8151801515811461253f575f5ffd5b60e08152845160e08201525f60208601516002811061298a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610100830152604086015173ffffffffffffffffffffffffffffffffffffffff1661012083015260608601516129d961014084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608086015161016083015260a086015160c0610180840152612a006101a084018261279c565b915050612a61602083018673ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526060810151151560608301525050565b60a082019390935260c0015292915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015263ffffffff8316606082015260a060808201525f612acf60a083018461279c565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805169ffffffffffffffffffff81168114612b20575f5ffd5b919050565b5f5f5f5f5f60a08688031215612b39575f5ffd5b612b4286612b07565b60208701516040880151606089015192975090955093509150612b6760808701612b07565b90509295509295909350565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b81811015612bca57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612b96565b505073ffffffffffffffffffffffffffffffffffffffff95909516604084015250506060015292915050565b5f60208284031215612c06575f5ffd5b815167ffffffffffffffff811115612c1c575f5ffd5b8201601f81018413612c2c575f5ffd5b805167ffffffffffffffff811115612c4657612c4661255d565b8060051b612c566020820161258a565b91825260208184018101929081019087841115612c71575f5ffd5b6020850194505b83851015612acf57845180835260209586019590935090910190612c78565b5f60208284031215612ca7575f5ffd5b815161253f81612500565b5f5f5f60608486031215612cc4575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a26469706673582212205a44da7098040048e8e75c152df7966b2da848ba8a0319b56e72b4b95b6eab0b64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/abis/0.8.28/MemeCelo.json b/abis/0.8.28/MemeCelo.json new file mode 100644 index 0000000..1af55ea --- /dev/null +++ b/abis/0.8.28/MemeCelo.json @@ -0,0 +1,683 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MemeCelo", + "sourceName": "contracts/MemeCelo.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_olas", + "type": "address" + }, + { + "internalType": "address", + "name": "_referenceToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_router", + "type": "address" + }, + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minNativeTokenValue", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_celo", + "type": "address" + }, + { + "internalType": "address", + "name": "_l2TokenRelayer", + "type": "address" + }, + { + "internalType": "address", + "name": "_oracle", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "hearter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "memeToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "allocation", + "type": "uint256" + } + ], + "name": "Collected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "hearter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "memeToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Hearted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "olas", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "OLASJourneyToAscendance", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "memeToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "remainingAmount", + "type": "uint256" + } + ], + "name": "Purged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "summoner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "memeToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nativeTokenContributed", + "type": "uint256" + } + ], + "name": "Summoned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "unleasher", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "memeToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "lpPairAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "burnPercentageOfStable", + "type": "uint256" + } + ], + "name": "Unleashed", + "type": "event" + }, + { + "inputs": [], + "name": "COLLECT_DEADLINE", + "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": "LP_PERCENTAGE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_TOTAL_SUPPLY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OLAS_BURNER", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OLAS_BURN_PERCENTAGE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLIPPAGE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNLEASH_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WORMHOLE_ETH_CHAIN_ID", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "celo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "memeToken", + "type": "address" + } + ], + "name": "collectThisMeme", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "memeToken", + "type": "address" + } + ], + "name": "heartThisMeme", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "l2TokenRelayer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mapAccountActivities", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "memeHearters", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "memeSummons", + "outputs": [ + { + "internalType": "uint256", + "name": "nativeTokenContributed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "summonTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unleashTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "heartersAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "memeTokens", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minNativeTokenValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "olas", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oracle", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "memeToken", + "type": "address" + } + ], + "name": "purgeThisMeme", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "referenceToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "router", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokenGasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "bridgePayload", + "type": "bytes" + } + ], + "name": "scheduleOLASForAscendance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "scheduledForAscendance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint256", + "name": "totalSupply", + "type": "uint256" + } + ], + "name": "summonThisMeme", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "memeToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "name": "unleashThisMeme", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x6101806040526001600255348015610015575f5ffd5b5060405161403538038061403583398101604081905261003491610089565b6001600160a01b0397881660a05295871660c05293861660e052918516610100526080528316610120528216610140521661016052610114565b80516001600160a01b0381168114610084575f5ffd5b919050565b5f5f5f5f5f5f5f5f610100898b0312156100a1575f5ffd5b6100aa8961006e565b97506100b860208a0161006e565b96506100c660408a0161006e565b95506100d460608a0161006e565b9450608089015193506100e960a08a0161006e565b92506100f760c08a0161006e565b915061010560e08a0161006e565b90509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051613e1761021e5f395f81816104470152611e1e01525f81816104fb01528181611ae70152611c2b01525f818161024b0152818161181f01528181611d420152611faf01525f818161056b015261219201525f818161063c0152818161190a015281816119e501528181611f7d0152818161205b0152818161223901528181612315015261242301525f81816102a2015281816117b20152818161193901528181611daf0152818161215e0152818161226b01526123cc01525f81816101ee0152818161188d01528181611b1801528181611bc50152611cae01525f81816104c80152610e870152613e175ff3fe6080604052600436106101d2575f3560e01c80638b9ee610116100fd578063c45a015511610092578063f74e481b11610062578063f74e481b146105d6578063f76c6037146105f5578063f887ea401461062b578063ffa1ad741461065e575f5ffd5b8063c45a01551461055a578063cf4ffb7e1461058d578063d1b0c288146105ac578063dab346ff146105c2575f5ffd5b8063a7be1b50116100cd578063a7be1b50146104ea578063affed0e01461051d578063b1bd3c9514610532578063be399e2b14610545575f5ffd5b80638b9ee610146104695780638e499bcf146104905780639823bb13146104a4578063a5ae390c146104b7575f5ffd5b806336b4134a116101735780635122c409116101435780635122c409146103df5780635eb76db2146103fc578063709a5c9c146104235780637dc0d1d014610436575f5ffd5b806336b4134a146103605780633d0cc3751461037457806340b67a9b14610395578063466ffbce146103c0575f5ffd5b80631265b651116101ae5780631265b6511461029157806314c7312b146102c45780632e0f26251461032657806335f9f8d91461034c575f5ffd5b806231d115146101dd578063051ed8ef1461023a5780630a42f8bd1461026d575f5ffd5b366101d957005b5f5ffd5b3480156101e8575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610245575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610278575f5ffd5b506102836202a30081565b604051908152602001610231565b34801561029c575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cf575f5ffd5b506103066102de3660046125f1565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610231565b348015610331575f5ffd5b5061033a601281565b60405160ff9091168152602001610231565b348015610357575f5ffd5b50610283603281565b34801561036b575f5ffd5b50610283606181565b34801561037f575f5ffd5b5061039361038e3660046125f1565b6106b3565b005b3480156103a0575f5ffd5b506102836103af3660046125f1565b60056020525f908152604090205481565b3480156103cb575f5ffd5b506102106103da366004612613565b610a95565b3480156103ea575f5ffd5b5061028369d3c21bcecceda100000081565b348015610407575f5ffd5b50610410600281565b60405161ffff9091168152602001610231565b61039361043136600461271d565b610aca565b348015610441575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610474575f5ffd5b506102107351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561049b575f5ffd5b506102835f5481565b6103936104b23660046125f1565b610c36565b3480156104c2575f5ffd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f5575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610528575f5ffd5b5061028360075481565b61039361054036600461279a565b610e85565b348015610550575f5ffd5b5061028360015481565b348015610565575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f5ffd5b506103936105a7366004612808565b611176565b3480156105b7575f5ffd5b506102836201518081565b3480156105cd575f5ffd5b50610283600a81565b3480156105e1575f5ffd5b506103936105f03660046125f1565b6114ef565b348015610600575f5ffd5b5061028361060f366004612832565b600460209081525f928352604080842090915290825290205481565b348015610636575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610669575f5ffd5b506106a66040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023191906128b5565b600254600114610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602081815260409283902083516080810185528154815260018201549281018390526002820154948101949094529091015460608301526107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b6202a30081602001516107f191906128f4565b421161087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161071b565b335f90815260056020526040812080549161089983612907565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561090a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e919061293e565b90505f81116109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161071b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a24575f5ffd5b505af1158015610a36573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610a8291815260200190565b60405180910390a2505060016002555050565b60068181548110610aa4575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b5f60015411610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161071b565b335f908152600560205260408120805491610bbb83612907565b91905055505f610bcd6001548561178b565b5f6001819055909150610be1828585611aaa565b90508015610c2f57604051329082905f81818185875af1925050503d805f8114610c26576040519150601f19603f3d011682016040523d82523d5f602084013e610c2b565b606091505b5050505b5050505050565b5f3411610cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161071b565b600282015415610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161071b565b610dc834826128f4565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e0f9084906128f4565b9091555050335f908152600560205260408120805491610e2e83612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b69d3c21bcecceda1000000811015610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161071b565b5f8383601284604051610fbb906125c0565b610fc89493929190612955565b604051809103905ff080158015610fe1573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916110d083612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b6002546001146111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040902080546001820154611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b62015180826001015461128691906128f4565b4210156112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161071b565b5f6112fa8285611d1c565b90505f606461130a600a84612990565b61131491906129a7565b90508060015f82825461132791906128f4565b90915550611337905081836129df565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611387573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab919061293e565b90505f60646113bb603284612990565b6113c591906129a7565b90505f6113d282846129df565b90505f5f6113e18c8986612121565b4260028d015560038c01859055335f908152600560205260408120805493955091935061140d83612907565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f9081526004602090815260408083203384529091529020548015611454576114548d82868d61249c565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c6040516114d3929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b60025460011461155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161071b565b6202a300816020015161162991906128f4565b4211156116b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020548061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161071b565b335f90815260056020526040812080549161176983612907565b919050555061178183828460600151855f015161249c565b5050600160025550565b604080516003808252608082019092525f91829190602082016060803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117e3576117e36129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611851576118516129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118bf576118bf6129f2565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611981573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611a229088908890879030904290600401612a3e565b5f604051808303815f875af1158015611a3d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a829190810190612ac8565b905080600181518110611a9757611a976129f2565b6020026020010151925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b849190612a1f565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190525f608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303815f875af1158015611c73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c979190612b74565b50611ca38160016128f4565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d7357611d736129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611de157611de16129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611e86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eaa9190612bb9565b5050509150505f8113611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161071b565b5f6402540be4006061611f2c8885612990565b611f369190612990565b611f4091906129a7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611ff7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201b9190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612098908a908690899030904290600401612a3e565b5f604051808303815f875af11580156120b3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120f89190810190612ac8565b90508060018151811061210d5761210d6129f2565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc9190612c07565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156122b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190612a1f565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561236a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238e9190612a1f565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561246a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190612c22565b939793965092945050505050565b835f826124a98587612990565b6124b391906129a7565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612546573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256a9190612a1f565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612c4e83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146125ee575f5ffd5b50565b5f60208284031215612601575f5ffd5b813561260c816125cd565b9392505050565b5f60208284031215612623575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269e5761269e61262a565b604052919050565b5f5f67ffffffffffffffff8411156126c0576126c061262a565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126f381612657565b915050828152838383011115612707575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f6060848603121561272f575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612753575f5ffd5b8401601f81018613612763575f5ffd5b612772868235602084016126a6565b9150509250925092565b5f82601f83011261278b575f5ffd5b61260c838335602085016126a6565b5f5f5f606084860312156127ac575f5ffd5b833567ffffffffffffffff8111156127c2575f5ffd5b6127ce8682870161277c565b935050602084013567ffffffffffffffff8111156127ea575f5ffd5b6127f68682870161277c565b93969395505050506040919091013590565b5f5f60408385031215612819575f5ffd5b8235612824816125cd565b946020939093013593505050565b5f5f60408385031215612843575f5ffd5b823561284e816125cd565b9150602083013561285e816125cd565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61260c6020830184612869565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611aa457611aa46128c7565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612937576129376128c7565b5060010190565b5f6020828403121561294e575f5ffd5b5051919050565b608081525f6129676080830187612869565b82810360208401526129798187612869565b60ff95909516604084015250506060015292915050565b8082028115828204841417611aa457611aa46128c7565b5f826129da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611aa457611aa46128c7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612a2f575f5ffd5b8151801515811461260c575f5ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612a9b57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612a67565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b5f60208284031215612ad8575f5ffd5b815167ffffffffffffffff811115612aee575f5ffd5b8201601f81018413612afe575f5ffd5b805167ffffffffffffffff811115612b1857612b1861262a565b8060051b612b2860208201612657565b91825260208184018101929081019087841115612b43575f5ffd5b6020850194505b83851015612b6957845180835260209586019590935090910190612b4a565b979650505050505050565b5f60208284031215612b84575f5ffd5b815167ffffffffffffffff8116811461260c575f5ffd5b805169ffffffffffffffffffff81168114612bb4575f5ffd5b919050565b5f5f5f5f5f60a08688031215612bcd575f5ffd5b612bd686612b9b565b60208701516040880151606089015192975090955093509150612bfb60808701612b9b565b90509295509295909350565b5f60208284031215612c17575f5ffd5b815161260c816125cd565b5f5f5f60608486031215612c34575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a264697066735822122015c814fbfb368063ef1d70aa9b890d78bd898c6b9f239c6f7c1388ff1a1d5d7364736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106101d2575f3560e01c80638b9ee610116100fd578063c45a015511610092578063f74e481b11610062578063f74e481b146105d6578063f76c6037146105f5578063f887ea401461062b578063ffa1ad741461065e575f5ffd5b8063c45a01551461055a578063cf4ffb7e1461058d578063d1b0c288146105ac578063dab346ff146105c2575f5ffd5b8063a7be1b50116100cd578063a7be1b50146104ea578063affed0e01461051d578063b1bd3c9514610532578063be399e2b14610545575f5ffd5b80638b9ee610146104695780638e499bcf146104905780639823bb13146104a4578063a5ae390c146104b7575f5ffd5b806336b4134a116101735780635122c409116101435780635122c409146103df5780635eb76db2146103fc578063709a5c9c146104235780637dc0d1d014610436575f5ffd5b806336b4134a146103605780633d0cc3751461037457806340b67a9b14610395578063466ffbce146103c0575f5ffd5b80631265b651116101ae5780631265b6511461029157806314c7312b146102c45780632e0f26251461032657806335f9f8d91461034c575f5ffd5b806231d115146101dd578063051ed8ef1461023a5780630a42f8bd1461026d575f5ffd5b366101d957005b5f5ffd5b3480156101e8575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610245575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610278575f5ffd5b506102836202a30081565b604051908152602001610231565b34801561029c575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cf575f5ffd5b506103066102de3660046125f1565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610231565b348015610331575f5ffd5b5061033a601281565b60405160ff9091168152602001610231565b348015610357575f5ffd5b50610283603281565b34801561036b575f5ffd5b50610283606181565b34801561037f575f5ffd5b5061039361038e3660046125f1565b6106b3565b005b3480156103a0575f5ffd5b506102836103af3660046125f1565b60056020525f908152604090205481565b3480156103cb575f5ffd5b506102106103da366004612613565b610a95565b3480156103ea575f5ffd5b5061028369d3c21bcecceda100000081565b348015610407575f5ffd5b50610410600281565b60405161ffff9091168152602001610231565b61039361043136600461271d565b610aca565b348015610441575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610474575f5ffd5b506102107351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561049b575f5ffd5b506102835f5481565b6103936104b23660046125f1565b610c36565b3480156104c2575f5ffd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f5575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610528575f5ffd5b5061028360075481565b61039361054036600461279a565b610e85565b348015610550575f5ffd5b5061028360015481565b348015610565575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f5ffd5b506103936105a7366004612808565b611176565b3480156105b7575f5ffd5b506102836201518081565b3480156105cd575f5ffd5b50610283600a81565b3480156105e1575f5ffd5b506103936105f03660046125f1565b6114ef565b348015610600575f5ffd5b5061028361060f366004612832565b600460209081525f928352604080842090915290825290205481565b348015610636575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610669575f5ffd5b506106a66040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023191906128b5565b600254600114610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602081815260409283902083516080810185528154815260018201549281018390526002820154948101949094529091015460608301526107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b6202a30081602001516107f191906128f4565b421161087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161071b565b335f90815260056020526040812080549161089983612907565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561090a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e919061293e565b90505f81116109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161071b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a24575f5ffd5b505af1158015610a36573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610a8291815260200190565b60405180910390a2505060016002555050565b60068181548110610aa4575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b5f60015411610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161071b565b335f908152600560205260408120805491610bbb83612907565b91905055505f610bcd6001548561178b565b5f6001819055909150610be1828585611aaa565b90508015610c2f57604051329082905f81818185875af1925050503d805f8114610c26576040519150601f19603f3d011682016040523d82523d5f602084013e610c2b565b606091505b5050505b5050505050565b5f3411610cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161071b565b600282015415610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161071b565b610dc834826128f4565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e0f9084906128f4565b9091555050335f908152600560205260408120805491610e2e83612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b69d3c21bcecceda1000000811015610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161071b565b5f8383601284604051610fbb906125c0565b610fc89493929190612955565b604051809103905ff080158015610fe1573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916110d083612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b6002546001146111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040902080546001820154611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b62015180826001015461128691906128f4565b4210156112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161071b565b5f6112fa8285611d1c565b90505f606461130a600a84612990565b61131491906129a7565b90508060015f82825461132791906128f4565b90915550611337905081836129df565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611387573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab919061293e565b90505f60646113bb603284612990565b6113c591906129a7565b90505f6113d282846129df565b90505f5f6113e18c8986612121565b4260028d015560038c01859055335f908152600560205260408120805493955091935061140d83612907565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f9081526004602090815260408083203384529091529020548015611454576114548d82868d61249c565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c6040516114d3929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b60025460011461155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161071b565b6202a300816020015161162991906128f4565b4211156116b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020548061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161071b565b335f90815260056020526040812080549161176983612907565b919050555061178183828460600151855f015161249c565b5050600160025550565b604080516003808252608082019092525f91829190602082016060803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117e3576117e36129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611851576118516129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118bf576118bf6129f2565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611981573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611a229088908890879030904290600401612a3e565b5f604051808303815f875af1158015611a3d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a829190810190612ac8565b905080600181518110611a9757611a976129f2565b6020026020010151925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b849190612a1f565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190525f608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303815f875af1158015611c73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c979190612b74565b50611ca38160016128f4565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d7357611d736129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611de157611de16129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611e86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eaa9190612bb9565b5050509150505f8113611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161071b565b5f6402540be4006061611f2c8885612990565b611f369190612990565b611f4091906129a7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611ff7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201b9190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612098908a908690899030904290600401612a3e565b5f604051808303815f875af11580156120b3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120f89190810190612ac8565b90508060018151811061210d5761210d6129f2565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc9190612c07565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156122b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190612a1f565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561236a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238e9190612a1f565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561246a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190612c22565b939793965092945050505050565b835f826124a98587612990565b6124b391906129a7565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612546573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256a9190612a1f565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612c4e83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146125ee575f5ffd5b50565b5f60208284031215612601575f5ffd5b813561260c816125cd565b9392505050565b5f60208284031215612623575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269e5761269e61262a565b604052919050565b5f5f67ffffffffffffffff8411156126c0576126c061262a565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126f381612657565b915050828152838383011115612707575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f6060848603121561272f575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612753575f5ffd5b8401601f81018613612763575f5ffd5b612772868235602084016126a6565b9150509250925092565b5f82601f83011261278b575f5ffd5b61260c838335602085016126a6565b5f5f5f606084860312156127ac575f5ffd5b833567ffffffffffffffff8111156127c2575f5ffd5b6127ce8682870161277c565b935050602084013567ffffffffffffffff8111156127ea575f5ffd5b6127f68682870161277c565b93969395505050506040919091013590565b5f5f60408385031215612819575f5ffd5b8235612824816125cd565b946020939093013593505050565b5f5f60408385031215612843575f5ffd5b823561284e816125cd565b9150602083013561285e816125cd565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61260c6020830184612869565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611aa457611aa46128c7565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612937576129376128c7565b5060010190565b5f6020828403121561294e575f5ffd5b5051919050565b608081525f6129676080830187612869565b82810360208401526129798187612869565b60ff95909516604084015250506060015292915050565b8082028115828204841417611aa457611aa46128c7565b5f826129da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611aa457611aa46128c7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612a2f575f5ffd5b8151801515811461260c575f5ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612a9b57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612a67565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b5f60208284031215612ad8575f5ffd5b815167ffffffffffffffff811115612aee575f5ffd5b8201601f81018413612afe575f5ffd5b805167ffffffffffffffff811115612b1857612b1861262a565b8060051b612b2860208201612657565b91825260208184018101929081019087841115612b43575f5ffd5b6020850194505b83851015612b6957845180835260209586019590935090910190612b4a565b979650505050505050565b5f60208284031215612b84575f5ffd5b815167ffffffffffffffff8116811461260c575f5ffd5b805169ffffffffffffffffffff81168114612bb4575f5ffd5b919050565b5f5f5f5f5f60a08688031215612bcd575f5ffd5b612bd686612b9b565b60208701516040880151606089015192975090955093509150612bfb60808701612b9b565b90509295509295909350565b5f60208284031215612c17575f5ffd5b815161260c816125cd565b5f5f5f60608486031215612c34575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a264697066735822122015c814fbfb368063ef1d70aa9b890d78bd898c6b9f239c6f7c1388ff1a1d5d7364736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/MemeBase.sol b/contracts/MemeBase.sol index 579191c..a590366 100644 --- a/contracts/MemeBase.sol +++ b/contracts/MemeBase.sol @@ -63,7 +63,7 @@ interface IUniswap { } /// @title MemeBase - a smart contract factory for Meme Token creation on Base. -abstract contract MemeBase is MemeFactory { +contract MemeBase is MemeFactory { // Slippage parameter (3%) uint256 public constant SLIPPAGE = 97; // Token transfer gas limit for L1 @@ -113,7 +113,7 @@ abstract contract MemeBase is MemeFactory { (, int256 answerPrice, , , ) = IOracle(oracle).latestRoundData(); require(answerPrice > 0, "Oracle price is incorrect"); - // Oracle returns 8 decimals, USDC has 6 decimals, need to additionally divide by 100 + // Oracle returns 8 decimals, USDC has 6 decimals, need to additionally divide by 100 to account for slippage // ETH: 18 decimals, USDC leftovers: 2 decimals, percentage: 2 decimals; denominator = 18 + 2 + 2 = 22 uint256 limit = uint256(answerPrice) * nativeTokenAmount * SLIPPAGE / 1e22; // Swap ETH for USDC diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index 49938ad..ef488ac 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -35,19 +35,28 @@ interface IOracle { // UniswapV2 interface interface IUniswap { /// @dev Swaps exact amount of ETH for a specified token. - function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) + function swapExactTokensForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable returns (uint256[] memory amounts); + + /// @dev Swaps an exact amount of input tokens along the route determined by the path. + function swapExactTokensForTokens( + uint256 amountIn, + uint256 amountOutMin, + address[] calldata path, + address to, + uint256 deadline + ) external returns (uint256[] memory amounts); } /// @title MemeCelo - a smart contract factory for Meme Token creation on Celo. -abstract contract MemeCelo is MemeFactory { +contract MemeCelo is MemeFactory { // Slippage parameter (3%) uint256 public constant SLIPPAGE = 97; // Ethereum mainnet chain Id in Wormhole format uint16 public constant WORMHOLE_ETH_CHAIN_ID = 2; - // WCELO token address - address public immutable wcelo; + // CELO token address + address public immutable celo; // L2 token relayer bridge address address public immutable l2TokenRelayer; // Oracle address @@ -63,11 +72,11 @@ abstract contract MemeCelo is MemeFactory { address _router, address _factory, uint256 _minNativeTokenValue, - address _wcelo, + address _celo, address _l2TokenRelayer, address _oracle ) MemeFactory(_olas, _referenceToken, _router, _factory, _minNativeTokenValue) { - wcelo = _wcelo; + celo = _celo; l2TokenRelayer = _l2TokenRelayer; oracle = _oracle; } @@ -77,18 +86,23 @@ abstract contract MemeCelo is MemeFactory { /// @return Stable token amount bought. function _convertToReferenceToken(uint256 nativeTokenAmount, uint256) internal override returns (uint256) { address[] memory path = new address[](2); - path[0] = wcelo; + path[0] = celo; path[1] = referenceToken; // Calculate price by Oracle (, int256 answerPrice, , , ) = IOracle(oracle).latestRoundData(); require(answerPrice > 0, "Oracle price is incorrect"); - // Oracle returns 8 decimals, USDC has 6 decimals, need to additionally divide by 100 - // ETH: 18 decimals, USDC leftovers: 2 decimals, percentage: 2 decimals; denominator = 18 + 2 + 2 = 22 - uint256 limit = uint256(answerPrice) * nativeTokenAmount * SLIPPAGE / 1e22; - // Swap ETH for USDC - uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: nativeTokenAmount }( + // Oracle returns 8 decimals, cUSD has 18 decimals, need to additionally divide by 100 to account for slippage + // ETH: 18 decimals, cUSD: 18 decimals, percentage: 2 decimals; denominator = 8 + 2 = 10 + uint256 limit = uint256(answerPrice) * nativeTokenAmount * SLIPPAGE / 1e10; + + // Approve reference token + IERC20(celo).approve(router, nativeTokenAmount); + + // Swap CELO for cUSD + uint256[] memory amounts = IUniswap(router).swapExactTokensForTokens( + nativeTokenAmount, limit, path, address(this), @@ -105,11 +119,16 @@ abstract contract MemeCelo is MemeFactory { function _buyOLAS(uint256 referenceTokenAmount, uint256 limit) internal override returns (uint256) { address[] memory path = new address[](3); path[0] = referenceToken; - path[1] = wcelo; + path[1] = celo; path[2] = olas; - // Swap cUSD for // this will go via two pools - not a problem as ubeswap has both - uint256[] memory amounts = IUniswap(router).swapExactETHForTokens{ value: referenceTokenAmount }( + // Approve reference token + IERC20(referenceToken).approve(router, referenceTokenAmount); + + // Swap cUSD for OLAS + // This will go via two pools - not a problem as Ubeswap has both + uint256[] memory amounts = IUniswap(router).swapExactTokensForTokens( + referenceTokenAmount, limit, path, address(this), diff --git a/scripts/deployment/deploy_02_meme_celo.js b/scripts/deployment/deploy_02_meme_celo.js index 6a94ef1..bc62ec2 100644 --- a/scripts/deployment/deploy_02_meme_celo.js +++ b/scripts/deployment/deploy_02_meme_celo.js @@ -44,7 +44,7 @@ async function main() { const MemeCelo = await ethers.getContractFactory("MemeCelo"); console.log("You are signing the following transaction: MemeCelo.connect(EOA).deploy()"); const memeCelo = await MemeCelo.connect(EOA).deploy(parsedData.olasAddress, parsedData.cusdAddress, - parsedData.routerAddress, parsedData.factoryAddress, parsedData.minNativeTokenValue, parsedData.wceloAddress, + parsedData.routerAddress, parsedData.factoryAddress, parsedData.minNativeTokenValue, parsedData.celoAddress, parsedData.l2TokenBridgeAddress, parsedData.oracleAddress); const result = await memeCelo.deployed(); diff --git a/scripts/deployment/globals_base_mainnet.json b/scripts/deployment/globals_base_mainnet.json index 39989f1..3757e18 100644 --- a/scripts/deployment/globals_base_mainnet.json +++ b/scripts/deployment/globals_base_mainnet.json @@ -1 +1 @@ -{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"base","networkURL":"https://mainnet.base.org","gasPriceInGwei":"2","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","usdcAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","wethAddress":"0x4200000000000000000000000000000000000006","routerAddress":"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24","factoryAddress":"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6","l2TokenBridgeAddress":"0x4200000000000000000000000000000000000010","oracleAddress":"0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70","balancerVaultAddress":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","balancerPoolId":"0x5332584890d6e415a6dc910254d6430b8aab7e69000200000000000000000103"} \ No newline at end of file +{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"base","networkURL":"https://mainnet.base.org","gasPriceInGwei":"2","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","usdcAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","wethAddress":"0x4200000000000000000000000000000000000006","routerAddress":"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24","factoryAddress":"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6","minNativeTokenValue":"10000000000000000","l2TokenBridgeAddress":"0x4200000000000000000000000000000000000010","oracleAddress":"0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70","balancerVaultAddress":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","balancerPoolId":"0x5332584890d6e415a6dc910254d6430b8aab7e69000200000000000000000103"} \ No newline at end of file diff --git a/scripts/deployment/globals_celo_mainnet.json b/scripts/deployment/globals_celo_mainnet.json new file mode 100644 index 0000000..34c2789 --- /dev/null +++ b/scripts/deployment/globals_celo_mainnet.json @@ -0,0 +1 @@ +{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"celo","networkURL":"https://forno.celo.org","gasPriceInGwei":"2","olasAddress":"0xaCFfAe8e57Ec6E394Eb1b41939A8CF7892DbDc51","cusdAddress":"0x765DE816845861e75A25fCA122bb6898B8B1282a","celoAddress":"0x471EcE3750Da237f93B8E339c536989b8978a438","routerAddress":"0xE3D8bd6Aed4F159bc8000a9cD47CffDb95F96121","factoryAddress":"0x62d5b84bE28a183aBB507E125B384122D2C25fAE","minNativeTokenValue":"10000000000000000000","l2TokenBridgeAddress":"0x796Dff6D74F3E27060B71255Fe517BFb23C93eed","oracleAddress":"0x0568fD19986748cEfF3301e55c0eb1E729E0Ab7e"} \ No newline at end of file diff --git a/scripts/deployment/verify_01_meme_base.js b/scripts/deployment/verify_01_meme_base.js index de6751e..77f9279 100644 --- a/scripts/deployment/verify_01_meme_base.js +++ b/scripts/deployment/verify_01_meme_base.js @@ -6,9 +6,10 @@ const parsedData = JSON.parse(dataFromJSON); module.exports = [ parsedData.olasAddress, parsedData.usdcAddress, - parsedData.wethAddress, parsedData.routerAddress, parsedData.factoryAddress, + parsedData.minNativeTokenValue, + parsedData.wethAddress, parsedData.l2TokenBridgeAddress, parsedData.oracleAddress, parsedData.balancerVaultAddress, diff --git a/scripts/deployment/verify_02_meme_celo.js b/scripts/deployment/verify_02_meme_celo.js new file mode 100644 index 0000000..4420dae --- /dev/null +++ b/scripts/deployment/verify_02_meme_celo.js @@ -0,0 +1,15 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); + +module.exports = [ + parsedData.olasAddress, + parsedData.cusdAddress, + parsedData.routerAddress, + parsedData.factoryAddress, + parsedData.minNativeTokenValue, + parsedData.celoAddress, + parsedData.l2TokenBridgeAddress, + parsedData.oracleAddress +]; \ No newline at end of file From 3d01d3c64c103c1e57edc35880fc4d374e9002af Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 12:39:46 +0000 Subject: [PATCH 07/13] chore: small name change --- abis/0.8.28/MemeBase.json | 4 ++-- abis/0.8.28/MemeCelo.json | 4 ++-- contracts/MemeBase.sol | 12 ++++++------ contracts/MemeCelo.sol | 10 +++++----- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/abis/0.8.28/MemeBase.json b/abis/0.8.28/MemeBase.json index b8f7c5f..e451092 100644 --- a/abis/0.8.28/MemeBase.json +++ b/abis/0.8.28/MemeBase.json @@ -699,8 +699,8 @@ "type": "receive" } ], - "bytecode": "0x6101c06040526001600255348015610015575f5ffd5b506040516140f53803806140f583398101604081905261003491610098565b6001600160a01b03998a1660a05297891660c05295881660e05293871661010052608092909252851661012052841661014052831661016052909116610180526101a05261013e565b80516001600160a01b0381168114610093575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d0312156100b2575f5ffd5b6100bb8b61007d565b99506100c960208c0161007d565b98506100d760408c0161007d565b97506100e560608c0161007d565b965060808b015195506100fa60a08c0161007d565b945061010860c08c0161007d565b935061011660e08c0161007d565b92506101256101008c0161007d565b91506101208b015190509295989b9194979a5092959850565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613ea761024e5f395f818161061401526118d201525f818161030f0152818161182801526119e901525f81816104890152611e4001525f818161053d01528181611aae0152611c2601525f81816103b10152611d6401525f818161059801526120c501525f818161069c01528181611f6c0152818161216c01528181612248015261235601525f818161027a015281816118590152818161191301528181611dd1015281816120910152818161219e01526122ff01525f81816101f90152818161193a01528181611adf01528181611c530152611cc601525f818161050a0152610ee70152613ea75ff3fe6080604052600436106101dd575f3560e01c80638b9ee610116100fd578063cf4ffb7e11610092578063f74e481b11610062578063f74e481b14610636578063f76c603714610655578063f887ea401461068b578063ffa1ad74146106be575f5ffd5b8063cf4ffb7e146105ba578063d1b0c288146105d9578063dab346ff146105ef578063dbbb64b914610603575f5ffd5b8063a7be1b50116100cd578063a7be1b501461052c578063b1bd3c951461055f578063be399e2b14610572578063c45a015514610587575f5ffd5b80638b9ee610146104ab5780638e499bcf146104d25780639823bb13146104e6578063a5ae390c146104f9575f5ffd5b80633d0cc375116101735780634c1c6cbf116101435780634c1c6cbf1461041d5780635122c40914610448578063709a5c9c146104655780637dc0d1d014610478575f5ffd5b80633d0cc3751461037f5780633fc8cef3146103a057806340b67a9b146103d3578063466ffbce146103fe575f5ffd5b8063158274a5116101ae578063158274a5146102fe5780632e0f26251461033157806335f9f8d91461035757806336b4134a1461036b575f5ffd5b806231d115146101e85780630a42f8bd146102455780631265b6511461026957806314c7312b1461029c575f5ffd5b366101e457005b5f5ffd5b3480156101f3575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610250575f5ffd5b5061025b6202a30081565b60405190815260200161023c565b348015610274575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a7575f5ffd5b506102de6102b6366004612524565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b60408051948552602085019390935291830152606082015260800161023c565b348015610309575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033c575f5ffd5b50610345601281565b60405160ff909116815260200161023c565b348015610362575f5ffd5b5061025b603281565b348015610376575f5ffd5b5061025b606181565b34801561038a575f5ffd5b5061039e610399366004612524565b610713565b005b3480156103ab575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103de575f5ffd5b5061025b6103ed366004612524565b60056020525f908152604090205481565b348015610409575f5ffd5b5061021b610418366004612546565b610af5565b348015610428575f5ffd5b50610433620493e081565b60405163ffffffff909116815260200161023c565b348015610453575f5ffd5b5061025b69d3c21bcecceda100000081565b61039e610473366004612650565b610b2a565b348015610483575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b6575f5ffd5b5061021b7351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104dd575f5ffd5b5061025b5f5481565b61039e6104f4366004612524565b610c96565b348015610504575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610537575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b61039e61056d3660046126cd565b610ee5565b34801561057d575f5ffd5b5061025b60015481565b348015610592575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c5575f5ffd5b5061039e6105d436600461273b565b6111d6565b3480156105e4575f5ffd5b5061025b6201518081565b3480156105fa575f5ffd5b5061025b600a81565b34801561060e575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610641575f5ffd5b5061039e610650366004612524565b61154f565b348015610660575f5ffd5b5061025b61066f366004612765565b600460209081525f928352604080842090915290825290205481565b348015610696575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c9575f5ffd5b506107066040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023c91906127e8565b600254600114610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6202a30081602001516108519190612827565b42116108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161077b565b335f9081526005602052604081208054916108f98361283a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561096a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098e9190612871565b90505f8111610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161077b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a84575f5ffd5b505af1158015610a96573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ae291815260200190565b60405180910390a2505060016002555050565b60068181548110610b04575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b5f60015411610c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161077b565b335f908152600560205260408120805491610c1b8361283a565b91905055505f610c2d600154856117eb565b5f6001819055909150610c41828585611a71565b90508015610c8f57604051329082905f81818185875af1925050503d805f8114610c86576040519150601f19603f3d011682016040523d82523d5f602084013e610c8b565b606091505b5050505b5050505050565b5f3411610d25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161077b565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161077b565b610e283482612827565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e6f908490612827565b9091555050335f908152600560205260408120805491610e8e8361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b69d3c21bcecceda1000000811015611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161077b565b5f838360128460405161101b906124f3565b6110289493929190612888565b604051809103905ff080158015611041573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916111308361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260409020805460018201546112d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6201518082600101546112e69190612827565b42101561134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161077b565b5f61135a8285611d3e565b90505f606461136a600a846128c3565b61137491906128da565b90508060015f8282546113879190612827565b9091555061139790508183612912565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140b9190612871565b90505f606461141b6032846128c3565b61142591906128da565b90505f6114328284612912565b90505f5f6114418c8986612054565b4260028d015560038c01859055335f908152600560205260408120805493955091935061146d8361283a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f90815260046020908152604080832033845290915290205480156114b4576114b48d82868d6123cf565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611533929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161077b565b6202a30081602001516116899190612827565b421115611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600460209081526040808320338452909152902054806117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161077b565b335f9081526005602052604081208054916117c98361283a565b91905055506117e183828460600151855f01516123cf565b5050600160025550565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156118a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c59190612925565b506040805160c0810182527f000000000000000000000000000000000000000000000000000000000000000081525f602080830182905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116848601527f0000000000000000000000000000000000000000000000000000000000000000811660608086019190915260808086018a905286518088018852600281527f30780000000000000000000000000000000000000000000000000000000000008186015260a087015286519081018752308082529381018590528087019390935282019290925292517f52bbbe290000000000000000000000000000000000000000000000000000000081529192917f0000000000000000000000000000000000000000000000000000000000000000909116906352bbbe2990611a26908590859089904290600401612944565b6020604051808303815f875af1158015611a42573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a669190612871565b925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612925565b50620493e0831015611b5e57620493e092505b5f84604051602401611b7291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c6800000000000000000000000000000000000000000000000000000000179052517fa3a7954800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3a7954890611c97907f0000000000000000000000000000000000000000000000000000000000000000907351eb65012ca5ceb07320c497f4151ac207fea4e0908a908a908890600401612a73565b5f604051808303815f87803b158015611cae575f5ffd5b505af1158015611cc0573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e86604051611d2c91815260200190565b60405180910390a25034949350505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d9557611d95612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611e0357611e03612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611ea8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ecc9190612b25565b5050509150505f8113611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161077b565b5f69021e19e0c9bab24000006061611f5388856128c3565b611f5d91906128c3565b611f6791906128da565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab588848730426040518663ffffffff1660e01b8152600401611fca9493929190612b73565b5f6040518083038185885af1158015611fe5573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261202b9190810190612bf6565b90508060018151811061204057612040612ada565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af115801561210b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212f9190612c97565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156121e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220a9190612925565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561229d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c19190612925565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561239d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c19190612cb2565b939793965092945050505050565b835f826123dc85876128c3565b6123e691906128da565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612479573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249d9190612925565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612cde83390190565b73ffffffffffffffffffffffffffffffffffffffff81168114612521575f5ffd5b50565b5f60208284031215612534575f5ffd5b813561253f81612500565b9392505050565b5f60208284031215612556575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d1576125d161255d565b604052919050565b5f5f67ffffffffffffffff8411156125f3576125f361255d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126268161258a565b91505082815283838301111561263a575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f60608486031215612662575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612686575f5ffd5b8401601f81018613612696575f5ffd5b6126a5868235602084016125d9565b9150509250925092565b5f82601f8301126126be575f5ffd5b61253f838335602085016125d9565b5f5f5f606084860312156126df575f5ffd5b833567ffffffffffffffff8111156126f5575f5ffd5b612701868287016126af565b935050602084013567ffffffffffffffff81111561271d575f5ffd5b612729868287016126af565b93969395505050506040919091013590565b5f5f6040838503121561274c575f5ffd5b823561275781612500565b946020939093013593505050565b5f5f60408385031215612776575f5ffd5b823561278181612500565b9150602083013561279181612500565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61253f602083018461279c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611a6b57611a6b6127fa565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361286a5761286a6127fa565b5060010190565b5f60208284031215612881575f5ffd5b5051919050565b608081525f61289a608083018761279c565b82810360208401526128ac818761279c565b60ff95909516604084015250506060015292915050565b8082028115828204841417611a6b57611a6b6127fa565b5f8261290d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611a6b57611a6b6127fa565b5f60208284031215612935575f5ffd5b8151801515811461253f575f5ffd5b60e08152845160e08201525f60208601516002811061298a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610100830152604086015173ffffffffffffffffffffffffffffffffffffffff1661012083015260608601516129d961014084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608086015161016083015260a086015160c0610180840152612a006101a084018261279c565b915050612a61602083018673ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526060810151151560608301525050565b60a082019390935260c0015292915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015263ffffffff8316606082015260a060808201525f612acf60a083018461279c565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805169ffffffffffffffffffff81168114612b20575f5ffd5b919050565b5f5f5f5f5f60a08688031215612b39575f5ffd5b612b4286612b07565b60208701516040880151606089015192975090955093509150612b6760808701612b07565b90509295509295909350565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b81811015612bca57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612b96565b505073ffffffffffffffffffffffffffffffffffffffff95909516604084015250506060015292915050565b5f60208284031215612c06575f5ffd5b815167ffffffffffffffff811115612c1c575f5ffd5b8201601f81018413612c2c575f5ffd5b805167ffffffffffffffff811115612c4657612c4661255d565b8060051b612c566020820161258a565b91825260208184018101929081019087841115612c71575f5ffd5b6020850194505b83851015612acf57845180835260209586019590935090910190612c78565b5f60208284031215612ca7575f5ffd5b815161253f81612500565b5f5f5f60608486031215612cc4575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a26469706673582212205a44da7098040048e8e75c152df7966b2da848ba8a0319b56e72b4b95b6eab0b64736f6c634300081c0033", - "deployedBytecode": "0x6080604052600436106101dd575f3560e01c80638b9ee610116100fd578063cf4ffb7e11610092578063f74e481b11610062578063f74e481b14610636578063f76c603714610655578063f887ea401461068b578063ffa1ad74146106be575f5ffd5b8063cf4ffb7e146105ba578063d1b0c288146105d9578063dab346ff146105ef578063dbbb64b914610603575f5ffd5b8063a7be1b50116100cd578063a7be1b501461052c578063b1bd3c951461055f578063be399e2b14610572578063c45a015514610587575f5ffd5b80638b9ee610146104ab5780638e499bcf146104d25780639823bb13146104e6578063a5ae390c146104f9575f5ffd5b80633d0cc375116101735780634c1c6cbf116101435780634c1c6cbf1461041d5780635122c40914610448578063709a5c9c146104655780637dc0d1d014610478575f5ffd5b80633d0cc3751461037f5780633fc8cef3146103a057806340b67a9b146103d3578063466ffbce146103fe575f5ffd5b8063158274a5116101ae578063158274a5146102fe5780632e0f26251461033157806335f9f8d91461035757806336b4134a1461036b575f5ffd5b806231d115146101e85780630a42f8bd146102455780631265b6511461026957806314c7312b1461029c575f5ffd5b366101e457005b5f5ffd5b3480156101f3575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610250575f5ffd5b5061025b6202a30081565b60405190815260200161023c565b348015610274575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a7575f5ffd5b506102de6102b6366004612524565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b60408051948552602085019390935291830152606082015260800161023c565b348015610309575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033c575f5ffd5b50610345601281565b60405160ff909116815260200161023c565b348015610362575f5ffd5b5061025b603281565b348015610376575f5ffd5b5061025b606181565b34801561038a575f5ffd5b5061039e610399366004612524565b610713565b005b3480156103ab575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103de575f5ffd5b5061025b6103ed366004612524565b60056020525f908152604090205481565b348015610409575f5ffd5b5061021b610418366004612546565b610af5565b348015610428575f5ffd5b50610433620493e081565b60405163ffffffff909116815260200161023c565b348015610453575f5ffd5b5061025b69d3c21bcecceda100000081565b61039e610473366004612650565b610b2a565b348015610483575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b6575f5ffd5b5061021b7351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104dd575f5ffd5b5061025b5f5481565b61039e6104f4366004612524565b610c96565b348015610504575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610537575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b61039e61056d3660046126cd565b610ee5565b34801561057d575f5ffd5b5061025b60015481565b348015610592575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c5575f5ffd5b5061039e6105d436600461273b565b6111d6565b3480156105e4575f5ffd5b5061025b6201518081565b3480156105fa575f5ffd5b5061025b600a81565b34801561060e575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610641575f5ffd5b5061039e610650366004612524565b61154f565b348015610660575f5ffd5b5061025b61066f366004612765565b600460209081525f928352604080842090915290825290205481565b348015610696575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c9575f5ffd5b506107066040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023c91906127e8565b600254600114610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6202a30081602001516108519190612827565b42116108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161077b565b335f9081526005602052604081208054916108f98361283a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561096a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098e9190612871565b90505f8111610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161077b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a84575f5ffd5b505af1158015610a96573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ae291815260200190565b60405180910390a2505060016002555050565b60068181548110610b04575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b5f60015411610c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161077b565b335f908152600560205260408120805491610c1b8361283a565b91905055505f610c2d600154856117eb565b5f6001819055909150610c41828585611a71565b90508015610c8f57604051329082905f81818185875af1925050503d805f8114610c86576040519150601f19603f3d011682016040523d82523d5f602084013e610c8b565b606091505b5050505b5050505050565b5f3411610d25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161077b565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161077b565b610e283482612827565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e6f908490612827565b9091555050335f908152600560205260408120805491610e8e8361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b69d3c21bcecceda1000000811015611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161077b565b5f838360128460405161101b906124f3565b6110289493929190612888565b604051809103905ff080158015611041573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916111308361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260409020805460018201546112d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6201518082600101546112e69190612827565b42101561134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161077b565b5f61135a8285611d3e565b90505f606461136a600a846128c3565b61137491906128da565b90508060015f8282546113879190612827565b9091555061139790508183612912565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140b9190612871565b90505f606461141b6032846128c3565b61142591906128da565b90505f6114328284612912565b90505f5f6114418c8986612054565b4260028d015560038c01859055335f908152600560205260408120805493955091935061146d8361283a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f90815260046020908152604080832033845290915290205480156114b4576114b48d82868d6123cf565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611533929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161077b565b6202a30081602001516116899190612827565b421115611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600460209081526040808320338452909152902054806117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161077b565b335f9081526005602052604081208054916117c98361283a565b91905055506117e183828460600151855f01516123cf565b5050600160025550565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156118a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c59190612925565b506040805160c0810182527f000000000000000000000000000000000000000000000000000000000000000081525f602080830182905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116848601527f0000000000000000000000000000000000000000000000000000000000000000811660608086019190915260808086018a905286518088018852600281527f30780000000000000000000000000000000000000000000000000000000000008186015260a087015286519081018752308082529381018590528087019390935282019290925292517f52bbbe290000000000000000000000000000000000000000000000000000000081529192917f0000000000000000000000000000000000000000000000000000000000000000909116906352bbbe2990611a26908590859089904290600401612944565b6020604051808303815f875af1158015611a42573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a669190612871565b925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612925565b50620493e0831015611b5e57620493e092505b5f84604051602401611b7291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c6800000000000000000000000000000000000000000000000000000000179052517fa3a7954800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3a7954890611c97907f0000000000000000000000000000000000000000000000000000000000000000907351eb65012ca5ceb07320c497f4151ac207fea4e0908a908a908890600401612a73565b5f604051808303815f87803b158015611cae575f5ffd5b505af1158015611cc0573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e86604051611d2c91815260200190565b60405180910390a25034949350505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d9557611d95612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611e0357611e03612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611ea8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ecc9190612b25565b5050509150505f8113611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161077b565b5f69021e19e0c9bab24000006061611f5388856128c3565b611f5d91906128c3565b611f6791906128da565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab588848730426040518663ffffffff1660e01b8152600401611fca9493929190612b73565b5f6040518083038185885af1158015611fe5573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261202b9190810190612bf6565b90508060018151811061204057612040612ada565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af115801561210b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212f9190612c97565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156121e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220a9190612925565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561229d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c19190612925565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561239d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c19190612cb2565b939793965092945050505050565b835f826123dc85876128c3565b6123e691906128da565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612479573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249d9190612925565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612cde83390190565b73ffffffffffffffffffffffffffffffffffffffff81168114612521575f5ffd5b50565b5f60208284031215612534575f5ffd5b813561253f81612500565b9392505050565b5f60208284031215612556575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d1576125d161255d565b604052919050565b5f5f67ffffffffffffffff8411156125f3576125f361255d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126268161258a565b91505082815283838301111561263a575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f60608486031215612662575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612686575f5ffd5b8401601f81018613612696575f5ffd5b6126a5868235602084016125d9565b9150509250925092565b5f82601f8301126126be575f5ffd5b61253f838335602085016125d9565b5f5f5f606084860312156126df575f5ffd5b833567ffffffffffffffff8111156126f5575f5ffd5b612701868287016126af565b935050602084013567ffffffffffffffff81111561271d575f5ffd5b612729868287016126af565b93969395505050506040919091013590565b5f5f6040838503121561274c575f5ffd5b823561275781612500565b946020939093013593505050565b5f5f60408385031215612776575f5ffd5b823561278181612500565b9150602083013561279181612500565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61253f602083018461279c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611a6b57611a6b6127fa565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361286a5761286a6127fa565b5060010190565b5f60208284031215612881575f5ffd5b5051919050565b608081525f61289a608083018761279c565b82810360208401526128ac818761279c565b60ff95909516604084015250506060015292915050565b8082028115828204841417611a6b57611a6b6127fa565b5f8261290d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611a6b57611a6b6127fa565b5f60208284031215612935575f5ffd5b8151801515811461253f575f5ffd5b60e08152845160e08201525f60208601516002811061298a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610100830152604086015173ffffffffffffffffffffffffffffffffffffffff1661012083015260608601516129d961014084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608086015161016083015260a086015160c0610180840152612a006101a084018261279c565b915050612a61602083018673ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526060810151151560608301525050565b60a082019390935260c0015292915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015263ffffffff8316606082015260a060808201525f612acf60a083018461279c565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805169ffffffffffffffffffff81168114612b20575f5ffd5b919050565b5f5f5f5f5f60a08688031215612b39575f5ffd5b612b4286612b07565b60208701516040880151606089015192975090955093509150612b6760808701612b07565b90509295509295909350565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b81811015612bca57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612b96565b505073ffffffffffffffffffffffffffffffffffffffff95909516604084015250506060015292915050565b5f60208284031215612c06575f5ffd5b815167ffffffffffffffff811115612c1c575f5ffd5b8201601f81018413612c2c575f5ffd5b805167ffffffffffffffff811115612c4657612c4661255d565b8060051b612c566020820161258a565b91825260208184018101929081019087841115612c71575f5ffd5b6020850194505b83851015612acf57845180835260209586019590935090910190612c78565b5f60208284031215612ca7575f5ffd5b815161253f81612500565b5f5f5f60608486031215612cc4575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a26469706673582212205a44da7098040048e8e75c152df7966b2da848ba8a0319b56e72b4b95b6eab0b64736f6c634300081c0033", + "bytecode": "0x6101c06040526001600255348015610015575f5ffd5b506040516140f53803806140f583398101604081905261003491610098565b6001600160a01b03998a1660a05297891660c05295881660e05293871661010052608092909252851661012052841661014052831661016052909116610180526101a05261013e565b80516001600160a01b0381168114610093575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d0312156100b2575f5ffd5b6100bb8b61007d565b99506100c960208c0161007d565b98506100d760408c0161007d565b97506100e560608c0161007d565b965060808b015195506100fa60a08c0161007d565b945061010860c08c0161007d565b935061011660e08c0161007d565b92506101256101008c0161007d565b91506101208b015190509295989b9194979a5092959850565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051613ea761024e5f395f818161061401526118d201525f818161030f0152818161182801526119e901525f81816104890152611e4001525f818161053d01528181611aae0152611c2601525f81816103b10152611d6401525f818161059801526120c501525f818161069c01528181611f6c0152818161216c01528181612248015261235601525f818161027a015281816118590152818161191301528181611dd1015281816120910152818161219e01526122ff01525f81816101f90152818161193a01528181611adf01528181611c530152611cc601525f818161050a0152610ee70152613ea75ff3fe6080604052600436106101dd575f3560e01c80638b9ee610116100fd578063cf4ffb7e11610092578063f74e481b11610062578063f74e481b14610636578063f76c603714610655578063f887ea401461068b578063ffa1ad74146106be575f5ffd5b8063cf4ffb7e146105ba578063d1b0c288146105d9578063dab346ff146105ef578063dbbb64b914610603575f5ffd5b8063a7be1b50116100cd578063a7be1b501461052c578063b1bd3c951461055f578063be399e2b14610572578063c45a015514610587575f5ffd5b80638b9ee610146104ab5780638e499bcf146104d25780639823bb13146104e6578063a5ae390c146104f9575f5ffd5b80633d0cc375116101735780634c1c6cbf116101435780634c1c6cbf1461041d5780635122c40914610448578063709a5c9c146104655780637dc0d1d014610478575f5ffd5b80633d0cc3751461037f5780633fc8cef3146103a057806340b67a9b146103d3578063466ffbce146103fe575f5ffd5b8063158274a5116101ae578063158274a5146102fe5780632e0f26251461033157806335f9f8d91461035757806336b4134a1461036b575f5ffd5b806231d115146101e85780630a42f8bd146102455780631265b6511461026957806314c7312b1461029c575f5ffd5b366101e457005b5f5ffd5b3480156101f3575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610250575f5ffd5b5061025b6202a30081565b60405190815260200161023c565b348015610274575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a7575f5ffd5b506102de6102b6366004612524565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b60408051948552602085019390935291830152606082015260800161023c565b348015610309575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033c575f5ffd5b50610345601281565b60405160ff909116815260200161023c565b348015610362575f5ffd5b5061025b603281565b348015610376575f5ffd5b5061025b606181565b34801561038a575f5ffd5b5061039e610399366004612524565b610713565b005b3480156103ab575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103de575f5ffd5b5061025b6103ed366004612524565b60056020525f908152604090205481565b348015610409575f5ffd5b5061021b610418366004612546565b610af5565b348015610428575f5ffd5b50610433620493e081565b60405163ffffffff909116815260200161023c565b348015610453575f5ffd5b5061025b69d3c21bcecceda100000081565b61039e610473366004612650565b610b2a565b348015610483575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b6575f5ffd5b5061021b7351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104dd575f5ffd5b5061025b5f5481565b61039e6104f4366004612524565b610c96565b348015610504575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610537575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b61039e61056d3660046126cd565b610ee5565b34801561057d575f5ffd5b5061025b60015481565b348015610592575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c5575f5ffd5b5061039e6105d436600461273b565b6111d6565b3480156105e4575f5ffd5b5061025b6201518081565b3480156105fa575f5ffd5b5061025b600a81565b34801561060e575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610641575f5ffd5b5061039e610650366004612524565b61154f565b348015610660575f5ffd5b5061025b61066f366004612765565b600460209081525f928352604080842090915290825290205481565b348015610696575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c9575f5ffd5b506107066040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023c91906127e8565b600254600114610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6202a30081602001516108519190612827565b42116108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161077b565b335f9081526005602052604081208054916108f98361283a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561096a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098e9190612871565b90505f8111610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161077b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a84575f5ffd5b505af1158015610a96573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ae291815260200190565b60405180910390a2505060016002555050565b60068181548110610b04575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b5f60015411610c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161077b565b335f908152600560205260408120805491610c1b8361283a565b91905055505f610c2d600154856117eb565b5f6001819055909150610c41828585611a71565b90508015610c8f57604051329082905f81818185875af1925050503d805f8114610c86576040519150601f19603f3d011682016040523d82523d5f602084013e610c8b565b606091505b5050505b5050505050565b5f3411610d25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161077b565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161077b565b610e283482612827565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e6f908490612827565b9091555050335f908152600560205260408120805491610e8e8361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b69d3c21bcecceda1000000811015611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161077b565b5f838360128460405161101b906124f3565b6110289493929190612888565b604051809103905ff080158015611041573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916111308361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260409020805460018201546112d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6201518082600101546112e69190612827565b42101561134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161077b565b5f61135a8285611d3e565b90505f606461136a600a846128c3565b61137491906128da565b90508060015f8282546113879190612827565b9091555061139790508183612912565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140b9190612871565b90505f606461141b6032846128c3565b61142591906128da565b90505f6114328284612912565b90505f5f6114418c8986612054565b4260028d015560038c01859055335f908152600560205260408120805493955091935061146d8361283a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f90815260046020908152604080832033845290915290205480156114b4576114b48d82868d6123cf565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611533929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161077b565b6202a30081602001516116899190612827565b421115611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600460209081526040808320338452909152902054806117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161077b565b335f9081526005602052604081208054916117c98361283a565b91905055506117e183828460600151855f01516123cf565b5050600160025550565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156118a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c59190612925565b506040805160c0810182527f000000000000000000000000000000000000000000000000000000000000000081525f602080830182905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116848601527f0000000000000000000000000000000000000000000000000000000000000000811660608086019190915260808086018a905286518088018852600281527f30780000000000000000000000000000000000000000000000000000000000008186015260a087015286519081018752308082529381018590528087019390935282019290925292517f52bbbe290000000000000000000000000000000000000000000000000000000081529192917f0000000000000000000000000000000000000000000000000000000000000000909116906352bbbe2990611a26908590859089904290600401612944565b6020604051808303815f875af1158015611a42573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a669190612871565b925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612925565b50620493e0831015611b5e57620493e092505b5f84604051602401611b7291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c6800000000000000000000000000000000000000000000000000000000179052517fa3a7954800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3a7954890611c97907f0000000000000000000000000000000000000000000000000000000000000000907351eb65012ca5ceb07320c497f4151ac207fea4e0908a908a908890600401612a73565b5f604051808303815f87803b158015611cae575f5ffd5b505af1158015611cc0573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e86604051611d2c91815260200190565b60405180910390a25034949350505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d9557611d95612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611e0357611e03612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611ea8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ecc9190612b25565b5050509150505f8113611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161077b565b5f69021e19e0c9bab24000006061611f5388856128c3565b611f5d91906128c3565b611f6791906128da565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab588848730426040518663ffffffff1660e01b8152600401611fca9493929190612b73565b5f6040518083038185885af1158015611fe5573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261202b9190810190612bf6565b90508060018151811061204057612040612ada565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af115801561210b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212f9190612c97565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156121e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220a9190612925565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561229d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c19190612925565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561239d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c19190612cb2565b939793965092945050505050565b835f826123dc85876128c3565b6123e691906128da565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612479573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249d9190612925565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612cde83390190565b73ffffffffffffffffffffffffffffffffffffffff81168114612521575f5ffd5b50565b5f60208284031215612534575f5ffd5b813561253f81612500565b9392505050565b5f60208284031215612556575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d1576125d161255d565b604052919050565b5f5f67ffffffffffffffff8411156125f3576125f361255d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126268161258a565b91505082815283838301111561263a575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f60608486031215612662575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612686575f5ffd5b8401601f81018613612696575f5ffd5b6126a5868235602084016125d9565b9150509250925092565b5f82601f8301126126be575f5ffd5b61253f838335602085016125d9565b5f5f5f606084860312156126df575f5ffd5b833567ffffffffffffffff8111156126f5575f5ffd5b612701868287016126af565b935050602084013567ffffffffffffffff81111561271d575f5ffd5b612729868287016126af565b93969395505050506040919091013590565b5f5f6040838503121561274c575f5ffd5b823561275781612500565b946020939093013593505050565b5f5f60408385031215612776575f5ffd5b823561278181612500565b9150602083013561279181612500565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61253f602083018461279c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611a6b57611a6b6127fa565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361286a5761286a6127fa565b5060010190565b5f60208284031215612881575f5ffd5b5051919050565b608081525f61289a608083018761279c565b82810360208401526128ac818761279c565b60ff95909516604084015250506060015292915050565b8082028115828204841417611a6b57611a6b6127fa565b5f8261290d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611a6b57611a6b6127fa565b5f60208284031215612935575f5ffd5b8151801515811461253f575f5ffd5b60e08152845160e08201525f60208601516002811061298a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610100830152604086015173ffffffffffffffffffffffffffffffffffffffff1661012083015260608601516129d961014084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608086015161016083015260a086015160c0610180840152612a006101a084018261279c565b915050612a61602083018673ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526060810151151560608301525050565b60a082019390935260c0015292915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015263ffffffff8316606082015260a060808201525f612acf60a083018461279c565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805169ffffffffffffffffffff81168114612b20575f5ffd5b919050565b5f5f5f5f5f60a08688031215612b39575f5ffd5b612b4286612b07565b60208701516040880151606089015192975090955093509150612b6760808701612b07565b90509295509295909350565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b81811015612bca57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612b96565b505073ffffffffffffffffffffffffffffffffffffffff95909516604084015250506060015292915050565b5f60208284031215612c06575f5ffd5b815167ffffffffffffffff811115612c1c575f5ffd5b8201601f81018413612c2c575f5ffd5b805167ffffffffffffffff811115612c4657612c4661255d565b8060051b612c566020820161258a565b91825260208184018101929081019087841115612c71575f5ffd5b6020850194505b83851015612acf57845180835260209586019590935090910190612c78565b5f60208284031215612ca7575f5ffd5b815161253f81612500565b5f5f5f60608486031215612cc4575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a264697066735822122062814146600021248e02abcea00d20fb3ed21d0c0d709ef83cf829152d0c436364736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106101dd575f3560e01c80638b9ee610116100fd578063cf4ffb7e11610092578063f74e481b11610062578063f74e481b14610636578063f76c603714610655578063f887ea401461068b578063ffa1ad74146106be575f5ffd5b8063cf4ffb7e146105ba578063d1b0c288146105d9578063dab346ff146105ef578063dbbb64b914610603575f5ffd5b8063a7be1b50116100cd578063a7be1b501461052c578063b1bd3c951461055f578063be399e2b14610572578063c45a015514610587575f5ffd5b80638b9ee610146104ab5780638e499bcf146104d25780639823bb13146104e6578063a5ae390c146104f9575f5ffd5b80633d0cc375116101735780634c1c6cbf116101435780634c1c6cbf1461041d5780635122c40914610448578063709a5c9c146104655780637dc0d1d014610478575f5ffd5b80633d0cc3751461037f5780633fc8cef3146103a057806340b67a9b146103d3578063466ffbce146103fe575f5ffd5b8063158274a5116101ae578063158274a5146102fe5780632e0f26251461033157806335f9f8d91461035757806336b4134a1461036b575f5ffd5b806231d115146101e85780630a42f8bd146102455780631265b6511461026957806314c7312b1461029c575f5ffd5b366101e457005b5f5ffd5b3480156101f3575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610250575f5ffd5b5061025b6202a30081565b60405190815260200161023c565b348015610274575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a7575f5ffd5b506102de6102b6366004612524565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b60408051948552602085019390935291830152606082015260800161023c565b348015610309575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033c575f5ffd5b50610345601281565b60405160ff909116815260200161023c565b348015610362575f5ffd5b5061025b603281565b348015610376575f5ffd5b5061025b606181565b34801561038a575f5ffd5b5061039e610399366004612524565b610713565b005b3480156103ab575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103de575f5ffd5b5061025b6103ed366004612524565b60056020525f908152604090205481565b348015610409575f5ffd5b5061021b610418366004612546565b610af5565b348015610428575f5ffd5b50610433620493e081565b60405163ffffffff909116815260200161023c565b348015610453575f5ffd5b5061025b69d3c21bcecceda100000081565b61039e610473366004612650565b610b2a565b348015610483575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b6575f5ffd5b5061021b7351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104dd575f5ffd5b5061025b5f5481565b61039e6104f4366004612524565b610c96565b348015610504575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610537575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b61039e61056d3660046126cd565b610ee5565b34801561057d575f5ffd5b5061025b60015481565b348015610592575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105c5575f5ffd5b5061039e6105d436600461273b565b6111d6565b3480156105e4575f5ffd5b5061025b6201518081565b3480156105fa575f5ffd5b5061025b600a81565b34801561060e575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610641575f5ffd5b5061039e610650366004612524565b61154f565b348015610660575f5ffd5b5061025b61066f366004612765565b600460209081525f928352604080842090915290825290205481565b348015610696575f5ffd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c9575f5ffd5b506107066040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023c91906127e8565b600254600114610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6202a30081602001516108519190612827565b42116108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161077b565b335f9081526005602052604081208054916108f98361283a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561096a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098e9190612871565b90505f8111610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161077b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a84575f5ffd5b505af1158015610a96573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ae291815260200190565b60405180910390a2505060016002555050565b60068181548110610b04575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b5f60015411610c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161077b565b335f908152600560205260408120805491610c1b8361283a565b91905055505f610c2d600154856117eb565b5f6001819055909150610c41828585611a71565b90508015610c8f57604051329082905f81818185875af1925050503d805f8114610c86576040519150601f19603f3d011682016040523d82523d5f602084013e610c8b565b606091505b5050505b5050505050565b5f3411610d25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161077b565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161077b565b610e283482612827565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e6f908490612827565b9091555050335f908152600560205260408120805491610e8e8361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b69d3c21bcecceda1000000811015611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161077b565b5f838360128460405161101b906124f3565b6110289493929190612888565b604051809103905ff080158015611041573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916111308361283a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260409020805460018201546112d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161077b565b6201518082600101546112e69190612827565b42101561134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161077b565b5f61135a8285611d3e565b90505f606461136a600a846128c3565b61137491906128da565b90508060015f8282546113879190612827565b9091555061139790508183612912565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140b9190612871565b90505f606461141b6032846128c3565b61142591906128da565b90505f6114328284612912565b90505f5f6114418c8986612054565b4260028d015560038c01859055335f908152600560205260408120805493955091935061146d8361283a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f90815260046020908152604080832033845290915290205480156114b4576114b48d82868d6123cf565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611533929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161077b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161077b565b6202a30081602001516116899190612827565b421115611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161077b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600460209081526040808320338452909152902054806117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161077b565b335f9081526005602052604081208054916117c98361283a565b91905055506117e183828460600151855f01516123cf565b5050600160025550565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156118a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c59190612925565b506040805160c0810182527f000000000000000000000000000000000000000000000000000000000000000081525f602080830182905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116848601527f0000000000000000000000000000000000000000000000000000000000000000811660608086019190915260808086018a905286518088018852600281527f30780000000000000000000000000000000000000000000000000000000000008186015260a087015286519081018752308082529381018590528087019390935282019290925292517f52bbbe290000000000000000000000000000000000000000000000000000000081529192917f0000000000000000000000000000000000000000000000000000000000000000909116906352bbbe2990611a26908590859089904290600401612944565b6020604051808303815f875af1158015611a42573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a669190612871565b925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612925565b50620493e0831015611b5e57620493e092505b5f84604051602401611b7291815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c6800000000000000000000000000000000000000000000000000000000179052517fa3a7954800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3a7954890611c97907f0000000000000000000000000000000000000000000000000000000000000000907351eb65012ca5ceb07320c497f4151ac207fea4e0908a908a908890600401612a73565b5f604051808303815f87803b158015611cae575f5ffd5b505af1158015611cc0573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e86604051611d2c91815260200190565b60405180910390a25034949350505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d9557611d95612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611e0357611e03612ada565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611ea8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ecc9190612b25565b5050509150505f8113611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161077b565b5f69021e19e0c9bab24000006061611f5388856128c3565b611f5d91906128c3565b611f6791906128da565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab588848730426040518663ffffffff1660e01b8152600401611fca9493929190612b73565b5f6040518083038185885af1158015611fe5573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261202b9190810190612bf6565b90508060018151811061204057612040612ada565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af115801561210b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212f9190612c97565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156121e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220a9190612925565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561229d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c19190612925565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561239d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c19190612cb2565b939793965092945050505050565b835f826123dc85876128c3565b6123e691906128da565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612479573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249d9190612925565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612cde83390190565b73ffffffffffffffffffffffffffffffffffffffff81168114612521575f5ffd5b50565b5f60208284031215612534575f5ffd5b813561253f81612500565b9392505050565b5f60208284031215612556575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d1576125d161255d565b604052919050565b5f5f67ffffffffffffffff8411156125f3576125f361255d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126268161258a565b91505082815283838301111561263a575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f60608486031215612662575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612686575f5ffd5b8401601f81018613612696575f5ffd5b6126a5868235602084016125d9565b9150509250925092565b5f82601f8301126126be575f5ffd5b61253f838335602085016125d9565b5f5f5f606084860312156126df575f5ffd5b833567ffffffffffffffff8111156126f5575f5ffd5b612701868287016126af565b935050602084013567ffffffffffffffff81111561271d575f5ffd5b612729868287016126af565b93969395505050506040919091013590565b5f5f6040838503121561274c575f5ffd5b823561275781612500565b946020939093013593505050565b5f5f60408385031215612776575f5ffd5b823561278181612500565b9150602083013561279181612500565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61253f602083018461279c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611a6b57611a6b6127fa565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361286a5761286a6127fa565b5060010190565b5f60208284031215612881575f5ffd5b5051919050565b608081525f61289a608083018761279c565b82810360208401526128ac818761279c565b60ff95909516604084015250506060015292915050565b8082028115828204841417611a6b57611a6b6127fa565b5f8261290d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611a6b57611a6b6127fa565b5f60208284031215612935575f5ffd5b8151801515811461253f575f5ffd5b60e08152845160e08201525f60208601516002811061298a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610100830152604086015173ffffffffffffffffffffffffffffffffffffffff1661012083015260608601516129d961014084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608086015161016083015260a086015160c0610180840152612a006101a084018261279c565b915050612a61602083018673ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526060810151151560608301525050565b60a082019390935260c0015292915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015263ffffffff8316606082015260a060808201525f612acf60a083018461279c565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805169ffffffffffffffffffff81168114612b20575f5ffd5b919050565b5f5f5f5f5f60a08688031215612b39575f5ffd5b612b4286612b07565b60208701516040880151606089015192975090955093509150612b6760808701612b07565b90509295509295909350565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b81811015612bca57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612b96565b505073ffffffffffffffffffffffffffffffffffffffff95909516604084015250506060015292915050565b5f60208284031215612c06575f5ffd5b815167ffffffffffffffff811115612c1c575f5ffd5b8201601f81018413612c2c575f5ffd5b805167ffffffffffffffff811115612c4657612c4661255d565b8060051b612c566020820161258a565b91825260208184018101929081019087841115612c71575f5ffd5b6020850194505b83851015612acf57845180835260209586019590935090910190612c78565b5f60208284031215612ca7575f5ffd5b815161253f81612500565b5f5f5f60608486031215612cc4575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a264697066735822122062814146600021248e02abcea00d20fb3ed21d0c0d709ef83cf829152d0c436364736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/abis/0.8.28/MemeCelo.json b/abis/0.8.28/MemeCelo.json index 1af55ea..19dc346 100644 --- a/abis/0.8.28/MemeCelo.json +++ b/abis/0.8.28/MemeCelo.json @@ -676,8 +676,8 @@ "type": "receive" } ], - "bytecode": "0x6101806040526001600255348015610015575f5ffd5b5060405161403538038061403583398101604081905261003491610089565b6001600160a01b0397881660a05295871660c05293861660e052918516610100526080528316610120528216610140521661016052610114565b80516001600160a01b0381168114610084575f5ffd5b919050565b5f5f5f5f5f5f5f5f610100898b0312156100a1575f5ffd5b6100aa8961006e565b97506100b860208a0161006e565b96506100c660408a0161006e565b95506100d460608a0161006e565b9450608089015193506100e960a08a0161006e565b92506100f760c08a0161006e565b915061010560e08a0161006e565b90509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051613e1761021e5f395f81816104470152611e1e01525f81816104fb01528181611ae70152611c2b01525f818161024b0152818161181f01528181611d420152611faf01525f818161056b015261219201525f818161063c0152818161190a015281816119e501528181611f7d0152818161205b0152818161223901528181612315015261242301525f81816102a2015281816117b20152818161193901528181611daf0152818161215e0152818161226b01526123cc01525f81816101ee0152818161188d01528181611b1801528181611bc50152611cae01525f81816104c80152610e870152613e175ff3fe6080604052600436106101d2575f3560e01c80638b9ee610116100fd578063c45a015511610092578063f74e481b11610062578063f74e481b146105d6578063f76c6037146105f5578063f887ea401461062b578063ffa1ad741461065e575f5ffd5b8063c45a01551461055a578063cf4ffb7e1461058d578063d1b0c288146105ac578063dab346ff146105c2575f5ffd5b8063a7be1b50116100cd578063a7be1b50146104ea578063affed0e01461051d578063b1bd3c9514610532578063be399e2b14610545575f5ffd5b80638b9ee610146104695780638e499bcf146104905780639823bb13146104a4578063a5ae390c146104b7575f5ffd5b806336b4134a116101735780635122c409116101435780635122c409146103df5780635eb76db2146103fc578063709a5c9c146104235780637dc0d1d014610436575f5ffd5b806336b4134a146103605780633d0cc3751461037457806340b67a9b14610395578063466ffbce146103c0575f5ffd5b80631265b651116101ae5780631265b6511461029157806314c7312b146102c45780632e0f26251461032657806335f9f8d91461034c575f5ffd5b806231d115146101dd578063051ed8ef1461023a5780630a42f8bd1461026d575f5ffd5b366101d957005b5f5ffd5b3480156101e8575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610245575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610278575f5ffd5b506102836202a30081565b604051908152602001610231565b34801561029c575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cf575f5ffd5b506103066102de3660046125f1565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610231565b348015610331575f5ffd5b5061033a601281565b60405160ff9091168152602001610231565b348015610357575f5ffd5b50610283603281565b34801561036b575f5ffd5b50610283606181565b34801561037f575f5ffd5b5061039361038e3660046125f1565b6106b3565b005b3480156103a0575f5ffd5b506102836103af3660046125f1565b60056020525f908152604090205481565b3480156103cb575f5ffd5b506102106103da366004612613565b610a95565b3480156103ea575f5ffd5b5061028369d3c21bcecceda100000081565b348015610407575f5ffd5b50610410600281565b60405161ffff9091168152602001610231565b61039361043136600461271d565b610aca565b348015610441575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610474575f5ffd5b506102107351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561049b575f5ffd5b506102835f5481565b6103936104b23660046125f1565b610c36565b3480156104c2575f5ffd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f5575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610528575f5ffd5b5061028360075481565b61039361054036600461279a565b610e85565b348015610550575f5ffd5b5061028360015481565b348015610565575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f5ffd5b506103936105a7366004612808565b611176565b3480156105b7575f5ffd5b506102836201518081565b3480156105cd575f5ffd5b50610283600a81565b3480156105e1575f5ffd5b506103936105f03660046125f1565b6114ef565b348015610600575f5ffd5b5061028361060f366004612832565b600460209081525f928352604080842090915290825290205481565b348015610636575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610669575f5ffd5b506106a66040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023191906128b5565b600254600114610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602081815260409283902083516080810185528154815260018201549281018390526002820154948101949094529091015460608301526107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b6202a30081602001516107f191906128f4565b421161087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161071b565b335f90815260056020526040812080549161089983612907565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561090a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e919061293e565b90505f81116109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161071b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a24575f5ffd5b505af1158015610a36573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610a8291815260200190565b60405180910390a2505060016002555050565b60068181548110610aa4575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b5f60015411610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161071b565b335f908152600560205260408120805491610bbb83612907565b91905055505f610bcd6001548561178b565b5f6001819055909150610be1828585611aaa565b90508015610c2f57604051329082905f81818185875af1925050503d805f8114610c26576040519150601f19603f3d011682016040523d82523d5f602084013e610c2b565b606091505b5050505b5050505050565b5f3411610cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161071b565b600282015415610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161071b565b610dc834826128f4565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e0f9084906128f4565b9091555050335f908152600560205260408120805491610e2e83612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b69d3c21bcecceda1000000811015610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161071b565b5f8383601284604051610fbb906125c0565b610fc89493929190612955565b604051809103905ff080158015610fe1573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916110d083612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b6002546001146111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040902080546001820154611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b62015180826001015461128691906128f4565b4210156112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161071b565b5f6112fa8285611d1c565b90505f606461130a600a84612990565b61131491906129a7565b90508060015f82825461132791906128f4565b90915550611337905081836129df565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611387573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab919061293e565b90505f60646113bb603284612990565b6113c591906129a7565b90505f6113d282846129df565b90505f5f6113e18c8986612121565b4260028d015560038c01859055335f908152600560205260408120805493955091935061140d83612907565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f9081526004602090815260408083203384529091529020548015611454576114548d82868d61249c565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c6040516114d3929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b60025460011461155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161071b565b6202a300816020015161162991906128f4565b4211156116b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020548061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161071b565b335f90815260056020526040812080549161176983612907565b919050555061178183828460600151855f015161249c565b5050600160025550565b604080516003808252608082019092525f91829190602082016060803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117e3576117e36129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611851576118516129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118bf576118bf6129f2565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611981573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611a229088908890879030904290600401612a3e565b5f604051808303815f875af1158015611a3d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a829190810190612ac8565b905080600181518110611a9757611a976129f2565b6020026020010151925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b849190612a1f565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190525f608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303815f875af1158015611c73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c979190612b74565b50611ca38160016128f4565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d7357611d736129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611de157611de16129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611e86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eaa9190612bb9565b5050509150505f8113611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161071b565b5f6402540be4006061611f2c8885612990565b611f369190612990565b611f4091906129a7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611ff7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201b9190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612098908a908690899030904290600401612a3e565b5f604051808303815f875af11580156120b3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120f89190810190612ac8565b90508060018151811061210d5761210d6129f2565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc9190612c07565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156122b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190612a1f565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561236a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238e9190612a1f565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561246a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190612c22565b939793965092945050505050565b835f826124a98587612990565b6124b391906129a7565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612546573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256a9190612a1f565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612c4e83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146125ee575f5ffd5b50565b5f60208284031215612601575f5ffd5b813561260c816125cd565b9392505050565b5f60208284031215612623575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269e5761269e61262a565b604052919050565b5f5f67ffffffffffffffff8411156126c0576126c061262a565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126f381612657565b915050828152838383011115612707575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f6060848603121561272f575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612753575f5ffd5b8401601f81018613612763575f5ffd5b612772868235602084016126a6565b9150509250925092565b5f82601f83011261278b575f5ffd5b61260c838335602085016126a6565b5f5f5f606084860312156127ac575f5ffd5b833567ffffffffffffffff8111156127c2575f5ffd5b6127ce8682870161277c565b935050602084013567ffffffffffffffff8111156127ea575f5ffd5b6127f68682870161277c565b93969395505050506040919091013590565b5f5f60408385031215612819575f5ffd5b8235612824816125cd565b946020939093013593505050565b5f5f60408385031215612843575f5ffd5b823561284e816125cd565b9150602083013561285e816125cd565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61260c6020830184612869565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611aa457611aa46128c7565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612937576129376128c7565b5060010190565b5f6020828403121561294e575f5ffd5b5051919050565b608081525f6129676080830187612869565b82810360208401526129798187612869565b60ff95909516604084015250506060015292915050565b8082028115828204841417611aa457611aa46128c7565b5f826129da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611aa457611aa46128c7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612a2f575f5ffd5b8151801515811461260c575f5ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612a9b57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612a67565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b5f60208284031215612ad8575f5ffd5b815167ffffffffffffffff811115612aee575f5ffd5b8201601f81018413612afe575f5ffd5b805167ffffffffffffffff811115612b1857612b1861262a565b8060051b612b2860208201612657565b91825260208184018101929081019087841115612b43575f5ffd5b6020850194505b83851015612b6957845180835260209586019590935090910190612b4a565b979650505050505050565b5f60208284031215612b84575f5ffd5b815167ffffffffffffffff8116811461260c575f5ffd5b805169ffffffffffffffffffff81168114612bb4575f5ffd5b919050565b5f5f5f5f5f60a08688031215612bcd575f5ffd5b612bd686612b9b565b60208701516040880151606089015192975090955093509150612bfb60808701612b9b565b90509295509295909350565b5f60208284031215612c17575f5ffd5b815161260c816125cd565b5f5f5f60608486031215612c34575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a264697066735822122015c814fbfb368063ef1d70aa9b890d78bd898c6b9f239c6f7c1388ff1a1d5d7364736f6c634300081c0033", - "deployedBytecode": "0x6080604052600436106101d2575f3560e01c80638b9ee610116100fd578063c45a015511610092578063f74e481b11610062578063f74e481b146105d6578063f76c6037146105f5578063f887ea401461062b578063ffa1ad741461065e575f5ffd5b8063c45a01551461055a578063cf4ffb7e1461058d578063d1b0c288146105ac578063dab346ff146105c2575f5ffd5b8063a7be1b50116100cd578063a7be1b50146104ea578063affed0e01461051d578063b1bd3c9514610532578063be399e2b14610545575f5ffd5b80638b9ee610146104695780638e499bcf146104905780639823bb13146104a4578063a5ae390c146104b7575f5ffd5b806336b4134a116101735780635122c409116101435780635122c409146103df5780635eb76db2146103fc578063709a5c9c146104235780637dc0d1d014610436575f5ffd5b806336b4134a146103605780633d0cc3751461037457806340b67a9b14610395578063466ffbce146103c0575f5ffd5b80631265b651116101ae5780631265b6511461029157806314c7312b146102c45780632e0f26251461032657806335f9f8d91461034c575f5ffd5b806231d115146101dd578063051ed8ef1461023a5780630a42f8bd1461026d575f5ffd5b366101d957005b5f5ffd5b3480156101e8575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610245575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610278575f5ffd5b506102836202a30081565b604051908152602001610231565b34801561029c575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cf575f5ffd5b506103066102de3660046125f1565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610231565b348015610331575f5ffd5b5061033a601281565b60405160ff9091168152602001610231565b348015610357575f5ffd5b50610283603281565b34801561036b575f5ffd5b50610283606181565b34801561037f575f5ffd5b5061039361038e3660046125f1565b6106b3565b005b3480156103a0575f5ffd5b506102836103af3660046125f1565b60056020525f908152604090205481565b3480156103cb575f5ffd5b506102106103da366004612613565b610a95565b3480156103ea575f5ffd5b5061028369d3c21bcecceda100000081565b348015610407575f5ffd5b50610410600281565b60405161ffff9091168152602001610231565b61039361043136600461271d565b610aca565b348015610441575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610474575f5ffd5b506102107351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561049b575f5ffd5b506102835f5481565b6103936104b23660046125f1565b610c36565b3480156104c2575f5ffd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f5575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610528575f5ffd5b5061028360075481565b61039361054036600461279a565b610e85565b348015610550575f5ffd5b5061028360015481565b348015610565575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f5ffd5b506103936105a7366004612808565b611176565b3480156105b7575f5ffd5b506102836201518081565b3480156105cd575f5ffd5b50610283600a81565b3480156105e1575f5ffd5b506103936105f03660046125f1565b6114ef565b348015610600575f5ffd5b5061028361060f366004612832565b600460209081525f928352604080842090915290825290205481565b348015610636575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610669575f5ffd5b506106a66040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023191906128b5565b600254600114610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602081815260409283902083516080810185528154815260018201549281018390526002820154948101949094529091015460608301526107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b6202a30081602001516107f191906128f4565b421161087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161071b565b335f90815260056020526040812080549161089983612907565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561090a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e919061293e565b90505f81116109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161071b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a24575f5ffd5b505af1158015610a36573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610a8291815260200190565b60405180910390a2505060016002555050565b60068181548110610aa4575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b5f60015411610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161071b565b335f908152600560205260408120805491610bbb83612907565b91905055505f610bcd6001548561178b565b5f6001819055909150610be1828585611aaa565b90508015610c2f57604051329082905f81818185875af1925050503d805f8114610c26576040519150601f19603f3d011682016040523d82523d5f602084013e610c2b565b606091505b5050505b5050505050565b5f3411610cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161071b565b600282015415610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161071b565b610dc834826128f4565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e0f9084906128f4565b9091555050335f908152600560205260408120805491610e2e83612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b69d3c21bcecceda1000000811015610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161071b565b5f8383601284604051610fbb906125c0565b610fc89493929190612955565b604051809103905ff080158015610fe1573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916110d083612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b6002546001146111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040902080546001820154611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b62015180826001015461128691906128f4565b4210156112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161071b565b5f6112fa8285611d1c565b90505f606461130a600a84612990565b61131491906129a7565b90508060015f82825461132791906128f4565b90915550611337905081836129df565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611387573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab919061293e565b90505f60646113bb603284612990565b6113c591906129a7565b90505f6113d282846129df565b90505f5f6113e18c8986612121565b4260028d015560038c01859055335f908152600560205260408120805493955091935061140d83612907565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f9081526004602090815260408083203384529091529020548015611454576114548d82868d61249c565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c6040516114d3929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b60025460011461155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161071b565b6202a300816020015161162991906128f4565b4211156116b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020548061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161071b565b335f90815260056020526040812080549161176983612907565b919050555061178183828460600151855f015161249c565b5050600160025550565b604080516003808252608082019092525f91829190602082016060803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117e3576117e36129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611851576118516129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118bf576118bf6129f2565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611981573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611a229088908890879030904290600401612a3e565b5f604051808303815f875af1158015611a3d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a829190810190612ac8565b905080600181518110611a9757611a976129f2565b6020026020010151925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b849190612a1f565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190525f608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303815f875af1158015611c73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c979190612b74565b50611ca38160016128f4565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d7357611d736129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611de157611de16129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611e86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eaa9190612bb9565b5050509150505f8113611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161071b565b5f6402540be4006061611f2c8885612990565b611f369190612990565b611f4091906129a7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611ff7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201b9190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612098908a908690899030904290600401612a3e565b5f604051808303815f875af11580156120b3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120f89190810190612ac8565b90508060018151811061210d5761210d6129f2565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc9190612c07565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156122b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190612a1f565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561236a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238e9190612a1f565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561246a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190612c22565b939793965092945050505050565b835f826124a98587612990565b6124b391906129a7565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612546573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256a9190612a1f565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612c4e83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146125ee575f5ffd5b50565b5f60208284031215612601575f5ffd5b813561260c816125cd565b9392505050565b5f60208284031215612623575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269e5761269e61262a565b604052919050565b5f5f67ffffffffffffffff8411156126c0576126c061262a565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126f381612657565b915050828152838383011115612707575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f6060848603121561272f575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612753575f5ffd5b8401601f81018613612763575f5ffd5b612772868235602084016126a6565b9150509250925092565b5f82601f83011261278b575f5ffd5b61260c838335602085016126a6565b5f5f5f606084860312156127ac575f5ffd5b833567ffffffffffffffff8111156127c2575f5ffd5b6127ce8682870161277c565b935050602084013567ffffffffffffffff8111156127ea575f5ffd5b6127f68682870161277c565b93969395505050506040919091013590565b5f5f60408385031215612819575f5ffd5b8235612824816125cd565b946020939093013593505050565b5f5f60408385031215612843575f5ffd5b823561284e816125cd565b9150602083013561285e816125cd565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61260c6020830184612869565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611aa457611aa46128c7565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612937576129376128c7565b5060010190565b5f6020828403121561294e575f5ffd5b5051919050565b608081525f6129676080830187612869565b82810360208401526129798187612869565b60ff95909516604084015250506060015292915050565b8082028115828204841417611aa457611aa46128c7565b5f826129da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611aa457611aa46128c7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612a2f575f5ffd5b8151801515811461260c575f5ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612a9b57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612a67565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b5f60208284031215612ad8575f5ffd5b815167ffffffffffffffff811115612aee575f5ffd5b8201601f81018413612afe575f5ffd5b805167ffffffffffffffff811115612b1857612b1861262a565b8060051b612b2860208201612657565b91825260208184018101929081019087841115612b43575f5ffd5b6020850194505b83851015612b6957845180835260209586019590935090910190612b4a565b979650505050505050565b5f60208284031215612b84575f5ffd5b815167ffffffffffffffff8116811461260c575f5ffd5b805169ffffffffffffffffffff81168114612bb4575f5ffd5b919050565b5f5f5f5f5f60a08688031215612bcd575f5ffd5b612bd686612b9b565b60208701516040880151606089015192975090955093509150612bfb60808701612b9b565b90509295509295909350565b5f60208284031215612c17575f5ffd5b815161260c816125cd565b5f5f5f60608486031215612c34575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a264697066735822122015c814fbfb368063ef1d70aa9b890d78bd898c6b9f239c6f7c1388ff1a1d5d7364736f6c634300081c0033", + "bytecode": "0x6101806040526001600255348015610015575f5ffd5b5060405161403538038061403583398101604081905261003491610089565b6001600160a01b0397881660a05295871660c05293861660e052918516610100526080528316610120528216610140521661016052610114565b80516001600160a01b0381168114610084575f5ffd5b919050565b5f5f5f5f5f5f5f5f610100898b0312156100a1575f5ffd5b6100aa8961006e565b97506100b860208a0161006e565b96506100c660408a0161006e565b95506100d460608a0161006e565b9450608089015193506100e960a08a0161006e565b92506100f760c08a0161006e565b915061010560e08a0161006e565b90509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051613e1761021e5f395f81816104470152611e1e01525f81816104fb01528181611ae70152611c2b01525f818161024b0152818161181f01528181611d420152611faf01525f818161056b015261219201525f818161063c0152818161190a015281816119e501528181611f7d0152818161205b0152818161223901528181612315015261242301525f81816102a2015281816117b20152818161193901528181611daf0152818161215e0152818161226b01526123cc01525f81816101ee0152818161188d01528181611b1801528181611bc50152611cae01525f81816104c80152610e870152613e175ff3fe6080604052600436106101d2575f3560e01c80638b9ee610116100fd578063c45a015511610092578063f74e481b11610062578063f74e481b146105d6578063f76c6037146105f5578063f887ea401461062b578063ffa1ad741461065e575f5ffd5b8063c45a01551461055a578063cf4ffb7e1461058d578063d1b0c288146105ac578063dab346ff146105c2575f5ffd5b8063a7be1b50116100cd578063a7be1b50146104ea578063affed0e01461051d578063b1bd3c9514610532578063be399e2b14610545575f5ffd5b80638b9ee610146104695780638e499bcf146104905780639823bb13146104a4578063a5ae390c146104b7575f5ffd5b806336b4134a116101735780635122c409116101435780635122c409146103df5780635eb76db2146103fc578063709a5c9c146104235780637dc0d1d014610436575f5ffd5b806336b4134a146103605780633d0cc3751461037457806340b67a9b14610395578063466ffbce146103c0575f5ffd5b80631265b651116101ae5780631265b6511461029157806314c7312b146102c45780632e0f26251461032657806335f9f8d91461034c575f5ffd5b806231d115146101dd578063051ed8ef1461023a5780630a42f8bd1461026d575f5ffd5b366101d957005b5f5ffd5b3480156101e8575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610245575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610278575f5ffd5b506102836202a30081565b604051908152602001610231565b34801561029c575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cf575f5ffd5b506103066102de3660046125f1565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610231565b348015610331575f5ffd5b5061033a601281565b60405160ff9091168152602001610231565b348015610357575f5ffd5b50610283603281565b34801561036b575f5ffd5b50610283606181565b34801561037f575f5ffd5b5061039361038e3660046125f1565b6106b3565b005b3480156103a0575f5ffd5b506102836103af3660046125f1565b60056020525f908152604090205481565b3480156103cb575f5ffd5b506102106103da366004612613565b610a95565b3480156103ea575f5ffd5b5061028369d3c21bcecceda100000081565b348015610407575f5ffd5b50610410600281565b60405161ffff9091168152602001610231565b61039361043136600461271d565b610aca565b348015610441575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610474575f5ffd5b506102107351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561049b575f5ffd5b506102835f5481565b6103936104b23660046125f1565b610c36565b3480156104c2575f5ffd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f5575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610528575f5ffd5b5061028360075481565b61039361054036600461279a565b610e85565b348015610550575f5ffd5b5061028360015481565b348015610565575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f5ffd5b506103936105a7366004612808565b611176565b3480156105b7575f5ffd5b506102836201518081565b3480156105cd575f5ffd5b50610283600a81565b3480156105e1575f5ffd5b506103936105f03660046125f1565b6114ef565b348015610600575f5ffd5b5061028361060f366004612832565b600460209081525f928352604080842090915290825290205481565b348015610636575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610669575f5ffd5b506106a66040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023191906128b5565b600254600114610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602081815260409283902083516080810185528154815260018201549281018390526002820154948101949094529091015460608301526107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b6202a30081602001516107f191906128f4565b421161087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161071b565b335f90815260056020526040812080549161089983612907565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561090a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e919061293e565b90505f81116109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161071b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a24575f5ffd5b505af1158015610a36573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610a8291815260200190565b60405180910390a2505060016002555050565b60068181548110610aa4575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b5f60015411610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161071b565b335f908152600560205260408120805491610bbb83612907565b91905055505f610bcd6001548561178b565b5f6001819055909150610be1828585611aaa565b90508015610c2f57604051329082905f81818185875af1925050503d805f8114610c26576040519150601f19603f3d011682016040523d82523d5f602084013e610c2b565b606091505b5050505b5050505050565b5f3411610cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161071b565b600282015415610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161071b565b610dc834826128f4565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e0f9084906128f4565b9091555050335f908152600560205260408120805491610e2e83612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b69d3c21bcecceda1000000811015610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161071b565b5f8383601284604051610fbb906125c0565b610fc89493929190612955565b604051809103905ff080158015610fe1573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916110d083612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b6002546001146111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040902080546001820154611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b62015180826001015461128691906128f4565b4210156112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161071b565b5f6112fa8285611d1c565b90505f606461130a600a84612990565b61131491906129a7565b90508060015f82825461132791906128f4565b90915550611337905081836129df565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611387573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab919061293e565b90505f60646113bb603284612990565b6113c591906129a7565b90505f6113d282846129df565b90505f5f6113e18c8986612121565b4260028d015560038c01859055335f908152600560205260408120805493955091935061140d83612907565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f9081526004602090815260408083203384529091529020548015611454576114548d82868d61249c565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c6040516114d3929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b60025460011461155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161071b565b6202a300816020015161162991906128f4565b4211156116b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020548061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161071b565b335f90815260056020526040812080549161176983612907565b919050555061178183828460600151855f015161249c565b5050600160025550565b604080516003808252608082019092525f91829190602082016060803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117e3576117e36129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611851576118516129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118bf576118bf6129f2565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611981573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611a229088908890879030904290600401612a3e565b5f604051808303815f875af1158015611a3d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a829190810190612ac8565b905080600181518110611a9757611a976129f2565b6020026020010151925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b849190612a1f565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190525f608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303815f875af1158015611c73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c979190612b74565b50611ca38160016128f4565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d7357611d736129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611de157611de16129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611e86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eaa9190612bb9565b5050509150505f8113611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161071b565b5f6402540be4006061611f2c8885612990565b611f369190612990565b611f4091906129a7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611ff7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201b9190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612098908a908690899030904290600401612a3e565b5f604051808303815f875af11580156120b3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120f89190810190612ac8565b90508060018151811061210d5761210d6129f2565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc9190612c07565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156122b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190612a1f565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561236a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238e9190612a1f565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561246a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190612c22565b939793965092945050505050565b835f826124a98587612990565b6124b391906129a7565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612546573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256a9190612a1f565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612c4e83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146125ee575f5ffd5b50565b5f60208284031215612601575f5ffd5b813561260c816125cd565b9392505050565b5f60208284031215612623575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269e5761269e61262a565b604052919050565b5f5f67ffffffffffffffff8411156126c0576126c061262a565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126f381612657565b915050828152838383011115612707575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f6060848603121561272f575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612753575f5ffd5b8401601f81018613612763575f5ffd5b612772868235602084016126a6565b9150509250925092565b5f82601f83011261278b575f5ffd5b61260c838335602085016126a6565b5f5f5f606084860312156127ac575f5ffd5b833567ffffffffffffffff8111156127c2575f5ffd5b6127ce8682870161277c565b935050602084013567ffffffffffffffff8111156127ea575f5ffd5b6127f68682870161277c565b93969395505050506040919091013590565b5f5f60408385031215612819575f5ffd5b8235612824816125cd565b946020939093013593505050565b5f5f60408385031215612843575f5ffd5b823561284e816125cd565b9150602083013561285e816125cd565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61260c6020830184612869565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611aa457611aa46128c7565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612937576129376128c7565b5060010190565b5f6020828403121561294e575f5ffd5b5051919050565b608081525f6129676080830187612869565b82810360208401526129798187612869565b60ff95909516604084015250506060015292915050565b8082028115828204841417611aa457611aa46128c7565b5f826129da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611aa457611aa46128c7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612a2f575f5ffd5b8151801515811461260c575f5ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612a9b57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612a67565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b5f60208284031215612ad8575f5ffd5b815167ffffffffffffffff811115612aee575f5ffd5b8201601f81018413612afe575f5ffd5b805167ffffffffffffffff811115612b1857612b1861262a565b8060051b612b2860208201612657565b91825260208184018101929081019087841115612b43575f5ffd5b6020850194505b83851015612b6957845180835260209586019590935090910190612b4a565b979650505050505050565b5f60208284031215612b84575f5ffd5b815167ffffffffffffffff8116811461260c575f5ffd5b805169ffffffffffffffffffff81168114612bb4575f5ffd5b919050565b5f5f5f5f5f60a08688031215612bcd575f5ffd5b612bd686612b9b565b60208701516040880151606089015192975090955093509150612bfb60808701612b9b565b90509295509295909350565b5f60208284031215612c17575f5ffd5b815161260c816125cd565b5f5f5f60608486031215612c34575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a2646970667358221220ff430a9d2043196b4d385eb2ecb9267bc1c488c52f3f7db978b9aa8bb995ab7f64736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106101d2575f3560e01c80638b9ee610116100fd578063c45a015511610092578063f74e481b11610062578063f74e481b146105d6578063f76c6037146105f5578063f887ea401461062b578063ffa1ad741461065e575f5ffd5b8063c45a01551461055a578063cf4ffb7e1461058d578063d1b0c288146105ac578063dab346ff146105c2575f5ffd5b8063a7be1b50116100cd578063a7be1b50146104ea578063affed0e01461051d578063b1bd3c9514610532578063be399e2b14610545575f5ffd5b80638b9ee610146104695780638e499bcf146104905780639823bb13146104a4578063a5ae390c146104b7575f5ffd5b806336b4134a116101735780635122c409116101435780635122c409146103df5780635eb76db2146103fc578063709a5c9c146104235780637dc0d1d014610436575f5ffd5b806336b4134a146103605780633d0cc3751461037457806340b67a9b14610395578063466ffbce146103c0575f5ffd5b80631265b651116101ae5780631265b6511461029157806314c7312b146102c45780632e0f26251461032657806335f9f8d91461034c575f5ffd5b806231d115146101dd578063051ed8ef1461023a5780630a42f8bd1461026d575f5ffd5b366101d957005b5f5ffd5b3480156101e8575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610245575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610278575f5ffd5b506102836202a30081565b604051908152602001610231565b34801561029c575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cf575f5ffd5b506103066102de3660046125f1565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610231565b348015610331575f5ffd5b5061033a601281565b60405160ff9091168152602001610231565b348015610357575f5ffd5b50610283603281565b34801561036b575f5ffd5b50610283606181565b34801561037f575f5ffd5b5061039361038e3660046125f1565b6106b3565b005b3480156103a0575f5ffd5b506102836103af3660046125f1565b60056020525f908152604090205481565b3480156103cb575f5ffd5b506102106103da366004612613565b610a95565b3480156103ea575f5ffd5b5061028369d3c21bcecceda100000081565b348015610407575f5ffd5b50610410600281565b60405161ffff9091168152602001610231565b61039361043136600461271d565b610aca565b348015610441575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610474575f5ffd5b506102107351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561049b575f5ffd5b506102835f5481565b6103936104b23660046125f1565b610c36565b3480156104c2575f5ffd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f5575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610528575f5ffd5b5061028360075481565b61039361054036600461279a565b610e85565b348015610550575f5ffd5b5061028360015481565b348015610565575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f5ffd5b506103936105a7366004612808565b611176565b3480156105b7575f5ffd5b506102836201518081565b3480156105cd575f5ffd5b50610283600a81565b3480156105e1575f5ffd5b506103936105f03660046125f1565b6114ef565b348015610600575f5ffd5b5061028361060f366004612832565b600460209081525f928352604080842090915290825290205481565b348015610636575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610669575f5ffd5b506106a66040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023191906128b5565b600254600114610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602081815260409283902083516080810185528154815260018201549281018390526002820154948101949094529091015460608301526107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b6202a30081602001516107f191906128f4565b421161087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161071b565b335f90815260056020526040812080549161089983612907565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561090a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e919061293e565b90505f81116109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161071b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a24575f5ffd5b505af1158015610a36573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610a8291815260200190565b60405180910390a2505060016002555050565b60068181548110610aa4575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b5f60015411610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161071b565b335f908152600560205260408120805491610bbb83612907565b91905055505f610bcd6001548561178b565b5f6001819055909150610be1828585611aaa565b90508015610c2f57604051329082905f81818185875af1925050503d805f8114610c26576040519150601f19603f3d011682016040523d82523d5f602084013e610c2b565b606091505b5050505b5050505050565b5f3411610cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161071b565b600282015415610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161071b565b610dc834826128f4565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e0f9084906128f4565b9091555050335f908152600560205260408120805491610e2e83612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b69d3c21bcecceda1000000811015610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161071b565b5f8383601284604051610fbb906125c0565b610fc89493929190612955565b604051809103905ff080158015610fe1573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916110d083612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b6002546001146111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040902080546001820154611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b62015180826001015461128691906128f4565b4210156112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161071b565b5f6112fa8285611d1c565b90505f606461130a600a84612990565b61131491906129a7565b90508060015f82825461132791906128f4565b90915550611337905081836129df565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611387573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab919061293e565b90505f60646113bb603284612990565b6113c591906129a7565b90505f6113d282846129df565b90505f5f6113e18c8986612121565b4260028d015560038c01859055335f908152600560205260408120805493955091935061140d83612907565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f9081526004602090815260408083203384529091529020548015611454576114548d82868d61249c565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c6040516114d3929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b60025460011461155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161071b565b6202a300816020015161162991906128f4565b4211156116b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020548061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161071b565b335f90815260056020526040812080549161176983612907565b919050555061178183828460600151855f015161249c565b5050600160025550565b604080516003808252608082019092525f91829190602082016060803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117e3576117e36129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611851576118516129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118bf576118bf6129f2565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611981573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611a229088908890879030904290600401612a3e565b5f604051808303815f875af1158015611a3d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a829190810190612ac8565b905080600181518110611a9757611a976129f2565b6020026020010151925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b849190612a1f565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190525f608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303815f875af1158015611c73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c979190612b74565b50611ca38160016128f4565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d7357611d736129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611de157611de16129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611e86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eaa9190612bb9565b5050509150505f8113611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161071b565b5f6402540be4006061611f2c8885612990565b611f369190612990565b611f4091906129a7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611ff7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201b9190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612098908a908690899030904290600401612a3e565b5f604051808303815f875af11580156120b3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120f89190810190612ac8565b90508060018151811061210d5761210d6129f2565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc9190612c07565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156122b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190612a1f565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561236a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238e9190612a1f565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561246a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190612c22565b939793965092945050505050565b835f826124a98587612990565b6124b391906129a7565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612546573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256a9190612a1f565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612c4e83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146125ee575f5ffd5b50565b5f60208284031215612601575f5ffd5b813561260c816125cd565b9392505050565b5f60208284031215612623575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269e5761269e61262a565b604052919050565b5f5f67ffffffffffffffff8411156126c0576126c061262a565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126f381612657565b915050828152838383011115612707575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f6060848603121561272f575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612753575f5ffd5b8401601f81018613612763575f5ffd5b612772868235602084016126a6565b9150509250925092565b5f82601f83011261278b575f5ffd5b61260c838335602085016126a6565b5f5f5f606084860312156127ac575f5ffd5b833567ffffffffffffffff8111156127c2575f5ffd5b6127ce8682870161277c565b935050602084013567ffffffffffffffff8111156127ea575f5ffd5b6127f68682870161277c565b93969395505050506040919091013590565b5f5f60408385031215612819575f5ffd5b8235612824816125cd565b946020939093013593505050565b5f5f60408385031215612843575f5ffd5b823561284e816125cd565b9150602083013561285e816125cd565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61260c6020830184612869565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611aa457611aa46128c7565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612937576129376128c7565b5060010190565b5f6020828403121561294e575f5ffd5b5051919050565b608081525f6129676080830187612869565b82810360208401526129798187612869565b60ff95909516604084015250506060015292915050565b8082028115828204841417611aa457611aa46128c7565b5f826129da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611aa457611aa46128c7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612a2f575f5ffd5b8151801515811461260c575f5ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612a9b57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612a67565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b5f60208284031215612ad8575f5ffd5b815167ffffffffffffffff811115612aee575f5ffd5b8201601f81018413612afe575f5ffd5b805167ffffffffffffffff811115612b1857612b1861262a565b8060051b612b2860208201612657565b91825260208184018101929081019087841115612b43575f5ffd5b6020850194505b83851015612b6957845180835260209586019590935090910190612b4a565b979650505050505050565b5f60208284031215612b84575f5ffd5b815167ffffffffffffffff8116811461260c575f5ffd5b805169ffffffffffffffffffff81168114612bb4575f5ffd5b919050565b5f5f5f5f5f60a08688031215612bcd575f5ffd5b612bd686612b9b565b60208701516040880151606089015192975090955093509150612bfb60808701612b9b565b90509295509295909350565b5f60208284031215612c17575f5ffd5b815161260c816125cd565b5f5f5f60608486031215612c34575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a2646970667358221220ff430a9d2043196b4d385eb2ecb9267bc1c488c52f3f7db978b9aa8bb995ab7f64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/MemeBase.sol b/contracts/MemeBase.sol index a590366..ff55dfb 100644 --- a/contracts/MemeBase.sol +++ b/contracts/MemeBase.sol @@ -147,12 +147,12 @@ contract MemeBase is MemeFactory { } /// @dev Bridges OLAS amount back to L1 and burns. - /// @param OLASAmount OLAS amount. + /// @param olasAmount OLAS amount. /// @param tokenGasLimit Token gas limit for bridging OLAS to L1. /// @return msg.value leftovers if partially utilized by the bridge. - function _bridgeAndBurn(uint256 OLASAmount, uint256 tokenGasLimit, bytes memory) internal override returns (uint256) { + function _bridgeAndBurn(uint256 olasAmount, uint256 tokenGasLimit, bytes memory) internal override returns (uint256) { // Approve bridge to use OLAS - IERC20(olas).approve(l2TokenRelayer, OLASAmount); + IERC20(olas).approve(l2TokenRelayer, olasAmount); // Check for sufficient minimum gas limit if (tokenGasLimit < TOKEN_GAS_LIMIT) { @@ -160,12 +160,12 @@ contract MemeBase is MemeFactory { } // Data for the mainnet validate the OLAS burn - bytes memory data = abi.encodeWithSignature("burn(uint256)", OLASAmount); + bytes memory data = abi.encodeWithSignature("burn(uint256)", olasAmount); // Bridge OLAS to mainnet to get burned - IBridge(l2TokenRelayer).withdrawTo(olas, OLAS_BURNER, OLASAmount, uint32(tokenGasLimit), data); + IBridge(l2TokenRelayer).withdrawTo(olas, OLAS_BURNER, olasAmount, uint32(tokenGasLimit), data); - emit OLASJourneyToAscendance(olas, OLASAmount); + emit OLASJourneyToAscendance(olas, olasAmount); return msg.value; } diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index ef488ac..71d9652 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -140,23 +140,23 @@ contract MemeCelo is MemeFactory { } /// @dev Bridges OLAS amount back to L1 and burns. - /// @param OLASAmount OLAS amount. + /// @param olasAmount OLAS amount. /// @return msg.value leftovers if partially utilized by the bridge. - function _bridgeAndBurn(uint256 OLASAmount, uint256, bytes memory) internal override returns (uint256) { + function _bridgeAndBurn(uint256 olasAmount, uint256, bytes memory) internal override returns (uint256) { // Approve bridge to use OLAS - IERC20(olas).approve(l2TokenRelayer, OLASAmount); + IERC20(olas).approve(l2TokenRelayer, olasAmount); // Bridge arguments bytes32 olasBurner = bytes32(uint256(uint160(OLAS_BURNER))); uint256 localNonce = nonce; // Bridge OLAS to mainnet to get burned - IBridge(l2TokenRelayer).transferTokens(olas, OLASAmount, WORMHOLE_ETH_CHAIN_ID, olasBurner, 0, uint32(nonce)); + IBridge(l2TokenRelayer).transferTokens(olas, olasAmount, WORMHOLE_ETH_CHAIN_ID, olasBurner, 0, uint32(nonce)); // Adjust nonce nonce = localNonce + 1; - emit OLASJourneyToAscendance(olas, OLASAmount); + emit OLASJourneyToAscendance(olas, olasAmount); return msg.value; } From 28219a06461663855764712e01f48644111c5fe5 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 13:31:49 +0000 Subject: [PATCH 08/13] chore: config update --- scripts/deployment/globals_base_mainnet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/deployment/globals_base_mainnet.json b/scripts/deployment/globals_base_mainnet.json index 3757e18..12f9b6c 100644 --- a/scripts/deployment/globals_base_mainnet.json +++ b/scripts/deployment/globals_base_mainnet.json @@ -1 +1 @@ -{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"base","networkURL":"https://mainnet.base.org","gasPriceInGwei":"2","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","usdcAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","wethAddress":"0x4200000000000000000000000000000000000006","routerAddress":"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24","factoryAddress":"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6","minNativeTokenValue":"10000000000000000","l2TokenBridgeAddress":"0x4200000000000000000000000000000000000010","oracleAddress":"0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70","balancerVaultAddress":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","balancerPoolId":"0x5332584890d6e415a6dc910254d6430b8aab7e69000200000000000000000103"} \ No newline at end of file +{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"base","networkURL":"https://mainnet.base.org","gasPriceInGwei":"2","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","usdcAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","routerAddress":"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24","factoryAddress":"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6","minNativeTokenValue":"10000000000000000","wethAddress":"0x4200000000000000000000000000000000000006","l2TokenBridgeAddress":"0x4200000000000000000000000000000000000010","oracleAddress":"0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70","balancerVaultAddress":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","balancerPoolId":"0x5332584890d6e415a6dc910254d6430b8aab7e69000200000000000000000103"} \ No newline at end of file From 3d86cf4769156272f23630e626cc25c3a00dcad0 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 16:29:19 +0000 Subject: [PATCH 09/13] test: testing celo contract --- hardhat.config.js | 3 ++ test/MemeCelo.js | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 test/MemeCelo.js diff --git a/hardhat.config.js b/hardhat.config.js index db0e789..ede58e7 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -42,6 +42,9 @@ module.exports = { local: { url: "http://localhost:8545", }, + localcelo: { + url: "http://127.0.0.1:9000", + }, mainnet: { url: "https://eth-mainnet.g.alchemy.com/v2/" + ALCHEMY_API_KEY_MAINNET, accounts: accounts, diff --git a/test/MemeCelo.js b/test/MemeCelo.js new file mode 100644 index 0000000..26bdf49 --- /dev/null +++ b/test/MemeCelo.js @@ -0,0 +1,75 @@ +/*global describe, context, beforeEach, it*/ +const { expect } = require("chai"); +const { ethers } = require("hardhat"); +const helpers = require("@nomicfoundation/hardhat-network-helpers"); + +// This works on a fork only! +const main = async () => { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + const parsedData = JSON.parse(dataFromJSON); + + const AddressZero = ethers.constants.AddressZero; + const HashZero = ethers.constants.HashZero; + const name = "Meme"; + const symbol = "MM"; + const totalSupply = "1" + "0".repeat(24); + const defaultDeposit = parsedData.minNativeTokenValue;//ethers.utils.parseEther("1"); + const defaultHash = "0x" + "5".repeat(64); + const payload = "0x"; + const oneDay = 86400; + const twoDays = 2 * oneDay; + + signers = await ethers.getSigners(); + deployer = signers[0]; + + const Meme = await ethers.getContractFactory("Meme"); + const meme = await Meme.deploy(name, symbol, 18, totalSupply); + await meme.deployed(); + + const celo = await ethers.getContractAt("Meme", parsedData.celoAddress); +// console.log(await celo.balanceOf(deployer.address)); +// console.log(await ethers.provider.getBalance(deployer.address)); + + const MemeCelo = await ethers.getContractFactory("MemeCelo"); + const memeCelo = await MemeCelo.deploy(parsedData.olasAddress, parsedData.cusdAddress, parsedData.routerAddress, + parsedData.factoryAddress, parsedData.minNativeTokenValue, parsedData.celoAddress, + parsedData.l2TokenBridgeAddress, parsedData.oracleAddress); + await memeCelo.deployed(); + + // Summon a new meme token + await memeCelo.summonThisMeme(name, symbol, totalSupply, {value: defaultDeposit}); + const memeToken = await memeCelo.memeTokens(0); + console.log("New meme contract:", memeToken); +// console.log(await celo.balanceOf(deployer.address)); +// console.log(await ethers.provider.getBalance(deployer.address)); + + // Heart a new token by other accounts + await memeCelo.connect(signers[1]).heartThisMeme(memeToken, {value: defaultDeposit}); + await memeCelo.connect(signers[2]).heartThisMeme(memeToken, {value: defaultDeposit}); + + let block = await ethers.provider.getBlock("latest"); + console.log("Block number before", block.number); + console.log("Timestamp before", block.timestamp); + + // Increase time to for 24 hours+ + await helpers.time.increase(oneDay + 100); + + block = await ethers.provider.getBlock("latest"); + console.log("Block number before", block.number); + console.log("Timestamp after", block.timestamp); + + // Unleash the meme token + await memeCelo.unleashThisMeme(memeToken, 0); + + // Collect by the first signer + await memeCelo.collectThisMeme(memeToken); +}; + +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); From c041561a3d1ce96a931b515ca0ed0179a25a89c2 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 19:54:17 +0000 Subject: [PATCH 10/13] fix: wormhole decimals --- contracts/MemeCelo.sol | 4 ++++ hardhat.config.js | 2 +- test/MemeCelo.js | 12 ------------ 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index 71d9652..6dc1362 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -52,6 +52,8 @@ interface IUniswap { contract MemeCelo is MemeFactory { // Slippage parameter (3%) uint256 public constant SLIPPAGE = 97; + // Wormhole bridging decimals cutoff + uint256 public constant WORMHOLE_BRIDGING_CUTOFF = 10^10; // Ethereum mainnet chain Id in Wormhole format uint16 public constant WORMHOLE_ETH_CHAIN_ID = 2; @@ -143,6 +145,8 @@ contract MemeCelo is MemeFactory { /// @param olasAmount OLAS amount. /// @return msg.value leftovers if partially utilized by the bridge. function _bridgeAndBurn(uint256 olasAmount, uint256, bytes memory) internal override returns (uint256) { + require(olasAmount / WORMHOLE_BRIDGING_CUTOFF > 0, "Amount is too small for bridging"); + // Approve bridge to use OLAS IERC20(olas).approve(l2TokenRelayer, olasAmount); diff --git a/hardhat.config.js b/hardhat.config.js index ede58e7..9747ba8 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -42,7 +42,7 @@ module.exports = { local: { url: "http://localhost:8545", }, - localcelo: { + localFork: { url: "http://127.0.0.1:9000", }, mainnet: { diff --git a/test/MemeCelo.js b/test/MemeCelo.js index 26bdf49..2998a37 100644 --- a/test/MemeCelo.js +++ b/test/MemeCelo.js @@ -29,8 +29,6 @@ const main = async () => { await meme.deployed(); const celo = await ethers.getContractAt("Meme", parsedData.celoAddress); -// console.log(await celo.balanceOf(deployer.address)); -// console.log(await ethers.provider.getBalance(deployer.address)); const MemeCelo = await ethers.getContractFactory("MemeCelo"); const memeCelo = await MemeCelo.deploy(parsedData.olasAddress, parsedData.cusdAddress, parsedData.routerAddress, @@ -42,24 +40,14 @@ const main = async () => { await memeCelo.summonThisMeme(name, symbol, totalSupply, {value: defaultDeposit}); const memeToken = await memeCelo.memeTokens(0); console.log("New meme contract:", memeToken); -// console.log(await celo.balanceOf(deployer.address)); -// console.log(await ethers.provider.getBalance(deployer.address)); // Heart a new token by other accounts await memeCelo.connect(signers[1]).heartThisMeme(memeToken, {value: defaultDeposit}); await memeCelo.connect(signers[2]).heartThisMeme(memeToken, {value: defaultDeposit}); - let block = await ethers.provider.getBlock("latest"); - console.log("Block number before", block.number); - console.log("Timestamp before", block.timestamp); - // Increase time to for 24 hours+ await helpers.time.increase(oneDay + 100); - block = await ethers.provider.getBlock("latest"); - console.log("Block number before", block.number); - console.log("Timestamp after", block.timestamp); - // Unleash the meme token await memeCelo.unleashThisMeme(memeToken, 0); From f984df363336409a913b86c0d52fcd02b6f40d01 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 19:59:29 +0000 Subject: [PATCH 11/13] chore: ABI update --- abis/0.8.28/MemeActivityChecker.json | 111 +++++++++++++++++++++++++++ abis/0.8.28/MemeCelo.json | 17 +++- 2 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 abis/0.8.28/MemeActivityChecker.json diff --git a/abis/0.8.28/MemeActivityChecker.json b/abis/0.8.28/MemeActivityChecker.json new file mode 100644 index 0000000..9df78d6 --- /dev/null +++ b/abis/0.8.28/MemeActivityChecker.json @@ -0,0 +1,111 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MemeActivityChecker", + "sourceName": "contracts/MemeActivityChecker.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_memeFactory", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_livenessRatio", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "multisig", + "type": "address" + } + ], + "name": "getMultisigNonces", + "outputs": [ + { + "internalType": "uint256[]", + "name": "nonces", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "curNonces", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "lastNonces", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "ts", + "type": "uint256" + } + ], + "name": "isRatioPass", + "outputs": [ + { + "internalType": "bool", + "name": "ratioPass", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "livenessRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "memeFactory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561000f575f5ffd5b506040516106a53803806106a583398101604081905261002e9161008b565b6001600160a01b0382166100555760405163d92e233d60e01b815260040160405180910390fd5b805f0361007557604051637c946ed760e01b815260040160405180910390fd5b6001600160a01b0390911660a0526080526100c2565b5f5f6040838503121561009c575f5ffd5b82516001600160a01b03811681146100b2575f5ffd5b6020939093015192949293505050565b60805160a0516105b66100ef5f395f8181607b015261024f01525f818160c701526101bb01526105b65ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c8063184023a51461004e5780633a1e202914610076578063592cf3fb146100c2578063d564c4bf146100f7575b5f5ffd5b61006161005c3660046103c4565b610117565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b6100e97f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161006d565b61010a610105366004610432565b6101e7565b60405161006d9190610465565b5f5f821180156101585750825f81518110610134576101346104a7565b6020026020010151845f8151811061014e5761014e6104a7565b6020026020010151115b156101e0575f82845f81518110610171576101716104a7565b6020026020010151865f8151811061018b5761018b6104a7565b602002602001015161019d9190610501565b6101af90670de0b6b3a764000061051a565b6101b99190610531565b7f000000000000000000000000000000000000000000000000000000000000000011159150505b9392505050565b60408051600180825281830190925260609160208083019080368337019050506040517f40b67a9b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906340b67a9b90602401602060405180830381865afa158015610296573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ba9190610569565b815f815181106102cc576102cc6104a7565b602002602001018181525050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610319575f5ffd5b813567ffffffffffffffff811115610333576103336102dd565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff8211171561037e5761037e6102dd565b60405291825260208185018101929081018684111561039b575f5ffd5b6020860192505b838310156103ba5782358152602092830192016103a2565b5095945050505050565b5f5f5f606084860312156103d6575f5ffd5b833567ffffffffffffffff8111156103ec575f5ffd5b6103f88682870161030a565b935050602084013567ffffffffffffffff811115610414575f5ffd5b6104208682870161030a565b93969395505050506040919091013590565b5f60208284031215610442575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff811681146101e0575f5ffd5b602080825282518282018190525f918401906040840190835b8181101561049c57835183526020938401939092019160010161047e565b509095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610514576105146104d4565b92915050565b8082028115828204841417610514576105146104d4565b5f82610564577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215610579575f5ffd5b505191905056fea26469706673582212200237ce05a270515db95c1f6b2b17768afe7f4860920d5c1920a1c9085ed8908564736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c8063184023a51461004e5780633a1e202914610076578063592cf3fb146100c2578063d564c4bf146100f7575b5f5ffd5b61006161005c3660046103c4565b610117565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b6100e97f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161006d565b61010a610105366004610432565b6101e7565b60405161006d9190610465565b5f5f821180156101585750825f81518110610134576101346104a7565b6020026020010151845f8151811061014e5761014e6104a7565b6020026020010151115b156101e0575f82845f81518110610171576101716104a7565b6020026020010151865f8151811061018b5761018b6104a7565b602002602001015161019d9190610501565b6101af90670de0b6b3a764000061051a565b6101b99190610531565b7f000000000000000000000000000000000000000000000000000000000000000011159150505b9392505050565b60408051600180825281830190925260609160208083019080368337019050506040517f40b67a9b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906340b67a9b90602401602060405180830381865afa158015610296573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ba9190610569565b815f815181106102cc576102cc6104a7565b602002602001018181525050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610319575f5ffd5b813567ffffffffffffffff811115610333576103336102dd565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff8211171561037e5761037e6102dd565b60405291825260208185018101929081018684111561039b575f5ffd5b6020860192505b838310156103ba5782358152602092830192016103a2565b5095945050505050565b5f5f5f606084860312156103d6575f5ffd5b833567ffffffffffffffff8111156103ec575f5ffd5b6103f88682870161030a565b935050602084013567ffffffffffffffff811115610414575f5ffd5b6104208682870161030a565b93969395505050506040919091013590565b5f60208284031215610442575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff811681146101e0575f5ffd5b602080825282518282018190525f918401906040840190835b8181101561049c57835183526020938401939092019160010161047e565b509095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610514576105146104d4565b92915050565b8082028115828204841417610514576105146104d4565b5f82610564577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215610579575f5ffd5b505191905056fea26469706673582212200237ce05a270515db95c1f6b2b17768afe7f4860920d5c1920a1c9085ed8908564736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/abis/0.8.28/MemeCelo.json b/abis/0.8.28/MemeCelo.json index 19dc346..1c18a34 100644 --- a/abis/0.8.28/MemeCelo.json +++ b/abis/0.8.28/MemeCelo.json @@ -316,6 +316,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "WORMHOLE_BRIDGING_CUTOFF", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "WORMHOLE_ETH_CHAIN_ID", @@ -676,8 +689,8 @@ "type": "receive" } ], - "bytecode": "0x6101806040526001600255348015610015575f5ffd5b5060405161403538038061403583398101604081905261003491610089565b6001600160a01b0397881660a05295871660c05293861660e052918516610100526080528316610120528216610140521661016052610114565b80516001600160a01b0381168114610084575f5ffd5b919050565b5f5f5f5f5f5f5f5f610100898b0312156100a1575f5ffd5b6100aa8961006e565b97506100b860208a0161006e565b96506100c660408a0161006e565b95506100d460608a0161006e565b9450608089015193506100e960a08a0161006e565b92506100f760c08a0161006e565b915061010560e08a0161006e565b90509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051613e1761021e5f395f81816104470152611e1e01525f81816104fb01528181611ae70152611c2b01525f818161024b0152818161181f01528181611d420152611faf01525f818161056b015261219201525f818161063c0152818161190a015281816119e501528181611f7d0152818161205b0152818161223901528181612315015261242301525f81816102a2015281816117b20152818161193901528181611daf0152818161215e0152818161226b01526123cc01525f81816101ee0152818161188d01528181611b1801528181611bc50152611cae01525f81816104c80152610e870152613e175ff3fe6080604052600436106101d2575f3560e01c80638b9ee610116100fd578063c45a015511610092578063f74e481b11610062578063f74e481b146105d6578063f76c6037146105f5578063f887ea401461062b578063ffa1ad741461065e575f5ffd5b8063c45a01551461055a578063cf4ffb7e1461058d578063d1b0c288146105ac578063dab346ff146105c2575f5ffd5b8063a7be1b50116100cd578063a7be1b50146104ea578063affed0e01461051d578063b1bd3c9514610532578063be399e2b14610545575f5ffd5b80638b9ee610146104695780638e499bcf146104905780639823bb13146104a4578063a5ae390c146104b7575f5ffd5b806336b4134a116101735780635122c409116101435780635122c409146103df5780635eb76db2146103fc578063709a5c9c146104235780637dc0d1d014610436575f5ffd5b806336b4134a146103605780633d0cc3751461037457806340b67a9b14610395578063466ffbce146103c0575f5ffd5b80631265b651116101ae5780631265b6511461029157806314c7312b146102c45780632e0f26251461032657806335f9f8d91461034c575f5ffd5b806231d115146101dd578063051ed8ef1461023a5780630a42f8bd1461026d575f5ffd5b366101d957005b5f5ffd5b3480156101e8575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610245575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610278575f5ffd5b506102836202a30081565b604051908152602001610231565b34801561029c575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cf575f5ffd5b506103066102de3660046125f1565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610231565b348015610331575f5ffd5b5061033a601281565b60405160ff9091168152602001610231565b348015610357575f5ffd5b50610283603281565b34801561036b575f5ffd5b50610283606181565b34801561037f575f5ffd5b5061039361038e3660046125f1565b6106b3565b005b3480156103a0575f5ffd5b506102836103af3660046125f1565b60056020525f908152604090205481565b3480156103cb575f5ffd5b506102106103da366004612613565b610a95565b3480156103ea575f5ffd5b5061028369d3c21bcecceda100000081565b348015610407575f5ffd5b50610410600281565b60405161ffff9091168152602001610231565b61039361043136600461271d565b610aca565b348015610441575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610474575f5ffd5b506102107351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561049b575f5ffd5b506102835f5481565b6103936104b23660046125f1565b610c36565b3480156104c2575f5ffd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f5575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610528575f5ffd5b5061028360075481565b61039361054036600461279a565b610e85565b348015610550575f5ffd5b5061028360015481565b348015610565575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f5ffd5b506103936105a7366004612808565b611176565b3480156105b7575f5ffd5b506102836201518081565b3480156105cd575f5ffd5b50610283600a81565b3480156105e1575f5ffd5b506103936105f03660046125f1565b6114ef565b348015610600575f5ffd5b5061028361060f366004612832565b600460209081525f928352604080842090915290825290205481565b348015610636575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610669575f5ffd5b506106a66040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023191906128b5565b600254600114610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602081815260409283902083516080810185528154815260018201549281018390526002820154948101949094529091015460608301526107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b6202a30081602001516107f191906128f4565b421161087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161071b565b335f90815260056020526040812080549161089983612907565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561090a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e919061293e565b90505f81116109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161071b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a24575f5ffd5b505af1158015610a36573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610a8291815260200190565b60405180910390a2505060016002555050565b60068181548110610aa4575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b5f60015411610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161071b565b335f908152600560205260408120805491610bbb83612907565b91905055505f610bcd6001548561178b565b5f6001819055909150610be1828585611aaa565b90508015610c2f57604051329082905f81818185875af1925050503d805f8114610c26576040519150601f19603f3d011682016040523d82523d5f602084013e610c2b565b606091505b5050505b5050505050565b5f3411610cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161071b565b600282015415610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161071b565b610dc834826128f4565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e0f9084906128f4565b9091555050335f908152600560205260408120805491610e2e83612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b69d3c21bcecceda1000000811015610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161071b565b5f8383601284604051610fbb906125c0565b610fc89493929190612955565b604051809103905ff080158015610fe1573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916110d083612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b6002546001146111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040902080546001820154611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b62015180826001015461128691906128f4565b4210156112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161071b565b5f6112fa8285611d1c565b90505f606461130a600a84612990565b61131491906129a7565b90508060015f82825461132791906128f4565b90915550611337905081836129df565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611387573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab919061293e565b90505f60646113bb603284612990565b6113c591906129a7565b90505f6113d282846129df565b90505f5f6113e18c8986612121565b4260028d015560038c01859055335f908152600560205260408120805493955091935061140d83612907565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f9081526004602090815260408083203384529091529020548015611454576114548d82868d61249c565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c6040516114d3929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b60025460011461155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161071b565b6202a300816020015161162991906128f4565b4211156116b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020548061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161071b565b335f90815260056020526040812080549161176983612907565b919050555061178183828460600151855f015161249c565b5050600160025550565b604080516003808252608082019092525f91829190602082016060803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117e3576117e36129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611851576118516129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118bf576118bf6129f2565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611981573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611a229088908890879030904290600401612a3e565b5f604051808303815f875af1158015611a3d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a829190810190612ac8565b905080600181518110611a9757611a976129f2565b6020026020010151925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b849190612a1f565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190525f608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303815f875af1158015611c73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c979190612b74565b50611ca38160016128f4565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d7357611d736129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611de157611de16129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611e86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eaa9190612bb9565b5050509150505f8113611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161071b565b5f6402540be4006061611f2c8885612990565b611f369190612990565b611f4091906129a7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611ff7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201b9190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612098908a908690899030904290600401612a3e565b5f604051808303815f875af11580156120b3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120f89190810190612ac8565b90508060018151811061210d5761210d6129f2565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc9190612c07565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156122b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190612a1f565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561236a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238e9190612a1f565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561246a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190612c22565b939793965092945050505050565b835f826124a98587612990565b6124b391906129a7565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612546573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256a9190612a1f565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612c4e83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146125ee575f5ffd5b50565b5f60208284031215612601575f5ffd5b813561260c816125cd565b9392505050565b5f60208284031215612623575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269e5761269e61262a565b604052919050565b5f5f67ffffffffffffffff8411156126c0576126c061262a565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126f381612657565b915050828152838383011115612707575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f6060848603121561272f575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612753575f5ffd5b8401601f81018613612763575f5ffd5b612772868235602084016126a6565b9150509250925092565b5f82601f83011261278b575f5ffd5b61260c838335602085016126a6565b5f5f5f606084860312156127ac575f5ffd5b833567ffffffffffffffff8111156127c2575f5ffd5b6127ce8682870161277c565b935050602084013567ffffffffffffffff8111156127ea575f5ffd5b6127f68682870161277c565b93969395505050506040919091013590565b5f5f60408385031215612819575f5ffd5b8235612824816125cd565b946020939093013593505050565b5f5f60408385031215612843575f5ffd5b823561284e816125cd565b9150602083013561285e816125cd565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61260c6020830184612869565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611aa457611aa46128c7565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612937576129376128c7565b5060010190565b5f6020828403121561294e575f5ffd5b5051919050565b608081525f6129676080830187612869565b82810360208401526129798187612869565b60ff95909516604084015250506060015292915050565b8082028115828204841417611aa457611aa46128c7565b5f826129da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611aa457611aa46128c7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612a2f575f5ffd5b8151801515811461260c575f5ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612a9b57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612a67565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b5f60208284031215612ad8575f5ffd5b815167ffffffffffffffff811115612aee575f5ffd5b8201601f81018413612afe575f5ffd5b805167ffffffffffffffff811115612b1857612b1861262a565b8060051b612b2860208201612657565b91825260208184018101929081019087841115612b43575f5ffd5b6020850194505b83851015612b6957845180835260209586019590935090910190612b4a565b979650505050505050565b5f60208284031215612b84575f5ffd5b815167ffffffffffffffff8116811461260c575f5ffd5b805169ffffffffffffffffffff81168114612bb4575f5ffd5b919050565b5f5f5f5f5f60a08688031215612bcd575f5ffd5b612bd686612b9b565b60208701516040880151606089015192975090955093509150612bfb60808701612b9b565b90509295509295909350565b5f60208284031215612c17575f5ffd5b815161260c816125cd565b5f5f5f60608486031215612c34575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a2646970667358221220ff430a9d2043196b4d385eb2ecb9267bc1c488c52f3f7db978b9aa8bb995ab7f64736f6c634300081c0033", - "deployedBytecode": "0x6080604052600436106101d2575f3560e01c80638b9ee610116100fd578063c45a015511610092578063f74e481b11610062578063f74e481b146105d6578063f76c6037146105f5578063f887ea401461062b578063ffa1ad741461065e575f5ffd5b8063c45a01551461055a578063cf4ffb7e1461058d578063d1b0c288146105ac578063dab346ff146105c2575f5ffd5b8063a7be1b50116100cd578063a7be1b50146104ea578063affed0e01461051d578063b1bd3c9514610532578063be399e2b14610545575f5ffd5b80638b9ee610146104695780638e499bcf146104905780639823bb13146104a4578063a5ae390c146104b7575f5ffd5b806336b4134a116101735780635122c409116101435780635122c409146103df5780635eb76db2146103fc578063709a5c9c146104235780637dc0d1d014610436575f5ffd5b806336b4134a146103605780633d0cc3751461037457806340b67a9b14610395578063466ffbce146103c0575f5ffd5b80631265b651116101ae5780631265b6511461029157806314c7312b146102c45780632e0f26251461032657806335f9f8d91461034c575f5ffd5b806231d115146101dd578063051ed8ef1461023a5780630a42f8bd1461026d575f5ffd5b366101d957005b5f5ffd5b3480156101e8575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610245575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610278575f5ffd5b506102836202a30081565b604051908152602001610231565b34801561029c575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cf575f5ffd5b506103066102de3660046125f1565b600360208190525f918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610231565b348015610331575f5ffd5b5061033a601281565b60405160ff9091168152602001610231565b348015610357575f5ffd5b50610283603281565b34801561036b575f5ffd5b50610283606181565b34801561037f575f5ffd5b5061039361038e3660046125f1565b6106b3565b005b3480156103a0575f5ffd5b506102836103af3660046125f1565b60056020525f908152604090205481565b3480156103cb575f5ffd5b506102106103da366004612613565b610a95565b3480156103ea575f5ffd5b5061028369d3c21bcecceda100000081565b348015610407575f5ffd5b50610410600281565b60405161ffff9091168152602001610231565b61039361043136600461271d565b610aca565b348015610441575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610474575f5ffd5b506102107351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561049b575f5ffd5b506102835f5481565b6103936104b23660046125f1565b610c36565b3480156104c2575f5ffd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f5575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610528575f5ffd5b5061028360075481565b61039361054036600461279a565b610e85565b348015610550575f5ffd5b5061028360015481565b348015610565575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f5ffd5b506103936105a7366004612808565b611176565b3480156105b7575f5ffd5b506102836201518081565b3480156105cd575f5ffd5b50610283600a81565b3480156105e1575f5ffd5b506103936105f03660046125f1565b6114ef565b348015610600575f5ffd5b5061028361060f366004612832565b600460209081525f928352604080842090915290825290205481565b348015610636575f5ffd5b506102107f000000000000000000000000000000000000000000000000000000000000000081565b348015610669575f5ffd5b506106a66040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161023191906128b5565b600254600114610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526003602081815260409283902083516080810185528154815260018201549281018390526002820154948101949094529091015460608301526107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b6202a30081602001516107f191906128f4565b421161087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e00000000000000000000000000000000000000606482015260840161071b565b335f90815260056020526040812080549161089983612907565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561090a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e919061293e565b90505f81116109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f7267650000000000000000000000000000000000000000000000000000000000606482015260840161071b565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c68906024015f604051808303815f87803b158015610a24575f5ffd5b505af1158015610a36573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610a8291815260200190565b60405180910390a2505060016002555050565b60068181548110610aa4575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b5f60015411610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e0000000000000000000000000000000000604482015260640161071b565b335f908152600560205260408120805491610bbb83612907565b91905055505f610bcd6001548561178b565b5f6001819055909150610be1828585611aaa565b90508015610c2f57604051329082905f81818185875af1925050503d805f8114610c26576040519150601f19603f3d011682016040523d82523d5f602084013e610c2b565b606091505b5050505b5050505050565b5f3411610cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f00000000000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260409020805480610d52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e65640000000000000000000000604482015260640161071b565b600282015415610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c65617368656400000000000000000000604482015260640161071b565b610dc834826128f4565b80835573ffffffffffffffffffffffffffffffffffffffff84165f908152600460209081526040808320338452909152812080549293503492909190610e0f9084906128f4565b9091555050335f908152600560205260408120805491610e2e83612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b69d3c21bcecceda1000000811015610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d657400604482015260640161071b565b5f8383601284604051610fbb906125c0565b610fc89493929190612955565b604051809103905ff080158015610fe1573d5f5f3e3d5ffd5b5060408051608081018252348082524260208084019182525f8486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915591548155600590915290812080549293508392916110d083612907565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b6002546001146111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040902080546001820154611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e6564000000000000000000000000000000604482015260640161071b565b62015180826001015461128691906128f4565b4210156112ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c65617368207965740000000000000000000000000000604482015260640161071b565b5f6112fa8285611d1c565b90505f606461130a600a84612990565b61131491906129a7565b90508060015f82825461132791906128f4565b90915550611337905081836129df565b91505f8690505f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611387573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab919061293e565b90505f60646113bb603284612990565b6113c591906129a7565b90505f6113d282846129df565b90505f5f6113e18c8986612121565b4260028d015560038c01859055335f908152600560205260408120805493955091935061140d83612907565b909155505073ffffffffffffffffffffffffffffffffffffffff8c165f9081526004602090815260408083203384529091529020548015611454576114548d82868d61249c565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c6040516114d3929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b60025460011461155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e637920677561726400000000000000000000000000000000604482015260640161071b565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260036020818152604092839020835160808101855281548152600182015492810192909252600281015493820184905290910154606082015290611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c6561736865640000000000000000000000000000604482015260640161071b565b6202a300816020015161162991906128f4565b4211156116b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e00000000000000000000000000000000606482015260840161071b565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020548061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e00000000000000000000000000604482015260640161071b565b335f90815260056020526040812080549161176983612907565b919050555061178183828460600151855f015161249c565b5050600160025550565b604080516003808252608082019092525f91829190602082016060803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117e3576117e36129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611851576118516129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816002815181106118bf576118bf6129f2565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611981573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611a229088908890879030904290600401612a3e565b5f604051808303815f875af1158015611a3d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a829190810190612ac8565b905080600181518110611a9757611a976129f2565b6020026020010151925050505b92915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611b60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b849190612a1f565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190525f608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303815f875af1158015611c73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c979190612b74565b50611ca38160016128f4565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110611d7357611d736129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611de157611de16129f2565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303815f875af1158015611e86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eaa9190612bb9565b5050509150505f8113611f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f727265637400000000000000604482015260640161071b565b5f6402540be4006061611f2c8885612990565b611f369190612990565b611f4091906129a7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611ff7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201b9190612a1f565b506040517f38ed17390000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612098908a908690899030904290600401612a3e565b5f604051808303815f875af11580156120b3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120f89190810190612ac8565b90508060018151811061210d5761210d6129f2565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156121d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fc9190612c07565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156122b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190612a1f565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303815f875af115801561236a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238e9190612a1f565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152868116602483015260448201869052606482018590525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af115801561246a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190612c22565b939793965092945050505050565b835f826124a98587612990565b6124b391906129a7565b73ffffffffffffffffffffffffffffffffffffffff8781165f9081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015612546573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256a9190612a1f565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61119480612c4e83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146125ee575f5ffd5b50565b5f60208284031215612601575f5ffd5b813561260c816125cd565b9392505050565b5f60208284031215612623575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269e5761269e61262a565b604052919050565b5f5f67ffffffffffffffff8411156126c0576126c061262a565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016126f381612657565b915050828152838383011115612707575f5ffd5b828260208301375f602084830101529392505050565b5f5f5f6060848603121561272f575f5ffd5b8335925060208401359150604084013567ffffffffffffffff811115612753575f5ffd5b8401601f81018613612763575f5ffd5b612772868235602084016126a6565b9150509250925092565b5f82601f83011261278b575f5ffd5b61260c838335602085016126a6565b5f5f5f606084860312156127ac575f5ffd5b833567ffffffffffffffff8111156127c2575f5ffd5b6127ce8682870161277c565b935050602084013567ffffffffffffffff8111156127ea575f5ffd5b6127f68682870161277c565b93969395505050506040919091013590565b5f5f60408385031215612819575f5ffd5b8235612824816125cd565b946020939093013593505050565b5f5f60408385031215612843575f5ffd5b823561284e816125cd565b9150602083013561285e816125cd565b809150509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61260c6020830184612869565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611aa457611aa46128c7565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612937576129376128c7565b5060010190565b5f6020828403121561294e575f5ffd5b5051919050565b608081525f6129676080830187612869565b82810360208401526129798187612869565b60ff95909516604084015250506060015292915050565b8082028115828204841417611aa457611aa46128c7565b5f826129da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611aa457611aa46128c7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612a2f575f5ffd5b8151801515811461260c575f5ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612a9b57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612a67565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b5f60208284031215612ad8575f5ffd5b815167ffffffffffffffff811115612aee575f5ffd5b8201601f81018413612afe575f5ffd5b805167ffffffffffffffff811115612b1857612b1861262a565b8060051b612b2860208201612657565b91825260208184018101929081019087841115612b43575f5ffd5b6020850194505b83851015612b6957845180835260209586019590935090910190612b4a565b979650505050505050565b5f60208284031215612b84575f5ffd5b815167ffffffffffffffff8116811461260c575f5ffd5b805169ffffffffffffffffffff81168114612bb4575f5ffd5b919050565b5f5f5f5f5f60a08688031215612bcd575f5ffd5b612bd686612b9b565b60208701516040880151606089015192975090955093509150612bfb60808701612b9b565b90509295509295909350565b5f60208284031215612c17575f5ffd5b815161260c816125cd565b5f5f5f60608486031215612c34575f5ffd5b505081516020830151604090930151909492935091905056fe60e060405234801561000f575f5ffd5b5060405161119438038061119483398101604081905261002e91610216565b8383835f61003c848261031d565b506001610049838261031d565b5060ff81166080524660a05261005d610078565b60c0525061006f915033905082610110565b5050505061046d565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516100a891906103d7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546101219190610448565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261019c575f5ffd5b81516001600160401b038111156101b5576101b5610179565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101e3576101e3610179565b6040528181528382016020018510156101fa575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f60808587031215610229575f5ffd5b84516001600160401b0381111561023e575f5ffd5b61024a8782880161018d565b602087015190955090506001600160401b03811115610267575f5ffd5b6102738782880161018d565b935050604085015160ff81168114610289575f5ffd5b6060959095015193969295505050565b600181811c908216806102ad57607f821691505b6020821081036102cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561031857805f5260205f20601f840160051c810160208510156102f65750805b601f840160051c820191505b81811015610315575f8155600101610302565b50505b505050565b81516001600160401b0381111561033657610336610179565b61034a816103448454610299565b846102d1565b6020601f82116001811461037c575f83156103655750848201515b5f19600385901b1c1916600184901b178455610315565b5f84815260208120601f198516915b828110156103ab578785015182556020948501946001909201910161038b565b50848210156103c857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f83546103e481610299565b6001821680156103fb57600181146104105761043d565b60ff198316865281151582028601935061043d565b865f5260205f205f5b8381101561043557815488820152600190910190602001610419565b505081860193505b509195945050505050565b8082018082111561046757634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c051610cfd6104975f395f6104b101525f61047c01525f61014e0152610cfd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101dd578063a9059cbb146101e5578063d505accf146101f8578063dd62ed3e1461020b575f5ffd5b806342966c681461018a57806370a082311461019f5780637ecebe00146101be575f5ffd5b806323b872dd116100b857806323b872dd14610136578063313ce567146101495780633644e51514610182575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e6610235565b6040516100f391906109b9565b60405180910390f35b61010f61010a366004610a34565b6102c0565b60405190151581526020016100f3565b61012860025481565b6040519081526020016100f3565b61010f610144366004610a5c565b610339565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f3565b610128610479565b61019d610198366004610a96565b6104d3565b005b6101286101ad366004610aad565b60036020525f908152604090205481565b6101286101cc366004610aad565b60056020525f908152604090205481565b6100e66104e0565b61010f6101f3366004610a34565b6104ed565b61019d610206366004610acd565b610570565b610128610219366004610b3a565b600460209081525f928352604080842090915290825290205481565b5f805461024190610b6b565b80601f016020809104026020016040519081016040528092919081815260200182805461026d90610b6b565b80156102b85780601f1061028f576101008083540402835291602001916102b8565b820191905f5260205f20905b81548152906001019060200180831161029b57829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103279086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103cb5761039a8382610bbc565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812080548592906103ff908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104669087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104ae576104a961088e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104dd3382610926565b50565b6001805461024190610b6b565b335f9081526003602052604081208054839190839061050d908490610bbc565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103279086815260200190565b428410156105df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f60016105ea610479565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610738573d5f5f3e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107b357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105d6565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108be9190610bf4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120805483929061095a908490610bbc565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a2f575f5ffd5b919050565b5f5f60408385031215610a45575f5ffd5b610a4e83610a0c565b946020939093013593505050565b5f5f5f60608486031215610a6e575f5ffd5b610a7784610a0c565b9250610a8560208501610a0c565b929592945050506040919091013590565b5f60208284031215610aa6575f5ffd5b5035919050565b5f60208284031215610abd575f5ffd5b610ac682610a0c565b9392505050565b5f5f5f5f5f5f5f60e0888a031215610ae3575f5ffd5b610aec88610a0c565b9650610afa60208901610a0c565b95506040880135945060608801359350608088013560ff81168114610b1d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215610b4b575f5ffd5b610b5483610a0c565b9150610b6260208401610a0c565b90509250929050565b600181811c90821680610b7f57607f821691505b602082108103610bb6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b81810381811115610333577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f83545f8160011c90506001821680610c0f57607f821691505b602082108103610c46577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b808015610c5a5760018114610c8d57610cbb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610cbb565b5f888152602090205f5b84811015610cb357815489820152600190910190602001610c97565b505082870194505b5092969550505050505056fea26469706673582212205df7019458ddc6a358585d679221b07a9e24fb31dbf8c630fcd1d119dc2aee2864736f6c634300081c0033a2646970667358221220ff430a9d2043196b4d385eb2ecb9267bc1c488c52f3f7db978b9aa8bb995ab7f64736f6c634300081c0033", + "bytecode": "0x610180604052600160025534801561001657600080fd5b506040516142453803806142458339810160408190526100359161008b565b6001600160a01b0397881660a05295871660c05293861660e05291851661010052608052831661012052821661014052166101605261011b565b80516001600160a01b038116811461008657600080fd5b919050565b600080600080600080600080610100898b0312156100a857600080fd5b6100b18961006f565b97506100bf60208a0161006f565b96506100cd60408a0161006f565b95506100db60608a0161006f565b9450608089015193506100f060a08a0161006f565b92506100fe60c08a0161006f565b915061010c60e08a0161006f565b90509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161401661022f600039600081816104810152611f1b01526000818161053a01528181611bde0152611d220152600081816102620152818161189901528181611e3d01526120b10152600081816105ad015261229e0152600081816106850152818161198401528181611a630152818161207f01528181612161015281816123480152818161242701526125390152600081816102bb0152818161182b015281816119b301528181611eab015281816122690152818161237a01526124e10152600081816102040152818161190701528181611c0d01528181611cbb0152611da80152600081816105060152610ee901526140166000f3fe6080604052600436106101e65760003560e01c80638b9ee61011610102578063c45a015511610095578063f74e481b11610064578063f74e481b1461061b578063f76c60371461063b578063f887ea4014610673578063ffa1ad74146106a757600080fd5b8063c45a01551461059b578063cf4ffb7e146105cf578063d1b0c288146105ef578063dab346ff1461060657600080fd5b8063a7be1b50116100d1578063a7be1b5014610528578063affed0e01461055c578063b1bd3c9514610572578063be399e2b1461058557600080fd5b80638b9ee610146104a35780638e499bcf146104cb5780639823bb13146104e1578063a5ae390c146104f457600080fd5b80633d0cc3751161017a5780635eb76db2116101495780635eb76db21461041f5780636be6af9814610447578063709a5c9c1461045c5780637dc0d1d01461046f57600080fd5b80633d0cc3751461039257806340b67a9b146103b4578063466ffbce146103e15780635122c4091461040157600080fd5b806314c7312b116101b657806314c7312b146102dd5780632e0f26251461034157806335f9f8d91461036857806336b4134a1461037d57600080fd5b806231d115146101f2578063051ed8ef146102505780630a42f8bd146102845780631265b651146102a957600080fd5b366101ed57005b600080fd5b3480156101fe57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561025c57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561029057600080fd5b5061029b6202a30081565b604051908152602001610247565b3480156102b557600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e957600080fd5b506103216102f8366004612710565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610247565b34801561034d57600080fd5b50610356601281565b60405160ff9091168152602001610247565b34801561037457600080fd5b5061029b603281565b34801561038957600080fd5b5061029b606181565b34801561039e57600080fd5b506103b26103ad366004612710565b6106fd565b005b3480156103c057600080fd5b5061029b6103cf366004612710565b60056020526000908152604090205481565b3480156103ed57600080fd5b506102266103fc366004612734565b610aea565b34801561040d57600080fd5b5061029b69d3c21bcecceda100000081565b34801561042b57600080fd5b50610434600281565b60405161ffff9091168152602001610247565b34801561045357600080fd5b5061029b600081565b6103b261046a366004612845565b610b21565b34801561047b57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156104af57600080fd5b506102267351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104d757600080fd5b5061029b60005481565b6103b26104ef366004612710565b610c94565b34801561050057600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561053457600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561056857600080fd5b5061029b60075481565b6103b26105803660046128c9565b610ee7565b34801561059157600080fd5b5061029b60015481565b3480156105a757600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156105db57600080fd5b506103b26105ea36600461293c565b6111dd565b3480156105fb57600080fd5b5061029b6201518081565b34801561061257600080fd5b5061029b600a81565b34801561062757600080fd5b506103b2610636366004612710565b611563565b34801561064757600080fd5b5061029b610656366004612968565b600460209081526000928352604080842090915290825290205481565b34801561067f57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b357600080fd5b506106f06040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102479190612a05565b60025460011461076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101839052600282015494810194909452909101546060830152610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610765565b6202a300816020015161083c9190612a47565b42116108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610765565b3360009081526005602052604081208054916108e583612a5a565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097d9190612a92565b905060008111610a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610765565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610a7757600080fd5b505af1158015610a8b573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ad791815260200190565b60405180910390a2505060016002555050565b60068181548110610afa57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b600060015411610bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610765565b336000908152600560205260408120805491610c1483612a5a565b91905055506000610c2760015485611803565b60006001819055909150610c3c828585611b2d565b90508015610c8d5760405132908290600081818185875af1925050503d8060008114610c84576040519150601f19603f3d011682016040523d82523d6000602084013e610c89565b606091505b5050505b5050505050565b60003411610d24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610765565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610765565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610765565b610e283482612a47565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610e70908490612a47565b9091555050336000908152600560205260408120805491610e9083612a5a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610765565b69d3c21bcecceda100000081101561100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610765565b6000838360128460405161101e906126de565b61102b9493929190612aab565b604051809103906000f080158015611047573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161113783612a5a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020805460018201546112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610765565b6201518082600101546112ee9190612a47565b421015611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610765565b60006113638285611e16565b905060006064611374600a84612ae7565b61137e9190612afe565b905080600160008282546113929190612a47565b909155506113a290508183612b39565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141a9190612a92565b90506000606461142b603284612ae7565b6114359190612afe565b905060006114438284612b39565b90506000806114538c898661222c565b4260028d015560038c01859055336000908152600560205260408120805493955091935061148083612a5a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114c8576114c88d82868d6125b5565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611547929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602081815260409283902083516080810185528154815260018201549281019290925260028101549382018490529091015460608201529061168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610765565b6202a300816020015161169e9190612a47565b42111561172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610765565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610765565b3360009081526005602052604081208054916117e083612a5a565b91905055506117f98382846060015185600001516125b5565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061185d5761185d612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118cb576118cb612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061193957611939612b4c565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156119fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a229190612b7b565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611aa09088908890879030904290600401612b9d565b6000604051808303816000875af1158015611abf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b059190810190612c29565b905080600181518110611b1a57611b1a612b4c565b6020026020010151925050505b92915050565b600080611b3a8186612afe565b11611ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610765565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7a9190612b7b565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d919190612cda565b50611d9d816001612a47565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611e6f57611e6f612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611edd57611edd612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611faa9190612d23565b5050509150506000811361201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610765565b60006402540be400606161202e8885612ae7565b6120389190612ae7565b6120429190612afe565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121209190612b7b565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed17399061219e908a908690899030904290600401612b9d565b6000604051808303816000875af11580156121bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526122039190810190612c29565b90508060018151811061221857612218612b4c565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af11580156122e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230b9190612d75565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156123c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e99190612b7b565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190612b7b565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af1158015612583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a79190612d92565b939793965092945050505050565b836000826125c38587612ae7565b6125cd9190612afe565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015612664573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126889190612b7b565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612dc183390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461270d57600080fd5b50565b60006020828403121561272257600080fd5b813561272d816126eb565b9392505050565b60006020828403121561274657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127c3576127c361274d565b604052919050565b60008067ffffffffffffffff8411156127e6576127e661274d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016128198161277c565b91505082815283838301111561282e57600080fd5b828260208301376000602084830101529392505050565b60008060006060848603121561285a57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561287f57600080fd5b8401601f8101861361289057600080fd5b61289f868235602084016127cb565b9150509250925092565b600082601f8301126128ba57600080fd5b61272d838335602085016127cb565b6000806000606084860312156128de57600080fd5b833567ffffffffffffffff8111156128f557600080fd5b612901868287016128a9565b935050602084013567ffffffffffffffff81111561291e57600080fd5b61292a868287016128a9565b93969395505050506040919091013590565b6000806040838503121561294f57600080fd5b823561295a816126eb565b946020939093013593505050565b6000806040838503121561297b57600080fd5b8235612986816126eb565b91506020830135612996816126eb565b809150509250929050565b6000815180845260005b818110156129c7576020818501810151868301820152016129ab565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061272d60208301846129a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b2757611b27612a18565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a8b57612a8b612a18565b5060010190565b600060208284031215612aa457600080fd5b5051919050565b608081526000612abe60808301876129a1565b8281036020840152612ad081876129a1565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b2757611b27612a18565b600082612b34577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b2757611b27612a18565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612b8d57600080fd5b8151801515811461272d57600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612bfc57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612bc8565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612c3b57600080fd5b815167ffffffffffffffff811115612c5257600080fd5b8201601f81018413612c6357600080fd5b805167ffffffffffffffff811115612c7d57612c7d61274d565b8060051b612c8d6020820161277c565b91825260208184018101929081019087841115612ca957600080fd5b6020850194505b83851015612ccf57845180835260209586019590935090910190612cb0565b979650505050505050565b600060208284031215612cec57600080fd5b815167ffffffffffffffff8116811461272d57600080fd5b805169ffffffffffffffffffff81168114612d1e57600080fd5b919050565b600080600080600060a08688031215612d3b57600080fd5b612d4486612d04565b60208701516040880151606089015192975090955093509150612d6960808701612d04565b90509295509295909350565b600060208284031215612d8757600080fd5b815161272d816126eb565b600080600060608486031215612da757600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a2646970667358221220227dc27d4d896defcba9d61061522501296597abfb5cdadbef77225cb9f0a98364736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106101e65760003560e01c80638b9ee61011610102578063c45a015511610095578063f74e481b11610064578063f74e481b1461061b578063f76c60371461063b578063f887ea4014610673578063ffa1ad74146106a757600080fd5b8063c45a01551461059b578063cf4ffb7e146105cf578063d1b0c288146105ef578063dab346ff1461060657600080fd5b8063a7be1b50116100d1578063a7be1b5014610528578063affed0e01461055c578063b1bd3c9514610572578063be399e2b1461058557600080fd5b80638b9ee610146104a35780638e499bcf146104cb5780639823bb13146104e1578063a5ae390c146104f457600080fd5b80633d0cc3751161017a5780635eb76db2116101495780635eb76db21461041f5780636be6af9814610447578063709a5c9c1461045c5780637dc0d1d01461046f57600080fd5b80633d0cc3751461039257806340b67a9b146103b4578063466ffbce146103e15780635122c4091461040157600080fd5b806314c7312b116101b657806314c7312b146102dd5780632e0f26251461034157806335f9f8d91461036857806336b4134a1461037d57600080fd5b806231d115146101f2578063051ed8ef146102505780630a42f8bd146102845780631265b651146102a957600080fd5b366101ed57005b600080fd5b3480156101fe57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561025c57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561029057600080fd5b5061029b6202a30081565b604051908152602001610247565b3480156102b557600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e957600080fd5b506103216102f8366004612710565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610247565b34801561034d57600080fd5b50610356601281565b60405160ff9091168152602001610247565b34801561037457600080fd5b5061029b603281565b34801561038957600080fd5b5061029b606181565b34801561039e57600080fd5b506103b26103ad366004612710565b6106fd565b005b3480156103c057600080fd5b5061029b6103cf366004612710565b60056020526000908152604090205481565b3480156103ed57600080fd5b506102266103fc366004612734565b610aea565b34801561040d57600080fd5b5061029b69d3c21bcecceda100000081565b34801561042b57600080fd5b50610434600281565b60405161ffff9091168152602001610247565b34801561045357600080fd5b5061029b600081565b6103b261046a366004612845565b610b21565b34801561047b57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156104af57600080fd5b506102267351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104d757600080fd5b5061029b60005481565b6103b26104ef366004612710565b610c94565b34801561050057600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561053457600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561056857600080fd5b5061029b60075481565b6103b26105803660046128c9565b610ee7565b34801561059157600080fd5b5061029b60015481565b3480156105a757600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156105db57600080fd5b506103b26105ea36600461293c565b6111dd565b3480156105fb57600080fd5b5061029b6201518081565b34801561061257600080fd5b5061029b600a81565b34801561062757600080fd5b506103b2610636366004612710565b611563565b34801561064757600080fd5b5061029b610656366004612968565b600460209081526000928352604080842090915290825290205481565b34801561067f57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b357600080fd5b506106f06040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102479190612a05565b60025460011461076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101839052600282015494810194909452909101546060830152610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610765565b6202a300816020015161083c9190612a47565b42116108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610765565b3360009081526005602052604081208054916108e583612a5a565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097d9190612a92565b905060008111610a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610765565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610a7757600080fd5b505af1158015610a8b573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ad791815260200190565b60405180910390a2505060016002555050565b60068181548110610afa57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b600060015411610bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610765565b336000908152600560205260408120805491610c1483612a5a565b91905055506000610c2760015485611803565b60006001819055909150610c3c828585611b2d565b90508015610c8d5760405132908290600081818185875af1925050503d8060008114610c84576040519150601f19603f3d011682016040523d82523d6000602084013e610c89565b606091505b5050505b5050505050565b60003411610d24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610765565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610765565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610765565b610e283482612a47565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610e70908490612a47565b9091555050336000908152600560205260408120805491610e9083612a5a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610765565b69d3c21bcecceda100000081101561100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610765565b6000838360128460405161101e906126de565b61102b9493929190612aab565b604051809103906000f080158015611047573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161113783612a5a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020805460018201546112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610765565b6201518082600101546112ee9190612a47565b421015611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610765565b60006113638285611e16565b905060006064611374600a84612ae7565b61137e9190612afe565b905080600160008282546113929190612a47565b909155506113a290508183612b39565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141a9190612a92565b90506000606461142b603284612ae7565b6114359190612afe565b905060006114438284612b39565b90506000806114538c898661222c565b4260028d015560038c01859055336000908152600560205260408120805493955091935061148083612a5a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114c8576114c88d82868d6125b5565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611547929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602081815260409283902083516080810185528154815260018201549281019290925260028101549382018490529091015460608201529061168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610765565b6202a300816020015161169e9190612a47565b42111561172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610765565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610765565b3360009081526005602052604081208054916117e083612a5a565b91905055506117f98382846060015185600001516125b5565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061185d5761185d612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118cb576118cb612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061193957611939612b4c565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156119fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a229190612b7b565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611aa09088908890879030904290600401612b9d565b6000604051808303816000875af1158015611abf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b059190810190612c29565b905080600181518110611b1a57611b1a612b4c565b6020026020010151925050505b92915050565b600080611b3a8186612afe565b11611ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610765565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7a9190612b7b565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d919190612cda565b50611d9d816001612a47565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611e6f57611e6f612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611edd57611edd612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611faa9190612d23565b5050509150506000811361201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610765565b60006402540be400606161202e8885612ae7565b6120389190612ae7565b6120429190612afe565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121209190612b7b565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed17399061219e908a908690899030904290600401612b9d565b6000604051808303816000875af11580156121bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526122039190810190612c29565b90508060018151811061221857612218612b4c565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af11580156122e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230b9190612d75565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156123c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e99190612b7b565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190612b7b565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af1158015612583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a79190612d92565b939793965092945050505050565b836000826125c38587612ae7565b6125cd9190612afe565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015612664573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126889190612b7b565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612dc183390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461270d57600080fd5b50565b60006020828403121561272257600080fd5b813561272d816126eb565b9392505050565b60006020828403121561274657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127c3576127c361274d565b604052919050565b60008067ffffffffffffffff8411156127e6576127e661274d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016128198161277c565b91505082815283838301111561282e57600080fd5b828260208301376000602084830101529392505050565b60008060006060848603121561285a57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561287f57600080fd5b8401601f8101861361289057600080fd5b61289f868235602084016127cb565b9150509250925092565b600082601f8301126128ba57600080fd5b61272d838335602085016127cb565b6000806000606084860312156128de57600080fd5b833567ffffffffffffffff8111156128f557600080fd5b612901868287016128a9565b935050602084013567ffffffffffffffff81111561291e57600080fd5b61292a868287016128a9565b93969395505050506040919091013590565b6000806040838503121561294f57600080fd5b823561295a816126eb565b946020939093013593505050565b6000806040838503121561297b57600080fd5b8235612986816126eb565b91506020830135612996816126eb565b809150509250929050565b6000815180845260005b818110156129c7576020818501810151868301820152016129ab565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061272d60208301846129a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b2757611b27612a18565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a8b57612a8b612a18565b5060010190565b600060208284031215612aa457600080fd5b5051919050565b608081526000612abe60808301876129a1565b8281036020840152612ad081876129a1565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b2757611b27612a18565b600082612b34577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b2757611b27612a18565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612b8d57600080fd5b8151801515811461272d57600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612bfc57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612bc8565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612c3b57600080fd5b815167ffffffffffffffff811115612c5257600080fd5b8201601f81018413612c6357600080fd5b805167ffffffffffffffff811115612c7d57612c7d61274d565b8060051b612c8d6020820161277c565b91825260208184018101929081019087841115612ca957600080fd5b6020850194505b83851015612ccf57845180835260209586019590935090910190612cb0565b979650505050505050565b600060208284031215612cec57600080fd5b815167ffffffffffffffff8116811461272d57600080fd5b805169ffffffffffffffffffff81168114612d1e57600080fd5b919050565b600080600080600060a08688031215612d3b57600080fd5b612d4486612d04565b60208701516040880151606089015192975090955093509150612d6960808701612d04565b90509295509295909350565b600060208284031215612d8757600080fd5b815161272d816126eb565b600080600060608486031215612da757600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a2646970667358221220227dc27d4d896defcba9d61061522501296597abfb5cdadbef77225cb9f0a98364736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } From 3838aaf68192b53803fea9f7538ff8a5d23d14a5 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 21:47:00 +0000 Subject: [PATCH 12/13] refactor: accounting for wormhole leftovers --- abis/0.8.28/MemeCelo.json | 17 +++++++++++++++-- contracts/MemeCelo.sol | 25 +++++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/abis/0.8.28/MemeCelo.json b/abis/0.8.28/MemeCelo.json index 1c18a34..75e0fe0 100644 --- a/abis/0.8.28/MemeCelo.json +++ b/abis/0.8.28/MemeCelo.json @@ -555,6 +555,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "olasLeftovers", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "oracle", @@ -689,8 +702,8 @@ "type": "receive" } ], - "bytecode": "0x610180604052600160025534801561001657600080fd5b506040516142453803806142458339810160408190526100359161008b565b6001600160a01b0397881660a05295871660c05293861660e05291851661010052608052831661012052821661014052166101605261011b565b80516001600160a01b038116811461008657600080fd5b919050565b600080600080600080600080610100898b0312156100a857600080fd5b6100b18961006f565b97506100bf60208a0161006f565b96506100cd60408a0161006f565b95506100db60608a0161006f565b9450608089015193506100f060a08a0161006f565b92506100fe60c08a0161006f565b915061010c60e08a0161006f565b90509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161401661022f600039600081816104810152611f1b01526000818161053a01528181611bde0152611d220152600081816102620152818161189901528181611e3d01526120b10152600081816105ad015261229e0152600081816106850152818161198401528181611a630152818161207f01528181612161015281816123480152818161242701526125390152600081816102bb0152818161182b015281816119b301528181611eab015281816122690152818161237a01526124e10152600081816102040152818161190701528181611c0d01528181611cbb0152611da80152600081816105060152610ee901526140166000f3fe6080604052600436106101e65760003560e01c80638b9ee61011610102578063c45a015511610095578063f74e481b11610064578063f74e481b1461061b578063f76c60371461063b578063f887ea4014610673578063ffa1ad74146106a757600080fd5b8063c45a01551461059b578063cf4ffb7e146105cf578063d1b0c288146105ef578063dab346ff1461060657600080fd5b8063a7be1b50116100d1578063a7be1b5014610528578063affed0e01461055c578063b1bd3c9514610572578063be399e2b1461058557600080fd5b80638b9ee610146104a35780638e499bcf146104cb5780639823bb13146104e1578063a5ae390c146104f457600080fd5b80633d0cc3751161017a5780635eb76db2116101495780635eb76db21461041f5780636be6af9814610447578063709a5c9c1461045c5780637dc0d1d01461046f57600080fd5b80633d0cc3751461039257806340b67a9b146103b4578063466ffbce146103e15780635122c4091461040157600080fd5b806314c7312b116101b657806314c7312b146102dd5780632e0f26251461034157806335f9f8d91461036857806336b4134a1461037d57600080fd5b806231d115146101f2578063051ed8ef146102505780630a42f8bd146102845780631265b651146102a957600080fd5b366101ed57005b600080fd5b3480156101fe57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561025c57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561029057600080fd5b5061029b6202a30081565b604051908152602001610247565b3480156102b557600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e957600080fd5b506103216102f8366004612710565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610247565b34801561034d57600080fd5b50610356601281565b60405160ff9091168152602001610247565b34801561037457600080fd5b5061029b603281565b34801561038957600080fd5b5061029b606181565b34801561039e57600080fd5b506103b26103ad366004612710565b6106fd565b005b3480156103c057600080fd5b5061029b6103cf366004612710565b60056020526000908152604090205481565b3480156103ed57600080fd5b506102266103fc366004612734565b610aea565b34801561040d57600080fd5b5061029b69d3c21bcecceda100000081565b34801561042b57600080fd5b50610434600281565b60405161ffff9091168152602001610247565b34801561045357600080fd5b5061029b600081565b6103b261046a366004612845565b610b21565b34801561047b57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156104af57600080fd5b506102267351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104d757600080fd5b5061029b60005481565b6103b26104ef366004612710565b610c94565b34801561050057600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561053457600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561056857600080fd5b5061029b60075481565b6103b26105803660046128c9565b610ee7565b34801561059157600080fd5b5061029b60015481565b3480156105a757600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156105db57600080fd5b506103b26105ea36600461293c565b6111dd565b3480156105fb57600080fd5b5061029b6201518081565b34801561061257600080fd5b5061029b600a81565b34801561062757600080fd5b506103b2610636366004612710565b611563565b34801561064757600080fd5b5061029b610656366004612968565b600460209081526000928352604080842090915290825290205481565b34801561067f57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b357600080fd5b506106f06040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102479190612a05565b60025460011461076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101839052600282015494810194909452909101546060830152610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610765565b6202a300816020015161083c9190612a47565b42116108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610765565b3360009081526005602052604081208054916108e583612a5a565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097d9190612a92565b905060008111610a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610765565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610a7757600080fd5b505af1158015610a8b573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ad791815260200190565b60405180910390a2505060016002555050565b60068181548110610afa57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b600060015411610bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610765565b336000908152600560205260408120805491610c1483612a5a565b91905055506000610c2760015485611803565b60006001819055909150610c3c828585611b2d565b90508015610c8d5760405132908290600081818185875af1925050503d8060008114610c84576040519150601f19603f3d011682016040523d82523d6000602084013e610c89565b606091505b5050505b5050505050565b60003411610d24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610765565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610765565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610765565b610e283482612a47565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610e70908490612a47565b9091555050336000908152600560205260408120805491610e9083612a5a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610765565b69d3c21bcecceda100000081101561100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610765565b6000838360128460405161101e906126de565b61102b9493929190612aab565b604051809103906000f080158015611047573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161113783612a5a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020805460018201546112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610765565b6201518082600101546112ee9190612a47565b421015611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610765565b60006113638285611e16565b905060006064611374600a84612ae7565b61137e9190612afe565b905080600160008282546113929190612a47565b909155506113a290508183612b39565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141a9190612a92565b90506000606461142b603284612ae7565b6114359190612afe565b905060006114438284612b39565b90506000806114538c898661222c565b4260028d015560038c01859055336000908152600560205260408120805493955091935061148083612a5a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114c8576114c88d82868d6125b5565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611547929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602081815260409283902083516080810185528154815260018201549281019290925260028101549382018490529091015460608201529061168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610765565b6202a300816020015161169e9190612a47565b42111561172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610765565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610765565b3360009081526005602052604081208054916117e083612a5a565b91905055506117f98382846060015185600001516125b5565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061185d5761185d612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118cb576118cb612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061193957611939612b4c565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156119fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a229190612b7b565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611aa09088908890879030904290600401612b9d565b6000604051808303816000875af1158015611abf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b059190810190612c29565b905080600181518110611b1a57611b1a612b4c565b6020026020010151925050505b92915050565b600080611b3a8186612afe565b11611ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610765565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7a9190612b7b565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d919190612cda565b50611d9d816001612a47565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611e6f57611e6f612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611edd57611edd612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611faa9190612d23565b5050509150506000811361201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610765565b60006402540be400606161202e8885612ae7565b6120389190612ae7565b6120429190612afe565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121209190612b7b565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed17399061219e908a908690899030904290600401612b9d565b6000604051808303816000875af11580156121bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526122039190810190612c29565b90508060018151811061221857612218612b4c565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af11580156122e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230b9190612d75565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156123c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e99190612b7b565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190612b7b565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af1158015612583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a79190612d92565b939793965092945050505050565b836000826125c38587612ae7565b6125cd9190612afe565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015612664573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126889190612b7b565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612dc183390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461270d57600080fd5b50565b60006020828403121561272257600080fd5b813561272d816126eb565b9392505050565b60006020828403121561274657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127c3576127c361274d565b604052919050565b60008067ffffffffffffffff8411156127e6576127e661274d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016128198161277c565b91505082815283838301111561282e57600080fd5b828260208301376000602084830101529392505050565b60008060006060848603121561285a57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561287f57600080fd5b8401601f8101861361289057600080fd5b61289f868235602084016127cb565b9150509250925092565b600082601f8301126128ba57600080fd5b61272d838335602085016127cb565b6000806000606084860312156128de57600080fd5b833567ffffffffffffffff8111156128f557600080fd5b612901868287016128a9565b935050602084013567ffffffffffffffff81111561291e57600080fd5b61292a868287016128a9565b93969395505050506040919091013590565b6000806040838503121561294f57600080fd5b823561295a816126eb565b946020939093013593505050565b6000806040838503121561297b57600080fd5b8235612986816126eb565b91506020830135612996816126eb565b809150509250929050565b6000815180845260005b818110156129c7576020818501810151868301820152016129ab565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061272d60208301846129a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b2757611b27612a18565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a8b57612a8b612a18565b5060010190565b600060208284031215612aa457600080fd5b5051919050565b608081526000612abe60808301876129a1565b8281036020840152612ad081876129a1565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b2757611b27612a18565b600082612b34577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b2757611b27612a18565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612b8d57600080fd5b8151801515811461272d57600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612bfc57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612bc8565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612c3b57600080fd5b815167ffffffffffffffff811115612c5257600080fd5b8201601f81018413612c6357600080fd5b805167ffffffffffffffff811115612c7d57612c7d61274d565b8060051b612c8d6020820161277c565b91825260208184018101929081019087841115612ca957600080fd5b6020850194505b83851015612ccf57845180835260209586019590935090910190612cb0565b979650505050505050565b600060208284031215612cec57600080fd5b815167ffffffffffffffff8116811461272d57600080fd5b805169ffffffffffffffffffff81168114612d1e57600080fd5b919050565b600080600080600060a08688031215612d3b57600080fd5b612d4486612d04565b60208701516040880151606089015192975090955093509150612d6960808701612d04565b90509295509295909350565b600060208284031215612d8757600080fd5b815161272d816126eb565b600080600060608486031215612da757600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a2646970667358221220227dc27d4d896defcba9d61061522501296597abfb5cdadbef77225cb9f0a98364736f6c634300081c0033", - "deployedBytecode": "0x6080604052600436106101e65760003560e01c80638b9ee61011610102578063c45a015511610095578063f74e481b11610064578063f74e481b1461061b578063f76c60371461063b578063f887ea4014610673578063ffa1ad74146106a757600080fd5b8063c45a01551461059b578063cf4ffb7e146105cf578063d1b0c288146105ef578063dab346ff1461060657600080fd5b8063a7be1b50116100d1578063a7be1b5014610528578063affed0e01461055c578063b1bd3c9514610572578063be399e2b1461058557600080fd5b80638b9ee610146104a35780638e499bcf146104cb5780639823bb13146104e1578063a5ae390c146104f457600080fd5b80633d0cc3751161017a5780635eb76db2116101495780635eb76db21461041f5780636be6af9814610447578063709a5c9c1461045c5780637dc0d1d01461046f57600080fd5b80633d0cc3751461039257806340b67a9b146103b4578063466ffbce146103e15780635122c4091461040157600080fd5b806314c7312b116101b657806314c7312b146102dd5780632e0f26251461034157806335f9f8d91461036857806336b4134a1461037d57600080fd5b806231d115146101f2578063051ed8ef146102505780630a42f8bd146102845780631265b651146102a957600080fd5b366101ed57005b600080fd5b3480156101fe57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561025c57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561029057600080fd5b5061029b6202a30081565b604051908152602001610247565b3480156102b557600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e957600080fd5b506103216102f8366004612710565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610247565b34801561034d57600080fd5b50610356601281565b60405160ff9091168152602001610247565b34801561037457600080fd5b5061029b603281565b34801561038957600080fd5b5061029b606181565b34801561039e57600080fd5b506103b26103ad366004612710565b6106fd565b005b3480156103c057600080fd5b5061029b6103cf366004612710565b60056020526000908152604090205481565b3480156103ed57600080fd5b506102266103fc366004612734565b610aea565b34801561040d57600080fd5b5061029b69d3c21bcecceda100000081565b34801561042b57600080fd5b50610434600281565b60405161ffff9091168152602001610247565b34801561045357600080fd5b5061029b600081565b6103b261046a366004612845565b610b21565b34801561047b57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156104af57600080fd5b506102267351eb65012ca5ceb07320c497f4151ac207fea4e081565b3480156104d757600080fd5b5061029b60005481565b6103b26104ef366004612710565b610c94565b34801561050057600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561053457600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561056857600080fd5b5061029b60075481565b6103b26105803660046128c9565b610ee7565b34801561059157600080fd5b5061029b60015481565b3480156105a757600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156105db57600080fd5b506103b26105ea36600461293c565b6111dd565b3480156105fb57600080fd5b5061029b6201518081565b34801561061257600080fd5b5061029b600a81565b34801561062757600080fd5b506103b2610636366004612710565b611563565b34801561064757600080fd5b5061029b610656366004612968565b600460209081526000928352604080842090915290825290205481565b34801561067f57600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b357600080fd5b506106f06040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102479190612a05565b60025460011461076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101839052600282015494810194909452909101546060830152610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610765565b6202a300816020015161083c9190612a47565b42116108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610765565b3360009081526005602052604081208054916108e583612a5a565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097d9190612a92565b905060008111610a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610765565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610a7757600080fd5b505af1158015610a8b573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610ad791815260200190565b60405180910390a2505060016002555050565b60068181548110610afa57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610b8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b600060015411610bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610765565b336000908152600560205260408120805491610c1483612a5a565b91905055506000610c2760015485611803565b60006001819055909150610c3c828585611b2d565b90508015610c8d5760405132908290600081818185875af1925050503d8060008114610c84576040519150601f19603f3d011682016040523d82523d6000602084013e610c89565b606091505b5050505b5050505050565b60003411610d24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610765565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610765565b600282015415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610765565b610e283482612a47565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610e70908490612a47565b9091555050336000908152600560205260408120805491610e9083612a5a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610765565b69d3c21bcecceda100000081101561100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610765565b6000838360128460405161101e906126de565b61102b9493929190612aab565b604051809103906000f080158015611047573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161113783612a5a565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b600254600114611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020805460018201546112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610765565b6201518082600101546112ee9190612a47565b421015611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610765565b60006113638285611e16565b905060006064611374600a84612ae7565b61137e9190612afe565b905080600160008282546113929190612a47565b909155506113a290508183612b39565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141a9190612a92565b90506000606461142b603284612ae7565b6114359190612afe565b905060006114438284612b39565b90506000806114538c898661222c565b4260028d015560038c01859055336000908152600560205260408120805493955091935061148083612a5a565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114c8576114c88d82868d6125b5565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611547929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b6002546001146115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610765565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602081815260409283902083516080810185528154815260018201549281019290925260028101549382018490529091015460608201529061168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610765565b6202a300816020015161169e9190612a47565b42111561172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610765565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610765565b3360009081526005602052604081208054916117e083612a5a565b91905055506117f98382846060015185600001516125b5565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061185d5761185d612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118cb576118cb612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061193957611939612b4c565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156119fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a229190612b7b565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611aa09088908890879030904290600401612b9d565b6000604051808303816000875af1158015611abf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b059190810190612c29565b905080600181518110611b1a57611b1a612b4c565b6020026020010151925050505b92915050565b600080611b3a8186612afe565b11611ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610765565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7a9190612b7b565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d919190612cda565b50611d9d816001612a47565b6007556040518681527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a2503495945050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611e6f57611e6f612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611edd57611edd612b4c565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611faa9190612d23565b5050509150506000811361201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610765565b60006402540be400606161202e8885612ae7565b6120389190612ae7565b6120429190612afe565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121209190612b7b565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed17399061219e908a908690899030904290600401612b9d565b6000604051808303816000875af11580156121bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526122039190810190612c29565b90508060018151811061221857612218612b4c565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af11580156122e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230b9190612d75565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156123c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e99190612b7b565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190612b7b565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af1158015612583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a79190612d92565b939793965092945050505050565b836000826125c38587612ae7565b6125cd9190612afe565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015612664573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126889190612b7b565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612dc183390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461270d57600080fd5b50565b60006020828403121561272257600080fd5b813561272d816126eb565b9392505050565b60006020828403121561274657600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127c3576127c361274d565b604052919050565b60008067ffffffffffffffff8411156127e6576127e661274d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020016128198161277c565b91505082815283838301111561282e57600080fd5b828260208301376000602084830101529392505050565b60008060006060848603121561285a57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561287f57600080fd5b8401601f8101861361289057600080fd5b61289f868235602084016127cb565b9150509250925092565b600082601f8301126128ba57600080fd5b61272d838335602085016127cb565b6000806000606084860312156128de57600080fd5b833567ffffffffffffffff8111156128f557600080fd5b612901868287016128a9565b935050602084013567ffffffffffffffff81111561291e57600080fd5b61292a868287016128a9565b93969395505050506040919091013590565b6000806040838503121561294f57600080fd5b823561295a816126eb565b946020939093013593505050565b6000806040838503121561297b57600080fd5b8235612986816126eb565b91506020830135612996816126eb565b809150509250929050565b6000815180845260005b818110156129c7576020818501810151868301820152016129ab565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061272d60208301846129a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b2757611b27612a18565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a8b57612a8b612a18565b5060010190565b600060208284031215612aa457600080fd5b5051919050565b608081526000612abe60808301876129a1565b8281036020840152612ad081876129a1565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b2757611b27612a18565b600082612b34577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b2757611b27612a18565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612b8d57600080fd5b8151801515811461272d57600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612bfc57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612bc8565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612c3b57600080fd5b815167ffffffffffffffff811115612c5257600080fd5b8201601f81018413612c6357600080fd5b805167ffffffffffffffff811115612c7d57612c7d61274d565b8060051b612c8d6020820161277c565b91825260208184018101929081019087841115612ca957600080fd5b6020850194505b83851015612ccf57845180835260209586019590935090910190612cb0565b979650505050505050565b600060208284031215612cec57600080fd5b815167ffffffffffffffff8116811461272d57600080fd5b805169ffffffffffffffffffff81168114612d1e57600080fd5b919050565b600080600080600060a08688031215612d3b57600080fd5b612d4486612d04565b60208701516040880151606089015192975090955093509150612d6960808701612d04565b90509295509295909350565b600060208284031215612d8757600080fd5b815161272d816126eb565b600080600060608486031215612da757600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a2646970667358221220227dc27d4d896defcba9d61061522501296597abfb5cdadbef77225cb9f0a98364736f6c634300081c0033", + "bytecode": "0x610180604052600160025534801561001657600080fd5b506040516142af3803806142af8339810160408190526100359161008b565b6001600160a01b0397881660a05295871660c05293861660e05291851661010052608052831661012052821661014052166101605261011b565b80516001600160a01b038116811461008657600080fd5b919050565b600080600080600080600080610100898b0312156100a857600080fd5b6100b18961006f565b97506100bf60208a0161006f565b96506100cd60408a0161006f565b95506100db60608a0161006f565b9450608089015193506100f060a08a0161006f565b92506100fe60c08a0161006f565b915061010c60e08a0161006f565b90509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161408061022f600039600081816104b20152611f8501526000818161056b01528181611c410152611d8a01526000818161027d015281816118ca01528181611ea7015261211b0152600081816105de01526123080152600081816106b6015281816119b501528181611a94015281816120e9015281816121cb015281816123b20152818161249101526125a30152600081816102d60152818161185c015281816119e401528181611f15015281816122d3015281816123e4015261254b01526000818161021f0152818161193801528181611c7301528181611d230152611e100152600081816105370152610f1a01526140806000f3fe6080604052600436106102015760003560e01c80637dc0d1d01161011d578063be399e2b116100b0578063dab346ff1161007f578063f76c603711610064578063f76c60371461066c578063f887ea40146106a4578063ffa1ad74146106d857600080fd5b8063dab346ff14610637578063f74e481b1461064c57600080fd5b8063be399e2b146105b6578063c45a0155146105cc578063cf4ffb7e14610600578063d1b0c2881461062057600080fd5b8063a5ae390c116100ec578063a5ae390c14610525578063a7be1b5014610559578063affed0e01461058d578063b1bd3c95146105a357600080fd5b80637dc0d1d0146104a05780638b9ee610146104d45780638e499bcf146104fc5780639823bb131461051257600080fd5b806336b4134a116101955780635122c409116101645780635122c409146104325780635eb76db2146104505780636be6af9814610478578063709a5c9c1461048d57600080fd5b806336b4134a146103ae5780633d0cc375146103c357806340b67a9b146103e5578063466ffbce1461041257600080fd5b806314c7312b116101d157806314c7312b146102f85780632e0f26251461035c578063323ebe581461038357806335f9f8d91461039957600080fd5b806231d1151461020d578063051ed8ef1461026b5780630a42f8bd1461029f5780631265b651146102c457600080fd5b3661020857005b600080fd5b34801561021957600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156102ab57600080fd5b506102b66202a30081565b604051908152602001610262565b3480156102d057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561030457600080fd5b5061033c61031336600461277a565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610262565b34801561036857600080fd5b50610371601281565b60405160ff9091168152602001610262565b34801561038f57600080fd5b506102b660085481565b3480156103a557600080fd5b506102b6603281565b3480156103ba57600080fd5b506102b6606181565b3480156103cf57600080fd5b506103e36103de36600461277a565b61072e565b005b3480156103f157600080fd5b506102b661040036600461277a565b60056020526000908152604090205481565b34801561041e57600080fd5b5061024161042d36600461279e565b610b1b565b34801561043e57600080fd5b506102b669d3c21bcecceda100000081565b34801561045c57600080fd5b50610465600281565b60405161ffff9091168152602001610262565b34801561048457600080fd5b506102b6600081565b6103e361049b3660046128af565b610b52565b3480156104ac57600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e057600080fd5b506102417351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561050857600080fd5b506102b660005481565b6103e361052036600461277a565b610cc5565b34801561053157600080fd5b506102b67f000000000000000000000000000000000000000000000000000000000000000081565b34801561056557600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561059957600080fd5b506102b660075481565b6103e36105b1366004612933565b610f18565b3480156105c257600080fd5b506102b660015481565b3480156105d857600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561060c57600080fd5b506103e361061b3660046129a6565b61120e565b34801561062c57600080fd5b506102b66201518081565b34801561064357600080fd5b506102b6600a81565b34801561065857600080fd5b506103e361066736600461277a565b611594565b34801561067857600080fd5b506102b66106873660046129d2565b600460209081526000928352604080842090915290825290205481565b3480156106b057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e457600080fd5b506107216040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102629190612a6f565b60025460011461079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b6202a300816020015161086d9190612ab1565b42116108fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610796565b33600090815260056020526040812080549161091683612ac4565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561098a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ae9190612afc565b905060008111610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610796565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610b0891815260200190565b60405180910390a2505060016002555050565b60068181548110610b2b57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b600060015411610c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610796565b336000908152600560205260408120805491610c4583612ac4565b91905055506000610c5860015485611834565b60006001819055909150610c6d828585611b5e565b90508015610cbe5760405132908290600081818185875af1925050503d8060008114610cb5576040519150601f19603f3d011682016040523d82523d6000602084013e610cba565b606091505b5050505b5050505050565b60003411610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610796565b600282015415610e4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610796565b610e593482612ab1565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610ea1908490612ab1565b9091555050336000908152600560205260408120805491610ec183612ac4565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610fc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610796565b69d3c21bcecceda100000081101561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610796565b6000838360128460405161104f90612748565b61105c9493929190612b15565b604051809103906000f080158015611078573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161116883612ac4565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b60025460011461127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090208054600182015461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b62015180826001015461131f9190612ab1565b421015611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610796565b60006113948285611e80565b9050600060646113a5600a84612b51565b6113af9190612b68565b905080600160008282546113c39190612ab1565b909155506113d390508183612ba3565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144b9190612afc565b90506000606461145c603284612b51565b6114669190612b68565b905060006114748284612ba3565b90506000806114848c8986612296565b4260028d015560038c0185905533600090815260056020526040812080549395509193506114b183612ac4565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114f9576114f98d82868d61261f565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611578929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b600254600114611600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101929092526002810154938201849052909101546060820152906116bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610796565b6202a30081602001516116cf9190612ab1565b42111561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610796565b33600090815260056020526040812080549161181183612ac4565b919050555061182a83828460600151856000015161261f565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061188e5761188e612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118fc576118fc612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061196a5761196a612bb6565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a539190612be5565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611ad19088908890879030904290600401612c07565b6000604051808303816000875af1158015611af0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b369190810190612c93565b905080600181518110611b4b57611b4b612bb6565b6020026020010151925050505b92915050565b600854600090611b6e8186612ab1565b94506000611b7c8187612b68565b9050611b89600082612b51565b905060008111611bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610796565b611bff8187612ba3565b60088190556040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce29190612be5565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df99190612d44565b50611e05816001612ab1565b6007556040518381527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a25034979650505050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611ed957611ed9612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611f4757611f47612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190612d8d565b50505091505060008113612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610796565b60006402540be40060616120988885612b51565b6120a29190612b51565b6120ac9190612b68565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218a9190612be5565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612208908a908690899030904290600401612c07565b6000604051808303816000875af1158015612227573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261226d9190810190612c93565b90508060018151811061228257612282612bb6565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015612351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123759190612ddf565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af115801561242f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124539190612be5565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af11580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190612be5565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af11580156125ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126119190612dfc565b939793965092945050505050565b8360008261262d8587612b51565b6126379190612b68565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156126ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f29190612be5565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612e2b83390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461277757600080fd5b50565b60006020828403121561278c57600080fd5b813561279781612755565b9392505050565b6000602082840312156127b057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561282d5761282d6127b7565b604052919050565b60008067ffffffffffffffff841115612850576128506127b7565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001612883816127e6565b91505082815283838301111561289857600080fd5b828260208301376000602084830101529392505050565b6000806000606084860312156128c457600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156128e957600080fd5b8401601f810186136128fa57600080fd5b61290986823560208401612835565b9150509250925092565b600082601f83011261292457600080fd5b61279783833560208501612835565b60008060006060848603121561294857600080fd5b833567ffffffffffffffff81111561295f57600080fd5b61296b86828701612913565b935050602084013567ffffffffffffffff81111561298857600080fd5b61299486828701612913565b93969395505050506040919091013590565b600080604083850312156129b957600080fd5b82356129c481612755565b946020939093013593505050565b600080604083850312156129e557600080fd5b82356129f081612755565b91506020830135612a0081612755565b809150509250929050565b6000815180845260005b81811015612a3157602081850181015186830182015201612a15565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006127976020830184612a0b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b5857611b58612a82565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612af557612af5612a82565b5060010190565b600060208284031215612b0e57600080fd5b5051919050565b608081526000612b286080830187612a0b565b8281036020840152612b3a8187612a0b565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b5857611b58612a82565b600082612b9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b5857611b58612a82565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612bf757600080fd5b8151801515811461279757600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612c6657835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612c32565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612ca557600080fd5b815167ffffffffffffffff811115612cbc57600080fd5b8201601f81018413612ccd57600080fd5b805167ffffffffffffffff811115612ce757612ce76127b7565b8060051b612cf7602082016127e6565b91825260208184018101929081019087841115612d1357600080fd5b6020850194505b83851015612d3957845180835260209586019590935090910190612d1a565b979650505050505050565b600060208284031215612d5657600080fd5b815167ffffffffffffffff8116811461279757600080fd5b805169ffffffffffffffffffff81168114612d8857600080fd5b919050565b600080600080600060a08688031215612da557600080fd5b612dae86612d6e565b60208701516040880151606089015192975090955093509150612dd360808701612d6e565b90509295509295909350565b600060208284031215612df157600080fd5b815161279781612755565b600080600060608486031215612e1157600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a264697066735822122037feedabb7a4846738a94f2a2faa5d46c4fe0e62a08a9be12838f39ae3ee648e64736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106102015760003560e01c80637dc0d1d01161011d578063be399e2b116100b0578063dab346ff1161007f578063f76c603711610064578063f76c60371461066c578063f887ea40146106a4578063ffa1ad74146106d857600080fd5b8063dab346ff14610637578063f74e481b1461064c57600080fd5b8063be399e2b146105b6578063c45a0155146105cc578063cf4ffb7e14610600578063d1b0c2881461062057600080fd5b8063a5ae390c116100ec578063a5ae390c14610525578063a7be1b5014610559578063affed0e01461058d578063b1bd3c95146105a357600080fd5b80637dc0d1d0146104a05780638b9ee610146104d45780638e499bcf146104fc5780639823bb131461051257600080fd5b806336b4134a116101955780635122c409116101645780635122c409146104325780635eb76db2146104505780636be6af9814610478578063709a5c9c1461048d57600080fd5b806336b4134a146103ae5780633d0cc375146103c357806340b67a9b146103e5578063466ffbce1461041257600080fd5b806314c7312b116101d157806314c7312b146102f85780632e0f26251461035c578063323ebe581461038357806335f9f8d91461039957600080fd5b806231d1151461020d578063051ed8ef1461026b5780630a42f8bd1461029f5780631265b651146102c457600080fd5b3661020857005b600080fd5b34801561021957600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156102ab57600080fd5b506102b66202a30081565b604051908152602001610262565b3480156102d057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561030457600080fd5b5061033c61031336600461277a565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610262565b34801561036857600080fd5b50610371601281565b60405160ff9091168152602001610262565b34801561038f57600080fd5b506102b660085481565b3480156103a557600080fd5b506102b6603281565b3480156103ba57600080fd5b506102b6606181565b3480156103cf57600080fd5b506103e36103de36600461277a565b61072e565b005b3480156103f157600080fd5b506102b661040036600461277a565b60056020526000908152604090205481565b34801561041e57600080fd5b5061024161042d36600461279e565b610b1b565b34801561043e57600080fd5b506102b669d3c21bcecceda100000081565b34801561045c57600080fd5b50610465600281565b60405161ffff9091168152602001610262565b34801561048457600080fd5b506102b6600081565b6103e361049b3660046128af565b610b52565b3480156104ac57600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e057600080fd5b506102417351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561050857600080fd5b506102b660005481565b6103e361052036600461277a565b610cc5565b34801561053157600080fd5b506102b67f000000000000000000000000000000000000000000000000000000000000000081565b34801561056557600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561059957600080fd5b506102b660075481565b6103e36105b1366004612933565b610f18565b3480156105c257600080fd5b506102b660015481565b3480156105d857600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561060c57600080fd5b506103e361061b3660046129a6565b61120e565b34801561062c57600080fd5b506102b66201518081565b34801561064357600080fd5b506102b6600a81565b34801561065857600080fd5b506103e361066736600461277a565b611594565b34801561067857600080fd5b506102b66106873660046129d2565b600460209081526000928352604080842090915290825290205481565b3480156106b057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e457600080fd5b506107216040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102629190612a6f565b60025460011461079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b6202a300816020015161086d9190612ab1565b42116108fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610796565b33600090815260056020526040812080549161091683612ac4565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561098a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ae9190612afc565b905060008111610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610796565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610b0891815260200190565b60405180910390a2505060016002555050565b60068181548110610b2b57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b600060015411610c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610796565b336000908152600560205260408120805491610c4583612ac4565b91905055506000610c5860015485611834565b60006001819055909150610c6d828585611b5e565b90508015610cbe5760405132908290600081818185875af1925050503d8060008114610cb5576040519150601f19603f3d011682016040523d82523d6000602084013e610cba565b606091505b5050505b5050505050565b60003411610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610796565b600282015415610e4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610796565b610e593482612ab1565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610ea1908490612ab1565b9091555050336000908152600560205260408120805491610ec183612ac4565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610fc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610796565b69d3c21bcecceda100000081101561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610796565b6000838360128460405161104f90612748565b61105c9493929190612b15565b604051809103906000f080158015611078573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161116883612ac4565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b60025460011461127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090208054600182015461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b62015180826001015461131f9190612ab1565b421015611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610796565b60006113948285611e80565b9050600060646113a5600a84612b51565b6113af9190612b68565b905080600160008282546113c39190612ab1565b909155506113d390508183612ba3565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144b9190612afc565b90506000606461145c603284612b51565b6114669190612b68565b905060006114748284612ba3565b90506000806114848c8986612296565b4260028d015560038c0185905533600090815260056020526040812080549395509193506114b183612ac4565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114f9576114f98d82868d61261f565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611578929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b600254600114611600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101929092526002810154938201849052909101546060820152906116bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610796565b6202a30081602001516116cf9190612ab1565b42111561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610796565b33600090815260056020526040812080549161181183612ac4565b919050555061182a83828460600151856000015161261f565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061188e5761188e612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118fc576118fc612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061196a5761196a612bb6565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a539190612be5565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611ad19088908890879030904290600401612c07565b6000604051808303816000875af1158015611af0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b369190810190612c93565b905080600181518110611b4b57611b4b612bb6565b6020026020010151925050505b92915050565b600854600090611b6e8186612ab1565b94506000611b7c8187612b68565b9050611b89600082612b51565b905060008111611bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610796565b611bff8187612ba3565b60088190556040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce29190612be5565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df99190612d44565b50611e05816001612ab1565b6007556040518381527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a25034979650505050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611ed957611ed9612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611f4757611f47612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190612d8d565b50505091505060008113612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610796565b60006402540be40060616120988885612b51565b6120a29190612b51565b6120ac9190612b68565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218a9190612be5565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612208908a908690899030904290600401612c07565b6000604051808303816000875af1158015612227573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261226d9190810190612c93565b90508060018151811061228257612282612bb6565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015612351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123759190612ddf565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af115801561242f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124539190612be5565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af11580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190612be5565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af11580156125ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126119190612dfc565b939793965092945050505050565b8360008261262d8587612b51565b6126379190612b68565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156126ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f29190612be5565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612e2b83390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461277757600080fd5b50565b60006020828403121561278c57600080fd5b813561279781612755565b9392505050565b6000602082840312156127b057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561282d5761282d6127b7565b604052919050565b60008067ffffffffffffffff841115612850576128506127b7565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001612883816127e6565b91505082815283838301111561289857600080fd5b828260208301376000602084830101529392505050565b6000806000606084860312156128c457600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156128e957600080fd5b8401601f810186136128fa57600080fd5b61290986823560208401612835565b9150509250925092565b600082601f83011261292457600080fd5b61279783833560208501612835565b60008060006060848603121561294857600080fd5b833567ffffffffffffffff81111561295f57600080fd5b61296b86828701612913565b935050602084013567ffffffffffffffff81111561298857600080fd5b61299486828701612913565b93969395505050506040919091013590565b600080604083850312156129b957600080fd5b82356129c481612755565b946020939093013593505050565b600080604083850312156129e557600080fd5b82356129f081612755565b91506020830135612a0081612755565b809150509250929050565b6000815180845260005b81811015612a3157602081850181015186830182015201612a15565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006127976020830184612a0b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b5857611b58612a82565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612af557612af5612a82565b5060010190565b600060208284031215612b0e57600080fd5b5051919050565b608081526000612b286080830187612a0b565b8281036020840152612b3a8187612a0b565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b5857611b58612a82565b600082612b9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b5857611b58612a82565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612bf757600080fd5b8151801515811461279757600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612c6657835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612c32565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612ca557600080fd5b815167ffffffffffffffff811115612cbc57600080fd5b8201601f81018413612ccd57600080fd5b805167ffffffffffffffff811115612ce757612ce76127b7565b8060051b612cf7602082016127e6565b91825260208184018101929081019087841115612d1357600080fd5b6020850194505b83851015612d3957845180835260209586019590935090910190612d1a565b979650505050505050565b600060208284031215612d5657600080fd5b815167ffffffffffffffff8116811461279757600080fd5b805169ffffffffffffffffffff81168114612d8857600080fd5b919050565b600080600080600060a08688031215612da557600080fd5b612dae86612d6e565b60208701516040880151606089015192975090955093509150612dd360808701612d6e565b90509295509295909350565b600060208284031215612df157600080fd5b815161279781612755565b600080600060608486031215612e1157600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a264697066735822122037feedabb7a4846738a94f2a2faa5d46c4fe0e62a08a9be12838f39ae3ee648e64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index 6dc1362..7488a57 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -66,6 +66,8 @@ contract MemeCelo is MemeFactory { // Contract nonce uint256 public nonce; + // OLAS leftovers from bridging + uint256 public olasLeftovers; /// @dev MemeBase constructor constructor( @@ -145,22 +147,37 @@ contract MemeCelo is MemeFactory { /// @param olasAmount OLAS amount. /// @return msg.value leftovers if partially utilized by the bridge. function _bridgeAndBurn(uint256 olasAmount, uint256, bytes memory) internal override returns (uint256) { - require(olasAmount / WORMHOLE_BRIDGING_CUTOFF > 0, "Amount is too small for bridging"); + // Get OLAS leftovers from previous transfers + uint256 localLeftovers = olasLeftovers; + + // Adjust the amount to transfer + olasAmount += localLeftovers; + + // Round transfer amount to the cutoff value + uint256 transferAmount = olasAmount / WORMHOLE_BRIDGING_CUTOFF; + transferAmount *= WORMHOLE_BRIDGING_CUTOFF; + + // Check for zero value + require(transferAmount > 0, "Amount is too small for bridging"); + + // Update OLAS leftovers + localLeftovers = olasAmount - transferAmount; + olasLeftovers = localLeftovers; // Approve bridge to use OLAS - IERC20(olas).approve(l2TokenRelayer, olasAmount); + IERC20(olas).approve(l2TokenRelayer, transferAmount); // Bridge arguments bytes32 olasBurner = bytes32(uint256(uint160(OLAS_BURNER))); uint256 localNonce = nonce; // Bridge OLAS to mainnet to get burned - IBridge(l2TokenRelayer).transferTokens(olas, olasAmount, WORMHOLE_ETH_CHAIN_ID, olasBurner, 0, uint32(nonce)); + IBridge(l2TokenRelayer).transferTokens(olas, transferAmount, WORMHOLE_ETH_CHAIN_ID, olasBurner, 0, uint32(nonce)); // Adjust nonce nonce = localNonce + 1; - emit OLASJourneyToAscendance(olas, olasAmount); + emit OLASJourneyToAscendance(olas, transferAmount); return msg.value; } From 2b492b1a9195374206eab9ef5d58b8f24d9d4370 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Tue, 29 Oct 2024 22:59:47 +0000 Subject: [PATCH 13/13] chore: small simplification --- abis/0.8.28/MemeCelo.json | 4 ++-- contracts/MemeCelo.sol | 10 +++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/abis/0.8.28/MemeCelo.json b/abis/0.8.28/MemeCelo.json index 75e0fe0..05d8a1a 100644 --- a/abis/0.8.28/MemeCelo.json +++ b/abis/0.8.28/MemeCelo.json @@ -702,8 +702,8 @@ "type": "receive" } ], - "bytecode": "0x610180604052600160025534801561001657600080fd5b506040516142af3803806142af8339810160408190526100359161008b565b6001600160a01b0397881660a05295871660c05293861660e05291851661010052608052831661012052821661014052166101605261011b565b80516001600160a01b038116811461008657600080fd5b919050565b600080600080600080600080610100898b0312156100a857600080fd5b6100b18961006f565b97506100bf60208a0161006f565b96506100cd60408a0161006f565b95506100db60608a0161006f565b9450608089015193506100f060a08a0161006f565b92506100fe60c08a0161006f565b915061010c60e08a0161006f565b90509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161408061022f600039600081816104b20152611f8501526000818161056b01528181611c410152611d8a01526000818161027d015281816118ca01528181611ea7015261211b0152600081816105de01526123080152600081816106b6015281816119b501528181611a94015281816120e9015281816121cb015281816123b20152818161249101526125a30152600081816102d60152818161185c015281816119e401528181611f15015281816122d3015281816123e4015261254b01526000818161021f0152818161193801528181611c7301528181611d230152611e100152600081816105370152610f1a01526140806000f3fe6080604052600436106102015760003560e01c80637dc0d1d01161011d578063be399e2b116100b0578063dab346ff1161007f578063f76c603711610064578063f76c60371461066c578063f887ea40146106a4578063ffa1ad74146106d857600080fd5b8063dab346ff14610637578063f74e481b1461064c57600080fd5b8063be399e2b146105b6578063c45a0155146105cc578063cf4ffb7e14610600578063d1b0c2881461062057600080fd5b8063a5ae390c116100ec578063a5ae390c14610525578063a7be1b5014610559578063affed0e01461058d578063b1bd3c95146105a357600080fd5b80637dc0d1d0146104a05780638b9ee610146104d45780638e499bcf146104fc5780639823bb131461051257600080fd5b806336b4134a116101955780635122c409116101645780635122c409146104325780635eb76db2146104505780636be6af9814610478578063709a5c9c1461048d57600080fd5b806336b4134a146103ae5780633d0cc375146103c357806340b67a9b146103e5578063466ffbce1461041257600080fd5b806314c7312b116101d157806314c7312b146102f85780632e0f26251461035c578063323ebe581461038357806335f9f8d91461039957600080fd5b806231d1151461020d578063051ed8ef1461026b5780630a42f8bd1461029f5780631265b651146102c457600080fd5b3661020857005b600080fd5b34801561021957600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156102ab57600080fd5b506102b66202a30081565b604051908152602001610262565b3480156102d057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561030457600080fd5b5061033c61031336600461277a565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610262565b34801561036857600080fd5b50610371601281565b60405160ff9091168152602001610262565b34801561038f57600080fd5b506102b660085481565b3480156103a557600080fd5b506102b6603281565b3480156103ba57600080fd5b506102b6606181565b3480156103cf57600080fd5b506103e36103de36600461277a565b61072e565b005b3480156103f157600080fd5b506102b661040036600461277a565b60056020526000908152604090205481565b34801561041e57600080fd5b5061024161042d36600461279e565b610b1b565b34801561043e57600080fd5b506102b669d3c21bcecceda100000081565b34801561045c57600080fd5b50610465600281565b60405161ffff9091168152602001610262565b34801561048457600080fd5b506102b6600081565b6103e361049b3660046128af565b610b52565b3480156104ac57600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e057600080fd5b506102417351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561050857600080fd5b506102b660005481565b6103e361052036600461277a565b610cc5565b34801561053157600080fd5b506102b67f000000000000000000000000000000000000000000000000000000000000000081565b34801561056557600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561059957600080fd5b506102b660075481565b6103e36105b1366004612933565b610f18565b3480156105c257600080fd5b506102b660015481565b3480156105d857600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561060c57600080fd5b506103e361061b3660046129a6565b61120e565b34801561062c57600080fd5b506102b66201518081565b34801561064357600080fd5b506102b6600a81565b34801561065857600080fd5b506103e361066736600461277a565b611594565b34801561067857600080fd5b506102b66106873660046129d2565b600460209081526000928352604080842090915290825290205481565b3480156106b057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e457600080fd5b506107216040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102629190612a6f565b60025460011461079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b6202a300816020015161086d9190612ab1565b42116108fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610796565b33600090815260056020526040812080549161091683612ac4565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561098a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ae9190612afc565b905060008111610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610796565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610b0891815260200190565b60405180910390a2505060016002555050565b60068181548110610b2b57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b600060015411610c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610796565b336000908152600560205260408120805491610c4583612ac4565b91905055506000610c5860015485611834565b60006001819055909150610c6d828585611b5e565b90508015610cbe5760405132908290600081818185875af1925050503d8060008114610cb5576040519150601f19603f3d011682016040523d82523d6000602084013e610cba565b606091505b5050505b5050505050565b60003411610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610796565b600282015415610e4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610796565b610e593482612ab1565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610ea1908490612ab1565b9091555050336000908152600560205260408120805491610ec183612ac4565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610fc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610796565b69d3c21bcecceda100000081101561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610796565b6000838360128460405161104f90612748565b61105c9493929190612b15565b604051809103906000f080158015611078573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161116883612ac4565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b60025460011461127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090208054600182015461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b62015180826001015461131f9190612ab1565b421015611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610796565b60006113948285611e80565b9050600060646113a5600a84612b51565b6113af9190612b68565b905080600160008282546113c39190612ab1565b909155506113d390508183612ba3565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144b9190612afc565b90506000606461145c603284612b51565b6114669190612b68565b905060006114748284612ba3565b90506000806114848c8986612296565b4260028d015560038c0185905533600090815260056020526040812080549395509193506114b183612ac4565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114f9576114f98d82868d61261f565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611578929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b600254600114611600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101929092526002810154938201849052909101546060820152906116bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610796565b6202a30081602001516116cf9190612ab1565b42111561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610796565b33600090815260056020526040812080549161181183612ac4565b919050555061182a83828460600151856000015161261f565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061188e5761188e612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118fc576118fc612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061196a5761196a612bb6565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a539190612be5565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611ad19088908890879030904290600401612c07565b6000604051808303816000875af1158015611af0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b369190810190612c93565b905080600181518110611b4b57611b4b612bb6565b6020026020010151925050505b92915050565b600854600090611b6e8186612ab1565b94506000611b7c8187612b68565b9050611b89600082612b51565b905060008111611bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610796565b611bff8187612ba3565b60088190556040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce29190612be5565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df99190612d44565b50611e05816001612ab1565b6007556040518381527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a25034979650505050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611ed957611ed9612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611f4757611f47612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190612d8d565b50505091505060008113612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610796565b60006402540be40060616120988885612b51565b6120a29190612b51565b6120ac9190612b68565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218a9190612be5565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612208908a908690899030904290600401612c07565b6000604051808303816000875af1158015612227573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261226d9190810190612c93565b90508060018151811061228257612282612bb6565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015612351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123759190612ddf565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af115801561242f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124539190612be5565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af11580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190612be5565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af11580156125ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126119190612dfc565b939793965092945050505050565b8360008261262d8587612b51565b6126379190612b68565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156126ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f29190612be5565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612e2b83390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461277757600080fd5b50565b60006020828403121561278c57600080fd5b813561279781612755565b9392505050565b6000602082840312156127b057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561282d5761282d6127b7565b604052919050565b60008067ffffffffffffffff841115612850576128506127b7565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001612883816127e6565b91505082815283838301111561289857600080fd5b828260208301376000602084830101529392505050565b6000806000606084860312156128c457600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156128e957600080fd5b8401601f810186136128fa57600080fd5b61290986823560208401612835565b9150509250925092565b600082601f83011261292457600080fd5b61279783833560208501612835565b60008060006060848603121561294857600080fd5b833567ffffffffffffffff81111561295f57600080fd5b61296b86828701612913565b935050602084013567ffffffffffffffff81111561298857600080fd5b61299486828701612913565b93969395505050506040919091013590565b600080604083850312156129b957600080fd5b82356129c481612755565b946020939093013593505050565b600080604083850312156129e557600080fd5b82356129f081612755565b91506020830135612a0081612755565b809150509250929050565b6000815180845260005b81811015612a3157602081850181015186830182015201612a15565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006127976020830184612a0b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b5857611b58612a82565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612af557612af5612a82565b5060010190565b600060208284031215612b0e57600080fd5b5051919050565b608081526000612b286080830187612a0b565b8281036020840152612b3a8187612a0b565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b5857611b58612a82565b600082612b9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b5857611b58612a82565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612bf757600080fd5b8151801515811461279757600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612c6657835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612c32565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612ca557600080fd5b815167ffffffffffffffff811115612cbc57600080fd5b8201601f81018413612ccd57600080fd5b805167ffffffffffffffff811115612ce757612ce76127b7565b8060051b612cf7602082016127e6565b91825260208184018101929081019087841115612d1357600080fd5b6020850194505b83851015612d3957845180835260209586019590935090910190612d1a565b979650505050505050565b600060208284031215612d5657600080fd5b815167ffffffffffffffff8116811461279757600080fd5b805169ffffffffffffffffffff81168114612d8857600080fd5b919050565b600080600080600060a08688031215612da557600080fd5b612dae86612d6e565b60208701516040880151606089015192975090955093509150612dd360808701612d6e565b90509295509295909350565b600060208284031215612df157600080fd5b815161279781612755565b600080600060608486031215612e1157600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a264697066735822122037feedabb7a4846738a94f2a2faa5d46c4fe0e62a08a9be12838f39ae3ee648e64736f6c634300081c0033", - "deployedBytecode": "0x6080604052600436106102015760003560e01c80637dc0d1d01161011d578063be399e2b116100b0578063dab346ff1161007f578063f76c603711610064578063f76c60371461066c578063f887ea40146106a4578063ffa1ad74146106d857600080fd5b8063dab346ff14610637578063f74e481b1461064c57600080fd5b8063be399e2b146105b6578063c45a0155146105cc578063cf4ffb7e14610600578063d1b0c2881461062057600080fd5b8063a5ae390c116100ec578063a5ae390c14610525578063a7be1b5014610559578063affed0e01461058d578063b1bd3c95146105a357600080fd5b80637dc0d1d0146104a05780638b9ee610146104d45780638e499bcf146104fc5780639823bb131461051257600080fd5b806336b4134a116101955780635122c409116101645780635122c409146104325780635eb76db2146104505780636be6af9814610478578063709a5c9c1461048d57600080fd5b806336b4134a146103ae5780633d0cc375146103c357806340b67a9b146103e5578063466ffbce1461041257600080fd5b806314c7312b116101d157806314c7312b146102f85780632e0f26251461035c578063323ebe581461038357806335f9f8d91461039957600080fd5b806231d1151461020d578063051ed8ef1461026b5780630a42f8bd1461029f5780631265b651146102c457600080fd5b3661020857005b600080fd5b34801561021957600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156102ab57600080fd5b506102b66202a30081565b604051908152602001610262565b3480156102d057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561030457600080fd5b5061033c61031336600461277a565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610262565b34801561036857600080fd5b50610371601281565b60405160ff9091168152602001610262565b34801561038f57600080fd5b506102b660085481565b3480156103a557600080fd5b506102b6603281565b3480156103ba57600080fd5b506102b6606181565b3480156103cf57600080fd5b506103e36103de36600461277a565b61072e565b005b3480156103f157600080fd5b506102b661040036600461277a565b60056020526000908152604090205481565b34801561041e57600080fd5b5061024161042d36600461279e565b610b1b565b34801561043e57600080fd5b506102b669d3c21bcecceda100000081565b34801561045c57600080fd5b50610465600281565b60405161ffff9091168152602001610262565b34801561048457600080fd5b506102b6600081565b6103e361049b3660046128af565b610b52565b3480156104ac57600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e057600080fd5b506102417351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561050857600080fd5b506102b660005481565b6103e361052036600461277a565b610cc5565b34801561053157600080fd5b506102b67f000000000000000000000000000000000000000000000000000000000000000081565b34801561056557600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561059957600080fd5b506102b660075481565b6103e36105b1366004612933565b610f18565b3480156105c257600080fd5b506102b660015481565b3480156105d857600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561060c57600080fd5b506103e361061b3660046129a6565b61120e565b34801561062c57600080fd5b506102b66201518081565b34801561064357600080fd5b506102b6600a81565b34801561065857600080fd5b506103e361066736600461277a565b611594565b34801561067857600080fd5b506102b66106873660046129d2565b600460209081526000928352604080842090915290825290205481565b3480156106b057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e457600080fd5b506107216040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102629190612a6f565b60025460011461079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b6202a300816020015161086d9190612ab1565b42116108fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610796565b33600090815260056020526040812080549161091683612ac4565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561098a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ae9190612afc565b905060008111610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610796565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610b0891815260200190565b60405180910390a2505060016002555050565b60068181548110610b2b57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b600060015411610c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610796565b336000908152600560205260408120805491610c4583612ac4565b91905055506000610c5860015485611834565b60006001819055909150610c6d828585611b5e565b90508015610cbe5760405132908290600081818185875af1925050503d8060008114610cb5576040519150601f19603f3d011682016040523d82523d6000602084013e610cba565b606091505b5050505b5050505050565b60003411610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610796565b600282015415610e4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610796565b610e593482612ab1565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610ea1908490612ab1565b9091555050336000908152600560205260408120805491610ec183612ac4565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610fc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610796565b69d3c21bcecceda100000081101561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610796565b6000838360128460405161104f90612748565b61105c9493929190612b15565b604051809103906000f080158015611078573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161116883612ac4565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b60025460011461127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090208054600182015461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b62015180826001015461131f9190612ab1565b421015611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610796565b60006113948285611e80565b9050600060646113a5600a84612b51565b6113af9190612b68565b905080600160008282546113c39190612ab1565b909155506113d390508183612ba3565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144b9190612afc565b90506000606461145c603284612b51565b6114669190612b68565b905060006114748284612ba3565b90506000806114848c8986612296565b4260028d015560038c0185905533600090815260056020526040812080549395509193506114b183612ac4565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114f9576114f98d82868d61261f565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611578929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b600254600114611600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101929092526002810154938201849052909101546060820152906116bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610796565b6202a30081602001516116cf9190612ab1565b42111561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610796565b33600090815260056020526040812080549161181183612ac4565b919050555061182a83828460600151856000015161261f565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061188e5761188e612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118fc576118fc612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061196a5761196a612bb6565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a539190612be5565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611ad19088908890879030904290600401612c07565b6000604051808303816000875af1158015611af0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b369190810190612c93565b905080600181518110611b4b57611b4b612bb6565b6020026020010151925050505b92915050565b600854600090611b6e8186612ab1565b94506000611b7c8187612b68565b9050611b89600082612b51565b905060008111611bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610796565b611bff8187612ba3565b60088190556040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce29190612be5565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df99190612d44565b50611e05816001612ab1565b6007556040518381527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a25034979650505050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611ed957611ed9612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611f4757611f47612bb6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190612d8d565b50505091505060008113612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610796565b60006402540be40060616120988885612b51565b6120a29190612b51565b6120ac9190612b68565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218a9190612be5565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612208908a908690899030904290600401612c07565b6000604051808303816000875af1158015612227573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261226d9190810190612c93565b90508060018151811061228257612282612bb6565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015612351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123759190612ddf565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af115801561242f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124539190612be5565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af11580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190612be5565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af11580156125ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126119190612dfc565b939793965092945050505050565b8360008261262d8587612b51565b6126379190612b68565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156126ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f29190612be5565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612e2b83390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461277757600080fd5b50565b60006020828403121561278c57600080fd5b813561279781612755565b9392505050565b6000602082840312156127b057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561282d5761282d6127b7565b604052919050565b60008067ffffffffffffffff841115612850576128506127b7565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001612883816127e6565b91505082815283838301111561289857600080fd5b828260208301376000602084830101529392505050565b6000806000606084860312156128c457600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156128e957600080fd5b8401601f810186136128fa57600080fd5b61290986823560208401612835565b9150509250925092565b600082601f83011261292457600080fd5b61279783833560208501612835565b60008060006060848603121561294857600080fd5b833567ffffffffffffffff81111561295f57600080fd5b61296b86828701612913565b935050602084013567ffffffffffffffff81111561298857600080fd5b61299486828701612913565b93969395505050506040919091013590565b600080604083850312156129b957600080fd5b82356129c481612755565b946020939093013593505050565b600080604083850312156129e557600080fd5b82356129f081612755565b91506020830135612a0081612755565b809150509250929050565b6000815180845260005b81811015612a3157602081850181015186830182015201612a15565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006127976020830184612a0b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b5857611b58612a82565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612af557612af5612a82565b5060010190565b600060208284031215612b0e57600080fd5b5051919050565b608081526000612b286080830187612a0b565b8281036020840152612b3a8187612a0b565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b5857611b58612a82565b600082612b9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b5857611b58612a82565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612bf757600080fd5b8151801515811461279757600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612c6657835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612c32565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612ca557600080fd5b815167ffffffffffffffff811115612cbc57600080fd5b8201601f81018413612ccd57600080fd5b805167ffffffffffffffff811115612ce757612ce76127b7565b8060051b612cf7602082016127e6565b91825260208184018101929081019087841115612d1357600080fd5b6020850194505b83851015612d3957845180835260209586019590935090910190612d1a565b979650505050505050565b600060208284031215612d5657600080fd5b815167ffffffffffffffff8116811461279757600080fd5b805169ffffffffffffffffffff81168114612d8857600080fd5b919050565b600080600080600060a08688031215612da557600080fd5b612dae86612d6e565b60208701516040880151606089015192975090955093509150612dd360808701612d6e565b90509295509295909350565b600060208284031215612df157600080fd5b815161279781612755565b600080600060608486031215612e1157600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a264697066735822122037feedabb7a4846738a94f2a2faa5d46c4fe0e62a08a9be12838f39ae3ee648e64736f6c634300081c0033", + "bytecode": "0x610180604052600160025534801561001657600080fd5b506040516142a73803806142a78339810160408190526100359161008b565b6001600160a01b0397881660a05295871660c05293861660e05291851661010052608052831661012052821661014052166101605261011b565b80516001600160a01b038116811461008657600080fd5b919050565b600080600080600080600080610100898b0312156100a857600080fd5b6100b18961006f565b97506100bf60208a0161006f565b96506100cd60408a0161006f565b95506100db60608a0161006f565b9450608089015193506100f060a08a0161006f565b92506100fe60c08a0161006f565b915061010c60e08a0161006f565b90509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161407861022f600039600081816104b20152611f7d01526000818161056b01528181611c3f0152611d8301526000818161027d015281816118ca01528181611e9f01526121130152600081816105de01526123000152600081816106b6015281816119b501528181611a94015281816120e1015281816121c3015281816123aa01528181612489015261259b0152600081816102d60152818161185c015281816119e401528181611f0d015281816122cb015281816123dc015261254301526000818161021f0152818161193801528181611c6e01528181611d1c0152611e090152600081816105370152610f1a01526140786000f3fe6080604052600436106102015760003560e01c80637dc0d1d01161011d578063be399e2b116100b0578063dab346ff1161007f578063f76c603711610064578063f76c60371461066c578063f887ea40146106a4578063ffa1ad74146106d857600080fd5b8063dab346ff14610637578063f74e481b1461064c57600080fd5b8063be399e2b146105b6578063c45a0155146105cc578063cf4ffb7e14610600578063d1b0c2881461062057600080fd5b8063a5ae390c116100ec578063a5ae390c14610525578063a7be1b5014610559578063affed0e01461058d578063b1bd3c95146105a357600080fd5b80637dc0d1d0146104a05780638b9ee610146104d45780638e499bcf146104fc5780639823bb131461051257600080fd5b806336b4134a116101955780635122c409116101645780635122c409146104325780635eb76db2146104505780636be6af9814610478578063709a5c9c1461048d57600080fd5b806336b4134a146103ae5780633d0cc375146103c357806340b67a9b146103e5578063466ffbce1461041257600080fd5b806314c7312b116101d157806314c7312b146102f85780632e0f26251461035c578063323ebe581461038357806335f9f8d91461039957600080fd5b806231d1151461020d578063051ed8ef1461026b5780630a42f8bd1461029f5780631265b651146102c457600080fd5b3661020857005b600080fd5b34801561021957600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156102ab57600080fd5b506102b66202a30081565b604051908152602001610262565b3480156102d057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561030457600080fd5b5061033c610313366004612772565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610262565b34801561036857600080fd5b50610371601281565b60405160ff9091168152602001610262565b34801561038f57600080fd5b506102b660085481565b3480156103a557600080fd5b506102b6603281565b3480156103ba57600080fd5b506102b6606181565b3480156103cf57600080fd5b506103e36103de366004612772565b61072e565b005b3480156103f157600080fd5b506102b6610400366004612772565b60056020526000908152604090205481565b34801561041e57600080fd5b5061024161042d366004612796565b610b1b565b34801561043e57600080fd5b506102b669d3c21bcecceda100000081565b34801561045c57600080fd5b50610465600281565b60405161ffff9091168152602001610262565b34801561048457600080fd5b506102b6600081565b6103e361049b3660046128a7565b610b52565b3480156104ac57600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e057600080fd5b506102417351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561050857600080fd5b506102b660005481565b6103e3610520366004612772565b610cc5565b34801561053157600080fd5b506102b67f000000000000000000000000000000000000000000000000000000000000000081565b34801561056557600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561059957600080fd5b506102b660075481565b6103e36105b136600461292b565b610f18565b3480156105c257600080fd5b506102b660015481565b3480156105d857600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561060c57600080fd5b506103e361061b36600461299e565b61120e565b34801561062c57600080fd5b506102b66201518081565b34801561064357600080fd5b506102b6600a81565b34801561065857600080fd5b506103e3610667366004612772565b611594565b34801561067857600080fd5b506102b66106873660046129ca565b600460209081526000928352604080842090915290825290205481565b3480156106b057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e457600080fd5b506107216040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102629190612a67565b60025460011461079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b6202a300816020015161086d9190612aa9565b42116108fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610796565b33600090815260056020526040812080549161091683612abc565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561098a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ae9190612af4565b905060008111610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610796565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610b0891815260200190565b60405180910390a2505060016002555050565b60068181548110610b2b57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b600060015411610c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610796565b336000908152600560205260408120805491610c4583612abc565b91905055506000610c5860015485611834565b60006001819055909150610c6d828585611b5e565b90508015610cbe5760405132908290600081818185875af1925050503d8060008114610cb5576040519150601f19603f3d011682016040523d82523d6000602084013e610cba565b606091505b5050505b5050505050565b60003411610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610796565b600282015415610e4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610796565b610e593482612aa9565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610ea1908490612aa9565b9091555050336000908152600560205260408120805491610ec183612abc565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610fc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610796565b69d3c21bcecceda100000081101561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610796565b6000838360128460405161104f90612740565b61105c9493929190612b0d565b604051809103906000f080158015611078573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161116883612abc565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b60025460011461127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090208054600182015461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b62015180826001015461131f9190612aa9565b421015611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610796565b60006113948285611e78565b9050600060646113a5600a84612b49565b6113af9190612b60565b905080600160008282546113c39190612aa9565b909155506113d390508183612b9b565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144b9190612af4565b90506000606461145c603284612b49565b6114669190612b60565b905060006114748284612b9b565b90506000806114848c898661228e565b4260028d015560038c0185905533600090815260056020526040812080549395509193506114b183612abc565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114f9576114f98d82868d612617565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611578929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b600254600114611600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101929092526002810154938201849052909101546060820152906116bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610796565b6202a30081602001516116cf9190612aa9565b42111561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610796565b33600090815260056020526040812080549161181183612abc565b919050555061182a838284606001518560000151612617565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061188e5761188e612bae565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118fc576118fc612bae565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061196a5761196a612bae565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a539190612bdd565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611ad19088908890879030904290600401612bff565b6000604051808303816000875af1158015611af0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b369190810190612c8b565b905080600181518110611b4b57611b4b612bae565b6020026020010151925050505b92915050565b600060085484611b6e9190612aa9565b93506000611b7c8186612b60565b9050611b89600082612b49565b905060008111611bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610796565b611bff8186612b9b565b6008556040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdb9190612bdd565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df29190612d3c565b50611dfe816001612aa9565b6007556040518381527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a250349695505050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611ed157611ed1612bae565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611f3f57611f3f612bae565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200c9190612d85565b5050509150506000811361207c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610796565b60006402540be40060616120908885612b49565b61209a9190612b49565b6120a49190612b60565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af115801561215e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121829190612bdd565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612200908a908690899030904290600401612bff565b6000604051808303816000875af115801561221f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526122659190810190612c8b565b90508060018151811061227a5761227a612bae565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015612349573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236d9190612dd7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b9190612bdd565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af11580156124e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125059190612bdd565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af11580156125e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126099190612df4565b939793965092945050505050565b836000826126258587612b49565b61262f9190612b60565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156126c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ea9190612bdd565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612e2383390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461276f57600080fd5b50565b60006020828403121561278457600080fd5b813561278f8161274d565b9392505050565b6000602082840312156127a857600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612825576128256127af565b604052919050565b60008067ffffffffffffffff841115612848576128486127af565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200161287b816127de565b91505082815283838301111561289057600080fd5b828260208301376000602084830101529392505050565b6000806000606084860312156128bc57600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156128e157600080fd5b8401601f810186136128f257600080fd5b6129018682356020840161282d565b9150509250925092565b600082601f83011261291c57600080fd5b61278f8383356020850161282d565b60008060006060848603121561294057600080fd5b833567ffffffffffffffff81111561295757600080fd5b6129638682870161290b565b935050602084013567ffffffffffffffff81111561298057600080fd5b61298c8682870161290b565b93969395505050506040919091013590565b600080604083850312156129b157600080fd5b82356129bc8161274d565b946020939093013593505050565b600080604083850312156129dd57600080fd5b82356129e88161274d565b915060208301356129f88161274d565b809150509250929050565b6000815180845260005b81811015612a2957602081850181015186830182015201612a0d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061278f6020830184612a03565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b5857611b58612a7a565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612aed57612aed612a7a565b5060010190565b600060208284031215612b0657600080fd5b5051919050565b608081526000612b206080830187612a03565b8281036020840152612b328187612a03565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b5857611b58612a7a565b600082612b96577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b5857611b58612a7a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612bef57600080fd5b8151801515811461278f57600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612c5e57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612c2a565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612c9d57600080fd5b815167ffffffffffffffff811115612cb457600080fd5b8201601f81018413612cc557600080fd5b805167ffffffffffffffff811115612cdf57612cdf6127af565b8060051b612cef602082016127de565b91825260208184018101929081019087841115612d0b57600080fd5b6020850194505b83851015612d3157845180835260209586019590935090910190612d12565b979650505050505050565b600060208284031215612d4e57600080fd5b815167ffffffffffffffff8116811461278f57600080fd5b805169ffffffffffffffffffff81168114612d8057600080fd5b919050565b600080600080600060a08688031215612d9d57600080fd5b612da686612d66565b60208701516040880151606089015192975090955093509150612dcb60808701612d66565b90509295509295909350565b600060208284031215612de957600080fd5b815161278f8161274d565b600080600060608486031215612e0957600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a2646970667358221220e7db71f63de4f8d46fdbe7dea83c7d8cf990b9a8481065d14103dea8e218ab7c64736f6c634300081c0033", + "deployedBytecode": "0x6080604052600436106102015760003560e01c80637dc0d1d01161011d578063be399e2b116100b0578063dab346ff1161007f578063f76c603711610064578063f76c60371461066c578063f887ea40146106a4578063ffa1ad74146106d857600080fd5b8063dab346ff14610637578063f74e481b1461064c57600080fd5b8063be399e2b146105b6578063c45a0155146105cc578063cf4ffb7e14610600578063d1b0c2881461062057600080fd5b8063a5ae390c116100ec578063a5ae390c14610525578063a7be1b5014610559578063affed0e01461058d578063b1bd3c95146105a357600080fd5b80637dc0d1d0146104a05780638b9ee610146104d45780638e499bcf146104fc5780639823bb131461051257600080fd5b806336b4134a116101955780635122c409116101645780635122c409146104325780635eb76db2146104505780636be6af9814610478578063709a5c9c1461048d57600080fd5b806336b4134a146103ae5780633d0cc375146103c357806340b67a9b146103e5578063466ffbce1461041257600080fd5b806314c7312b116101d157806314c7312b146102f85780632e0f26251461035c578063323ebe581461038357806335f9f8d91461039957600080fd5b806231d1151461020d578063051ed8ef1461026b5780630a42f8bd1461029f5780631265b651146102c457600080fd5b3661020857005b600080fd5b34801561021957600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561027757600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156102ab57600080fd5b506102b66202a30081565b604051908152602001610262565b3480156102d057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561030457600080fd5b5061033c610313366004612772565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b604080519485526020850193909352918301526060820152608001610262565b34801561036857600080fd5b50610371601281565b60405160ff9091168152602001610262565b34801561038f57600080fd5b506102b660085481565b3480156103a557600080fd5b506102b6603281565b3480156103ba57600080fd5b506102b6606181565b3480156103cf57600080fd5b506103e36103de366004612772565b61072e565b005b3480156103f157600080fd5b506102b6610400366004612772565b60056020526000908152604090205481565b34801561041e57600080fd5b5061024161042d366004612796565b610b1b565b34801561043e57600080fd5b506102b669d3c21bcecceda100000081565b34801561045c57600080fd5b50610465600281565b60405161ffff9091168152602001610262565b34801561048457600080fd5b506102b6600081565b6103e361049b3660046128a7565b610b52565b3480156104ac57600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e057600080fd5b506102417351eb65012ca5ceb07320c497f4151ac207fea4e081565b34801561050857600080fd5b506102b660005481565b6103e3610520366004612772565b610cc5565b34801561053157600080fd5b506102b67f000000000000000000000000000000000000000000000000000000000000000081565b34801561056557600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561059957600080fd5b506102b660075481565b6103e36105b136600461292b565b610f18565b3480156105c257600080fd5b506102b660015481565b3480156105d857600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561060c57600080fd5b506103e361061b36600461299e565b61120e565b34801561062c57600080fd5b506102b66201518081565b34801561064357600080fd5b506102b6600a81565b34801561065857600080fd5b506103e3610667366004612772565b611594565b34801561067857600080fd5b506102b66106873660046129ca565b600460209081526000928352604080842090915290825290205481565b3480156106b057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e457600080fd5b506107216040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102629190612a67565b60025460011461079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e63792067756172640000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020818152604092839020835160808101855281548152600182015492810183905260028201549481019490945290910154606083015261085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b6202a300816020015161086d9190612aa9565b42116108fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5075726765206f6e6c7920616c6c6f7765642066726f6d20343820686f75727360448201527f2061667465722073756d6d6f6e000000000000000000000000000000000000006064820152608401610796565b33600090815260056020526040812080549161091683612abc565b90915550506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561098a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ae9190612af4565b905060008111610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f486173206265656e20707572676564206f72206e6f7468696e6720746f20707560448201527f72676500000000000000000000000000000000000000000000000000000000006064820152608401610796565b6040517f42966c680000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8316906342966c6890602401600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f265db6c9c62cb962adbcf4398a54e4b02b2d87b28ab5b7538850150465a5f43c82604051610b0891815260200190565b60405180910390a2505060016002555050565b60068181548110610b2b57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600254600114610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b600060015411610c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7468696e6720746f206275726e00000000000000000000000000000000006044820152606401610796565b336000908152600560205260408120805491610c4583612abc565b91905055506000610c5860015485611834565b60006001819055909150610c6d828585611b5e565b90508015610cbe5760405132908290600081818185875af1925050503d8060008114610cb5576040519150601f19603f3d011682016040523d82523d6000602084013e610cba565b606091505b5050505b5050505050565b60003411610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e617469766520746f6b656e20616d6f756e74206d757374206265206772656160448201527f746572207468616e207a65726f000000000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260409020805480610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d656d65206e6f74207965742073756d6d6f6e656400000000000000000000006044820152606401610796565b600282015415610e4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d656d6520616c726561647920756e6c656173686564000000000000000000006044820152606401610796565b610e593482612aa9565b80835573ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080549293503492909190610ea1908490612aa9565b9091555050336000908152600560205260408120805491610ec183612abc565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff84169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a3505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610fc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e696d756d206e617469766520746f6b656e2076616c756520697320726560448201527f71756972656420746f2073756d6d6f6e000000000000000000000000000000006064820152608401610796565b69d3c21bcecceda100000081101561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d20746f74616c20737570706c79206973206e6f74206d6574006044820152606401610796565b6000838360128460405161104f90612740565b61105c9493929190612b0d565b604051809103906000f080158015611078573d6000803e3d6000fd5b50604080516080810182523480825242602080840191825260008486018181526060860182815273ffffffffffffffffffffffffffffffffffffffff891680845260038086528985209851895595516001808a01919091559251600289015590519690940195909555600482528581203382528252858120939093556006805494850181557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90940180547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155915481556005909152908120805492935083929161116883612abc565b909155505060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907f109fe5b1a043e1fc6e8b6f4905613c0a5b82de0d8798558c67f0243106b2d7ad9060200160405180910390a360405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fb4dec46ff7703ee80325aa5ed4df0691d6d8791df96b50240552403cec1c9eda9060200160405180910390a35050505050565b60025460011461127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090208054600182015461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4d656d65206e6f742073756d6d6f6e65640000000000000000000000000000006044820152606401610796565b62015180826001015461131f9190612aa9565b421015611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f43616e6e6f7420756e6c656173682079657400000000000000000000000000006044820152606401610796565b60006113948285611e78565b9050600060646113a5600a84612b49565b6113af9190612b60565b905080600160008282546113c39190612aa9565b909155506113d390508183612b9b565b9150600086905060008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144b9190612af4565b90506000606461145c603284612b49565b6114669190612b60565b905060006114748284612b9b565b90506000806114848c898661228e565b4260028d015560038c0185905533600090815260056020526040812080549395509193506114b183612abc565b909155505073ffffffffffffffffffffffffffffffffffffffff8c16600090815260046020908152604080832033845290915290205480156114f9576114f98d82868d612617565b8273ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcef3279530e487be6d2c4583c847d17d5a328a9b6ab1e27ad458690257ba7768858c604051611578929190918252602082015260400190565b60405180910390a4505060016002555050505050505050505050565b600254600114611600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5265656e7472616e6379206775617264000000000000000000000000000000006044820152606401610796565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360208181526040928390208351608081018552815481526001820154928101929092526002810154938201849052909101546060820152906116bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d656d65206e6f7420756e6c65617368656400000000000000000000000000006044820152606401610796565b6202a30081602001516116cf9190612aa9565b42111561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f436f6c6c656374206f6e6c7920616c6c6f77656420756e74696c20343820686f60448201527f7572732061667465722073756d6d6f6e000000000000000000000000000000006064820152608401610796565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460209081526040808320338452909152902054806117f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f20746f6b656e20616c6c6f636174696f6e000000000000000000000000006044820152606401610796565b33600090815260056020526040812080549161181183612abc565b919050555061182a838284606001518560000151612617565b5050600160025550565b60408051600380825260808201909252600091829190602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061188e5761188e612bae565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106118fc576118fc612bae565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061196a5761196a612bae565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f095ea7b30000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000082166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a539190612bdd565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990611ad19088908890879030904290600401612bff565b6000604051808303816000875af1158015611af0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b369190810190612c8b565b905080600181518110611b4b57611b4b612bae565b6020026020010151925050505b92915050565b600060085484611b6e9190612aa9565b93506000611b7c8186612b60565b9050611b89600082612b49565b905060008111611bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e7420697320746f6f20736d616c6c20666f72206272696467696e676044820152606401610796565b611bff8186612b9b565b6008556040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdb9190612bdd565b506007546040517f0f5287b000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052600260448301527351eb65012ca5ceb07320c497f4151ac207fea4e0606483018190526000608484015263ffffffff841660a484015292917f000000000000000000000000000000000000000000000000000000000000000090911690630f5287b09060c4016020604051808303816000875af1158015611dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df29190612d3c565b50611dfe816001612aa9565b6007556040518381527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16907f40a3e75fd2efcf074c9c0520c5367ccb3093ded646970bdc8c3108748e5d3f0e9060200160405180910390a250349695505050505050565b604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611ed157611ed1612bae565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611f3f57611f3f612bae565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a0604051808303816000875af1158015611fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200c9190612d85565b5050509150506000811361207c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f7261636c6520707269636520697320696e636f7272656374000000000000006044820152606401610796565b60006402540be40060616120908885612b49565b61209a9190612b49565b6120a49190612b60565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af115801561215e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121829190612bdd565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338ed173990612200908a908690899030904290600401612bff565b6000604051808303816000875af115801561221f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526122659190810190612c8b565b90508060018151811061227a5761227a612bae565b602002602001015194505050505092915050565b6040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015612349573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236d9190612dd7565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529193507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b9190612bdd565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905286169063095ea7b3906044016020604051808303816000875af11580156124e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125059190612bdd565b506040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528681166024830152604482018690526064820185905260006084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af11580156125e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126099190612df4565b939793965092945050505050565b836000826126258587612b49565b61262f9190612b60565b73ffffffffffffffffffffffffffffffffffffffff87811660009081526004602081815260408084203380865292528084209390935591517fa9059cbb000000000000000000000000000000000000000000000000000000008152908101919091526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156126c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ea9190612bdd565b5060405181815273ffffffffffffffffffffffffffffffffffffffff87169033907f484decdc1e9549e1866295f6f86c889ded3f7de410e7488a7a415978589dc8fd9060200160405180910390a3505050505050565b61122080612e2383390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461276f57600080fd5b50565b60006020828403121561278457600080fd5b813561278f8161274d565b9392505050565b6000602082840312156127a857600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612825576128256127af565b604052919050565b60008067ffffffffffffffff841115612848576128486127af565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200161287b816127de565b91505082815283838301111561289057600080fd5b828260208301376000602084830101529392505050565b6000806000606084860312156128bc57600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156128e157600080fd5b8401601f810186136128f257600080fd5b6129018682356020840161282d565b9150509250925092565b600082601f83011261291c57600080fd5b61278f8383356020850161282d565b60008060006060848603121561294057600080fd5b833567ffffffffffffffff81111561295757600080fd5b6129638682870161290b565b935050602084013567ffffffffffffffff81111561298057600080fd5b61298c8682870161290b565b93969395505050506040919091013590565b600080604083850312156129b157600080fd5b82356129bc8161274d565b946020939093013593505050565b600080604083850312156129dd57600080fd5b82356129e88161274d565b915060208301356129f88161274d565b809150509250929050565b6000815180845260005b81811015612a2957602081850181015186830182015201612a0d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061278f6020830184612a03565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b5857611b58612a7a565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612aed57612aed612a7a565b5060010190565b600060208284031215612b0657600080fd5b5051919050565b608081526000612b206080830187612a03565b8281036020840152612b328187612a03565b60ff95909516604084015250506060015292915050565b8082028115828204841417611b5857611b58612a7a565b600082612b96577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b5857611b58612a7a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612bef57600080fd5b8151801515811461278f57600080fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015612c5e57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612c2a565b505073ffffffffffffffffffffffffffffffffffffffff9590951660608401525050608001529392505050565b600060208284031215612c9d57600080fd5b815167ffffffffffffffff811115612cb457600080fd5b8201601f81018413612cc557600080fd5b805167ffffffffffffffff811115612cdf57612cdf6127af565b8060051b612cef602082016127de565b91825260208184018101929081019087841115612d0b57600080fd5b6020850194505b83851015612d3157845180835260209586019590935090910190612d12565b979650505050505050565b600060208284031215612d4e57600080fd5b815167ffffffffffffffff8116811461278f57600080fd5b805169ffffffffffffffffffff81168114612d8057600080fd5b919050565b600080600080600060a08688031215612d9d57600080fd5b612da686612d66565b60208701516040880151606089015192975090955093509150612dcb60808701612d66565b90509295509295909350565b600060208284031215612de957600080fd5b815161278f8161274d565b600080600060608486031215612e0957600080fd5b505081516020830151604090930151909492935091905056fe60e060405234801561001057600080fd5b5060405161122038038061122083398101604081905261002f91610238565b838383600061003e848261034a565b50600161004b838261034a565b5060ff81166080524660a05261005f61007a565b60c05250610071915033905082610114565b505050506104a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516100ac9190610408565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254610126919061047d565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a657600080fd5b81516001600160401b038111156101bf576101bf61017f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ed576101ed61017f565b60405281815283820160200185101561020557600080fd5b60005b8281101561022457602081860181015183830182015201610208565b506000918101602001919091529392505050565b6000806000806080858703121561024e57600080fd5b84516001600160401b0381111561026457600080fd5b61027087828801610195565b602087015190955090506001600160401b0381111561028e57600080fd5b61029a87828801610195565b935050604085015160ff811681146102b157600080fd5b6060959095015193969295505050565b600181811c908216806102d557607f821691505b6020821081036102f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561034557806000526020600020601f840160051c810160208510156103225750805b601f840160051c820191505b81811015610342576000815560010161032e565b50505b505050565b81516001600160401b038111156103635761036361017f565b6103778161037184546102c1565b846102fb565b6020601f8211600181146103ab57600083156103935750848201515b600019600385901b1c1916600184901b178455610342565b600084815260208120601f198516915b828110156103db57878501518255602094850194600190920191016103bb565b50848210156103f95786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000808354610416816102c1565b60018216801561042d576001811461044257610472565b60ff1983168652811515820286019350610472565b86600052602060002060005b8381101561046a5781548882015260019091019060200161044e565b505081860193505b509195945050505050565b8082018082111561049e57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c051610d4d6104d360003960006104c30152600061048e015260006101540152610d4d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b41146101e5578063a9059cbb146101ed578063d505accf14610200578063dd62ed3e1461021357600080fd5b806342966c681461019057806370a08231146101a55780637ecebe00146101c557600080fd5b806323b872dd116100bd57806323b872dd1461013c578063313ce5671461014f5780633644e5151461018857600080fd5b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610125575b600080fd5b6100ec61023e565b6040516100f991906109d7565b60405180910390f35b610115610110366004610a6c565b6102cc565b60405190151581526020016100f9565b61012e60025481565b6040519081526020016100f9565b61011561014a366004610a96565b610346565b6101767f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100f9565b61012e61048a565b6101a361019e366004610ad3565b6104e5565b005b61012e6101b3366004610aec565b60036020526000908152604090205481565b61012e6101d3366004610aec565b60056020526000908152604090205481565b6100ec6104f2565b6101156101fb366004610a6c565b6104ff565b6101a361020e366004610b0e565b610584565b61012e610221366004610b81565b600460209081526000928352604080842090915290825290205481565b6000805461024b90610bb4565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610bb4565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103349086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103da576103a88382610c07565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260408120805485929061040f908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104779087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104c0576104bb6108a8565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6104ef3382610942565b50565b6001805461024b90610bb4565b33600090815260036020526040812080548391908390610520908490610c07565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103349086815260200190565b428410156105f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ff61048a565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610751573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107cc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ea565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516108da9190610c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610977908490610c07565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b602081526000825180602084015260005b81811015610a0557602081860181015160408684010152016109e8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a6757600080fd5b919050565b60008060408385031215610a7f57600080fd5b610a8883610a43565b946020939093013593505050565b600080600060608486031215610aab57600080fd5b610ab484610a43565b9250610ac260208501610a43565b929592945050506040919091013590565b600060208284031215610ae557600080fd5b5035919050565b600060208284031215610afe57600080fd5b610b0782610a43565b9392505050565b600080600080600080600060e0888a031215610b2957600080fd5b610b3288610a43565b9650610b4060208901610a43565b95506040880135945060608801359350608088013560ff81168114610b6457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610b9457600080fd5b610b9d83610a43565b9150610bab60208401610a43565b90509250929050565b600181811c90821680610bc857607f821691505b602082108103610c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610340577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000808354818160011c90506001821680610c5d57607f821691505b602082108103610c94577f4e487b710000000000000000000000000000000000000000000000000000000084526022600452602484fd5b808015610ca85760018114610cdb57610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450610d0b565b60008881526020902060005b84811015610d0357815489820152600190910190602001610ce7565b505082870194505b5092969550505050505056fea26469706673582212203b134facc9dcc6995fc2e3d1fc78c6d13107692c1f18cfe3450a552767346f3e64736f6c634300081c0033a2646970667358221220e7db71f63de4f8d46fdbe7dea83c7d8cf990b9a8481065d14103dea8e218ab7c64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/MemeCelo.sol b/contracts/MemeCelo.sol index 7488a57..d8676b8 100644 --- a/contracts/MemeCelo.sol +++ b/contracts/MemeCelo.sol @@ -147,11 +147,8 @@ contract MemeCelo is MemeFactory { /// @param olasAmount OLAS amount. /// @return msg.value leftovers if partially utilized by the bridge. function _bridgeAndBurn(uint256 olasAmount, uint256, bytes memory) internal override returns (uint256) { - // Get OLAS leftovers from previous transfers - uint256 localLeftovers = olasLeftovers; - - // Adjust the amount to transfer - olasAmount += localLeftovers; + // Get OLAS leftovers from previous transfers and adjust the amount to transfer + olasAmount += olasLeftovers; // Round transfer amount to the cutoff value uint256 transferAmount = olasAmount / WORMHOLE_BRIDGING_CUTOFF; @@ -161,8 +158,7 @@ contract MemeCelo is MemeFactory { require(transferAmount > 0, "Amount is too small for bridging"); // Update OLAS leftovers - localLeftovers = olasAmount - transferAmount; - olasLeftovers = localLeftovers; + olasLeftovers = olasAmount - transferAmount; // Approve bridge to use OLAS IERC20(olas).approve(l2TokenRelayer, transferAmount);