Contract 0x370CA03717C72e5eEE6F8be267995A91Cf5C0904

 
Txn Hash Method
Block
From
To
Value
0xd5f0e45a3b65a720c588338d09681b6adac9038c639c987267d358a8ab839198Cash Out123397752021-04-30 4:43:31149 days 20 hrs ago0x967b073201215cabbbc0f1c1f2b258683b495cb4 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.00159315231
0x95ae25fbd92c0757b4b96961e96ffd1a0cb59f14c83f744a602e218c6468e33bSell Tokens123397502021-04-30 4:39:06149 days 20 hrs ago0x967b073201215cabbbc0f1c1f2b258683b495cb4 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.00265691731
0xe15bd1152fc4fe2c82fbdcf07d325a40911c00adf3a3cdaff1a7a09f1b7796faCash Out118991402021-02-21 8:16:53217 days 17 hrs ago0x4dd4ae5e3d4f6d225c15535f713ad2f3dea52996 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.006628716123
0xd21fae6b46381298dd14a539ae1f793c554c0ee61417886cea1e950dbbc0ca14Sell Tokens118991052021-02-21 8:08:22217 days 17 hrs ago0x4dd4ae5e3d4f6d225c15535f713ad2f3dea52996 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.010778613123
0x6258d7ebdb174e11d5151291e339fe1a2361f264123678103fe23fcb68151c5aCash Out109336422020-09-25 19:19:26366 days 5 hrs ago0xf7388b6a9c65bceecfaab0bed560dc229a899848 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.00420357678
0x20a5ff14a7060dfc3fd8246d76600a268b8328f67dd7a256193abf35bb12c7c2Sell Tokens109335782020-09-25 19:05:53366 days 6 hrs ago0xf7388b6a9c65bceecfaab0bed560dc229a899848 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.00631889787
0xdab25a44cae9f9d757168f5a8429a7f8610383f5ae258bcdadabf9867a4c4a8fSell Tokens102020882020-06-04 22:52:53479 days 2 hrs ago0x5b0a412c6dc925d1dad14a83fe57f5b5cf952006 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.001038451714.3
0xf2b8440719ff5d9dda0c77ad2740abf0958493da8ba26fa191e71cfceefa4102Cash Out102020882020-06-04 22:52:53479 days 2 hrs ago0x5b0a412c6dc925d1dad14a83fe57f5b5cf952006 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.000770655614.3
0x648213c08c9dfa8e485f749973759c60b254f4afa23e8a6fc212acda7ba431d5Sell Tokens98007332020-04-03 18:38:17541 days 6 hrs ago0x6f1bc0edd28c72bb6bb484cfbc9befa02e79a545 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0004357146
0xd555918242c3706708a38469283d08c615e90aacf48d4b37a732e10cb4fa49d4Cash Out98007152020-04-03 18:33:43541 days 6 hrs ago0x6f1bc0edd28c72bb6bb484cfbc9befa02e79a545 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0004311368
0x9dc61d6987d4b49eedd9a1bfd78f61ff6a06c7638ec79452a3fb2d3e143936deCash Out97516932020-03-27 5:53:41548 days 19 hrs ago0x81f0d747157ee0f2c308a41d1334dc8a83d98108 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0000538921
0xe33985ac798c050b3241f0b0cb2b1dd78eae1c294439647aac2427eae8af29f2Sell Tokens97515842020-03-27 5:33:55548 days 19 hrs ago0x81f0d747157ee0f2c308a41d1334dc8a83d98108 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0001563413992.152899369
0x12455ddabe7e6d20f7c15415919340e65c038f30e718d06bf4c3cec9e06cd83eCash Out96902932020-03-17 17:03:32558 days 8 hrs ago0xf77fc2a7a1457f2efc504618190f87b38f8c4718 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.000269465
0xe8bcee24733b79b3c9d88a95bdfeb9ae5e21d37a41544e66ef73d4bbcfbf2c8cSell Tokens96902932020-03-17 17:03:32558 days 8 hrs ago0xf77fc2a7a1457f2efc504618190f87b38f8c4718 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0003630955
0x9a28eb12fd2e1367d75e667c7c6d221224fdc3477fe8c7853eaa8f8eff4257afCash Out96342792020-03-09 1:18:39567 days ago0x8da88ecac7c71edc34c742232c8d1fdc61c5f8be IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0003233526
0xe27bc8bad0a4b374222ff39490cdb319cf4664087d3ed81b1206df76c7ff032bSell Tokens96342792020-03-09 1:18:39567 days ago0x8da88ecac7c71edc34c742232c8d1fdc61c5f8be IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0004357866
0xa108cd4b419fdbc93e059880e62cc9c376049007e109374fb8779643f9b7dd6dSell Tokens96146052020-03-06 1:15:49570 days 3 mins ago0x279ba53a1ad77793544eaf2ac7398a7bd7361aaa IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.00008714281.2
0xf4091a92010b581552c71bfe2ac4a8d525e2168b450e5652d9a8a0e7475f7d62Cash Out95326332020-02-22 10:35:41582 days 14 hrs ago0x00995d6ad96e8e079e46e20c86d38265e3c53fbd IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.000269465
0x14a1768e76e2b306b7d6c0ebabe9eed671a43f6440e7fa723b0585f089687a8dSell Tokens95326302020-02-22 10:34:54582 days 14 hrs ago0x00995d6ad96e8e079e46e20c86d38265e3c53fbd IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0002904764
0x50da509e49fe646908b578202312d82e62b445aad721911dd40b626c93f948caCash Out95139272020-02-19 13:31:40585 days 11 hrs ago0x6e5d16b57e8ba136683089ea6c3d30c08b209bc5 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0002155684
0xc341ddbe1a9e7f67f5808934e9c1fb949dd293a5c7f0b8ca8be3b72521ef099bSell Tokens95139142020-02-19 13:28:58585 days 11 hrs ago0x6e5d16b57e8ba136683089ea6c3d30c08b209bc5 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0003629755
0x04d53f254031d2dba1e2aad3d282e6745bef29cd9a8426963d66a7e397d488bdSell Tokens95066172020-02-18 10:40:22586 days 14 hrs ago0x09457cd9378e6f432fc2ab85c6342755edee024c IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0001321460311.819717032
0x6e42564710d311ff9bc24e0262eb121f3b0807b142225a3d56475000365887dcSell Tokens94990332020-02-17 6:31:32587 days 18 hrs ago0x6fa716966c81e8f907629f90352452d8f2dd0df4 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.00010894651.5
0xd0b6040f9c6c90351dbde2b6028a3c346682f1b8640598db5bdcc56da00f5d13Cash Out94990262020-02-17 6:30:21587 days 18 hrs ago0x6fa716966c81e8f907629f90352452d8f2dd0df4 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0000808381.5
0x7e35ab8f2ca78f8aef44646cfdf5eae43c6e6df061e262cf542eb5c6784ad3a0Cash Out94670452020-02-12 8:16:34592 days 17 hrs ago0x6e5d16b57e8ba136683089ea6c3d30c08b209bc5 IN  0x370ca03717c72e5eee6f8be267995a91cf5c09040 Ether0.0004311368
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd5f0e45a3b65a720c588338d09681b6adac9038c639c987267d358a8ab839198123397752021-04-30 4:43:31149 days 20 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x967b073201215cabbbc0f1c1f2b258683b495cb40.625586086691674688 Ether
0x37abff8996ddd465746e43b2f99e402764e56cb2fa71c4abea1a4f8c40fc91da123397602021-04-30 4:40:24149 days 20 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.06883282007118988 Ether
0x95ae25fbd92c0757b4b96961e96ffd1a0cb59f14c83f744a602e218c6468e33b123397502021-04-30 4:39:06149 days 20 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x967b073201215cabbbc0f1c1f2b258683b495cb40.527664749449424744 Ether
0x95ae25fbd92c0757b4b96961e96ffd1a0cb59f14c83f744a602e218c6468e33b123397502021-04-30 4:39:06149 days 20 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.047105250050575256 Ether
0xe15bd1152fc4fe2c82fbdcf07d325a40911c00adf3a3cdaff1a7a09f1b7796fa118991402021-02-21 8:16:53217 days 17 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x4dd4ae5e3d4f6d225c15535f713ad2f3dea529960.238160070417467582 Ether
0xd21fae6b46381298dd14a539ae1f793c554c0ee61417886cea1e950dbbc0ca14118991052021-02-21 8:08:22217 days 17 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x4dd4ae5e3d4f6d225c15535f713ad2f3dea529960.814372716748023123 Ether
0xd21fae6b46381298dd14a539ae1f793c554c0ee61417886cea1e950dbbc0ca14118991052021-02-21 8:08:22217 days 17 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.070420558530465659 Ether
0xc23ce6732edd9eb07504feecb6fdce1546ffc439dc9135d6d78e34de910c1a05118990932021-02-21 8:04:55217 days 17 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.023080576624237201 Ether
0x6258d7ebdb174e11d5151291e339fe1a2361f264123678103fe23fcb68151c5a109336422020-09-25 19:19:26366 days 5 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040xf7388b6a9c65bceecfaab0bed560dc229a8998480.295452951075298873 Ether
0x20a5ff14a7060dfc3fd8246d76600a268b8328f67dd7a256193abf35bb12c7c2109335782020-09-25 19:05:53366 days 6 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040xf7388b6a9c65bceecfaab0bed560dc229a8998481.39664648782369076 Ether
0x20a5ff14a7060dfc3fd8246d76600a268b8328f67dd7a256193abf35bb12c7c2109335782020-09-25 19:05:53366 days 6 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.128177745038411254 Ether
0x21d8088e7dc2d5f0b747ab1307d7edcd246f147bb50c3f3794c8712072ccf0f0109335682020-09-25 19:04:25366 days 6 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.097474926726106275 Ether
0x74612ba4314c2813e354be81721dc115dbba8cbdcdfed0dc07c8af1ed317f5de104560752020-07-14 6:34:52439 days 18 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.110064204155384621 Ether
0xdab25a44cae9f9d757168f5a8429a7f8610383f5ae258bcdadabf9867a4c4a8f102020882020-06-04 22:52:53479 days 2 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x5b0a412c6dc925d1dad14a83fe57f5b5cf9520060.199046208916150156 Ether
0xdab25a44cae9f9d757168f5a8429a7f8610383f5ae258bcdadabf9867a4c4a8f102020882020-06-04 22:52:53479 days 2 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.020302914129567291 Ether
0xf2b8440719ff5d9dda0c77ad2740abf0958493da8ba26fa191e71cfceefa4102102020882020-06-04 22:52:53479 days 2 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x5b0a412c6dc925d1dad14a83fe57f5b5cf9520060.007725111611648974 Ether
0x3a323cb96abe90059f16a61f76fd886de01c714c5e19f0edff400b45cf5fbaf898692102020-04-14 7:36:44530 days 17 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.000049743808158023 Ether
0x648213c08c9dfa8e485f749973759c60b254f4afa23e8a6fc212acda7ba431d598007332020-04-03 18:38:17541 days 6 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x6f1bc0edd28c72bb6bb484cfbc9befa02e79a5450.073068810440002497 Ether
0x648213c08c9dfa8e485f749973759c60b254f4afa23e8a6fc212acda7ba431d598007332020-04-03 18:38:17541 days 6 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.007588719642463456 Ether
0x674682b4c78e0183d2b0ed5f2b6023c2cbb0d8347dd5c283ae0df3618b94b07998007322020-04-03 18:37:52541 days 6 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.004061241400760262 Ether
0xd555918242c3706708a38469283d08c615e90aacf48d4b37a732e10cb4fa49d498007152020-04-03 18:33:43541 days 6 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x6f1bc0edd28c72bb6bb484cfbc9befa02e79a5450.005406091155910511 Ether
0x9dc61d6987d4b49eedd9a1bfd78f61ff6a06c7638ec79452a3fb2d3e143936de97516932020-03-27 5:53:41548 days 19 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x81f0d747157ee0f2c308a41d1334dc8a83d981080.004613301019675933 Ether
0xe33985ac798c050b3241f0b0cb2b1dd78eae1c294439647aac2427eae8af29f297515842020-03-27 5:33:55548 days 19 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c09040x81f0d747157ee0f2c308a41d1334dc8a83d981080.044293922217317169 Ether
0xe33985ac798c050b3241f0b0cb2b1dd78eae1c294439647aac2427eae8af29f297515842020-03-27 5:33:55548 days 19 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.004664562678353376 Ether
0xb75aede73c98e886373497f168922c7f35e44bb50dac09809442e7969c4c24aa96991882020-03-19 1:39:28556 days 23 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.000371417692804784 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HODLcoin

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-01-25
*/

