ETH Price: $2,043.96 (+1.29%)

Contract

0x2980b7C0c8E1a2c0BdECFf55CDE9E3576aAF9EaF
 

Overview

ETH Balance

0.000014703357749678 ETH

Eth Value

$0.03 (@ $2,043.96/ETH)

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve109246392020-09-24 9:57:461994 days ago1600941466IN
0x2980b7C0...76aAF9EaF
0 ETH0.0030847670
Withdraw109246362020-09-24 9:57:091994 days ago1600941429IN
0x2980b7C0...76aAF9EaF
0 ETH0.013188975
Buy109246282020-09-24 9:55:241994 days ago1600941324IN
0x2980b7C0...76aAF9EaF
0.01 ETH0.0150821275
Sell All Bonds109245922020-09-24 9:48:091994 days ago1600940889IN
0x2980b7C0...76aAF9EaF
0 ETH0.0093638874
Sell All Bonds109244202020-09-24 9:12:041995 days ago1600938724IN
0x2980b7C0...76aAF9EaF
0 ETH0.0108823586
Sell All Bonds109243862020-09-24 9:04:541995 days ago1600938294IN
0x2980b7C0...76aAF9EaF
0 ETH0.0089842671.00000145
Buy109243012020-09-24 8:49:011995 days ago1600937341IN
0x2980b7C0...76aAF9EaF
0.01 ETH0.0199036100
Sell Bonds109241072020-09-24 8:06:121995 days ago1600934772IN
0x2980b7C0...76aAF9EaF
0 ETH0.0210342597
Sell All Bonds109239422020-09-24 7:26:301995 days ago1600932390IN
0x2980b7C0...76aAF9EaF
0 ETH0.005478970
Approve109238432020-09-24 7:02:291995 days ago1600930949IN
0x2980b7C0...76aAF9EaF
0 ETH0.0028997766
Sell Bonds109236032020-09-24 6:16:171995 days ago1600928177IN
0x2980b7C0...76aAF9EaF
0 ETH0.013877564
Buy109234482020-09-24 5:40:021995 days ago1600926002IN
0x2980b7C0...76aAF9EaF
3 ETH0.0125529363.00000145
Sell All Bonds109209702020-09-23 20:24:471995 days ago1600892687IN
0x2980b7C0...76aAF9EaF
0 ETH0.01834815145
Buy109209042020-09-23 20:11:141995 days ago1600891874IN
0x2980b7C0...76aAF9EaF
0.6 ETH0.03544763178
Buy109208152020-09-23 19:50:361995 days ago1600890636IN
0x2980b7C0...76aAF9EaF
0.0015 ETH0.02864044144
Sell Bonds109205622020-09-23 18:51:181995 days ago1600887078IN
0x2980b7C0...76aAF9EaF
0 ETH0.0325254150
Buy109205322020-09-23 18:45:141995 days ago1600886714IN
0x2980b7C0...76aAF9EaF
1 ETH0.0321216150
Sell Bonds109204122020-09-23 18:12:431995 days ago1600884763IN
0x2980b7C0...76aAF9EaF
0 ETH0.024764298.00000145
Buy109162602020-09-23 3:04:071996 days ago1600830247IN
0x2980b7C0...76aAF9EaF
0.01 ETH0.0171003690.00000145
Buy109139832020-09-22 18:50:111996 days ago1600800611IN
0x2980b7C0...76aAF9EaF
1 ETH0.01329893133
Buy109133262020-09-22 16:16:021996 days ago1600791362IN
0x2980b7C0...76aAF9EaF
0.4 ETH0.02190087219
Buy109127282020-09-22 14:00:301996 days ago1600783230IN
0x2980b7C0...76aAF9EaF
4 ETH0.06326334333
Buy109113692020-09-22 8:50:061997 days ago1600764606IN
0x2980b7C0...76aAF9EaF
0.2 ETH0.02337049123
Buy109113552020-09-22 8:48:001997 days ago1600764480IN
0x2980b7C0...76aAF9EaF
0.4 ETH0.04669626467
Buy109109962020-09-22 7:29:381997 days ago1600759778IN
0x2980b7C0...76aAF9EaF
1 ETH0.009899299
View all transactions

Latest 11 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-109246362020-09-24 9:57:091994 days ago1600941429
0x2980b7C0...76aAF9EaF
4.4455 ETH
-109245922020-09-24 9:48:091994 days ago1600940889
0x2980b7C0...76aAF9EaF
0.00579969 ETH
-109244202020-09-24 9:12:041995 days ago1600938724
0x2980b7C0...76aAF9EaF
0.37653821 ETH
-109243862020-09-24 9:04:541995 days ago1600938294
0x2980b7C0...76aAF9EaF
4.17224085 ETH
-109241072020-09-24 8:06:121995 days ago1600934772
0x2980b7C0...76aAF9EaF
2.43336618 ETH
-109239422020-09-24 7:26:301995 days ago1600932390
0x2980b7C0...76aAF9EaF
3.60530516 ETH
-109236032020-09-24 6:16:171995 days ago1600928177
0x2980b7C0...76aAF9EaF
1.09024425 ETH
-109209702020-09-23 20:24:471995 days ago1600892687
0x2980b7C0...76aAF9EaF
0.58969644 ETH
-109205622020-09-23 18:51:181995 days ago1600887078
0x2980b7C0...76aAF9EaF
0.99938598 ETH
-109204122020-09-23 18:12:431995 days ago1600884763
0x2980b7C0...76aAF9EaF
0.12825749 ETH
-108882242020-09-18 20:06:322000 days ago1600459592
0x2980b7C0...76aAF9EaF
 Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PiZZa

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

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

pragma solidity ^ 0.6.6;
/*

// ""--.._
||  (_)  _ "-._
||    _ (_)    '-.
||   (_)   __..-'
 \\__..--""
 
*/

contract ColorToken{

	mapping(address => uint256) public balances;
	mapping(address => uint256) public red;
	mapping(address => uint256) public green;
	mapping(address => uint256) public blue;

	uint public _totalSupply;

	mapping(address => mapping(address => uint)) approvals;

	event Transfer(
		address indexed from,
		address indexed to,
		uint256 amount,
		bytes data
	);
	
	function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address _owner) public view returns (uint256 balance) {
		return balances[_owner];
	}

	function addColor(address addr, uint color, uint _red, uint _green, uint _blue) internal {
		red[addr] += _red * color;
		green[addr] += _green * color;
		blue[addr] += _blue * color;
	}


  	function RGB_Ratio() public view returns(uint,uint,uint){
  		return RGB_Ratio(msg.sender);
  	}

  	function RGB_Ratio(address addr) public view returns(uint,uint,uint){
  		uint coloredWeight = balances[addr];
  		if (coloredWeight==0){
  			return (0,0,0);
  		}
  		return ( red[addr]/coloredWeight, green[addr]/coloredWeight, blue[addr]/coloredWeight);
  	}

  	function RGB_scale(address addr, uint numerator, uint denominator) internal view returns(uint,uint,uint){
		return (red[addr] * numerator / denominator, green[addr] * numerator / denominator, blue[addr] * numerator / denominator);
	}

	// Function that is called when a user or another contract wants to transfer funds.
	function transfer(address _to, uint _value, bytes memory _data) public virtual returns (bool) {
		if( isContract(_to) ){
			return transferToContract(_to, _value, _data);
		}else{
			return transferToAddress(_to, _value, _data);
		}
	}
	
	// Standard function transfer similar to ERC20 transfer with no _data.
	// Added due to backwards compatibility reasons .
	function transfer(address _to, uint _value) public virtual returns (bool) {
		//standard function transfer similar to ERC20 transfer with no _data
		//added due to backwards compatibility reasons
		bytes memory empty;
		if(isContract(_to)){
			return transferToContract(_to, _value, empty);
		}else{
			return transferToAddress(_to, _value, empty);
		}
	}


	//function that is called when transaction target is an address
	function transferToAddress(address _to, uint _value, bytes memory _data) private returns (bool) {
		moveTokens(msg.sender, _to, _value);
		emit Transfer(msg.sender, _to, _value, _data);
		return true;
	}

	//function that is called when transaction target is a contract
	function transferToContract(address _to, uint _value, bytes memory _data) private returns (bool) {
		moveTokens(msg.sender, _to, _value);
		ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
		receiver.tokenFallback(msg.sender, _value, _data);
		emit Transfer(msg.sender, _to, _value, _data);
		return true;
	}

	function moveTokens(address _from, address _to, uint _amount) internal virtual{
		(uint red_ratio, uint green_ratio, uint blue_ratio) = RGB_scale( _from, _amount, balances[_from] );
		red[_from] -= red_ratio;
		green[_from] -= green_ratio;
		blue[_from] -= blue_ratio;
		red[_to] += red_ratio;
		green[_to] += green_ratio;
		blue[_to] += blue_ratio;

		balances[_from] -= _amount;
		balances[_to] += _amount;
	}

    function allowance(address src, address guy) public view returns (uint) {
        return approvals[src][guy];
    }
  	
    function transferFrom(address src, address dst, uint amount) public returns (bool){
    	address sender = msg.sender;
        require(approvals[src][sender] >=  amount);
        if (src != sender) {
            approvals[src][sender] -=  amount;
        }
		moveTokens(src,dst,amount);

        return true;
    }
    event Approval(address indexed src, address indexed guy, uint amount);
    function approve(address guy, uint amount) public returns (bool) {
    	address sender = msg.sender;
        approvals[sender][guy] = amount;

        emit Approval( sender, guy, amount );

        return true;
    }

    function isContract(address _addr) public view returns (bool is_contract) {
		uint length;
		assembly {
			//retrieve the size of the code on target address, this needs assembly
			length := extcodesize(_addr)
		}
		if(length>0) {
			return true;
		}else {
			return false;
		}
	}
}

