ETH Price: $3,418.92 (+1.01%)
Gas: 3 Gwei

Contract

0xf59BfEED034092E399Cc43Ff79EdAb15e2e18735
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve201861302024-06-27 22:52:472 days ago1719528767IN
0xf59BfEED...5e2e18735
0 ETH0.000206274.3801783
Approve201861152024-06-27 22:49:472 days ago1719528587IN
0xf59BfEED...5e2e18735
0 ETH0.000234254.99211393
Approve198922302024-05-17 21:00:3543 days ago1715979635IN
0xf59BfEED...5e2e18735
0 ETH0.000108414.35953451
Approve198461002024-05-11 10:09:1150 days ago1715422151IN
0xf59BfEED...5e2e18735
0 ETH0.000133785.37957078
Approve198460992024-05-11 10:08:5950 days ago1715422139IN
0xf59BfEED...5e2e18735
0 ETH0.000119054.78741636
Approve198005232024-05-05 1:08:5956 days ago1714871339IN
0xf59BfEED...5e2e18735
0 ETH0.000103524.16281903
Transfer And Cal...197655932024-04-30 3:59:2361 days ago1714449563IN
0xf59BfEED...5e2e18735
0 ETH0.000741475.42208696
Approve197513962024-04-28 4:21:1163 days ago1714278071IN
0xf59BfEED...5e2e18735
0 ETH0.000132055.31022002
Approve197513962024-04-28 4:21:1163 days ago1714278071IN
0xf59BfEED...5e2e18735
0 ETH0.000132055.31022002
Approve196542642024-04-14 14:06:5977 days ago1713103619IN
0xf59BfEED...5e2e18735
0 ETH0.0003486614.02017659
Approve196314252024-04-11 9:15:4780 days ago1712826947IN
0xf59BfEED...5e2e18735
0 ETH0.0004576818.40391741
Approve196278022024-04-10 21:05:4780 days ago1712783147IN
0xf59BfEED...5e2e18735
0 ETH0.0004870219.58364956
Approve196041842024-04-07 13:41:5984 days ago1712497319IN
0xf59BfEED...5e2e18735
0 ETH0.00042817.21043441
Approve196041842024-04-07 13:41:5984 days ago1712497319IN
0xf59BfEED...5e2e18735
0 ETH0.00042817.21043441
Approve194773102024-03-20 17:10:35102 days ago1710954635IN
0xf59BfEED...5e2e18735
0 ETH0.0009432835.10688112
Approve194773102024-03-20 17:10:35102 days ago1710954635IN
0xf59BfEED...5e2e18735
0 ETH0.0008730735.10688112
Approve194672602024-03-19 7:18:23103 days ago1710832703IN
0xf59BfEED...5e2e18735
0 ETH0.0008696934.97114045
Approve194654792024-03-19 1:17:47103 days ago1710811067IN
0xf59BfEED...5e2e18735
0 ETH0.0008463434.03216988
Approve194425692024-03-15 19:56:35106 days ago1710532595IN
0xf59BfEED...5e2e18735
0 ETH0.0009931239.93410302
Approve192056282024-02-11 15:11:23140 days ago1707664283IN
0xf59BfEED...5e2e18735
0 ETH0.0014385830.72003545
Approve191742652024-02-07 5:34:35144 days ago1707284075IN
0xf59BfEED...5e2e18735
0 ETH0.0005485622.05828647
Approve189674952024-01-09 6:01:59173 days ago1704780119IN
0xf59BfEED...5e2e18735
0 ETH0.0006618814.05480458
Approve189397612024-01-05 8:01:23177 days ago1704441683IN
0xf59BfEED...5e2e18735
0 ETH0.000286811.53263584
Approve189397452024-01-05 7:58:11177 days ago1704441491IN
0xf59BfEED...5e2e18735
0 ETH0.0003040812.22730652
Approve189397442024-01-05 7:57:59177 days ago1704441479IN
0xf59BfEED...5e2e18735
0 ETH0.0003070712.3476905
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To Value
137022732021-11-28 12:03:04945 days ago1638100984
0xf59BfEED...5e2e18735
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KRILL

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-28
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

/*

       .
      ":"
    ___:____     |"\/"|
  ,'        `.    \  /
  |  O        \___/  |
~^~^~^~^~^~^~^~^~^~^~^~^~

Whales Game | Generative Yield NFTs
Mint tokens and earn KRILL with this new blockchain based game! Battle it out to see who can generate the most yield.

Website: https://whales.game/

*/

interface MetadataInterface {
	function name() external view returns (string memory);
	function symbol() external view returns (string memory);
	function tokenURI(uint256 _tokenId) external view returns (string memory);
	function deploySetWhalesGame(WhalesGame _wg) external;
}

interface Callable {
	function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}

interface Receiver {
	function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4);
}

interface Router {
	function WETH() external pure returns (address);
	function factory() external pure returns (address);
}

interface Factory {
	function getPair(address, address) external view returns (address);
	function createPair(address, address) external returns (address);
}

interface Pair {
	function token0() external view returns (address);
	function totalSupply() external view returns (uint256);
	function balanceOf(address) external view returns (uint256);
	function allowance(address, address) external view returns (uint256);
	function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
	function transfer(address, uint256) external returns (bool);
	function transferFrom(address, address, uint256) external returns (bool);
}


contract KRILL {

	uint256 constant private UINT_MAX = type(uint256).max;
	uint256 constant private TRANSFER_FEE = 1; // 1% per transfer

	string constant public name = "Krill Token";
	string constant public symbol = "KRILL";
	uint8 constant public decimals = 18;

	struct User {
		uint256 balance;
		mapping(address => uint256) allowance;
	}

	struct Info {
		uint256 totalSupply;
		mapping(address => User) users;
		mapping(address => bool) toWhitelist;
		mapping(address => bool) fromWhitelist;
		address owner;
		Router router;
		Pair pair;
		bool weth0;
		WhalesGame wg;
		StakingRewards stakingRewards;
	}
	Info private info;


	event Transfer(address indexed from, address indexed to, uint256 tokens);
	event Approval(address indexed owner, address indexed spender, uint256 tokens);
	event WhitelistUpdated(address indexed user, bool fromWhitelisted, bool toWhitelisted);


	modifier _onlyOwner() {
		require(msg.sender == owner());
		_;
	}


	constructor() {
		info.router = Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
		info.pair = Pair(Factory(info.router.factory()).createPair(info.router.WETH(), address(this)));
		info.weth0 = info.pair.token0() == info.router.WETH();
		info.owner = msg.sender;
	}

	function setOwner(address _owner) external _onlyOwner {
		info.owner = _owner;
	}

	function setWhitelisted(address _address, bool _fromWhitelisted, bool _toWhitelisted) external _onlyOwner {
		info.fromWhitelist[_address] = _fromWhitelisted;
		info.toWhitelist[_address] = _toWhitelisted;
		emit WhitelistUpdated(_address, _fromWhitelisted, _toWhitelisted);
	}

	function deploySetWhalesGame(WhalesGame _wg) external {
		require(tx.origin == owner() && stakingRewardsAddress() == address(0x0));
		info.wg = _wg;
		info.stakingRewards = new StakingRewards(info.wg, info.pair);
		_approve(address(this), stakingRewardsAddress(), UINT_MAX);
	}


	function mint(address _receiver, uint256 _tokens) external {
		require(msg.sender == address(info.wg));
		info.totalSupply += _tokens;
		info.users[_receiver].balance += _tokens;
		emit Transfer(address(0x0), _receiver, _tokens);
	}

	function burn(uint256 _tokens) external {
		require(balanceOf(msg.sender) >= _tokens);
		info.totalSupply -= _tokens;
		info.users[msg.sender].balance -= _tokens;
		emit Transfer(msg.sender, address(0x0), _tokens);
	}

	function transfer(address _to, uint256 _tokens) external returns (bool) {
		return _transfer(msg.sender, _to, _tokens);
	}

	function approve(address _spender, uint256 _tokens) external returns (bool) {
		return _approve(msg.sender, _spender, _tokens);
	}

	function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
		uint256 _allowance = allowance(_from, msg.sender);
		require(_allowance >= _tokens);
		if (_allowance != UINT_MAX) {
			info.users[_from].allowance[msg.sender] -= _tokens;
		}
		return _transfer(_from, _to, _tokens);
	}

	function transferAndCall(address _to, uint256 _tokens, bytes calldata _data) external returns (bool) {
		uint256 _balanceBefore = balanceOf(_to);
		_transfer(msg.sender, _to, _tokens);
		uint256 _tokensReceived = balanceOf(_to) - _balanceBefore;
		uint32 _size;
		assembly {
			_size := extcodesize(_to)
		}
		if (_size > 0) {
			require(Callable(_to).tokenCallback(msg.sender, _tokensReceived, _data));
		}
		return true;
	}
	

	function whalesGameAddress() public view returns (address) {
		return address(info.wg);
	}

	function pairAddress() external view returns (address) {
		return address(info.pair);
	}

	function stakingRewardsAddress() public view returns (address) {
		return address(info.stakingRewards);
	}

	function owner() public view returns (address) {
		return info.owner;
	}

	function isFromWhitelisted(address _address) public view returns (bool) {
		return info.fromWhitelist[_address];
	}

	function isToWhitelisted(address _address) public view returns (bool) {
		return info.toWhitelist[_address];
	}
	
	function totalSupply() public view returns (uint256) {
		return info.totalSupply;
	}

	function balanceOf(address _user) public view returns (uint256) {
		return info.users[_user].balance;
	}

	function allowance(address _user, address _spender) public view returns (uint256) {
		return info.users[_user].allowance[_spender];
	}

	function allInfoFor(address _user) external view returns (uint256 totalTokens, uint256 totalLPTokens, uint256 wethReserve, uint256 krillReserve, uint256 userAllowance, uint256 userBalance, uint256 userLPBalance) {
		totalTokens = totalSupply();
		totalLPTokens = info.pair.totalSupply();
		(uint256 _res0, uint256 _res1, ) = info.pair.getReserves();
		wethReserve = info.weth0 ? _res0 : _res1;
		krillReserve = info.weth0 ? _res1 : _res0;
		userAllowance = allowance(_user, whalesGameAddress());
		userBalance = balanceOf(_user);
		userLPBalance = info.pair.balanceOf(_user);
	}


	function _approve(address _owner, address _spender, uint256 _tokens) internal returns (bool) {
		info.users[_owner].allowance[_spender] = _tokens;
		emit Approval(_owner, _spender, _tokens);
		return true;
	}
	
	function _transfer(address _from, address _to, uint256 _tokens) internal returns (bool) {
		require(balanceOf(_from) >= _tokens);
		info.users[_from].balance -= _tokens;
		uint256 _fee = 0;
		if (!(_from == stakingRewardsAddress() || _to == stakingRewardsAddress() || _to == whalesGameAddress() || isFromWhitelisted(_from) || isToWhitelisted(_to))) {
			_fee = _tokens * TRANSFER_FEE / 100;
			address _this = address(this);
			info.users[_this].balance += _fee;
			emit Transfer(_from, _this, _fee);
			info.stakingRewards.disburse(balanceOf(_this));
		}
		info.users[_to].balance += _tokens - _fee;
		emit Transfer(_from, _to, _tokens - _fee);
		return true;
	}
}