pragma solidity ^0.5.10;


/// @title An economic simulation and game
/// @author TheTokenPhysicist
/// @dev NatSpec comments provide broader information. Detailed comments available in source code
contract HODLcoin
//start contract
{
//NOTE: in general modifiers have been defined/placed just before the functions that use them

//STATE VARIABLES
//INTERNAL CONSTANTS
//internal constant used for math
uint256 constant internal MAGNITUDE = 2**64;
int256 constant internal IMAGNITUDE = 2**64;

//NOTE that 1ETHER = 1e18 wei
uint256 constant internal FEE_CYCLE_SIZE = 25e16 wei;
//(3277/65536 = 5.00%)
uint16 constant internal MAX_VARIANCE = 3277;
//(3276/65536 = 5.00%)
uint constant internal BASE_RATE = 3276;
//max rate = base_rate + max_variance (6553/65536 = 10.00%)
//limits for setup phase
uint256 constant internal SETUP_LIMIT = 6e18;
uint256 constant internal CONTRIBUTOR_PURCHASE_MAX = 25e17;
//parameters for token bonding curve
//set to 0.000001=10^-6 (ETH/token), i.e. 10^6 tokens/ETH (ignoring rise due to price increment)
uint256 constant internal TOKEN_PRICE_INITIAL = 0.000001 ether;
//set to 0.000000001=10^-9 (ETH/token), representing an increase of 10^-9 ETH in the price of each token per outstanding token
uint256 constant internal TOKEN_PRICE_INCREMENT = 0.000000001 ether;

//PUBLIC CONSTANTS
//ERC 20 standard for the number of decimals the token uses
uint8 constant public decimals = 18;

//PUBLIC VARIABLES
string public name = "HODLcoin";
string public symbol = "HODL";
//tracks total ether stored in unwithdrawn dividends
uint256 public _slushFundBalance = 0;
//initializes fee rate at BASE_RATE
uint16 public _feeRate = uint16(BASE_RATE);
//tracks total accumulated rewards per token
uint256 public _rewardsPerTokenAllTime = 0;
//tracks total existing number of tokens. named to match ERC-20 standard (see https://eips.ethereum.org/EIPS/eip-20)
uint256 public totalSupply = 0;
//partner contract address will be set IRREVERSIBLY by administrator in setup phase
//partner address initially set to administrator address to avoid divide by zero error on first token purchase
address payable public partnerAddress_ = msg.sender;
bool public partnerSet = false;
// when setupPhase is set to true, only contributors can purchase tokens - used during contract setup
//this is automatically switched off (irreversibly) after setupLimit is met, or can be switched off manually by admin with endSetupPhase()
bool public setupPhase = true;


//MAPPINGS
// track token balances
mapping(address => uint256) public tokenBalanceLedger_;
// track payouts
mapping(address => int256) public payoutsToLedger_;
//track approved addresses to allow transferFrom functionality - stored as allowance[from][spender] = allowance that [spender] is approved to send from [from]
//named to match ERC-20 standard
mapping(address => mapping(address => uint256)) allowance;
//track ether spending in setup phase
mapping(address => uint256) internal accumulatedContributorSpends_;
//tracks administrator(s) & contributors
mapping(address => bool) public administrator_;
mapping(address => bool) public contributors_;


//EVENTS
//when a transfer is completed
//also emitted for token mint/burn events, in which cases, respectively, from/to is set to the 0 address (matches ERC20 standard)
event Transfer(
    address indexed from,
    address indexed to,
    uint256 tokensTransferred
);
// ERC20 compliance
//when the tokenOwner address adjusts the allowance that the approvedAddress is allowed to transfer from the holdings of tokenOwner
//relevant to transferFrom functionality
event Approval(
    address indexed tokenOwner,
    address indexed approvedAddress,
    uint256 newAllowance
);
//when a player spends their rewards to purchase more tokens
event DoubleDown(
    address indexed playerAddress,
    uint256 etherValue, //etherValue of the spent rewards
    uint256 tokensMinted
);
//when a player withdraws their rewards as ether
event CashOut(
    address indexed playerAddress,
    uint256 etherValue
);
//event announced when the fee rate is recalculated (occurs whenever slush fund balance changes)
//NOTE: fee rate is represented as 16-bit int; calculations of the fee itself use value*feeRate/65536 (65536 = 2^16)
event AnnounceFeeRate(
    uint16 newFeeRate
);


//CONSTRUCTOR/INITIALIZATION
constructor()
    public
{
    //sets up admin(s) and contributors
    administrator_[msg.sender] = true; //TheTokenPhysicist -- Mastermind
    contributors_[msg.sender] = true;
    contributors_[0xF7388B6a9c65BCEECfaaB0beD560dc229A899848] = true; //MaddEconomist -- Advisor
    contributors_[0x8DA88ecAc7C71EDc34C742232C8D1fdc61C5f8bE] = true; //swimmingly -- Tester & design review
    contributors_[0x6Fa716966c81e8f907629f90352452d8F2dD0dF4] = true; //cryptoGENIUS17 -- Design consulting & editing
}


//FALLBACK
/// @notice fallback function. ensures that you still receive tokens if you just send money directly to the contract
/// @dev fallback function. buys tokens with all sent ether *unless* ether is sent from partner address; if it is, then distributes ether as rewards to token holders
function()
    external
    payable
{
    if ( msg.sender == partnerAddress_ ) {
        //convert money sent from partner contract into rewards for all token holders
        makeItRain();
    } else {
       purchaseTokens( msg.sender, msg.value ); 
    }
}


//EXTERNAL FUNCTIONS
/// @notice buys tokens with all sent funds. tokens are automatically credited to sender address
/// @dev emits event Transfer(address(0), playerAddress, newTokens) since function mint is called internally
function buyTokens()
    external
    payable
{
    purchaseTokens( msg.sender, msg.value );
}

/// @notice uses all of message sender's accumulated rewards to buy more tokens for the sender
/// @dev emits event DoubleDown(msg.sender, rewards , newTokens) and event Transfer(address(0), playerAddress, newTokens) since function mint is called internally
function doubleDown()
    external
{
    //pull current ether value of sender's rewards
    uint256 etherValue = rewardsOf( msg.sender );
    //update rewards tracker to reflect payout. performed before rewards are sent to prevent re-entrancy
    updateSpentRewards( msg.sender , etherValue);
    //update slush fund and fee rate
    _slushFundBalance -= etherValue;
    require( calcFeeRate(), "error in calling calcFeeRate" );
    // use rewards to buy new tokens
    uint256 newTokens = purchaseTokens(msg.sender , etherValue);
    //NOTE: purchaseTokens already emits an event, but this is useful for tracking specifically DoubleDown events
    emit DoubleDown(msg.sender, etherValue , newTokens);
}

/// @notice converts all of message senders's accumulated rewards into cold, hard ether
/// @dev emits event CashOut( msg.sender, etherValue )
/// @return etherValue sent to account holder
function cashOut()
    external
    returns (uint256 etherValue)
{
    //pull current ether value of sender's rewards
    etherValue = rewardsOf( msg.sender );
    //update rewards tracker to reflect payout. performed before rewards are sent to prevent re-entrancy
    updateSpentRewards( msg.sender , etherValue);
    //update slush fund and fee rate
    _slushFundBalance -= etherValue;
    require( calcFeeRate(), "error in calling calcFeeRate" );
    //transfer rewards to sender
    msg.sender.transfer( etherValue );
    //NOTE: purchaseTokens already emits an event, but this is useful for tracking specifically CashOut events
    emit CashOut( msg.sender, etherValue );
}

/// @notice sells all of sender's tokens
/// @dev emits event Transfer(playerAddress, address(0), amountTokens) since function burn is called internally
function sellAll()
    external
    returns (bool)
{
    uint256 tokens = tokenBalanceLedger_[msg.sender];
    if ( tokens > 0 ) {
        sell(tokens);
    }
    return true;
}

/// @notice sells desired number of message sender's tokens
/// @dev emits event Transfer(playerAddress, address(0), amountTokens) since function burn is called internally
/// @param amountTokens The number of tokens the sender wants to sell
function sellTokens( uint256 amountTokens )
    external
    returns (bool)
{
    require( amountTokens <= tokenBalanceLedger_[msg.sender], "insufficient funds available" );
    sell(amountTokens);
    return true;
}

/// @notice transfers tokens from sender to another address. Pays fee at same rate as buy/sell
/// @dev emits event Transfer( msg.sender, toAddress, tokensAfterFee )
/// @param toAddress Destination for transferred tokens
/// @param amountTokens The number of tokens the sender wants to transfer
function transfer( address toAddress, uint256 amountTokens )
    external
    returns( bool )
{
    //make sure message sender has the requested tokens (transfers also disabled during SetupPhase)
    require( ( amountTokens <= tokenBalanceLedger_[ msg.sender ] && !setupPhase ), "transfer not allowed" );
    //make the transfer internally
    require( transferInternal( msg.sender, toAddress, amountTokens ), "error in internal token transfer" );
    //ERC20 compliance
    return true;
}

/// @notice sets approved amount of tokens that an external address can transfer on behalf of the user
/// @dev emits event Approval(msg.sender, approvedAddress, amountTokens)
/// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens)
/// @param amountTokens The number of tokens the sender wants to approve the external address to transfer for them
function approve( address approvedAddress, uint256 amountTokens)
    external
    returns (bool)
{
    allowance[msg.sender][approvedAddress] = amountTokens;
    emit Approval(msg.sender, approvedAddress, amountTokens);
    return true;
}

/// @notice increases approved amount of tokens that an external address can transfer on behalf of the user
/// @dev emits event Approval(msg.sender, approvedAddress, newAllowance)
/// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens)
/// @param amountTokens The number of tokens by which the sender wants to increase the external address' allowance
function increaseAllowance( address approvedAddress, uint256 amountTokens)
    external
    returns (bool)
{
    uint256 pastAllowance = allowance[msg.sender][approvedAddress];
    uint256 newAllowance = SafeMath.add( pastAllowance , amountTokens );
    allowance[msg.sender][approvedAddress] = newAllowance;
    emit Approval(msg.sender, approvedAddress, newAllowance);
    return true;
}

/// @notice decreases approved amount of tokens that an external address can transfer on behalf of the user
/// @dev emits event Approval(msg.sender, approvedAddress, newAllowance)
/// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens)
/// @param amountTokens The number of tokens by which the sender wants to decrease the external address' allowance
function decreaseAllowance( address approvedAddress, uint256 amountTokens)
    external
    returns (bool)
{
    uint256 pastAllowance = allowance[msg.sender][approvedAddress];
    uint256 newAllowance = SafeMath.sub( pastAllowance , amountTokens );
    allowance[msg.sender][approvedAddress] = newAllowance;
    emit Approval(msg.sender, approvedAddress, newAllowance);
    return true;
}

modifier checkTransferApproved(address fromAddress, uint256 amountTokens){
    require( allowance[fromAddress][msg.sender] <= amountTokens, "transfer not authorized (allowance insufficient)" );
    _;
} 
/// @notice transfers tokens from one address to another. Pays fee at same rate as buy/sell
/// @dev emits event Transfer( fromAddress, toAddress, tokensAfterFee )
/// @param fromAddress Account that sender wishes to transfer tokens from
/// @param toAddress Destination for transferred tokens
/// @param amountTokens The number of tokens the sender wants to transfer
function transferFrom(address payable fromAddress, address payable toAddress, uint256 amountTokens)
    checkTransferApproved(fromAddress , amountTokens)
    external
    returns (bool)
{
    // make sure sending address has requested tokens (transfers also disabled during SetupPhase)
    require( ( amountTokens <= tokenBalanceLedger_[ fromAddress ] && !setupPhase ), "transfer not allowed - insufficient funds available" );
    //update allowance (reduce it by tokens to be sent)
    uint256 pastAllowance = allowance[fromAddress][msg.sender];
    uint256 newAllowance = SafeMath.sub( pastAllowance , amountTokens );
    allowance[fromAddress][msg.sender] = newAllowance;
    //make the transfer internally
    require( transferInternal( fromAddress, toAddress, amountTokens ), "error in internal token transfer" ); 
    // ERC20 compliance
    return true;
}

/// @notice called by users to exchange between token types. Pays fee at half the rate of buy/sell
/// @param amountTokens the number of tokens the user wishes to exchange
function exchangeTokens( uint256 amountTokens )
    external
    returns(bool)
{
    // make sure sending address has requested tokens (transfers also disabled during SetupPhase)
    require( ( amountTokens <= tokenBalanceLedger_[ msg.sender ] && !setupPhase ), "transfer not allowed - insufficient funds available" );
    //mirrors valueAfterFee function, but with fee halved (half fee is also charged by the other contract)
    uint256 amountEther = tokensToEther( amountTokens );
    uint256 fee = SafeMath.div( ( amountEther * _feeRate / 2 ) , 65536 ); //fee
    uint256 valueAfterFee = SafeMath.sub( amountEther , fee ); //value after fee
    //destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance
    //also updates reward tracker (payoutsToLedger_) for player address
    burn(msg.sender, amountTokens);
    //mirrors makeItRain function (distributes fee to token holders)
    uint256 addedRewards = SafeMath.mul( fee , MAGNITUDE );
    uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply );
    _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken );
    //updates balance in slush fund and calculates new fee rate
    require( updateSlushFund( fee ), "error in calling updateSlushFund" );
    //sends remainder to partner contract, to be used to buy tokens from that contract
    address payable buddy = partnerAddress_;
    ( bool success, bytes memory returnData ) = buddy.call.value( valueAfterFee )(abi.encodeWithSignature("incomingExchangeRequest(address)", msg.sender));
    //no need to check return data since partner is a trusted entity
    require( success, "failed to send funds to partner contract (not enough gas provided?)" );
    return true;    
}