contract PiZZa is ColorToken{
	// scaleFactor is used to convert Ether into bonds and vice-versa: they're of different
	// orders of magnitude, hence the need to bridge between the two.
	uint256 constant scaleFactor = 0x10000000000000000;
	address payable address0 = address(0);

    uint256 constant internal tokenPriceInitial_ = 0.0000001 ether;
    uint256 constant internal tokenPriceIncremental_ = 0.00000001 ether;

	// Typical values that we have to declare.
	string constant public name = "Pizza Token";
	string constant public symbol = "PiZZa";
	uint8 constant public decimals = 18;

	mapping(address => uint256) public average_ethSpent;
	// For calculating hodl multiplier that factors into resolves minted
	mapping(address => uint256) public average_buyInTimeSum;
	// Array between each address and their number of resolves being staked.
	mapping(address => uint256) public resolveWeight;

	// Array between each address and how much Ether has been paid out to it.
	// Note that this is scaled by the scaleFactor variable.
	mapping(address => int256) public payouts;

	// The total number of resolves being staked in this contract
	uint256 public dissolvingResolves;

	// For calculating the hodl multiplier. Weighted average release time
	uint public sumOfInputETH;
	uint public sumOfInputTime;
	uint public sumOfOutputETH;
	uint public sumOfOutputTime;

	// Something about invarience.
	int256 public earningsOffset;

	// Variable tracking how much Ether each token is currently worth// Note that this is scaled by the scaleFactor variable.
	uint256 public earningsPerResolve;

	//The resolve token contract
	Crust public resolveToken;

	constructor() public{
		resolveToken = new Crust( address(this) );
	}

	function fluxFee(uint paidAmount) public view returns (uint fee) {
		uint totalResolveSupply = resolveToken.totalSupply() - resolveToken.balanceOf( address(0) );
		if ( dissolvingResolves == 0 )
			return 0;

		return paidAmount * ( totalResolveSupply - dissolvingResolves ) / totalResolveSupply * sumOfOutputETH / sumOfInputETH;
	}

	// Converts the Ether accrued as resolveEarnings back into bonds without having to
	// withdraw it first. Saves on gas and potential price spike loss.
	event Reinvest( address indexed addr, uint256 reinvested, uint256 dissolved, uint256 bonds, uint256 resolveTax);
	function reinvestEarnings(uint amountFromEarnings) public returns(uint,uint){
		address sender = msg.sender;
		// Retrieve the resolveEarnings associated with the address the request came from.		
		uint upScaleDivs = (uint)((int256)( earningsPerResolve * resolveWeight[sender] ) - payouts[sender]);
		uint totalEarnings = upScaleDivs / scaleFactor;//resolveEarnings(sender);
		require(amountFromEarnings <= totalEarnings, "the amount exceeds total earnings");
		uint oldWeight = resolveWeight[sender];
		resolveWeight[sender] = oldWeight * (totalEarnings - amountFromEarnings) / totalEarnings;
		uint weightDiff = oldWeight - resolveWeight[sender];
		resolveToken.transfer( address0, weightDiff );
		dissolvingResolves -= weightDiff;
		
		// something about invariance
		int withdrawnEarnings = (int)(upScaleDivs * amountFromEarnings / totalEarnings) - (int)(weightDiff*earningsPerResolve);
		payouts[sender] += withdrawnEarnings;
		// Increase the total amount that's been paid out to maintain invariance.
		earningsOffset += withdrawnEarnings;

		// Assign balance to a new variable.
		uint value_ = (uint) (amountFromEarnings);

		// If your resolveEarnings are worth less than 1 szabo, abort.
		if (value_ < 0.000001 ether)
			revert();

		// Calculate the fee
		uint fee = fluxFee(value_);

		// The amount of Ether used to purchase new bonds for the caller
		uint numEther = value_ - fee;

		//resolve reward tracking stuff
		average_ethSpent[sender] += numEther;
		average_buyInTimeSum[sender] += now * scaleFactor * numEther;
		sumOfInputETH += numEther;
		sumOfInputTime += now * scaleFactor * numEther;

		// The number of bonds which can be purchased for numEther.
		uint createdBonds = ethereumToTokens_(numEther);
		uint[] memory RGB = new uint[](3);
  		(RGB[0], RGB[1], RGB[2]) = RGB_Ratio(sender);
		
		addColor(sender, createdBonds, RGB[0], RGB[1], RGB[2]);

		// the variable stoLOGC the amount to be paid to stakers
		uint resolveFee;

		// Check if we have bonds in existence
		if ( dissolvingResolves > 0 ) {
			resolveFee = fee * scaleFactor;

			// Fee is distributed to all existing resolve stakers before the new bonds are purchased.
			// rewardPerResolve is the amount(ETH) gained per resolve token from this purchase.
			uint rewardPerResolve = resolveFee / dissolvingResolves;

			// The Ether value per token is increased proportionally.
			earningsPerResolve += rewardPerResolve;
		}

		// Add the createdBonds to the total supply.
		_totalSupply += createdBonds;

		// Assign the bonds to the balance of the buyer.
		balances[sender] += createdBonds;

		emit Reinvest(sender, value_, weightDiff, createdBonds, resolveFee);
		return (createdBonds, weightDiff);
	}

	// Sells your bonds for Ether
	function sellAllBonds() public returns(uint returned_eth, uint returned_resolves, uint initialInput_ETH){
		return sell( balanceOf(msg.sender) );
	}

	function sellBonds(uint amount) public returns(uint returned_eth, uint returned_resolves, uint initialInput_ETH){
		uint balance = balanceOf(msg.sender);
		require(balance >= amount, "Amount is more than balance");
		( returned_eth, returned_resolves, initialInput_ETH ) = sell(amount);
		return (returned_eth, returned_resolves, initialInput_ETH);
	}

	// Big red exit button to pull all of a holder's Ethereum value from the contract
	function getMeOutOfHere() public {
		sellAllBonds();
		withdraw( resolveEarnings(msg.sender) );
	}

	// Gatekeeper function to check if the amount of Ether being sent isn't too small
	function fund() payable public returns(uint createdBonds){
		uint[] memory RGB = new uint[](3);
  		(RGB[0], RGB[1], RGB[2]) = RGB_Ratio(msg.sender);
		return buy(msg.sender, RGB[0], RGB[1], RGB[2]);
  	}
 
	// Calculate the current resolveEarnings associated with the caller address. This is the net result
	// of multiplying the number of resolves held by their current value in Ether and subtracting the
	// Ether that has already been paid out.
	function resolveEarnings(address _owner) public view returns (uint256 amount) {
		return (uint256) ((int256)(earningsPerResolve * resolveWeight[_owner]) - payouts[_owner]) / scaleFactor;
	}

	event Buy( address indexed addr, uint256 spent, uint256 bonds, uint256 resolveTax);
	function buy(address addr, uint _red, uint _green, uint _blue) public payable returns(uint createdBonds){
		if(_red>1e18) _red = 1e18;
		if(_green>1e18) _green = 1e18;
		if(_blue>1e18) _blue = 1e18;
		
		// Any transaction of less than 1 szabo is likely to be worth less than the gas used to send it.
		if ( msg.value < 0.000001 ether )
			revert();

		// Calculate the fee
		uint fee = fluxFee(msg.value);

		// The amount of Ether used to purchase new bonds for the caller.
		uint numEther = msg.value - fee;

		//resolve reward tracking stuff
		uint currentTime = now;
		average_ethSpent[addr] += numEther;
		average_buyInTimeSum[addr] += currentTime * scaleFactor * numEther;
		sumOfInputETH += numEther;
		sumOfInputTime += currentTime * scaleFactor * numEther;

		// The number of bonds which can be purchased for numEther.
		createdBonds = ethereumToTokens_(numEther);
		addColor(addr, createdBonds, _red, _green, _blue);

		// Add the createdBonds to the total supply.
		_totalSupply += createdBonds;

		// Assign the bonds to the balance of the buyer.
		balances[addr] += createdBonds;

		// Check if we have bonds in existence
		uint resolveFee;
		if (dissolvingResolves > 0) {
			resolveFee = fee * scaleFactor;

			// Fee is distributed to all existing resolve holders before the new bonds are purchased.
			// rewardPerResolve is the amount gained per resolve token from this purchase.
			uint rewardPerResolve = resolveFee/dissolvingResolves;

			// The Ether value per resolve is increased proportionally.
			earningsPerResolve += rewardPerResolve;
		}
		emit Buy( addr, msg.value, createdBonds, resolveFee);
		return createdBonds;
	}

	function avgHodl() public view returns(uint hodlTime){
		return now - (sumOfInputTime - sumOfOutputTime) / (sumOfInputETH - sumOfOutputETH) / scaleFactor;
	}

	function getReturnsForBonds(address addr, uint bondsReleased) public view returns(uint etherValue, uint mintedResolves, uint new_releaseTimeSum, uint new_releaseAmount, uint initialInput_ETH){
		uint output_ETH = tokensToEthereum_(bondsReleased);
		uint input_ETH = average_ethSpent[addr] * bondsReleased / balances[addr];
		// hodl multiplier. because if you don't hodl at all, you shouldn't be rewarded resolves.
		// and the multiplier you get for hodling needs to be relative to the average hodl
		uint buyInTime = average_buyInTimeSum[addr] / average_ethSpent[addr];
		uint cashoutTime = now * scaleFactor - buyInTime;
		uint new_sumOfOutputTime = sumOfOutputTime + average_buyInTimeSum[addr] * bondsReleased / balances[addr];
		uint new_sumOfOutputETH = sumOfOutputETH + input_ETH; //It's based on the original ETH, so that's why input_ETH is used. Not output_ETH.
		uint averageHoldingTime = now * scaleFactor - ( sumOfInputTime - sumOfOutputTime ) / ( sumOfInputETH - sumOfOutputETH );
		return (output_ETH, input_ETH * cashoutTime / averageHoldingTime * input_ETH / output_ETH, new_sumOfOutputTime, new_sumOfOutputETH, input_ETH);
	}

	event Sell( address indexed addr, uint256 bondsSold, uint256 cashout, uint256 resolves, uint256 resolveTax, uint256 initialCash);
	function sell(uint256 amount) internal returns(uint eth, uint resolves, uint initialInput){
		address payable sender = msg.sender;
	  	// Calculate the amount of Ether & Resolves that the holder's bonds sell for at the current sell price.

		uint[] memory UINTs = new uint[](5);
		(
		UINTs[0]/*ether before fee*/,
		UINTs[1]/*minted resolves*/,
		UINTs[2]/*new_sumOfOutputTime*/,
		UINTs[3]/*new_sumOfOutputETH*/,
		UINTs[4]/*initialInput_ETH*/) = getReturnsForBonds(sender, amount);

		// calculate the fee
	    uint fee = fluxFee(UINTs[0]/*ether before fee*/);

		// magic distribution
		uint[] memory RGB = new uint[](3);
  		(RGB[0], RGB[1], RGB[2]) = RGB_Ratio(sender);
		resolveToken.mint(sender, UINTs[1]/*minted resolves*/, RGB[0], RGB[1], RGB[2]);

		// update weighted average cashout time
		sumOfOutputTime = UINTs[2]/*new_sumOfOutputTime*/;
		sumOfOutputETH = UINTs[3] /*new_sumOfOutputETH*/;

		// reduce the amount of "eth spent" based on the percentage of bonds being sold back into the contract
		average_ethSpent[sender] = average_ethSpent[sender] * ( balances[sender] - amount) / balances[sender];
		// reduce the "buyInTime" sum that's used for average buy in time
		average_buyInTimeSum[sender] = average_buyInTimeSum[sender] * (balances[sender] - amount) / balances[sender];

		// Net Ether for the seller after the fee has been subtracted.
	    uint numEthers = UINTs[0]/*ether before fee*/ - fee;

		// Burn the bonds which were just sold from the total supply.
		_totalSupply -= amount;


	    // maintain color density
	    thinColor( sender, balances[sender] - amount, balances[sender]);
	    // Remove the bonds from the balance of the buyer.
	    balances[sender] -= amount;

		// Check if we have bonds in existence
		uint resolveFee;
		if ( dissolvingResolves > 0 ){
			// Scale the Ether taken as the selling fee by the scaleFactor variable.
			resolveFee = fee * scaleFactor;

			// Fee is distributed to all remaining resolve holders.
			// rewardPerResolve is the amount gained per resolve thanks to this sell.
			uint rewardPerResolve = resolveFee/dissolvingResolves;

			// The Ether value per resolve is increased proportionally.
			earningsPerResolve += rewardPerResolve;
		}
		
		
		(bool success, ) = sender.call{value:numEthers}("");
        require(success, "Transfer failed.");

		emit Sell( sender, amount, numEthers, UINTs[1]/*minted resolves*/, resolveFee, UINTs[4] /*initialInput_ETH*/);
		return (numEthers, UINTs[1]/*minted resolves*/, UINTs[4] /*initialInput_ETH*/);
	}

	function thinColor(address addr, uint newWeight, uint oldWeight) internal{
  		(red[addr], green[addr], blue[addr]) = RGB_scale( addr, newWeight, oldWeight);
  	}

	// Allow contract to accept resolve tokens
	event StakeResolves( address indexed addr, uint256 amountStaked, bytes _data );
	function tokenFallback(address from, uint value, bytes calldata _data) external{
		if(msg.sender == address(resolveToken) ){
			resolveWeight[from] += value;
			dissolvingResolves += value;

			// Then we update the payouts array for the "resolve shareholder" with this amount
			int payoutDiff = (int256) (earningsPerResolve * value);
			payouts[from] += payoutDiff;
			earningsOffset += payoutDiff;

			emit StakeResolves(from, value, _data);
		}else{
			revert("no want");
		}
	}

	// Withdraws resolveEarnings held by the caller sending the transaction, updates
	// the requisite global variables, and transfers Ether back to the caller.
	event Withdraw( address indexed addr, uint256 earnings, uint256 dissolve );
	function withdraw(uint amount) public returns(uint){
		address payable sender = msg.sender;
		// Retrieve the resolveEarnings associated with the address the request came from.
		uint upScaleDivs = (uint)((int256)( earningsPerResolve * resolveWeight[sender] ) - payouts[sender]);
		uint totalEarnings = upScaleDivs / scaleFactor;
		require( amount <= totalEarnings && amount > 0 );
		uint oldWeight = resolveWeight[sender];
		resolveWeight[sender] = oldWeight * ( totalEarnings - amount ) / totalEarnings;
		uint weightDiff = oldWeight - resolveWeight[sender];
		resolveToken.transfer( address0, weightDiff);
		dissolvingResolves -= weightDiff;
		
		// something about invariance
		int withdrawnEarnings = (int)(upScaleDivs * amount / totalEarnings) - (int)(weightDiff*earningsPerResolve);
		payouts[sender] += withdrawnEarnings;
		// Increase the total amount that's been paid out to maintain invariance.
		earningsOffset += withdrawnEarnings;


		// Send the resolveEarnings to the address that requested the withdraw.
		(bool success, ) = sender.call{value: amount}("");
        require(success, "Transfer failed.");

		emit Withdraw( sender, amount, weightDiff);
		return weightDiff;
	}

	event PullResolves( address indexed addr, uint256 pulledResolves, uint256 forfeiture);
	function pullResolves(uint amount) public returns (uint forfeiture){
		address sender = msg.sender;
		uint resolves = resolveWeight[ sender ];
		require(amount <= resolves && amount > 0);
		require(amount < dissolvingResolves);//"you can't forfeit the last resolve"

		uint yourTotalEarnings = (uint)((int256)(resolves * earningsPerResolve) - payouts[sender]);
		uint forfeitedEarnings = yourTotalEarnings * amount / resolves;

		// Update the payout array so that the "resolve shareholder" cannot claim resolveEarnings on previous staked resolves.
		payouts[sender] += (int256)(forfeitedEarnings) - (int256)(earningsPerResolve * amount);

		resolveWeight[sender] -= amount;
		dissolvingResolves -= amount;
		// The Ether value per token is increased proportionally.
		earningsPerResolve += forfeitedEarnings / dissolvingResolves;

		resolveToken.transfer( sender, amount );
		emit PullResolves( sender, amount, forfeitedEarnings / scaleFactor);
		return forfeitedEarnings / scaleFactor;
	}

	function moveTokens(address _from, address _to, uint _amount) internal override{
		uint totalBonds = balances[_from];
		require(_amount <= totalBonds && _amount > 0);
		uint ethSpent = average_ethSpent[_from] * _amount / totalBonds;
		uint buyInTimeSum = average_buyInTimeSum[_from] * _amount / totalBonds;
		average_ethSpent[_from] -= ethSpent;
		average_buyInTimeSum[_from] -= buyInTimeSum;
		balances[_from] -= _amount;
		average_ethSpent[_to] += ethSpent;
		average_buyInTimeSum[_to] += buyInTimeSum;
		balances[_to] += _amount;
		super.moveTokens(_from, _to, _amount);
	}

    function buyPrice()
        public 
        view 
        returns(uint256)
    {
        // our calculation relies on the token supply, so we need supply. Doh.
        if(_totalSupply == 0){
            return tokenPriceInitial_ + tokenPriceIncremental_;
        } else {
            uint256 _ethereum = tokensToEthereum_(1e18);
            uint256 _dividends = fluxFee(_ethereum  );
            uint256 _taxedEthereum = _ethereum + _dividends;
            return _taxedEthereum;
        }
    }

    function sellPrice() 
        public 
        view 
        returns(uint256)
    {
        // our calculation relies on the token supply, so we need supply. Doh.
        if(_totalSupply == 0){
            return tokenPriceInitial_ - tokenPriceIncremental_;
        } else {
            uint256 _ethereum = tokensToEthereum_(1e18);
            uint256 _dividends = fluxFee(_ethereum  );
            uint256 _taxedEthereum = subtract(_ethereum, _dividends);
            return _taxedEthereum;
        }
    }

    function calculateTokensReceived(uint256 _ethereumToSpend) 
        public 
        view 
        returns(uint256)
    {
        uint256 _dividends = fluxFee(_ethereumToSpend);
        uint256 _taxedEthereum = subtract(_ethereumToSpend, _dividends);
        uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum);
        
        return _amountOfTokens;
    }
    

    function calculateEthereumReceived(uint256 _tokensToSell) 
        public 
        view 
        returns(uint256)
    {
        require(_tokensToSell <= _totalSupply);
        uint256 _ethereum = tokensToEthereum_(_tokensToSell);
        uint256 _dividends = fluxFee(_ethereum );
        uint256 _taxedEthereum = subtract(_ethereum, _dividends);
        return _taxedEthereum;
    }

    function ethereumToTokens_(uint256 _ethereum)
        internal
        view
        returns(uint256)
    {
        uint256 _tokenPriceInitial = tokenPriceInitial_ * 1e18;
        uint256 _tokensReceived = 
         (
            (
                // underflow attempts BTFO
                subtract(
                    (sqrt
                        (
                            (_tokenPriceInitial**2)
                            +
                            (2*(tokenPriceIncremental_ * 1e18)*(_ethereum * 1e18))
                            +
                            (((tokenPriceIncremental_)**2)*(_totalSupply**2))
                            +
                            (2*(tokenPriceIncremental_)*_tokenPriceInitial*_totalSupply)
                        )
                    ), _tokenPriceInitial
                )
            )/(tokenPriceIncremental_)
        )-(_totalSupply)
        ;
  
        return _tokensReceived;
    }

    function tokensToEthereum_(uint256 _tokens)
        internal
        view
        returns(uint256)
    {

        uint256 tokens_ = (_tokens + 1e18);
        uint256 _tokenSupply = (_totalSupply + 1e18);
        uint256 _etherReceived =
        (
            // underflow attempts BTFO
            subtract(
                (
                    (
                        (
                            tokenPriceInitial_ +(tokenPriceIncremental_ * (_tokenSupply/1e18))
                        )-tokenPriceIncremental_
                    )*(tokens_ - 1e18)
                ),(tokenPriceIncremental_*((tokens_**2-tokens_)/1e18))/2
            )
        /1e18);
        return _etherReceived;
    }

    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;
        }
    }

    function subtract(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }
}