contract StakingRewards {

	uint256 constant private FLOAT_SCALAR = 2**64;

	struct User {
		uint256 deposited;
		int256 scaledPayout;
	}

	struct Info {
		uint256 totalDeposited;
		uint256 scaledRewardsPerToken;
		uint256 pendingRewards;
		mapping(address => User) users;
		WhalesGame wg;
		KRILL krill;
		Pair pair;
	}
	Info private info;


	event Deposit(address indexed user, uint256 amount);
	event Withdraw(address indexed user, uint256 amount);
	event Claim(address indexed user, uint256 amount);
	event Reward(uint256 amount);


	constructor(WhalesGame _wg, Pair _pair) {
		info.wg = _wg;
		info.krill = KRILL(msg.sender);
		info.pair = _pair;
	}

	function disburse(uint256 _amount) external {
		if (_amount > 0) {
			info.krill.transferFrom(msg.sender, address(this), _amount);
			_disburse(_amount);
		}
	}

	function deposit(uint256 _amount) external {
		depositFor(_amount, msg.sender);
	}

	function depositFor(uint256 _amount, address _user) public {
		require(_amount > 0);
		_update();
		info.pair.transferFrom(msg.sender, address(this), _amount);
		info.totalDeposited += _amount;
		info.users[_user].deposited += _amount;
		info.users[_user].scaledPayout += int256(_amount * info.scaledRewardsPerToken);
		emit Deposit(_user, _amount);
	}

	function withdrawAll() external {
		uint256 _deposited = depositedOf(msg.sender);
		if (_deposited > 0) {
			withdraw(_deposited);
		}
	}

	function withdraw(uint256 _amount) public {
		require(_amount > 0 && _amount <= depositedOf(msg.sender));
		_update();
		info.totalDeposited -= _amount;
		info.users[msg.sender].deposited -= _amount;
		info.users[msg.sender].scaledPayout -= int256(_amount * info.scaledRewardsPerToken);
		info.pair.transfer(msg.sender, _amount);
		emit Withdraw(msg.sender, _amount);
	}

	function claim() external {
		_update();
		uint256 _rewards = rewardsOf(msg.sender);
		if (_rewards > 0) {
			info.users[msg.sender].scaledPayout += int256(_rewards * FLOAT_SCALAR);
			info.krill.transfer(msg.sender, _rewards);
			emit Claim(msg.sender, _rewards);
		}
	}

	
	function totalDeposited() public view returns (uint256) {
		return info.totalDeposited;
	}

	function depositedOf(address _user) public view returns (uint256) {
		return info.users[_user].deposited;
	}
	
	function rewardsOf(address _user) public view returns (uint256) {
		return uint256(int256(info.scaledRewardsPerToken * depositedOf(_user)) - info.users[_user].scaledPayout) / FLOAT_SCALAR;
	}

	function allInfoFor(address _user) external view returns (uint256 totalLPDeposited, uint256 totalLPTokens, uint256 wethReserve, uint256 krillReserve, uint256 userBalance, uint256 userAllowance, uint256 userDeposited, uint256 userRewards) {
		totalLPDeposited = totalDeposited();
		( , totalLPTokens, wethReserve, krillReserve, , , ) = info.krill.allInfoFor(address(this));
		userBalance = info.pair.balanceOf(_user);
		userAllowance = info.pair.allowance(_user, address(this));
		userDeposited = depositedOf(_user);
		userRewards = rewardsOf(_user);
	}

	function _update() internal {
		address _this = address(this);
		uint256 _balanceBefore = info.krill.balanceOf(_this);
		info.wg.claim();
		_disburse(info.krill.balanceOf(_this) - _balanceBefore);
	}

	function _disburse(uint256 _amount) internal {
		if (_amount > 0) {
			if (totalDeposited() == 0) {
				info.pendingRewards += _amount;
			} else {
				info.scaledRewardsPerToken += (_amount + info.pendingRewards) * FLOAT_SCALAR / totalDeposited();
				info.pendingRewards = 0;
			}
			emit Reward(_amount);
		}
	}
}