/// @notice handles exchange. only callable by partner contract.
/// @param playerAddress passed on from call to exchangeTokens function. used to track player address
function incomingExchangeRequest( address playerAddress )
    external
    payable
    returns(bool)
{
    require( (msg.sender == partnerAddress_), "this function can only be called by the partner contract" );
    //mirrors valueAfterFee function, but with fee halved (half fee is also charged by the other contract)
    uint256 amountEther = msg.value;
    uint256 fee = SafeMath.div( ( amountEther * _feeRate / 2 ) , 65536 ); //fee
    uint256 valueAfterFee = SafeMath.sub( amountEther , fee ); //value after fee
    //mirrors makeItRain function (distributes fee to token holders)
    uint256 addedRewards = SafeMath.mul( fee , MAGNITUDE );
    uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply );
    _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken );
    //updates balance in slush fund and calculates new fee rate
    require( updateSlushFund( fee ), "error in calling updateSlushFund" );
    //mirrors purchaseTokens function
    uint256 amountTokens = etherToTokens( valueAfterFee );
    //adds new tokens to total token supply and gives them to the player
    //also updates reward tracker (payoutsToLedger_) for player address
    mint( playerAddress, amountTokens );
    return true;
}


//ADMIN ONLY FUNCTIONS (ALL EXTERNAL AS WELL)
//defines modifier for functions that only contract admin(s) can use
modifier onlyAdministrator() {  
    require( administrator_[ msg.sender ] == true, "function can only be called by contract admin" );
    _;
}
/// @notice admin only function. irreversibly sets address of partner contract
/// @param partner Address of partner contract
function setPartner( address payable partner)
    onlyAdministrator()
    public
{
    if ( partnerSet == false ) {
        partnerAddress_ = partner;
        partnerSet = true;
    }
}

/// @notice admin only function. irreversibly ends SetupPhase
/// @dev SetupPhase also ends automatically if contract holds more than (SETUP_LIMIT) in ether. see modifier purchaseAllowed(uint256 amountEther)
function endSetupPhase()
    onlyAdministrator()
    public
{
    setupPhase = false;
}

/// @notice admin only function. simple name change
/// @param newName Desired new name for contract
function setName( string memory newName )
    onlyAdministrator()
    public
{
    name = newName;
}

/// @notice admin only function. simple symbol change
/// @param newSymbol Desired new symbol for contract
function setSymbol( string memory newSymbol )
    onlyAdministrator()
    public
{
    symbol = newSymbol;
}


//HELPER FUNCTIONS (ALL EXTERNAL AS WELL) -- used to pull information
/// @notice returns current sell price for one token
function sellPrice() 
    external
    view
    returns(uint256)
{
    // avoid dividing by zero
    require(totalSupply != 0, "function called too early (supply is zero)");
    //represents selling one "full token" since the token has 18 decimals
    uint256 etherValue = tokensToEther( 1e18 );
    uint[2] memory feeAndValue = valueAfterFee( etherValue );
    return feeAndValue[1];
}

/// @notice calculates current buy price for one token
function currentBuyPrice() 
    external
    view
    returns(uint256)
{
    // avoid dividing by zero
    require(totalSupply != 0, "function called too early (supply is zero)");
    //represents buying one "full token" since the token has 18 decimals
    uint256 etherValue = tokensToEther( 1e18 );
    uint[2] memory feeAndValue = valueAfterFee( etherValue );
    //NOTE: this is not strictly correct, but gets very close to real purchase value
    uint256 totalCost = etherValue + feeAndValue[0];
    return totalCost;
}

/// @notice calculates number of tokens that can be bought at current price and fee rate for input amount of ether
/// @param etherValue Desired amount of ether from which to calculate equivalent number of tokens
/// @return amountTokens Expected return of tokens for spending etherValue
function calculateExpectedTokens(uint256 etherValue) 
    external
    view
    returns(uint256)
{
    uint256 etherAfterFee = valueAfterFee( etherValue )[1];
    uint256 amountTokens = etherToTokens( etherAfterFee );
    return amountTokens;
}

/// @notice calculates amount of ether (as wei) received if input number of tokens is sold at current price and fee rate
/// @param tokensToSell Desired number of tokens (as an integer) from which to calculate equivalent value of ether
/// @return etherAfterFee Amount of ether that would be received for selling tokens
function calculateExpectedWei(uint256 tokensToSell) 
    external
    view
    returns(uint256)
{
    require( tokensToSell <= totalSupply, "unable to calculate for amount of tokens greater than current supply" );
    //finds ether value of tokens before fee
    uint256 etherValue = tokensToEther( tokensToSell );
    //calculates ether after fee
    uint256 etherAfterFee = valueAfterFee( etherValue )[1];
    return etherAfterFee;
}

/// @notice returns total ether balance of contract
function totalEtherBalance()
    external
    view
    returns(uint)
{
    return address(this).balance;
}

/// @notice returns number of tokens owned by message sender
function myTokens()
    external
    view
    returns(uint256)
{
    return tokenBalanceLedger_[msg.sender];
}

/// @notice returns reward balance of message sender
function myRewards() 
    external 
    view 
    returns(uint256)
{
    return rewardsOf( msg.sender );
}

/// @notice returns token balance of desired address
/// @dev conforms to ERC-20 standard
/// @param playerAddress Address which sender wants to know the balance of
/// @return balance Current raw token balance of playerAddress
function balanceOf( address playerAddress )
    external
    view
    returns(uint256 balance)
{
    return (tokenBalanceLedger_[playerAddress]);
}


//PUBLIC FUNCTIONS
/// @notice function for donating to slush fund. adjusts current fee rate as fast as possible but does not give the message sender any tokens
/// @dev invoked internally when partner contract sends funds to this contract (see fallback function)
function makeItRain()
    public
    payable
    returns(bool)
{
    //avoid dividing by zero
    require(totalSupply != 0, "makeItRain function called too early (supply is zero)");
    uint256 amountEther = msg.value;
    uint256 addedRewards = SafeMath.mul( amountEther , MAGNITUDE );
    uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply );
    _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken );
    //updates balance in slush fund and calculates new fee rate
    require( updateSlushFund( amountEther ), "error in calling updateSlushFund" );
    return true;
}