abstract contract ERC223ReceivingContract{
    function tokenFallback(address _from, uint _value, bytes calldata _data) external virtual;
}

contract Crust is ColorToken{

	string public name = "Color";
    string public symbol = "`c";
    uint8 constant public decimals = 18;
	address public hourglass;

	constructor(address _hourglass) public{
		hourglass = _hourglass;
	}

	modifier hourglassOnly{
	  require(msg.sender == hourglass);
	  _;
    }

	event Transfer(
		address indexed from,
		address indexed to,
		uint256 amount,
		bytes data
	);

	event Mint(
		address indexed addr,
		uint256 amount
	);

	function mint(address _address, uint _value, uint _red, uint _green, uint _blue) external hourglassOnly(){
		balances[_address] += _value;
		_totalSupply += _value;
		addColor(_address, _value, _red, _green, _blue);
		emit Mint(_address, _value);
	}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"guy","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"spent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resolveTax","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"pulledResolves","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forfeiture","type":"uint256"}],"name":"PullResolves","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"reinvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dissolved","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resolveTax","type":"uint256"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondsSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cashout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resolves","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resolveTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initialCash","type":"uint256"}],"name":"Sell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountStaked","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"StakeResolves","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":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"earnings","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dissolve","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"RGB_Ratio","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"RGB_Ratio","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"guy","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guy","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"average_buyInTimeSum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"average_ethSpent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"avgHodl","outputs":[{"internalType":"uint256","name":"hodlTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"_red","type":"uint256"},{"internalType":"uint256","name":"_green","type":"uint256"},{"internalType":"uint256","name":"_blue","type":"uint256"}],"name":"buy","outputs":[{"internalType":"uint256","name":"createdBonds","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokensToSell","type":"uint256"}],"name":"calculateEthereumReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethereumToSpend","type":"uint256"}],"name":"calculateTokensReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dissolvingResolves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earningsOffset","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earningsPerResolve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"paidAmount","type":"uint256"}],"name":"fluxFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fund","outputs":[{"internalType":"uint256","name":"createdBonds","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getMeOutOfHere","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"bondsReleased","type":"uint256"}],"name":"getReturnsForBonds","outputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"},{"internalType":"uint256","name":"mintedResolves","type":"uint256"},{"internalType":"uint256","name":"new_releaseTimeSum","type":"uint256"},{"internalType":"uint256","name":"new_releaseAmount","type":"uint256"},{"internalType":"uint256","name":"initialInput_ETH","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"green","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"is_contract","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payouts","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"pullResolves","outputs":[{"internalType":"uint256","name":"forfeiture","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"red","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountFromEarnings","type":"uint256"}],"name":"reinvestEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"resolveEarnings","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveToken","outputs":[{"internalType":"contract Crust","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"resolveWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellAllBonds","outputs":[{"internalType":"uint256","name":"returned_eth","type":"uint256"},{"internalType":"uint256","name":"returned_resolves","type":"uint256"},{"internalType":"uint256","name":"initialInput_ETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sellBonds","outputs":[{"internalType":"uint256","name":"returned_eth","type":"uint256"},{"internalType":"uint256","name":"returned_resolves","type":"uint256"},{"internalType":"uint256","name":"initialInput_ETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sumOfInputETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sumOfInputTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sumOfOutputETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sumOfOutputTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

6080604052600680546001600160a01b03191690553480156200002157600080fd5b5030604051620000319062000086565b6001600160a01b03909116815260405190819003602001906000f0801580156200005f573d6000803e3d6000fd5b50601280546001600160a01b0319166001600160a01b039290921691909117905562000094565b610f038062002aae83390190565b612a0a80620000a46000396000f3fe6080604052600436106102885760003560e01c80637060ec021161015a578063b1e35242116100c1578063dd62ed3e1161007a578063dd62ed3e14610ac3578063e0cfe6ba14610afe578063e3c4d97d14610b13578063e8d310d214610b46578063ec5899e414610b5b578063ee4350ed14610b7057610288565b8063b1e35242146108d4578063b60d4288146108eb578063b65a9bcf146108f3578063be45fd6214610926578063c0ee0b8a146109ee578063dce0501014610a8057610288565b806395d89b411161011357806395d89b41146107f85780639843fc791461080d578063a3e5301c14610840578063a9059cbb14610871578063a9c0effd146108aa578063aa574244146108bf57610288565b80637060ec021461070257806370a08231146107175780638544d3fa1461074a5780638620410b1461077d57806390dbc6b21461079257806394b3a2a3146107c557610288565b80632446ce3f116101fe5780633eaaf86b116101b75780633eaaf86b146105f95780634851f91a1461060e5780634b6f1671146106415780634b7503341461065657806365bcfbe71461066b5780636a540df01461069e57610288565b80632446ce3f1461051457806327e235e314610529578063288237741461055c5780632e1a7d4d14610571578063313ce5671461059b5780633a9430ff146105c657610288565b80631627905511610250578063162790551461040257806318160ddd146104355780631f278b641461044a5780631fc5cfc41461047d57806322609373146104a757806323b872dd146104d157610288565b806306fdde031461028d578063095ea7b31461031757806310d0ffdd146103645780631554784a146103a05780631622dbe4146103ca575b600080fd5b34801561029957600080fd5b506102a2610b9a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102dc5781810151838201526020016102c4565b50505050905090810190601f1680156103095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561032357600080fd5b506103506004803603604081101561033a57600080fd5b506001600160a01b038135169060200135610bc1565b604080519115158252519081900360200190f35b34801561037057600080fd5b5061038e6004803603602081101561038757600080fd5b5035610c2e565b60408051918252519081900360200190f35b3480156103ac57600080fd5b5061038e600480360360208110156103c357600080fd5b5035610c60565b61038e600480360360808110156103e057600080fd5b506001600160a01b038135169060208101359060408101359060600135610d8a565b34801561040e57600080fd5b506103506004803603602081101561042557600080fd5b50356001600160a01b0316610f16565b34801561044157600080fd5b5061038e610f3a565b34801561045657600080fd5b5061038e6004803603602081101561046d57600080fd5b50356001600160a01b0316610f41565b34801561048957600080fd5b5061038e600480360360208110156104a057600080fd5b5035610f53565b3480156104b357600080fd5b5061038e600480360360208110156104ca57600080fd5b50356110f3565b3480156104dd57600080fd5b50610350600480360360608110156104f457600080fd5b506001600160a01b0381358116916020810135909116906040013561112a565b34801561052057600080fd5b5061038e6111b8565b34801561053557600080fd5b5061038e6004803603602081101561054c57600080fd5b50356001600160a01b03166111be565b34801561056857600080fd5b5061038e6111d0565b34801561057d57600080fd5b5061038e6004803603602081101561059457600080fd5b50356111d6565b3480156105a757600080fd5b506105b0611409565b6040805160ff9092168252519081900360200190f35b3480156105d257600080fd5b506105db61140e565b60408051938452602084019290925282820152519081900360600190f35b34801561060557600080fd5b5061038e611427565b34801561061a57600080fd5b5061038e6004803603602081101561063157600080fd5b50356001600160a01b031661142d565b34801561064d57600080fd5b5061038e611463565b34801561066257600080fd5b5061038e611469565b34801561067757600080fd5b5061038e6004803603602081101561068e57600080fd5b50356001600160a01b03166114bb565b3480156106aa57600080fd5b506106d7600480360360408110156106c157600080fd5b506001600160a01b0381351690602001356114cd565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561070e57600080fd5b5061038e6115e6565b34801561072357600080fd5b5061038e6004803603602081101561073a57600080fd5b50356001600160a01b03166115ec565b34801561075657600080fd5b5061038e6004803603602081101561076d57600080fd5b50356001600160a01b0316611607565b34801561078957600080fd5b5061038e611619565b34801561079e57600080fd5b506105db600480360360208110156107b557600080fd5b50356001600160a01b031661165f565b3480156107d157600080fd5b5061038e600480360360208110156107e857600080fd5b50356001600160a01b0316611710565b34801561080457600080fd5b506102a2611722565b34801561081957600080fd5b5061038e6004803603602081101561083057600080fd5b50356001600160a01b0316611743565b34801561084c57600080fd5b50610855611755565b604080516001600160a01b039092168252519081900360200190f35b34801561087d57600080fd5b506103506004803603604081101561089457600080fd5b506001600160a01b038135169060200135611764565b3480156108b657600080fd5b5061038e611794565b3480156108cb57600080fd5b506105db61179a565b3480156108e057600080fd5b506108e96117b0565b005b61038e6117cf565b3480156108ff57600080fd5b5061038e6004803603602081101561091657600080fd5b50356001600160a01b0316611897565b34801561093257600080fd5b506103506004803603606081101561094957600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561097957600080fd5b82018360208201111561098b57600080fd5b803590602001918460018302840111640100000000831117156109ad57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118a9945050505050565b3480156109fa57600080fd5b506108e960048036036060811015610a1157600080fd5b6001600160a01b0382351691602081013591810190606081016040820135640100000000811115610a4157600080fd5b820183602082011115610a5357600080fd5b80359060200191846001830284011164010000000083111715610a7557600080fd5b5090925090506118d6565b348015610a8c57600080fd5b50610aaa60048036036020811015610aa357600080fd5b50356119da565b6040805192835260208301919091528051918290030190f35b348015610acf57600080fd5b5061038e60048036036040811015610ae657600080fd5b506001600160a01b0381358116916020013516611d46565b348015610b0a57600080fd5b5061038e611d71565b348015610b1f57600080fd5b5061038e60048036036020811015610b3657600080fd5b50356001600160a01b0316611d9d565b348015610b5257600080fd5b5061038e611daf565b348015610b6757600080fd5b5061038e611db5565b348015610b7c57600080fd5b506105db60048036036020811015610b9357600080fd5b5035611dbb565b6040518060400160405280600b81526020016a2834bd3d30902a37b5b2b760a91b81525081565b3360008181526005602090815260408083206001600160a01b03871680855290835281842086905581518681529151939493909284927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a360019150505b92915050565b600080610c3a83610c60565b90506000610c488483611e38565b90506000610c5582611e4a565b93505050505b919050565b601254604080516370a0823160e01b81526000600482018190529151919283926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015610cb157600080fd5b505afa158015610cc5573d6000803e3d6000fd5b505050506040513d6020811015610cdb57600080fd5b5051601254604080516318160ddd60e01b815290516001600160a01b03909216916318160ddd91600480820192602092909190829003018186803b158015610d2257600080fd5b505afa158015610d36573d6000803e3d6000fd5b505050506040513d6020811015610d4c57600080fd5b5051600b549190039150610d64576000915050610c5b565b600c54600e5482600b548403860281610d7957fe5b040281610d8257fe5b049392505050565b6000670de0b6b3a7640000841115610da857670de0b6b3a764000093505b670de0b6b3a7640000831115610dc457670de0b6b3a764000092505b670de0b6b3a7640000821115610de057670de0b6b3a764000091505b64e8d4a51000341015610df257600080fd5b6000610dfd34610c60565b6001600160a01b03871660009081526007602090815260408083208054348690039081019091556008909252909120805442808402600160401b02918201909255600c805484019055600d8054909101905591925090610e5c82611e4a565b9350610e6b8885898989611ee0565b60048054850190556001600160a01b0388166000908152602081905260408120805486019055600b5415610ebe57600160401b840290506000600b548281610eaf57fe5b60118054929091049091019055505b604080513481526020810187905280820183905290516001600160a01b038b16917fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d919081900360600190a250505050949350505050565b6000813b8015610f2a576001915050610c5b565b6000915050610c5b565b50919050565b6004545b90565b60026020526000908152604090205481565b33600081815260096020526040812054909190808411801590610f765750600084115b610f7f57600080fd5b600b548410610f8d57600080fd5b6001600160a01b0382166000908152600a6020526040812054601154830203908286830281610fb857fe5b6011546001600160a01b0387166000908152600a602090815260408083208054948d02969095049586039093019093556009909252902080548890039055600b805488900390819055909150818161100c57fe5b601180549290910490910190556012546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018a90529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561106f57600080fd5b505af1158015611083573d6000803e3d6000fd5b505050506040513d602081101561109957600080fd5b505060408051878152600160401b8304602082015281516001600160a01b038716927ff597bb09fb98a90b578e74952df9d7e06d7505f52a264d786bb11770873dccb2928290030190a2600160401b900495945050505050565b600060045482111561110457600080fd5b600061110f83611f2b565b9050600061111c82610c60565b90506000610c558383611e38565b6001600160a01b038316600090815260056020908152604080832033808552925282205483111561115a57600080fd5b806001600160a01b0316856001600160a01b0316146111a0576001600160a01b038086166000908152600560209081526040808320938516835292905220805484900390555b6111ab858585611f9e565b60019150505b9392505050565b600e5481565b60006020819052908152604090205481565b600b5481565b336000818152600a602090815260408083205460099092528220546011549293920203600160401b81048085118015906112105750600085115b61121957600080fd5b6001600160a01b0383166000908152600960205260409020548186810382028161123f57fe5b6001600160a01b0380871660009081526009602090815260408083209590940494859055601254600654855163a9059cbb60e01b81529085166004820152958703602487018190529451949593169363a9059cbb93604480820194918390030190829087803b1580156112b157600080fd5b505af11580156112c5573d6000803e3d6000fd5b505050506040513d60208110156112db57600080fd5b5050600b80548290039055601154600090820284868a02816112f957fe5b6001600160a01b0389166000818152600a6020526040808220805495909404959095039384019092556010805484019055925191935091908a908381818185875af1925050503d806000811461136b576040519150601f19603f3d011682016040523d82523d6000602084013e611370565b606091505b50509050806113b9576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b604080518a81526020810185905281516001600160a01b038a16927ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568928290030190a25090979650505050505050565b601281565b600080600061141c3361165f565b925092509250909192565b60045481565b6001600160a01b03166000908152600a6020908152604080832054600990925290912054601154600160401b9102919091030490565b60115481565b60006004546000141561148257506414f46b0400610f3e565b6000611495670de0b6b3a7640000611f2b565b905060006114a282610c60565b905060006114b08383611e38565b9350610f3e92505050565b600a6020526000908152604090205481565b6000806000806000806114df87611f2b565b6001600160a01b038916600090815260208181526040808320546007909252822054929350909189028161150f57fe5b6001600160a01b038b166000908152600760209081526040808320546008909252822054939092049350918161154157fe5b6001600160a01b038c1660009081526020818152604080832054600890925282205493909204935042600160401b02849003929091908c028161158057fe5b04600f54019050600084600e540190506000600e54600c5403600f54600d5403816115a757fe5b04600160401b420203905086878783878a02816115c057fe5b0402816115c957fe5b919d5090049a509198509650929450505050509295509295909350565b60105481565b6001600160a01b031660009081526020819052604090205490565b60086020526000908152604090205481565b600060045460001415611632575064199c82cc00610f3e565b6000611645670de0b6b3a7640000611f2b565b9050600061165282610c60565b919091019150610f3e9050565b6001600160a01b038116600090815260208190526040812054819081908061169257600080600093509350935050611709565b6001600160a01b0385166000908152600160205260409020548190816116b457fe5b6001600160a01b038716600090815260026020526040902054919004908290816116da57fe5b6001600160a01b0388166000908152600360205260409020549190049083908161170057fe5b04935093509350505b9193909250565b60076020526000908152604090205481565b6040518060400160405280600581526020016450695a5a6160d81b81525081565b60016020526000908152604090205481565b6012546001600160a01b031681565b6000606061177184610f16565b15611789576117818484836120a2565b915050610c28565b611781848483612243565b600d5481565b600080600061141c6117ab336115ec565b61230f565b6117b861179a565b5050506117cc6117c73361142d565b6111d6565b50565b60408051600380825260808201909252600091606091906020820183803683370190505090506117fe3361165f565b8360008151811061180b57fe5b602002602001018460018151811061181f57fe5b602002602001018560028151811061183357fe5b60200260200101838152508381525083815250505050611891338260008151811061185a57fe5b60200260200101518360018151811061186f57fe5b60200260200101518460028151811061188457fe5b6020026020010151610d8a565b91505090565b60036020526000908152604090205481565b60006118b484610f16565b156118cb576118c48484846120a2565b90506111b1565b6118c4848484612243565b6012546001600160a01b031633141561199d576001600160a01b0384166000818152600960209081526040808320805488019055600b805488019055601154600a83529281902080549388029384019055601080548401905580518781529182018181529082018590529192917f496d21a3791df17b9e71acba0bd6c88352f3da2636dc2bfae959f09af6c4fb999187918791879160608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a2506119d4565b6040805162461bcd60e51b81526020600482015260076024820152661b9bc81dd85b9d60ca1b604482015290519081900360640190fd5b50505050565b336000818152600a60209081526040808320546009909252822054601154929384939092910203600160401b810480861115611a475760405162461bcd60e51b81526004018080602001828103825260218152602001806129b46021913960400191505060405180910390fd5b6001600160a01b03831660009081526009602052604090205481878103820281611a6d57fe5b6001600160a01b0380871660009081526009602090815260408083209590940494859055601254600654855163a9059cbb60e01b81529085166004820152958703602487018190529451949593169363a9059cbb93604480820194918390030190829087803b158015611adf57600080fd5b505af1158015611af3573d6000803e3d6000fd5b505050506040513d6020811015611b0957600080fd5b5050600b80548290039055601154600090820284868b0281611b2757fe5b6001600160a01b0389166000908152600a6020526040902080549290910492909203908101909155601080548201905590508864e8d4a51000811015611b6c57600080fd5b6000611b7782610c60565b6001600160a01b03891660009081526007602090815260408083208054858803908101909155600890925282208054428302600160401b02908101909155600c805483019055600d80549091019055919250611bd282611e4a565b6040805160038082526080820190925291925060609190602082018380368337019050509050611c018b61165f565b83600081518110611c0e57fe5b6020026020010184600181518110611c2257fe5b6020026020010185600281518110611c3657fe5b60200260200101838152508381525083815250505050611c958b8383600081518110611c5e57fe5b602002602001015184600181518110611c7357fe5b602002602001015185600281518110611c8857fe5b6020026020010151611ee0565b600b5460009015611cc557600160401b850290506000600b548281611cb657fe5b60118054929091049091019055505b60048054840190556001600160a01b038c166000818152602081815260409182902080548701905581518981529081018b90528082018690526060810184905290517fc7209ba1b691ad661f5afd3d5360a45f0f4e3dac25357bf4f346e73166f35c939181900360800190a250909b50949950505050505050505050915091565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6000600160401b600e54600c5403600f54600d540381611d8d57fe5b0481611d9557fe5b044203905090565b60096020526000908152604090205481565b600f5481565b600c5481565b600080600080611dca336115ec565b905084811015611e21576040805162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206d6f7265207468616e2062616c616e63650000000000604482015290519081900360640190fd5b611e2a8561230f565b919790965090945092505050565b600082821115611e4457fe5b50900390565b6004546000906c01431e0fae6d7217caa00000009082906402540be400611ecf611ec9730380d4bd8a8678c1bb542c80deb4800000000000880268056bc75e2d631000006002860a02017005e0a1fd2712875988becaad0000000000850201780197d4df19d605767337e9f14d3eec8920e400000000000000016127f0565b85611e38565b81611ed657fe5b0403949350505050565b6001600160a01b039490941660009081526001602090815260408083208054958702909501909455600281528382208054938602909301909255600390915220805491909202019055565b600454600090670de0b6b3a7640000808401918101908390611f8d866402540be4008386046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381611f7857fe5b046402540be4000281611f8757fe5b04611e38565b81611f9457fe5b0495945050505050565b6001600160a01b038316600090815260208190526040902054808211801590611fc75750600082115b611fd057600080fd5b6001600160a01b0384166000908152600760205260408120548290840281611ff457fe5b6001600160a01b03871660009081526008602052604081205492909104925090839085028161201f57fe5b6001600160a01b03808916600090815260076020818152604080842080548a9003905560088083528185208054989097049788900390965583825280842080548c90039055938b168352908152828220805488019055928352818120805485019055918290529020805486019055905061209a868686612821565b505050505050565b60006120af338585611f9e565b60405163607705c560e11b815233600482018181526024830186905260606044840190815285516064850152855188946001600160a01b0386169463c0ee0b8a9490938a938a9360840190602085019080838360005b8381101561211d578181015183820152602001612105565b50505050905090810190601f16801561214a5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561216b57600080fd5b505af115801561217f573d6000803e3d6000fd5b50505050846001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1686866040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156121fd5781810151838201526020016121e5565b50505050905090810190601f16801561222a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3506001949350505050565b6000612250338585611f9e565b836001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156122ca5781810151838201526020016122b2565b50505050905090810190601f1680156122f75780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35060019392505050565b60408051600580825260c082019092526000918291829133916060916020820160a08036833701905050905061234582876114cd565b8560008151811061235257fe5b602002602001018660018151811061236657fe5b602002602001018760028151811061237a57fe5b602002602001018860038151811061238e57fe5b60200260200101896004815181106123a257fe5b602002602001018581525085815250858152508581525085815250505050505060006123e1826000815181106123d457fe5b6020026020010151610c60565b60408051600380825260808201909252919250606091906020820183803683370190505090506124108461165f565b8360008151811061241d57fe5b602002602001018460018151811061243157fe5b602002602001018560028151811061244557fe5b60209081029190910101929092529190525260125483516001600160a01b039091169063f92883a29086908690600190811061247d57fe5b60200260200101518460008151811061249257fe5b6020026020010151856001815181106124a757fe5b6020026020010151866002815181106124bc57fe5b60200260200101516040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182815260200195505050505050600060405180830381600087803b15801561251f57600080fd5b505af1158015612533573d6000803e3d6000fd5b505050508260028151811061254457fe5b6020026020010151600f819055508260038151811061255f57fe5b602090810291909101810151600e556001600160a01b03851660009081528082526040808220546007909352902054898203028161259957fe5b6001600160a01b038616600090815260076020908152604080832094909304909355808352818120546008909352205489820302816125d457fe5b6001600160a01b038616600090815260086020526040812092909104909155835183908590839061260157fe5b602090810291909101810151600480548d900390556001600160a01b03881660009081529182905260409091205491900391506126439086908b8103906128e9565b6001600160a01b038516600090815260208190526040812080548b90039055600b541561268f57600160401b840290506000600b54828161268057fe5b60118054929091049091019055505b6040516000906001600160a01b0388169084908381818185875af1925050503d80600081146126da576040519150601f19603f3d011682016040523d82523d6000602084013e6126df565b606091505b5050905080612728576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b866001600160a01b03167f20a7fc03b19d7f251cc907f177ff82194c6aebe9a2b47e1cd734dcb6bf772cc28c858960018151811061276257fe5b6020026020010151868b60048151811061277857fe5b6020026020010151604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a282866001815181106127bf57fe5b6020026020010151876004815181106127d457fe5b6020026020010151995099509950505050505050509193909250565b80600260018201045b81811015610f345780915060028182858161281057fe5b04018161281957fe5b0490506127f9565b600080600061285586856000808a6001600160a01b03166001600160a01b031681526020019081526020016000205461292b565b6001600160a01b039889166000818152600160208181526040808420805489900390556002808352818520805489900390556003808452828620805489900390559d909e1680855292825280842080549098019097559b8c528582208054909501909455988a5283892080549092019091558752968690528086208054869003905595855250505091902080549091019055565b6128f483838361292b565b6001600160a01b03909516600090815260016020908152604080832060028352818420600390935292209690965594559092555050565b6001600160a01b03831660009081526001602052604081205481908190849086028161295357fe5b6001600160a01b03881660009081526002602052604090205491900490859087028161297b57fe5b6001600160a01b0389166000908152600360205260409020549190049086908802816129a357fe5b049250925092509350935093905056fe74686520616d6f756e74206578636565647320746f74616c206561726e696e6773a2646970667358221220956c84691b2b41edc938ab79bd1d0750456b65d4a60db8bcdbfc50b630d6e3f464736f6c634300060c003360c0604052600560808190526421b7b637b960d91b60a090815261002691600691906100a6565b5060408051808201909152600280825261606360f01b6020909201918252610050916007916100a6565b5034801561005d57600080fd5b50604051610f03380380610f038339818101604052602081101561008057600080fd5b5051600880546001600160a01b0319166001600160a01b03909216919091179055610139565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100e757805160ff1916838001178555610114565b82800160010185558215610114579182015b828111156101145782518255916020019190600101906100f9565b50610120929150610124565b5090565b5b808211156101205760008155600101610125565b610dbb806101486000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80634bc7f977116100ad578063a9059cbb11610071578063a9059cbb1461039a578063b65a9bcf146103c6578063be45fd62146103ec578063dd62ed3e146104a7578063f92883a2146104d55761012c565b80634bc7f977146102fc57806370a082311461032057806390dbc6b21461034657806395d89b411461036c5780639843fc79146103745761012c565b806323b872dd116100f457806323b872dd1461025457806327e235e31461028a578063313ce567146102b05780633a9430ff146102ce5780633eaaf86b146102f45761012c565b806306fdde0314610131578063095ea7b3146101ae57806316279055146101ee57806318160ddd146102145780631f278b641461022e575b600080fd5b610139610515565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017357818101518382015260200161015b565b50505050905090810190601f1680156101a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101da600480360360408110156101c457600080fd5b506001600160a01b0381351690602001356105a3565b604080519115158252519081900360200190f35b6101da6004803603602081101561020457600080fd5b50356001600160a01b0316610610565b61021c61062f565b60408051918252519081900360200190f35b61021c6004803603602081101561024457600080fd5b50356001600160a01b0316610635565b6101da6004803603606081101561026a57600080fd5b506001600160a01b03813581169160208101359091169060400135610647565b61021c600480360360208110156102a057600080fd5b50356001600160a01b03166106d5565b6102b86106e7565b6040805160ff9092168252519081900360200190f35b6102d66106ec565b60408051938452602084019290925282820152519081900360600190f35b61021c610705565b61030461070b565b604080516001600160a01b039092168252519081900360200190f35b61021c6004803603602081101561033657600080fd5b50356001600160a01b031661071a565b6102d66004803603602081101561035c57600080fd5b50356001600160a01b0316610735565b6101396107e6565b61021c6004803603602081101561038a57600080fd5b50356001600160a01b0316610841565b6101da600480360360408110156103b057600080fd5b506001600160a01b038135169060200135610853565b61021c600480360360208110156103dc57600080fd5b50356001600160a01b0316610883565b6101da6004803603606081101561040257600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561043257600080fd5b82018360208201111561044457600080fd5b8035906020019184600183028401116401000000008311171561046657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610895945050505050565b61021c600480360360408110156104bd57600080fd5b506001600160a01b03813581169160200135166108c2565b610513600480360360a08110156104eb57600080fd5b506001600160a01b0381351690602081013590604081013590606081013590608001356108ed565b005b6006805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b505050505081565b3360008181526005602090815260408083206001600160a01b03871680855290835281842086905581518681529151939493909284927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a360019150505b92915050565b6000813b801561062457600191505061062a565b60009150505b919050565b60045490565b60026020526000908152604090205481565b6001600160a01b038316600090815260056020908152604080832033808552925282205483111561067757600080fd5b806001600160a01b0316856001600160a01b0316146106bd576001600160a01b038086166000908152600560209081526040808320938516835292905220805484900390555b6106c885858561097d565b60019150505b9392505050565b60006020819052908152604090205481565b601281565b60008060006106fa33610735565b925092509250909192565b60045481565b6008546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b0381166000908152602081905260408120548190819080610768576000806000935093509350506107df565b6001600160a01b03851660009081526001602052604090205481908161078a57fe5b6001600160a01b038716600090815260026020526040902054919004908290816107b057fe5b6001600160a01b038816600090815260036020526040902054919004908390816107d657fe5b04935093509350505b9193909250565b6007805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561059b5780601f106105705761010080835404028352916020019161059b565b60016020526000908152604090205481565b6000606061086084610610565b1561087857610870848483610a45565b91505061060a565b610870848483610be6565b60036020526000908152604090205481565b60006108a084610610565b156108b7576108b0848484610a45565b90506106ce565b6108b0848484610be6565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6008546001600160a01b0316331461090457600080fd5b6001600160a01b038516600090815260208190526040902080548501905560048054850190556109378585858585610cb2565b6040805185815290516001600160a01b038716917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a25050505050565b60008060006109b186856000808a6001600160a01b03166001600160a01b0316815260200190815260200160002054610cfd565b6001600160a01b039889166000818152600160208181526040808420805489900390556002808352818520805489900390556003808452828620805489900390559d909e1680855292825280842080549098019097559b8c528582208054909501909455988a5283892080549092019091558752968690528086208054869003905595855250505091902080549091019055565b6000610a5233858561097d565b60405163607705c560e11b815233600482018181526024830186905260606044840190815285516064850152855188946001600160a01b0386169463c0ee0b8a9490938a938a9360840190602085019080838360005b83811015610ac0578181015183820152602001610aa8565b50505050905090810190601f168015610aed5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610b0e57600080fd5b505af1158015610b22573d6000803e3d6000fd5b50505050846001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1686866040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ba0578181015183820152602001610b88565b50505050905090810190601f168015610bcd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3506001949350505050565b6000610bf333858561097d565b836001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c6d578181015183820152602001610c55565b50505050905090810190601f168015610c9a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35060019392505050565b6001600160a01b039490941660009081526001602090815260408083208054958702909501909455600281528382208054938602909301909255600390915220805491909202019055565b6001600160a01b038316600090815260016020526040812054819081908490860281610d2557fe5b6001600160a01b038816600090815260026020526040902054919004908590870281610d4d57fe5b6001600160a01b038916600090815260036020526040902054919004908690880281610d7557fe5b049250925092509350935093905056fea26469706673582212201aa7cd8a42534c2fd1cc8ca4cff235ddf49e03898986818662d4bd30e6b504e264736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106102885760003560e01c80637060ec021161015a578063b1e35242116100c1578063dd62ed3e1161007a578063dd62ed3e14610ac3578063e0cfe6ba14610afe578063e3c4d97d14610b13578063e8d310d214610b46578063ec5899e414610b5b578063ee4350ed14610b7057610288565b8063b1e35242146108d4578063b60d4288146108eb578063b65a9bcf146108f3578063be45fd6214610926578063c0ee0b8a146109ee578063dce0501014610a8057610288565b806395d89b411161011357806395d89b41146107f85780639843fc791461080d578063a3e5301c14610840578063a9059cbb14610871578063a9c0effd146108aa578063aa574244146108bf57610288565b80637060ec021461070257806370a08231146107175780638544d3fa1461074a5780638620410b1461077d57806390dbc6b21461079257806394b3a2a3146107c557610288565b80632446ce3f116101fe5780633eaaf86b116101b75780633eaaf86b146105f95780634851f91a1461060e5780634b6f1671146106415780634b7503341461065657806365bcfbe71461066b5780636a540df01461069e57610288565b80632446ce3f1461051457806327e235e314610529578063288237741461055c5780632e1a7d4d14610571578063313ce5671461059b5780633a9430ff146105c657610288565b80631627905511610250578063162790551461040257806318160ddd146104355780631f278b641461044a5780631fc5cfc41461047d57806322609373146104a757806323b872dd146104d157610288565b806306fdde031461028d578063095ea7b31461031757806310d0ffdd146103645780631554784a146103a05780631622dbe4146103ca575b600080fd5b34801561029957600080fd5b506102a2610b9a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102dc5781810151838201526020016102c4565b50505050905090810190601f1680156103095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561032357600080fd5b506103506004803603604081101561033a57600080fd5b506001600160a01b038135169060200135610bc1565b604080519115158252519081900360200190f35b34801561037057600080fd5b5061038e6004803603602081101561038757600080fd5b5035610c2e565b60408051918252519081900360200190f35b3480156103ac57600080fd5b5061038e600480360360208110156103c357600080fd5b5035610c60565b61038e600480360360808110156103e057600080fd5b506001600160a01b038135169060208101359060408101359060600135610d8a565b34801561040e57600080fd5b506103506004803603602081101561042557600080fd5b50356001600160a01b0316610f16565b34801561044157600080fd5b5061038e610f3a565b34801561045657600080fd5b5061038e6004803603602081101561046d57600080fd5b50356001600160a01b0316610f41565b34801561048957600080fd5b5061038e600480360360208110156104a057600080fd5b5035610f53565b3480156104b357600080fd5b5061038e600480360360208110156104ca57600080fd5b50356110f3565b3480156104dd57600080fd5b50610350600480360360608110156104f457600080fd5b506001600160a01b0381358116916020810135909116906040013561112a565b34801561052057600080fd5b5061038e6111b8565b34801561053557600080fd5b5061038e6004803603602081101561054c57600080fd5b50356001600160a01b03166111be565b34801561056857600080fd5b5061038e6111d0565b34801561057d57600080fd5b5061038e6004803603602081101561059457600080fd5b50356111d6565b3480156105a757600080fd5b506105b0611409565b6040805160ff9092168252519081900360200190f35b3480156105d257600080fd5b506105db61140e565b60408051938452602084019290925282820152519081900360600190f35b34801561060557600080fd5b5061038e611427565b34801561061a57600080fd5b5061038e6004803603602081101561063157600080fd5b50356001600160a01b031661142d565b34801561064d57600080fd5b5061038e611463565b34801561066257600080fd5b5061038e611469565b34801561067757600080fd5b5061038e6004803603602081101561068e57600080fd5b50356001600160a01b03166114bb565b3480156106aa57600080fd5b506106d7600480360360408110156106c157600080fd5b506001600160a01b0381351690602001356114cd565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561070e57600080fd5b5061038e6115e6565b34801561072357600080fd5b5061038e6004803603602081101561073a57600080fd5b50356001600160a01b03166115ec565b34801561075657600080fd5b5061038e6004803603602081101561076d57600080fd5b50356001600160a01b0316611607565b34801561078957600080fd5b5061038e611619565b34801561079e57600080fd5b506105db600480360360208110156107b557600080fd5b50356001600160a01b031661165f565b3480156107d157600080fd5b5061038e600480360360208110156107e857600080fd5b50356001600160a01b0316611710565b34801561080457600080fd5b506102a2611722565b34801561081957600080fd5b5061038e6004803603602081101561083057600080fd5b50356001600160a01b0316611743565b34801561084c57600080fd5b50610855611755565b604080516001600160a01b039092168252519081900360200190f35b34801561087d57600080fd5b506103506004803603604081101561089457600080fd5b506001600160a01b038135169060200135611764565b3480156108b657600080fd5b5061038e611794565b3480156108cb57600080fd5b506105db61179a565b3480156108e057600080fd5b506108e96117b0565b005b61038e6117cf565b3480156108ff57600080fd5b5061038e6004803603602081101561091657600080fd5b50356001600160a01b0316611897565b34801561093257600080fd5b506103506004803603606081101561094957600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561097957600080fd5b82018360208201111561098b57600080fd5b803590602001918460018302840111640100000000831117156109ad57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118a9945050505050565b3480156109fa57600080fd5b506108e960048036036060811015610a1157600080fd5b6001600160a01b0382351691602081013591810190606081016040820135640100000000811115610a4157600080fd5b820183602082011115610a5357600080fd5b80359060200191846001830284011164010000000083111715610a7557600080fd5b5090925090506118d6565b348015610a8c57600080fd5b50610aaa60048036036020811015610aa357600080fd5b50356119da565b6040805192835260208301919091528051918290030190f35b348015610acf57600080fd5b5061038e60048036036040811015610ae657600080fd5b506001600160a01b0381358116916020013516611d46565b348015610b0a57600080fd5b5061038e611d71565b348015610b1f57600080fd5b5061038e60048036036020811015610b3657600080fd5b50356001600160a01b0316611d9d565b348015610b5257600080fd5b5061038e611daf565b348015610b6757600080fd5b5061038e611db5565b348015610b7c57600080fd5b506105db60048036036020811015610b9357600080fd5b5035611dbb565b6040518060400160405280600b81526020016a2834bd3d30902a37b5b2b760a91b81525081565b3360008181526005602090815260408083206001600160a01b03871680855290835281842086905581518681529151939493909284927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a360019150505b92915050565b600080610c3a83610c60565b90506000610c488483611e38565b90506000610c5582611e4a565b93505050505b919050565b601254604080516370a0823160e01b81526000600482018190529151919283926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015610cb157600080fd5b505afa158015610cc5573d6000803e3d6000fd5b505050506040513d6020811015610cdb57600080fd5b5051601254604080516318160ddd60e01b815290516001600160a01b03909216916318160ddd91600480820192602092909190829003018186803b158015610d2257600080fd5b505afa158015610d36573d6000803e3d6000fd5b505050506040513d6020811015610d4c57600080fd5b5051600b549190039150610d64576000915050610c5b565b600c54600e5482600b548403860281610d7957fe5b040281610d8257fe5b049392505050565b6000670de0b6b3a7640000841115610da857670de0b6b3a764000093505b670de0b6b3a7640000831115610dc457670de0b6b3a764000092505b670de0b6b3a7640000821115610de057670de0b6b3a764000091505b64e8d4a51000341015610df257600080fd5b6000610dfd34610c60565b6001600160a01b03871660009081526007602090815260408083208054348690039081019091556008909252909120805442808402600160401b02918201909255600c805484019055600d8054909101905591925090610e5c82611e4a565b9350610e6b8885898989611ee0565b60048054850190556001600160a01b0388166000908152602081905260408120805486019055600b5415610ebe57600160401b840290506000600b548281610eaf57fe5b60118054929091049091019055505b604080513481526020810187905280820183905290516001600160a01b038b16917fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d919081900360600190a250505050949350505050565b6000813b8015610f2a576001915050610c5b565b6000915050610c5b565b50919050565b6004545b90565b60026020526000908152604090205481565b33600081815260096020526040812054909190808411801590610f765750600084115b610f7f57600080fd5b600b548410610f8d57600080fd5b6001600160a01b0382166000908152600a6020526040812054601154830203908286830281610fb857fe5b6011546001600160a01b0387166000908152600a602090815260408083208054948d02969095049586039093019093556009909252902080548890039055600b805488900390819055909150818161100c57fe5b601180549290910490910190556012546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018a90529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561106f57600080fd5b505af1158015611083573d6000803e3d6000fd5b505050506040513d602081101561109957600080fd5b505060408051878152600160401b8304602082015281516001600160a01b038716927ff597bb09fb98a90b578e74952df9d7e06d7505f52a264d786bb11770873dccb2928290030190a2600160401b900495945050505050565b600060045482111561110457600080fd5b600061110f83611f2b565b9050600061111c82610c60565b90506000610c558383611e38565b6001600160a01b038316600090815260056020908152604080832033808552925282205483111561115a57600080fd5b806001600160a01b0316856001600160a01b0316146111a0576001600160a01b038086166000908152600560209081526040808320938516835292905220805484900390555b6111ab858585611f9e565b60019150505b9392505050565b600e5481565b60006020819052908152604090205481565b600b5481565b336000818152600a602090815260408083205460099092528220546011549293920203600160401b81048085118015906112105750600085115b61121957600080fd5b6001600160a01b0383166000908152600960205260409020548186810382028161123f57fe5b6001600160a01b0380871660009081526009602090815260408083209590940494859055601254600654855163a9059cbb60e01b81529085166004820152958703602487018190529451949593169363a9059cbb93604480820194918390030190829087803b1580156112b157600080fd5b505af11580156112c5573d6000803e3d6000fd5b505050506040513d60208110156112db57600080fd5b5050600b80548290039055601154600090820284868a02816112f957fe5b6001600160a01b0389166000818152600a6020526040808220805495909404959095039384019092556010805484019055925191935091908a908381818185875af1925050503d806000811461136b576040519150601f19603f3d011682016040523d82523d6000602084013e611370565b606091505b50509050806113b9576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b604080518a81526020810185905281516001600160a01b038a16927ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568928290030190a25090979650505050505050565b601281565b600080600061141c3361165f565b925092509250909192565b60045481565b6001600160a01b03166000908152600a6020908152604080832054600990925290912054601154600160401b9102919091030490565b60115481565b60006004546000141561148257506414f46b0400610f3e565b6000611495670de0b6b3a7640000611f2b565b905060006114a282610c60565b905060006114b08383611e38565b9350610f3e92505050565b600a6020526000908152604090205481565b6000806000806000806114df87611f2b565b6001600160a01b038916600090815260208181526040808320546007909252822054929350909189028161150f57fe5b6001600160a01b038b166000908152600760209081526040808320546008909252822054939092049350918161154157fe5b6001600160a01b038c1660009081526020818152604080832054600890925282205493909204935042600160401b02849003929091908c028161158057fe5b04600f54019050600084600e540190506000600e54600c5403600f54600d5403816115a757fe5b04600160401b420203905086878783878a02816115c057fe5b0402816115c957fe5b919d5090049a509198509650929450505050509295509295909350565b60105481565b6001600160a01b031660009081526020819052604090205490565b60086020526000908152604090205481565b600060045460001415611632575064199c82cc00610f3e565b6000611645670de0b6b3a7640000611f2b565b9050600061165282610c60565b919091019150610f3e9050565b6001600160a01b038116600090815260208190526040812054819081908061169257600080600093509350935050611709565b6001600160a01b0385166000908152600160205260409020548190816116b457fe5b6001600160a01b038716600090815260026020526040902054919004908290816116da57fe5b6001600160a01b0388166000908152600360205260409020549190049083908161170057fe5b04935093509350505b9193909250565b60076020526000908152604090205481565b6040518060400160405280600581526020016450695a5a6160d81b81525081565b60016020526000908152604090205481565b6012546001600160a01b031681565b6000606061177184610f16565b15611789576117818484836120a2565b915050610c28565b611781848483612243565b600d5481565b600080600061141c6117ab336115ec565b61230f565b6117b861179a565b5050506117cc6117c73361142d565b6111d6565b50565b60408051600380825260808201909252600091606091906020820183803683370190505090506117fe3361165f565b8360008151811061180b57fe5b602002602001018460018151811061181f57fe5b602002602001018560028151811061183357fe5b60200260200101838152508381525083815250505050611891338260008151811061185a57fe5b60200260200101518360018151811061186f57fe5b60200260200101518460028151811061188457fe5b6020026020010151610d8a565b91505090565b60036020526000908152604090205481565b60006118b484610f16565b156118cb576118c48484846120a2565b90506111b1565b6118c4848484612243565b6012546001600160a01b031633141561199d576001600160a01b0384166000818152600960209081526040808320805488019055600b805488019055601154600a83529281902080549388029384019055601080548401905580518781529182018181529082018590529192917f496d21a3791df17b9e71acba0bd6c88352f3da2636dc2bfae959f09af6c4fb999187918791879160608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a2506119d4565b6040805162461bcd60e51b81526020600482015260076024820152661b9bc81dd85b9d60ca1b604482015290519081900360640190fd5b50505050565b336000818152600a60209081526040808320546009909252822054601154929384939092910203600160401b810480861115611a475760405162461bcd60e51b81526004018080602001828103825260218152602001806129b46021913960400191505060405180910390fd5b6001600160a01b03831660009081526009602052604090205481878103820281611a6d57fe5b6001600160a01b0380871660009081526009602090815260408083209590940494859055601254600654855163a9059cbb60e01b81529085166004820152958703602487018190529451949593169363a9059cbb93604480820194918390030190829087803b158015611adf57600080fd5b505af1158015611af3573d6000803e3d6000fd5b505050506040513d6020811015611b0957600080fd5b5050600b80548290039055601154600090820284868b0281611b2757fe5b6001600160a01b0389166000908152600a6020526040902080549290910492909203908101909155601080548201905590508864e8d4a51000811015611b6c57600080fd5b6000611b7782610c60565b6001600160a01b03891660009081526007602090815260408083208054858803908101909155600890925282208054428302600160401b02908101909155600c805483019055600d80549091019055919250611bd282611e4a565b6040805160038082526080820190925291925060609190602082018380368337019050509050611c018b61165f565b83600081518110611c0e57fe5b6020026020010184600181518110611c2257fe5b6020026020010185600281518110611c3657fe5b60200260200101838152508381525083815250505050611c958b8383600081518110611c5e57fe5b602002602001015184600181518110611c7357fe5b602002602001015185600281518110611c8857fe5b6020026020010151611ee0565b600b5460009015611cc557600160401b850290506000600b548281611cb657fe5b60118054929091049091019055505b60048054840190556001600160a01b038c166000818152602081815260409182902080548701905581518981529081018b90528082018690526060810184905290517fc7209ba1b691ad661f5afd3d5360a45f0f4e3dac25357bf4f346e73166f35c939181900360800190a250909b50949950505050505050505050915091565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6000600160401b600e54600c5403600f54600d540381611d8d57fe5b0481611d9557fe5b044203905090565b60096020526000908152604090205481565b600f5481565b600c5481565b600080600080611dca336115ec565b905084811015611e21576040805162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206d6f7265207468616e2062616c616e63650000000000604482015290519081900360640190fd5b611e2a8561230f565b919790965090945092505050565b600082821115611e4457fe5b50900390565b6004546000906c01431e0fae6d7217caa00000009082906402540be400611ecf611ec9730380d4bd8a8678c1bb542c80deb4800000000000880268056bc75e2d631000006002860a02017005e0a1fd2712875988becaad0000000000850201780197d4df19d605767337e9f14d3eec8920e400000000000000016127f0565b85611e38565b81611ed657fe5b0403949350505050565b6001600160a01b039490941660009081526001602090815260408083208054958702909501909455600281528382208054938602909301909255600390915220805491909202019055565b600454600090670de0b6b3a7640000808401918101908390611f8d866402540be4008386046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381611f7857fe5b046402540be4000281611f8757fe5b04611e38565b81611f9457fe5b0495945050505050565b6001600160a01b038316600090815260208190526040902054808211801590611fc75750600082115b611fd057600080fd5b6001600160a01b0384166000908152600760205260408120548290840281611ff457fe5b6001600160a01b03871660009081526008602052604081205492909104925090839085028161201f57fe5b6001600160a01b03808916600090815260076020818152604080842080548a9003905560088083528185208054989097049788900390965583825280842080548c90039055938b168352908152828220805488019055928352818120805485019055918290529020805486019055905061209a868686612821565b505050505050565b60006120af338585611f9e565b60405163607705c560e11b815233600482018181526024830186905260606044840190815285516064850152855188946001600160a01b0386169463c0ee0b8a9490938a938a9360840190602085019080838360005b8381101561211d578181015183820152602001612105565b50505050905090810190601f16801561214a5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561216b57600080fd5b505af115801561217f573d6000803e3d6000fd5b50505050846001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1686866040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156121fd5781810151838201526020016121e5565b50505050905090810190601f16801561222a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3506001949350505050565b6000612250338585611f9e565b836001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156122ca5781810151838201526020016122b2565b50505050905090810190601f1680156122f75780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35060019392505050565b60408051600580825260c082019092526000918291829133916060916020820160a08036833701905050905061234582876114cd565b8560008151811061235257fe5b602002602001018660018151811061236657fe5b602002602001018760028151811061237a57fe5b602002602001018860038151811061238e57fe5b60200260200101896004815181106123a257fe5b602002602001018581525085815250858152508581525085815250505050505060006123e1826000815181106123d457fe5b6020026020010151610c60565b60408051600380825260808201909252919250606091906020820183803683370190505090506124108461165f565b8360008151811061241d57fe5b602002602001018460018151811061243157fe5b602002602001018560028151811061244557fe5b60209081029190910101929092529190525260125483516001600160a01b039091169063f92883a29086908690600190811061247d57fe5b60200260200101518460008151811061249257fe5b6020026020010151856001815181106124a757fe5b6020026020010151866002815181106124bc57fe5b60200260200101516040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182815260200195505050505050600060405180830381600087803b15801561251f57600080fd5b505af1158015612533573d6000803e3d6000fd5b505050508260028151811061254457fe5b6020026020010151600f819055508260038151811061255f57fe5b602090810291909101810151600e556001600160a01b03851660009081528082526040808220546007909352902054898203028161259957fe5b6001600160a01b038616600090815260076020908152604080832094909304909355808352818120546008909352205489820302816125d457fe5b6001600160a01b038616600090815260086020526040812092909104909155835183908590839061260157fe5b602090810291909101810151600480548d900390556001600160a01b03881660009081529182905260409091205491900391506126439086908b8103906128e9565b6001600160a01b038516600090815260208190526040812080548b90039055600b541561268f57600160401b840290506000600b54828161268057fe5b60118054929091049091019055505b6040516000906001600160a01b0388169084908381818185875af1925050503d80600081146126da576040519150601f19603f3d011682016040523d82523d6000602084013e6126df565b606091505b5050905080612728576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b866001600160a01b03167f20a7fc03b19d7f251cc907f177ff82194c6aebe9a2b47e1cd734dcb6bf772cc28c858960018151811061276257fe5b6020026020010151868b60048151811061277857fe5b6020026020010151604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a282866001815181106127bf57fe5b6020026020010151876004815181106127d457fe5b6020026020010151995099509950505050505050509193909250565b80600260018201045b81811015610f345780915060028182858161281057fe5b04018161281957fe5b0490506127f9565b600080600061285586856000808a6001600160a01b03166001600160a01b031681526020019081526020016000205461292b565b6001600160a01b039889166000818152600160208181526040808420805489900390556002808352818520805489900390556003808452828620805489900390559d909e1680855292825280842080549098019097559b8c528582208054909501909455988a5283892080549092019091558752968690528086208054869003905595855250505091902080549091019055565b6128f483838361292b565b6001600160a01b03909516600090815260016020908152604080832060028352818420600390935292209690965594559092555050565b6001600160a01b03831660009081526001602052604081205481908190849086028161295357fe5b6001600160a01b03881660009081526002602052604090205491900490859087028161297b57fe5b6001600160a01b0389166000908152600360205260409020549190049086908802816129a357fe5b049250925092509350935093905056fe74686520616d6f756e74206578636565647320746f74616c206561726e696e6773a2646970667358221220956c84691b2b41edc938ab79bd1d0750456b65d4a60db8bcdbfc50b630d6e3f464736f6c634300060c0033

Deployed Bytecode Sourcemap

4549:20282:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5026:43;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4020:223;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4020:223:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21999:375;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21999:375:0;;:::i;:::-;;;;;;;;;;;;;;;;6318:338;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6318:338:0;;:::i;11259:1695::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11259:1695:0;;;;;;;;;;;;;;;;;;:::i;4251:291::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4251:291:0;-1:-1:-1;;;;;4251:291:0;;:::i;522:91::-;;;;;;;;;;;;;:::i;236:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;236:40:0;-1:-1:-1;;;;;236:40:0;;:::i;19343:1010::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19343:1010:0;;:::i;22388:392::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22388:392:0;;:::i;3616:322::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3616:322:0;;;;;;;;;;;;;;;;;:::i;5887:26::-;;;;;;;;;;;;;:::i;147:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;147:43:0;-1:-1:-1;;;;;147:43:0;;:::i;5717:33::-;;;;;;;;;;;;;:::i;18034:1215::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18034:1215:0;;:::i;5116:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;931:98;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;325:24;;;;;;;;;;;;;:::i;10977:191::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10977:191:0;-1:-1:-1;;;;;10977:191:0;;:::i;6141:33::-;;;;;;;;;;;;;:::i;21471:520::-;;;;;;;;;;;;;:::i;5606:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5606:41:0;-1:-1:-1;;;;;5606:41:0;;:::i;13123:1153::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13123:1153:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5983:28;;;;;;;;;;;;;:::i;621:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:106:0;-1:-1:-1;;;;;621:106:0;;:::i;5283:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5283:55:0;-1:-1:-1;;;;;5283:55:0;;:::i;20954:509::-;;;;;;;;;;;;;:::i;1036:267::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1036:267:0;-1:-1:-1;;;;;1036:267:0;;:::i;5157:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5157:51:0;-1:-1:-1;;;;;5157:51:0;;:::i;5073:39::-;;;;;;;;;;;;;:::i;194:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;194:38:0;-1:-1:-1;;;;;194:38:0;;:::i;6211:25::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;6211:25:0;;;;;;;;;;;;;;2008:364;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2008:364:0;;;;;;;;:::i;5857:26::-;;;;;;;;;;;;;:::i;9728:150::-;;;;;;;;;;;;;:::i;10328:101::-;;;;;;;;;;;;;:::i;:::-;;10518:208;;;:::i;280:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;280:39:0;-1:-1:-1;;;;;280:39:0;;:::i;1636:241::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1636:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1636:241:0;;-1:-1:-1;1636:241:0;;-1:-1:-1;;;;;1636:241:0:i;17295:496::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17295:496:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17295:496:0;;-1:-1:-1;17295:496:0;-1:-1:-1;17295:496:0;:::i;6930:2761::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6930:2761:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3488:117;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3488:117:0;;;;;;;;;;:::i;12959:159::-;;;;;;;;;;;;;:::i;5417:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5417:48:0;-1:-1:-1;;;;;5417:48:0;;:::i;5917:27::-;;;;;;;;;;;;;:::i;5828:25::-;;;;;;;;;;;;;:::i;9883:356::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9883:356:0;;:::i;5026:43::-;;;;;;;;;;;;;;-1:-1:-1;;;5026:43:0;;;;:::o;4020:223::-;4110:10;4079:4;4131:17;;;:9;:17;;;;;;;;-1:-1:-1;;;;;4131:22:0;;;;;;;;;;;:31;;;4180;;;;;;;4079:4;;4110:10;4131:22;;4110:10;;4180:31;;;;;;;;;;;4231:4;4224:11;;;4020:223;;;;;:::o;21999:375::-;22108:7;22133:18;22154:25;22162:16;22154:7;:25::i;:::-;22133:46;;22190:22;22215:38;22224:16;22242:10;22215:8;:38::i;:::-;22190:63;;22264:23;22290:33;22308:14;22290:17;:33::i;:::-;22264:59;-1:-1:-1;;;;21999:375:0;;;;:::o;6318:338::-;6443:12;;:36;;;-1:-1:-1;;;6443:36:0;;6373:8;6443:36;;;;;;;;6373:8;;;;-1:-1:-1;;;;;6443:12:0;;;;:22;;:36;;;;;;;;;;;;;;:12;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6443:36:0;6414:12;;:26;;;-1:-1:-1;;;6414:26:0;;;;-1:-1:-1;;;;;6414:12:0;;;;:24;;:26;;;;;6443:36;;6414:26;;;;;;;;:12;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6414:26:0;6489:18;;6414:65;;;;-1:-1:-1;6484:43:0;;6526:1;6519:8;;;;;6484:43;6638:13;;6621:14;;6600:18;6577;;6556;:39;6541:10;:56;:77;;;;;;:94;:110;;;;;;;6318:338;-1:-1:-1;;;6318:338:0:o;11259:1695::-;11345:17;11376:4;11371;:9;11368:25;;;11389:4;11382:11;;11368:25;11408:4;11401:6;:11;11398:29;;;11423:4;11414:13;;11398:29;11441:4;11435:5;:10;11432:27;;;11455:4;11447:12;;11432:27;11585:14;11573:9;:26;11568:46;;;11606:8;;;11568:46;11645:8;11656:18;11664:9;11656:7;:18::i;:::-;-1:-1:-1;;;;;11850:22:0;;11750:13;11850:22;;;:16;:22;;;;;;;;:34;;11766:9;:15;;;11850:34;;;;;;11889:20;:26;;;;;;:66;;11842:3;11919:36;;;-1:-1:-1;;;11919:36:0;11889:66;;;;;;11960:13;:25;;;;;;11990:14;:54;;;;;;;11645:29;;-1:-1:-1;11766:15:0;12129:27;11766:15;12129:17;:27::i;:::-;12114:42;;12161:49;12170:4;12176:12;12190:4;12196:6;12204:5;12161:8;:49::i;:::-;12265:12;:28;;;;;;-1:-1:-1;;;;;12352:14:0;;12265:12;12352:14;;;;;;;;;;:30;;;;;;12455:18;;:22;12451:418;;-1:-1:-1;;;12498:3:0;:17;12485:30;;12700:21;12735:18;;12724:10;:29;;;;;12825:18;:38;;12724:29;;;;12825:38;;;;;-1:-1:-1;12451:418:0;12878:47;;;12889:9;12878:47;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12878:47:0;;;;;;;;;;;;;12930:19;;;;11259:1695;;;;;;:::o;4251:291::-;4307:16;4446:18;;4476:8;;4473:65;;4499:4;4492:11;;;;;4473:65;4527:5;4520:12;;;;;4473:65;4251:291;;;;:::o;522:91::-;593:12;;522:91;;:::o;236:40::-;;;;;;;;;;;;;:::o;19343:1010::-;19432:10;19394:15;19463:23;;;:13;:23;;;;;;19394:15;;19432:10;19499:18;;;;;;:32;;;19530:1;19521:6;:10;19499:32;19491:41;;;;;;19554:18;;19545:6;:27;19537:36;;;;;;-1:-1:-1;;;;;19692:15:0;;19618:22;19692:15;;;:7;:15;;;;;;19670:18;;19659:29;;19650:57;;19659:8;19738:26;;;19659:8;19738:37;;;;19962:18;;-1:-1:-1;;;;;19904:15:0;;;;;;:7;:15;;;;;;;;:86;;19962:27;;;19738:37;;;;19923:67;;;19904:86;;;;;;19997:13;:21;;;;;:31;;;;;;;20033:18;:28;;;;;;;;;19738:37;;-1:-1:-1;19738:37:0;20033:28;20149:38;;;;20127:18;:60;;20149:38;;;;20127:60;;;;;20194:12;;:39;;;-1:-1:-1;;;20194:39:0;;-1:-1:-1;;;;;20194:39:0;;;;;;;;;;;;;;;:12;;;;;:21;;:39;;;;;;;;;;;;;;-1:-1:-1;20194:12:0;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20243:62:0;;;;;;-1:-1:-1;;;20273:31:0;;20243:62;;;;;;-1:-1:-1;;;;;20243:62:0;;;;;;;;;;;-1:-1:-1;;;20317:31:0;;;;-1:-1:-1;;;;;19343:1010:0:o;22388:392::-;22496:7;22546:12;;22529:13;:29;;22521:38;;;;;;22570:17;22590:32;22608:13;22590:17;:32::i;:::-;22570:52;;22633:18;22654:19;22662:9;22654:7;:19::i;:::-;22633:40;;22684:22;22709:31;22718:9;22729:10;22709:8;:31::i;3616:322::-;-1:-1:-1;;;;;3752:14:0;;3693:4;3752:14;;;:9;:14;;;;;;;;3723:10;3752:22;;;;;;;;:33;-1:-1:-1;3752:33:0;3744:42;;;;;;3808:6;-1:-1:-1;;;;;3801:13:0;:3;-1:-1:-1;;;;;3801:13:0;;3797:79;;-1:-1:-1;;;;;3831:14:0;;;;;;;:9;:14;;;;;;;;:22;;;;;;;;;:33;;;;;;;3797:79;3880:26;3891:3;3895;3899:6;3880:10;:26::i;:::-;3926:4;3919:11;;;3616:322;;;;;;:::o;5887:26::-;;;;:::o;147:43::-;;;;;;;;;;;;;;:::o;5717:33::-;;;;:::o;18034:1215::-;18115:10;18080:4;18299:15;;;:7;:15;;;;;;;;;18273:13;:21;;;;;;18252:18;;18080:4;;18115:10;18252:42;18242:72;-1:-1:-1;;;18341:25:0;;18380:23;;;;;;:37;;;18416:1;18407:6;:10;18380:37;18371:48;;;;;;-1:-1:-1;;;;;18441:21:0;;18424:14;18441:21;;;:13;:21;;;;;;18532:13;18505:22;;;18491:38;;18532:13;18491:54;;;;-1:-1:-1;;;;;18467:21:0;;;;;;;:13;:21;;;;;;;;18491:54;;;;18467:78;;;;18606:12;;18629:8;;18606:44;;-1:-1:-1;;;18606:44:0;;18629:8;;;18606:44;;;;18568:33;;;18606:44;;;;;;;;18568:33;;18606:12;;;:21;;:44;;;;;;;;;;;;;:12;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18655:18:0;:32;;;;;;;18816:18;;18655;;18805:29;;18782:13;18759:20;;;18782:13;18759:36;;;;-1:-1:-1;;;;;18840:15:0;;;;;;:7;:15;;;;;;:36;;18759;;;;18753:82;;;;18840:36;;;;;;18958:14;:35;;;;;;19096:30;;18753:82;;-1:-1:-1;18840:15:0;;19115:6;;18840:15;19096:30;18840:15;19096:30;19115:6;18840:15;19096:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19077:49;;;19145:7;19137:36;;;;;-1:-1:-1;;;19137:36:0;;;;;;;;;;;;-1:-1:-1;;;19137:36:0;;;;;;;;;;;;;;;19185:37;;;;;;;;;;;;;;-1:-1:-1;;;;;19185:37:0;;;;;;;;;;;-1:-1:-1;19234:10:0;;18034:1215;-1:-1:-1;;;;;;;18034:1215:0:o;5116:35::-;5149:2;5116:35;:::o;931:98::-;972:4;977;982;1001:21;1011:10;1001:9;:21::i;:::-;994:28;;;;;;931:98;;;:::o;325:24::-;;;;:::o;10977:191::-;-1:-1:-1;;;;;11133:15:0;11039:14;11133:15;;;:7;:15;;;;;;;;;11108:13;:21;;;;;;;11087:18;;-1:-1:-1;;;11087:42:0;;11078:70;;;;11067:96;;10977:191::o;6141:33::-;;;;:::o;21471:520::-;21542:7;21650:12;;21666:1;21650:17;21647:337;;;-1:-1:-1;21690:43:0;21683:50;;21647:337;21766:17;21786:23;21804:4;21786:17;:23::i;:::-;21766:43;;21824:18;21845:20;21853:9;21845:7;:20::i;:::-;21824:41;;21880:22;21905:31;21914:9;21925:10;21905:8;:31::i;:::-;21880:56;-1:-1:-1;21951:21:0;;-1:-1:-1;;;21951:21:0;5606:41;;;;;;;;;;;;;:::o;13123:1153::-;13205:15;13222:19;13243:23;13268:22;13292:21;13319:15;13337:32;13355:13;13337:17;:32::i;:::-;-1:-1:-1;;;;;13432:14:0;;13374;13432;;;;;;;;;;;;13391:16;:22;;;;;;13319:50;;-1:-1:-1;13374:14:0;;13391:38;;13432:14;13391:55;;;;-1:-1:-1;;;;;13676:22:0;;13630:14;13676:22;;;:16;:22;;;;;;;;;13647:20;:26;;;;;;13391:55;;;;;-1:-1:-1;13630:14:0;13676:22;13647:51;;;;-1:-1:-1;;;;;13846:14:0;;13703:16;13846:14;;;;;;;;;;;;13801:20;:26;;;;;;13647:51;;;;;-1:-1:-1;13722:3:0;-1:-1:-1;;;13722:17:0;:29;;;;13703:16;;13846:14;13801:42;;13846:14;13801:59;;;;;13783:15;;:77;13756:104;;13865:23;13908:9;13891:14;;:26;13865:52;;14005:23;14108:14;;14092:13;;:30;14070:15;;14053:14;;:32;14051:73;;;;;;-1:-1:-1;;;14031:3:0;:17;:93;14005:119;;14137:10;14208;14196:9;14175:18;14161:11;14149:9;:23;:44;;;;;;:56;:69;;;;;14129:142;;-1:-1:-1;14149:69:0;;;-1:-1:-1;14220:19:0;;-1:-1:-1;14241:18:0;-1:-1:-1;14261:9:0;;-1:-1:-1;;;;;13123:1153:0;;;;;;;;:::o;5983:28::-;;;;:::o;621:106::-;-1:-1:-1;;;;;706:16:0;677:15;706:16;;;;;;;;;;;;621:106::o;5283:55::-;;;;;;;;;;;;;:::o;20954:509::-;21023:7;21131:12;;21147:1;21131:17;21128:328;;;-1:-1:-1;21171:43:0;21164:50;;21128:328;21247:17;21267:23;21285:4;21267:17;:23::i;:::-;21247:43;;21305:18;21326:20;21334:9;21326:7;:20::i;:::-;21386:22;;;;;-1:-1:-1;21423:21:0;;-1:-1:-1;21423:21:0;1036:267;-1:-1:-1;;;;;1132:14:0;;1089:4;1132:14;;;;;;;;;;;1089:4;;;;1157:16;1153:51;;1190:1;1192;1194;1182:14;;;;;;;;;1153:51;-1:-1:-1;;;;;1219:9:0;;;;;;:3;:9;;;;;;1229:13;;;1219:23;;;;-1:-1:-1;;;;;1244:11:0;;;;;;:5;:11;;;;;;1219:23;;;;1256:13;;;1244:25;;;;-1:-1:-1;;;;;1271:10:0;;;;;;:4;:10;;;;;;1244:25;;;;1282:13;;;1271:24;;;;;1210:86;;;;;;;1036:267;;;;;;:::o;5157:51::-;;;;;;;;;;;;;:::o;5073:39::-;;;;;;;;;;;;;;-1:-1:-1;;;5073:39:0;;;;:::o;194:38::-;;;;;;;;;;;;;:::o;6211:25::-;;;-1:-1:-1;;;;;6211:25:0;;:::o;2008:364::-;2076:4;2209:18;2235:15;2246:3;2235:10;:15::i;:::-;2232:136;;;2264:38;2283:3;2288:6;2296:5;2264:18;:38::i;:::-;2257:45;;;;;2232:136;2325:37;2343:3;2348:6;2356:5;2325:17;:37::i;5857:26::-;;;;:::o;9728:150::-;9767:17;9786:22;9810:21;9844:29;9850:21;9860:10;9850:9;:21::i;:::-;9844:4;:29::i;10328:101::-;10366:14;:12;:14::i;:::-;;;;10385:39;10395:27;10411:10;10395:15;:27::i;:::-;10385:8;:39::i;:::-;;10328:101::o;10518:208::-;10600:13;;;10611:1;10600:13;;;;;;;;;10557:17;;10580;;10600:13;;;;10580:17;;10600:13;;;;;-1:-1:-1;10600:13:0;10580:33;;10647:21;10657:10;10647:9;:21::i;:::-;10621:3;10625:1;10621:6;;;;;;;;;;;;;10629:3;10633:1;10629:6;;;;;;;;;;;;;10637:3;10641:1;10637:6;;;;;;;;;;;;;10620:48;;;;;;;;;;;;;;;10680:39;10684:10;10696:3;10700:1;10696:6;;;;;;;;;;;;;;10704:3;10708:1;10704:6;;;;;;;;;;;;;;10712:3;10716:1;10712:6;;;;;;;;;;;;;;10680:3;:39::i;:::-;10673:46;;;10518:208;:::o;280:39::-;;;;;;;;;;;;;:::o;1636:241::-;1724:4;1739:15;1750:3;1739:10;:15::i;:::-;1735:138;;;1769:38;1788:3;1793:6;1801:5;1769:18;:38::i;:::-;1762:45;;;;1735:138;1830:37;1848:3;1853:6;1861:5;1830:17;:37::i;17295:496::-;17404:12;;-1:-1:-1;;;;;17404:12:0;17382:10;:35;17379:408;;;-1:-1:-1;;;;;17425:19:0;;;;;;:13;:19;;;;;;;;:28;;;;;;17459:18;:27;;;;;;17608:18;;17641:7;:13;;;;;;:27;;17608:26;;;17641:27;;;;;17674:14;:28;;;;;;17715:33;;;;;;;;;;;;;;;;;17608:26;;17425:19;17715:33;;17448:5;;17742;;;;17715:33;;;17742:5;;;;17715:33;;;;;;;;;;;;;-1:-1:-1;;17715:33:0;;;;;;;;-1:-1:-1;17715:33:0;;-1:-1:-1;;;;;17715:33:0;17379:408;;;;17764:17;;;-1:-1:-1;;;17764:17:0;;;;;;;;;;;;-1:-1:-1;;;17764:17:0;;;;;;;;;;;;;;17379:408;17295:496;;;;:::o;6930:2761::-;7028:10;6996:4;7214:15;;;:7;:15;;;;;;;;;7188:13;:21;;;;;;7167:18;;6996:4;;;;7028:10;;7167:42;;7157:72;-1:-1:-1;;;7256:25:0;;7320:35;;;;7312:81;;;;-1:-1:-1;;;7312:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7415:21:0;;7398:14;7415:21;;;:13;:21;;;;;;7516:13;7478:34;;;7465:48;;7516:13;7465:64;;;;-1:-1:-1;;;;;7441:21:0;;;;;;;:13;:21;;;;;;;;7465:64;;;;7441:88;;;;7590:12;;7613:8;;7590:45;;-1:-1:-1;;;7590:45:0;;7613:8;;;7590:45;;;;7552:33;;;7590:45;;;;;;;;7552:33;;7590:12;;;:21;;:45;;;;;;;;;;;;;:12;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7640:18:0;:32;;;;;;;7813:18;;7640;;7802:29;;7779:13;7744:32;;;7779:13;7744:48;;;;-1:-1:-1;;;;;7837:15:0;;;;;;:7;:15;;;;;:36;;7744:48;;;;7738:94;;;;7837:36;;;;;;7955:14;:35;;;;;;7738:94;-1:-1:-1;8059:18:0;8164:14;8155:23;;8151:41;;;8184:8;;;8151:41;8223:8;8234:15;8242:6;8234:7;:15::i;:::-;-1:-1:-1;;;;;8394:24:0;;8324:13;8394:24;;;:16;:24;;;;;;;;:36;;8340:12;;;8394:36;;;;;;8435:20;:28;;;;;:60;;8467:3;:28;;-1:-1:-1;;;8467:28:0;8435:60;;;;;;8500:13;:25;;;;;;8530:14;:46;;;;;;;8223:26;;-1:-1:-1;8666:27:0;8340:12;8666:17;:27::i;:::-;8718:13;;;8729:1;8718:13;;;;;;;;;8646:47;;-1:-1:-1;8698:17:0;;8718:13;;;;8698:17;;8718:13;;;;;-1:-1:-1;8718:13:0;8698:33;;8765:17;8775:6;8765:9;:17::i;:::-;8739:3;8743:1;8739:6;;;;;;;;;;;;;8747:3;8751:1;8747:6;;;;;;;;;;;;;8755:3;8759:1;8755:6;;;;;;;;;;;;;8738:44;;;;;;;;;;;;;;;8791:54;8800:6;8808:12;8822:3;8826:1;8822:6;;;;;;;;;;;;;;8830:3;8834:1;8830:6;;;;;;;;;;;;;;8838:3;8842:1;8838:6;;;;;;;;;;;;;;8791:8;:54::i;:::-;8981:18;;8912:15;;8981:22;8976:425;;-1:-1:-1;;;9025:3:0;:17;9012:30;;9232:21;9269:18;;9256:10;:31;;;;;9357:18;:38;;9256:31;;;;9357:38;;;;;-1:-1:-1;8976:425:0;9455:12;:28;;;;;;-1:-1:-1;;;;;9542:16:0;;9455:12;9542:16;;;;;;;;;;;;:32;;;;;;9586:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9661:12:0;;-1:-1:-1;9675:10:0;;-1:-1:-1;;;;;;;;;;6930:2761:0;;;:::o;3488:117::-;-1:-1:-1;;;;;3578:14:0;;;3554:4;3578:14;;;:9;:14;;;;;;;;:19;;;;;;;;;;;;;3488:117::o;12959:159::-;12998:13;-1:-1:-1;;;13084:14:0;;13068:13;;:30;13048:15;;13031:14;;:32;13030:69;;;;;;:83;;;;;;13024:3;:89;13017:96;;12959:159;:::o;5417:48::-;;;;;;;;;;;;;:::o;5917:27::-;;;;:::o;5828:25::-;;;;:::o;9883:356::-;9930:17;9949:22;9973:21;10000:12;10015:21;10025:10;10015:9;:21::i;:::-;10000:36;;10060:6;10049:7;:17;;10041:57;;;;;-1:-1:-1;;;10041:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10159:12;10164:6;10159:4;:12::i;:::-;10103:68;;;;-1:-1:-1;10103:68:0;;-1:-1:-1;9883:356:0;-1:-1:-1;;;9883:356:0:o;24700:128::-;24763:7;24795:1;24790;:6;;24783:14;;;;-1:-1:-1;24815:5:0;;;24700:128::o;22788:972::-;23692:12;;22883:7;;22937:25;;22883:7;;4959:16;23088:551;23120:457;23266:52;;;23382:27;23491:1;23412:15;;23381:47;23181:248;23491:45;:58;;23181:369;23182:21;23181:369;23120:4;:457::i;:::-;23602:18;23088:8;:551::i;:::-;23025:654;;;;;;23010:695;;22788:972;-1:-1:-1;;;;22788:972:0:o;732:190::-;-1:-1:-1;;;;;826:9:0;;;;;;;;:3;:9;;;;;;;;:25;;839:12;;;826:25;;;;;;856:5;:11;;;;;:29;;871:14;;;856:29;;;;;;890:4;:10;;;;:27;;904:13;;;;890:27;;;732:190::o;23768:718::-;23957:12;;23861:7;;23917:4;23907:14;;;;23957:19;;;23861:7;;24077:353;23907:7;4959:16;23917:4;23957:19;24232:17;4959:16;24206:44;4886:15;24185:66;24154:147;24127:214;24414:1;24407:4;24398:7;24396:1;24387:7;:10;:18;24386:25;;;;;;4959:16;24362:50;24361:54;;;;;;24077:8;:353::i;:::-;:368;;;;;;;23768:718;-1:-1:-1;;;;;23768:718:0:o;20358:588::-;-1:-1:-1;;;;;20460:15:0;;20442;20460;;;;;;;;;;;20488:21;;;;;;:36;;;20523:1;20513:7;:11;20488:36;20480:45;;;;;;-1:-1:-1;;;;;20546:23:0;;20530:13;20546:23;;;:16;:23;;;;;;20582:10;;20546:33;;20582:10;20546:46;;;;-1:-1:-1;;;;;20617:27:0;;20597:17;20617:27;;;:20;:27;;;;;;20546:46;;;;;-1:-1:-1;20597:17:0;20657:10;;20617:37;;20657:10;20617:50;;;;-1:-1:-1;;;;;20672:23:0;;;;;;;:16;:23;;;;;;;;:35;;;;;;;20712:20;:27;;;;;;:43;;20617:50;;;;20712:43;;;;;;;20760:15;;;;;;:26;;;;;;;20791:21;;;;;;;;;;;:33;;;;;;20829:25;;;;;;:41;;;;;;20875:13;;;;;;:24;;;;;;20617:50;-1:-1:-1;20904:37:0;20689:5;20808:3;20779:7;20904:16;:37::i;:::-;20358:588;;;;;;:::o;2723:330::-;2814:4;2825:35;2836:10;2848:3;2853:6;2825:10;:35::i;:::-;2933:49;;-1:-1:-1;;;2933:49:0;;2956:10;2933:49;;;;;;;;;;;;;;;;;;;;;;;;;;;2924:3;;-1:-1:-1;;;;;2933:22:0;;;;;2956:10;;2968:6;;2976:5;;2933:49;;;;;;;;;;2865:32;2933:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3013:3;-1:-1:-1;;;;;2992:40:0;3001:10;-1:-1:-1;;;;;2992:40:0;;3018:6;3026:5;2992:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3044:4:0;;2723:330;-1:-1:-1;;;;2723:330:0:o;2445:207::-;2535:4;2546:35;2557:10;2569:3;2574:6;2546:10;:35::i;:::-;2612:3;-1:-1:-1;;;;;2591:40:0;2600:10;-1:-1:-1;;;;;2591:40:0;;2617:6;2625:5;2591:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2643:4:0;2445:207;;;;;:::o;14413:2581::-;14681:13;;;14692:1;14681:13;;;;;;;;;14460:8;;;;;;14533:10;;14659:19;;14681:13;;;;;;;;;;-1:-1:-1;14681:13:0;14659:35;;14872:34;14891:6;14899;14872:18;:34::i;:::-;14704:5;14710:1;14704:8;;;;;;;;;;;;;14737:5;14743:1;14737:8;;;;;;;;;;;;;14769:5;14775:1;14769:8;;;;;;;;;;;;;14805:5;14811:1;14805:8;;;;;;;;;;;;;14840:5;14846:1;14840:8;;;;;;;;;;;;;14699:207;;;;;;;;;;;;;;;;;;;;;;;;;14940:8;14951:37;14959:5;14965:1;14959:8;;;;;;;;;;;;;;14951:7;:37::i;:::-;15040:13;;;15051:1;15040:13;;;;;;;;;14940:48;;-1:-1:-1;15020:17:0;;15040:13;;;;15020:17;;15040:13;;;;;-1:-1:-1;15040:13:0;15020:33;;15087:17;15097:6;15087:9;:17::i;:::-;15061:3;15065:1;15061:6;;;;;;;;;;;;;15069:3;15073:1;15069:6;;;;;;;;;;;;;15077:3;15081:1;15077:6;;;;;;;;;;;;;;;;;15060:44;;;;;;;;15109:12;;15135:8;;-1:-1:-1;;;;;15109:12:0;;;;:17;;15127:6;;15135:5;;15109:12;;15135:8;;;;;;;;;;;;15164:3;15168:1;15164:6;;;;;;;;;;;;;;15172:3;15176:1;15172:6;;;;;;;;;;;;;;15180:3;15184:1;15180:6;;;;;;;;;;;;;;15109:78;;;;;;;;;;;;;-1:-1:-1;;;;;15109:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15255:5;15261:1;15255:8;;;;;;;;;;;;;;15237:15;:26;;;;15308:5;15314:1;15308:8;;;;;;;;;;;;;;;;;;;15291:14;:25;-1:-1:-1;;;;;15537:16:0;;:8;:16;;;;;;;;;;;15479;:24;;;;;;15508:25;;;15479:55;15537:16;15479:74;;;;-1:-1:-1;;;;;15452:24:0;;;;;;:16;:24;;;;;;;;15479:74;;;;15452:101;;;15719:16;;;;;;;15658:20;:28;;;;;15690:25;;;15658:58;15719:16;15658:77;;;;-1:-1:-1;;;;;15627:28:0;;;;;;:20;:28;;;;;15658:77;;;;15627:108;;;15828:8;;15859:3;;15828:5;;15627:28;;15828:8;;;;;;;;;;;;;;;15934:12;:22;;;;;;;-1:-1:-1;;;;;16019:16:0;;15934:12;16019:16;;;;;;;;;;;;15828:34;;;;-1:-1:-1;16000:63:0;;16011:6;;16019:25;;;;16000:9;:63::i;:::-;-1:-1:-1;;;;;16128:16:0;;:8;:16;;;;;;;;;;:26;;;;;;;16228:18;;:22;16223:457;;-1:-1:-1;;;16348:3:0;:17;16335:30;;16511:21;16546:18;;16535:10;:29;;;;;16636:18;:38;;16535:29;;;;16636:38;;;;;-1:-1:-1;16223:457:0;16711:32;;16693:12;;-1:-1:-1;;;;;16711:11:0;;;16729:9;;16693:12;16711:32;16693:12;16711:32;16729:9;16711:11;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16692:51;;;16762:7;16754:36;;;;;-1:-1:-1;;;16754:36:0;;;;;;;;;;;;-1:-1:-1;;;16754:36:0;;;;;;;;;;;;;;;16808:6;-1:-1:-1;;;;;16802:104:0;;16816:6;16824:9;16835:5;16841:1;16835:8;;;;;;;;;;;;;;16864:10;16876:5;16882:1;16876:8;;;;;;;;;;;;;;16802:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16919:9;16930:5;16936:1;16930:8;;;;;;;;;;;;;;16959:5;16965:1;16959:8;;;;;;;;;;;;;;16911:78;;;;;;;;;;;;;14413:2581;;;;;:::o;24494:198::-;24568:5;24577:1;24572;24568:5;;24567:11;24605:80;24616:1;24612;:5;24605:80;;;24638:1;24634:5;;24672:1;24667;24663;24659;:5;;;;;;:9;24658:15;;;;;;24654:19;;24605:80;;3058:422;3142:14;3158:16;3176:15;3195:44;3206:5;3213:7;3222:8;:15;3231:5;-1:-1:-1;;;;;3222:15:0;-1:-1:-1;;;;;3222:15:0;;;;;;;;;;;;;3195:9;:44::i;:::-;-1:-1:-1;;;;;3244:10:0;;;;;;;:3;:10;;;;;;;;:23;;;;;;;3272:5;:12;;;;;;:27;;;;;;;3304:4;:11;;;;;;:25;;;;;;;3334:8;;;;;;;;;;;;;:21;;;;;;;;3360:10;;;;;;:25;;;;;;;;3390:9;;;;;;:23;;;;;;;;3420:15;;;;;;;;;:26;;;;;;;3451:13;;;-1:-1:-1;;;3451:13:0;;;:24;;;;;;;3058:422::o;16999:164::-;17118:38;17129:4;17135:9;17146;17118;:38::i;:::-;-1:-1:-1;;;;;17080:9:0;;;;;;;:3;:9;;;;;;;;17091:5;:11;;;;;17104:4;:10;;;;;17079:77;;;;;;;;;-1:-1:-1;;16999:164:0:o;1310:235::-;-1:-1:-1;;;;;1427:9:0;;1399:4;1427:9;;;:3;:9;;;;;;1399:4;;;;1451:11;;1427:21;;1451:11;1427:35;;;;-1:-1:-1;;;;;1464:11:0;;;;;;:5;:11;;;;;;1427:35;;;;1490:11;;1464:23;;1490:11;1464:37;;;;-1:-1:-1;;;;;1503:10:0;;;;;;:4;:10;;;;;;1464:37;;;;1528:11;;1503:22;;1528:11;1503:36;;;;;1419:121;;;;;;1310:235;;;;;;;:::o

Swarm Source

ipfs://1aa7cd8a42534c2fd1cc8ca4cff235ddf49e03898986818662d4bd30e6b504e2

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.