Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.126115351753517589 ETH
Eth Value
$389.74 (@ $3,090.33/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 98 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Sell | 15974468 | 736 days ago | IN | 0 ETH | 0.00116335 | ||||
Sell | 13480719 | 1123 days ago | IN | 0 ETH | 0.00763411 | ||||
Sell | 12597641 | 1260 days ago | IN | 0 ETH | 0.00091257 | ||||
Sell | 12579695 | 1263 days ago | IN | 0 ETH | 0.00081426 | ||||
Sell | 12549678 | 1268 days ago | IN | 0 ETH | 0.00223954 | ||||
Sell | 12430126 | 1286 days ago | IN | 0 ETH | 0.00739746 | ||||
Withdraw | 12380459 | 1294 days ago | IN | 0 ETH | 0.00170469 | ||||
Withdraw | 12380167 | 1294 days ago | IN | 0 ETH | 0.00162352 | ||||
Sell | 12380144 | 1294 days ago | IN | 0 ETH | 0.00276697 | ||||
Withdraw | 12377451 | 1294 days ago | IN | 0 ETH | 0.00256505 | ||||
Sell | 12377446 | 1294 days ago | IN | 0 ETH | 0.00379523 | ||||
Withdraw | 12377274 | 1294 days ago | IN | 0 ETH | 0.0020184 | ||||
Sell | 12377239 | 1294 days ago | IN | 0 ETH | 0.00319975 | ||||
Sell | 12376825 | 1294 days ago | IN | 0 ETH | 0.0065 | ||||
Sell | 12376803 | 1294 days ago | IN | 0 ETH | 0.0063 | ||||
Sell | 12376787 | 1294 days ago | IN | 0 ETH | 0.00567 | ||||
Withdraw | 12376767 | 1294 days ago | IN | 0 ETH | 0.00264915 | ||||
Sell | 12376755 | 1294 days ago | IN | 0 ETH | 0.008 | ||||
Withdraw | 12376747 | 1294 days ago | IN | 0 ETH | 0.00273325 | ||||
Sell | 12376728 | 1294 days ago | IN | 0 ETH | 0.00544005 | ||||
Withdraw | 12376705 | 1294 days ago | IN | 0 ETH | 0.0026912 | ||||
Stop Auto Reinve... | 12376703 | 1294 days ago | IN | 0 ETH | 0.00139054 | ||||
Reinvest | 12376689 | 1294 days ago | IN | 0 ETH | 0.00844528 | ||||
Withdraw | 12376605 | 1294 days ago | IN | 0 ETH | 0.00273325 | ||||
Sell | 12376595 | 1294 days ago | IN | 0 ETH | 0.00521146 |
Latest 14 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12377451 | 1294 days ago | 1.00227754 ETH | ||||
12377274 | 1294 days ago | 0.41432723 ETH | ||||
12376767 | 1294 days ago | 0.10220044 ETH | ||||
12376747 | 1294 days ago | 0.50923865 ETH | ||||
12376705 | 1294 days ago | 4.46147717 ETH | ||||
12376605 | 1294 days ago | 5.00949582 ETH | ||||
12376505 | 1294 days ago | 6.51421374 ETH | ||||
12376261 | 1294 days ago | 2.47083539 ETH | ||||
12376174 | 1294 days ago | 0.22912557 ETH | ||||
12376170 | 1294 days ago | 2.235319 ETH | ||||
12361677 | 1297 days ago | 0.49494721 ETH | ||||
12313061 | 1304 days ago | 0.22785227 ETH | ||||
12311177 | 1304 days ago | 2.43403669 ETH | ||||
12276400 | 1310 days ago | 1.86143785 ETH |
Loading...
Loading
Contract Name:
Hourglass
Compiler Version
v0.5.15+commit.6a57276f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-05 */ pragma solidity ^0.5.15; /* :'######::'########:'########::'#######:: '##... ##: ##.....::... ##..::'##.... ##: ##:::..:: ##:::::::::: ##:::: ##:::: ##: ##::::::: ######:::::: ##:::: ##:::: ##: ##::::::: ##...::::::: ##:::: ##:::: ##: ##::: ##: ##:::::::::: ##:::: ##:::: ##: . ######:: ########:::: ##::::. #######:: :......:::........:::::..::::::.......::: Creator: 773d62b24a9d49e1f990b22e3ef1a9903f44ee809a12d73e660c66c1772c47dd */ contract Hourglass { /*================================= = MODIFIERS = =================================*/ // only people with tokens modifier onlyBagholders() { require(myTokens() > 0); _; } // administrators can: // -> change the name of the contract // -> change the name of the token // -> change the PoS difficulty (How many tokens it costs to hold a masternode, in case it gets crazy high later) // they CANNOT: // -> take funds // -> disable withdrawals // -> kill the contract // -> change the price of tokens modifier onlyAdministrator() { address _customerAddress = msg.sender; require(administrators[_customerAddress], "This address is not an admin"); _; } // ensures that the first tokens in the contract will be equally distributed // meaning, no divine dump will be ever possible // result: healthy longevity. modifier antiEarlyWhale(uint256 _amountOfEthereum) { // are we still in the vulnerable phase? // if so, enact anti early whale protocol if (onlyAmbassadors) { address _customerAddress = msg.sender; if ( (totalEthereumBalance() - _amountOfEthereum) <= ambassadorQuota_ ) { require( // is the customer in the ambassador list? ambassadors_[_customerAddress] == true && // does the customer purchase exceed the max ambassador quota? (ambassadorAccumulatedQuota_[_customerAddress] + _amountOfEthereum) <= ambassadorMaxPurchase_ ); // updated the accumulated quota ambassadorAccumulatedQuota_[_customerAddress] = SafeMath.add( ambassadorAccumulatedQuota_[_customerAddress], _amountOfEthereum ); // execute _; } else { // in case the trx count drops low, the ambassador phase won't reinitiate onlyAmbassadors = false; _; } } // execute _; } /*============================== = EVENTS = ==============================*/ event onTokenPurchase( address indexed customerAddress, uint256 incomingEthereum, uint256 tokensMinted, address indexed referredBy ); event onTokenSell( address indexed customerAddress, uint256 tokensBurned, uint256 ethereumEarned ); event onReinvestment( address indexed customerAddress, uint256 ethereumReinvested, uint256 tokensMinted ); event onWithdraw( address indexed customerAddress, uint256 ethereumWithdrawn ); // ERC20 event Transfer( address indexed from, address indexed to, uint256 tokens ); event Approval( address indexed owner, address indexed spender, uint256 value ); // When a customer sets up AutoReinvestment event onAutoReinvestmentEntry( address indexed customerAddress, uint256 nextExecutionTime, uint256 rewardPerInvocation, uint24 period, uint256 minimumDividendValue ); // When a customer stops AutoReinvestment event onAutoReinvestmentStop(address indexed customerAddress); /*===================================== = CONFIGURABLES = =====================================*/ string public name = "Crystal Elephant Token"; string public symbol = "ECETO"; uint8 public constant decimals = 18; uint8 internal constant dividendFee_ = 10; uint256 internal constant tokenPriceInitial_ = 100e9; // unit: wei uint256 internal constant tokenPriceIncremental_ = 10e9; // unit: wei uint256 internal constant magnitude = 2**64; // requirement for earning a referral bonus (defaults at 360 tokens) uint256 public stakingRequirement = 30e18; // ambassador program mapping(address => bool) public ambassadors_; uint256 internal constant ambassadorMaxPurchase_ = 4e18; // 4 ETH uint256 internal constant ambassadorQuota_ = 100e18; // 100 ETH /*================================ = DATASETS = ================================*/ // amount of tokens for each address (scaled number) mapping(address => uint256) internal tokenBalanceLedger_; // TODO: // amount of tokens bought with their buy timestamp for each address struct TimestampedBalance { uint256 value; uint256 timestamp; uint256 valueSold; } mapping(address => TimestampedBalance[]) internal tokenTimestampedBalanceLedger_; // The start and end index of the unsold timestamped transactions list struct Cursor { uint256 start; uint256 end; } mapping(address => Cursor) internal tokenTimestampedBalanceCursor; // mappings to and from referral address mapping(address => bytes32) public referralMapping; mapping(bytes32 => address) public referralReverseMapping; // The current referral balance mapping(address => uint256) public referralBalance_; // All time referrals earnings mapping(address => uint256) public referralIncome_; mapping(address => int256) internal payoutsTo_; mapping(address => uint256) internal ambassadorAccumulatedQuota_; uint256 internal tokenSupply_ = 0; uint256 internal profitPerShare_; // administrator list (see above on what they can do) mapping(address => bool) public administrators; // when this is set to true, only ambassadors can purchase tokens (this prevents a whale premine, it ensures a fairly distributed upper pyramid) bool public onlyAmbassadors = true; /*======================================= = PUBLIC FUNCTIONS = =======================================*/ /* * -- APPLICATION ENTRY POINTS -- */ constructor() public { address owner = msg.sender; administrators[owner] = true; ambassadors_[0x8c67C528a78c3142eEbA7A9FB9966c3141ABFc07] = true; ambassadors_[0xA3085Dc923e5de6E1919CFaE73a4D4557CF31734] = true; ambassadors_[0x62544c00f6458011796605E8E6E7F799E17b1348] = true; ambassadors_[0x5357777ddD555a192E1E87b96a93aAdcC463D0f8] = true; ambassadors_[0x8713c7d84dA4edC2795EbaBfFdeEF4bB2Ef654Df] = true; ambassadors_[0xC8b17a71fE39dB3AdD2438B89C1522d03767ebDA] = true; ambassadors_[0x6B6dDbb85000EFCbff006BEa12CeD803Fd0a0B96] = true; ambassadors_[0x2F09612675A16E9D97e8A0c27D2285A5d8FB6EBa] = true; ambassadors_[0xD82f5174e03E3352a35a933a11100e6c2607Ba1E] = true; ambassadors_[0x28eb45DB2c42b56A1C5BC915F4cc47DD79239632] = true; ambassadors_[0x12B2398405f49dEc00D7ceEF9C0925e6fc96c51F] = true; ambassadors_[0x32c0aE75EF5BEB409a17fcf26fDDb8561EEF8394] = true; ambassadors_[0x2FC1DbA620e749E86E51C2d9c42993174E1986ce] = true; ambassadors_[0xDBfc64ff6C4d85f42D8411680ebe90aD06bF3E81] = true; ambassadors_[0xBD54eb8AD245450e225A77Af5956F2b41301c845] = true; ambassadors_[0x58d1a5e3ca23F46E16BcA17849CE327a415A2ee5] = true; ambassadors_[0x33a2e739b428508643Ee49d874775e1196178A1c] = true; ambassadors_[0x45ADFF324Eb1ac03a6A115dc539052232D4bA980] = true; ambassadors_[0x3e666E4B6091263F3A70C004E47a1e172f31Ff42] = true; ambassadors_[0x766917c3Ee4AA5164b3A6F01363865efA8CE6fFd] = true; ambassadors_[0x3Ee362b5DB70c2935e718f7711B1CCAC7dbAd081] = true; ambassadors_[0xcb1A0F26c89fbC1BCb14fE1Ee9a2785BAE419e81] = true; } /** * Fallback function to handle ethereum that was send straight to the contract * Unfortunately we cannot use a referral address this way. */ function() external payable { purchaseTokens(msg.sender, msg.value, address(0)); } /** * Converts all incoming ethereum to tokens for the caller, and passes down the referral addy (if any) */ function buy(address _referredBy) public payable { purchaseTokens(msg.sender, msg.value, _referredBy); } /** * Converts all of caller's dividends to tokens. */ function reinvest( bool isAutoReinvestChecked, uint24 period, uint256 rewardPerInvocation, uint256 minimumDividendValue ) public { _reinvest(msg.sender); // Setup Auto Reinvestment if (isAutoReinvestChecked) { _setupAutoReinvest( period, rewardPerInvocation, msg.sender, minimumDividendValue ); } } /** * Alias of sell() and withdraw(). */ function exit() public { // get token count for caller & sell them all address _customerAddress = msg.sender; uint256 _tokens = tokenBalanceLedger_[_customerAddress]; if (_tokens > 0) sell(_tokens); withdraw(); } /** * Withdraws all of the callers earnings. */ function withdraw() public { _withdraw(msg.sender); } /** * Liquifies tokens to ethereum. */ function sell(uint256 _amountOfTokens) public onlyBagholders() { // setup data address _customerAddress = msg.sender; require(_amountOfTokens <= tokenBalanceLedger_[_customerAddress]); uint256 _tokens = _amountOfTokens; uint256 _ethereum = tokensToEthereum_(_tokens); uint256 penalty = mulDiv( calculateAveragePenaltyAndUpdateLedger( _amountOfTokens, _customerAddress ), _ethereum, 100 ); uint256 _dividends = SafeMath.add( penalty, SafeMath.div(SafeMath.sub(_ethereum, penalty), dividendFee_) ); uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends); // burn the sold tokens tokenSupply_ = SafeMath.sub(tokenSupply_, _tokens); tokenBalanceLedger_[_customerAddress] = SafeMath.sub( tokenBalanceLedger_[_customerAddress], _tokens ); // update dividends tracker int256 _updatedPayouts = (int256)(profitPerShare_ * _tokens + (_taxedEthereum * magnitude)); payoutsTo_[_customerAddress] -= _updatedPayouts; if (tokenSupply_ > 0) { // update the amount of dividends per token profitPerShare_ = SafeMath.add( profitPerShare_, mulDiv(_dividends, magnitude, tokenSupply_) ); } emit onTokenSell(_customerAddress, _tokens, _taxedEthereum); } /*---------- ADMINISTRATOR ONLY FUNCTIONS ----------*/ /** * In case the amassador quota is not met, the administrator can manually disable the ambassador phase. */ function disableInitialStage() public onlyAdministrator() { onlyAmbassadors = false; } function setAdministrator(address _identifier, bool _status) public onlyAdministrator() { administrators[_identifier] = _status; } /** * Precautionary measures in case we need to adjust the masternode rate. */ function setStakingRequirement(uint256 _amountOfTokens) public onlyAdministrator() { stakingRequirement = _amountOfTokens; } /** * If we want to rebrand, we can. */ function setName(string memory _name) public onlyAdministrator() { name = _name; } /** * If we want to rebrand, we can. */ function setSymbol(string memory _symbol) public onlyAdministrator() { symbol = _symbol; } /*---------- REFERRAL FUNCTIONS ----------*/ function setReferralName(bytes32 ref_name) public returns (bool) { referralMapping[msg.sender] = ref_name; referralReverseMapping[ref_name] = msg.sender; return true; } function getReferralAddressForName(bytes32 ref_name) public view returns (address) { return referralReverseMapping[ref_name]; } function getReferralNameForAddress(address ref_address) public view returns (bytes32) { return referralMapping[ref_address]; } function getReferralBalance() public view returns (uint256, uint256) { address _customerAddress = msg.sender; return ( referralBalance_[_customerAddress], referralIncome_[_customerAddress] ); } /*------READ FUNCTIONS FOR TIMESTAMPED BALANCE LEDGER-------*/ function getCursor() public view returns (uint256, uint256) { address _customerAddress = msg.sender; Cursor storage cursor = tokenTimestampedBalanceCursor[_customerAddress]; return (cursor.start, cursor.end); } function getTimestampedBalanceLedger(uint256 counter) public view returns ( uint256, uint256, uint256 ) { address _customerAddress = msg.sender; TimestampedBalance storage transaction = tokenTimestampedBalanceLedger_[_customerAddress][counter]; return ( transaction.value, transaction.timestamp, transaction.valueSold ); } /*---------- HELPERS AND CALCULATORS ----------*/ /** * Method to view the current Ethereum stored in the contract * Example: totalEthereumBalance() */ function totalEthereumBalance() public view returns (uint256) { return address(this).balance; } /** * Retrieve the total token supply. */ function totalSupply() public view returns (uint256) { return tokenSupply_; } /** * Retrieve the tokens owned by the caller. */ function myTokens() public view returns (uint256) { address _customerAddress = msg.sender; return balanceOf(_customerAddress); } /** * Retrieve the dividends owned by the caller. * If `_includeReferralBonus` is true, the referral bonus will be included in the calculations. * The reason for this, is that in the frontend, we will want to get the total divs (global + ref) * But in the internal calculations, we want them separate. */ function myDividends(bool _includeReferralBonus) public view returns (uint256) { address _customerAddress = msg.sender; return _includeReferralBonus ? dividendsOf(_customerAddress) + referralBalance_[_customerAddress] : dividendsOf(_customerAddress); } /** * Retrieve the token balance of any single address. */ function balanceOf(address _customerAddress) public view returns (uint256) { return tokenBalanceLedger_[_customerAddress]; } /** * Retrieve the dividend balance of any single address. */ function dividendsOf(address _customerAddress) public view returns (uint256) { return (uint256)( (int256)( profitPerShare_ * tokenBalanceLedger_[_customerAddress] ) - payoutsTo_[_customerAddress] ) / magnitude; } /** * Return the ethereum received on selling 1 individual token. * We are not deducting the penalty over here as it's a general sell price * the user can use the `calculateEthereumReceived` to get the sell price specific to them */ function sellPrice() public view returns (uint256) { if (tokenSupply_ == 0) { return tokenPriceInitial_ - tokenPriceIncremental_; } else { uint256 _ethereum = tokensToEthereum_(1e18); uint256 _dividends = SafeMath.div(_ethereum, dividendFee_); uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends); return _taxedEthereum; } } /** * Return the ethereum required for buying 1 individual token. */ function buyPrice() public view returns (uint256) { if (tokenSupply_ == 0) { return tokenPriceInitial_ + tokenPriceIncremental_; } else { uint256 _ethereum = tokensToEthereum_(1e18); uint256 _taxedEthereum = mulDiv(_ethereum, dividendFee_, (dividendFee_ - 1)); return _taxedEthereum; } } /* * Function for the frontend to dynamically retrieve the price scaling of buy orders. */ function calculateTokensReceived(uint256 _ethereumToSpend) public view returns (uint256) { uint256 _dividends = SafeMath.div(_ethereumToSpend, dividendFee_); uint256 _taxedEthereum = SafeMath.sub(_ethereumToSpend, _dividends); uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum); return _amountOfTokens; } function calculateTokensReinvested() public view returns (uint256) { uint256 _ethereumToSpend = myDividends(true); uint256 _dividends = SafeMath.div(_ethereumToSpend, dividendFee_); uint256 _taxedEthereum = SafeMath.sub(_ethereumToSpend, _dividends); uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum); return _amountOfTokens; } /** * Function for the frontend to dynamically retrieve the price scaling of sell orders. */ function calculateEthereumReceived(uint256 _tokensToSell) public view returns (uint256) { require(_tokensToSell <= tokenSupply_); require(_tokensToSell <= myTokens()); uint256 _ethereum = tokensToEthereum_(_tokensToSell); address _customerAddress = msg.sender; uint256 penalty = mulDiv( calculateAveragePenalty(_tokensToSell, _customerAddress), _ethereum, 100 ); uint256 _dividends = SafeMath.add( penalty, SafeMath.div(SafeMath.sub(_ethereum, penalty), dividendFee_) ); uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends); return _taxedEthereum; } function calculateEthereumTransferred(uint256 _amountOfTokens) public view returns (uint256) { require(_amountOfTokens <= tokenSupply_); require(_amountOfTokens <= myTokens()); uint256 _tokenFee = SafeMath.div(_amountOfTokens, dividendFee_); uint256 _taxedTokens = SafeMath.sub(_amountOfTokens, _tokenFee); return _taxedTokens; } /** * Calculate the early exit penalty for selling x tokens */ function calculateAveragePenalty( uint256 _amountOfTokens, address _customerAddress ) public view onlyBagholders() returns (uint256) { require(_amountOfTokens <= tokenBalanceLedger_[_customerAddress]); uint256 tokensFound = 0; Cursor storage _customerCursor = tokenTimestampedBalanceCursor[_customerAddress]; uint256 counter = _customerCursor.start; uint256 averagePenalty = 0; while (counter <= _customerCursor.end) { TimestampedBalance storage transaction = tokenTimestampedBalanceLedger_[_customerAddress][counter]; uint256 tokensAvailable = SafeMath.sub(transaction.value, transaction.valueSold); uint256 tokensRequired = SafeMath.sub(_amountOfTokens, tokensFound); if (tokensAvailable < tokensRequired) { tokensFound += tokensAvailable; averagePenalty = SafeMath.add( averagePenalty, SafeMath.mul( _calculatePenalty(transaction.timestamp), tokensAvailable ) ); } else if (tokensAvailable <= tokensRequired) { averagePenalty = SafeMath.add( averagePenalty, SafeMath.mul( _calculatePenalty(transaction.timestamp), tokensRequired ) ); break; } else { averagePenalty = SafeMath.add( averagePenalty, SafeMath.mul( _calculatePenalty(transaction.timestamp), tokensRequired ) ); break; } counter = SafeMath.add(counter, 1); } return SafeMath.div(averagePenalty, _amountOfTokens); } /** * Calculate the early exit penalty for selling after x days */ function _calculatePenalty(uint256 timestamp) public view returns (uint256) { uint256 gap = block.timestamp - timestamp; if (gap > 30 days) { return 0; } else if (gap > 20 days) { return 25; } else if (gap > 10 days) { return 50; } return 75; } /** * Calculate Token price based on an amount of incoming ethereum * Some conversions occurred to prevent decimal errors or underflows / overflows in solidity code. */ function ethereumToTokens_(uint256 _ethereum) public view returns (uint256) { uint256 _tokenPriceInitial = tokenPriceInitial_ * 1e18; uint256 _tokensReceived = (( SafeMath.sub( ( sqrt( (_tokenPriceInitial**2) + (2 * (tokenPriceIncremental_ * 1e18) * (_ethereum * 1e18)) + (((tokenPriceIncremental_)**2) * (tokenSupply_**2)) + (2 * (tokenPriceIncremental_) * _tokenPriceInitial * tokenSupply_) ) ), _tokenPriceInitial ) ) / (tokenPriceIncremental_)) - (tokenSupply_); return _tokensReceived; } /** * Calculate token sell value. * Some conversions occurred to prevent decimal errors or underflows / overflows in solidity code. */ function tokensToEthereum_(uint256 _tokens) public view returns (uint256) { uint256 tokens_ = (_tokens + 1e18); uint256 _tokenSupply = (tokenSupply_ + 1e18); uint256 _ethereumReceived = (SafeMath.sub( (((tokenPriceInitial_ + (tokenPriceIncremental_ * (_tokenSupply / 1e18))) - tokenPriceIncremental_) * (tokens_ - 1e18)), (tokenPriceIncremental_ * ((tokens_**2 - tokens_) / 1e18)) / 2 ) / 1e18); return _ethereumReceived; } /*========================================== = INTERNAL FUNCTIONS = ==========================================*/ function purchaseTokens( address _customerAddress, uint256 _incomingEthereum, address _referredBy ) internal antiEarlyWhale(_incomingEthereum) returns (uint256) { // data setup uint256 _undividedDividends = SafeMath.div(_incomingEthereum, dividendFee_); uint256 _referralBonus = SafeMath.div(_undividedDividends, 3); uint256 _dividends = SafeMath.sub(_undividedDividends, _referralBonus); uint256 _taxedEthereum = SafeMath.sub(_incomingEthereum, _undividedDividends); uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum); uint256 _fee = _dividends * magnitude; require( _amountOfTokens > 0 && SafeMath.add(_amountOfTokens, tokenSupply_) > tokenSupply_ ); // is the user referred by a masternode? if ( _referredBy != address(0) && _referredBy != _customerAddress && tokenBalanceLedger_[_referredBy] >= stakingRequirement ) { // wealth redistribution referralBalance_[_referredBy] = SafeMath.add( referralBalance_[_referredBy], _referralBonus ); referralIncome_[_referredBy] = SafeMath.add( referralIncome_[_referredBy], _referralBonus ); } else { // no ref purchase // add the referral bonus back to the global dividends cake _dividends = SafeMath.add(_dividends, _referralBonus); _fee = _dividends * magnitude; } if (tokenSupply_ > 0) { // add tokens to the pool tokenSupply_ = SafeMath.add(tokenSupply_, _amountOfTokens); // take the amount of dividends gained through this transaction, and allocates them evenly to each shareholder profitPerShare_ += ((_dividends * magnitude) / (tokenSupply_)); // calculate the amount of tokens the customer receives over his purchase _fee = _fee - (_fee - (_amountOfTokens * ((_dividends * magnitude) / (tokenSupply_)))); } else { // add tokens to the pool tokenSupply_ = _amountOfTokens; } // update circulating supply & the ledger address for the customer tokenBalanceLedger_[_customerAddress] = SafeMath.add( tokenBalanceLedger_[_customerAddress], _amountOfTokens ); tokenTimestampedBalanceLedger_[_customerAddress].push( TimestampedBalance(_amountOfTokens, block.timestamp, 0) ); tokenTimestampedBalanceCursor[_customerAddress].end += 1; // You don't get dividends for the tokens before they owned them int256 _updatedPayouts = (int256)(profitPerShare_ * _amountOfTokens - _fee); payoutsTo_[_customerAddress] += _updatedPayouts; // fire event emit onTokenPurchase( _customerAddress, _incomingEthereum, _amountOfTokens, _referredBy ); emit Transfer( address(0), _customerAddress, _amountOfTokens ); return _amountOfTokens; } function _reinvest(address _customerAddress) internal { uint256 _dividends = dividendsOf(_customerAddress); // onlyStronghands require(_dividends + referralBalance_[_customerAddress] > 0); payoutsTo_[_customerAddress] += (int256)(_dividends * magnitude); // retrieve ref. bonus _dividends += referralBalance_[_customerAddress]; referralBalance_[_customerAddress] = 0; // dispatch a buy order with the virtualized "withdrawn dividends" uint256 _tokens = purchaseTokens(_customerAddress, _dividends, address(0)); // fire event emit onReinvestment(_customerAddress, _dividends, _tokens); } function _withdraw(address _customerAddress) internal { uint256 _dividends = dividendsOf(_customerAddress); // get ref. bonus later in the code // onlyStronghands require(_dividends + referralBalance_[_customerAddress] > 0); // update dividend tracker payoutsTo_[_customerAddress] += (int256)(_dividends * magnitude); // add ref. bonus _dividends += referralBalance_[_customerAddress]; referralBalance_[_customerAddress] = 0; address payable _payableCustomerAddress = address(uint160(_customerAddress)); _payableCustomerAddress.transfer(_dividends); // fire event emit onWithdraw(_customerAddress, _dividends); } /** * Update ledger after transferring x tokens */ function _updateLedgerForTransfer( uint256 _amountOfTokens, address _customerAddress ) internal { // Parse through the list of transactions uint256 tokensFound = 0; Cursor storage _customerCursor = tokenTimestampedBalanceCursor[_customerAddress]; uint256 counter = _customerCursor.start; while (counter <= _customerCursor.end) { TimestampedBalance storage transaction = tokenTimestampedBalanceLedger_[_customerAddress][counter]; uint256 tokensAvailable = SafeMath.sub(transaction.value, transaction.valueSold); uint256 tokensRequired = SafeMath.sub(_amountOfTokens, tokensFound); if (tokensAvailable < tokensRequired) { tokensFound += tokensAvailable; delete tokenTimestampedBalanceLedger_[_customerAddress][ counter ]; } else if (tokensAvailable <= tokensRequired) { delete tokenTimestampedBalanceLedger_[_customerAddress][ counter ]; _customerCursor.start = counter + 1; break; } else { transaction.valueSold += tokensRequired; _customerCursor.start = counter; break; } counter += 1; } } /** * Calculate the early exit penalty for selling x tokens and edit the timestamped ledger */ function calculateAveragePenaltyAndUpdateLedger( uint256 _amountOfTokens, address _customerAddress ) internal onlyBagholders() returns (uint256) { // Parse through the list of transactions uint256 tokensFound = 0; Cursor storage _customerCursor = tokenTimestampedBalanceCursor[_customerAddress]; uint256 counter = _customerCursor.start; uint256 averagePenalty = 0; while (counter <= _customerCursor.end) { TimestampedBalance storage transaction = tokenTimestampedBalanceLedger_[_customerAddress][counter]; uint256 tokensAvailable = SafeMath.sub(transaction.value, transaction.valueSold); uint256 tokensRequired = SafeMath.sub(_amountOfTokens, tokensFound); if (tokensAvailable < tokensRequired) { tokensFound += tokensAvailable; averagePenalty = SafeMath.add( averagePenalty, SafeMath.mul( _calculatePenalty(transaction.timestamp), tokensAvailable ) ); delete tokenTimestampedBalanceLedger_[_customerAddress][ counter ]; } else if (tokensAvailable <= tokensRequired) { averagePenalty = SafeMath.add( averagePenalty, SafeMath.mul( _calculatePenalty(transaction.timestamp), tokensRequired ) ); delete tokenTimestampedBalanceLedger_[_customerAddress][ counter ]; _customerCursor.start = counter + 1; break; } else { averagePenalty = SafeMath.add( averagePenalty, SafeMath.mul( _calculatePenalty(transaction.timestamp), tokensRequired ) ); transaction.valueSold += tokensRequired; _customerCursor.start = counter; break; } counter += 1; } return SafeMath.div(averagePenalty, _amountOfTokens); } function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = (x + 1) / 2; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } /** * @dev calculates x*y and outputs a emulated 512bit number as l being the lower 256bit half and h the upper 256bit half. */ function fullMul(uint256 x, uint256 y) public pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } /** * @dev calculates x*y/z taking care of phantom overflows. */ function mulDiv( uint256 x, uint256 y, uint256 z ) public pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); require(h < z); uint256 mm = mulmod(x, y, z); if (mm > l) h -= 1; l -= mm; uint256 pow2 = z & -z; z /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - z * r; r *= 2 - z * r; r *= 2 - z * r; r *= 2 - z * r; r *= 2 - z * r; r *= 2 - z * r; r *= 2 - z * r; r *= 2 - z * r; return l * r; } /* * ========================= * Auto Reinvestment Feature * ========================= */ // uint256 recommendedRewardPerInvocation = 5000000; // 5 TRX struct AutoReinvestEntry { uint256 nextExecutionTime; uint256 rewardPerInvocation; uint256 minimumDividendValue; uint24 period; } mapping(address => AutoReinvestEntry) internal autoReinvestment; function setupAutoReinvest( uint24 period, uint256 rewardPerInvocation, uint256 minimumDividendValue ) public { _setupAutoReinvest( period, rewardPerInvocation, msg.sender, minimumDividendValue ); } function _setupAutoReinvest( uint24 period, uint256 rewardPerInvocation, address customerAddress, uint256 minimumDividendValue ) internal { autoReinvestment[customerAddress] = AutoReinvestEntry( block.timestamp + period, rewardPerInvocation, minimumDividendValue, period ); // Launch an event that this entry has been created emit onAutoReinvestmentEntry( customerAddress, autoReinvestment[customerAddress].nextExecutionTime, rewardPerInvocation, period, minimumDividendValue ); } // Anyone can call this function and claim the reward function invokeAutoReinvest(address _customerAddress) external returns (uint256) { AutoReinvestEntry storage entry = autoReinvestment[_customerAddress]; if ( entry.nextExecutionTime > 0 && block.timestamp >= entry.nextExecutionTime ) { // fetch dividends uint256 _dividends = dividendsOf(_customerAddress); // Only execute if the user's dividends are more that the // rewardPerInvocation and the minimumDividendValue if ( _dividends > entry.minimumDividendValue && _dividends > entry.rewardPerInvocation ) { // Deduct the reward from the users dividends payoutsTo_[_customerAddress] += (int256)( entry.rewardPerInvocation * magnitude ); // Update the Auto Reinvestment entry entry.nextExecutionTime += (((block.timestamp - entry.nextExecutionTime) / uint256(entry.period)) + 1) * uint256(entry.period); /* * Do the reinvestment */ _reinvest(_customerAddress); // Send the caller their reward msg.sender.transfer(entry.rewardPerInvocation); } } return entry.nextExecutionTime; } // Read function for the frontend to determine if the user has setup Auto Reinvestment or not function getAutoReinvestEntry() public view returns ( uint256, uint256, uint24, uint256 ) { address _customerAddress = msg.sender; AutoReinvestEntry storage _autoReinvestEntry = autoReinvestment[_customerAddress]; return ( _autoReinvestEntry.nextExecutionTime, _autoReinvestEntry.rewardPerInvocation, _autoReinvestEntry.period, _autoReinvestEntry.minimumDividendValue ); } // Read function for the scheduling workers determine if the user has setup Auto Reinvestment or not function getAutoReinvestEntryOf(address _customerAddress) public view returns ( uint256, uint256, uint24, uint256 ) { AutoReinvestEntry storage _autoReinvestEntry = autoReinvestment[_customerAddress]; return ( _autoReinvestEntry.nextExecutionTime, _autoReinvestEntry.rewardPerInvocation, _autoReinvestEntry.period, _autoReinvestEntry.minimumDividendValue ); } // The user can stop the autoReinvestment whenever they want function stopAutoReinvest() external { address customerAddress = msg.sender; if (autoReinvestment[customerAddress].nextExecutionTime > 0) { delete autoReinvestment[customerAddress]; // Launch an event that this entry has been deleted emit onAutoReinvestmentStop(customerAddress); } } // Allowance, Approval and Transfer From mapping(address => mapping(address => uint256)) private _allowances; function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public returns (bool) { uint256 final_amount = SafeMath.sub(_allowances[sender][msg.sender], amount); _transfer(sender, recipient, amount); _approve(sender, msg.sender, final_amount); return true; } function transfer(address _toAddress, uint256 _amountOfTokens) public onlyBagholders returns (bool) { _transfer(msg.sender, _toAddress, _amountOfTokens); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient` after liquifying 10% of the tokens `amount` as dividens. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `_customerAddress` cannot be the zero address. * - `_toAddress` cannot be the zero address. * - `_customerAddress` must have a balance of at least `_amountOfTokens`. */ function _transfer( address _customerAddress, address _toAddress, uint256 _amountOfTokens ) internal { require( _customerAddress != address(0), "ERC20: transfer from the zero address" ); require( _toAddress != address(0), "ERC20: transfer to the zero address" ); // also disables transfers until ambassador phase is over // ( we dont want whale premines ) // make sure we have the requested tokens require( !onlyAmbassadors && _amountOfTokens <= tokenBalanceLedger_[_customerAddress] ); // withdraw all outstanding dividends first if ( dividendsOf(_customerAddress) + referralBalance_[_customerAddress] > 0 ) { _withdraw(_customerAddress); } // updating tokenTimestampedBalanceLedger_ for _customerAddress _updateLedgerForTransfer(_amountOfTokens, _customerAddress); // liquify 10% of the remaining tokens that are transfered // these are dispersed to shareholders uint256 _tokenFee = SafeMath.div(_amountOfTokens, dividendFee_); uint256 _taxedTokens = SafeMath.sub(_amountOfTokens, _tokenFee); uint256 _dividends = tokensToEthereum_(_tokenFee); // burn the fee tokens tokenSupply_ = SafeMath.sub(tokenSupply_, _tokenFee); // exchange tokens tokenBalanceLedger_[_customerAddress] = SafeMath.sub( tokenBalanceLedger_[_customerAddress], _amountOfTokens ); tokenBalanceLedger_[_toAddress] = SafeMath.add( tokenBalanceLedger_[_toAddress], _taxedTokens ); // updating tokenTimestampedBalanceLedger_ for _toAddress tokenTimestampedBalanceLedger_[_toAddress].push( TimestampedBalance(_taxedTokens, block.timestamp, 0) ); tokenTimestampedBalanceCursor[_toAddress].end += 1; // update dividend trackers payoutsTo_[_customerAddress] -= (int256)( profitPerShare_ * _amountOfTokens ); payoutsTo_[_toAddress] += (int256)(profitPerShare_ * _taxedTokens); // disperse dividends among holders profitPerShare_ = SafeMath.add( profitPerShare_, mulDiv(_dividends, magnitude, tokenSupply_) ); // fire event emit Transfer(_customerAddress, _toAddress, _taxedTokens); } // Atomically increases the allowance granted to `spender` by the caller. function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { uint256 final_allowance = SafeMath.add(_allowances[msg.sender][spender], addedValue); _approve(msg.sender, spender, final_allowance); return true; } //Atomically decreases the allowance granted to `spender` by the caller. function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { uint256 final_allowance = SafeMath.sub(_allowances[msg.sender][spender], subtractedValue); _approve(msg.sender, spender, final_allowance); return true; } // Sets `amount` as the allowance of `spender` over the `owner`s tokens. function _approve( address owner, address spender, uint256 value ) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"nextExecutionTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerInvocation","type":"uint256"},{"indexed":false,"internalType":"uint24","name":"period","type":"uint24"},{"indexed":false,"internalType":"uint256","name":"minimumDividendValue","type":"uint256"}],"name":"onAutoReinvestmentEntry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"}],"name":"onAutoReinvestmentStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethereumReinvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"}],"name":"onReinvestment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"incomingEthereum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"},{"indexed":true,"internalType":"address","name":"referredBy","type":"address"}],"name":"onTokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethereumEarned","type":"uint256"}],"name":"onTokenSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethereumWithdrawn","type":"uint256"}],"name":"onWithdraw","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"_calculatePenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"administrators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ambassadors_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_referredBy","type":"address"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"buyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"},{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"calculateAveragePenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokensToSell","type":"uint256"}],"name":"calculateEthereumReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"calculateEthereumTransferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_ethereumToSpend","type":"uint256"}],"name":"calculateTokensReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"calculateTokensReinvested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"disableInitialStage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"dividendsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_ethereum","type":"uint256"}],"name":"ethereumToTokens_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"fullMul","outputs":[{"internalType":"uint256","name":"l","type":"uint256"},{"internalType":"uint256","name":"h","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getAutoReinvestEntry","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint24","name":"","type":"uint24"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"getAutoReinvestEntryOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint24","name":"","type":"uint24"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCursor","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"ref_name","type":"bytes32"}],"name":"getReferralAddressForName","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReferralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"ref_address","type":"address"}],"name":"getReferralNameForAddress","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"counter","type":"uint256"}],"name":"getTimestampedBalanceLedger","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"invokeAutoReinvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"z","type":"uint256"}],"name":"mulDiv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bool","name":"_includeReferralBonus","type":"bool"}],"name":"myDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"myTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"onlyAmbassadors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralBalance_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralIncome_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralMapping","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"referralReverseMapping","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"isAutoReinvestChecked","type":"bool"},{"internalType":"uint24","name":"period","type":"uint24"},{"internalType":"uint256","name":"rewardPerInvocation","type":"uint256"},{"internalType":"uint256","name":"minimumDividendValue","type":"uint256"}],"name":"reinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_identifier","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAdministrator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"ref_name","type":"bytes32"}],"name":"setReferralName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"setStakingRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint24","name":"period","type":"uint24"},{"internalType":"uint256","name":"rewardPerInvocation","type":"uint256"},{"internalType":"uint256","name":"minimumDividendValue","type":"uint256"}],"name":"setupAutoReinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingRequirement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"stopAutoReinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"tokensToEthereum_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEthereumBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280601681526020017f4372797374616c20456c657068616e7420546f6b656e00000000000000000000815250600090805190602001906200005192919062000a87565b506040518060400160405280600581526020017f454345544f000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f92919062000a87565b506801a055690d9db800006002556000600d556001601060006101000a81548160ff021916908315150217905550348015620000da57600080fd5b5060003390506001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000738c67c528a78c3142eeba7a9fb9966c3141abfc0773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073a3085dc923e5de6e1919cfae73a4d4557cf3173473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007362544c00f6458011796605e8e6e7f799e17b134873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000735357777ddd555a192e1e87b96a93aadcc463d0f873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000738713c7d84da4edc2795ebabffdeef4bb2ef654df73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073c8b17a71fe39db3add2438b89c1522d03767ebda73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000736b6ddbb85000efcbff006bea12ced803fd0a0b9673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000732f09612675a16e9d97e8a0c27d2285a5d8fb6eba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073d82f5174e03e3352a35a933a11100e6c2607ba1e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007328eb45db2c42b56a1c5bc915f4cc47dd7923963273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007312b2398405f49dec00d7ceef9c0925e6fc96c51f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007332c0ae75ef5beb409a17fcf26fddb8561eef839473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000732fc1dba620e749e86e51c2d9c42993174e1986ce73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073dbfc64ff6c4d85f42d8411680ebe90ad06bf3e8173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073bd54eb8ad245450e225a77af5956f2b41301c84573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007358d1a5e3ca23f46e16bca17849ce327a415a2ee573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007333a2e739b428508643ee49d874775e1196178a1c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007345adff324eb1ac03a6a115dc539052232d4ba98073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000733e666e4b6091263f3a70c004e47a1e172f31ff4273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073766917c3ee4aa5164b3a6f01363865efa8ce6ffd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000733ee362b5db70c2935e718f7711b1ccac7dbad08173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073cb1a0f26c89fbc1bcb14fe1ee9a2785bae419e8173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062000b36565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000aca57805160ff191683800117855562000afb565b8280016001018555821562000afb579182015b8281111562000afa57825182559160200191906001019062000add565b5b50905062000b0a919062000b0e565b5090565b62000b3391905b8082111562000b2f57600081600090555060010162000b15565b5090565b90565b6157258062000b466000396000f3fe60806040526004361061036a5760003560e01c80636b2f4632116101c6578063a8e04f34116100f7578063c664f7f111610095578063e9fad8ee1161006f578063e9fad8ee14611586578063ec536a171461159d578063ee7743ca146115e7578063f088d547146116475761036a565b8063c664f7f114611461578063dd62ed3e146114c6578063e4849b321461154b5761036a565b8063b84c8246116100d1578063b84c82461461126b578063bbcb15cc14611333578063bf3b397b1461134a578063c47f0027146113995761036a565b8063a8e04f341461117e578063a9059cbb14611195578063aa9a0912146112085761036a565b80638620410b11610164578063949e8acd1161013e578063949e8acd14610fcc57806395d89b4114610ff7578063a457c2d714611087578063a7c73c3e146110fa5761036a565b80638620410b14610edf57806387c9505814610f0a5780638d12530f14610f675761036a565b806370a08231116101a057806370a0823114610d8757806376be158514610dec5780637ad20cac14610e555780638328b61014610ea45761036a565b80636b2f463214610c925780636d93805814610cbd5780636dc7bed014610d225761036a565b8063380169ea116102a0578063542f76a51161023e5780636122d906116102185780636122d90614610b1357806367a4a3dd14610b7c578063688abbf714610bdc5780636988a3ef14610c2d5761036a565b8063542f76a514610a3c57806356d399e814610a8b5780635db6d1d214610ab65761036a565b80634193d03a1161027a5780634193d03a146108f5578063452cf42d146109645780634b750334146109df5780634c33047114610a0a5761036a565b8063380169ea14610839578063395093511461086b5780633ccfd60b146108de5761036a565b8063229f465d1161030d57806327defa1f116102e757806327defa1f1461070f5780632a2d2b971461073e5780632a9121c7146107b9578063313ce567146108085761036a565b8063229f465d146105d557806323b872dd1461062957806323d114be146106bc5761036a565b80630ad0385a116103495780630ad0385a146104e157806310d0ffdd1461050c57806318160ddd1461055b57806322609373146105865761036a565b806265318b1461037957806306fdde03146103de578063095ea7b31461046e575b6103763334600061168b565b50005b34801561038557600080fd5b506103c86004803603602081101561039c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f8565b6040518082815260200191505060405180910390f35b3480156103ea57600080fd5b506103f3612998565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610433578082015181840152602081019050610418565b50505050905090810190601f1680156104605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561047a57600080fd5b506104c76004803603604081101561049157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a36565b604051808215151515815260200191505060405180910390f35b3480156104ed57600080fd5b506104f6612a4d565b6040518082815260200191505060405180910390f35b34801561051857600080fd5b506105456004803603602081101561052f57600080fd5b8101908080359060200190929190505050612a93565b6040518082815260200191505060405180910390f35b34801561056757600080fd5b50610570612acc565b6040518082815260200191505060405180910390f35b34801561059257600080fd5b506105bf600480360360208110156105a957600080fd5b8101908080359060200190929190505050612ad6565b6040518082815260200191505060405180910390f35b3480156105e157600080fd5b50610627600480360360608110156105f857600080fd5b81019080803562ffffff1690602001909291908035906020019092919080359060200190929190505050612b65565b005b34801561063557600080fd5b506106a26004803603606081101561064c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b76565b604051808215151515815260200191505060405180910390f35b3480156106c857600080fd5b506106f5600480360360208110156106df57600080fd5b8101908080359060200190929190505050612c23565b604051808215151515815260200191505060405180910390f35b34801561071b57600080fd5b50610724612cc4565b604051808215151515815260200191505060405180910390f35b34801561074a57600080fd5b506107776004803603602081101561076157600080fd5b8101908080359060200190929190505050612cd7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107c557600080fd5b506107f2600480360360208110156107dc57600080fd5b8101908080359060200190929190505050612d14565b6040518082815260200191505060405180910390f35b34801561081457600080fd5b5061081d612d9f565b604051808260ff1660ff16815260200191505060405180910390f35b34801561084557600080fd5b5061084e612da4565b604051808381526020018281526020019250505060405180910390f35b34801561087757600080fd5b506108c46004803603604081101561088e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e03565b604051808215151515815260200191505060405180910390f35b3480156108ea57600080fd5b506108f3612ea4565b005b34801561090157600080fd5b5061094e6004803603604081101561091857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eaf565b6040518082815260200191505060405180910390f35b34801561097057600080fd5b5061099d6004803603602081101561098757600080fd5b81019080803590602001909291905050506130a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109eb57600080fd5b506109f46130dc565b6040518082815260200191505060405180910390f35b348015610a1657600080fd5b50610a1f61313b565b604051808381526020018281526020019250505060405180910390f35b348015610a4857600080fd5b50610a7560048036036020811015610a5f57600080fd5b81019080803590602001909291905050506131cc565b6040518082815260200191505060405180910390f35b348015610a9757600080fd5b50610aa061321b565b6040518082815260200191505060405180910390f35b348015610ac257600080fd5b50610aef60048036036020811015610ad957600080fd5b8101908080359060200190929190505050613221565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610b1f57600080fd5b50610b6260048036036020811015610b3657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132a4565b604051808215151515815260200191505060405180910390f35b348015610b8857600080fd5b50610bbf60048036036040811015610b9f57600080fd5b8101908080359060200190929190803590602001909291905050506132c4565b604051808381526020018281526020019250505060405180910390f35b348015610be857600080fd5b50610c1760048036036020811015610bff57600080fd5b81019080803515159060200190929190505050613317565b6040518082815260200191505060405180910390f35b348015610c3957600080fd5b50610c7c60048036036020811015610c5057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613383565b6040518082815260200191505060405180910390f35b348015610c9e57600080fd5b50610ca761339b565b6040518082815260200191505060405180910390f35b348015610cc957600080fd5b50610d0c60048036036020811015610ce057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133a3565b6040518082815260200191505060405180910390f35b348015610d2e57600080fd5b50610d7160048036036020811015610d4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133bb565b6040518082815260200191505060405180910390f35b348015610d9357600080fd5b50610dd660048036036020811015610daa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613404565b6040518082815260200191505060405180910390f35b348015610df857600080fd5b50610e3b60048036036020811015610e0f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061344d565b604051808215151515815260200191505060405180910390f35b348015610e6157600080fd5b50610e8e60048036036020811015610e7857600080fd5b810190808035906020019092919050505061346d565b6040518082815260200191505060405180910390f35b348015610eb057600080fd5b50610edd60048036036020811015610ec757600080fd5b81019080803590602001909291905050506134bf565b005b348015610eeb57600080fd5b50610ef461358e565b6040518082815260200191505060405180910390f35b348015610f1657600080fd5b50610f6560048036036040811015610f2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506135e6565b005b348015610f7357600080fd5b50610fb660048036036020811015610f8a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613706565b6040518082815260200191505060405180910390f35b348015610fd857600080fd5b50610fe16138a5565b6040518082815260200191505060405180910390f35b34801561100357600080fd5b5061100c6138ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561104c578082015181840152602081019050611031565b50505050905090810190601f1680156110795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561109357600080fd5b506110e0600480360360408110156110aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613958565b604051808215151515815260200191505060405180910390f35b34801561110657600080fd5b506111496004803603602081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139f9565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b34801561118a57600080fd5b50611193613a75565b005b3480156111a157600080fd5b506111ee600480360360408110156111b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b57565b604051808215151515815260200191505060405180910390f35b34801561121457600080fd5b506112556004803603606081101561122b57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050613b81565b6040518082815260200191505060405180910390f35b34801561127757600080fd5b506113316004803603602081101561128e57600080fd5b81019080803590602001906401000000008111156112ab57600080fd5b8201836020820111156112bd57600080fd5b803590602001918460018302840111640100000000831117156112df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613c62565b005b34801561133f57600080fd5b50611348613d41565b005b34801561135657600080fd5b506113836004803603602081101561136d57600080fd5b8101908080359060200190929190505050613e48565b6040518082815260200191505060405180910390f35b3480156113a557600080fd5b5061145f600480360360208110156113bc57600080fd5b81019080803590602001906401000000008111156113d957600080fd5b8201836020820111156113eb57600080fd5b8035906020019184600183028401116401000000008311171561140d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613eec565b005b34801561146d57600080fd5b506114b06004803603602081101561148457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fcb565b6040518082815260200191505060405180910390f35b3480156114d257600080fd5b50611535600480360360408110156114e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fe3565b6040518082815260200191505060405180910390f35b34801561155757600080fd5b506115846004803603602081101561156e57600080fd5b810190808035906020019092919050505061406a565b005b34801561159257600080fd5b5061159b6142c0565b005b3480156115a957600080fd5b506115b2614328565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b3480156115f357600080fd5b506116456004803603608081101561160a57600080fd5b81019080803515159060200190929190803562ffffff16906020019092919080359060200190929190803590602001909291905050506143a9565b005b6116896004803603602081101561165d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506143cb565b005b600082601060009054906101000a900460ff161561235657600033905068056bc75e2d63100000826116bb61339b565b0311611d9e5760011515600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514801561176a5750673782dace9d90000082600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540111155b61177357600080fd5b6117bc600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061180f86600a60ff166143f6565b9050600061181e8260036143f6565b9050600061182c838361440f565b9050600061183a898561440f565b9050600061184782612d14565b9050600068010000000000000000840290506000821180156118755750600d5461187383600d546143da565b115b61187e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16141580156118e757508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b80156119345750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b15611a5657611982600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0e600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a71565b611a6084866143da565b935068010000000000000000840290505b6000600d541115611ad857611a88600d54836143da565b600d81905550600d5468010000000000000000850281611aa457fe5b04600e60008282540192505081905550600d5468010000000000000000850281611aca57fe5b048202810381039050611ae0565b81600d819055505b611b29600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382995050505050505050612354565b6000601060006101000a81548160ff0219169083151502179055506000611dc986600a60ff166143f6565b90506000611dd88260036143f6565b90506000611de6838361440f565b90506000611df4898561440f565b90506000611e0182612d14565b905060006801000000000000000084029050600082118015611e2f5750600d54611e2d83600d546143da565b115b611e3857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614158015611ea157508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b8015611eee5750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b1561201057611f3c600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fc8600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202b565b61201a84866143da565b935068010000000000000000840290505b6000600d54111561209257612042600d54836143da565b600d81905550600d546801000000000000000085028161205e57fe5b04600e60008282540192505081905550600d546801000000000000000085028161208457fe5b04820281038103905061209a565b81600d819055505b6120e3600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3829950505050505050505b505b600061236685600a60ff166143f6565b905060006123758260036143f6565b90506000612383838361440f565b90506000612391888561440f565b9050600061239e82612d14565b9050600068010000000000000000840290506000821180156123cc5750600d546123ca83600d546143da565b115b6123d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415801561243e57508a73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b801561248b5750600254600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b156125ad576124d9600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612565600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125c8565b6125b784866143da565b935068010000000000000000840290505b6000600d54111561262f576125df600d54836143da565b600d81905550600d54680100000000000000008502816125fb57fe5b04600e60008282540192505081905550600d546801000000000000000085028161262157fe5b048202810381039050612637565b81600d819055505b612680600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508973ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58d86604051808381526020018281526020019250505060405180910390a38b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382985050505050505050509392505050565b600068010000000000000000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e5402038161299057fe5b049050919050565b60008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a2e5780601f10612a0357610100808354040283529160200191612a2e565b820191906000526020600020905b815481529060010190602001808311612a1157829003601f168201915b505050505081565b6000612a43338484614426565b6001905092915050565b600080612a5a6001613317565b90506000612a6c82600a60ff166143f6565b90506000612a7a838361440f565b90506000612a8782612d14565b90508094505050505090565b600080612aa483600a60ff166143f6565b90506000612ab2848361440f565b90506000612abf82612d14565b9050809350505050919050565b6000600d54905090565b6000600d54821115612ae757600080fd5b612aef6138a5565b821115612afb57600080fd5b6000612b0683613e48565b905060003390506000612b24612b1c8684612eaf565b846064613b81565b90506000612b4882612b43612b39878661440f565b600a60ff166143f6565b6143da565b90506000612b56858361440f565b90508095505050505050919050565b612b718383338461461d565b505050565b600080612bff601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461440f565b9050612c0c858585614787565b612c17853383614426565b60019150509392505050565b600081600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550336008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b601060009054906101000a900460ff1681565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080670de0b6b3a764000064174876e8000290506000600d546402540be400612d8a612d84600d54866402540be40060020202026002600d540a60026402540be4000a02670de0b6b3a76400008a02670de0b6b3a76400006402540be40002600202026002890a010101614ce3565b8561440f565b81612d9157fe5b040390508092505050919050565b601281565b60008060003390506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101549350935050509091565b600080612e8c601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846143da565b9050612e99338583614426565b600191505092915050565b612ead33614d28565b565b600080612eba6138a5565b11612ec457600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115612f1057600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b82600101548211613093576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110612fbe57fe5b906000526020600020906003020190506000612fe28260000154836002015461440f565b90506000612ff08a8861440f565b90508082101561302557818701965061301e84613019613013866001015461346d565b85614f03565b6143da565b935061307e565b8082116130555761304b84613046613040866001015461346d565b84614f03565b6143da565b9350505050613093565b6130748461306f613069866001015461346d565b84614f03565b6143da565b9350505050613093565b6130898560016143da565b9450505050612f67565b61309d81886143f6565b94505050505092915050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600d5414156130fc576402540be40064174876e800039050613138565b600061310f670de0b6b3a7640000613e48565b9050600061312182600a60ff166143f6565b9050600061312f838361440f565b90508093505050505b90565b6000806000339050600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492509250509091565b6000600d548211156131dd57600080fd5b6131e56138a5565b8211156131f157600080fd5b600061320183600a60ff166143f6565b9050600061320f848361440f565b90508092505050919050565b60025481565b6000806000803390506000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811061327657fe5b9060005260206000209060030201905080600001548160010154826002015494509450945050509193909250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806132f157fe5b8486099050838502925082810391508281101561330f576001820391505b509250929050565b600080339050826133305761332b816128f8565b61337b565b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613379826128f8565b015b915050919050565b60076020528060005260406000206000915090505481565b600047905090565b600a6020528060005260406000206000915090505481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600080824203905062278d0081111561348a5760009150506134ba565b621a5e0081111561349f5760199150506134ba565b620d2f008111156134b45760329150506134ba565b604b9150505b919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b816002819055505050565b600080600d5414156135ae576402540be40064174876e8000190506135e3565b60006135c1670de0b6b3a7640000613e48565b905060006135db82600a60ff166001600a0360ff16613b81565b905080925050505b90565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166136aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154118015613762575080600001544210155b15613898576000613772846128f8565b905081600201548111801561378a5750816001015481115b156138965768010000000000000000826001015402600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508160030160009054906101000a900462ffffff1662ffffff1660018360030160009054906101000a900462ffffff1662ffffff16846000015442038161382d57fe5b040102826000016000828254019250508190555061384a84614f3a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015613894573d6000803e3d6000fd5b505b505b8060000154915050919050565b6000803390506138b481613404565b91505090565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156139505780601f1061392557610100808354040283529160200191613950565b820191906000526020600020905b81548152906001019060200180831161393357829003601f168201915b505050505081565b6000806139e1601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461440f565b90506139ee338583614426565b600191505092915050565b6000806000806000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549450945094509450509193509193565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b6000601060006101000a81548160ff02191690831515021790555050565b600080613b626138a5565b11613b6c57600080fd5b613b77338484614787565b6001905092915050565b6000806000613b9086866132c4565b91509150838110613ba057600080fd5b60008480613baa57fe5b868809905082811115613bbe576001820391505b808303925060008560000386169050808681613bd657fe5b049550808481613be257fe5b0493506001818260000381613bf357fe5b04018302840193506000600190508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050509392505050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613d26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160019080519060200190613d3c9291906155bd565b505050565b60003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115613e4557601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549062ffffff021916905550508073ffffffffffffffffffffffffffffffffffffffff167f6214dbd07605045f34f5c5c9a7e8cb3a40ed431c434bf262b1d0a9b485abaebe60405160405180910390a25b50565b600080670de0b6b3a7640000830190506000670de0b6b3a7640000600d540190506000670de0b6b3a7640000613ed7670de0b6b3a764000085036402540be400670de0b6b3a76400008681613e9957fe5b046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381613ec257fe5b046402540be4000281613ed157fe5b0461440f565b81613ede57fe5b049050809350505050919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613fb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160009080519060200190613fc69291906155bd565b505050565b60096020528060005260406000206000915090505481565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006140746138a5565b1161407e57600080fd5b6000339050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156140cf57600080fd5b600082905060006140df82613e48565b905060006140f86140f086866150e1565b836064613b81565b9050600061411c8261411761410d868661440f565b600a60ff166143f6565b6143da565b9050600061412a848361440f565b9050614138600d548661440f565b600d81905550614187600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548661440f565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600068010000000000000000820286600e540201905080600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600d54111561426057614259600e546142548568010000000000000000600d54613b81565b6143da565b600e819055505b8673ffffffffffffffffffffffffffffffffffffffff167fc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a311398784604051808381526020018281526020019250505060405180910390a25050505050505050565b60003390506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561431c5761431b8161406a565b5b614324612ea4565b5050565b60008060008060003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549550955095509550505090919293565b6143b233614f3a565b83156143c5576143c48383338461461d565b5b50505050565b6143d633348361168b565b5050565b6000808284019050838110156143ec57fe5b8091505092915050565b60008082848161440257fe5b0490508091505092915050565b60008282111561441b57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156144ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156cd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806156866022913960400191505060405180910390fd5b80601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60405180608001604052808562ffffff16420181526020018481526020018281526020018562ffffff16815250601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548162ffffff021916908362ffffff1602179055509050508173ffffffffffffffffffffffffffffffffffffffff167f4bf1c14e646c965eb2b35b7e0d08e65d0044d5d5a1eaf7f80f5f161688c34579601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154858785604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390a250505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561480d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156a86025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614893576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156636023913960400191505060405180910390fd5b601060009054906101000a900460ff161580156148ef5750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111155b6148f857600080fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614943856128f8565b0111156149545761495383614d28565b5b61495e8184615395565b600061496e82600a60ff166143f6565b9050600061497c838361440f565b9050600061498983613e48565b9050614997600d548461440f565b600d819055506149e6600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561440f565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a72600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555083600e5402600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600e5402600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614c70600e54614c6b8368010000000000000000600d54613b81565b6143da565b600e819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050565b60008060026001840181614cf357fe5b0490508291505b81811015614d2257809150600281828581614d1157fe5b040181614d1a57fe5b049050614cfa565b50919050565b6000614d33826128f8565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614d8357600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008290508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614eaf573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff167fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc836040518082815260200191505060405180910390a2505050565b600080831415614f165760009050614f34565b6000828402905082848281614f2757fe5b0414614f2f57fe5b809150505b92915050565b6000614f45826128f8565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614f9557600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006150848383600061168b565b90508273ffffffffffffffffffffffffffffffffffffffff167fbe339fc14b041c2b0e0f3dd2cd325d0c3668b78378001e53160eab36153264588383604051808381526020018281526020019250505060405180910390a2505050565b6000806150ec6138a5565b116150f657600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b8260010154821161537f576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106151a457fe5b9060005260206000209060030201905060006151c88260000154836002015461440f565b905060006151d68a8861440f565b90508082101561527e578187019650615204846151ff6151f9866001015461346d565b85614f03565b6143da565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061525057fe5b9060005260206000209060030201600080820160009055600182016000905560028201600090555050615371565b80821161532d576152a48461529f615299866001015461346d565b84614f03565b6143da565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106152f057fe5b906000526020600020906003020160008082016000905560018201600090556002820160009055505060018501866000018190555050505061537f565b61534c84615347615341866001015461346d565b84614f03565b6143da565b935080836002016000828254019250508190555084866000018190555050505061537f565b60018501945050505061514d565b61538981886143f6565b94505050505092915050565b60008090506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490505b816001015481116155b6576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061543e57fe5b9060005260206000209060030201905060006154628260000154836002015461440f565b90506000615470888761440f565b9050808210156154f7578186019550600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106154c957fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506155a8565b80821161558557600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061554857fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506001840185600001819055505050506155b6565b8083600201600082825401925050819055508385600001819055505050506155b6565b6001840193505050506153e7565b5050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106155fe57805160ff191683800117855561562c565b8280016001018555821561562c579182015b8281111561562b578251825591602001919060010190615610565b5b509050615639919061563d565b5090565b61565f91905b8082111561565b576000816000905550600101615643565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723158202c4790f7928bf9a3a45a9f8993b6a67a03c0e30cb3eae470bc64181e301607b864736f6c634300050f0032
Deployed Bytecode
0x60806040526004361061036a5760003560e01c80636b2f4632116101c6578063a8e04f34116100f7578063c664f7f111610095578063e9fad8ee1161006f578063e9fad8ee14611586578063ec536a171461159d578063ee7743ca146115e7578063f088d547146116475761036a565b8063c664f7f114611461578063dd62ed3e146114c6578063e4849b321461154b5761036a565b8063b84c8246116100d1578063b84c82461461126b578063bbcb15cc14611333578063bf3b397b1461134a578063c47f0027146113995761036a565b8063a8e04f341461117e578063a9059cbb14611195578063aa9a0912146112085761036a565b80638620410b11610164578063949e8acd1161013e578063949e8acd14610fcc57806395d89b4114610ff7578063a457c2d714611087578063a7c73c3e146110fa5761036a565b80638620410b14610edf57806387c9505814610f0a5780638d12530f14610f675761036a565b806370a08231116101a057806370a0823114610d8757806376be158514610dec5780637ad20cac14610e555780638328b61014610ea45761036a565b80636b2f463214610c925780636d93805814610cbd5780636dc7bed014610d225761036a565b8063380169ea116102a0578063542f76a51161023e5780636122d906116102185780636122d90614610b1357806367a4a3dd14610b7c578063688abbf714610bdc5780636988a3ef14610c2d5761036a565b8063542f76a514610a3c57806356d399e814610a8b5780635db6d1d214610ab65761036a565b80634193d03a1161027a5780634193d03a146108f5578063452cf42d146109645780634b750334146109df5780634c33047114610a0a5761036a565b8063380169ea14610839578063395093511461086b5780633ccfd60b146108de5761036a565b8063229f465d1161030d57806327defa1f116102e757806327defa1f1461070f5780632a2d2b971461073e5780632a9121c7146107b9578063313ce567146108085761036a565b8063229f465d146105d557806323b872dd1461062957806323d114be146106bc5761036a565b80630ad0385a116103495780630ad0385a146104e157806310d0ffdd1461050c57806318160ddd1461055b57806322609373146105865761036a565b806265318b1461037957806306fdde03146103de578063095ea7b31461046e575b6103763334600061168b565b50005b34801561038557600080fd5b506103c86004803603602081101561039c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f8565b6040518082815260200191505060405180910390f35b3480156103ea57600080fd5b506103f3612998565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610433578082015181840152602081019050610418565b50505050905090810190601f1680156104605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561047a57600080fd5b506104c76004803603604081101561049157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a36565b604051808215151515815260200191505060405180910390f35b3480156104ed57600080fd5b506104f6612a4d565b6040518082815260200191505060405180910390f35b34801561051857600080fd5b506105456004803603602081101561052f57600080fd5b8101908080359060200190929190505050612a93565b6040518082815260200191505060405180910390f35b34801561056757600080fd5b50610570612acc565b6040518082815260200191505060405180910390f35b34801561059257600080fd5b506105bf600480360360208110156105a957600080fd5b8101908080359060200190929190505050612ad6565b6040518082815260200191505060405180910390f35b3480156105e157600080fd5b50610627600480360360608110156105f857600080fd5b81019080803562ffffff1690602001909291908035906020019092919080359060200190929190505050612b65565b005b34801561063557600080fd5b506106a26004803603606081101561064c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b76565b604051808215151515815260200191505060405180910390f35b3480156106c857600080fd5b506106f5600480360360208110156106df57600080fd5b8101908080359060200190929190505050612c23565b604051808215151515815260200191505060405180910390f35b34801561071b57600080fd5b50610724612cc4565b604051808215151515815260200191505060405180910390f35b34801561074a57600080fd5b506107776004803603602081101561076157600080fd5b8101908080359060200190929190505050612cd7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107c557600080fd5b506107f2600480360360208110156107dc57600080fd5b8101908080359060200190929190505050612d14565b6040518082815260200191505060405180910390f35b34801561081457600080fd5b5061081d612d9f565b604051808260ff1660ff16815260200191505060405180910390f35b34801561084557600080fd5b5061084e612da4565b604051808381526020018281526020019250505060405180910390f35b34801561087757600080fd5b506108c46004803603604081101561088e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e03565b604051808215151515815260200191505060405180910390f35b3480156108ea57600080fd5b506108f3612ea4565b005b34801561090157600080fd5b5061094e6004803603604081101561091857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eaf565b6040518082815260200191505060405180910390f35b34801561097057600080fd5b5061099d6004803603602081101561098757600080fd5b81019080803590602001909291905050506130a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109eb57600080fd5b506109f46130dc565b6040518082815260200191505060405180910390f35b348015610a1657600080fd5b50610a1f61313b565b604051808381526020018281526020019250505060405180910390f35b348015610a4857600080fd5b50610a7560048036036020811015610a5f57600080fd5b81019080803590602001909291905050506131cc565b6040518082815260200191505060405180910390f35b348015610a9757600080fd5b50610aa061321b565b6040518082815260200191505060405180910390f35b348015610ac257600080fd5b50610aef60048036036020811015610ad957600080fd5b8101908080359060200190929190505050613221565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610b1f57600080fd5b50610b6260048036036020811015610b3657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132a4565b604051808215151515815260200191505060405180910390f35b348015610b8857600080fd5b50610bbf60048036036040811015610b9f57600080fd5b8101908080359060200190929190803590602001909291905050506132c4565b604051808381526020018281526020019250505060405180910390f35b348015610be857600080fd5b50610c1760048036036020811015610bff57600080fd5b81019080803515159060200190929190505050613317565b6040518082815260200191505060405180910390f35b348015610c3957600080fd5b50610c7c60048036036020811015610c5057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613383565b6040518082815260200191505060405180910390f35b348015610c9e57600080fd5b50610ca761339b565b6040518082815260200191505060405180910390f35b348015610cc957600080fd5b50610d0c60048036036020811015610ce057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133a3565b6040518082815260200191505060405180910390f35b348015610d2e57600080fd5b50610d7160048036036020811015610d4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133bb565b6040518082815260200191505060405180910390f35b348015610d9357600080fd5b50610dd660048036036020811015610daa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613404565b6040518082815260200191505060405180910390f35b348015610df857600080fd5b50610e3b60048036036020811015610e0f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061344d565b604051808215151515815260200191505060405180910390f35b348015610e6157600080fd5b50610e8e60048036036020811015610e7857600080fd5b810190808035906020019092919050505061346d565b6040518082815260200191505060405180910390f35b348015610eb057600080fd5b50610edd60048036036020811015610ec757600080fd5b81019080803590602001909291905050506134bf565b005b348015610eeb57600080fd5b50610ef461358e565b6040518082815260200191505060405180910390f35b348015610f1657600080fd5b50610f6560048036036040811015610f2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506135e6565b005b348015610f7357600080fd5b50610fb660048036036020811015610f8a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613706565b6040518082815260200191505060405180910390f35b348015610fd857600080fd5b50610fe16138a5565b6040518082815260200191505060405180910390f35b34801561100357600080fd5b5061100c6138ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561104c578082015181840152602081019050611031565b50505050905090810190601f1680156110795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561109357600080fd5b506110e0600480360360408110156110aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613958565b604051808215151515815260200191505060405180910390f35b34801561110657600080fd5b506111496004803603602081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139f9565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b34801561118a57600080fd5b50611193613a75565b005b3480156111a157600080fd5b506111ee600480360360408110156111b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b57565b604051808215151515815260200191505060405180910390f35b34801561121457600080fd5b506112556004803603606081101561122b57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050613b81565b6040518082815260200191505060405180910390f35b34801561127757600080fd5b506113316004803603602081101561128e57600080fd5b81019080803590602001906401000000008111156112ab57600080fd5b8201836020820111156112bd57600080fd5b803590602001918460018302840111640100000000831117156112df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613c62565b005b34801561133f57600080fd5b50611348613d41565b005b34801561135657600080fd5b506113836004803603602081101561136d57600080fd5b8101908080359060200190929190505050613e48565b6040518082815260200191505060405180910390f35b3480156113a557600080fd5b5061145f600480360360208110156113bc57600080fd5b81019080803590602001906401000000008111156113d957600080fd5b8201836020820111156113eb57600080fd5b8035906020019184600183028401116401000000008311171561140d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613eec565b005b34801561146d57600080fd5b506114b06004803603602081101561148457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fcb565b6040518082815260200191505060405180910390f35b3480156114d257600080fd5b50611535600480360360408110156114e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fe3565b6040518082815260200191505060405180910390f35b34801561155757600080fd5b506115846004803603602081101561156e57600080fd5b810190808035906020019092919050505061406a565b005b34801561159257600080fd5b5061159b6142c0565b005b3480156115a957600080fd5b506115b2614328565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b3480156115f357600080fd5b506116456004803603608081101561160a57600080fd5b81019080803515159060200190929190803562ffffff16906020019092919080359060200190929190803590602001909291905050506143a9565b005b6116896004803603602081101561165d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506143cb565b005b600082601060009054906101000a900460ff161561235657600033905068056bc75e2d63100000826116bb61339b565b0311611d9e5760011515600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514801561176a5750673782dace9d90000082600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540111155b61177357600080fd5b6117bc600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061180f86600a60ff166143f6565b9050600061181e8260036143f6565b9050600061182c838361440f565b9050600061183a898561440f565b9050600061184782612d14565b9050600068010000000000000000840290506000821180156118755750600d5461187383600d546143da565b115b61187e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16141580156118e757508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b80156119345750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b15611a5657611982600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0e600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a71565b611a6084866143da565b935068010000000000000000840290505b6000600d541115611ad857611a88600d54836143da565b600d81905550600d5468010000000000000000850281611aa457fe5b04600e60008282540192505081905550600d5468010000000000000000850281611aca57fe5b048202810381039050611ae0565b81600d819055505b611b29600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382995050505050505050612354565b6000601060006101000a81548160ff0219169083151502179055506000611dc986600a60ff166143f6565b90506000611dd88260036143f6565b90506000611de6838361440f565b90506000611df4898561440f565b90506000611e0182612d14565b905060006801000000000000000084029050600082118015611e2f5750600d54611e2d83600d546143da565b115b611e3857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614158015611ea157508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b8015611eee5750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b1561201057611f3c600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fc8600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202b565b61201a84866143da565b935068010000000000000000840290505b6000600d54111561209257612042600d54836143da565b600d81905550600d546801000000000000000085028161205e57fe5b04600e60008282540192505081905550600d546801000000000000000085028161208457fe5b04820281038103905061209a565b81600d819055505b6120e3600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3829950505050505050505b505b600061236685600a60ff166143f6565b905060006123758260036143f6565b90506000612383838361440f565b90506000612391888561440f565b9050600061239e82612d14565b9050600068010000000000000000840290506000821180156123cc5750600d546123ca83600d546143da565b115b6123d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415801561243e57508a73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b801561248b5750600254600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b156125ad576124d9600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612565600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125c8565b6125b784866143da565b935068010000000000000000840290505b6000600d54111561262f576125df600d54836143da565b600d81905550600d54680100000000000000008502816125fb57fe5b04600e60008282540192505081905550600d546801000000000000000085028161262157fe5b048202810381039050612637565b81600d819055505b612680600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508973ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58d86604051808381526020018281526020019250505060405180910390a38b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382985050505050505050509392505050565b600068010000000000000000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e5402038161299057fe5b049050919050565b60008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a2e5780601f10612a0357610100808354040283529160200191612a2e565b820191906000526020600020905b815481529060010190602001808311612a1157829003601f168201915b505050505081565b6000612a43338484614426565b6001905092915050565b600080612a5a6001613317565b90506000612a6c82600a60ff166143f6565b90506000612a7a838361440f565b90506000612a8782612d14565b90508094505050505090565b600080612aa483600a60ff166143f6565b90506000612ab2848361440f565b90506000612abf82612d14565b9050809350505050919050565b6000600d54905090565b6000600d54821115612ae757600080fd5b612aef6138a5565b821115612afb57600080fd5b6000612b0683613e48565b905060003390506000612b24612b1c8684612eaf565b846064613b81565b90506000612b4882612b43612b39878661440f565b600a60ff166143f6565b6143da565b90506000612b56858361440f565b90508095505050505050919050565b612b718383338461461d565b505050565b600080612bff601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461440f565b9050612c0c858585614787565b612c17853383614426565b60019150509392505050565b600081600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550336008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b601060009054906101000a900460ff1681565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080670de0b6b3a764000064174876e8000290506000600d546402540be400612d8a612d84600d54866402540be40060020202026002600d540a60026402540be4000a02670de0b6b3a76400008a02670de0b6b3a76400006402540be40002600202026002890a010101614ce3565b8561440f565b81612d9157fe5b040390508092505050919050565b601281565b60008060003390506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101549350935050509091565b600080612e8c601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846143da565b9050612e99338583614426565b600191505092915050565b612ead33614d28565b565b600080612eba6138a5565b11612ec457600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115612f1057600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b82600101548211613093576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110612fbe57fe5b906000526020600020906003020190506000612fe28260000154836002015461440f565b90506000612ff08a8861440f565b90508082101561302557818701965061301e84613019613013866001015461346d565b85614f03565b6143da565b935061307e565b8082116130555761304b84613046613040866001015461346d565b84614f03565b6143da565b9350505050613093565b6130748461306f613069866001015461346d565b84614f03565b6143da565b9350505050613093565b6130898560016143da565b9450505050612f67565b61309d81886143f6565b94505050505092915050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600d5414156130fc576402540be40064174876e800039050613138565b600061310f670de0b6b3a7640000613e48565b9050600061312182600a60ff166143f6565b9050600061312f838361440f565b90508093505050505b90565b6000806000339050600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492509250509091565b6000600d548211156131dd57600080fd5b6131e56138a5565b8211156131f157600080fd5b600061320183600a60ff166143f6565b9050600061320f848361440f565b90508092505050919050565b60025481565b6000806000803390506000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811061327657fe5b9060005260206000209060030201905080600001548160010154826002015494509450945050509193909250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806132f157fe5b8486099050838502925082810391508281101561330f576001820391505b509250929050565b600080339050826133305761332b816128f8565b61337b565b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613379826128f8565b015b915050919050565b60076020528060005260406000206000915090505481565b600047905090565b600a6020528060005260406000206000915090505481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600080824203905062278d0081111561348a5760009150506134ba565b621a5e0081111561349f5760199150506134ba565b620d2f008111156134b45760329150506134ba565b604b9150505b919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b816002819055505050565b600080600d5414156135ae576402540be40064174876e8000190506135e3565b60006135c1670de0b6b3a7640000613e48565b905060006135db82600a60ff166001600a0360ff16613b81565b905080925050505b90565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166136aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154118015613762575080600001544210155b15613898576000613772846128f8565b905081600201548111801561378a5750816001015481115b156138965768010000000000000000826001015402600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508160030160009054906101000a900462ffffff1662ffffff1660018360030160009054906101000a900462ffffff1662ffffff16846000015442038161382d57fe5b040102826000016000828254019250508190555061384a84614f3a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015613894573d6000803e3d6000fd5b505b505b8060000154915050919050565b6000803390506138b481613404565b91505090565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156139505780601f1061392557610100808354040283529160200191613950565b820191906000526020600020905b81548152906001019060200180831161393357829003601f168201915b505050505081565b6000806139e1601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461440f565b90506139ee338583614426565b600191505092915050565b6000806000806000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549450945094509450509193509193565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b6000601060006101000a81548160ff02191690831515021790555050565b600080613b626138a5565b11613b6c57600080fd5b613b77338484614787565b6001905092915050565b6000806000613b9086866132c4565b91509150838110613ba057600080fd5b60008480613baa57fe5b868809905082811115613bbe576001820391505b808303925060008560000386169050808681613bd657fe5b049550808481613be257fe5b0493506001818260000381613bf357fe5b04018302840193506000600190508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050509392505050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613d26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160019080519060200190613d3c9291906155bd565b505050565b60003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115613e4557601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549062ffffff021916905550508073ffffffffffffffffffffffffffffffffffffffff167f6214dbd07605045f34f5c5c9a7e8cb3a40ed431c434bf262b1d0a9b485abaebe60405160405180910390a25b50565b600080670de0b6b3a7640000830190506000670de0b6b3a7640000600d540190506000670de0b6b3a7640000613ed7670de0b6b3a764000085036402540be400670de0b6b3a76400008681613e9957fe5b046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381613ec257fe5b046402540be4000281613ed157fe5b0461440f565b81613ede57fe5b049050809350505050919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613fb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160009080519060200190613fc69291906155bd565b505050565b60096020528060005260406000206000915090505481565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006140746138a5565b1161407e57600080fd5b6000339050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156140cf57600080fd5b600082905060006140df82613e48565b905060006140f86140f086866150e1565b836064613b81565b9050600061411c8261411761410d868661440f565b600a60ff166143f6565b6143da565b9050600061412a848361440f565b9050614138600d548661440f565b600d81905550614187600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548661440f565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600068010000000000000000820286600e540201905080600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600d54111561426057614259600e546142548568010000000000000000600d54613b81565b6143da565b600e819055505b8673ffffffffffffffffffffffffffffffffffffffff167fc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a311398784604051808381526020018281526020019250505060405180910390a25050505050505050565b60003390506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561431c5761431b8161406a565b5b614324612ea4565b5050565b60008060008060003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549550955095509550505090919293565b6143b233614f3a565b83156143c5576143c48383338461461d565b5b50505050565b6143d633348361168b565b5050565b6000808284019050838110156143ec57fe5b8091505092915050565b60008082848161440257fe5b0490508091505092915050565b60008282111561441b57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156144ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156cd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806156866022913960400191505060405180910390fd5b80601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60405180608001604052808562ffffff16420181526020018481526020018281526020018562ffffff16815250601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548162ffffff021916908362ffffff1602179055509050508173ffffffffffffffffffffffffffffffffffffffff167f4bf1c14e646c965eb2b35b7e0d08e65d0044d5d5a1eaf7f80f5f161688c34579601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154858785604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390a250505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561480d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156a86025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614893576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156636023913960400191505060405180910390fd5b601060009054906101000a900460ff161580156148ef5750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111155b6148f857600080fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614943856128f8565b0111156149545761495383614d28565b5b61495e8184615395565b600061496e82600a60ff166143f6565b9050600061497c838361440f565b9050600061498983613e48565b9050614997600d548461440f565b600d819055506149e6600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561440f565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a72600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555083600e5402600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600e5402600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614c70600e54614c6b8368010000000000000000600d54613b81565b6143da565b600e819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050565b60008060026001840181614cf357fe5b0490508291505b81811015614d2257809150600281828581614d1157fe5b040181614d1a57fe5b049050614cfa565b50919050565b6000614d33826128f8565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614d8357600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008290508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614eaf573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff167fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc836040518082815260200191505060405180910390a2505050565b600080831415614f165760009050614f34565b6000828402905082848281614f2757fe5b0414614f2f57fe5b809150505b92915050565b6000614f45826128f8565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614f9557600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006150848383600061168b565b90508273ffffffffffffffffffffffffffffffffffffffff167fbe339fc14b041c2b0e0f3dd2cd325d0c3668b78378001e53160eab36153264588383604051808381526020018281526020019250505060405180910390a2505050565b6000806150ec6138a5565b116150f657600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b8260010154821161537f576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106151a457fe5b9060005260206000209060030201905060006151c88260000154836002015461440f565b905060006151d68a8861440f565b90508082101561527e578187019650615204846151ff6151f9866001015461346d565b85614f03565b6143da565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061525057fe5b9060005260206000209060030201600080820160009055600182016000905560028201600090555050615371565b80821161532d576152a48461529f615299866001015461346d565b84614f03565b6143da565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106152f057fe5b906000526020600020906003020160008082016000905560018201600090556002820160009055505060018501866000018190555050505061537f565b61534c84615347615341866001015461346d565b84614f03565b6143da565b935080836002016000828254019250508190555084866000018190555050505061537f565b60018501945050505061514d565b61538981886143f6565b94505050505092915050565b60008090506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490505b816001015481116155b6576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061543e57fe5b9060005260206000209060030201905060006154628260000154836002015461440f565b90506000615470888761440f565b9050808210156154f7578186019550600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106154c957fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506155a8565b80821161558557600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061554857fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506001840185600001819055505050506155b6565b8083600201600082825401925050819055508385600001819055505050506155b6565b6001840193505050506153e7565b5050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106155fe57805160ff191683800117855561562c565b8280016001018555821561562c579182015b8281111561562b578251825591602001919060010190615610565b5b509050615639919061563d565b5090565b61565f91905b8082111561565b576000816000905550600101615643565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723158202c4790f7928bf9a3a45a9f8993b6a67a03c0e30cb3eae470bc64181e301607b864736f6c634300050f0032
Deployed Bytecode Sourcemap
459:44901:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8790:49;8805:10;8817:9;8836:1;8790:14;:49::i;:::-;;459:44901;16302:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16302:339:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16302:339:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4272:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4272:45:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4272:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40192:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40192:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40192:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18332:387;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18332:387:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17938:386;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17938:386:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17938:386:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14953:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14953:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18837:809;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18837:809:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18837:809:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35555:305;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35555:305:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35555:305:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40348:361;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40348:361:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40348:361:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12942:200;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12942:200:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12942:200:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6600:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6600:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13150:173;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13150:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13150:173:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22852:1081;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22852:1081:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22852:1081:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4361:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4361:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13840:244;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13840:244:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;44196:306;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44196:306:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44196:306:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10056:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10056:67:0;;;:::i;:::-;;20153:2031;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20153:2031:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20153:2031:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5875:57;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5875:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5875:57:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16911:429;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16911:429:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13511:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13511:251:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19654:411;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19654:411:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19654:411:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4724:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4724:41:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14092:495;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14092:495:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14092:495:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4801:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4801:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4801:44:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34136:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34136:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34136:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;15618:375;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15618:375:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15618:375:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5818:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5818:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5818:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14777:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14777:109:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6072:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6072:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6072:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13331:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13331:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13331:172:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16077:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16077:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16077:138:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6395:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6395:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6395:46:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22276:376;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22276:376:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22276:376:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12389:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12389:161:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12389:161:0;;;;;;;;;;;;;;;;;:::i;:::-;;17434:388;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17434:388:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12118:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12118:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12118:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36625:1490;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36625:1490:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36625:1490:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15119:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15119:151:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4324:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4324:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4324:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44588:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44588:316:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44588:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38907:549;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38907:549:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38907:549:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12010:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12010:100:0;;;:::i;:::-;;40717:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40717:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40717:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34467:640;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34467:640:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34467:640:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12776:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12776:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12776:104:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12776:104:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12776:104:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12776:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12776:104:0;;;;;;;;;;;;;;;:::i;:::-;;39530:356;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39530:356:0;;;:::i;:::-;;24099:568;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24099:568:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24099:568:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12615:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12615:96:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12615:96:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12615:96:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12615:96:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12615:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12615:96:0;;;;;;;;;;;;;;;:::i;:::-;;5978:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5978:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5978:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40018:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40018:166:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40018:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10187:1626;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10187:1626:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10187:1626:0;;;;;;;;;;;;;;;;;:::i;:::-;;9721:262;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9721:262:0;;;:::i;:::-;;38222:571;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38222:571:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9179:476;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9179:476:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;9179:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8981:118;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8981:118:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;24825:3424;25009:7;24981:17;1626:15;;;;;;;;;;;1622:1136;;;1658:24;1685:10;1658:37;;4968:6;1760:17;1735:22;:20;:22::i;:::-;:42;1734:64;1712:1035;;1961:4;1927:38;;:12;:30;1940:16;1927:30;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;:302;;;;;4903:4;2160:17;2083:27;:45;2111:16;2083:45;;;;;;;;;;;;;;;;:94;2082:147;;1927:302;1833:415;;;;;;2367:139;2402:27;:45;2430:16;2402:45;;;;;;;;;;;;;;;;2470:17;2367:12;:139::i;:::-;2319:27;:45;2347:16;2319:45;;;;;;;;;;;;;;;:187;;;;25052:27;25095:45;25108:17;4442:2;25095:45;;:12;:45::i;:::-;25052:88;;25151:22;25176:36;25189:19;25210:1;25176:12;:36::i;:::-;25151:61;;25223:18;25244:49;25257:19;25278:14;25244:12;:49::i;:::-;25223:70;;25304:22;25342:52;25355:17;25374:19;25342:12;:52::i;:::-;25304:90;;25405:23;25431:33;25449:14;25431:17;:33::i;:::-;25405:59;;25475:12;4636:5;25490:10;:22;25475:37;;25565:1;25547:15;:19;:98;;;;;25633:12;;25587:43;25600:15;25617:12;;25587;:43::i;:::-;:58;25547:98;25525:131;;;;;;25760:1;25737:25;;:11;:25;;;;:73;;;;;25794:16;25779:31;;:11;:31;;;;25737:73;:144;;;;;25863:18;;25827:19;:32;25847:11;25827:32;;;;;;;;;;;;;;;;:54;;25737:144;25719:767;;;25978:108;26009:16;:29;26026:11;26009:29;;;;;;;;;;;;;;;;26057:14;25978:12;:108::i;:::-;25946:16;:29;25963:11;25946:29;;;;;;;;;;;;;;;:140;;;;26132:107;26163:15;:28;26179:11;26163:28;;;;;;;;;;;;;;;;26210:14;26132:12;:107::i;:::-;26101:15;:28;26117:11;26101:28;;;;;;;;;;;;;;;:138;;;;25719:767;;;26390:40;26403:10;26415:14;26390:12;:40::i;:::-;26377:53;;4636:5;26452:10;:22;26445:29;;25719:767;26517:1;26502:12;;:16;26498:721;;;26589:43;26602:12;;26616:15;26589:12;:43::i;:::-;26574:12;:58;;;;26821:12;;4636:5;26794:10;:22;26793:41;;;;;;26773:15;;:62;;;;;;;;;;;27089:12;;4636:5;27062:10;:22;27061:41;;;;;;27017:15;:86;26988:4;:116;26963:4;:142;26939:166;;26498:721;;;27192:15;27177:12;:30;;;;26498:721;27347:105;27374:19;:37;27394:16;27374:37;;;;;;;;;;;;;;;;27426:15;27347:12;:105::i;:::-;27307:19;:37;27327:16;27307:37;;;;;;;;;;;;;;;:145;;;;27463:30;:48;27494:16;27463:48;;;;;;;;;;;;;;;27531:55;;;;;;;;27550:15;27531:55;;;;27567:15;27531:55;;;;27584:1;27531:55;;;27463:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27463:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27663:1;27608:29;:47;27638:16;27608:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27751:22;27834:4;27816:15;27798;;:33;:40;27751:88;;27882:15;27850:10;:28;27861:16;27850:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;28061:11;27938:145;;27968:16;27938:145;;;27999:17;28031:15;27938:145;;;;;;;;;;;;;;;;;;;;;;;;28149:16;28101:105;;28132:1;28101:105;;;28180:15;28101:105;;;;;;;;;;;;;;;;;;28226:15;28219:22;;;;;;;;;1712:1035;;;2706:5;2688:15;;:23;;;;;;;;;;;;;;;;;;25052:27;25095:45;25108:17;4442:2;25095:45;;:12;:45::i;:::-;25052:88;;25151:22;25176:36;25189:19;25210:1;25176:12;:36::i;:::-;25151:61;;25223:18;25244:49;25257:19;25278:14;25244:12;:49::i;:::-;25223:70;;25304:22;25342:52;25355:17;25374:19;25342:12;:52::i;:::-;25304:90;;25405:23;25431:33;25449:14;25431:17;:33::i;:::-;25405:59;;25475:12;4636:5;25490:10;:22;25475:37;;25565:1;25547:15;:19;:98;;;;;25633:12;;25587:43;25600:15;25617:12;;25587;:43::i;:::-;:58;25547:98;25525:131;;;;;;25760:1;25737:25;;:11;:25;;;;:73;;;;;25794:16;25779:31;;:11;:31;;;;25737:73;:144;;;;;25863:18;;25827:19;:32;25847:11;25827:32;;;;;;;;;;;;;;;;:54;;25737:144;25719:767;;;25978:108;26009:16;:29;26026:11;26009:29;;;;;;;;;;;;;;;;26057:14;25978:12;:108::i;:::-;25946:16;:29;25963:11;25946:29;;;;;;;;;;;;;;;:140;;;;26132:107;26163:15;:28;26179:11;26163:28;;;;;;;;;;;;;;;;26210:14;26132:12;:107::i;:::-;26101:15;:28;26117:11;26101:28;;;;;;;;;;;;;;;:138;;;;25719:767;;;26390:40;26403:10;26415:14;26390:12;:40::i;:::-;26377:53;;4636:5;26452:10;:22;26445:29;;25719:767;26517:1;26502:12;;:16;26498:721;;;26589:43;26602:12;;26616:15;26589:12;:43::i;:::-;26574:12;:58;;;;26821:12;;4636:5;26794:10;:22;26793:41;;;;;;26773:15;;:62;;;;;;;;;;;27089:12;;4636:5;27062:10;:22;27061:41;;;;;;27017:15;:86;26988:4;:116;26963:4;:142;26939:166;;26498:721;;;27192:15;27177:12;:30;;;;26498:721;27347:105;27374:19;:37;27394:16;27374:37;;;;;;;;;;;;;;;;27426:15;27347:12;:105::i;:::-;27307:19;:37;27327:16;27307:37;;;;;;;;;;;;;;;:145;;;;27463:30;:48;27494:16;27463:48;;;;;;;;;;;;;;;27531:55;;;;;;;;27550:15;27531:55;;;;27567:15;27531:55;;;;27584:1;27531:55;;;27463:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27463:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27663:1;27608:29;:47;27638:16;27608:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27751:22;27834:4;27816:15;27798;;:33;:40;27751:88;;27882:15;27850:10;:28;27861:16;27850:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;28061:11;27938:145;;27968:16;27938:145;;;27999:17;28031:15;27938:145;;;;;;;;;;;;;;;;;;;;;;;;28149:16;28101:105;;28132:1;28101:105;;;28180:15;28101:105;;;;;;;;;;;;;;;;;;28226:15;28219:22;;;;;;;;;1712:1035;1622:1136;;25052:27;25095:45;25108:17;4442:2;25095:45;;:12;:45::i;:::-;25052:88;;25151:22;25176:36;25189:19;25210:1;25176:12;:36::i;:::-;25151:61;;25223:18;25244:49;25257:19;25278:14;25244:12;:49::i;:::-;25223:70;;25304:22;25342:52;25355:17;25374:19;25342:12;:52::i;:::-;25304:90;;25405:23;25431:33;25449:14;25431:17;:33::i;:::-;25405:59;;25475:12;4636:5;25490:10;:22;25475:37;;25565:1;25547:15;:19;:98;;;;;25633:12;;25587:43;25600:15;25617:12;;25587;:43::i;:::-;:58;25547:98;25525:131;;;;;;25760:1;25737:25;;:11;:25;;;;:73;;;;;25794:16;25779:31;;:11;:31;;;;25737:73;:144;;;;;25863:18;;25827:19;:32;25847:11;25827:32;;;;;;;;;;;;;;;;:54;;25737:144;25719:767;;;25978:108;26009:16;:29;26026:11;26009:29;;;;;;;;;;;;;;;;26057:14;25978:12;:108::i;:::-;25946:16;:29;25963:11;25946:29;;;;;;;;;;;;;;;:140;;;;26132:107;26163:15;:28;26179:11;26163:28;;;;;;;;;;;;;;;;26210:14;26132:12;:107::i;:::-;26101:15;:28;26117:11;26101:28;;;;;;;;;;;;;;;:138;;;;25719:767;;;26390:40;26403:10;26415:14;26390:12;:40::i;:::-;26377:53;;4636:5;26452:10;:22;26445:29;;25719:767;26517:1;26502:12;;:16;26498:721;;;26589:43;26602:12;;26616:15;26589:12;:43::i;:::-;26574:12;:58;;;;26821:12;;4636:5;26794:10;:22;26793:41;;;;;;26773:15;;:62;;;;;;;;;;;27089:12;;4636:5;27062:10;:22;27061:41;;;;;;27017:15;:86;26988:4;:116;26963:4;:142;26939:166;;26498:721;;;27192:15;27177:12;:30;;;;26498:721;27347:105;27374:19;:37;27394:16;27374:37;;;;;;;;;;;;;;;;27426:15;27347:12;:105::i;:::-;27307:19;:37;27327:16;27307:37;;;;;;;;;;;;;;;:145;;;;27463:30;:48;27494:16;27463:48;;;;;;;;;;;;;;;27531:55;;;;;;;;27550:15;27531:55;;;;27567:15;27531:55;;;;27584:1;27531:55;;;27463:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27463:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27663:1;27608:29;:47;27638:16;27608:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27751:22;27834:4;27816:15;27798;;:33;:40;27751:88;;27882:15;27850:10;:28;27861:16;27850:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;28061:11;27938:145;;27968:16;27938:145;;;27999:17;28031:15;27938:145;;;;;;;;;;;;;;;;;;;;;;;;28149:16;28101:105;;28132:1;28101:105;;;28180:15;28101:105;;;;;;;;;;;;;;;;;;28226:15;28219:22;;;;;;;;;24825:3424;;;;;;:::o;16302:339::-;16397:7;4636:5;16578:10;:28;16589:16;16578:28;;;;;;;;;;;;;;;;16519:19;:37;16539:16;16519:37;;;;;;;;;;;;;;;;16501:15;;:55;16470:136;16442:191;;;;;;16422:211;;16302:339;;;:::o;4272:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40192:148::-;40257:4;40274:36;40283:10;40295:7;40304:5;40274:8;:36::i;:::-;40328:4;40321:11;;40192:148;;;;:::o;18332:387::-;18390:7;18410:24;18437:17;18449:4;18437:11;:17::i;:::-;18410:44;;18465:18;18486:44;18499:16;4442:2;18486:44;;:12;:44::i;:::-;18465:65;;18541:22;18566:42;18579:16;18597:10;18566:12;:42::i;:::-;18541:67;;18619:23;18645:33;18663:14;18645:17;:33::i;:::-;18619:59;;18696:15;18689:22;;;;;;18332:387;:::o;17938:386::-;18045:7;18070:18;18091:44;18104:16;4442:2;18091:44;;:12;:44::i;:::-;18070:65;;18146:22;18171:42;18184:16;18202:10;18171:12;:42::i;:::-;18146:67;;18224:23;18250:33;18268:14;18250:17;:33::i;:::-;18224:59;;18301:15;18294:22;;;;;17938:386;;;:::o;14953:91::-;14997:7;15024:12;;15017:19;;14953:91;:::o;18837:809::-;18943:7;18993:12;;18976:13;:29;;18968:38;;;;;;19042:10;:8;:10::i;:::-;19025:13;:27;;19017:36;;;;;;19064:17;19084:32;19102:13;19084:17;:32::i;:::-;19064:52;;19127:24;19154:10;19127:37;;19177:15;19208:146;19233:56;19257:13;19272:16;19233:23;:56::i;:::-;19308:9;19336:3;19208:6;:146::i;:::-;19177:177;;19367:18;19401:132;19432:7;19458:60;19471:32;19484:9;19495:7;19471:12;:32::i;:::-;4442:2;19458:60;;:12;:60::i;:::-;19401:12;:132::i;:::-;19367:166;;19546:22;19571:35;19584:9;19595:10;19571:12;:35::i;:::-;19546:60;;19624:14;19617:21;;;;;;;18837:809;;;:::o;35555:305::-;35708:144;35741:6;35762:19;35796:10;35821:20;35708:18;:144::i;:::-;35555:305;;;:::o;40348:361::-;40471:4;40488:20;40524:53;40537:11;:19;40549:6;40537:19;;;;;;;;;;;;;;;:31;40557:10;40537:31;;;;;;;;;;;;;;;;40570:6;40524:12;:53::i;:::-;40488:89;;40590:36;40600:6;40608:9;40619:6;40590:9;:36::i;:::-;40637:42;40646:6;40654:10;40666:12;40637:8;:42::i;:::-;40697:4;40690:11;;;40348:361;;;;;:::o;12942:200::-;13001:4;13048:8;13018:15;:27;13034:10;13018:27;;;;;;;;;;;;;;;:38;;;;13102:10;13067:22;:32;13090:8;13067:32;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;13130:4;13123:11;;12942:200;;;:::o;6600:34::-;;;;;;;;;;;;;:::o;13150:173::-;13251:7;13283:22;:32;13306:8;13283:32;;;;;;;;;;;;;;;;;;;;;13276:39;;13150:173;;;:::o;22852:1081::-;22946:7;22971:26;23021:4;4498:5;23000:25;22971:54;;23036:23;23877:12;;4574:4;23095:735;23157:590;23707:12;;23649:18;4574:4;23544:1;:65;:123;:175;23504:1;23490:12;;:15;23447:1;4574:4;23421:27;23420:86;23377:4;23365:9;:16;23319:4;4574;23294:29;23252:1;:72;:130;23213:1;23193:18;:21;23192:191;:315;:528;23157:4;:590::i;:::-;23793:18;23095:12;:735::i;:::-;23076:796;;;;;;23075:815;23036:854;;23910:15;23903:22;;;;22852:1081;;;:::o;4361:35::-;4394:2;4361:35;:::o;13840:244::-;13882:7;13891;13911:24;13938:10;13911:37;;13959:21;13983:29;:47;14013:16;13983:47;;;;;;;;;;;;;;;13959:71;;14051:6;:12;;;14065:6;:10;;;14043:33;;;;;;13840:244;;:::o;44196:306::-;44294:4;44316:23;44355:58;44368:11;:23;44380:10;44368:23;;;;;;;;;;;;;;;:32;44392:7;44368:32;;;;;;;;;;;;;;;;44402:10;44355:12;:58::i;:::-;44316:97;;44426:46;44435:10;44447:7;44456:15;44426:8;:46::i;:::-;44490:4;44483:11;;;44196:306;;;;:::o;10056:67::-;10094:21;10104:10;10094:9;:21::i;:::-;10056:67::o;20153:2031::-;20300:7;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;20347:19;:37;20367:16;20347:37;;;;;;;;;;;;;;;;20328:15;:56;;20320:65;;;;;;20398:19;20420:1;20398:23;;20432:30;20478:29;:47;20508:16;20478:47;;;;;;;;;;;;;;;20432:93;;20536:15;20554;:21;;;20536:39;;20586:22;20611:1;20586:26;;20625:1489;20643:15;:19;;;20632:7;:30;20625:1489;;20679:38;20737:30;:48;20768:16;20737:48;;;;;;;;;;;;;;;20786:7;20737:57;;;;;;;;;;;;;;;;;;20679:115;;20809:23;20852:54;20865:11;:17;;;20884:11;:21;;;20852:12;:54::i;:::-;20809:97;;20923:22;20948:42;20961:15;20978:11;20948:12;:42::i;:::-;20923:67;;21029:14;21011:15;:32;21007:1045;;;21079:15;21064:30;;;;21130:235;21165:14;21202:144;21241:40;21259:11;:21;;;21241:17;:40::i;:::-;21308:15;21202:12;:144::i;:::-;21130:12;:235::i;:::-;21113:252;;21007:1045;;;21410:14;21391:15;:33;21387:665;;21462:234;21497:14;21534:143;21573:40;21591:11;:21;;;21573:17;:40::i;:::-;21640:14;21534:12;:143::i;:::-;21462:12;:234::i;:::-;21445:251;;21715:5;;;;;21387:665;21778:234;21813:14;21850:143;21889:40;21907:11;:21;;;21889:17;:40::i;:::-;21956:14;21850:12;:143::i;:::-;21778:12;:234::i;:::-;21761:251;;22031:5;;;;;21007:1045;22078:24;22091:7;22100:1;22078:12;:24::i;:::-;22068:34;;20625:1489;;;;;;22131:45;22144:14;22160:15;22131:12;:45::i;:::-;22124:52;;;;;;20153:2031;;;;:::o;5875:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;16911:429::-;16953:7;16993:1;16977:12;;:17;16973:360;;;4574:4;4498:5;17018:43;17011:50;;;;16973:360;17094:17;17114:23;17132:4;17114:17;:23::i;:::-;17094:43;;17152:18;17173:37;17186:9;4442:2;17173:37;;:12;:37::i;:::-;17152:58;;17225:22;17250:35;17263:9;17274:10;17250:12;:35::i;:::-;17225:60;;17307:14;17300:21;;;;;16911:429;;:::o;13511:251::-;13562:7;13571;13591:24;13618:10;13591:37;;13661:16;:34;13678:16;13661:34;;;;;;;;;;;;;;;;13710:15;:33;13726:16;13710:33;;;;;;;;;;;;;;;;13639:115;;;;;13511:251;;:::o;19654:411::-;19765:7;19817:12;;19798:15;:31;;19790:40;;;;;;19868:10;:8;:10::i;:::-;19849:15;:29;;19841:38;;;;;;19890:17;19910:43;19923:15;4442:2;19910:43;;:12;:43::i;:::-;19890:63;;19964:20;19987:40;20000:15;20017:9;19987:12;:40::i;:::-;19964:63;;20045:12;20038:19;;;;19654:411;;;:::o;4724:41::-;;;;:::o;14092:495::-;14208:7;14230;14252;14287:24;14314:10;14287:37;;14335:38;14389:30;:48;14420:16;14389:48;;;;;;;;;;;;;;;14438:7;14389:57;;;;;;;;;;;;;;;;;;14335:111;;14479:11;:17;;;14511:11;:21;;;14547:11;:21;;;14457:122;;;;;;;;14092:495;;;;;:::o;4801:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;34136:241::-;34223:9;34234;34261:10;34295:2;34274:25;;;;;34284:1;34281;34274:25;34261:38;;34318:1;34314;:5;34310:9;;34339:1;34334:2;:6;34330:10;;34360:1;34355:2;:6;34351:18;;;34368:1;34363:6;;;;34351:18;34136:241;;;;;;:::o;15618:375::-;15715:7;15740:24;15767:10;15740:37;;15808:21;:177;;15956:29;15968:16;15956:11;:29::i;:::-;15808:177;;;15902:16;:34;15919:16;15902:34;;;;;;;;;;;;;;;;15849:29;15861:16;15849:11;:29::i;:::-;:87;15808:177;15788:197;;;15618:375;;;:::o;5818:50::-;;;;;;;;;;;;;;;;;:::o;14777:109::-;14830:7;14857:21;14850:28;;14777:109;:::o;6072:50::-;;;;;;;;;;;;;;;;;:::o;13331:172::-;13435:7;13467:15;:28;13483:11;13467:28;;;;;;;;;;;;;;;;13460:35;;13331:172;;;:::o;16077:138::-;16143:7;16170:19;:37;16190:16;16170:37;;;;;;;;;;;;;;;;16163:44;;16077:138;;;:::o;6395:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;22276:376::-;22370:7;22395:11;22427:9;22409:15;:27;22395:41;;22459:7;22453:3;:13;22449:176;;;22490:1;22483:8;;;;;22449:176;22519:7;22513:3;:13;22509:116;;;22550:2;22543:9;;;;;22509:116;22580:7;22574:3;:13;22570:55;;;22611:2;22604:9;;;;;22570:55;22642:2;22635:9;;;22276:376;;;;:::o;12389:161::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12527:15;12506:18;:36;;;;12389:161;;:::o;17434:388::-;17475:7;17515:1;17499:12;;:17;17495:320;;;4574:4;4498:5;17540:43;17533:50;;;;17495:320;17616:17;17636:23;17654:4;17636:17;:23::i;:::-;17616:43;;17674:22;17716:51;17723:9;4442:2;17716:51;;17764:1;4442:2;17749:16;17716:51;;:6;:51::i;:::-;17674:93;;17789:14;17782:21;;;;17434:388;;:::o;12118:167::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12270:7;12240:14;:27;12255:11;12240:27;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;12118:167;;;:::o;36625:1490::-;36715:7;36740:31;36774:16;:34;36791:16;36774:34;;;;;;;;;;;;;;;36740:68;;36865:1;36839:5;:23;;;:27;:86;;;;;36902:5;:23;;;36883:15;:42;;36839:86;36821:1244;;;36984:18;37005:29;37017:16;37005:11;:29::i;:::-;36984:50;;37222:5;:26;;;37209:10;:39;:98;;;;;37282:5;:25;;;37269:10;:38;37209:98;37187:867;;;4636:5;37468;:25;;;:37;37405:10;:28;37416:16;37405:28;;;;;;;;;;;;;;;;:119;;;;;;;;;;;37780:5;:12;;;;;;;;;;;;37772:21;;37746:1;37729:5;:12;;;;;;;;;;;;37721:21;;37669:5;:23;;;37651:15;:41;37650:92;;;;;;37649:98;37648:145;37600:5;:23;;;:193;;;;;;;;;;;37895:27;37905:16;37895:9;:27::i;:::-;37992:10;:19;;:46;38012:5;:25;;;37992:46;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37992:46:0;37187:867;36821:1244;;38084:5;:23;;;38077:30;;;36625:1490;;;:::o;15119:151::-;15160:7;15180:24;15207:10;15180:37;;15235:27;15245:16;15235:9;:27::i;:::-;15228:34;;;15119:151;:::o;4324:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44588:316::-;44691:4;44713:23;44752:63;44765:11;:23;44777:10;44765:23;;;;;;;;;;;;;;;:32;44789:7;44765:32;;;;;;;;;;;;;;;;44799:15;44752:12;:63::i;:::-;44713:102;;44828:46;44837:10;44849:7;44858:15;44828:8;:46::i;:::-;44892:4;44885:11;;;44588:316;;;;:::o;38907:549::-;39027:7;39049;39071:6;39092:7;39127:44;39187:16;:34;39204:16;39187:34;;;;;;;;;;;;;;;39127:94;;39254:18;:36;;;39305:18;:38;;;39358:18;:25;;;;;;;;;;;;39398:18;:39;;;39232:216;;;;;;;;;38907:549;;;;;:::o;12010:100::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12097:5;12079:15;;:23;;;;;;;;;;;;;;;;;;12010:100;:::o;40717:223::-;40838:4;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;40860:50;40870:10;40882;40894:15;40860:9;:50::i;:::-;40928:4;40921:11;;40717:223;;;;:::o;34467:640::-;34571:7;34592:9;34603;34616:13;34624:1;34627;34616:7;:13::i;:::-;34591:38;;;;34652:1;34648;:5;34640:14;;;;;;34665:10;34691:1;34678:15;;;;;34688:1;34685;34678:15;34665:28;;34713:1;34708:2;:6;34704:18;;;34721:1;34716:6;;;;34704:18;34738:2;34733:7;;;;34751:12;34771:1;34770:2;;34766:1;:6;34751:21;;34788:4;34783:9;;;;;;;;;34808:4;34803:9;;;;;;;;;34850:1;34843:4;34835;34834:5;;34833:14;;;;;;:18;34828:1;:24;34823:29;;;;34863:9;34875:1;34863:13;;34900:1;34896;:5;34892:1;:9;34887:14;;;;34925:1;34921;:5;34917:1;:9;34912:14;;;;34950:1;34946;:5;34942:1;:9;34937:14;;;;34975:1;34971;:5;34967:1;:9;34962:14;;;;35000:1;34996;:5;34992:1;:9;34987:14;;;;35025:1;35021;:5;35017:1;:9;35012:14;;;;35050:1;35046;:5;35042:1;:9;35037:14;;;;35075:1;35071;:5;35067:1;:9;35062:14;;;;35098:1;35094;:5;35087:12;;;;;;;34467:640;;;;;:::o;12776:104::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12865:7;12856:6;:16;;;;;;;;;;;;:::i;:::-;;12776:104;;:::o;39530:356::-;39578:23;39604:10;39578:36;;39683:1;39629:16;:33;39646:15;39629:33;;;;;;;;;;;;;;;:51;;;:55;39625:254;;;39708:16;:33;39725:15;39708:33;;;;;;;;;;;;;;;;39701:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39851:15;39828:39;;;;;;;;;;;;39625:254;39530:356;:::o;24099:568::-;24164:7;24184:15;24213:4;24203:7;:14;24184:34;;24229:20;24268:4;24253:12;;:19;24229:44;;24284:25;24617:4;24326:288;24512:4;24502:7;:14;4574:4;24444;24429:12;:19;;;;;;4574:4;24403:46;4498:5;24360:90;24359:138;24358:159;24598:1;24589:4;24578:7;24574:1;24565:7;:10;:20;24564:29;;;;;;4574:4;24538:56;24537:62;;;;;;24326:12;:288::i;:::-;:295;;;;;;24284:338;;24642:17;24635:24;;;;;24099:568;;;:::o;12615:96::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12698:5;12691:4;:12;;;;;;;;;;;;:::i;:::-;;12615:96;;:::o;5978:51::-;;;;;;;;;;;;;;;;;:::o;40018:166::-;40117:7;40149:11;:18;40161:5;40149:18;;;;;;;;;;;;;;;:27;40168:7;40149:27;;;;;;;;;;;;;;;;40142:34;;40018:166;;;;:::o;10187:1626::-;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;10284:24;10311:10;10284:37;;10359:19;:37;10379:16;10359:37;;;;;;;;;;;;;;;;10340:15;:56;;10332:65;;;;;;10408:15;10426;10408:33;;10452:17;10472:26;10490:7;10472:17;:26::i;:::-;10452:46;;10511:15;10542:224;10567:134;10628:15;10666:16;10567:38;:134::i;:::-;10720:9;10748:3;10542:6;:224::i;:::-;10511:255;;10779:18;10813:132;10844:7;10870:60;10883:32;10896:9;10907:7;10883:12;:32::i;:::-;4442:2;10870:60;;:12;:60::i;:::-;10813:12;:132::i;:::-;10779:166;;10958:22;10983:35;10996:9;11007:10;10983:12;:35::i;:::-;10958:60;;11079:35;11092:12;;11106:7;11079:12;:35::i;:::-;11064:12;:50;;;;11165:97;11192:19;:37;11212:16;11192:37;;;;;;;;;;;;;;;;11244:7;11165:12;:97::i;:::-;11125:19;:37;11145:16;11125:37;;;;;;;;;;;;;;;:137;;;;11312:22;4636:5;11388:14;:26;11377:7;11359:15;;:25;:56;11312:104;;11459:15;11427:10;:28;11438:16;11427:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;11506:1;11491:12;;:16;11487:247;;;11599:123;11630:15;;11664:43;11671:10;4636:5;11694:12;;11664:6;:43::i;:::-;11599:12;:123::i;:::-;11581:15;:141;;;;11487:247;11763:16;11751:54;;;11781:7;11790:14;11751:54;;;;;;;;;;;;;;;;;;;;;;;;711:1;;;;;;;10187:1626;:::o;9721:262::-;9810:24;9837:10;9810:37;;9858:15;9876:19;:37;9896:16;9876:37;;;;;;;;;;;;;;;;9858:55;;9938:1;9928:7;:11;9924:30;;;9941:13;9946:7;9941:4;:13::i;:::-;9924:30;9965:10;:8;:10::i;:::-;9721:262;;:::o;38222:571::-;38316:7;38338;38360:6;38381:7;38416:24;38443:10;38416:37;;38464:44;38524:16;:34;38541:16;38524:34;;;;;;;;;;;;;;;38464:94;;38591:18;:36;;;38642:18;:38;;;38695:18;:25;;;;;;;;;;;;38735:18;:39;;;38569:216;;;;;;;;;;38222:571;;;;:::o;9179:476::-;9360:21;9370:10;9360:9;:21::i;:::-;9434;9430:218;;;9472:164;9509:6;9534:19;9572:10;9601:20;9472:18;:164::i;:::-;9430:218;9179:476;;;;:::o;8981:118::-;9041:50;9056:10;9068:9;9079:11;9041:14;:50::i;:::-;;8981:118;:::o;46478:147::-;46536:7;46556:9;46572:1;46568;:5;46556:17;;46596:1;46591;:6;;46584:14;;;;46616:1;46609:8;;;46478:147;;;;:::o;45862:288::-;45920:7;46019:9;46035:1;46031;:5;;;;;;46019:17;;46141:1;46134:8;;;45862:288;;;;:::o;46278:123::-;46336:7;46368:1;46363;:6;;46356:14;;;;46392:1;46388;:5;46381:12;;46278:123;;;;:::o;44990:367::-;45134:1;45117:19;;:5;:19;;;;45109:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45215:1;45196:21;;:7;:21;;;;45188:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45297:5;45267:11;:18;45279:5;45267:18;;;;;;;;;;;;;;;:27;45286:7;45267:27;;;;;;;;;;;;;;;:35;;;;45334:7;45318:31;;45327:5;45318:31;;;45343:5;45318:31;;;;;;;;;;;;;;;;;;44990:367;;;:::o;35868:690::-;36094:157;;;;;;;;36144:6;36126:24;;:15;:24;36094:157;;;;36165:19;36094:157;;;;36199:20;36094:157;;;;36234:6;36094:157;;;;;36058:16;:33;36075:15;36058:33;;;;;;;;;;;;;;;:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36368:15;36330:220;;;36398:16;:33;36415:15;36398:33;;;;;;;;;;;;;;;:51;;;36464:19;36498:6;36519:20;36330:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35868:690;;;;:::o;41516:2591::-;41710:1;41682:30;;:16;:30;;;;41660:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41832:1;41810:24;;:10;:24;;;;41788:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42095:15;;;;;;;;;;;42094:16;:93;;;;;42150:19;:37;42170:16;42150:37;;;;;;;;;;;;;;;;42131:15;:56;;42094:93;42072:126;;;;;;42364:1;42314:16;:34;42331:16;42314:34;;;;;;;;;;;;;;;;42282:29;42294:16;42282:11;:29::i;:::-;:66;:83;42264:167;;;42392:27;42402:16;42392:9;:27::i;:::-;42264:167;42516:59;42541:15;42558:16;42516:24;:59::i;:::-;42704:17;42724:43;42737:15;4442:2;42724:43;;:12;:43::i;:::-;42704:63;;42780:20;42803:40;42816:15;42833:9;42803:12;:40::i;:::-;42780:63;;42854:18;42875:28;42893:9;42875:17;:28::i;:::-;42854:49;;42963:37;42976:12;;42990:9;42963:12;:37::i;:::-;42948:12;:52;;;;43081:105;43108:19;:37;43128:16;43108:37;;;;;;;;;;;;;;;;43160:15;43081:12;:105::i;:::-;43041:19;:37;43061:16;43041:37;;;;;;;;;;;;;;;:145;;;;43231:96;43258:19;:31;43278:10;43258:31;;;;;;;;;;;;;;;;43304:12;43231;:96::i;:::-;43197:19;:31;43217:10;43197:31;;;;;;;;;;;;;;;:130;;;;43407:30;:42;43438:10;43407:42;;;;;;;;;;;;;;;43469:52;;;;;;;;43488:12;43469:52;;;;43502:15;43469:52;;;;43519:1;43469:52;;;43407:125;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;43407:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43592:1;43543:29;:41;43573:10;43543:41;;;;;;;;;;;;;;;:45;;;:50;;;;;;;;;;;43716:15;43698;;:33;43643:10;:28;43654:16;43643:28;;;;;;;;;;;;;;;;:99;;;;;;;;;;;43806:12;43788:15;;:30;43753:10;:22;43764:10;43753:22;;;;;;;;;;;;;;;;:66;;;;;;;;;;;43895:111;43922:15;;43952:43;43959:10;4636:5;43982:12;;43952:6;:43::i;:::-;43895:12;:111::i;:::-;43877:15;:129;;;;44074:10;44047:52;;44056:16;44047:52;;;44086:12;44047:52;;;;;;;;;;;;;;;;;;41516:2591;;;;;;:::o;33776:207::-;33824:9;33846;33868:1;33863;33859;:5;33858:11;;;;;;33846:23;;33884:1;33880:5;;33896:80;33907:1;33903;:5;33896:80;;;33929:1;33925:5;;33963:1;33958;33954;33950;:5;;;;;;:9;33949:15;;;;;;33945:19;;33896:80;;;33776:207;;;;:::o;28978:748::-;29043:18;29064:29;29076:16;29064:11;:29::i;:::-;29043:50;;29228:1;29191:16;:34;29208:16;29191:34;;;;;;;;;;;;;;;;29178:10;:47;:51;29170:60;;;;;;4636:5;29320:10;:22;29279:10;:28;29290:16;29279:28;;;;;;;;;;;;;;;;:64;;;;;;;;;;;29397:16;:34;29414:16;29397:34;;;;;;;;;;;;;;;;29383:48;;;;29479:1;29442:16;:34;29459:16;29442:34;;;;;;;;;;;;;;;:38;;;;29493:39;29564:16;29493:89;;29593:23;:32;;:44;29626:10;29593:44;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29593:44:0;29689:16;29678:40;;;29707:10;29678:40;;;;;;;;;;;;;;;;;;28978:748;;;:::o;45557:208::-;45615:7;45644:1;45639;:6;45635:47;;;45669:1;45662:8;;;;45635:47;45692:9;45708:1;45704;:5;45692:17;;45736:1;45731;45727;:5;;;;;;:10;45720:18;;;;45756:1;45749:8;;;45557:208;;;;;:::o;28257:713::-;28322:18;28343:29;28355:16;28343:11;:29::i;:::-;28322:50;;28471:1;28434:16;:34;28451:16;28434:34;;;;;;;;;;;;;;;;28421:10;:47;:51;28413:60;;;;;;4636:5;28527:10;:22;28486:10;:28;28497:16;28486:28;;;;;;;;;;;;;;;;:64;;;;;;;;;;;28609:16;:34;28626:16;28609:34;;;;;;;;;;;;;;;;28595:48;;;;28691:1;28654:16;:34;28671:16;28654:34;;;;;;;;;;;;;;;:38;;;;28781:15;28812:56;28827:16;28845:10;28865:1;28812:14;:56::i;:::-;28781:87;;28924:16;28909:53;;;28942:10;28954:7;28909:53;;;;;;;;;;;;;;;;;;;;;;;;28257:713;;;:::o;31364:2404::-;31523:7;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;31594:19;31616:1;31594:23;;31628:30;31674:29;:47;31704:16;31674:47;;;;;;;;;;;;;;;31628:93;;31732:15;31750;:21;;;31732:39;;31782:22;31807:1;31782:26;;31821:1875;31839:15;:19;;;31828:7;:30;31821:1875;;31875:38;31933:30;:48;31964:16;31933:48;;;;;;;;;;;;;;;31982:7;31933:57;;;;;;;;;;;;;;;;;;31875:115;;32005:23;32048:54;32061:11;:17;;;32080:11;:21;;;32048:12;:54::i;:::-;32005:97;;32119:22;32144:42;32157:15;32174:11;32144:12;:42::i;:::-;32119:67;;32225:14;32207:15;:32;32203:1453;;;32275:15;32260:30;;;;32326:235;32361:14;32398:144;32437:40;32455:11;:21;;;32437:17;:40::i;:::-;32504:15;32398:12;:144::i;:::-;32326:12;:235::i;:::-;32309:252;;32587:30;:48;32618:16;32587:48;;;;;;;;;;;;;;;32658:7;32587:97;;;;;;;;;;;;;;;;;;;32580:104;;;;;;;;;;;;;;;;;;;;32203:1453;;;32729:14;32710:15;:33;32706:950;;32781:234;32816:14;32853:143;32892:40;32910:11;:21;;;32892:17;:40::i;:::-;32959:14;32853:12;:143::i;:::-;32781:12;:234::i;:::-;32764:251;;33041:30;:48;33072:16;33041:48;;;;;;;;;;;;;;;33112:7;33041:97;;;;;;;;;;;;;;;;;;;33034:104;;;;;;;;;;;;;;;;;;;;33191:1;33181:7;:11;33157:15;:21;;:35;;;;33211:5;;;;;32706:950;33274:234;33309:14;33346:143;33385:40;33403:11;:21;;;33385:17;:40::i;:::-;33452:14;33346:12;:143::i;:::-;33274:12;:234::i;:::-;33257:251;;33552:14;33527:11;:21;;;:39;;;;;;;;;;;33609:7;33585:15;:21;;:31;;;;33635:5;;;;;32203:1453;33683:1;33672:12;;;;31821:1875;;;;;;33715:45;33728:14;33744:15;33715:12;:45::i;:::-;33708:52;;;;;;31364:2404;;;;:::o;29802:1442::-;29983:19;30005:1;29983:23;;30017:30;30063:29;:47;30093:16;30063:47;;;;;;;;;;;;;;;30017:93;;30121:15;30139;:21;;;30121:39;;30173:1064;30191:15;:19;;;30180:7;:30;30173:1064;;30227:38;30285:30;:48;30316:16;30285:48;;;;;;;;;;;;;;;30334:7;30285:57;;;;;;;;;;;;;;;;;;30227:115;;30357:23;30400:54;30413:11;:17;;;30432:11;:21;;;30400:12;:54::i;:::-;30357:97;;30471:22;30496:42;30509:15;30526:11;30496:12;:42::i;:::-;30471:67;;30577:14;30559:15;:32;30555:644;;;30627:15;30612:30;;;;30670;:48;30701:16;30670:48;;;;;;;;;;;;;;;30741:7;30670:97;;;;;;;;;;;;;;;;;;;30663:104;;;;;;;;;;;;;;;;;;;;30555:644;;;30812:14;30793:15;:33;30789:410;;30854:30;:48;30885:16;30854:48;;;;;;;;;;;;;;;30925:7;30854:97;;;;;;;;;;;;;;;;;;;30847:104;;;;;;;;;;;;;;;;;;;;31004:1;30994:7;:11;30970:15;:21;;:35;;;;31024:5;;;;;30789:410;31095:14;31070:11;:21;;;:39;;;;;;;;;;;31152:7;31128:15;:21;;:31;;;;31178:5;;;;;30555:644;31224:1;31213:12;;;;30173:1064;;;;;;29802:1442;;;;;:::o;459:44901::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://2c4790f7928bf9a3a45a9f8993b6a67a03c0e30cb3eae470bc64181e301607b8
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.