/// @notice returns reward balance of desired address
/// @dev invoked internally in cashOut and doubleDown functions
/// @param playerAddress Address which sender wants to know the rewards balance of
/// @return playerRewards Current ether value of unspent rewards of playerAddress
function rewardsOf( address playerAddress )
    public
    view
    returns(uint256 playerRewards)
{
    playerRewards = (uint256) ( ( (int256)( _rewardsPerTokenAllTime * tokenBalanceLedger_[ playerAddress ] ) - payoutsToLedger_[ playerAddress ] ) / IMAGNITUDE );
    return playerRewards;
}


//INTERNAL FUNCTIONS
//recalculates fee rate given current contract state
function calcFeeRate()
    internal
    returns(bool)
{
    uint excessSlush = ( (_slushFundBalance % FEE_CYCLE_SIZE) * MAX_VARIANCE );
    uint16 cycleLocation = uint16( excessSlush / FEE_CYCLE_SIZE );
    uint16 newFeeRate = uint16( BASE_RATE + cycleLocation );
    //copy local variable to state variable
    _feeRate = newFeeRate;
    //anounce new rate
    emit AnnounceFeeRate( newFeeRate );
    return(true);
}

//updates balance in slush fund and calculates new fee rate
function updateSlushFund( uint256 amountEther )
    internal
    returns(bool)
{
    _slushFundBalance += amountEther;
    require( calcFeeRate(), "error in calling calcFeeRate" );
    return true;
}

//update rewards tracker when a user withdraws their rewards
function updateSpentRewards( address playerAddress, uint256 etherValue )
    internal
    returns(bool)
{
    int256 updatedPayouts = payoutsToLedger_[playerAddress] + int256 ( SafeMath.mul( etherValue, MAGNITUDE ) );
    require( (updatedPayouts >= payoutsToLedger_[playerAddress]), "ERROR: integer overflow in updateSpentRewards function" );
    payoutsToLedger_[playerAddress] = updatedPayouts;
    return true;
}

//updates rewards tracker. makes sure that player does not receive any rewards accumulated before they purchased/received these tokens
function updateRewardsOnPurchase( address playerAddress, uint256 amountTokens )
    internal
    returns(bool)
{
    int256 updatedPayouts = payoutsToLedger_[playerAddress] + int256 ( SafeMath.mul( _rewardsPerTokenAllTime, amountTokens ) );
    require( (updatedPayouts >= payoutsToLedger_[playerAddress]), "ERROR: integer overflow in updateRewardsOnPurchase function" );
    payoutsToLedger_[playerAddress] = updatedPayouts;    
    return true;
}

//adds new tokens to total token supply and gives them to the player
function mint(address playerAddress, uint256 amountTokens)
    internal
{
    require( playerAddress != address(0), "cannot mint tokens for zero address" );
    totalSupply = SafeMath.add( totalSupply, amountTokens );
    //updates rewards tracker. makes sure that player does not receive any rewards accumulated before they purchased these tokens
    updateRewardsOnPurchase( playerAddress, amountTokens );
    //give tokens to player. performed last to prevent re-entrancy attacks
    tokenBalanceLedger_[playerAddress] = SafeMath.add( tokenBalanceLedger_[playerAddress] , amountTokens );
    //event conforms to ERC-20 standard
    emit Transfer(address(0), playerAddress, amountTokens);
}

//Modifier that limits buying while contract setup occurs
modifier purchaseAllowed(uint256 amountEther){
    //check if still in setup phase
    if ( setupPhase ) {
        //check that sender is in contributor list
        require( contributors_[ msg.sender ] == true, "purchases currently limited only to contributors" );
        //check that sender hasn't deposited more ether than allowed
        uint256 contributorSpent = SafeMath.add( accumulatedContributorSpends_[ msg.sender ] , amountEther );
        require( contributorSpent <= CONTRIBUTOR_PURCHASE_MAX, "attempted purchase would exceed limit placed upon contributors" );
        //before SETUP_LIMIT is met, track contributor spends
        if ( ( address(this).balance + amountEther ) <= SETUP_LIMIT ) {
            //update the amount spent by address
            accumulatedContributorSpends_[ msg.sender ] = contributorSpent;
        } else {
        //if conditions have been met to end setup phase, then exit it automatically. admin also has ability to end setup phase manually
        setupPhase = false;
        }
    }
    _;
}
//gives appropriate number of tokens to purchasing address
function purchaseTokens(address payable playerAddress, uint256 etherValue)
    //checks if purchase allowed -- only relevant for limiting actions during setup phase
    purchaseAllowed( etherValue )    
    internal
    returns( uint256 )
{
    //calculates fee/rewards
    uint[2] memory feeAndValue = valueAfterFee( etherValue );
    //calculates tokens from postFee value of input ether
    uint256 amountTokens = etherToTokens( feeAndValue[1] );
    //avoid overflow errors
    require ( ( (amountTokens + totalSupply) > totalSupply), "purchase would cause integer overflow" );
    // send rewards to partner contract, to be distributed to its holders
    address payable buddy = partnerAddress_;
    ( bool success, bytes memory returnData ) = buddy.call.value( feeAndValue[0] )("");
    require( success, "failed to send funds to partner contract (not enough gas provided?)" );
    //adds new tokens to total token supply and gives them to the player
    //also updates reward tracker (payoutsToLedger_) for player address
    mint( playerAddress, amountTokens );
    return( amountTokens );
}

//update rewards tracker. makes sure that player can still withdraw rewards that accumulated while they were holding their sold/transferred tokens
function updateRewardsOnSale( address playerAddress, uint256 amountTokens )
    internal
    returns(bool)
{
    int256 updatedPayouts = payoutsToLedger_[playerAddress] - int256 ( SafeMath.mul( _rewardsPerTokenAllTime, amountTokens ) );
    require( (updatedPayouts <= payoutsToLedger_[playerAddress]), "ERROR: integer underflow in updateRewardsOnSale function" );
    payoutsToLedger_[playerAddress] = updatedPayouts;
    return true;
}

//destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance
function burn(address playerAddress, uint256 amountTokens)
    internal
{
    require( playerAddress != address(0), "cannot burn tokens for zero address" );
    require( amountTokens <= tokenBalanceLedger_[ playerAddress ], "insufficient funds available" );
    //subtract tokens from player balance. performed first to prevent possibility of re-entrancy attacks
    tokenBalanceLedger_[playerAddress] = SafeMath.sub( tokenBalanceLedger_[playerAddress], amountTokens );
    //remove tokens from total supply
    totalSupply = SafeMath.sub( totalSupply, amountTokens );
    //update rewards tracker. makes sure that player can still withdraw rewards that accumulated while they were holding their sold tokens
    updateRewardsOnSale( playerAddress, amountTokens );
    //event conforms to ERC-20 standard
    emit Transfer(playerAddress, address(0), amountTokens);
  }

//sells desired amount of tokens for ether
function sell(uint256 amountTokens)
    internal
    returns (bool)
{
    require( amountTokens <= tokenBalanceLedger_[ msg.sender ], "insufficient funds available" );
    //calculates fee and net value to send to seller
    uint256 etherValue = tokensToEther( amountTokens );
    uint[2] memory feeAndValue = valueAfterFee( etherValue );
    //destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance
    //also updates reward tracker (payoutsToLedger_) for player address
    burn(msg.sender, amountTokens);
    // sends rewards to partner contract, to be distributed to its holders
    address payable buddy = partnerAddress_;
    ( bool success, bytes memory returnData ) = buddy.call.value( feeAndValue[0] )("");
    require( success, "failed to send funds to partner contract (not enough gas provided?)" );
    //sends ether to seller
    //NOTE: occurs last to avoid re-entrancy attacks
    msg.sender.transfer( feeAndValue[1] );
    return true;
}

//takes in amount and returns fee to pay on it and the value after the fee
//classified as view since needs to access state (to pull current fee rate) but not write to it
function valueAfterFee( uint amount )
    internal
    view
    returns (uint[2] memory outArray_ )
{
    outArray_[0] = SafeMath.div( SafeMath.mul(amount, _feeRate), 65536 ); //fee
    outArray_[1] = SafeMath.sub( amount , outArray_[0] ); //value after fee
    return outArray_;
}

//returns purchased number of tokens based on linear bonding curve with fee
//it's the quadratic formula stupid!
function etherToTokens(uint256 etherValue)
    internal
    view
    returns(uint256)
{
    uint256 tokenPriceInitial = TOKEN_PRICE_INITIAL * 1e18;
    uint256 _tokensReceived = 
     (
        (
            // avoids underflow
            SafeMath.sub(
                ( sqrt( 
                        ( tokenPriceInitial**2 ) +
                        ( 2 * ( TOKEN_PRICE_INCREMENT * 1e18 ) * ( etherValue * 1e18 ) ) +
                        ( ( ( TOKEN_PRICE_INCREMENT ) ** 2 ) * ( totalSupply ** 2 ) ) +
                        ( 2 * ( TOKEN_PRICE_INCREMENT ) * tokenPriceInitial * totalSupply )
                    )
                ), tokenPriceInitial )
        ) / ( TOKEN_PRICE_INCREMENT )
    ) - ( totalSupply );
  
    return _tokensReceived;
}

//returns sell value of tokens based on linear bonding curve with fee
//~inverse of etherToTokens, but with rounding down to ensure contract is always more than solvent
function tokensToEther(uint256 inputTokens)
    internal
    view
    returns(uint256)
{
    uint256 tokens = ( inputTokens + 1e18 );
    uint256 functionTotalSupply = ( totalSupply + 1e18 );
    uint256 etherReceived = (
        // avoids underflow
        SafeMath.sub(
            ( (
                ( TOKEN_PRICE_INITIAL + ( TOKEN_PRICE_INCREMENT * ( functionTotalSupply / 1e18 ) ) )
               - TOKEN_PRICE_INCREMENT )
            * ( tokens - 1e18 ) ),
            ( TOKEN_PRICE_INCREMENT * ( ( tokens ** 2 - tokens ) / 1e18 ) ) / 2 )
        / 1e18 );
    return etherReceived;
}