contract WhalesGame {

	uint256 constant public ETH_MINTABLE_SUPPLY = 2000;
	uint256 constant public WHITELIST_ETH_MINTABLE_SUPPLY = 8000;
	uint256 constant public KRILL_MINTABLE_SUPPLY = 40000;
	uint256 constant public MAX_SUPPLY = ETH_MINTABLE_SUPPLY + WHITELIST_ETH_MINTABLE_SUPPLY + KRILL_MINTABLE_SUPPLY;
	uint256 constant public INITIAL_MINT_COST_ETH = 0.05 ether;
	uint256 constant public KRILL_PER_DAY_PER_FISHERMAN = 1e22; // 10,000

	uint256 constant private KRILL_COST_ADD = 1e4;
	uint256 constant private KRILL_COST_EXPONENT = 3;
	uint256 constant private KRILL_COST_SCALER = 2e10;
	// KRILL minted tokens = 0, minting cost = 20,000
	// KRILL minted tokens = 40k, minting cost = 2,500,000

	uint256 constant private FLOAT_SCALAR = 2**64;
	uint256 constant private WHALE_MODULUS = 10; // 1 in 10
	uint256 constant private WHALES_CUT = 20; // 20% of all yield
	uint256 constant private STAKING_CUT = 25; // 25% of minting costs
	uint256 constant private DEV_TOKENS = 50;
	uint256 constant private OPENING_DELAY = 2 hours;
	uint256 constant private WHITELIST_DURATION = 8 hours;

	struct User {
		uint256 balance;
		mapping(uint256 => uint256) list;
		mapping(address => bool) approved;
		mapping(uint256 => uint256) indexOf;
		uint256 rewards;
		uint256 lastUpdated;
		uint256 krillPerDay;
		uint256 whales;
		int256 scaledPayout;
	}

	struct Token {
		address owner;
		address approved;
		bytes32 seed;
		bool isWhale;
	}

	struct Info {
		uint256 totalSupply;
		uint256 totalWhales;
		uint256 ethMintedTokens;
		uint256 krillMintedTokens;
		uint256 scaledRewardsPerWhale;
		uint256 openingTime;
		uint256 whitelistExpiry;
		mapping(uint256 => Token) list;
		mapping(address => User) users;
		mapping(uint256 => uint256) claimedBitMap;
		bytes32 merkleRoot;
		MetadataInterface metadata;
		address owner;
		KRILL krill;
		StakingRewards stakingRewards;
	}
	Info private info;

	mapping(bytes4 => bool) public supportsInterface;

	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
	event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

	event Mint(address indexed owner, uint256 indexed tokenId, bytes32 seed, bool isWhale);
	event ClaimFishermenRewards(address indexed user, uint256 amount);
	event ClaimWhaleRewards(address indexed user, uint256 amount);
	event Reward(address indexed user, uint256 amount);
	event WhalesReward(uint256 amount);
	event StakingReward(uint256 amount);


	modifier _onlyOwner() {
		require(msg.sender == owner());
		_;
	}


	constructor(MetadataInterface _metadata, KRILL _krill, bytes32 _merkleRoot) {
		info.metadata = _metadata;
		info.metadata.deploySetWhalesGame(this);
		info.krill = _krill;
		info.krill.deploySetWhalesGame(this);
		info.stakingRewards = StakingRewards(info.krill.stakingRewardsAddress());
		info.krill.approve(stakingRewardsAddress(), type(uint256).max);
		info.merkleRoot = _merkleRoot;
		info.owner = 0x99A768bd14Ea62FaADA61F2c7f123303CDAa69fC;
		info.openingTime = block.timestamp + OPENING_DELAY;
		info.whitelistExpiry = block.timestamp + OPENING_DELAY + WHITELIST_DURATION;

		supportsInterface[0x01ffc9a7] = true; // ERC-165
		supportsInterface[0x80ac58cd] = true; // ERC-721
		supportsInterface[0x5b5e139f] = true; // Metadata
		supportsInterface[0x780e9d63] = true; // Enumerable

		for (uint256 i = 0; i < DEV_TOKENS; i++) {
			_mint(0xa1450E7D547b4748fc94C8C98C9dB667eaD31cF8);
		}
	}

	function setOwner(address _owner) external _onlyOwner {
		info.owner = _owner;
	}

	function setMetadata(MetadataInterface _metadata) external _onlyOwner {
		info.metadata = _metadata;
	}

	function withdraw() external {
		address _this = address(this);
		require(_this.balance > 0);
		payable(0xFaDED72464D6e76e37300B467673b36ECc4d2ccF).transfer(_this.balance / 2); // 50% total
		payable(0x1cC79d49ce5b9519C912D810E39025DD27d1F033).transfer(_this.balance / 10); // 5% total
		payable(0xa1450E7D547b4748fc94C8C98C9dB667eaD31cF8).transfer(_this.balance); // 45% total
	}

	
	receive() external payable {
		mintManyWithETH(msg.value / INITIAL_MINT_COST_ETH);
	}
	
	function mintWithETH() external payable {
		mintManyWithETH(1);
	}

	function mintManyWithETH(uint256 _tokens) public payable {
		require(isOpen());
		require(_tokens > 0);
		if (whitelistExpired()) {
			require(totalSupply() - krillMintedTokens() + _tokens <= ETH_MINTABLE_SUPPLY + WHITELIST_ETH_MINTABLE_SUPPLY);
		} else {
			require(ethMintedTokens() + _tokens <= ETH_MINTABLE_SUPPLY);
		}
		uint256 _cost = _tokens * INITIAL_MINT_COST_ETH;
		require(msg.value >= _cost);
		info.ethMintedTokens += _tokens;
		for (uint256 i = 0; i < _tokens; i++) {
			_mint(msg.sender);
		}
		if (msg.value > _cost) {
			payable(msg.sender).transfer(msg.value - _cost);
		}
	}

	function mintWithProof(uint256 _index, address _account, bytes32[] calldata _merkleProof) external payable {
		require(isOpen());
		require(!whitelistExpired() && whitelistMintedTokens() < WHITELIST_ETH_MINTABLE_SUPPLY);
		require(msg.value >= INITIAL_MINT_COST_ETH);
		require(!proofClaimed(_index));
		bytes32 _node = keccak256(abi.encodePacked(_index, _account));
		require(_verify(_merkleProof, _node));
		uint256 _claimedWordIndex = _index / 256;
		uint256 _claimedBitIndex = _index % 256;
		info.claimedBitMap[_claimedWordIndex] = info.claimedBitMap[_claimedWordIndex] | (1 << _claimedBitIndex);
		_mint(_account);
		if (msg.value > INITIAL_MINT_COST_ETH) {
			payable(msg.sender).transfer(msg.value - INITIAL_MINT_COST_ETH);
		}
	}

	function mint() external {
		mintMany(1);
	}

	function mintMany(uint256 _tokens) public {
		require(isOpen());
		require(_tokens > 0 && krillMintedTokens() + _tokens <= KRILL_MINTABLE_SUPPLY);
		uint256 _cost = calculateKrillMintCost(_tokens);
		info.krill.transferFrom(msg.sender, address(this), _cost);
		uint256 _stakingReward = _cost * STAKING_CUT / 100;
		info.stakingRewards.disburse(_stakingReward);
		emit StakingReward(_stakingReward);
		info.krill.burn(info.krill.balanceOf(address(this)));
		info.krillMintedTokens += _tokens;
		for (uint256 i = 0; i < _tokens; i++) {
			_mint(msg.sender);
		}
	}

	function claim() external {
		claimFishermenRewards();
		claimWhaleRewards();
	}

	function claimFishermenRewards() public {
		_update(msg.sender);
		uint256 _rewards = info.users[msg.sender].rewards;
		if (_rewards > 0) {
			info.users[msg.sender].rewards = 0;
			info.krill.mint(msg.sender, _rewards);
			emit ClaimFishermenRewards(msg.sender, _rewards);
		}
	}

	function claimWhaleRewards() public {
		uint256 _rewards = whaleRewardsOf(msg.sender);
		if (_rewards > 0) {
			info.users[msg.sender].scaledPayout += int256(_rewards * FLOAT_SCALAR);
			info.krill.mint(msg.sender, _rewards);
			emit ClaimWhaleRewards(msg.sender, _rewards);
		}
	}
	
	function approve(address _approved, uint256 _tokenId) external {
		require(msg.sender == ownerOf(_tokenId));
		info.list[_tokenId].approved = _approved;
		emit Approval(msg.sender, _approved, _tokenId);
	}

	function setApprovalForAll(address _operator, bool _approved) external {
		info.users[msg.sender].approved[_operator] = _approved;
		emit ApprovalForAll(msg.sender, _operator, _approved);
	}

	function transferFrom(address _from, address _to, uint256 _tokenId) external {
		_transfer(_from, _to, _tokenId);
	}

	function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
		safeTransferFrom(_from, _to, _tokenId, "");
	}

	function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public {
		_transfer(_from, _to, _tokenId);
		uint32 _size;
		assembly {
			_size := extcodesize(_to)
		}
		if (_size > 0) {
			require(Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) == 0x150b7a02);
		}
	}


	function name() external view returns (string memory) {
		return info.metadata.name();
	}

	function symbol() external view returns (string memory) {
		return info.metadata.symbol();
	}

	function tokenURI(uint256 _tokenId) external view returns (string memory) {
		return info.metadata.tokenURI(_tokenId);
	}

	function krillAddress() external view returns (address) {
		return address(info.krill);
	}

	function pairAddress() external view returns (address) {
		return info.krill.pairAddress();
	}

	function stakingRewardsAddress() public view returns (address) {
		return address(info.stakingRewards);
	}

	function merkleRoot() public view returns (bytes32) {
		return info.merkleRoot;
	}

	function openingTime() public view returns (uint256) {
		return info.openingTime;
	}

	function isOpen() public view returns (bool) {
		return block.timestamp > openingTime();
	}

	function whitelistExpiry() public view returns (uint256) {
		return info.whitelistExpiry;
	}

	function whitelistExpired() public view returns (bool) {
		return block.timestamp > whitelistExpiry();
	}

	function owner() public view returns (address) {
		return info.owner;
	}

	function totalSupply() public view returns (uint256) {
		return info.totalSupply;
	}

	function ethMintedTokens() public view returns (uint256) {
		return info.ethMintedTokens;
	}

	function krillMintedTokens() public view returns (uint256) {
		return info.krillMintedTokens;
	}

	function whitelistMintedTokens() public view returns (uint256) {
		return totalSupply() - ethMintedTokens() - krillMintedTokens();
	}

	function totalWhales() public view returns (uint256) {
		return info.totalWhales;
	}

	function totalFishermen() public view returns (uint256) {
		return totalSupply() - totalWhales();
	}

	function totalKrillPerDay() external view returns (uint256) {
		return totalFishermen() * KRILL_PER_DAY_PER_FISHERMAN;
	}

	function currentKrillMintCost() public view returns (uint256) {
		return krillMintCost(krillMintedTokens());
	}

	function krillMintCost(uint256 _krillMintedTokens) public pure returns (uint256) {
		return (_krillMintedTokens + KRILL_COST_ADD)**KRILL_COST_EXPONENT * KRILL_COST_SCALER;
	}

	function calculateKrillMintCost(uint256 _tokens) public view returns (uint256 cost) {
		cost = 0;
		for (uint256 i = 0; i < _tokens; i++) {
			cost += krillMintCost(krillMintedTokens() + i);
		}
	}

	function fishermenRewardsOf(address _owner) public view returns (uint256) {
		uint256 _pending = 0;
		uint256 _last = info.users[_owner].lastUpdated;
		if (_last < block.timestamp) {
			uint256 _diff = block.timestamp - _last;
			_pending += ownerKrillPerDay(_owner) * _diff * (100 - WHALES_CUT) / 8640000;
		}
		return info.users[_owner].rewards + _pending;
	}
	
	function whaleRewardsOf(address _owner) public view returns (uint256) {
		return uint256(int256(info.scaledRewardsPerWhale * whalesOf(_owner)) - info.users[_owner].scaledPayout) / FLOAT_SCALAR;
	}

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

	function whalesOf(address _owner) public view returns (uint256) {
		return info.users[_owner].whales;
	}

	function fishermenOf(address _owner) public view returns (uint256) {
		return balanceOf(_owner) - whalesOf(_owner);
	}

	function ownerOf(uint256 _tokenId) public view returns (address) {
		require(_tokenId < totalSupply());
		return info.list[_tokenId].owner;
	}

	function getApproved(uint256 _tokenId) public view returns (address) {
		require(_tokenId < totalSupply());
		return info.list[_tokenId].approved;
	}

	function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
		return info.users[_owner].approved[_operator];
	}

	function getSeed(uint256 _tokenId) public view returns (bytes32) {
		require(_tokenId < totalSupply());
		return info.list[_tokenId].seed;
	}

	function getIsWhale(uint256 _tokenId) public view returns (bool) {
		require(_tokenId < totalSupply());
		return info.list[_tokenId].isWhale;
	}

	function tokenByIndex(uint256 _index) public view returns (uint256) {
		require(_index < totalSupply());
		return _index;
	}

	function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
		require(_index < balanceOf(_owner));
		return info.users[_owner].list[_index];
	}

	function ownerKrillPerDay(address _owner) public view returns (uint256 amount) {
		return info.users[_owner].krillPerDay;
	}

	function proofClaimed(uint256 _index) public view returns (bool) {
		uint256 _claimedWordIndex = _index / 256;
		uint256 _claimedBitIndex = _index % 256;
		uint256 _claimedWord = info.claimedBitMap[_claimedWordIndex];
		uint256 _mask = (1 << _claimedBitIndex);
		return _claimedWord & _mask == _mask;
	}

	function getToken(uint256 _tokenId) public view returns (address tokenOwner, address approved, bytes32 seed, bool isWhale) {
		return (ownerOf(_tokenId), getApproved(_tokenId), getSeed(_tokenId), getIsWhale(_tokenId));
	}

	function getTokens(uint256[] memory _tokenIds) public view returns (address[] memory owners, address[] memory approveds, bytes32[] memory seeds, bool[] memory isWhales) {
		uint256 _length = _tokenIds.length;
		owners = new address[](_length);
		approveds = new address[](_length);
		seeds = new bytes32[](_length);
		isWhales = new bool[](_length);
		for (uint256 i = 0; i < _length; i++) {
			(owners[i], approveds[i], seeds[i], isWhales[i]) = getToken(_tokenIds[i]);
		}
	}

	function getTokensTable(uint256 _limit, uint256 _page, bool _isAsc) external view returns (uint256[] memory tokenIds, address[] memory owners, address[] memory approveds, bytes32[] memory seeds, bool[] memory isWhales, uint256 totalTokens, uint256 totalPages) {
		require(_limit > 0);
		totalTokens = totalSupply();

		if (totalTokens > 0) {
			totalPages = (totalTokens / _limit) + (totalTokens % _limit == 0 ? 0 : 1);
			require(_page < totalPages);

			uint256 _offset = _limit * _page;
			if (_page == totalPages - 1 && totalTokens % _limit != 0) {
				_limit = totalTokens % _limit;
			}

			tokenIds = new uint256[](_limit);
			for (uint256 i = 0; i < _limit; i++) {
				tokenIds[i] = tokenByIndex(_isAsc ? _offset + i : totalTokens - _offset - i - 1);
			}
		} else {
			totalPages = 0;
			tokenIds = new uint256[](0);
		}
		(owners, approveds, seeds, isWhales) = getTokens(tokenIds);
	}

	function getOwnerTokensTable(address _owner, uint256 _limit, uint256 _page, bool _isAsc) external view returns (uint256[] memory tokenIds, address[] memory approveds, bytes32[] memory seeds, bool[] memory isWhales, uint256 totalTokens, uint256 totalPages) {
		require(_limit > 0);
		totalTokens = balanceOf(_owner);

		if (totalTokens > 0) {
			totalPages = (totalTokens / _limit) + (totalTokens % _limit == 0 ? 0 : 1);
			require(_page < totalPages);

			uint256 _offset = _limit * _page;
			if (_page == totalPages - 1 && totalTokens % _limit != 0) {
				_limit = totalTokens % _limit;
			}

			tokenIds = new uint256[](_limit);
			for (uint256 i = 0; i < _limit; i++) {
				tokenIds[i] = tokenOfOwnerByIndex(_owner, _isAsc ? _offset + i : totalTokens - _offset - i - 1);
			}
		} else {
			totalPages = 0;
			tokenIds = new uint256[](0);
		}
		( , approveds, seeds, isWhales) = getTokens(tokenIds);
	}

	function allMintingInfo() external view returns (uint256 ethMinted, uint256 whitelistMinted, uint256 krillMinted, uint256 currentKrillCost, uint256 whitelistExpiryTime, bool hasWhitelistExpired, uint256 openTime, bool open) {
		return (ethMintedTokens(), whitelistMintedTokens(), krillMintedTokens(), currentKrillMintCost(), whitelistExpiry(), whitelistExpired(), openingTime(), isOpen());
	}

	function allInfoFor(address _owner) external view returns (uint256 supply, uint256 whales, uint256 ownerBalance, uint256 ownerWhales, uint256 ownerFishermenRewards, uint256 ownerWhaleRewards, uint256 ownerDailyKrill) {
		return (totalSupply(), totalWhales(), balanceOf(_owner), whalesOf(_owner), fishermenRewardsOf(_owner), whaleRewardsOf(_owner), ownerKrillPerDay(_owner));
	}


	function _mint(address _receiver) internal {
		require(msg.sender == tx.origin);
		require(totalSupply() < MAX_SUPPLY);
		uint256 _tokenId = info.totalSupply++;
		Token storage _newToken = info.list[_tokenId];
		_newToken.owner = _receiver;
		bytes32 _seed = keccak256(abi.encodePacked(_tokenId, _receiver, blockhash(block.number - 1), gasleft()));
		_newToken.seed = _seed;
		_newToken.isWhale = _tokenId < DEV_TOKENS || _tokenId % WHALE_MODULUS == 0;

		if (_newToken.isWhale) {
			info.totalWhales++;
			info.users[_receiver].whales++;
			info.users[_receiver].scaledPayout += int256(info.scaledRewardsPerWhale);
		} else {
			_update(_receiver);
			info.users[_receiver].krillPerDay += KRILL_PER_DAY_PER_FISHERMAN;
		}
		uint256 _index = info.users[_receiver].balance++;
		info.users[_receiver].indexOf[_tokenId] = _index + 1;
		info.users[_receiver].list[_index] = _tokenId;
		emit Transfer(address(0x0), _receiver, _tokenId);
		emit Mint(_receiver, _tokenId, _seed, _newToken.isWhale);
	}
	
	function _transfer(address _from, address _to, uint256 _tokenId) internal {
		address _owner = ownerOf(_tokenId);
		address _approved = getApproved(_tokenId);
		require(_from == _owner);
		require(msg.sender == _owner || msg.sender == _approved || isApprovedForAll(_owner, msg.sender));

		info.list[_tokenId].owner = _to;
		if (_approved != address(0x0)) {
			info.list[_tokenId].approved = address(0x0);
			emit Approval(address(0x0), address(0x0), _tokenId);
		}

		if (getIsWhale(_tokenId)) {
			info.users[_from].whales--;
			info.users[_from].scaledPayout -= int256(info.scaledRewardsPerWhale);
			info.users[_to].whales++;
			info.users[_to].scaledPayout += int256(info.scaledRewardsPerWhale);
		} else {
			_update(_from);
			info.users[_from].krillPerDay -= KRILL_PER_DAY_PER_FISHERMAN;
			_update(_to);
			info.users[_to].krillPerDay += KRILL_PER_DAY_PER_FISHERMAN;
		}

		uint256 _index = info.users[_from].indexOf[_tokenId] - 1;
		uint256 _moved = info.users[_from].list[info.users[_from].balance - 1];
		info.users[_from].list[_index] = _moved;
		info.users[_from].indexOf[_moved] = _index + 1;
		info.users[_from].balance--;
		delete info.users[_from].indexOf[_tokenId];
		uint256 _newIndex = info.users[_to].balance++;
		info.users[_to].indexOf[_tokenId] = _newIndex + 1;
		info.users[_to].list[_newIndex] = _tokenId;
		emit Transfer(_from, _to, _tokenId);
	}

	function _update(address _owner) internal {
		uint256 _last = info.users[_owner].lastUpdated;
		if (_last < block.timestamp) {
			uint256 _diff = block.timestamp - _last;
			uint256 _rewards = ownerKrillPerDay(_owner) * _diff / 86400;
			uint256 _whalesCut = _rewards * WHALES_CUT / 100;
			info.scaledRewardsPerWhale += _whalesCut * FLOAT_SCALAR / totalWhales();
			emit WhalesReward(_whalesCut);
			info.users[_owner].lastUpdated = block.timestamp;
			info.users[_owner].rewards += _rewards - _whalesCut;
			emit Reward(_owner, _rewards - _whalesCut);
		}
	}


	function _verify(bytes32[] memory _proof, bytes32 _leaf) internal view returns (bool) {
		require(_leaf != merkleRoot());
		bytes32 _computedHash = _leaf;
		for (uint256 i = 0; i < _proof.length; i++) {
			bytes32 _proofElement = _proof[i];
			if (_computedHash <= _proofElement) {
				_computedHash = keccak256(abi.encodePacked(_computedHash, _proofElement));
			} else {
				_computedHash = keccak256(abi.encodePacked(_proofElement, _computedHash));
			}
		}
		return _computedHash == merkleRoot();
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"fromWhitelisted","type":"bool"},{"indexed":false,"internalType":"bool","name":"toWhitelisted","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"allInfoFor","outputs":[{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"totalLPTokens","type":"uint256"},{"internalType":"uint256","name":"wethReserve","type":"uint256"},{"internalType":"uint256","name":"krillReserve","type":"uint256"},{"internalType":"uint256","name":"userAllowance","type":"uint256"},{"internalType":"uint256","name":"userBalance","type":"uint256"},{"internalType":"uint256","name":"userLPBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract WhalesGame","name":"_wg","type":"address"}],"name":"deploySetWhalesGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isFromWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isToWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_fromWhitelisted","type":"bool"},{"internalType":"bool","name":"_toWhitelisted","type":"bool"}],"name":"setWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingRewardsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whalesGameAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50737a250d5630b4cf539739df2c5dacb4c659f2488d600060050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000101919062000487565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200018d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b3919062000487565b306040518363ffffffff1660e01b8152600401620001d3929190620004ca565b6020604051808303816000875af1158015620001f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000219919062000487565b600060060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f3919062000487565b73ffffffffffffffffffffffffffffffffffffffff16600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a0919062000487565b73ffffffffffffffffffffffffffffffffffffffff1614600060060160146101000a81548160ff02191690831515021790555033600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004f7565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200044f8262000422565b9050919050565b620004618162000442565b81146200046d57600080fd5b50565b600081519050620004818162000456565b92915050565b600060208284031215620004a0576200049f6200041d565b5b6000620004b08482850162000470565b91505092915050565b620004c48162000442565b82525050565b6000604082019050620004e16000830185620004b9565b620004f06020830184620004b9565b9392505050565b6138f980620005076000396000f3fe60806040523480156200001157600080fd5b5060043610620001605760003560e01c806342966c6811620000c957806395d89b41116200008757806395d89b41146200040f578063a8b089821462000431578063a9059cbb1462000453578063c81c08651462000489578063dd62ed3e14620004ab578063e6a6dcce14620004e15762000160565b806342966c68146200033957806357f6b812146200035957806370a082311462000395578063788bff6814620003cb5780638da5cb5b14620003ed5762000160565b80631e3c187f11620001235780631e3c187f146200021f57806323b872dd146200025557806328687cc7146200028b578063313ce56714620002c15780634000aea014620002e357806340c10f1914620003195762000160565b806306fdde031462000165578063080ad5551462000187578063095ea7b314620001a757806313af403514620001dd57806318160ddd14620001fd575b600080fd5b6200016f62000501565b6040516200017e9190620017c4565b60405180910390f35b620001a560048036038101906200019f91906200186b565b6200053a565b005b620001c56004803603810190620001bf91906200191d565b62000704565b604051620001d4919062001981565b60405180910390f35b620001fb6004803603810190620001f591906200199e565b6200071b565b005b62000207620007a4565b604051620002169190620019e1565b60405180910390f35b6200023d60048036038101906200023791906200199e565b620007b0565b6040516200024c919062001981565b60405180910390f35b6200027360048036038101906200026d9190620019fe565b62000808565b60405162000282919062001981565b60405180910390f35b620002a96004803603810190620002a391906200199e565b62000902565b604051620002b8919062001981565b60405180910390f35b620002cb6200095a565b604051620002da919062001a78565b60405180910390f35b620003016004803603810190620002fb919062001b03565b6200095f565b60405162000310919062001981565b60405180910390f35b6200033760048036038101906200033191906200191d565b62000a50565b005b62000357600480360381019062000351919062001b83565b62000b95565b005b6200037760048036038101906200037191906200199e565b62000c93565b6040516200038c979695949392919062001bb5565b60405180910390f35b620003b36004803603810190620003ad91906200199e565b62000f1f565b604051620003c29190620019e1565b60405180910390f35b620003d562000f6d565b604051620003e4919062001c43565b60405180910390f35b620003f762000f99565b60405162000406919062001c43565b60405180910390f35b6200041962000fc5565b604051620004289190620017c4565b60405180910390f35b6200043b62000ffe565b6040516200044a919062001c43565b60405180910390f35b6200047160048036038101906200046b91906200191d565b6200102a565b60405162000480919062001981565b60405180910390f35b6200049362001041565b604051620004a2919062001c43565b60405180910390f35b620004c96004803603810190620004c3919062001c60565b6200106d565b604051620004d89190620019e1565b60405180910390f35b620004ff6004803603810190620004f9919062001cd8565b620010f9565b005b6040518060400160405280600b81526020017f4b72696c6c20546f6b656e00000000000000000000000000000000000000000081525081565b6200054462000f99565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148015620005b45750600073ffffffffffffffffffffffffffffffffffffffff166200059c62000f6d565b73ffffffffffffffffffffffffffffffffffffffff16145b620005be57600080fd5b80600060070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200065c9062001712565b6200066992919062001dd8565b604051809103906000f08015801562000686573d6000803e3d6000fd5b50600060080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200070030620006d962000f6d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62001246565b5050565b60006200071333848462001246565b905092915050565b6200072562000f99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200075d57600080fd5b80600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060000154905090565b60008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000806200081785336200106d565b9050828110156200082757600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114620008eb5782600060010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620008e3919062001e34565b925050819055505b620008f885858562001341565b9150509392505050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601281565b6000806200096d8662000f1f565b90506200097c33878762001341565b506000816200098b8862000f1f565b62000997919062001e34565b90506000873b905060008163ffffffff16111562000a41578773ffffffffffffffffffffffffffffffffffffffff16636be32e73338489896040518563ffffffff1660e01b8152600401620009f0949392919062001ec2565b6020604051808303816000875af115801562000a10573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a36919062001f1f565b62000a4057600080fd5b5b60019350505050949350505050565b600060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000aae57600080fd5b8060008001600082825462000ac4919062001f51565b9250508190555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462000b22919062001f51565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000b899190620019e1565b60405180910390a35050565b8062000ba13362000f1f565b101562000bad57600080fd5b8060008001600082825462000bc3919062001e34565b9250508190555080600060010160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462000c21919062001e34565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c889190620019e1565b60405180910390a350565b600080600080600080600062000ca8620007a4565b9650600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d41919062001fc5565b9550600080600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000db7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ddd919062002083565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600060060160149054906101000a900460ff1662000e21578062000e23565b815b9650600060060160149054906101000a900460ff1662000e44578162000e46565b805b955062000e5d8a62000e5762001041565b6200106d565b945062000e6a8a62000f1f565b9350600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b815260040162000ecc919062001c43565b602060405180830381865afa15801562000eea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f10919062001fc5565b92505050919395979092949650565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60008060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600581526020017f4b52494c4c00000000000000000000000000000000000000000000000000000081525081565b60008060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006200103933848462001341565b905092915050565b60008060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6200110362000f99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200113b57600080fd5b81600060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f855852ede06df792cbe12bbb8b292fd0d251a1dcfea1f072d5793f1930568ebf838360405162001239929190620020df565b60405180910390a2505050565b600081600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200132e9190620019e1565b60405180910390a3600190509392505050565b6000816200134f8562000f1f565b10156200135b57600080fd5b81600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254620013b2919062001e34565b925050819055506000620013c562000f6d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806200143357506200140462000f6d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b806200147357506200144462001041565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80620014865750620014858562000902565b5b806200149957506200149884620007b0565b5b62001627576064600184620014af91906200210c565b620014bb91906200219c565b9050600030905081600060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462001519919062001f51565b925050819055508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516200157f9190620019e1565b60405180910390a3600060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd77ac2c620015d38362000f1f565b6040518263ffffffff1660e01b8152600401620015f19190620019e1565b600060405180830381600087803b1580156200160c57600080fd5b505af115801562001621573d6000803e3d6000fd5b50505050505b808362001635919062001e34565b600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546200168b919062001f51565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8386620016ef919062001e34565b604051620016fe9190620019e1565b60405180910390a360019150509392505050565b6116ef80620021d583390190565b600081519050919050565b600082825260208201905092915050565b60005b838110156200175c5780820151818401526020810190506200173f565b838111156200176c576000848401525b50505050565b6000601f19601f8301169050919050565b6000620017908262001720565b6200179c81856200172b565b9350620017ae8185602086016200173c565b620017b98162001772565b840191505092915050565b60006020820190508181036000830152620017e0818462001783565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200181f82620017f2565b9050919050565b6000620018338262001812565b9050919050565b620018458162001826565b81146200185157600080fd5b50565b60008135905062001865816200183a565b92915050565b600060208284031215620018845762001883620017e8565b5b6000620018948482850162001854565b91505092915050565b6000620018aa82620017f2565b9050919050565b620018bc816200189d565b8114620018c857600080fd5b50565b600081359050620018dc81620018b1565b92915050565b6000819050919050565b620018f781620018e2565b81146200190357600080fd5b50565b6000813590506200191781620018ec565b92915050565b60008060408385031215620019375762001936620017e8565b5b60006200194785828601620018cb565b92505060206200195a8582860162001906565b9150509250929050565b60008115159050919050565b6200197b8162001964565b82525050565b600060208201905062001998600083018462001970565b92915050565b600060208284031215620019b757620019b6620017e8565b5b6000620019c784828501620018cb565b91505092915050565b620019db81620018e2565b82525050565b6000602082019050620019f86000830184620019d0565b92915050565b60008060006060848603121562001a1a5762001a19620017e8565b5b600062001a2a86828701620018cb565b935050602062001a3d86828701620018cb565b925050604062001a508682870162001906565b9150509250925092565b600060ff82169050919050565b62001a728162001a5a565b82525050565b600060208201905062001a8f600083018462001a67565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262001abd5762001abc62001a95565b5b8235905067ffffffffffffffff81111562001add5762001adc62001a9a565b5b60208301915083600182028301111562001afc5762001afb62001a9f565b5b9250929050565b6000806000806060858703121562001b205762001b1f620017e8565b5b600062001b3087828801620018cb565b945050602062001b438782880162001906565b935050604085013567ffffffffffffffff81111562001b675762001b66620017ed565b5b62001b758782880162001aa4565b925092505092959194509250565b60006020828403121562001b9c5762001b9b620017e8565b5b600062001bac8482850162001906565b91505092915050565b600060e08201905062001bcc600083018a620019d0565b62001bdb6020830189620019d0565b62001bea6040830188620019d0565b62001bf96060830187620019d0565b62001c086080830186620019d0565b62001c1760a0830185620019d0565b62001c2660c0830184620019d0565b98975050505050505050565b62001c3d816200189d565b82525050565b600060208201905062001c5a600083018462001c32565b92915050565b6000806040838503121562001c7a5762001c79620017e8565b5b600062001c8a85828601620018cb565b925050602062001c9d85828601620018cb565b9150509250929050565b62001cb28162001964565b811462001cbe57600080fd5b50565b60008135905062001cd28162001ca7565b92915050565b60008060006060848603121562001cf45762001cf3620017e8565b5b600062001d0486828701620018cb565b935050602062001d178682870162001cc1565b925050604062001d2a8682870162001cc1565b9150509250925092565b6000819050919050565b600062001d5f62001d5962001d5384620017f2565b62001d34565b620017f2565b9050919050565b600062001d738262001d3e565b9050919050565b600062001d878262001d66565b9050919050565b62001d998162001d7a565b82525050565b600062001dac8262001d3e565b9050919050565b600062001dc08262001d9f565b9050919050565b62001dd28162001db3565b82525050565b600060408201905062001def600083018562001d8e565b62001dfe602083018462001dc7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001e4182620018e2565b915062001e4e83620018e2565b92508282101562001e645762001e6362001e05565b5b828203905092915050565b600082825260208201905092915050565b82818337600083830152505050565b600062001e9d838562001e6f565b935062001eac83858462001e80565b62001eb78362001772565b840190509392505050565b600060608201905062001ed9600083018762001c32565b62001ee86020830186620019d0565b818103604083015262001efd81848662001e8f565b905095945050505050565b60008151905062001f198162001ca7565b92915050565b60006020828403121562001f385762001f37620017e8565b5b600062001f488482850162001f08565b91505092915050565b600062001f5e82620018e2565b915062001f6b83620018e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001fa35762001fa262001e05565b5b828201905092915050565b60008151905062001fbf81620018ec565b92915050565b60006020828403121562001fde5762001fdd620017e8565b5b600062001fee8482850162001fae565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b6200201c8162001ff7565b81146200202857600080fd5b50565b6000815190506200203c8162002011565b92915050565b600063ffffffff82169050919050565b6200205d8162002042565b81146200206957600080fd5b50565b6000815190506200207d8162002052565b92915050565b6000806000606084860312156200209f576200209e620017e8565b5b6000620020af868287016200202b565b9350506020620020c2868287016200202b565b9250506040620020d5868287016200206c565b9150509250925092565b6000604082019050620020f6600083018562001970565b62002105602083018462001970565b9392505050565b60006200211982620018e2565b91506200212683620018e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562002162576200216162001e05565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620021a982620018e2565b9150620021b683620018e2565b925082620021c957620021c86200216d565b5b82820490509291505056fe60806040523480156200001157600080fd5b50604051620016ef380380620016ef8339818101604052810190620000379190620001e2565b81600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600060050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000229565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200013d8262000110565b9050919050565b6000620001518262000130565b9050919050565b620001638162000144565b81146200016f57600080fd5b50565b600081519050620001838162000158565b92915050565b6000620001968262000110565b9050919050565b6000620001aa8262000189565b9050919050565b620001bc816200019d565b8114620001c857600080fd5b50565b600081519050620001dc81620001b1565b92915050565b60008060408385031215620001fc57620001fb6200010b565b5b60006200020c8582860162000172565b92505060206200021f85828601620001cb565b9150509250929050565b6114b680620002396000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80635c99d8cc116100665780635c99d8cc1461014c578063853828b61461017c578063b6b55f2514610186578063bd77ac2c146101a2578063ff50abdc146101be5761009e565b80632e1a7d4d146100a357806336efd16f146100bf578063479ba7ae146100db5780634e71d92d1461010b57806357f6b81214610115575b600080fd5b6100bd60048036038101906100b89190610e3f565b6101dc565b005b6100d960048036038101906100d49190610eca565b6103dd565b005b6100f560048036038101906100f09190610f0a565b6105cd565b6040516101029190610f46565b60405180910390f35b610113610653565b005b61012f600480360381019061012a9190610f0a565b6107d7565b604051610143989796959493929190610f61565b60405180910390f35b61016660048036038101906101619190610f0a565b610a0a565b6040516101739190610f46565b60405180910390f35b610184610a58565b005b6101a0600480360381019061019b9190610e3f565b610a7b565b005b6101bc60048036038101906101b79190610e3f565b610a88565b005b6101c6610b44565b6040516101d39190610f46565b60405180910390f35b6000811180156101f457506101f033610a0a565b8111155b6101fd57600080fd5b610205610b50565b80600080016000828254610219919061100e565b9250508190555080600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610275919061100e565b925050819055506000600101548161028d9190611042565b600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546102e191906110a6565b92505081905550600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610348929190611149565b6020604051808303816000875af1158015610367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b91906111aa565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516103d29190610f46565b60405180910390a250565b600082116103ea57600080fd5b6103f2610b50565b600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610454939291906111d7565b6020604051808303816000875af1158015610473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049791906111aa565b50816000800160008282546104ac919061120e565b9250508190555081600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610508919061120e565b92505081905550600060010154826105209190611042565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546105749190611264565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c836040516105c19190610f46565b60405180910390a25050565b600068010000000000000000600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461062884610a0a565b6000600101546106389190611042565b61064291906110a6565b61064c9190611327565b9050919050565b61065b610b50565b6000610666336105cd565b905060008111156107d45768010000000000000000816106869190611042565b600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546106da9190611264565b92505081905550600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610741929190611149565b6020604051808303816000875af1158015610760573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078491906111aa565b503373ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4826040516107cb9190610f46565b60405180910390a25b50565b6000806000806000806000806107eb610b44565b9750600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357f6b812306040518263ffffffff1660e01b815260040161084b9190611358565b60e060405180830381865afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190611388565b90919293949550909150905050809750819850829950505050600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b81526004016109039190611358565b602060405180830381865afa158015610920573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610944919061142a565b9350600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a306040518363ffffffff1660e01b81526004016109a6929190611457565b602060405180830381865afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e7919061142a565b92506109f289610a0a565b91506109fd896105cd565b9050919395975091939597565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000610a6333610a0a565b90506000811115610a7857610a77816101dc565b5b50565b610a8581336103dd565b50565b6000811115610b4157600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610af3939291906111d7565b6020604051808303816000875af1158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3691906111aa565b50610b4081610d32565b5b50565b60008060000154905090565b600030905060008060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610bb49190611358565b602060405180830381865afa158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf5919061142a565b9050600060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b50505050610d2e81600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610cde9190611358565b602060405180830381865afa158015610cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1f919061142a565b610d29919061100e565b610d32565b5050565b6000811115610e01576000610d45610b44565b1415610d6c578060006002016000828254610d60919061120e565b92505081905550610dc9565b610d74610b44565b6801000000000000000060006002015483610d8f919061120e565b610d999190611042565b610da39190611327565b60006001016000828254610db7919061120e565b92505081905550600080600201819055505b7f3ac0594a85a20354f9dc74f33728416d19ce00d04a406c108cc2dcf2cecea13481604051610df89190610f46565b60405180910390a15b50565b600080fd5b6000819050919050565b610e1c81610e09565b8114610e2757600080fd5b50565b600081359050610e3981610e13565b92915050565b600060208284031215610e5557610e54610e04565b5b6000610e6384828501610e2a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e9782610e6c565b9050919050565b610ea781610e8c565b8114610eb257600080fd5b50565b600081359050610ec481610e9e565b92915050565b60008060408385031215610ee157610ee0610e04565b5b6000610eef85828601610e2a565b9250506020610f0085828601610eb5565b9150509250929050565b600060208284031215610f2057610f1f610e04565b5b6000610f2e84828501610eb5565b91505092915050565b610f4081610e09565b82525050565b6000602082019050610f5b6000830184610f37565b92915050565b600061010082019050610f77600083018b610f37565b610f84602083018a610f37565b610f916040830189610f37565b610f9e6060830188610f37565b610fab6080830187610f37565b610fb860a0830186610f37565b610fc560c0830185610f37565b610fd260e0830184610f37565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061101982610e09565b915061102483610e09565b92508282101561103757611036610fdf565b5b828203905092915050565b600061104d82610e09565b915061105883610e09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561109157611090610fdf565b5b828202905092915050565b6000819050919050565b60006110b18261109c565b91506110bc8361109c565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156110f7576110f6610fdf565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561112f5761112e610fdf565b5b828203905092915050565b61114381610e8c565b82525050565b600060408201905061115e600083018561113a565b61116b6020830184610f37565b9392505050565b60008115159050919050565b61118781611172565b811461119257600080fd5b50565b6000815190506111a48161117e565b92915050565b6000602082840312156111c0576111bf610e04565b5b60006111ce84828501611195565b91505092915050565b60006060820190506111ec600083018661113a565b6111f9602083018561113a565b6112066040830184610f37565b949350505050565b600061121982610e09565b915061122483610e09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561125957611258610fdf565b5b828201905092915050565b600061126f8261109c565b915061127a8361109c565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156112b5576112b4610fdf565b5b817f80000000000000000000000000000000000000000000000000000000000000000383126000831216156112ed576112ec610fdf565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061133282610e09565b915061133d83610e09565b92508261134d5761134c6112f8565b5b828204905092915050565b600060208201905061136d600083018461113a565b92915050565b60008151905061138281610e13565b92915050565b600080600080600080600060e0888a0312156113a7576113a6610e04565b5b60006113b58a828b01611373565b97505060206113c68a828b01611373565b96505060406113d78a828b01611373565b95505060606113e88a828b01611373565b94505060806113f98a828b01611373565b93505060a061140a8a828b01611373565b92505060c061141b8a828b01611373565b91505092959891949750929550565b6000602082840312156114405761143f610e04565b5b600061144e84828501611373565b91505092915050565b600060408201905061146c600083018561113a565b611479602083018461113a565b939250505056fea2646970667358221220795594f2fe07a454decd154a2e9c7744cd6f0aae312bc6290ac096a11381bb9f64736f6c634300080a0033a26469706673582212206399482d31b563b20032ee5c2eceda4245cecb36674a015ccdaa7267c2a12ae164736f6c634300080a0033

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620001605760003560e01c806342966c6811620000c957806395d89b41116200008757806395d89b41146200040f578063a8b089821462000431578063a9059cbb1462000453578063c81c08651462000489578063dd62ed3e14620004ab578063e6a6dcce14620004e15762000160565b806342966c68146200033957806357f6b812146200035957806370a082311462000395578063788bff6814620003cb5780638da5cb5b14620003ed5762000160565b80631e3c187f11620001235780631e3c187f146200021f57806323b872dd146200025557806328687cc7146200028b578063313ce56714620002c15780634000aea014620002e357806340c10f1914620003195762000160565b806306fdde031462000165578063080ad5551462000187578063095ea7b314620001a757806313af403514620001dd57806318160ddd14620001fd575b600080fd5b6200016f62000501565b6040516200017e9190620017c4565b60405180910390f35b620001a560048036038101906200019f91906200186b565b6200053a565b005b620001c56004803603810190620001bf91906200191d565b62000704565b604051620001d4919062001981565b60405180910390f35b620001fb6004803603810190620001f591906200199e565b6200071b565b005b62000207620007a4565b604051620002169190620019e1565b60405180910390f35b6200023d60048036038101906200023791906200199e565b620007b0565b6040516200024c919062001981565b60405180910390f35b6200027360048036038101906200026d9190620019fe565b62000808565b60405162000282919062001981565b60405180910390f35b620002a96004803603810190620002a391906200199e565b62000902565b604051620002b8919062001981565b60405180910390f35b620002cb6200095a565b604051620002da919062001a78565b60405180910390f35b620003016004803603810190620002fb919062001b03565b6200095f565b60405162000310919062001981565b60405180910390f35b6200033760048036038101906200033191906200191d565b62000a50565b005b62000357600480360381019062000351919062001b83565b62000b95565b005b6200037760048036038101906200037191906200199e565b62000c93565b6040516200038c979695949392919062001bb5565b60405180910390f35b620003b36004803603810190620003ad91906200199e565b62000f1f565b604051620003c29190620019e1565b60405180910390f35b620003d562000f6d565b604051620003e4919062001c43565b60405180910390f35b620003f762000f99565b60405162000406919062001c43565b60405180910390f35b6200041962000fc5565b604051620004289190620017c4565b60405180910390f35b6200043b62000ffe565b6040516200044a919062001c43565b60405180910390f35b6200047160048036038101906200046b91906200191d565b6200102a565b60405162000480919062001981565b60405180910390f35b6200049362001041565b604051620004a2919062001c43565b60405180910390f35b620004c96004803603810190620004c3919062001c60565b6200106d565b604051620004d89190620019e1565b60405180910390f35b620004ff6004803603810190620004f9919062001cd8565b620010f9565b005b6040518060400160405280600b81526020017f4b72696c6c20546f6b656e00000000000000000000000000000000000000000081525081565b6200054462000f99565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148015620005b45750600073ffffffffffffffffffffffffffffffffffffffff166200059c62000f6d565b73ffffffffffffffffffffffffffffffffffffffff16145b620005be57600080fd5b80600060070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200065c9062001712565b6200066992919062001dd8565b604051809103906000f08015801562000686573d6000803e3d6000fd5b50600060080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200070030620006d962000f6d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62001246565b5050565b60006200071333848462001246565b905092915050565b6200072562000f99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200075d57600080fd5b80600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060000154905090565b60008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000806200081785336200106d565b9050828110156200082757600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114620008eb5782600060010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620008e3919062001e34565b925050819055505b620008f885858562001341565b9150509392505050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601281565b6000806200096d8662000f1f565b90506200097c33878762001341565b506000816200098b8862000f1f565b62000997919062001e34565b90506000873b905060008163ffffffff16111562000a41578773ffffffffffffffffffffffffffffffffffffffff16636be32e73338489896040518563ffffffff1660e01b8152600401620009f0949392919062001ec2565b6020604051808303816000875af115801562000a10573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a36919062001f1f565b62000a4057600080fd5b5b60019350505050949350505050565b600060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000aae57600080fd5b8060008001600082825462000ac4919062001f51565b9250508190555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462000b22919062001f51565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000b899190620019e1565b60405180910390a35050565b8062000ba13362000f1f565b101562000bad57600080fd5b8060008001600082825462000bc3919062001e34565b9250508190555080600060010160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462000c21919062001e34565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c889190620019e1565b60405180910390a350565b600080600080600080600062000ca8620007a4565b9650600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d41919062001fc5565b9550600080600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000db7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ddd919062002083565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600060060160149054906101000a900460ff1662000e21578062000e23565b815b9650600060060160149054906101000a900460ff1662000e44578162000e46565b805b955062000e5d8a62000e5762001041565b6200106d565b945062000e6a8a62000f1f565b9350600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b815260040162000ecc919062001c43565b602060405180830381865afa15801562000eea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f10919062001fc5565b92505050919395979092949650565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60008060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600581526020017f4b52494c4c00000000000000000000000000000000000000000000000000000081525081565b60008060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006200103933848462001341565b905092915050565b60008060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6200110362000f99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200113b57600080fd5b81600060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f855852ede06df792cbe12bbb8b292fd0d251a1dcfea1f072d5793f1930568ebf838360405162001239929190620020df565b60405180910390a2505050565b600081600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200132e9190620019e1565b60405180910390a3600190509392505050565b6000816200134f8562000f1f565b10156200135b57600080fd5b81600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254620013b2919062001e34565b925050819055506000620013c562000f6d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806200143357506200140462000f6d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b806200147357506200144462001041565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80620014865750620014858562000902565b5b806200149957506200149884620007b0565b5b62001627576064600184620014af91906200210c565b620014bb91906200219c565b9050600030905081600060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462001519919062001f51565b925050819055508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516200157f9190620019e1565b60405180910390a3600060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd77ac2c620015d38362000f1f565b6040518263ffffffff1660e01b8152600401620015f19190620019e1565b600060405180830381600087803b1580156200160c57600080fd5b505af115801562001621573d6000803e3d6000fd5b50505050505b808362001635919062001e34565b600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546200168b919062001f51565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8386620016ef919062001e34565b604051620016fe9190620019e1565b60405180910390a360019150509392505050565b6116ef80620021d583390190565b600081519050919050565b600082825260208201905092915050565b60005b838110156200175c5780820151818401526020810190506200173f565b838111156200176c576000848401525b50505050565b6000601f19601f8301169050919050565b6000620017908262001720565b6200179c81856200172b565b9350620017ae8185602086016200173c565b620017b98162001772565b840191505092915050565b60006020820190508181036000830152620017e0818462001783565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200181f82620017f2565b9050919050565b6000620018338262001812565b9050919050565b620018458162001826565b81146200185157600080fd5b50565b60008135905062001865816200183a565b92915050565b600060208284031215620018845762001883620017e8565b5b6000620018948482850162001854565b91505092915050565b6000620018aa82620017f2565b9050919050565b620018bc816200189d565b8114620018c857600080fd5b50565b600081359050620018dc81620018b1565b92915050565b6000819050919050565b620018f781620018e2565b81146200190357600080fd5b50565b6000813590506200191781620018ec565b92915050565b60008060408385031215620019375762001936620017e8565b5b60006200194785828601620018cb565b92505060206200195a8582860162001906565b9150509250929050565b60008115159050919050565b6200197b8162001964565b82525050565b600060208201905062001998600083018462001970565b92915050565b600060208284031215620019b757620019b6620017e8565b5b6000620019c784828501620018cb565b91505092915050565b620019db81620018e2565b82525050565b6000602082019050620019f86000830184620019d0565b92915050565b60008060006060848603121562001a1a5762001a19620017e8565b5b600062001a2a86828701620018cb565b935050602062001a3d86828701620018cb565b925050604062001a508682870162001906565b9150509250925092565b600060ff82169050919050565b62001a728162001a5a565b82525050565b600060208201905062001a8f600083018462001a67565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262001abd5762001abc62001a95565b5b8235905067ffffffffffffffff81111562001add5762001adc62001a9a565b5b60208301915083600182028301111562001afc5762001afb62001a9f565b5b9250929050565b6000806000806060858703121562001b205762001b1f620017e8565b5b600062001b3087828801620018cb565b945050602062001b438782880162001906565b935050604085013567ffffffffffffffff81111562001b675762001b66620017ed565b5b62001b758782880162001aa4565b925092505092959194509250565b60006020828403121562001b9c5762001b9b620017e8565b5b600062001bac8482850162001906565b91505092915050565b600060e08201905062001bcc600083018a620019d0565b62001bdb6020830189620019d0565b62001bea6040830188620019d0565b62001bf96060830187620019d0565b62001c086080830186620019d0565b62001c1760a0830185620019d0565b62001c2660c0830184620019d0565b98975050505050505050565b62001c3d816200189d565b82525050565b600060208201905062001c5a600083018462001c32565b92915050565b6000806040838503121562001c7a5762001c79620017e8565b5b600062001c8a85828601620018cb565b925050602062001c9d85828601620018cb565b9150509250929050565b62001cb28162001964565b811462001cbe57600080fd5b50565b60008135905062001cd28162001ca7565b92915050565b60008060006060848603121562001cf45762001cf3620017e8565b5b600062001d0486828701620018cb565b935050602062001d178682870162001cc1565b925050604062001d2a8682870162001cc1565b9150509250925092565b6000819050919050565b600062001d5f62001d5962001d5384620017f2565b62001d34565b620017f2565b9050919050565b600062001d738262001d3e565b9050919050565b600062001d878262001d66565b9050919050565b62001d998162001d7a565b82525050565b600062001dac8262001d3e565b9050919050565b600062001dc08262001d9f565b9050919050565b62001dd28162001db3565b82525050565b600060408201905062001def600083018562001d8e565b62001dfe602083018462001dc7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001e4182620018e2565b915062001e4e83620018e2565b92508282101562001e645762001e6362001e05565b5b828203905092915050565b600082825260208201905092915050565b82818337600083830152505050565b600062001e9d838562001e6f565b935062001eac83858462001e80565b62001eb78362001772565b840190509392505050565b600060608201905062001ed9600083018762001c32565b62001ee86020830186620019d0565b818103604083015262001efd81848662001e8f565b905095945050505050565b60008151905062001f198162001ca7565b92915050565b60006020828403121562001f385762001f37620017e8565b5b600062001f488482850162001f08565b91505092915050565b600062001f5e82620018e2565b915062001f6b83620018e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001fa35762001fa262001e05565b5b828201905092915050565b60008151905062001fbf81620018ec565b92915050565b60006020828403121562001fde5762001fdd620017e8565b5b600062001fee8482850162001fae565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b6200201c8162001ff7565b81146200202857600080fd5b50565b6000815190506200203c8162002011565b92915050565b600063ffffffff82169050919050565b6200205d8162002042565b81146200206957600080fd5b50565b6000815190506200207d8162002052565b92915050565b6000806000606084860312156200209f576200209e620017e8565b5b6000620020af868287016200202b565b9350506020620020c2868287016200202b565b9250506040620020d5868287016200206c565b9150509250925092565b6000604082019050620020f6600083018562001970565b62002105602083018462001970565b9392505050565b60006200211982620018e2565b91506200212683620018e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562002162576200216162001e05565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620021a982620018e2565b9150620021b683620018e2565b925082620021c957620021c86200216d565b5b82820490509291505056fe60806040523480156200001157600080fd5b50604051620016ef380380620016ef8339818101604052810190620000379190620001e2565b81600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600060050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000229565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200013d8262000110565b9050919050565b6000620001518262000130565b9050919050565b620001638162000144565b81146200016f57600080fd5b50565b600081519050620001838162000158565b92915050565b6000620001968262000110565b9050919050565b6000620001aa8262000189565b9050919050565b620001bc816200019d565b8114620001c857600080fd5b50565b600081519050620001dc81620001b1565b92915050565b60008060408385031215620001fc57620001fb6200010b565b5b60006200020c8582860162000172565b92505060206200021f85828601620001cb565b9150509250929050565b6114b680620002396000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80635c99d8cc116100665780635c99d8cc1461014c578063853828b61461017c578063b6b55f2514610186578063bd77ac2c146101a2578063ff50abdc146101be5761009e565b80632e1a7d4d146100a357806336efd16f146100bf578063479ba7ae146100db5780634e71d92d1461010b57806357f6b81214610115575b600080fd5b6100bd60048036038101906100b89190610e3f565b6101dc565b005b6100d960048036038101906100d49190610eca565b6103dd565b005b6100f560048036038101906100f09190610f0a565b6105cd565b6040516101029190610f46565b60405180910390f35b610113610653565b005b61012f600480360381019061012a9190610f0a565b6107d7565b604051610143989796959493929190610f61565b60405180910390f35b61016660048036038101906101619190610f0a565b610a0a565b6040516101739190610f46565b60405180910390f35b610184610a58565b005b6101a0600480360381019061019b9190610e3f565b610a7b565b005b6101bc60048036038101906101b79190610e3f565b610a88565b005b6101c6610b44565b6040516101d39190610f46565b60405180910390f35b6000811180156101f457506101f033610a0a565b8111155b6101fd57600080fd5b610205610b50565b80600080016000828254610219919061100e565b9250508190555080600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610275919061100e565b925050819055506000600101548161028d9190611042565b600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546102e191906110a6565b92505081905550600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610348929190611149565b6020604051808303816000875af1158015610367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b91906111aa565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516103d29190610f46565b60405180910390a250565b600082116103ea57600080fd5b6103f2610b50565b600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610454939291906111d7565b6020604051808303816000875af1158015610473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049791906111aa565b50816000800160008282546104ac919061120e565b9250508190555081600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610508919061120e565b92505081905550600060010154826105209190611042565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546105749190611264565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c836040516105c19190610f46565b60405180910390a25050565b600068010000000000000000600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461062884610a0a565b6000600101546106389190611042565b61064291906110a6565b61064c9190611327565b9050919050565b61065b610b50565b6000610666336105cd565b905060008111156107d45768010000000000000000816106869190611042565b600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546106da9190611264565b92505081905550600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610741929190611149565b6020604051808303816000875af1158015610760573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078491906111aa565b503373ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4826040516107cb9190610f46565b60405180910390a25b50565b6000806000806000806000806107eb610b44565b9750600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357f6b812306040518263ffffffff1660e01b815260040161084b9190611358565b60e060405180830381865afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190611388565b90919293949550909150905050809750819850829950505050600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b81526004016109039190611358565b602060405180830381865afa158015610920573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610944919061142a565b9350600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a306040518363ffffffff1660e01b81526004016109a6929190611457565b602060405180830381865afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e7919061142a565b92506109f289610a0a565b91506109fd896105cd565b9050919395975091939597565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000610a6333610a0a565b90506000811115610a7857610a77816101dc565b5b50565b610a8581336103dd565b50565b6000811115610b4157600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610af3939291906111d7565b6020604051808303816000875af1158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3691906111aa565b50610b4081610d32565b5b50565b60008060000154905090565b600030905060008060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610bb49190611358565b602060405180830381865afa158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf5919061142a565b9050600060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b50505050610d2e81600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610cde9190611358565b602060405180830381865afa158015610cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1f919061142a565b610d29919061100e565b610d32565b5050565b6000811115610e01576000610d45610b44565b1415610d6c578060006002016000828254610d60919061120e565b92505081905550610dc9565b610d74610b44565b6801000000000000000060006002015483610d8f919061120e565b610d999190611042565b610da39190611327565b60006001016000828254610db7919061120e565b92505081905550600080600201819055505b7f3ac0594a85a20354f9dc74f33728416d19ce00d04a406c108cc2dcf2cecea13481604051610df89190610f46565b60405180910390a15b50565b600080fd5b6000819050919050565b610e1c81610e09565b8114610e2757600080fd5b50565b600081359050610e3981610e13565b92915050565b600060208284031215610e5557610e54610e04565b5b6000610e6384828501610e2a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e9782610e6c565b9050919050565b610ea781610e8c565b8114610eb257600080fd5b50565b600081359050610ec481610e9e565b92915050565b60008060408385031215610ee157610ee0610e04565b5b6000610eef85828601610e2a565b9250506020610f0085828601610eb5565b9150509250929050565b600060208284031215610f2057610f1f610e04565b5b6000610f2e84828501610eb5565b91505092915050565b610f4081610e09565b82525050565b6000602082019050610f5b6000830184610f37565b92915050565b600061010082019050610f77600083018b610f37565b610f84602083018a610f37565b610f916040830189610f37565b610f9e6060830188610f37565b610fab6080830187610f37565b610fb860a0830186610f37565b610fc560c0830185610f37565b610fd260e0830184610f37565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061101982610e09565b915061102483610e09565b92508282101561103757611036610fdf565b5b828203905092915050565b600061104d82610e09565b915061105883610e09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561109157611090610fdf565b5b828202905092915050565b6000819050919050565b60006110b18261109c565b91506110bc8361109c565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156110f7576110f6610fdf565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561112f5761112e610fdf565b5b828203905092915050565b61114381610e8c565b82525050565b600060408201905061115e600083018561113a565b61116b6020830184610f37565b9392505050565b60008115159050919050565b61118781611172565b811461119257600080fd5b50565b6000815190506111a48161117e565b92915050565b6000602082840312156111c0576111bf610e04565b5b60006111ce84828501611195565b91505092915050565b60006060820190506111ec600083018661113a565b6111f9602083018561113a565b6112066040830184610f37565b949350505050565b600061121982610e09565b915061122483610e09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561125957611258610fdf565b5b828201905092915050565b600061126f8261109c565b915061127a8361109c565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156112b5576112b4610fdf565b5b817f80000000000000000000000000000000000000000000000000000000000000000383126000831216156112ed576112ec610fdf565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061133282610e09565b915061133d83610e09565b92508261134d5761134c6112f8565b5b828204905092915050565b600060208201905061136d600083018461113a565b92915050565b60008151905061138281610e13565b92915050565b600080600080600080600060e0888a0312156113a7576113a6610e04565b5b60006113b58a828b01611373565b97505060206113c68a828b01611373565b96505060406113d78a828b01611373565b95505060606113e88a828b01611373565b94505060806113f98a828b01611373565b93505060a061140a8a828b01611373565b92505060c061141b8a828b01611373565b91505092959891949750929550565b6000602082840312156114405761143f610e04565b5b600061144e84828501611373565b91505092915050565b600060408201905061146c600083018561113a565b611479602083018461113a565b939250505056fea2646970667358221220795594f2fe07a454decd154a2e9c7744cd6f0aae312bc6290ac096a11381bb9f64736f6c634300080a0033a26469706673582212206399482d31b563b20032ee5c2eceda4245cecb36674a015ccdaa7267c2a12ae164736f6c634300080a0033

Deployed Bytecode Sourcemap

1776:5898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1920:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3419:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4306:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3045:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5839:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5720:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4443:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5598:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2010:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4769:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3708:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3950:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6182:587;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;5930:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5406:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5519:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1967:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5311:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4177:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5214:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6041:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3133:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1920:43;;;;;;;;;;;;;;;;;;;:::o;3419:282::-;3499:7;:5;:7::i;:::-;3486:20;;:9;:20;;;:63;;;;;3545:3;3510:39;;:23;:21;:23::i;:::-;:39;;;3486:63;3478:72;;;;;;3565:3;3555:4;:7;;;:13;;;;;;;;;;;;;;;;;;3614:4;:7;;;;;;;;;;;;3623:4;:9;;;;;;;;;;;;3595:38;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;3573:4;:19;;;:60;;;;;;;;;;;;;;;;;;3638:58;3655:4;3662:23;:21;:23::i;:::-;1833:17;3638:8;:58::i;:::-;;3419:282;:::o;4306:132::-;4376:4;4394:39;4403:10;4415:8;4425:7;4394:8;:39::i;:::-;4387:46;;4306:132;;;;:::o;3045:83::-;2741:7;:5;:7::i;:::-;2727:21;;:10;:21;;;2719:30;;;;;;3117:6:::1;3104:4;:10;;;:19;;;;;;;;;;;;;;;;;;3045:83:::0;:::o;5839:86::-;5883:7;5904:4;:16;;;5897:23;;5839:86;:::o;5720:113::-;5784:4;5802;:16;;:26;5819:8;5802:26;;;;;;;;;;;;;;;;;;;;;;;;;5795:33;;5720:113;;;:::o;4443:321::-;4528:4;4539:18;4560:28;4570:5;4577:10;4560:9;:28::i;:::-;4539:49;;4615:7;4601:10;:21;;4593:30;;;;;;1833:17;4632:10;:22;4628:90;;4705:7;4662:4;:10;;:17;4673:5;4662:17;;;;;;;;;;;;;;;:27;;:39;4690:10;4662:39;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;4628:90;4729:30;4739:5;4746:3;4751:7;4729:9;:30::i;:::-;4722:37;;;4443:321;;;;;:::o;5598:117::-;5664:4;5682;:18;;:28;5701:8;5682:28;;;;;;;;;;;;;;;;;;;;;;;;;5675:35;;5598:117;;;:::o;2010:35::-;2043:2;2010:35;:::o;4769:437::-;4864:4;4875:22;4900:14;4910:3;4900:9;:14::i;:::-;4875:39;;4919:35;4929:10;4941:3;4946:7;4919:9;:35::i;:::-;;4959:23;5002:14;4985;4995:3;4985:9;:14::i;:::-;:31;;;;:::i;:::-;4959:57;;5021:12;5074:3;5062:16;5053:25;;5099:1;5091:5;:9;;;5087:99;;;5125:3;5116:27;;;5144:10;5156:15;5173:5;;5116:63;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5108:72;;;;;;5087:99;5197:4;5190:11;;;;;4769:437;;;;;;:::o;3708:237::-;3802:4;:7;;;;;;;;;;;;3780:30;;:10;:30;;;3772:39;;;;;;3836:7;3816:4;:16;;;:27;;;;;;;:::i;:::-;;;;;;;;3881:7;3848:4;:10;;:21;3859:9;3848:21;;;;;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;3921:9;3898:42;;3915:3;3898:42;;;3932:7;3898:42;;;;;;:::i;:::-;;;;;;;;3708:237;;:::o;3950:222::-;4028:7;4003:21;4013:10;4003:9;:21::i;:::-;:32;;3995:41;;;;;;4061:7;4041:4;:16;;;:27;;;;;;;:::i;:::-;;;;;;;;4107:7;4073:4;:10;;:22;4084:10;4073:22;;;;;;;;;;;;;;;:30;;;:41;;;;;;;:::i;:::-;;;;;;;;4153:3;4124:43;;4133:10;4124:43;;;4159:7;4124:43;;;;;;:::i;:::-;;;;;;;;3950:222;:::o;6182:587::-;6240:19;6261:21;6284:19;6305:20;6327:21;6350:19;6371:21;6413:13;:11;:13::i;:::-;6399:27;;6447:4;:9;;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6431:39;;6476:13;6491;6510:4;:9;;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6475:58;;;;;;;;;6552:4;:10;;;;;;;;;;;;:26;;6573:5;6552:26;;;6565:5;6552:26;6538:40;;6598:4;:10;;;;;;;;;;;;:26;;6619:5;6598:26;;;6611:5;6598:26;6583:41;;6645:37;6655:5;6662:19;:17;:19::i;:::-;6645:9;:37::i;:::-;6629:53;;6701:16;6711:5;6701:9;:16::i;:::-;6687:30;;6738:4;:9;;;;;;;;;;;;:19;;;6758:5;6738:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6722:42;;6394:375;;6182:587;;;;;;;;;:::o;5930:106::-;5985:7;6006:4;:10;;:17;6017:5;6006:17;;;;;;;;;;;;;;;:25;;;5999:32;;5930:106;;;:::o;5406:108::-;5460:7;5489:4;:19;;;;;;;;;;;;5474:35;;5406:108;:::o;5519:74::-;5557:7;5578:4;:10;;;;;;;;;;;;5571:17;;5519:74;:::o;1967:39::-;;;;;;;;;;;;;;;;;;;:::o;5311:90::-;5357:7;5386:4;:9;;;;;;;;;;;;5371:25;;5311:90;:::o;4177:124::-;4243:4;4261:35;4271:10;4283:3;4288:7;4261:9;:35::i;:::-;4254:42;;4177:124;;;;:::o;5214:92::-;5264:7;5293:4;:7;;;;;;;;;;;;5278:23;;5214:92;:::o;6041:136::-;6114:7;6135:4;:10;;:17;6146:5;6135:17;;;;;;;;;;;;;;;:27;;:37;6163:8;6135:37;;;;;;;;;;;;;;;;6128:44;;6041:136;;;;:::o;3133:281::-;2741:7;:5;:7::i;:::-;2727:21;;:10;:21;;;2719:30;;;;;;3275:16:::1;3244:4;:18;;:28;3263:8;3244:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;3325:14;3296:4;:16;;:26;3313:8;3296:26;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;3366:8;3349:60;;;3376:16;3394:14;3349:60;;;;;;;:::i;:::-;;;;;;;;3133:281:::0;;;:::o;6776:212::-;6863:4;6915:7;6874:4;:10;;:18;6885:6;6874:18;;;;;;;;;;;;;;;:28;;:38;6903:8;6874:38;;;;;;;;;;;;;;;:48;;;;6949:8;6932:35;;6941:6;6932:35;;;6959:7;6932:35;;;;;;:::i;:::-;;;;;;;;6979:4;6972:11;;6776:212;;;;;:::o;6994:677::-;7076:4;7115:7;7095:16;7105:5;7095:9;:16::i;:::-;:27;;7087:36;;;;;;7157:7;7128:4;:10;;:17;7139:5;7128:17;;;;;;;;;;;;;;;:25;;;:36;;;;;;;:::i;:::-;;;;;;;;7169:12;7205:23;:21;:23::i;:::-;7196:32;;:5;:32;;;:66;;;;7239:23;:21;:23::i;:::-;7232:30;;:3;:30;;;7196:66;:96;;;;7273:19;:17;:19::i;:::-;7266:26;;:3;:26;;;7196:96;:124;;;;7296:24;7314:5;7296:17;:24::i;:::-;7196:124;:148;;;;7324:20;7340:3;7324:15;:20::i;:::-;7196:148;7190:369;;7385:3;1894:1;7360:7;:22;;;;:::i;:::-;:28;;;;:::i;:::-;7353:35;;7394:13;7418:4;7394:29;;7458:4;7429;:10;;:17;7440:5;7429:17;;;;;;;;;;;;;;;:25;;;:33;;;;;;;:::i;:::-;;;;;;;;7489:5;7473:28;;7482:5;7473:28;;;7496:4;7473:28;;;;;;:::i;:::-;;;;;;;;7507:4;:19;;;;;;;;;;;;:28;;;7536:16;7546:5;7536:9;:16::i;:::-;7507:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7347:212;7190:369;7600:4;7590:7;:14;;;;:::i;:::-;7563:4;:10;;:15;7574:3;7563:15;;;;;;;;;;;;;;;:23;;;:41;;;;;;;:::i;:::-;;;;;;;;7630:3;7614:36;;7623:5;7614:36;;;7645:4;7635:7;:14;;;;:::i;:::-;7614:36;;;;;;:::i;:::-;;;;;;;;7662:4;7655:11;;;6994:677;;;;;:::o;-1:-1:-1:-;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:104::-;1901:7;1930:24;1948:5;1930:24;:::i;:::-;1919:35;;1856:104;;;:::o;1966:123::-;2022:7;2051:32;2077:5;2051:32;:::i;:::-;2040:43;;1966:123;;;:::o;2095:160::-;2187:43;2224:5;2187:43;:::i;:::-;2180:5;2177:54;2167:82;;2245:1;2242;2235:12;2167:82;2095:160;:::o;2261:177::-;2326:5;2364:6;2351:20;2342:29;;2380:52;2426:5;2380:52;:::i;:::-;2261:177;;;;:::o;2444:367::-;2522:6;2571:2;2559:9;2550:7;2546:23;2542:32;2539:119;;;2577:79;;:::i;:::-;2539:119;2697:1;2722:72;2786:7;2777:6;2766:9;2762:22;2722:72;:::i;:::-;2712:82;;2668:136;2444:367;;;;:::o;2817:96::-;2854:7;2883:24;2901:5;2883:24;:::i;:::-;2872:35;;2817:96;;;:::o;2919:122::-;2992:24;3010:5;2992:24;:::i;:::-;2985:5;2982:35;2972:63;;3031:1;3028;3021:12;2972:63;2919:122;:::o;3047:139::-;3093:5;3131:6;3118:20;3109:29;;3147:33;3174:5;3147:33;:::i;:::-;3047:139;;;;:::o;3192:77::-;3229:7;3258:5;3247:16;;3192:77;;;:::o;3275:122::-;3348:24;3366:5;3348:24;:::i;:::-;3341:5;3338:35;3328:63;;3387:1;3384;3377:12;3328:63;3275:122;:::o;3403:139::-;3449:5;3487:6;3474:20;3465:29;;3503:33;3530:5;3503:33;:::i;:::-;3403:139;;;;:::o;3548:474::-;3616:6;3624;3673:2;3661:9;3652:7;3648:23;3644:32;3641:119;;;3679:79;;:::i;:::-;3641:119;3799:1;3824:53;3869:7;3860:6;3849:9;3845:22;3824:53;:::i;:::-;3814:63;;3770:117;3926:2;3952:53;3997:7;3988:6;3977:9;3973:22;3952:53;:::i;:::-;3942:63;;3897:118;3548:474;;;;;:::o;4028:90::-;4062:7;4105:5;4098:13;4091:21;4080:32;;4028:90;;;:::o;4124:109::-;4205:21;4220:5;4205:21;:::i;:::-;4200:3;4193:34;4124:109;;:::o;4239:210::-;4326:4;4364:2;4353:9;4349:18;4341:26;;4377:65;4439:1;4428:9;4424:17;4415:6;4377:65;:::i;:::-;4239:210;;;;:::o;4455:329::-;4514:6;4563:2;4551:9;4542:7;4538:23;4534:32;4531:119;;;4569:79;;:::i;:::-;4531:119;4689:1;4714:53;4759:7;4750:6;4739:9;4735:22;4714:53;:::i;:::-;4704:63;;4660:117;4455:329;;;;:::o;4790:118::-;4877:24;4895:5;4877:24;:::i;:::-;4872:3;4865:37;4790:118;;:::o;4914:222::-;5007:4;5045:2;5034:9;5030:18;5022:26;;5058:71;5126:1;5115:9;5111:17;5102:6;5058:71;:::i;:::-;4914:222;;;;:::o;5142:619::-;5219:6;5227;5235;5284:2;5272:9;5263:7;5259:23;5255:32;5252:119;;;5290:79;;:::i;:::-;5252:119;5410:1;5435:53;5480:7;5471:6;5460:9;5456:22;5435:53;:::i;:::-;5425:63;;5381:117;5537:2;5563:53;5608:7;5599:6;5588:9;5584:22;5563:53;:::i;:::-;5553:63;;5508:118;5665:2;5691:53;5736:7;5727:6;5716:9;5712:22;5691:53;:::i;:::-;5681:63;;5636:118;5142:619;;;;;:::o;5767:86::-;5802:7;5842:4;5835:5;5831:16;5820:27;;5767:86;;;:::o;5859:112::-;5942:22;5958:5;5942:22;:::i;:::-;5937:3;5930:35;5859:112;;:::o;5977:214::-;6066:4;6104:2;6093:9;6089:18;6081:26;;6117:67;6181:1;6170:9;6166:17;6157:6;6117:67;:::i;:::-;5977:214;;;;:::o;6197:117::-;6306:1;6303;6296:12;6320:117;6429:1;6426;6419:12;6443:117;6552:1;6549;6542:12;6579:552;6636:8;6646:6;6696:3;6689:4;6681:6;6677:17;6673:27;6663:122;;6704:79;;:::i;:::-;6663:122;6817:6;6804:20;6794:30;;6847:18;6839:6;6836:30;6833:117;;;6869:79;;:::i;:::-;6833:117;6983:4;6975:6;6971:17;6959:29;;7037:3;7029:4;7021:6;7017:17;7007:8;7003:32;7000:41;6997:128;;;7044:79;;:::i;:::-;6997:128;6579:552;;;;;:::o;7137:817::-;7225:6;7233;7241;7249;7298:2;7286:9;7277:7;7273:23;7269:32;7266:119;;;7304:79;;:::i;:::-;7266:119;7424:1;7449:53;7494:7;7485:6;7474:9;7470:22;7449:53;:::i;:::-;7439:63;;7395:117;7551:2;7577:53;7622:7;7613:6;7602:9;7598:22;7577:53;:::i;:::-;7567:63;;7522:118;7707:2;7696:9;7692:18;7679:32;7738:18;7730:6;7727:30;7724:117;;;7760:79;;:::i;:::-;7724:117;7873:64;7929:7;7920:6;7909:9;7905:22;7873:64;:::i;:::-;7855:82;;;;7650:297;7137:817;;;;;;;:::o;7960:329::-;8019:6;8068:2;8056:9;8047:7;8043:23;8039:32;8036:119;;;8074:79;;:::i;:::-;8036:119;8194:1;8219:53;8264:7;8255:6;8244:9;8240:22;8219:53;:::i;:::-;8209:63;;8165:117;7960:329;;;;:::o;8295:886::-;8556:4;8594:3;8583:9;8579:19;8571:27;;8608:71;8676:1;8665:9;8661:17;8652:6;8608:71;:::i;:::-;8689:72;8757:2;8746:9;8742:18;8733:6;8689:72;:::i;:::-;8771;8839:2;8828:9;8824:18;8815:6;8771:72;:::i;:::-;8853;8921:2;8910:9;8906:18;8897:6;8853:72;:::i;:::-;8935:73;9003:3;8992:9;8988:19;8979:6;8935:73;:::i;:::-;9018;9086:3;9075:9;9071:19;9062:6;9018:73;:::i;:::-;9101;9169:3;9158:9;9154:19;9145:6;9101:73;:::i;:::-;8295:886;;;;;;;;;;:::o;9187:118::-;9274:24;9292:5;9274:24;:::i;:::-;9269:3;9262:37;9187:118;;:::o;9311:222::-;9404:4;9442:2;9431:9;9427:18;9419:26;;9455:71;9523:1;9512:9;9508:17;9499:6;9455:71;:::i;:::-;9311:222;;;;:::o;9539:474::-;9607:6;9615;9664:2;9652:9;9643:7;9639:23;9635:32;9632:119;;;9670:79;;:::i;:::-;9632:119;9790:1;9815:53;9860:7;9851:6;9840:9;9836:22;9815:53;:::i;:::-;9805:63;;9761:117;9917:2;9943:53;9988:7;9979:6;9968:9;9964:22;9943:53;:::i;:::-;9933:63;;9888:118;9539:474;;;;;:::o;10019:116::-;10089:21;10104:5;10089:21;:::i;:::-;10082:5;10079:32;10069:60;;10125:1;10122;10115:12;10069:60;10019:116;:::o;10141:133::-;10184:5;10222:6;10209:20;10200:29;;10238:30;10262:5;10238:30;:::i;:::-;10141:133;;;;:::o;10280:607::-;10351:6;10359;10367;10416:2;10404:9;10395:7;10391:23;10387:32;10384:119;;;10422:79;;:::i;:::-;10384:119;10542:1;10567:53;10612:7;10603:6;10592:9;10588:22;10567:53;:::i;:::-;10557:63;;10513:117;10669:2;10695:50;10737:7;10728:6;10717:9;10713:22;10695:50;:::i;:::-;10685:60;;10640:115;10794:2;10820:50;10862:7;10853:6;10842:9;10838:22;10820:50;:::i;:::-;10810:60;;10765:115;10280:607;;;;;:::o;10893:60::-;10921:3;10942:5;10935:12;;10893:60;;;:::o;10959:142::-;11009:9;11042:53;11060:34;11069:24;11087:5;11069:24;:::i;:::-;11060:34;:::i;:::-;11042:53;:::i;:::-;11029:66;;10959:142;;;:::o;11107:134::-;11165:9;11198:37;11229:5;11198:37;:::i;:::-;11185:50;;11107:134;;;:::o;11247:161::-;11324:9;11357:45;11396:5;11357:45;:::i;:::-;11344:58;;11247:161;;;:::o;11414:185::-;11528:64;11586:5;11528:64;:::i;:::-;11523:3;11516:77;11414:185;;:::o;11605:126::-;11655:9;11688:37;11719:5;11688:37;:::i;:::-;11675:50;;11605:126;;;:::o;11737:138::-;11799:9;11832:37;11863:5;11832:37;:::i;:::-;11819:50;;11737:138;;;:::o;11881:155::-;11980:49;12023:5;11980:49;:::i;:::-;11975:3;11968:62;11881:155;;:::o;12042:410::-;12202:4;12240:2;12229:9;12225:18;12217:26;;12253:98;12348:1;12337:9;12333:17;12324:6;12253:98;:::i;:::-;12361:84;12441:2;12430:9;12426:18;12417:6;12361:84;:::i;:::-;12042:410;;;;;:::o;12458:180::-;12506:77;12503:1;12496:88;12603:4;12600:1;12593:15;12627:4;12624:1;12617:15;12644:191;12684:4;12704:20;12722:1;12704:20;:::i;:::-;12699:25;;12738:20;12756:1;12738:20;:::i;:::-;12733:25;;12777:1;12774;12771:8;12768:34;;;12782:18;;:::i;:::-;12768:34;12827:1;12824;12820:9;12812:17;;12644:191;;;;:::o;12841:168::-;12924:11;12958:6;12953:3;12946:19;12998:4;12993:3;12989:14;12974:29;;12841:168;;;;:::o;13015:154::-;13099:6;13094:3;13089;13076:30;13161:1;13152:6;13147:3;13143:16;13136:27;13015:154;;;:::o;13197:301::-;13293:3;13314:70;13377:6;13372:3;13314:70;:::i;:::-;13307:77;;13394:43;13430:6;13425:3;13418:5;13394:43;:::i;:::-;13462:29;13484:6;13462:29;:::i;:::-;13457:3;13453:39;13446:46;;13197:301;;;;;:::o;13504:549::-;13681:4;13719:2;13708:9;13704:18;13696:26;;13732:71;13800:1;13789:9;13785:17;13776:6;13732:71;:::i;:::-;13813:72;13881:2;13870:9;13866:18;13857:6;13813:72;:::i;:::-;13932:9;13926:4;13922:20;13917:2;13906:9;13902:18;13895:48;13960:86;14041:4;14032:6;14024;13960:86;:::i;:::-;13952:94;;13504:549;;;;;;;:::o;14059:137::-;14113:5;14144:6;14138:13;14129:22;;14160:30;14184:5;14160:30;:::i;:::-;14059:137;;;;:::o;14202:345::-;14269:6;14318:2;14306:9;14297:7;14293:23;14289:32;14286:119;;;14324:79;;:::i;:::-;14286:119;14444:1;14469:61;14522:7;14513:6;14502:9;14498:22;14469:61;:::i;:::-;14459:71;;14415:125;14202:345;;;;:::o;14553:305::-;14593:3;14612:20;14630:1;14612:20;:::i;:::-;14607:25;;14646:20;14664:1;14646:20;:::i;:::-;14641:25;;14800:1;14732:66;14728:74;14725:1;14722:81;14719:107;;;14806:18;;:::i;:::-;14719:107;14850:1;14847;14843:9;14836:16;;14553:305;;;;:::o;14864:143::-;14921:5;14952:6;14946:13;14937:22;;14968:33;14995:5;14968:33;:::i;:::-;14864:143;;;;:::o;15013:351::-;15083:6;15132:2;15120:9;15111:7;15107:23;15103:32;15100:119;;;15138:79;;:::i;:::-;15100:119;15258:1;15283:64;15339:7;15330:6;15319:9;15315:22;15283:64;:::i;:::-;15273:74;;15229:128;15013:351;;;;:::o;15370:114::-;15407:7;15447:30;15440:5;15436:42;15425:53;;15370:114;;;:::o;15490:122::-;15563:24;15581:5;15563:24;:::i;:::-;15556:5;15553:35;15543:63;;15602:1;15599;15592:12;15543:63;15490:122;:::o;15618:143::-;15675:5;15706:6;15700:13;15691:22;;15722:33;15749:5;15722:33;:::i;:::-;15618:143;;;;:::o;15767:93::-;15803:7;15843:10;15836:5;15832:22;15821:33;;15767:93;;;:::o;15866:120::-;15938:23;15955:5;15938:23;:::i;:::-;15931:5;15928:34;15918:62;;15976:1;15973;15966:12;15918:62;15866:120;:::o;15992:141::-;16048:5;16079:6;16073:13;16064:22;;16095:32;16121:5;16095:32;:::i;:::-;15992:141;;;;:::o;16139:661::-;16226:6;16234;16242;16291:2;16279:9;16270:7;16266:23;16262:32;16259:119;;;16297:79;;:::i;:::-;16259:119;16417:1;16442:64;16498:7;16489:6;16478:9;16474:22;16442:64;:::i;:::-;16432:74;;16388:128;16555:2;16581:64;16637:7;16628:6;16617:9;16613:22;16581:64;:::i;:::-;16571:74;;16526:129;16694:2;16720:63;16775:7;16766:6;16755:9;16751:22;16720:63;:::i;:::-;16710:73;;16665:128;16139:661;;;;;:::o;16806:308::-;16915:4;16953:2;16942:9;16938:18;16930:26;;16966:65;17028:1;17017:9;17013:17;17004:6;16966:65;:::i;:::-;17041:66;17103:2;17092:9;17088:18;17079:6;17041:66;:::i;:::-;16806:308;;;;;:::o;17120:348::-;17160:7;17183:20;17201:1;17183:20;:::i;:::-;17178:25;;17217:20;17235:1;17217:20;:::i;:::-;17212:25;;17405:1;17337:66;17333:74;17330:1;17327:81;17322:1;17315:9;17308:17;17304:105;17301:131;;;17412:18;;:::i;:::-;17301:131;17460:1;17457;17453:9;17442:20;;17120:348;;;;:::o;17474:180::-;17522:77;17519:1;17512:88;17619:4;17616:1;17609:15;17643:4;17640:1;17633:15;17660:185;17700:1;17717:20;17735:1;17717:20;:::i;:::-;17712:25;;17751:20;17769:1;17751:20;:::i;:::-;17746:25;;17790:1;17780:35;;17795:18;;:::i;:::-;17780:35;17837:1;17834;17830:9;17825:14;;17660:185;;;;:::o

Swarm Source

ipfs://6399482d31b563b20032ee5c2eceda4245cecb36674a015ccdaa7267c2a12ae1

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.