//manages transfers of tokens in both transfer and transferFrom functions
function transferInternal( address fromAddress, address toAddress, uint256 amountTokens )
    internal
    returns( bool )
{
    uint[2] memory feeAndValue = valueAfterFee( amountTokens ); //(token fee) and (amount of tokens after fee)
    uint256 etherRewards = tokensToEther( feeAndValue[0] );
    //destroy the tokens paid as fee
    totalSupply = SafeMath.sub(totalSupply , feeAndValue[0]);
    //emit event to reflect destruction of tokens (conforms to ERC-20 standard)
    emit Transfer(fromAddress, address(0), feeAndValue[0]);
    //remove tokens from sending address
    tokenBalanceLedger_[ fromAddress ] = SafeMath.sub( tokenBalanceLedger_[ fromAddress ], amountTokens );
    //makes sure that receiving address does not receive any rewards accumulated before they received these tokens
    updateRewardsOnPurchase( toAddress, feeAndValue[1] );
    //give tokens to receiving address
    tokenBalanceLedger_[ toAddress ] = SafeMath.add( tokenBalanceLedger_[ toAddress ], feeAndValue[1] );
    //makes sure that sender can still withdraw rewards that accumulated while they were holding their transferred tokens
    //NOTE: uses amountTokens as input since this is what the sending address sends, while receiving address gets (feeAndValue[1]) tokens
    updateRewardsOnSale( fromAddress, amountTokens );
    //send rewards to partner contract, to be distributed to its holders
    address payable buddy = partnerAddress_;
    ( bool success, bytes memory returnData ) = buddy.call.value( etherRewards )("");
    require( success, "failed to send funds to partner contract (not enough gas provided?)" );
    // emit event
    emit Transfer( fromAddress, toAddress, feeAndValue[1] );
    return true;
}

//utility for calculating (approximate) square roots. simple implementation of Babylonian method
//see: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
function sqrt(uint x)
    internal
    pure
    returns (uint y)
{
    uint z = (x + 1) / 2;
    y = x;
    while (z < y)
    {
        y = z;
        z = (x / z + z) / 2;
    }
}

//end contract
}


//MATH OPERATIONS -- designed to avoid possibility of errors with built-in math functions
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;
}

//end library
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newFeeRate","type":"uint16"}],"name":"AnnounceFeeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"address","name":"approvedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newAllowance","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"etherValue","type":"uint256"}],"name":"CashOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"etherValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"}],"name":"DoubleDown","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":"tokensTransferred","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"_feeRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_rewardsPerTokenAllTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_slushFundBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"administrator_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"}],"name":"calculateExpectedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokensToSell","type":"uint256"}],"name":"calculateExpectedWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cashOut","outputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributors_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentBuyPrice","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":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"doubleDown","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"endSetupPhase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"exchangeTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"incomingExchangeRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"makeItRain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"myRewards","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":"partnerAddress_","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"partnerSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payoutsToLedger_","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"rewardsOf","outputs":[{"internalType":"uint256","name":"playerRewards","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sellAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"amountTokens","type":"uint256"}],"name":"sellTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"partner","type":"address"}],"name":"setPartner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newSymbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"setupPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenBalanceLedger_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEtherBalance","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":"amountTokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"fromAddress","type":"address"},{"internalType":"address payable","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600881526020017f484f444c636f696e00000000000000000000000000000000000000000000000081525060009080519060200190620000519291906200034d565b506040518060400160405280600481526020017f484f444c00000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200034d565b506000600255610ccc600360006101000a81548161ffff021916908361ffff1602179055506000600455600060055533600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660146101000a81548160ff0219169083151502179055506001600660156101000a81548160ff0219169083151502179055503480156200015257600080fd5b506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c600073f7388b6a9c65bceecfaab0bed560dc229a89984873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000738da88ecac7c71edc34c742232c8d1fdc61c5f8be73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000736fa716966c81e8f907629f90352452d8f2dd0df473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003fc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039057805160ff1916838001178555620003c1565b82800160010185558215620003c1579182015b82811115620003c0578251825591602001919060010190620003a3565b5b509050620003d09190620003d4565b5090565b620003f991905b80821115620003f5576000816000905550600101620003db565b5090565b90565b6143b1806200040c6000396000f3fe60806040526004361061023b5760003560e01c806364d156401161012e578063a16d5960116100ab578063b84c82461161006f578063b84c824614610d44578063c47f002714610e0c578063d0febe4c14610ed4578063dcdfbbb914610ede578063e625d51514610f0d5761023b565b8063a16d596014610bc3578063a457c2d714610c14578063a7e1f6a214610c87578063a9059cbb14610c9e578063b2131f7d14610d115761023b565b8063949e8acd116100f2578063949e8acd14610a45578063958507eb14610a7057806395d89b4114610a9b5780639b7a629c14610b2b5780639e57ada614610b5a5761023b565b806364d15640146108ae57806365a23cca146109135780636c11bcd31461096257806370a08231146109b5578063793cd71e14610a1a5761023b565b806340477126116101bc5780634ead0590116101805780634ead0590146107515780635c5a0a9d146107ad5780635d86685a146108125780635dae4e50146108615780635f5ad897146108835761023b565b8063404771261461061857806342a7afe21461066b57806345fd71e114610696578063479ba7ae146106c15780634b750334146107265761023b565b806316e457f01161020357806316e457f01461048757806318160ddd146104b657806323b872dd146104e1578063313ce5671461057457806339509351146105a55761023b565b806305a051eb146102ad57806306fdde031461030457806307410b5b14610394578063095ea7b3146103fd5780630afc2c2814610470575b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561029f57610299610f38565b506102ab565b6102a93334611058565b505b005b3480156102b957600080fd5b506102c26113f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031057600080fd5b5061031961141e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035957808201518184015260208101905061033e565b50505050905090810190601f1680156103865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a057600080fd5b506103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114bc565b604051808215151515815260200191505060405180910390f35b34801561040957600080fd5b506104566004803603604081101561042057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114dc565b604051808215151515815260200191505060405180910390f35b34801561047c57600080fd5b506104856115ce565b005b34801561049357600080fd5b5061049c611694565b604051808215151515815260200191505060405180910390f35b3480156104c257600080fd5b506104cb6116f5565b6040518082815260200191505060405180910390f35b3480156104ed57600080fd5b5061055a6004803603606081101561050457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116fb565b604051808215151515815260200191505060405180910390f35b34801561058057600080fd5b50610589611a21565b604051808260ff1660ff16815260200191505060405180910390f35b3480156105b157600080fd5b506105fe600480360360408110156105c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a26565b604051808215151515815260200191505060405180910390f35b34801561062457600080fd5b506106516004803603602081101561063b57600080fd5b8101908080359060200190929190505050611ba8565b604051808215151515815260200191505060405180910390f35b34801561067757600080fd5b50610680611f68565b6040518082815260200191505060405180910390f35b3480156106a257600080fd5b506106ab611f78565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b50610710600480360360208110156106e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061201e565b6040518082815260200191505060405180910390f35b34801561073257600080fd5b5061073b6120c1565b6040518082815260200191505060405180910390f35b6107936004803603602081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061215f565b604051808215151515815260200191505060405180910390f35b3480156107b957600080fd5b506107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b34801561081e57600080fd5b5061084b6004803603602081101561083557600080fd5b810190808035906020019092919050505061233d565b6040518082815260200191505060405180910390f35b610869610f38565b604051808215151515815260200191505060405180910390f35b34801561088f57600080fd5b50610898612373565b6040518082815260200191505060405180910390f35b3480156108ba57600080fd5b506108fd600480360360208110156108d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b6040518082815260200191505060405180910390f35b34801561091f57600080fd5b5061094c6004803603602081101561093657600080fd5b8101908080359060200190929190505050612391565b6040518082815260200191505060405180910390f35b34801561096e57600080fd5b5061099b6004803603602081101561098557600080fd5b8101908080359060200190929190505050612423565b604051808215151515815260200191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124ed565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a2f612536565b6040518082815260200191505060405180910390f35b348015610a5157600080fd5b50610a5a612670565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610a856126b7565b6040518082815260200191505060405180910390f35b348015610aa757600080fd5b50610ab06126bd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610af0578082015181840152602081019050610ad5565b50505050905090810190601f168015610b1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b3757600080fd5b50610b4061275b565b604051808215151515815260200191505060405180910390f35b348015610b6657600080fd5b50610ba960048036036020811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061276e565b604051808215151515815260200191505060405180910390f35b348015610bcf57600080fd5b50610c1260048036036020811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061278e565b005b348015610c2057600080fd5b50610c6d60048036036040811015610c3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506128b3565b604051808215151515815260200191505060405180910390f35b348015610c9357600080fd5b50610c9c612a35565b005b348015610caa57600080fd5b50610cf760048036036040811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b3f565b604051808215151515815260200191505060405180910390f35b348015610d1d57600080fd5b50610d26612c96565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5057600080fd5b50610e0a60048036036020811015610d6757600080fd5b8101908080359060200190640100000000811115610d8457600080fd5b820183602082011115610d9657600080fd5b80359060200191846001830284011164010000000083111715610db857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612caa565b005b348015610e1857600080fd5b50610ed260048036036020811015610e2f57600080fd5b8101908080359060200190640100000000811115610e4c57600080fd5b820183602082011115610e5e57600080fd5b80359060200191846001830284011164010000000083111715610e8057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d6d565b005b610edc612e30565b005b348015610eea57600080fd5b50610ef3612e3d565b604051808215151515815260200191505060405180910390f35b348015610f1957600080fd5b50610f22612e50565b6040518082815260200191505060405180910390f35b6000806005541415610f95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140806035913960400191505060405180910390fd5b60003490506000610faf8268010000000000000000612e6f565b90506000610fbf82600554612ea6565b9050610fcd60045482612ebf565b600481905550610fdc83612edb565b61104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6001935050505090565b600081600660159054906101000a900460ff16156112565760011515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806141696030913960400191505060405180910390fd5b6000611164600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612ebf565b90506722b1c8c1227a00008111156111c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806141bc603e913960400191505060405180910390fd5b6753444835ec580000823073ffffffffffffffffffffffffffffffffffffffff163101116112385780600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611254565b6000600660156101000a81548160ff0219169083151502179055505b505b61125e613f85565b61126784612f70565b905060006112858260016002811061127b57fe5b6020020151612ff1565b90506005546005548201116112e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061431d6025913960400191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168560006002811061133457fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461137f576040519150601f19603f3d011682016040523d82523d6000602084013e611384565b606091505b5091509150816113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b6113e98985613078565b83965050505050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b505050505081565b600c6020528060005260406000206000915054906101000a900460ff1681565b600081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b6000600660156101000a81548160ff021916908315150217905550565b600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116ed576116eb81613211565b505b600191505090565b60055481565b6000838280600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061426a6030913960400191505060405180910390fd5b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111580156118305750600660159054906101000a900460ff16155b611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006119128287613452565b905080600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119a0888888613469565b611a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b60019450505050509392505050565b601281565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000611ab48285612ebf565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015611c065750600660159054906101000a900460ff16155b611c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000611c66836137f5565b90506000611c976002600360009054906101000a900461ffff1661ffff16840281611c8d57fe5b0462010000612ea6565b90506000611ca58383613452565b9050611cb13386613896565b6000611cc68368010000000000000000612e6f565b90506000611cd682600554612ea6565b9050611ce460045482612ebf565b600481905550611cf384612edb565b611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168633604051602401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506040516020818303038152906040527f4ead0590000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310611e955780518252602082019150602081019050602083039250611e72565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ef7576040519150601f19603f3d011682016040523d82523d6000602084013e611efc565b606091505b509150915081611f57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b600198505050505050505050919050565b6000611f733361201e565b905090565b6000806005541415611fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000611fe8670de0b6b3a76400006137f5565b9050611ff2613f85565b611ffb82612f70565b905060008160006002811061200c57fe5b60200201518301905080935050505090565b600068010000000000000000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546004540203816120b657fe5b059050809050919050565b600080600554141561211e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000612131670de0b6b3a76400006137f5565b905061213b613f85565b61214482612f70565b90508060016002811061215357fe5b60200201519250505090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140b56038913960400191505060405180910390fd5b6000349050600061223b6002600360009054906101000a900461ffff1661ffff1684028161223157fe5b0462010000612ea6565b905060006122498383613452565b905060006122608368010000000000000000612e6f565b9050600061227082600554612ea6565b905061227e60045482612ebf565b60048190555061228d84612edb565b6122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b600061230a84612ff1565b90506123168882613078565b60019650505050505050919050565b60076020528060005260406000206000915090505481565b60008061234983612f70565b60016002811061235557fe5b60200201519050600061236782612ff1565b90508092505050919050565b60045481565b60086020528060005260406000206000915090505481565b60006005548211156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806141256044913960600191505060405180910390fd5b60006123f9836137f5565b9050600061240682612f70565b60016002811061241257fe5b602002015190508092505050919050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156124da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b6124e382613211565b5060019050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006125413361201e565b905061254d3382613ae4565b5080600260008282540392505081905550612566613c24565b6125d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561261e573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fab933177d8753a66dd869151cf9aa88649e067b7a4e2dad9d5d192d61cf593b0826040518082815260200191505060405180910390a290565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60025481565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127535780601f1061272857610100808354040283529160200191612753565b820191906000526020600020905b81548152906001019060200180831161273657829003601f168201915b505050505081565b600660149054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b60001515600660149054906101000a900460ff16151514156128b05780600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600660146101000a81548160ff0219169083151502179055505b50565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006129418285613452565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000612a403361201e565b9050612a4c3382613ae4565b5080600260008282540392505081905550612a65613c24565b612ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b6000612ae33383611058565b90503373ffffffffffffffffffffffffffffffffffffffff167f4de94b39625248a5696f0c1f78680ee8dad819ce02dc53b3b5ed5db8d95cd3d88383604051808381526020018281526020019250505060405180910390a25050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015612b9d5750600660159054906101000a900460ff16155b612c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e73666572206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b612c1a338484613469565b612c8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b6001905092915050565b600360009054906101000a900461ffff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612d53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060019080519060200190612d69929190613fa7565b5050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060009080519060200190612e2c929190613fa7565b5050565b612e3a3334611058565b50565b600660159054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080831415612e825760009050612ea0565b6000828402905082848281612e9357fe5b0414612e9b57fe5b809150505b92915050565b600080828481612eb257fe5b0490508091505092915050565b600080828401905083811015612ed157fe5b8091505092915050565b600081600260008282540192505081905550612ef5613c24565b612f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b60019050919050565b612f78613f85565b612fa2612f9983600360009054906101000a900461ffff1661ffff16612e6f565b62010000612ea6565b81600060028110612faf57fe5b602002018181525050612fd38282600060028110612fc957fe5b6020020151613452565b81600160028110612fe057fe5b602002018181525050809050919050565b600080670de0b6b3a764000064e8d4a510000290506000600554633b9aca0061306361305d60055486633b9aca00600202020260026005540a6002633b9aca000a02670de0b6b3a76400008a02670de0b6b3a7640000633b9aca0002600202026002890a010101613cce565b85613452565b8161306a57fe5b040390508092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061429a6023913960400191505060405180910390fd5b61310a60055482612ebf565b60058190555061311a8282613d13565b50613164600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482612ebf565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156132c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b60006132d3836137f5565b90506132dd613f85565b6132e682612f70565b90506132f23385613896565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460006002811061334157fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b5091509150816133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc8560016002811061341357fe5b60200201519081150290604051600060405180830381858888f19350505050158015613443573d6000803e3d6000fd5b50600195505050505050919050565b60008282111561345e57fe5b818303905092915050565b6000613473613f85565b61347c83612f70565b9050600061349a8260006002811061349057fe5b60200201516137f5565b90506134b9600554836000600281106134af57fe5b6020020151613452565b600581905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460006002811061351c57fe5b60200201516040518082815260200191505060405180910390a361357f600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485613452565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135dd85836001600281106135d357fe5b6020020151613d13565b50613638600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548360016002811061362e57fe5b6020020151612ebf565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136858685613e4c565b506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460405180600001905060006040518083038185875af1925050503d806000811461370f576040519150601f19603f3d011682016040523d82523d6000602084013e613714565b606091505b50915091508161376f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876001600281106137cb57fe5b60200201516040518082815260200191505060405180910390a36001955050505050509392505050565b600080670de0b6b3a7640000830190506000670de0b6b3a76400006005540190506000670de0b6b3a7640000613881670de0b6b3a76400008503633b9aca00670de0b6b3a7640000868161384557fe5b04633b9aca000264e8d4a510000103026002670de0b6b3a7640000876002890a038161386d57fe5b04633b9aca00028161387b57fe5b04613452565b8161388857fe5b049050809350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561391c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141996023913960400191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156139d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b613a1a600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613452565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a6960055482613452565b600581905550613a798282613e4c565b50600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080613afa8368010000000000000000612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142bd6036913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b600080610ccd61ffff166703782dace9d9000060025481613c4157fe5b0602905060006703782dace9d900008281613c5857fe5b04905060008161ffff16610ccc01905080600360006101000a81548161ffff021916908361ffff1602179055507fc2cc2ca038d89e4eb3ed987815f876e8e6aaee289e7be6e8d951d2424930763e81604051808261ffff1661ffff16815260200191505060405180910390a16001935050505090565b60008060026001840181613cde57fe5b0490508291505b81811015613d0d57809150600281828581613cfc57fe5b040181613d0557fe5b049050613ce5565b50919050565b600080613d2260045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180614342603b913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b600080613e5b60045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054039050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811315613f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140ed6038913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b6040518060400160405280600290602082028038833980820191505090505090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fe857805160ff1916838001178555614016565b82800160010185558215614016579182015b82811115614015578251825591602001919060010190613ffa565b5b5090506140239190614027565b5090565b61404991905b8082111561404557600081600090555060010161402d565b5090565b9056fe7472616e73666572206e6f7420616c6c6f776564202d20696e73756666696369656e742066756e647320617661696c61626c656d616b6549745261696e2066756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29746869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520706172746e657220636f6e74726163744552524f523a20696e746567657220756e646572666c6f7720696e20757064617465526577617264734f6e53616c652066756e6374696f6e756e61626c6520746f2063616c63756c61746520666f7220616d6f756e74206f6620746f6b656e732067726561746572207468616e2063757272656e7420737570706c797075726368617365732063757272656e746c79206c696d69746564206f6e6c7920746f20636f6e7472696275746f727363616e6e6f74206275726e20746f6b656e7320666f72207a65726f2061646472657373617474656d7074656420707572636861736520776f756c6420657863656564206c696d697420706c616365642075706f6e20636f6e7472696275746f727366756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920636f6e74726163742061646d696e6661696c656420746f2073656e642066756e647320746f20706172746e657220636f6e747261637420286e6f7420656e6f756768206761732070726f76696465643f297472616e73666572206e6f7420617574686f72697a65642028616c6c6f77616e636520696e73756666696369656e742963616e6e6f74206d696e7420746f6b656e7320666f72207a65726f20616464726573734552524f523a20696e7465676572206f766572666c6f7720696e207570646174655370656e74526577617264732066756e6374696f6e66756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29707572636861736520776f756c6420636175736520696e7465676572206f766572666c6f774552524f523a20696e7465676572206f766572666c6f7720696e20757064617465526577617264734f6e50757263686173652066756e6374696f6ea265627a7a723158207a6a564f853bd5657c03a36e334d8a0a2abb15815a6c2246b2d8952c3dc202be64736f6c634300050c0032

Deployed ByteCode Sourcemap

204:34508:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5295:15;;;;;;;;;;;5281:29;;:10;:29;;;5276:219;;;5411:12;:10;:12::i;:::-;;5276:219;;;5447:39;5463:10;5475:9;5447:14;:39::i;:::-;;5276:219;204:34508;2151:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2151:51:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1471:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1471:31: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;1471:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3135:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3135:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3135:45:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9738:245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9738:245:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9738:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17340:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17340:92:0;;;:::i;:::-;;7863:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7863:186:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1921:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1921:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12202:877;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12202:877:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12202:877:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1411:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1411:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10402:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10402:398:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10402:398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13257:1814;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13257:1814:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13257:1814:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20724:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20724:112:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18458:537;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18458:537:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22438:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22438:298:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22438:298:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18001:397;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18001:397:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15244:1290;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15244:1290:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2554:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2554:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2554:54:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19290:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19290:252:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19290:252:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21498:649;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1758:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1758:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2629:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2629:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2629:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19869:446;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19869:446:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19869:446:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8298:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8298:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8298:223:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21072:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21072:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21072:153:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7010:694;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7010:694:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20550:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20550:116:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1591:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1591:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1505:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1505:29: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;1505:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2205:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2205:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3086:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3086:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3086:46:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16933:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16933:193:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16933:193:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11219:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11219:398:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11219:398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6097:717;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6097:717:0;;;:::i;:::-;;8825:499;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8825:499:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8825:499:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1667:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1667:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17757:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17757:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17757:113:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17757:113:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17757:113: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;17757:113: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;;17757:113:0;;;;;;;;;;;;;;;:::i;:::-;;17539:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17539:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17539:105:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17539:105:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17539:105: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;17539:105: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;;17539:105:0;;;;;;;;;;;;;;;:::i;:::-;;5734:99;;;:::i;:::-;;2481:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2481:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20372:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20372:112:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21498:649;21558:4;21625:1;21610:11;;:16;;21602:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21691:19;21713:9;21691:31;;21729:20;21752:39;21766:11;455:5;21752:12;:39::i;:::-;21729:62;;21798:33;21834:42;21848:12;21863:11;;21834:12;:42::i;:::-;21798:78;;21909:67;21923:23;;21949:25;21909:12;:67::i;:::-;21883:23;:93;;;;22057:30;22074:11;22057:15;:30::i;:::-;22048:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22139:4;22132:11;;;;;21498:649;:::o;26565:1119::-;26798:7;26753:10;25538;;;;;;;;;;;25533:959;;;25654:4;25623:35;;:13;:27;25638:10;25623:27;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;25614:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25793:24;25820:73;25834:29;:43;25865:10;25834:43;;;;;;;;;;;;;;;;25880:11;25820:12;:73::i;:::-;25793:100;;921:5;25913:16;:44;;25904:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;861:4;26130:11;26114:4;26106:21;;;:35;26104:54;26099:386;;26272:16;26226:29;:43;26257:10;26226:43;;;;;;;;;;;;;;;:62;;;;26099:386;;;26468:5;26455:10;;:18;;;;;;;;;;;;;;;;;;26099:386;25533:959;;26846:26;;:::i;:::-;26875:27;26890:10;26875:13;:27::i;:::-;26846:56;;26968:20;26991:31;27006:11;27018:1;27006:14;;;;;;;;;;;26991:13;:31::i;:::-;26968:54;;27101:11;;27086;;27071:12;:26;27070:42;27058:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27238:21;27262:15;;;;;;;;;;;27238:39;;27286:12;27300:23;27328:5;:10;;27346:11;27358:1;27346:14;;;;;;;;;;;27328:38;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;27284:82:0;;;;27382:7;27373:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27616:35;27622:13;27637:12;27616:4;:35::i;:::-;27666:12;27658:22;;;;;;;26565:1119;;;;;:::o;2151:51::-;;;;;;;;;;;;;:::o;1471:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3135:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;9738:245::-;9831:4;9886:12;9845:9;:21;9855:10;9845:21;;;;;;;;;;;;;;;:38;9867:15;9845:38;;;;;;;;;;;;;;;:53;;;;9931:15;9910:51;;9919:10;9910:51;;;9948:12;9910:51;;;;;;;;;;;;;;;;;;9975:4;9968:11;;9738:245;;;;:::o;17340:92::-;16736:4;16704:36;;:14;:28;16720:10;16704:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16695:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17423:5;17410:10;;:18;;;;;;;;;;;;;;;;;;17340:92::o;7863:186::-;7910:4;7924:14;7941:19;:31;7961:10;7941:31;;;;;;;;;;;;;;;;7924:48;;7993:1;7984:6;:10;7979:49;;;8008:12;8013:6;8008:4;:12::i;:::-;;7979:49;8041:4;8034:11;;;7863:186;:::o;1921:30::-;;;;:::o;12202:877::-;12385:4;12329:11;12343:12;11748;11710:9;:22;11720:11;11710:22;;;;;;;;;;;;;;;:34;11733:10;11710:34;;;;;;;;;;;;;;;;:50;;11701:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12525:19;:34;12546:11;12525:34;;;;;;;;;;;;;;;;12509:12;:50;;:65;;;;;12564:10;;;;;;;;;;;12563:11;12509:65;12498:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12697:21;12721:9;:22;12731:11;12721:22;;;;;;;;;;;;;;;:34;12744:10;12721:34;;;;;;;;;;;;;;;;12697:58;;12762:20;12785:44;12799:13;12815:12;12785;:44::i;:::-;12762:67;;12873:12;12836:9;:22;12846:11;12836:22;;;;;;;;;;;;;;;:34;12859:10;12836:34;;;;;;;;;;;;;;;:49;;;;12937:56;12955:11;12968:9;12979:12;12937:16;:56::i;:::-;12928:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13071:4;13064:11;;;;12202:877;;;;;;;:::o;1411:35::-;1444:2;1411:35;:::o;10402:398::-;10505:4;10519:21;10543:9;:21;10553:10;10543:21;;;;;;;;;;;;;;;:38;10565:15;10543:38;;;;;;;;;;;;;;;;10519:62;;10588:20;10611:44;10625:13;10641:12;10611;:44::i;:::-;10588:67;;10703:12;10662:9;:21;10672:10;10662:21;;;;;;;;;;;;;;;:38;10684:15;10662:38;;;;;;;;;;;;;;;:53;;;;10748:15;10727:51;;10736:10;10727:51;;;10765:12;10727:51;;;;;;;;;;;;;;;;;;10792:4;10785:11;;;;10402:398;;;;:::o;13257:1814::-;13332:4;13472:19;:33;13493:10;13472:33;;;;;;;;;;;;;;;;13456:12;:49;;:64;;;;;13510:10;;;;;;;;;;;13509:11;13456:64;13445:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13694:19;13716:29;13731:12;13716:13;:29::i;:::-;13694:51;;13752:11;13766:54;13807:1;13796:8;;;;;;;;;;;13782:22;;:11;:22;:26;;;;;;13813:5;13766:12;:54::i;:::-;13752:68;;13833:21;13857:33;13871:11;13885:3;13857:12;:33::i;:::-;13833:57;;14101:30;14106:10;14118:12;14101:4;:30::i;:::-;14208:20;14231:31;14245:3;455:5;14231:12;:31::i;:::-;14208:54;;14269:33;14305:42;14319:12;14334:11;;14305:12;:42::i;:::-;14269:78;;14380:67;14394:23;;14420:25;14380:12;:67::i;:::-;14354:23;:93;;;;14528:22;14545:3;14528:15;:22::i;:::-;14519:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14683:21;14707:15;;;;;;;;;;;14683:39;;14731:12;14745:23;14773:5;:10;;14791:13;14867:10;14807:71;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14807:71:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;14807:71:0;14773:106;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14773:106:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;14729:150:0;;;;14965:7;14956:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15059:4;15052:11;;;;;;;;;;13257:1814;;;:::o;20724:112::-;20785:7;20809:23;20820:10;20809:9;:23::i;:::-;20802:30;;20724:112;:::o;18458:537::-;18523:7;18594:1;18579:11;;:16;;18571:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18723:18;18744:21;18759:4;18744:13;:21::i;:::-;18723:42;;18772:26;;:::i;:::-;18801:27;18816:10;18801:13;:27::i;:::-;18772:56;;18921:17;18954:11;18966:1;18954:14;;;;;;;;;;;18941:10;:27;18921:47;;18982:9;18975:16;;;;;18458:537;:::o;22438:298::-;22517:21;501:5;22655:16;:33;22673:13;22655:33;;;;;;;;;;;;;;;;22614:19;:36;22635:13;22614:36;;;;;;;;;;;;;;;;22588:23;;:62;22578:110;22576:127;;;;;;22548:157;;22719:13;22712:20;;22438:298;;;:::o;18001:397::-;18060:7;18131:1;18116:11;;:16;;18108:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18261:18;18282:21;18297:4;18282:13;:21::i;:::-;18261:42;;18310:26;;:::i;:::-;18339:27;18354:10;18339:13;:27::i;:::-;18310:56;;18380:11;18392:1;18380:14;;;;;;;;;;;18373:21;;;;18001:397;:::o;15244:1290::-;15342:4;15380:15;;;;;;;;;;;15366:29;;:10;:29;;;15356:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15573:19;15595:9;15573:31;;15611:11;15625:54;15666:1;15655:8;;;;;;;;;;;15641:22;;:11;:22;:26;;;;;;15672:5;15625:12;:54::i;:::-;15611:68;;15692:21;15716:33;15730:11;15744:3;15716:12;:33::i;:::-;15692:57;;15844:20;15867:31;15881:3;455:5;15867:12;:31::i;:::-;15844:54;;15905:33;15941:42;15955:12;15970:11;;15941:12;:42::i;:::-;15905:78;;16016:67;16030:23;;16056:25;16016:12;:67::i;:::-;15990:23;:93;;;;16164:22;16181:3;16164:15;:22::i;:::-;16155:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16270:20;16293:30;16308:13;16293;:30::i;:::-;16270:53;;16477:35;16483:13;16498:12;16477:4;:35::i;:::-;16526:4;16519:11;;;;;;;;15244:1290;;;:::o;2554:54::-;;;;;;;;;;;;;;;;;:::o;19290:252::-;19381:7;19398:21;19422:27;19437:10;19422:13;:27::i;:::-;19450:1;19422:30;;;;;;;;;;;19398:54;;19459:20;19482:30;19497:13;19482;:30::i;:::-;19459:53;;19526:12;19519:19;;;;19290:252;;;:::o;1758:42::-;;;;:::o;2629:50::-;;;;;;;;;;;;;;;;;:::o;19869:446::-;19959:7;20001:11;;19985:12;:27;;19976:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20139:18;20160:29;20175:12;20160:13;:29::i;:::-;20139:50;;20230:21;20254:27;20269:10;20254:13;:27::i;:::-;20282:1;20254:30;;;;;;;;;;;20230:54;;20298:13;20291:20;;;;19869:446;;;:::o;8298:223::-;8370:4;8409:19;:31;8429:10;8409:31;;;;;;;;;;;;;;;;8393:12;:47;;8384:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8481:18;8486:12;8481:4;:18::i;:::-;;8513:4;8506:11;;8298:223;;;:::o;21072:153::-;21153:15;21186:19;:34;21206:13;21186:34;;;;;;;;;;;;;;;;21178:43;;21072:153;;;:::o;7010:694::-;7057:18;7150:23;7161:10;7150:9;:23::i;:::-;7137:36;;7286:44;7306:10;7319;7286:18;:44::i;:::-;;7396:10;7375:17;;:31;;;;;;;;;;;7422:13;:11;:13::i;:::-;7413:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7510:10;:19;;:33;7531:10;7510:33;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7510:33:0;7676:10;7667:33;;;7688:10;7667:33;;;;;;;;;;;;;;;;;;7010:694;:::o;20550:116::-;20607:7;20631:19;:31;20651:10;20631:31;;;;;;;;;;;;;;;;20624:38;;20550:116;:::o;1591:36::-;;;;:::o;1505:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2205:30::-;;;;;;;;;;;;;:::o;3086:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;16933:193::-;16736:4;16704:36;;:14;:28;16720:10;16704:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16695:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17043:5;17029:19;;:10;;;;;;;;;;;:19;;;17024:99;;;17080:7;17062:15;;:25;;;;;;;;;;;;;;;;;;17111:4;17098:10;;:17;;;;;;;;;;;;;;;;;;17024:99;16933:193;:::o;11219:398::-;11322:4;11336:21;11360:9;:21;11370:10;11360:21;;;;;;;;;;;;;;;:38;11382:15;11360:38;;;;;;;;;;;;;;;;11336:62;;11405:20;11428:44;11442:13;11458:12;11428;:44::i;:::-;11405:67;;11520:12;11479:9;:21;11489:10;11479:21;;;;;;;;;;;;;;;:38;11501:15;11479:38;;;;;;;;;;;;;;;:53;;;;11565:15;11544:51;;11553:10;11544:51;;;11582:12;11544:51;;;;;;;;;;;;;;;;;;11609:4;11602:11;;;;11219:398;;;;:::o;6097:717::-;6193:18;6214:23;6225:10;6214:9;:23::i;:::-;6193:44;;6350;6370:10;6383;6350:18;:44::i;:::-;;6460:10;6439:17;;:31;;;;;;;;;;;6486:13;:11;:13::i;:::-;6477:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6578:17;6598:39;6613:10;6626;6598:14;:39::i;:::-;6578:59;;6775:10;6764:46;;;6787:10;6800:9;6764:46;;;;;;;;;;;;;;;;;;;;;;;;6097:717;;:::o;8825:499::-;8914:4;9057:19;:33;9078:10;9057:33;;;;;;;;;;;;;;;;9041:12;:49;;:64;;;;;9095:10;;;;;;;;;;;9094:11;9041:64;9030:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9185:55;9203:10;9215:9;9226:12;9185:16;:55::i;:::-;9176:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9316:4;9309:11;;8825:499;;;;:::o;1667:42::-;;;;;;;;;;;;;:::o;17757:113::-;16736:4;16704:36;;:14;:28;16720:10;16704:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16695:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17857:9;17848:6;:18;;;;;;;;;;;;:::i;:::-;;17757:113;:::o;17539:105::-;16736:4;16704:36;;:14;:28;16720:10;16704:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16695:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17633:7;17626:4;:14;;;;;;;;;;;;:::i;:::-;;17539:105;:::o;5734:99::-;5790:39;5806:10;5818:9;5790:14;:39::i;:::-;;5734:99::o;2481:29::-;;;;;;;;;;;;;:::o;20372:112::-;20438:4;20467;20459:21;;;20452:28;;20372:112;:::o;34884:180::-;34942:7;34967:1;34962;:6;34958:39;;;34988:1;34981:8;;;;34958:39;35003:9;35019:1;35015;:5;35003:17;;35043:1;35038;35034;:5;;;;;;:10;35027:18;;;;35059:1;35052:8;;;34884:180;;;;;:::o;35134:268::-;35192:7;35283:9;35299:1;35295;:5;;;;;;35283:17;;35397:1;35390:8;;;35134:268;;;;:::o;35664:131::-;35722:7;35738:9;35754:1;35750;:5;35738:17;;35774:1;35769;:6;;35762:14;;;;35790:1;35783:8;;;35664:131;;;;:::o;23312:206::-;23387:4;23422:11;23401:17;;:32;;;;;;;;;;;23449:13;:11;:13::i;:::-;23440:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23510:4;23503:11;;23312:206;;;:::o;30522:289::-;30598:24;;:::i;:::-;30648:53;30662:30;30675:6;30683:8;;;;;;;;;;;30662:30;;:12;:30::i;:::-;30694:5;30648:12;:53::i;:::-;30633:9;30643:1;30633:12;;;;;;;;;;:68;;;;;30729:37;30743:6;30752:9;30762:1;30752:12;;;;;;;;;;;30729;:37::i;:::-;30714:9;30724:1;30714:12;;;;;;;;;;:52;;;;;30798:9;30791:16;;30522:289;;;:::o;30930:779::-;31010:7;31027:25;31077:4;1113:14;31055:26;31027:54;;31088:23;31659:11;;1308:17;31180:428;31213:355;31532:11;;31512:17;1308;31480:1;:29;:49;:63;31445:1;31430:11;;:16;31422:1;1308:17;31393:30;31391:57;31353:4;31340:10;:17;31329:4;1308:17;31305:28;31299:1;:36;:60;31266:1;31247:17;:20;31245:116;:205;:300;31213:4;:355::i;:::-;31589:17;31180:12;:428::i;:::-;31132:515;;;;;;31121:551;31088:584;;31690:15;31683:22;;;;30930:779;;;:::o;24678:703::-;24793:1;24768:27;;:13;:27;;;;24759:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24857:41;24871:11;;24884:12;24857;:41::i;:::-;24843:11;:55;;;;25036:54;25061:13;25076:12;25036:23;:54::i;:::-;;25210:65;25224:19;:34;25244:13;25224:34;;;;;;;;;;;;;;;;25261:12;25210;:65::i;:::-;25173:19;:34;25193:13;25173:34;;;;;;;;;;;;;;;:102;;;;25349:13;25328:49;;25345:1;25328:49;;;25364:12;25328:49;;;;;;;;;;;;;;;;;;24678:703;;:::o;29322:1023::-;29386:4;29425:19;:33;29446:10;29425:33;;;;;;;;;;;;;;;;29409:12;:49;;29400:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29553:18;29574:29;29589:12;29574:13;:29::i;:::-;29553:50;;29610:26;;:::i;:::-;29639:27;29654:10;29639:13;:27::i;:::-;29610:56;;29859:30;29864:10;29876:12;29859:4;:30::i;:::-;29972:21;29996:15;;;;;;;;;;;29972:39;;30020:12;30034:23;30062:5;:10;;30080:11;30092:1;30080:14;;;;;;;;;;;30062:38;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;30018:82:0;;;;30116:7;30107:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30286:10;:19;;:37;30307:11;30319:1;30307:14;;;;;;;;;;;30286:37;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30286:37:0;30337:4;30330:11;;;;;;;29322:1023;;;:::o;35503:111::-;35561:7;35589:1;35584;:6;;35577:14;;;;35609:1;35605;:5;35598:12;;35503:111;;;;:::o;32572:1736::-;32690:4;32705:26;;:::i;:::-;32734:29;32749:12;32734:13;:29::i;:::-;32705:58;;32817:20;32840:31;32855:11;32867:1;32855:14;;;;;;;;;;;32840:13;:31::i;:::-;32817:54;;32930:42;32943:11;;32957;32969:1;32957:14;;;;;;;;;;;32930:12;:42::i;:::-;32916:11;:56;;;;33095:1;33065:49;;33074:11;33065:49;;;33099:11;33111:1;33099:14;;;;;;;;;;;33065:49;;;;;;;;;;;;;;;;;;33200:64;33214:19;:34;33235:11;33214:34;;;;;;;;;;;;;;;;33250:12;33200;:64::i;:::-;33163:19;:34;33184:11;33163:34;;;;;;;;;;;;;;;:101;;;;33387:52;33412:9;33423:11;33435:1;33423:14;;;;;;;;;;;33387:23;:52::i;:::-;;33521:64;33535:19;:32;33556:9;33535:32;;;;;;;;;;;;;;;;33569:11;33581:1;33569:14;;;;;;;;;;;33521:12;:64::i;:::-;33486:19;:32;33507:9;33486:32;;;;;;;;;;;;;;;:99;;;;33854:48;33875:11;33888:12;33854:19;:48::i;:::-;;33983:21;34007:15;;;;;;;;;;;33983:39;;34031:12;34045:23;34073:5;:10;;34091:12;34073:36;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;34029:80:0;;;;34125:7;34116:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34259:9;34236:50;;34246:11;34236:50;;;34270:11;34282:1;34270:14;;;;;;;;;;;34236:50;;;;;;;;;;;;;;;;;;34300:4;34293:11;;;;;;;32572:1736;;;;;:::o;31884:609::-;31965:7;31982:14;32015:4;32001:11;:18;31982:39;;32028:27;32074:4;32060:11;;:18;32028:52;;32087:21;32456:4;32151:293;32352:4;32343:6;:13;1308:17;32273:4;32251:19;:26;;;;;;1308:17;32225:54;1113:14;32201:80;32199:124;32180:178;32441:1;32430:4;32419:6;32415:1;32405:6;:11;:20;32403:31;;;;;;1308:17;32377:59;32375:67;;;;;;32151:12;:293::i;:::-;:309;;;;;;32087:375;;32476:13;32469:20;;;;;31884:609;;;:::o;28394:880::-;28509:1;28484:27;;:13;:27;;;;28475:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28584:19;:36;28605:13;28584:36;;;;;;;;;;;;;;;;28568:12;:52;;28559:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28804:64;28818:19;:34;28838:13;28818:34;;;;;;;;;;;;;;;;28854:12;28804;:64::i;:::-;28767:19;:34;28787:13;28767:34;;;;;;;;;;;;;;;:101;;;;28928:41;28942:11;;28955:12;28928;:41::i;:::-;28914:11;:55;;;;29116:50;29137:13;29152:12;29116:19;:50::i;:::-;;29251:1;29219:49;;29228:13;29219:49;;;29255:12;29219:49;;;;;;;;;;;;;;;;;;28394:880;;:::o;23584:424::-;23684:4;23698:21;23765:37;23779:10;455:5;23765:12;:37::i;:::-;23722:16;:31;23739:13;23722:31;;;;;;;;;;;;;;;;:82;23698:106;;23839:16;:31;23856:13;23839:31;;;;;;;;;;;;;;;;23821:14;:49;;23811:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23972:14;23938:16;:31;23955:13;23938:31;;;;;;;;;;;;;;;:48;;;;24000:4;23993:11;;;23584:424;;;;:::o;22818:429::-;22868:4;22882:16;661:4;22903:51;;585:9;22904:17;;:34;;;;;;22903:51;22882:74;;22963:20;585:9;22994:11;:28;;;;;;22963:61;;23031:17;23071:13;23059:25;;727:4;23059:25;23031:55;;23149:10;23138:8;;:21;;;;;;;;;;;;;;;;;;23195:29;23212:10;23195:29;;;;;;;;;;;;;;;;;;;;;;23238:4;23231:12;;;;;22818:429;:::o;34500:191::-;34560:6;34576;34595:1;34590;34586;:5;34585:11;;;;;;34576:20;;34607:1;34603:5;;34615:73;34626:1;34622;:5;34615:73;;;34649:1;34645:5;;34679:1;34674;34670;34666;:5;;;;;;:9;34665:15;;;;;;34661:19;;34615:73;;;34500:191;;;;:::o;24148:456::-;24255:4;24269:21;24336:53;24350:23;;24375:12;24336;:53::i;:::-;24293:16;:31;24310:13;24293:31;;;;;;;;;;;;;;;;:98;24269:122;;24426:16;:31;24443:13;24426:31;;;;;;;;;;;;;;;;24408:14;:49;;24398:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24564:14;24530:16;:31;24547:13;24530:31;;;;;;;;;;;;;;;:48;;;;24596:4;24589:11;;;24148:456;;;;:::o;27836:445::-;27939:4;27953:21;28020:53;28034:23;;28059:12;28020;:53::i;:::-;27977:16;:31;27994:13;27977:31;;;;;;;;;;;;;;;;:98;27953:122;;28110:16;:31;28127:13;28110:31;;;;;;;;;;;;;;;;28092:14;:49;;28082:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28245:14;28211:16;:31;28228:13;28211:31;;;;;;;;;;;;;;;:48;;;;28273:4;28266:11;;;27836:445;;;;:::o;204:34508::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;204:34508:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://7a6a564f853bd5657c03a36e334d8a0a2abb15815a6c2246b2d8952c3dc202be
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.