Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
12.185 ETH
Eth Value
$40,377.40 (@ $3,313.70/ETH)Token Holdings
Latest 25 from a total of 6,992 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Cancel | 21179471 | 9 days ago | IN | 0.7 ETH | 0.00284858 | ||||
Transfer | 20255194 | 138 days ago | IN | 0.0001 ETH | 0.00040462 | ||||
Transfer | 17005391 | 594 days ago | IN | 0.0001 ETH | 0.00084936 | ||||
Transfer | 16693789 | 638 days ago | IN | 1 wei | 0.00458422 | ||||
Transfer | 16108295 | 719 days ago | IN | 0.01 ETH | 0.00036285 | ||||
Transfer | 16108287 | 719 days ago | IN | 0.0001 ETH | 0.00022953 | ||||
Transfer | 13691457 | 1092 days ago | IN | 0.01 ETH | 0.00380148 | ||||
Transfer | 13449445 | 1130 days ago | IN | 0 ETH | 0.00236808 | ||||
Transfer | 13449425 | 1130 days ago | IN | 0 ETH | 0.0024424 | ||||
Transfer | 13428665 | 1133 days ago | IN | 0.001 ETH | 0.00195613 | ||||
Transfer | 13264347 | 1159 days ago | IN | 100 wei | 0.00354434 | ||||
Transfer | 13243645 | 1162 days ago | IN | 0.0001 ETH | 0.00676476 | ||||
Transfer | 13227758 | 1164 days ago | IN | 0.00125931 ETH | 0.00193565 | ||||
Transfer | 13199947 | 1169 days ago | IN | 1 wei | 0.01083326 | ||||
Transfer | 13045420 | 1193 days ago | IN | 0.0000001 ETH | 0.00404078 | ||||
Transfer | 12382710 | 1296 days ago | IN | 0.0031655 ETH | 0.003192 | ||||
Transfer | 12382710 | 1296 days ago | IN | 0.00319858 ETH | 0.00252 | ||||
Transfer | 12382710 | 1296 days ago | IN | 0 ETH | 0.00357 | ||||
Transfer | 12382710 | 1296 days ago | IN | 0 ETH | 0.00357 | ||||
Transfer | 12342922 | 1302 days ago | IN | 0.0001 ETH | 0.00722332 | ||||
Transfer | 12317612 | 1306 days ago | IN | 1 wei | 0.0038534 | ||||
Transfer | 12285770 | 1311 days ago | IN | 0.0001 ETH | 0.01425402 | ||||
Transfer | 12234841 | 1318 days ago | IN | 0.05 ETH | 0.00625409 | ||||
Transfer | 12128731 | 1335 days ago | IN | 0.001 ETH | 0.01011464 | ||||
Transfer | 12122169 | 1336 days ago | IN | 0.00001 ETH | 0.01316447 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21179471 | 9 days ago | 0.7 ETH | ||||
20255194 | 138 days ago | 0.1001 ETH | ||||
17005391 | 594 days ago | 0.0001 ETH | ||||
16693789 | 638 days ago | 0.7 ETH | ||||
13691457 | 1092 days ago | 0.01 ETH | ||||
13428665 | 1133 days ago | 0.001 ETH | ||||
13264347 | 1159 days ago | 100 wei | ||||
13243645 | 1162 days ago | 0.35480129 ETH | ||||
13227758 | 1164 days ago | 0.00125931 ETH | ||||
13199947 | 1169 days ago | 3 ETH | ||||
13045420 | 1193 days ago | 2.2000001 ETH | ||||
12342922 | 1302 days ago | 0.15649 ETH | ||||
12317612 | 1306 days ago | 0.2 ETH | ||||
12285770 | 1311 days ago | 0.2001 ETH | ||||
12234841 | 1318 days ago | 1.05 ETH | ||||
12128731 | 1335 days ago | 5.001 ETH | ||||
12122169 | 1336 days ago | 0.40001 ETH | ||||
12091509 | 1341 days ago | 0.005 ETH | ||||
12071556 | 1344 days ago | 0.0017231 ETH | ||||
12066748 | 1344 days ago | 1.501 ETH | ||||
12060343 | 1345 days ago | 0.105 ETH | ||||
12051711 | 1347 days ago | 1.70428018 ETH | ||||
12048430 | 1347 days ago | 2.9 ETH | ||||
12045452 | 1348 days ago | 0.65 ETH | ||||
12041758 | 1348 days ago | 0.901 ETH |
Loading...
Loading
Contract Name:
ReversibleICO
Compiler Version
v0.5.17+commit.d19bba13
Optimization Enabled:
Yes with 200 runs
Other Settings:
petersburg EvmVersion, Apache-2.0 license, Audited
Contract Source Code (Solidity)Audit Report
/** *Submitted for verification at Etherscan.io on 2020-06-10 */ /* * Submitted for verification at etherscan.io on 2020-06-10 * * ________ ____ _ __ __ ______________ * /_ __/ /_ ___ / __ \___ _ _____ __________(_) /_ / /__ / _/ ____/ __ \ * / / / __ \/ _ \ / /_/ / _ \ | / / _ \/ ___/ ___/ / __ \/ / _ \ / // / / / / / * / / / / / / __/ / _, _/ __/ |/ / __/ / (__ ) / /_/ / / __/ _/ // /___/ /_/ / * /_/ /_/ /_/\___/ /_/ |_|\___/|___/\___/_/ /____/_/_.___/_/\___/ /___/\____/\____/ * * * source https://github.com/lukso-network/rICO-smart-contracts * @name Reversible ICO * @author Fabian Vogelsteller <@frozeman>, Micky Socaci <[email protected]>, Marjorie Hernandez <[email protected]> * @license Apache 2.0 * * Readme more about it here https://medium.com/lukso/rico-the-reversible-ico-5392bf64318b */ pragma solidity ^0.5.0; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } interface IERC777 { function name() external view returns (string memory); function symbol() external view returns (string memory); function granularity() external view returns (uint256); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function send(address recipient, uint256 amount, bytes calldata data) external; function burn(uint256 amount, bytes calldata data) external; function isOperatorFor(address operator, address tokenHolder) external view returns (bool); function authorizeOperator(address operator) external; function revokeOperator(address operator) external; function defaultOperators() external view returns (address[] memory); function operatorSend( address sender, address recipient, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; function operatorBurn( address account, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; event Sent( address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData ); event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData); event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData); event AuthorizedOperator(address indexed operator, address indexed tokenHolder); event RevokedOperator(address indexed operator, address indexed tokenHolder); } interface IERC777Recipient { function tokensReceived( address operator, address from, address to, uint256 amount, bytes calldata userData, bytes calldata operatorData ) external; } interface IERC1820Registry { function setManager(address account, address newManager) external; function getManager(address account) external view returns (address); function setInterfaceImplementer(address account, bytes32 interfaceHash, address implementer) external; function getInterfaceImplementer(address account, bytes32 interfaceHash) external view returns (address); function interfaceHash(string calldata interfaceName) external pure returns (bytes32); function updateERC165Cache(address account, bytes4 interfaceId) external; function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool); function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool); event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer); event ManagerChanged(address indexed account, address indexed newManager); } contract ReversibleICO is IERC777Recipient { using SafeMath for uint256; IERC1820Registry private ERC1820 = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); bytes32 constant private TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); bool public initialized; bool public frozen; uint256 public frozenPeriod; uint256 public freezeStart; address public deployingAddress; address public tokenAddress; address public projectAddress; address public whitelistingAddress; address public freezerAddress; address public rescuerAddress; uint256 public initialTokenSupply; uint256 public tokenSupply; uint256 public committedETH; uint256 public pendingETH; uint256 public canceledETH; uint256 public withdrawnETH; uint256 public projectWithdrawCount; uint256 public projectWithdrawnETH; uint256 public minContribution = 0.1 ether; uint256 public maxContribution = 4000 ether; mapping(uint8 => Stage) public stages; uint8 public stageCount; mapping(address => Participant) public participants; mapping(uint256 => address) public participantsById; uint256 public participantCount; uint256 public commitPhasePrice; uint256 public commitPhaseStartBlock; uint256 public commitPhaseEndBlock; uint256 public commitPhaseBlockCount; uint256 public buyPhaseStartBlock; uint256 public buyPhaseEndBlock; uint256 public buyPhaseBlockCount; uint256 internal _projectCurrentlyReservedETH; uint256 internal _projectUnlockedETH; uint256 internal _projectLastBlock; struct Stage { uint256 tokenLimit; uint256 tokenPrice; } struct Participant { bool whitelisted; uint32 contributions; uint32 withdraws; uint256 firstContributionBlock; uint256 reservedTokens; uint256 committedETH; uint256 pendingETH; uint256 _currentReservedTokens; uint256 _unlockedTokens; uint256 _lastBlock; mapping(uint8 => ParticipantStageDetails) stages; } struct ParticipantStageDetails { uint256 pendingETH; } event PendingContributionAdded(address indexed participantAddress, uint256 indexed amount, uint32 indexed contributionId, uint8 stageId); event PendingContributionsCanceled(address indexed participantAddress, uint256 indexed amount, uint32 indexed contributionId); event WhitelistApproved(address indexed participantAddress, uint256 indexed pendingETH, uint32 indexed contributions); event WhitelistRejected(address indexed participantAddress, uint256 indexed pendingETH, uint32 indexed contributions); event ContributionsAccepted(address indexed participantAddress, uint256 indexed ethAmount, uint256 indexed tokenAmount, uint8 stageId); event ProjectWithdraw(address indexed projectAddress, uint256 indexed amount, uint32 indexed withdrawCount); event ParticipantWithdraw(address indexed participantAddress, uint256 indexed ethAmount, uint256 indexed tokenAmount, uint32 withdrawCount); event StageChanged(uint8 indexed stageId, uint256 indexed tokenLimit, uint256 indexed tokenPrice, uint256 effectiveBlockNumber); event WhitelistingAddressChanged(address indexed whitelistingAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber); event FreezerAddressChanged(address indexed freezerAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber); event SecurityFreeze(address indexed freezerAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber); event SecurityUnfreeze(address indexed freezerAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber); event SecurityDisableEscapeHatch(address indexed freezerAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber); event SecurityEscapeHatch(address indexed rescuerAddress, address indexed to, uint8 indexed stageId, uint256 effectiveBlockNumber); event TransferEvent ( uint8 indexed typeId, address indexed relatedAddress, uint256 indexed value ); enum TransferTypes { NOT_SET, WHITELIST_REJECTED, CONTRIBUTION_CANCELED, CONTRIBUTION_ACCEPTED_OVERFLOW, PARTICIPANT_WITHDRAW, PARTICIPANT_WITHDRAW_OVERFLOW, PROJECT_WITHDRAWN, FROZEN_ESCAPEHATCH_TOKEN, FROZEN_ESCAPEHATCH_ETH } constructor() public { deployingAddress = msg.sender; ERC1820.setInterfaceImplementer(address(this), TOKENS_RECIPIENT_INTERFACE_HASH, address(this)); } function init( address _tokenAddress, address _whitelistingAddress, address _freezerAddress, address _rescuerAddress, address _projectAddress, uint256 _commitPhaseStartBlock, uint256 _buyPhaseStartBlock, uint256 _buyPhaseEndBlock, uint256 _initialPrice, uint8 _stageCount, uint256 _stageTokenLimitIncrease, uint256 _stagePriceIncrease ) public onlyDeployingAddress isNotInitialized { require(_tokenAddress != address(0), "_tokenAddress cannot be 0x"); require(_whitelistingAddress != address(0), "_whitelistingAddress cannot be 0x"); require(_freezerAddress != address(0), "_freezerAddress cannot be 0x"); require(_rescuerAddress != address(0), "_rescuerAddress cannot be 0x"); require(_projectAddress != address(0), "_projectAddress cannot be 0x"); tokenAddress = _tokenAddress; whitelistingAddress = _whitelistingAddress; freezerAddress = _freezerAddress; rescuerAddress = _rescuerAddress; projectAddress = _projectAddress; commitPhaseStartBlock = _commitPhaseStartBlock; commitPhaseEndBlock = _buyPhaseStartBlock.sub(1); commitPhaseBlockCount = commitPhaseEndBlock.sub(commitPhaseStartBlock).add(1); commitPhasePrice = _initialPrice; stageCount = _stageCount; Stage storage commitPhase = stages[0]; commitPhase.tokenLimit = _stageTokenLimitIncrease; commitPhase.tokenPrice = _initialPrice; uint256 previousStageTokenLimit = _stageTokenLimitIncrease; for (uint8 i = 1; i <= _stageCount; i++) { Stage storage byStage = stages[i]; byStage.tokenLimit = previousStageTokenLimit.add(_stageTokenLimitIncrease); previousStageTokenLimit = byStage.tokenLimit; byStage.tokenPrice = _initialPrice.add(_stagePriceIncrease.mul(i)); } buyPhaseStartBlock = _buyPhaseStartBlock; buyPhaseEndBlock = _buyPhaseEndBlock; buyPhaseBlockCount = buyPhaseEndBlock.sub(buyPhaseStartBlock).add(1); initialized = true; } function() external payable isInitialized isNotFrozen { Participant storage participantStats = participants[msg.sender]; if (participantStats.whitelisted == true && participantStats.contributions > 0) { commit(); } else { require(msg.value < minContribution, 'To contribute call commit() [0x3c7a3aff] and send ETH along.'); cancelPendingContributions(msg.sender, msg.value); } } function tokensReceived( address, address _from, address, uint256 _amount, bytes calldata, bytes calldata ) external isInitialized isNotFrozen { require(msg.sender == tokenAddress, "Unknown token contract sent tokens."); if (_from == projectAddress) { tokenSupply = tokenSupply.add(_amount); initialTokenSupply = initialTokenSupply.add(_amount); } else { withdraw(_from, _amount); } } function commit() public payable isInitialized isNotFrozen isRunning { require(msg.value >= minContribution, "Value sent is less than the minimum contribution."); uint8 currentStage = getCurrentStage(); Participant storage participantStats = participants[msg.sender]; ParticipantStageDetails storage byStage = participantStats.stages[currentStage]; require(participantStats.committedETH.add(msg.value) <= maxContribution, "Value sent is larger than the maximum contribution."); if (participantStats.contributions == 0) { participantsById[participantCount] = msg.sender; participantCount++; } participantStats.contributions++; participantStats.pendingETH = participantStats.pendingETH.add(msg.value); byStage.pendingETH = byStage.pendingETH.add(msg.value); pendingETH = pendingETH.add(msg.value); emit PendingContributionAdded( msg.sender, msg.value, uint32(participantStats.contributions), currentStage ); if (participantStats.whitelisted == true) { acceptContributions(msg.sender); } } function cancel() external payable isInitialized isNotFrozen { cancelPendingContributions(msg.sender, msg.value); } function whitelist(address[] calldata _addresses, bool _approve) external onlyWhitelistingAddress isInitialized isNotFrozen isRunning { require(_addresses.length > 0, "No addresses given to whitelist."); for (uint256 i = 0; i < _addresses.length; i++) { address participantAddress = _addresses[i]; Participant storage participantStats = participants[participantAddress]; if (_approve) { if (participantStats.whitelisted == false) { participantStats.whitelisted = true; emit WhitelistApproved(participantAddress, participantStats.pendingETH, uint32(participantStats.contributions)); } acceptContributions(participantAddress); } else { participantStats.whitelisted = false; emit WhitelistRejected(participantAddress, participantStats.pendingETH, uint32(participantStats.contributions)); cancelPendingContributions(participantAddress, 0); } } } function projectTokenWithdraw(uint256 _tokenAmount) external onlyProjectAddress isInitialized { require(_tokenAmount <= tokenSupply, "Requested amount too high, not enough tokens available."); tokenSupply = tokenSupply.sub(_tokenAmount); initialTokenSupply = initialTokenSupply.sub(_tokenAmount); IERC777(tokenAddress).send(projectAddress, _tokenAmount, ""); } function projectWithdraw(uint256 _ethAmount) external onlyProjectAddress isInitialized isNotFrozen { calcProjectAllocation(); uint256 availableForWithdraw = _projectUnlockedETH.sub(projectWithdrawnETH); require(_ethAmount <= availableForWithdraw, "Requested amount too high, not enough ETH unlocked."); projectWithdrawCount++; projectWithdrawnETH = projectWithdrawnETH.add(_ethAmount); emit ProjectWithdraw( projectAddress, _ethAmount, uint32(projectWithdrawCount) ); emit TransferEvent( uint8(TransferTypes.PROJECT_WITHDRAWN), projectAddress, _ethAmount ); address(uint160(projectAddress)).transfer(_ethAmount); } function changeStage(uint8 _stageId, uint256 _tokenLimit, uint256 _tokenPrice) external onlyProjectAddress isInitialized { stages[_stageId].tokenLimit = _tokenLimit; stages[_stageId].tokenPrice = _tokenPrice; if(_stageId > stageCount) { stageCount = _stageId; } emit StageChanged(_stageId, _tokenLimit, _tokenPrice, getCurrentEffectiveBlockNumber()); } function changeWhitelistingAddress(address _newAddress) external onlyProjectAddress isInitialized { whitelistingAddress = _newAddress; emit WhitelistingAddressChanged(whitelistingAddress, getCurrentStage(), getCurrentEffectiveBlockNumber()); } function changeFreezerAddress(address _newAddress) external onlyProjectAddress isInitialized { freezerAddress = _newAddress; emit FreezerAddressChanged(freezerAddress, getCurrentStage(), getCurrentEffectiveBlockNumber()); } function freeze() external onlyFreezerAddress isNotFrozen { frozen = true; freezeStart = getCurrentEffectiveBlockNumber(); emit SecurityFreeze(freezerAddress, getCurrentStage(), freezeStart); } function unfreeze() external onlyFreezerAddress isFrozen { uint256 currentBlock = getCurrentEffectiveBlockNumber(); frozen = false; frozenPeriod = frozenPeriod.add( currentBlock.sub(freezeStart) ); emit SecurityUnfreeze(freezerAddress, getCurrentStage(), currentBlock); } function disableEscapeHatch() external onlyFreezerAddress isNotFrozen { freezerAddress = address(0); rescuerAddress = address(0); emit SecurityDisableEscapeHatch(freezerAddress, getCurrentStage(), getCurrentEffectiveBlockNumber()); } function escapeHatch(address _to) external onlyRescuerAddress isFrozen { require(getCurrentEffectiveBlockNumber() == freezeStart.add(18000), 'Let it cool.. Wait at least ~3 days (18000 blk) before moving anything.'); uint256 tokenBalance = IERC777(tokenAddress).balanceOf(address(this)); uint256 ethBalance = address(this).balance; IERC777(tokenAddress).send(_to, tokenBalance, ""); address(uint160(_to)).transfer(ethBalance); emit SecurityEscapeHatch(rescuerAddress, _to, getCurrentStage(), getCurrentEffectiveBlockNumber()); emit TransferEvent(uint8(TransferTypes.FROZEN_ESCAPEHATCH_TOKEN), _to, tokenBalance); emit TransferEvent(uint8(TransferTypes.FROZEN_ESCAPEHATCH_ETH), _to, ethBalance); } function getUnlockedProjectETH() public view returns (uint256) { uint256 newlyUnlockedEth = calcUnlockedAmount(_projectCurrentlyReservedETH, _projectLastBlock); return _projectUnlockedETH .add(newlyUnlockedEth); } function getAvailableProjectETH() public view returns (uint256) { return getUnlockedProjectETH() .sub(projectWithdrawnETH); } function getParticipantReservedTokens(address _participantAddress) public view returns (uint256) { Participant storage participantStats = participants[_participantAddress]; if(participantStats._currentReservedTokens == 0) { return 0; } return participantStats._currentReservedTokens.sub( calcUnlockedAmount(participantStats._currentReservedTokens, participantStats._lastBlock) ); } function getParticipantUnlockedTokens(address _participantAddress) public view returns (uint256) { Participant storage participantStats = participants[_participantAddress]; return participantStats._unlockedTokens.add( calcUnlockedAmount(participantStats._currentReservedTokens, participantStats._lastBlock) ); } function getAvailableTokenAtCurrentStage() public view returns (uint256) { return stages[getCurrentStage()].tokenLimit.sub( initialTokenSupply.sub(tokenSupply) ); } function getCurrentStage() public view returns (uint8) { return getStageByTokenLimit( initialTokenSupply.sub(tokenSupply) ); } function getCurrentPrice() public view returns (uint256) { return getPriceAtStage(getCurrentStage()); } function getPriceAtStage(uint8 _stageId) public view returns (uint256) { if (_stageId <= stageCount) { return stages[_stageId].tokenPrice; } return stages[stageCount].tokenPrice; } function getPriceForTokenLimit(uint256 _tokenLimit) public view returns (uint256) { return getPriceAtStage(getStageByTokenLimit(_tokenLimit)); } function getStageByTokenLimit(uint256 _tokenLimit) public view returns (uint8) { for (uint8 stageId = 0; stageId <= stageCount; stageId++) { if(_tokenLimit <= stages[stageId].tokenLimit) { return stageId; } } return stageCount; } function committableEthAtStage(uint8 _stageId, uint8 _currentStage) public view returns (uint256) { uint256 supply; if(_stageId < _currentStage) { return 0; } else if(_stageId >= stageCount) { supply = tokenSupply; } else if(_stageId == _currentStage) { supply = stages[_currentStage].tokenLimit.sub( initialTokenSupply.sub(tokenSupply) ); } else if(_stageId > _currentStage) { supply = stages[_stageId].tokenLimit.sub(stages[_stageId - 1].tokenLimit); } return getEthAmountForTokensAtStage( supply , _stageId); } function getEthAmountForTokensAtStage(uint256 _tokenAmount, uint8 _stageId) public view returns (uint256) { return _tokenAmount .mul(stages[_stageId].tokenPrice) .div(10 ** 18); } function getTokenAmountForEthAtStage(uint256 _ethAmount, uint8 _stageId) public view returns (uint256) { return _ethAmount .mul(10 ** 18) .div(stages[_stageId].tokenPrice); } function getCurrentBlockNumber() public view returns (uint256) { return uint256(block.number); } function getCurrentEffectiveBlockNumber() public view returns (uint256) { return uint256(block.number) .sub(frozenPeriod); } function calcUnlockedAmount(uint256 _amount, uint256 _lastBlock) public view returns (uint256) { uint256 currentBlock = getCurrentEffectiveBlockNumber(); if(_amount == 0) { return 0; } if (currentBlock >= buyPhaseStartBlock && currentBlock < buyPhaseEndBlock) { uint256 lastBlock = _lastBlock; if(lastBlock < buyPhaseStartBlock) { lastBlock = buyPhaseStartBlock.sub(1); } uint256 passedBlocks = currentBlock.sub(lastBlock); uint256 totalBlockCount = buyPhaseEndBlock.sub(lastBlock); return _amount.mul( passedBlocks.mul(10 ** 20) .div(totalBlockCount) ).div(10 ** 20); } else if (currentBlock >= buyPhaseEndBlock) { return _amount; } return 0; } function sanityCheckProject() internal view { require( committedETH == _projectCurrentlyReservedETH.add(_projectUnlockedETH), 'Project Sanity check failed! Reserved + Unlock must equal committedETH' ); require( address(this).balance == _projectUnlockedETH.add(_projectCurrentlyReservedETH).add(pendingETH).sub(projectWithdrawnETH), 'Project sanity check failed! balance = Unlock + Reserved - Withdrawn' ); } function sanityCheckParticipant(address _participantAddress) internal view { Participant storage participantStats = participants[_participantAddress]; require( participantStats.reservedTokens == participantStats._currentReservedTokens.add(participantStats._unlockedTokens), 'Participant Sanity check failed! Reser. + Unlock must equal totalReser' ); } function calcProjectAllocation() internal { uint256 newlyUnlockedEth = calcUnlockedAmount(_projectCurrentlyReservedETH, _projectLastBlock); _projectCurrentlyReservedETH = _projectCurrentlyReservedETH.sub(newlyUnlockedEth); _projectUnlockedETH = _projectUnlockedETH.add(newlyUnlockedEth); _projectLastBlock = getCurrentEffectiveBlockNumber(); sanityCheckProject(); } function calcParticipantAllocation(address _participantAddress) internal { Participant storage participantStats = participants[_participantAddress]; participantStats._unlockedTokens = getParticipantUnlockedTokens(_participantAddress); participantStats._currentReservedTokens = getParticipantReservedTokens(_participantAddress); participantStats._lastBlock = getCurrentEffectiveBlockNumber(); calcProjectAllocation(); } function cancelPendingContributions(address _participantAddress, uint256 _sentValue) internal isInitialized isNotFrozen { Participant storage participantStats = participants[_participantAddress]; uint256 participantPendingEth = participantStats.pendingETH; if(participantPendingEth == 0) { if(_sentValue > 0) { address(uint160(_participantAddress)).transfer(_sentValue); } return; } for (uint8 stageId = 0; stageId <= stageCount; stageId++) { participantStats.stages[stageId].pendingETH = 0; } participantStats.pendingETH = 0; canceledETH = canceledETH.add(participantPendingEth); pendingETH = pendingETH.sub(participantPendingEth); emit PendingContributionsCanceled(_participantAddress, participantPendingEth, uint32(participantStats.contributions)); emit TransferEvent( uint8(TransferTypes.CONTRIBUTION_CANCELED), _participantAddress, participantPendingEth ); address(uint160(_participantAddress)).transfer(participantPendingEth.add(_sentValue)); sanityCheckParticipant(_participantAddress); sanityCheckProject(); } function acceptContributions(address _participantAddress) internal isInitialized isNotFrozen isRunning { Participant storage participantStats = participants[_participantAddress]; if (participantStats.pendingETH == 0) { return; } uint8 currentStage = getCurrentStage(); uint256 totalRefundedETH; uint256 totalNewReservedTokens; calcParticipantAllocation(_participantAddress); if(participantStats.committedETH == 0) { participantStats.firstContributionBlock = participantStats._lastBlock; } for (uint8 stageId = 0; stageId <= stageCount; stageId++) { ParticipantStageDetails storage byStage = participantStats.stages[stageId]; if (byStage.pendingETH == 0) { continue; } if(stageId < currentStage) { participantStats.stages[currentStage].pendingETH = participantStats.stages[currentStage].pendingETH.add(byStage.pendingETH); byStage.pendingETH = 0; continue; } uint256 maxCommittableEth = committableEthAtStage(stageId, currentStage); uint256 newlyCommittableEth = byStage.pendingETH; uint256 returnEth = 0; uint256 overflowEth = 0; if (newlyCommittableEth > maxCommittableEth) { overflowEth = newlyCommittableEth.sub(maxCommittableEth); newlyCommittableEth = maxCommittableEth; if (stageId == stageCount) { returnEth = overflowEth; totalRefundedETH = totalRefundedETH.add(returnEth); } else { participantStats.stages[stageId + 1].pendingETH = participantStats.stages[stageId + 1].pendingETH.add(overflowEth); byStage.pendingETH = byStage.pendingETH.sub(overflowEth); } } uint256 newTokenAmount = getTokenAmountForEthAtStage( newlyCommittableEth, stageId ); totalNewReservedTokens = totalNewReservedTokens.add(newTokenAmount); participantStats._currentReservedTokens = participantStats._currentReservedTokens.add(newTokenAmount); participantStats.reservedTokens = participantStats.reservedTokens.add(newTokenAmount); participantStats.committedETH = participantStats.committedETH.add(newlyCommittableEth); participantStats.pendingETH = participantStats.pendingETH.sub(newlyCommittableEth).sub(returnEth); byStage.pendingETH = byStage.pendingETH.sub(newlyCommittableEth).sub(returnEth); tokenSupply = tokenSupply.sub(newTokenAmount); pendingETH = pendingETH.sub(newlyCommittableEth).sub(returnEth); committedETH = committedETH.add(newlyCommittableEth); _projectCurrentlyReservedETH = _projectCurrentlyReservedETH.add(newlyCommittableEth); emit ContributionsAccepted(_participantAddress, newlyCommittableEth, newTokenAmount, stageId); } if (totalRefundedETH > 0) { emit TransferEvent(uint8(TransferTypes.CONTRIBUTION_ACCEPTED_OVERFLOW), _participantAddress, totalRefundedETH); address(uint160(_participantAddress)).transfer(totalRefundedETH); } IERC777(tokenAddress).send(_participantAddress, totalNewReservedTokens, ""); sanityCheckParticipant(_participantAddress); sanityCheckProject(); } function withdraw(address _participantAddress, uint256 _returnedTokenAmount) internal isInitialized isNotFrozen isRunning { Participant storage participantStats = participants[_participantAddress]; calcParticipantAllocation(_participantAddress); require(_returnedTokenAmount > 0, 'You can not withdraw without sending tokens.'); require(participantStats._currentReservedTokens > 0 && participantStats.reservedTokens > 0, 'You can not withdraw, you have no locked tokens.'); uint256 returnedTokenAmount = _returnedTokenAmount; uint256 overflowingTokenAmount; uint256 returnEthAmount; if (returnedTokenAmount > participantStats._currentReservedTokens) { overflowingTokenAmount = returnedTokenAmount.sub(participantStats._currentReservedTokens); returnedTokenAmount = participantStats._currentReservedTokens; } returnEthAmount = participantStats.committedETH.mul( returnedTokenAmount.sub(1).mul(10 ** 20) .div(participantStats.reservedTokens) ).div(10 ** 20); participantStats.withdraws++; participantStats._currentReservedTokens = participantStats._currentReservedTokens.sub(returnedTokenAmount); participantStats.reservedTokens = participantStats.reservedTokens.sub(returnedTokenAmount); participantStats.committedETH = participantStats.committedETH.sub(returnEthAmount); tokenSupply = tokenSupply.add(returnedTokenAmount); withdrawnETH = withdrawnETH.add(returnEthAmount); committedETH = committedETH.sub(returnEthAmount); _projectCurrentlyReservedETH = _projectCurrentlyReservedETH.sub(returnEthAmount); if (overflowingTokenAmount > 0) { bytes memory data; emit TransferEvent(uint8(TransferTypes.PARTICIPANT_WITHDRAW_OVERFLOW), _participantAddress, overflowingTokenAmount); IERC777(tokenAddress).send(_participantAddress, overflowingTokenAmount, data); } emit ParticipantWithdraw(_participantAddress, returnEthAmount, returnedTokenAmount, uint32(participantStats.withdraws)); emit TransferEvent(uint8(TransferTypes.PARTICIPANT_WITHDRAW), _participantAddress, returnEthAmount); address(uint160(_participantAddress)).transfer(returnEthAmount); sanityCheckParticipant(_participantAddress); sanityCheckProject(); } modifier onlyProjectAddress() { require(msg.sender == projectAddress, "Only the project can call this method."); _; } modifier onlyDeployingAddress() { require(msg.sender == deployingAddress, "Only the deployer can call this method."); _; } modifier onlyWhitelistingAddress() { require(msg.sender == whitelistingAddress, "Only the whitelist controller can call this method."); _; } modifier onlyFreezerAddress() { require(msg.sender == freezerAddress, "Only the freezer address can call this method."); _; } modifier onlyRescuerAddress() { require(msg.sender == rescuerAddress, "Only the rescuer address can call this method."); _; } modifier isInitialized() { require(initialized == true, "Contract must be initialized."); _; } modifier isNotInitialized() { require(initialized == false, "Contract can not be initialized."); _; } modifier isFrozen() { require(frozen == true, "rICO has to be frozen!"); _; } modifier isNotFrozen() { require(frozen == false, "rICO is frozen!"); _; } modifier isRunning() { uint256 blockNumber = getCurrentEffectiveBlockNumber(); require(blockNumber >= commitPhaseStartBlock && blockNumber <= buyPhaseEndBlock, "Current block is outside the rICO period."); _; } }
Contract Security Audit
- Consensys Diligence - April, 2020 - Security Audit Report
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"stageId","type":"uint8"}],"name":"ContributionsAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"freezerAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"FreezerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"withdrawCount","type":"uint32"}],"name":"ParticipantWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"contributionId","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"stageId","type":"uint8"}],"name":"PendingContributionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"contributionId","type":"uint32"}],"name":"PendingContributionsCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"projectAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"withdrawCount","type":"uint32"}],"name":"ProjectWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"freezerAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"SecurityDisableEscapeHatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rescuerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"SecurityEscapeHatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"freezerAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"SecurityFreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"freezerAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"SecurityUnfreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"tokenLimit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"StageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"typeId","type":"uint8"},{"indexed":true,"internalType":"address","name":"relatedAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"pendingETH","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"contributions","type":"uint32"}],"name":"WhitelistApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"pendingETH","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"contributions","type":"uint32"}],"name":"WhitelistRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelistingAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"WhitelistingAddressChanged","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"buyPhaseBlockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyPhaseEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyPhaseStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lastBlock","type":"uint256"}],"name":"calcUnlockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"canceledETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"changeFreezerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"_stageId","type":"uint8"},{"internalType":"uint256","name":"_tokenLimit","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"changeStage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"changeWhitelistingAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"commit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"commitPhaseBlockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"commitPhaseEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"commitPhasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"commitPhaseStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"_stageId","type":"uint8"},{"internalType":"uint8","name":"_currentStage","type":"uint8"}],"name":"committableEthAtStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"committedETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deployingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableEscapeHatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"escapeHatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"freeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"freezeStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"freezerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"frozenPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvailableProjectETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvailableTokenAtCurrentStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentEffectiveBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentStage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint8","name":"_stageId","type":"uint8"}],"name":"getEthAmountForTokensAtStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_participantAddress","type":"address"}],"name":"getParticipantReservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_participantAddress","type":"address"}],"name":"getParticipantUnlockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"_stageId","type":"uint8"}],"name":"getPriceAtStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenLimit","type":"uint256"}],"name":"getPriceForTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenLimit","type":"uint256"}],"name":"getStageByTokenLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"internalType":"uint8","name":"_stageId","type":"uint8"}],"name":"getTokenAmountForEthAtStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getUnlockedProjectETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_whitelistingAddress","type":"address"},{"internalType":"address","name":"_freezerAddress","type":"address"},{"internalType":"address","name":"_rescuerAddress","type":"address"},{"internalType":"address","name":"_projectAddress","type":"address"},{"internalType":"uint256","name":"_commitPhaseStartBlock","type":"uint256"},{"internalType":"uint256","name":"_buyPhaseStartBlock","type":"uint256"},{"internalType":"uint256","name":"_buyPhaseEndBlock","type":"uint256"},{"internalType":"uint256","name":"_initialPrice","type":"uint256"},{"internalType":"uint8","name":"_stageCount","type":"uint8"},{"internalType":"uint256","name":"_stageTokenLimitIncrease","type":"uint256"},{"internalType":"uint256","name":"_stagePriceIncrease","type":"uint256"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"participantCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participants","outputs":[{"internalType":"bool","name":"whitelisted","type":"bool"},{"internalType":"uint32","name":"contributions","type":"uint32"},{"internalType":"uint32","name":"withdraws","type":"uint32"},{"internalType":"uint256","name":"firstContributionBlock","type":"uint256"},{"internalType":"uint256","name":"reservedTokens","type":"uint256"},{"internalType":"uint256","name":"committedETH","type":"uint256"},{"internalType":"uint256","name":"pendingETH","type":"uint256"},{"internalType":"uint256","name":"_currentReservedTokens","type":"uint256"},{"internalType":"uint256","name":"_unlockedTokens","type":"uint256"},{"internalType":"uint256","name":"_lastBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participantsById","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"projectAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"projectTokenWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"projectWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"projectWithdrawCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"projectWithdrawnETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rescuerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stageCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"stages","outputs":[{"internalType":"uint256","name":"tokenLimit","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unfreeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"whitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"whitelistingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawnETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b031916731820a4b7618bde71dce8cdc73aab6c95905fad2417905567016345785d8a000060115568d8d726b7177a80000060125534801561004f57600080fd5b50600380546001600160a01b0319163317905560008054604080517f455243373737546f6b656e73526563697069656e740000000000000000000000815281519081900360150181207f29965a1d00000000000000000000000000000000000000000000000000000000825230600483018190526024830191909152604482015290516001600160a01b0392909216926329965a1d9260648084019382900301818387803b15801561010057600080fd5b505af1158015610114573d6000803e3d6000fd5b5050505061400880620001286000396000f3fe6080604052600436106103ac5760003560e01c80636fd902e1116101e7578063b307404d1161010d578063ea8a1af0116100a0578063eedbe31d1161006f578063eedbe31d14610df7578063ef7953a214610e0c578063f33261ac14610e21578063ff14e8ea14610e36576103ac565b8063ea8a1af014610db0578063eb10dec714610db8578063eb13a7d214610dcd578063eb91d37e14610de2576103ac565b8063d7d4c35c116100dc578063d7d4c35c14610d5c578063dddc380614610d71578063e43fa30f14610d86578063e6b8e77a14610d9b576103ac565b8063b307404d14610ccf578063c2df08e514610ce4578063cfe5971614610d17578063d106ed7814610d47576103ac565b8063925470f911610185578063a128242011610154578063a128242014610c32578063a142d60814610c72578063aaffadf314610ca5578063ac4c9ea114610cba576103ac565b8063925470f914610bc95780639424222414610bde578063986a9eaa14610bf35780639d76ea5814610c1d576103ac565b80637824407f116101c15780637824407f14610b5d5780637a4af4ce14610b725780638aacc8f714610b9f5780638d3d657614610bb4576103ac565b80636fd902e114610aeb578063751622d314610b00578063760c234f14610b33576103ac565b80632b2e863f116102d75780635a7b28da1161026a57806362a5af3b1161023957806362a5af3b14610a555780636a28f00014610a6a5780636ceb116c14610a7f5780636ed0b9d714610ab2576103ac565b80635a7b28da146109c55780635bfe8ad8146109f85780635dabfbcf14610a0d5780636213008314610a22576103ac565b8063385b2884116102a6578063385b28841461097e5780633c7a3aff146109935780633cf96af11461099b578063526f3577146109b0576103ac565b80632b2e863f1461090c5780632c77ddfd1461093f578063362f04c01461095457806336f62d4c14610969576103ac565b806309e69ede1161034f5780631675c3371161031e5780631675c337146108725780631c369b12146108875780631e88b2aa146108b157806321dd501b146108f7576103ac565b806309e69ede146107905780630de06a041461081e5780631219270114610848578063158ef93e1461085d576103ac565b8063031adff01161038b578063031adff01461069c578063054f7d9c146106cd5780630645dc86146106f657806306cc71591461070b576103ac565b806223de29146104dd57806301b38af5146105d657806302c9b6da14610655575b600054600160a01b900460ff1615156001146103fd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff161561044e576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b336000908152601560205260409020805460ff161515600114801561047e57508054610100900463ffffffff1615155b156104905761048b610e4b565b6104da565b60115434106104d05760405162461bcd60e51b815260040180806020018281038252603c815260200180613ce1603c913960400191505060405180910390fd5b6104da333461111a565b50005b3480156104e957600080fd5b506105d4600480360360c081101561050057600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561054357600080fd5b82018360208201111561055557600080fd5b8035906020019184600183028401116401000000008311171561057757600080fd5b91939092909160208101903564010000000081111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111640100000000831117156105c957600080fd5b50909250905061134e565b005b3480156105e257600080fd5b506105d4600480360360408110156105f957600080fd5b81019060208101813564010000000081111561061457600080fd5b82018360208201111561062657600080fd5b8035906020019184602083028401116401000000008311171561064857600080fd5b9193509150351515611494565b34801561066157600080fd5b5061068a6004803603604081101561067857600080fd5b5060ff81358116916020013516611748565b60408051918252519081900360200190f35b3480156106a857600080fd5b506106b161181f565b604080516001600160a01b039092168252519081900360200190f35b3480156106d957600080fd5b506106e261182e565b604080519115158252519081900360200190f35b34801561070257600080fd5b5061068a61183e565b34801561071757600080fd5b506105d4600480360361018081101561072f57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101358216916080820135169060a08101359060c08101359060e0810135906101008101359060ff6101208201351690610140810135906101600135611844565b34801561079c57600080fd5b506107c3600480360360208110156107b357600080fd5b50356001600160a01b0316611c43565b604080519a15158b5263ffffffff998a1660208c015297909816898801526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083019190915251908190036101400190f35b34801561082a57600080fd5b506106b16004803603602081101561084157600080fd5b5035611c9c565b34801561085457600080fd5b5061068a611cb7565b34801561086957600080fd5b506106e2611d04565b34801561087e57600080fd5b5061068a611d14565b34801561089357600080fd5b5061068a600480360360208110156108aa57600080fd5b5035611d1a565b3480156108bd57600080fd5b506108de600480360360208110156108d457600080fd5b503560ff16611d35565b6040805192835260208301919091528051918290030190f35b34801561090357600080fd5b506106b1611d4e565b34801561091857600080fd5b506105d46004803603602081101561092f57600080fd5b50356001600160a01b0316611d5d565b34801561094b57600080fd5b5061068a611e64565b34801561096057600080fd5b5061068a611e6a565b34801561097557600080fd5b5061068a611e70565b34801561098a57600080fd5b5061068a611e76565b6105d4610e4b565b3480156109a757600080fd5b506106b1611e7c565b3480156109bc57600080fd5b5061068a611e8b565b3480156109d157600080fd5b5061068a600480360360408110156109e857600080fd5b508035906020013560ff16611e91565b348015610a0457600080fd5b506106b1611ed6565b348015610a1957600080fd5b5061068a611ee5565b348015610a2e57600080fd5b5061068a60048036036020811015610a4557600080fd5b50356001600160a01b0316611eeb565b348015610a6157600080fd5b506105d4611f3c565b348015610a7657600080fd5b506105d461203f565b348015610a8b57600080fd5b506105d460048036036020811015610aa257600080fd5b50356001600160a01b0316612173565b348015610abe57600080fd5b506105d460048036036060811015610ad557600080fd5b5060ff813516906020810135906040013561227a565b348015610af757600080fd5b5061068a612391565b348015610b0c57600080fd5b5061068a60048036036020811015610b2357600080fd5b50356001600160a01b0316612395565b348015610b3f57600080fd5b506105d460048036036020811015610b5657600080fd5b50356123d5565b348015610b6957600080fd5b5061068a6125ed565b348015610b7e57600080fd5b5061068a60048036036020811015610b9557600080fd5b503560ff166125f3565b348015610bab57600080fd5b5061068a61263f565b348015610bc057600080fd5b5061068a61265b565b348015610bd557600080fd5b5061068a612661565b348015610bea57600080fd5b506106b1612667565b348015610bff57600080fd5b506105d460048036036020811015610c1657600080fd5b5035612676565b348015610c2957600080fd5b506106b16127f9565b348015610c3e57600080fd5b50610c5c60048036036020811015610c5557600080fd5b5035612808565b6040805160ff9092168252519081900360200190f35b348015610c7e57600080fd5b506105d460048036036020811015610c9557600080fd5b50356001600160a01b0316612851565b348015610cb157600080fd5b5061068a612b2f565b348015610cc657600080fd5b5061068a612b35565b348015610cdb57600080fd5b5061068a612b3b565b348015610cf057600080fd5b5061068a60048036036040811015610d0757600080fd5b508035906020013560ff16612b41565b348015610d2357600080fd5b5061068a60048036036040811015610d3a57600080fd5b5080359060200135612b76565b348015610d5357600080fd5b5061068a612c50565b348015610d6857600080fd5b5061068a612c56565b348015610d7d57600080fd5b5061068a612c5c565b348015610d9257600080fd5b5061068a612c89565b348015610da757600080fd5b5061068a612ca0565b6105d4612ca6565b348015610dc457600080fd5b506105d4612d54565b348015610dd957600080fd5b5061068a612e5b565b348015610dee57600080fd5b5061068a612e61565b348015610e0357600080fd5b50610c5c612e6a565b348015610e1857600080fd5b5061068a612e8b565b348015610e2d57600080fd5b50610c5c612e91565b348015610e4257600080fd5b5061068a612e9a565b600054600160a01b900460ff161515600114610e9c576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615610eed576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000610ef7612c89565b90506019548110158015610f0d5750601d548111155b610f485760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b601154341015610f895760405162461bcd60e51b8152600401808060200182810382526031815260200180613d646031913960400191505060405180910390fd5b6000610f93612e6a565b33600090815260156020908152604080832060ff851684526008810190925290912060125460038301549394509192909190610fd5903463ffffffff612ea016565b11156110125760405162461bcd60e51b8152600401808060200182810382526033815260200180613bf16033913960400191505060405180910390fd5b8154610100900463ffffffff1661104d5760178054600090815260166020526040902080546001600160a01b03191633179055805460010190555b815463ffffffff610100808304821660010182160264ffffffff00199092169190911783556004830154611083913490612ea016565b6004830155805461109a903463ffffffff612ea016565b8155600c546110af903463ffffffff612ea016565b600c5581546040805160ff86168152905161010090920463ffffffff1691349133917fe42dc85c0ca0d425b5cabdbc8ac4757bef107c19bde01c7e3ac017ef2c71c453916020908290030190a4815460ff161515600114156111145761111433612efa565b50505050565b600054600160a01b900460ff16151560011461116b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156111bc576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6001600160a01b038216600090815260156020526040902060048101548061122357821561121c576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505015801561121a573d6000803e3d6000fd5b505b505061134a565b60005b60145460ff908116908216116112535760ff81166000908152600884016020526040812055600101611226565b5060006004830155600d5461126e908263ffffffff612ea016565b600d55600c54611284908263ffffffff6133df16565b600c55815460405161010090910463ffffffff169082906001600160a01b038716907f364ec3f465370ab2a2e3372430e62b57888138adedc4fc228074738c8074d43e90600090a460405181906001600160a01b03861690600290600080516020613f8683398151915290600090a46001600160a01b0384166108fc611310838663ffffffff612ea016565b6040518115909202916000818181858888f19350505050158015611338573d6000803e3d6000fd5b506113428461343c565b6111146134ae565b5050565b600054600160a01b900460ff16151560011461139f576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156113f0576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6004546001600160a01b031633146114395760405162461bcd60e51b8152600401808060200182810382526023815260200180613c546023913960400191505060405180910390fd5b6005546001600160a01b038881169116141561148057600a54611462908663ffffffff612ea016565b600a55600954611478908663ffffffff612ea016565b60095561148a565b61148a8786613563565b5050505050505050565b6006546001600160a01b031633146114dd5760405162461bcd60e51b8152600401808060200182810382526033815260200180613c776033913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461152e576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff161561157f576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000611589612c89565b9050601954811015801561159f5750601d548111155b6115da5760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b8261162c576040805162461bcd60e51b815260206004820181905260248201527f4e6f2061646472657373657320676976656e20746f2077686974656c6973742e604482015290519081900360640190fd5b60005b8381101561174157600085858381811061164557fe5b602090810292909201356001600160a01b03166000818152601590935260409092209192505084156116dd57805460ff166116cf578054600160ff1990911617808255600482015460405161010090920463ffffffff16916001600160a01b038516907ff0539e8d8584ef4692bf4b5a19e6e1edbe065e4d4284543dbd1c426e11627aa390600090a45b6116d882612efa565b611737565b805460ff1916808255600482015460405161010090920463ffffffff16916001600160a01b038516907f627c2a10f06fa1b31039f063bad0eb419e52ce3c6cb6fe90483f5498a81d0fae90600090a461173782600061111a565b505060010161162f565b5050505050565b6000808260ff168460ff161015611763576000915050611819565b60145460ff9081169085161061177c5750600a5461180b565b8260ff168460ff1614156117ca576117c36117a4600a546009546133df90919063ffffffff16565b60ff85166000908152601360205260409020549063ffffffff6133df16565b905061180b565b8260ff168460ff16111561180b5760ff600019850181166000908152601360205260408082205492871682529020546118089163ffffffff6133df16565b90505b6118158185612b41565b9150505b92915050565b6006546001600160a01b031681565b600054600160a81b900460ff1681565b600c5481565b6003546001600160a01b0316331461188d5760405162461bcd60e51b8152600401808060200182810382526027815260200180613e836027913960400191505060405180910390fd5b600054600160a01b900460ff16156118ec576040805162461bcd60e51b815260206004820181905260248201527f436f6e74726163742063616e206e6f7420626520696e697469616c697a65642e604482015290519081900360640190fd5b6001600160a01b038c16611947576040805162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e416464726573732063616e6e6f74206265203078000000000000604482015290519081900360640190fd5b6001600160a01b038b1661198c5760405162461bcd60e51b8152600401808060200182810382526021815260200180613f3c6021913960400191505060405180910390fd5b6001600160a01b038a166119e7576040805162461bcd60e51b815260206004820152601c60248201527f5f667265657a6572416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b6001600160a01b038916611a42576040805162461bcd60e51b815260206004820152601c60248201527f5f72657363756572416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b6001600160a01b038816611a9d576040805162461bcd60e51b815260206004820152601c60248201527f5f70726f6a656374416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b600480546001600160a01b03199081166001600160a01b038f8116919091179092556006805482168e84161790556007805482168d84161790556008805482168c841617905560058054909116918a169190911790556019879055611b038660016133df565b601a819055601954611b2e91600191611b22919063ffffffff6133df16565b9063ffffffff612ea016565b601b5560188490556014805460ff191660ff85161790556000805260136020527f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6c8281557f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6d8590558260015b8560ff168160ff1611611bfd5760ff81166000908152601360205260409020611bc9838763ffffffff612ea016565b8082559250611bf1611be48660ff851663ffffffff613a4b16565b899063ffffffff612ea016565b60019182015501611b9a565b50601c889055601d879055611c1d6001611b22898b63ffffffff6133df16565b601e5550506000805460ff60a01b1916600160a01b179055505050505050505050505050565b6015602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff87169763ffffffff6101008904811698650100000000009004169695949392918a565b6016602052600090815260409020546001600160a01b031681565b6000611cff611cd3600a546009546133df90919063ffffffff16565b60136000611cdf612e6a565b60ff1681526020810191909152604001600020549063ffffffff6133df16565b905090565b600054600160a01b900460ff1681565b60025481565b6000611d2d611d2883612808565b6125f3565b90505b919050565b6013602052600090815260409020805460019091015482565b6003546001600160a01b031681565b6005546001600160a01b03163314611da65760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114611df7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b038316179055611e1a612c89565b611e22612e6a565b60075460405160ff92909216916001600160a01b03909116907f1c223660ab8492f7576b506eab2f6c471aa9c38007d4eef27b67bae9e6598ad090600090a450565b60015481565b60175481565b60195481565b601b5481565b6005546001600160a01b031681565b601d5481565b60ff8116600090815260136020526040812060010154611ecf90611ec385670de0b6b3a764000063ffffffff613a4b16565b9063ffffffff613aa416565b9392505050565b6007546001600160a01b031681565b601c5481565b6001600160a01b03811660009081526015602052604081206005810154611f16576000915050611d30565b611ecf611f2b82600501548360070154612b76565b60058301549063ffffffff6133df16565b6007546001600160a01b03163314611f855760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615611fd6576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000805460ff60a81b1916600160a81b179055611ff1612c89565b6002819055611ffe612e6a565b60075460405160ff92909216916001600160a01b03909116907f453d43c0c8c4324f6f7fabe1590e8486971f3455abca3efdd9f7218da290504890600090a4565b6007546001600160a01b031633146120885760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615156001146120e4576040805162461bcd60e51b81526020600482015260166024820152757249434f2068617320746f2062652066726f7a656e2160501b604482015290519081900360640190fd5b60006120ee612c89565b6000805460ff60a81b191690556002549091506121259061211690839063ffffffff6133df16565b6001549063ffffffff612ea016565b60015580612131612e6a565b60075460405160ff92909216916001600160a01b03909116907fa8a93bdc6ed0ce129bba00b28a8baab2dd98dd66ce0c6a4fee7e93fc216fc9c890600090a450565b6005546001600160a01b031633146121bc5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461220d576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b038316179055612230612c89565b612238612e6a565b60065460405160ff92909216916001600160a01b03909116907f312b3da9a5eff0d2ce8eab74067fa710fe549f5aa7560fed1aaf9ba8c327447b90600090a450565b6005546001600160a01b031633146122c35760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114612314576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b60ff8084166000818152601360205260409020848155600101839055601454909116101561234c576014805460ff191660ff85161790555b80828460ff167f9b378870df69152cb0440f92c873673b2d98e3a255ac6b1cad034c5c021d737361237b612c89565b60408051918252519081900360200190a4505050565b4390565b6001600160a01b038116600090815260156020526040812060058101546007820154611ecf916123c491612b76565b60068301549063ffffffff612ea016565b6005546001600160a01b0316331461241e5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461246f576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156124c0576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6124c8613b0e565b60006124e16010546020546133df90919063ffffffff16565b9050808211156125225760405162461bcd60e51b8152600401808060200182810382526033815260200180613d956033913960400191505060405180910390fd5b600f8054600101905560105461253e908363ffffffff612ea016565b601055600f5460055460405163ffffffff9092169184916001600160a01b0316907f2401460fed42ac772a5e87dc7479e7991386130f48d5be74dbbe742b782217fd90600090a460055460405183916001600160a01b031690600690600080516020613f8683398151915290600090a46005546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156125e8573d6000803e3d6000fd5b505050565b600a5481565b60145460009060ff90811690831611612622575060ff8116600090815260136020526040902060010154611d30565b505060145460ff1660009081526013602052604090206001015490565b6000611cff60105461264f612c5c565b9063ffffffff6133df16565b60125481565b600f5481565b6008546001600160a01b031681565b6005546001600160a01b031633146126bf5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114612710576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600a548111156127515760405162461bcd60e51b8152600401808060200182810382526037815260200180613caa6037913960400191505060405180910390fd5b600a54612764908263ffffffff6133df16565b600a5560095461277a908263ffffffff6133df16565b6009556004805460055460408051634decdde360e11b81526001600160a01b0392831694810194909452602484018590526060604485015260006064850181905290519190921692639bd9bbc69260a480830193919282900301818387803b1580156127e557600080fd5b505af1158015611741573d6000803e3d6000fd5b6004546001600160a01b031681565b6000805b60145460ff908116908216116128445760ff8116600090815260136020526040902054831161283c579050611d30565b60010161280c565b505060145460ff16919050565b6008546001600160a01b0316331461289a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613dee602e913960400191505060405180910390fd5b600054600160a81b900460ff1615156001146128f6576040805162461bcd60e51b81526020600482015260166024820152757249434f2068617320746f2062652066726f7a656e2160501b604482015290519081900360640190fd5b60025461290b9061465063ffffffff612ea016565b612913612c89565b1461294f5760405162461bcd60e51b8152600401808060200182810382526047815260200180613d1d6047913960600191505060405180910390fd5b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b15801561299e57600080fd5b505afa1580156129b2573d6000803e3d6000fd5b505050506040513d60208110156129c857600080fd5b50516004805460408051634decdde360e11b81526001600160a01b0387811694820194909452602481018590526060604482015260006064820181905291519495503031949290931692639bd9bbc69260a4808301939282900301818387803b158015612a3457600080fd5b505af1158015612a48573d6000803e3d6000fd5b50506040516001600160a01b038616925083156108fc02915083906000818181858888f19350505050158015612a82573d6000803e3d6000fd5b50612a8b612e6a565b60085460ff91909116906001600160a01b0380861691167f97e1f0a494f6dcddabfe8372c43b6c3fb5a19759e98943fa5fffd36e13a7ca56612acb612c89565b60408051918252519081900360200190a460405182906001600160a01b03851690600790600080516020613f8683398151915290600090a460405181906001600160a01b03851690600890600080516020613f8683398151915290600090a4505050565b60115481565b601e5481565b601a5481565b60ff8116600090815260136020526040812060010154611ecf90670de0b6b3a764000090611ec390869063ffffffff613a4b16565b600080612b81612c89565b905083612b92576000915050611819565b601c548110158015612ba55750601d5481105b15612c3457601c548390811015612bcd57601c54612bca90600163ffffffff6133df16565b90505b6000612bdf838363ffffffff6133df16565b90506000612bf883601d546133df90919063ffffffff16565b9050612c2968056bc75e2d63100000611ec3612c1c8482878563ffffffff613a4b16565b8a9063ffffffff613a4b16565b945050505050611819565b601d548110612c465783915050611819565b5060009392505050565b600b5481565b60185481565b600080612c6d601f54602154612b76565b602054909150612c83908263ffffffff612ea016565b91505090565b6000611cff600154436133df90919063ffffffff16565b600d5481565b600054600160a01b900460ff161515600114612cf7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615612d48576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b612d52333461111a565b565b6007546001600160a01b03163314612d9d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615612dee576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b600780546001600160a01b0319908116909155600880549091169055612e12612c89565b612e1a612e6a565b60075460405160ff92909216916001600160a01b03909116907f67418f39698b6c86da32d11c63208a646f1d27fe8c0ad2236320488f7e391c8b90600090a4565b60095481565b6000611cff611d285b6000611cff612e86600a546009546133df90919063ffffffff16565b612808565b600e5481565b60145460ff1681565b60105481565b600082820183811015611ecf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600054600160a01b900460ff161515600114612f4b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615612f9c576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000612fa6612c89565b90506019548110158015612fbc5750601d548111155b612ff75760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b6001600160a01b0382166000908152601560205260409020600481015461301e575061134a565b6000613028612e6a565b905060008061303686613b63565b600384015461304a57600784015460018501555b60005b60145460ff908116908216116132e35760ff811660009081526008860160205260409020805461307d57506132db565b8460ff168260ff1610156130d057805460ff861660009081526008880160205260409020546130b19163ffffffff612ea016565b60ff8616600090815260088801602052604081209190915590556132db565b60006130dc8387611748565b825490915060008083831115613181576130fc838563ffffffff6133df16565b60145485945090915060ff8781169116141561312c57905080613125888263ffffffff612ea016565b9750613181565b60ff6001870116600090815260088b016020526040902054613154908263ffffffff612ea016565b60ff6001880116600090815260088c016020526040902055845461317e908263ffffffff6133df16565b85555b600061318d8488611e91565b905061319f888263ffffffff612ea016565b60058c01549098506131b7908263ffffffff612ea016565b60058c015560028b01546131d1908263ffffffff612ea016565b60028c015560038b01546131eb908563ffffffff612ea016565b60038c015560048b015461320b90849061264f908763ffffffff6133df16565b60048c0155855461322890849061264f908763ffffffff6133df16565b8655600a5461323d908263ffffffff6133df16565b600a55600c5461325990849061264f908763ffffffff6133df16565b600c55600b5461326f908563ffffffff612ea016565b600b55601f54613285908563ffffffff612ea016565b601f8190555080848e6001600160a01b03167fb2164840ce0fc0bd8bb63f912be03052e55ed2918270ca7f3a3d1b28b6df76118a604051808260ff1660ff16815260200191505060405180910390a45050505050505b60010161304d565b5081156133495760405182906001600160a01b03881690600390600080516020613f8683398151915290600090a46040516001600160a01b0387169083156108fc029084906000818181858888f19350505050158015613347573d6000803e3d6000fd5b505b6004805460408051634decdde360e11b81526001600160a01b038a811694820194909452602481018590526060604482015260006064820181905291519390921692639bd9bbc69260a480820193929182900301818387803b1580156133ae57600080fd5b505af11580156133c2573d6000803e3d6000fd5b505050506133cf8661343c565b6133d76134ae565b505050505050565b600082821115613436576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03811660009081526015602052604090206006810154600582015461346d9163ffffffff612ea016565b81600201541461134a5760405162461bcd60e51b8152600401808060200182810382526046815260200180613ef66046913960600191505060405180910390fd5b602054601f546134c39163ffffffff612ea016565b600b54146135025760405162461bcd60e51b8152600401808060200182810382526046815260200180613e1c6046913960600191505060405180910390fd5b61352560105461264f600c54611b22601f54602054612ea090919063ffffffff16565b303114612d525760405162461bcd60e51b8152600401808060200182810382526044815260200180613bad6044913960600191505060405180910390fd5b600054600160a01b900460ff1615156001146135b4576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615613605576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b600061360f612c89565b905060195481101580156136255750601d548111155b6136605760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b6001600160a01b038316600090815260156020526040902061368184613b63565b600083116136c05760405162461bcd60e51b815260040180806020018281038252602c815260200180613eaa602c913960400191505060405180910390fd5b600081600501541180156136d8575060008160020154115b6137135760405162461bcd60e51b8152600401808060200182810382526030815260200180613c246030913960400191505060405180910390fd5b6000839050600080836005015483111561374757600584015461373d90849063ffffffff6133df16565b9150836005015492505b61379d68056bc75e2d63100000611ec361378c8760020154611ec368056bc75e2d6310000061378060018b6133df90919063ffffffff16565b9063ffffffff613a4b16565b60038801549063ffffffff613a4b16565b845468ffffffff0000000000198116650100000000009182900463ffffffff908116600101811690920217865560058601549192506137df919085906133df16565b600585015560028401546137f9908463ffffffff6133df16565b60028501556003840154613813908263ffffffff6133df16565b6003850155600a5461382b908463ffffffff612ea016565b600a55600e54613841908263ffffffff612ea016565b600e55600b54613857908263ffffffff6133df16565b600b55601f5461386d908263ffffffff6133df16565b601f55811561397d5760405160609083906001600160a01b038a1690600590600080516020613f8683398151915290600090a460048054604051634decdde360e11b81526001600160a01b038b8116938201938452602482018790526060604483019081528551606484015285519190931693639bd9bbc6938d9389938893929160840190602085019080838360005b838110156139155781810151838201526020016138fd565b50505050905090810190601f1680156139425780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561396357600080fd5b505af1158015613977573d6000803e3d6000fd5b50505050505b83546040805163ffffffff6501000000000090930492909216825251849183916001600160a01b038b16917fd7c6db51aa831aa589cb4100184601073068b102f0a83dd5beccc7afdf7d1df5919081900360200190a460405181906001600160a01b03891690600490600080516020613f8683398151915290600090a46040516001600160a01b0388169082156108fc029083906000818181858888f19350505050158015613a30573d6000803e3d6000fd5b50613a3a8761343c565b613a426134ae565b50505050505050565b600082613a5a57506000611819565b82820282848281613a6757fe5b0414611ecf5760405162461bcd60e51b8152600401808060200182810382526021815260200180613e626021913960400191505060405180910390fd5b6000808211613afa576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481613b0557fe5b04949350505050565b6000613b1e601f54602154612b76565b601f54909150613b34908263ffffffff6133df16565b601f55602054613b4a908263ffffffff612ea016565b602055613b55612c89565b602155613b606134ae565b50565b6001600160a01b0381166000908152601560205260409020613b8482612395565b6006820155613b9282611eeb565b6005820155613b9f612c89565b600782015561134a613b0e56fe50726f6a6563742073616e69747920636865636b206661696c6564212062616c616e6365203d20556e6c6f636b202b205265736572766564202d2057697468647261776e56616c75652073656e74206973206c6172676572207468616e20746865206d6178696d756d20636f6e747269627574696f6e2e596f752063616e206e6f742077697468647261772c20796f752068617665206e6f206c6f636b656420746f6b656e732e556e6b6e6f776e20746f6b656e20636f6e74726163742073656e7420746f6b656e732e4f6e6c79207468652077686974656c69737420636f6e74726f6c6c65722063616e2063616c6c2074686973206d6574686f642e52657175657374656420616d6f756e7420746f6f20686967682c206e6f7420656e6f75676820746f6b656e7320617661696c61626c652e546f20636f6e747269627574652063616c6c20636f6d6d69742829205b307833633761336166665d20616e642073656e642045544820616c6f6e672e4c657420697420636f6f6c2e2e2057616974206174206c65617374207e3320646179732028313830303020626c6b29206265666f7265206d6f76696e6720616e797468696e672e56616c75652073656e74206973206c657373207468616e20746865206d696e696d756d20636f6e747269627574696f6e2e52657175657374656420616d6f756e7420746f6f20686967682c206e6f7420656e6f7567682045544820756e6c6f636b65642e4f6e6c79207468652070726f6a6563742063616e2063616c6c2074686973206d6574686f642e4f6e6c7920746865207265736375657220616464726573732063616e2063616c6c2074686973206d6574686f642e50726f6a6563742053616e69747920636865636b206661696c656421205265736572766564202b20556e6c6f636b206d75737420657175616c20636f6d6d6974746564455448536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c7920746865206465706c6f7965722063616e2063616c6c2074686973206d6574686f642e596f752063616e206e6f7420776974686472617720776974686f75742073656e64696e6720746f6b656e732e436f6e7472616374206d75737420626520696e697469616c697a65642e0000005061727469636970616e742053616e69747920636865636b206661696c6564212052657365722e202b20556e6c6f636b206d75737420657175616c20746f74616c52657365725f77686974656c697374696e67416464726573732063616e6e6f7420626520307843757272656e7420626c6f636b206973206f75747369646520746865207249434f20706572696f642e2938c8ea03db725889f8f57dcc5e7e6e60a26dada7197cd0c4261bcc035d6fbc4f6e6c792074686520667265657a657220616464726573732063616e2063616c6c2074686973206d6574686f642ea265627a7a72315820453ed0f045b785f726ff75ef544b1e3d0e8582f04313972828329af94cc9057864736f6c63430005110032
Deployed Bytecode
0x6080604052600436106103ac5760003560e01c80636fd902e1116101e7578063b307404d1161010d578063ea8a1af0116100a0578063eedbe31d1161006f578063eedbe31d14610df7578063ef7953a214610e0c578063f33261ac14610e21578063ff14e8ea14610e36576103ac565b8063ea8a1af014610db0578063eb10dec714610db8578063eb13a7d214610dcd578063eb91d37e14610de2576103ac565b8063d7d4c35c116100dc578063d7d4c35c14610d5c578063dddc380614610d71578063e43fa30f14610d86578063e6b8e77a14610d9b576103ac565b8063b307404d14610ccf578063c2df08e514610ce4578063cfe5971614610d17578063d106ed7814610d47576103ac565b8063925470f911610185578063a128242011610154578063a128242014610c32578063a142d60814610c72578063aaffadf314610ca5578063ac4c9ea114610cba576103ac565b8063925470f914610bc95780639424222414610bde578063986a9eaa14610bf35780639d76ea5814610c1d576103ac565b80637824407f116101c15780637824407f14610b5d5780637a4af4ce14610b725780638aacc8f714610b9f5780638d3d657614610bb4576103ac565b80636fd902e114610aeb578063751622d314610b00578063760c234f14610b33576103ac565b80632b2e863f116102d75780635a7b28da1161026a57806362a5af3b1161023957806362a5af3b14610a555780636a28f00014610a6a5780636ceb116c14610a7f5780636ed0b9d714610ab2576103ac565b80635a7b28da146109c55780635bfe8ad8146109f85780635dabfbcf14610a0d5780636213008314610a22576103ac565b8063385b2884116102a6578063385b28841461097e5780633c7a3aff146109935780633cf96af11461099b578063526f3577146109b0576103ac565b80632b2e863f1461090c5780632c77ddfd1461093f578063362f04c01461095457806336f62d4c14610969576103ac565b806309e69ede1161034f5780631675c3371161031e5780631675c337146108725780631c369b12146108875780631e88b2aa146108b157806321dd501b146108f7576103ac565b806309e69ede146107905780630de06a041461081e5780631219270114610848578063158ef93e1461085d576103ac565b8063031adff01161038b578063031adff01461069c578063054f7d9c146106cd5780630645dc86146106f657806306cc71591461070b576103ac565b806223de29146104dd57806301b38af5146105d657806302c9b6da14610655575b600054600160a01b900460ff1615156001146103fd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff161561044e576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b336000908152601560205260409020805460ff161515600114801561047e57508054610100900463ffffffff1615155b156104905761048b610e4b565b6104da565b60115434106104d05760405162461bcd60e51b815260040180806020018281038252603c815260200180613ce1603c913960400191505060405180910390fd5b6104da333461111a565b50005b3480156104e957600080fd5b506105d4600480360360c081101561050057600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561054357600080fd5b82018360208201111561055557600080fd5b8035906020019184600183028401116401000000008311171561057757600080fd5b91939092909160208101903564010000000081111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111640100000000831117156105c957600080fd5b50909250905061134e565b005b3480156105e257600080fd5b506105d4600480360360408110156105f957600080fd5b81019060208101813564010000000081111561061457600080fd5b82018360208201111561062657600080fd5b8035906020019184602083028401116401000000008311171561064857600080fd5b9193509150351515611494565b34801561066157600080fd5b5061068a6004803603604081101561067857600080fd5b5060ff81358116916020013516611748565b60408051918252519081900360200190f35b3480156106a857600080fd5b506106b161181f565b604080516001600160a01b039092168252519081900360200190f35b3480156106d957600080fd5b506106e261182e565b604080519115158252519081900360200190f35b34801561070257600080fd5b5061068a61183e565b34801561071757600080fd5b506105d4600480360361018081101561072f57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101358216916080820135169060a08101359060c08101359060e0810135906101008101359060ff6101208201351690610140810135906101600135611844565b34801561079c57600080fd5b506107c3600480360360208110156107b357600080fd5b50356001600160a01b0316611c43565b604080519a15158b5263ffffffff998a1660208c015297909816898801526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083019190915251908190036101400190f35b34801561082a57600080fd5b506106b16004803603602081101561084157600080fd5b5035611c9c565b34801561085457600080fd5b5061068a611cb7565b34801561086957600080fd5b506106e2611d04565b34801561087e57600080fd5b5061068a611d14565b34801561089357600080fd5b5061068a600480360360208110156108aa57600080fd5b5035611d1a565b3480156108bd57600080fd5b506108de600480360360208110156108d457600080fd5b503560ff16611d35565b6040805192835260208301919091528051918290030190f35b34801561090357600080fd5b506106b1611d4e565b34801561091857600080fd5b506105d46004803603602081101561092f57600080fd5b50356001600160a01b0316611d5d565b34801561094b57600080fd5b5061068a611e64565b34801561096057600080fd5b5061068a611e6a565b34801561097557600080fd5b5061068a611e70565b34801561098a57600080fd5b5061068a611e76565b6105d4610e4b565b3480156109a757600080fd5b506106b1611e7c565b3480156109bc57600080fd5b5061068a611e8b565b3480156109d157600080fd5b5061068a600480360360408110156109e857600080fd5b508035906020013560ff16611e91565b348015610a0457600080fd5b506106b1611ed6565b348015610a1957600080fd5b5061068a611ee5565b348015610a2e57600080fd5b5061068a60048036036020811015610a4557600080fd5b50356001600160a01b0316611eeb565b348015610a6157600080fd5b506105d4611f3c565b348015610a7657600080fd5b506105d461203f565b348015610a8b57600080fd5b506105d460048036036020811015610aa257600080fd5b50356001600160a01b0316612173565b348015610abe57600080fd5b506105d460048036036060811015610ad557600080fd5b5060ff813516906020810135906040013561227a565b348015610af757600080fd5b5061068a612391565b348015610b0c57600080fd5b5061068a60048036036020811015610b2357600080fd5b50356001600160a01b0316612395565b348015610b3f57600080fd5b506105d460048036036020811015610b5657600080fd5b50356123d5565b348015610b6957600080fd5b5061068a6125ed565b348015610b7e57600080fd5b5061068a60048036036020811015610b9557600080fd5b503560ff166125f3565b348015610bab57600080fd5b5061068a61263f565b348015610bc057600080fd5b5061068a61265b565b348015610bd557600080fd5b5061068a612661565b348015610bea57600080fd5b506106b1612667565b348015610bff57600080fd5b506105d460048036036020811015610c1657600080fd5b5035612676565b348015610c2957600080fd5b506106b16127f9565b348015610c3e57600080fd5b50610c5c60048036036020811015610c5557600080fd5b5035612808565b6040805160ff9092168252519081900360200190f35b348015610c7e57600080fd5b506105d460048036036020811015610c9557600080fd5b50356001600160a01b0316612851565b348015610cb157600080fd5b5061068a612b2f565b348015610cc657600080fd5b5061068a612b35565b348015610cdb57600080fd5b5061068a612b3b565b348015610cf057600080fd5b5061068a60048036036040811015610d0757600080fd5b508035906020013560ff16612b41565b348015610d2357600080fd5b5061068a60048036036040811015610d3a57600080fd5b5080359060200135612b76565b348015610d5357600080fd5b5061068a612c50565b348015610d6857600080fd5b5061068a612c56565b348015610d7d57600080fd5b5061068a612c5c565b348015610d9257600080fd5b5061068a612c89565b348015610da757600080fd5b5061068a612ca0565b6105d4612ca6565b348015610dc457600080fd5b506105d4612d54565b348015610dd957600080fd5b5061068a612e5b565b348015610dee57600080fd5b5061068a612e61565b348015610e0357600080fd5b50610c5c612e6a565b348015610e1857600080fd5b5061068a612e8b565b348015610e2d57600080fd5b50610c5c612e91565b348015610e4257600080fd5b5061068a612e9a565b600054600160a01b900460ff161515600114610e9c576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615610eed576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000610ef7612c89565b90506019548110158015610f0d5750601d548111155b610f485760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b601154341015610f895760405162461bcd60e51b8152600401808060200182810382526031815260200180613d646031913960400191505060405180910390fd5b6000610f93612e6a565b33600090815260156020908152604080832060ff851684526008810190925290912060125460038301549394509192909190610fd5903463ffffffff612ea016565b11156110125760405162461bcd60e51b8152600401808060200182810382526033815260200180613bf16033913960400191505060405180910390fd5b8154610100900463ffffffff1661104d5760178054600090815260166020526040902080546001600160a01b03191633179055805460010190555b815463ffffffff610100808304821660010182160264ffffffff00199092169190911783556004830154611083913490612ea016565b6004830155805461109a903463ffffffff612ea016565b8155600c546110af903463ffffffff612ea016565b600c5581546040805160ff86168152905161010090920463ffffffff1691349133917fe42dc85c0ca0d425b5cabdbc8ac4757bef107c19bde01c7e3ac017ef2c71c453916020908290030190a4815460ff161515600114156111145761111433612efa565b50505050565b600054600160a01b900460ff16151560011461116b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156111bc576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6001600160a01b038216600090815260156020526040902060048101548061122357821561121c576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505015801561121a573d6000803e3d6000fd5b505b505061134a565b60005b60145460ff908116908216116112535760ff81166000908152600884016020526040812055600101611226565b5060006004830155600d5461126e908263ffffffff612ea016565b600d55600c54611284908263ffffffff6133df16565b600c55815460405161010090910463ffffffff169082906001600160a01b038716907f364ec3f465370ab2a2e3372430e62b57888138adedc4fc228074738c8074d43e90600090a460405181906001600160a01b03861690600290600080516020613f8683398151915290600090a46001600160a01b0384166108fc611310838663ffffffff612ea016565b6040518115909202916000818181858888f19350505050158015611338573d6000803e3d6000fd5b506113428461343c565b6111146134ae565b5050565b600054600160a01b900460ff16151560011461139f576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156113f0576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6004546001600160a01b031633146114395760405162461bcd60e51b8152600401808060200182810382526023815260200180613c546023913960400191505060405180910390fd5b6005546001600160a01b038881169116141561148057600a54611462908663ffffffff612ea016565b600a55600954611478908663ffffffff612ea016565b60095561148a565b61148a8786613563565b5050505050505050565b6006546001600160a01b031633146114dd5760405162461bcd60e51b8152600401808060200182810382526033815260200180613c776033913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461152e576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff161561157f576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000611589612c89565b9050601954811015801561159f5750601d548111155b6115da5760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b8261162c576040805162461bcd60e51b815260206004820181905260248201527f4e6f2061646472657373657320676976656e20746f2077686974656c6973742e604482015290519081900360640190fd5b60005b8381101561174157600085858381811061164557fe5b602090810292909201356001600160a01b03166000818152601590935260409092209192505084156116dd57805460ff166116cf578054600160ff1990911617808255600482015460405161010090920463ffffffff16916001600160a01b038516907ff0539e8d8584ef4692bf4b5a19e6e1edbe065e4d4284543dbd1c426e11627aa390600090a45b6116d882612efa565b611737565b805460ff1916808255600482015460405161010090920463ffffffff16916001600160a01b038516907f627c2a10f06fa1b31039f063bad0eb419e52ce3c6cb6fe90483f5498a81d0fae90600090a461173782600061111a565b505060010161162f565b5050505050565b6000808260ff168460ff161015611763576000915050611819565b60145460ff9081169085161061177c5750600a5461180b565b8260ff168460ff1614156117ca576117c36117a4600a546009546133df90919063ffffffff16565b60ff85166000908152601360205260409020549063ffffffff6133df16565b905061180b565b8260ff168460ff16111561180b5760ff600019850181166000908152601360205260408082205492871682529020546118089163ffffffff6133df16565b90505b6118158185612b41565b9150505b92915050565b6006546001600160a01b031681565b600054600160a81b900460ff1681565b600c5481565b6003546001600160a01b0316331461188d5760405162461bcd60e51b8152600401808060200182810382526027815260200180613e836027913960400191505060405180910390fd5b600054600160a01b900460ff16156118ec576040805162461bcd60e51b815260206004820181905260248201527f436f6e74726163742063616e206e6f7420626520696e697469616c697a65642e604482015290519081900360640190fd5b6001600160a01b038c16611947576040805162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e416464726573732063616e6e6f74206265203078000000000000604482015290519081900360640190fd5b6001600160a01b038b1661198c5760405162461bcd60e51b8152600401808060200182810382526021815260200180613f3c6021913960400191505060405180910390fd5b6001600160a01b038a166119e7576040805162461bcd60e51b815260206004820152601c60248201527f5f667265657a6572416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b6001600160a01b038916611a42576040805162461bcd60e51b815260206004820152601c60248201527f5f72657363756572416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b6001600160a01b038816611a9d576040805162461bcd60e51b815260206004820152601c60248201527f5f70726f6a656374416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b600480546001600160a01b03199081166001600160a01b038f8116919091179092556006805482168e84161790556007805482168d84161790556008805482168c841617905560058054909116918a169190911790556019879055611b038660016133df565b601a819055601954611b2e91600191611b22919063ffffffff6133df16565b9063ffffffff612ea016565b601b5560188490556014805460ff191660ff85161790556000805260136020527f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6c8281557f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6d8590558260015b8560ff168160ff1611611bfd5760ff81166000908152601360205260409020611bc9838763ffffffff612ea016565b8082559250611bf1611be48660ff851663ffffffff613a4b16565b899063ffffffff612ea016565b60019182015501611b9a565b50601c889055601d879055611c1d6001611b22898b63ffffffff6133df16565b601e5550506000805460ff60a01b1916600160a01b179055505050505050505050505050565b6015602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff87169763ffffffff6101008904811698650100000000009004169695949392918a565b6016602052600090815260409020546001600160a01b031681565b6000611cff611cd3600a546009546133df90919063ffffffff16565b60136000611cdf612e6a565b60ff1681526020810191909152604001600020549063ffffffff6133df16565b905090565b600054600160a01b900460ff1681565b60025481565b6000611d2d611d2883612808565b6125f3565b90505b919050565b6013602052600090815260409020805460019091015482565b6003546001600160a01b031681565b6005546001600160a01b03163314611da65760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114611df7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b038316179055611e1a612c89565b611e22612e6a565b60075460405160ff92909216916001600160a01b03909116907f1c223660ab8492f7576b506eab2f6c471aa9c38007d4eef27b67bae9e6598ad090600090a450565b60015481565b60175481565b60195481565b601b5481565b6005546001600160a01b031681565b601d5481565b60ff8116600090815260136020526040812060010154611ecf90611ec385670de0b6b3a764000063ffffffff613a4b16565b9063ffffffff613aa416565b9392505050565b6007546001600160a01b031681565b601c5481565b6001600160a01b03811660009081526015602052604081206005810154611f16576000915050611d30565b611ecf611f2b82600501548360070154612b76565b60058301549063ffffffff6133df16565b6007546001600160a01b03163314611f855760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615611fd6576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000805460ff60a81b1916600160a81b179055611ff1612c89565b6002819055611ffe612e6a565b60075460405160ff92909216916001600160a01b03909116907f453d43c0c8c4324f6f7fabe1590e8486971f3455abca3efdd9f7218da290504890600090a4565b6007546001600160a01b031633146120885760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615156001146120e4576040805162461bcd60e51b81526020600482015260166024820152757249434f2068617320746f2062652066726f7a656e2160501b604482015290519081900360640190fd5b60006120ee612c89565b6000805460ff60a81b191690556002549091506121259061211690839063ffffffff6133df16565b6001549063ffffffff612ea016565b60015580612131612e6a565b60075460405160ff92909216916001600160a01b03909116907fa8a93bdc6ed0ce129bba00b28a8baab2dd98dd66ce0c6a4fee7e93fc216fc9c890600090a450565b6005546001600160a01b031633146121bc5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461220d576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b038316179055612230612c89565b612238612e6a565b60065460405160ff92909216916001600160a01b03909116907f312b3da9a5eff0d2ce8eab74067fa710fe549f5aa7560fed1aaf9ba8c327447b90600090a450565b6005546001600160a01b031633146122c35760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114612314576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b60ff8084166000818152601360205260409020848155600101839055601454909116101561234c576014805460ff191660ff85161790555b80828460ff167f9b378870df69152cb0440f92c873673b2d98e3a255ac6b1cad034c5c021d737361237b612c89565b60408051918252519081900360200190a4505050565b4390565b6001600160a01b038116600090815260156020526040812060058101546007820154611ecf916123c491612b76565b60068301549063ffffffff612ea016565b6005546001600160a01b0316331461241e5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461246f576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156124c0576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6124c8613b0e565b60006124e16010546020546133df90919063ffffffff16565b9050808211156125225760405162461bcd60e51b8152600401808060200182810382526033815260200180613d956033913960400191505060405180910390fd5b600f8054600101905560105461253e908363ffffffff612ea016565b601055600f5460055460405163ffffffff9092169184916001600160a01b0316907f2401460fed42ac772a5e87dc7479e7991386130f48d5be74dbbe742b782217fd90600090a460055460405183916001600160a01b031690600690600080516020613f8683398151915290600090a46005546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156125e8573d6000803e3d6000fd5b505050565b600a5481565b60145460009060ff90811690831611612622575060ff8116600090815260136020526040902060010154611d30565b505060145460ff1660009081526013602052604090206001015490565b6000611cff60105461264f612c5c565b9063ffffffff6133df16565b60125481565b600f5481565b6008546001600160a01b031681565b6005546001600160a01b031633146126bf5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114612710576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600a548111156127515760405162461bcd60e51b8152600401808060200182810382526037815260200180613caa6037913960400191505060405180910390fd5b600a54612764908263ffffffff6133df16565b600a5560095461277a908263ffffffff6133df16565b6009556004805460055460408051634decdde360e11b81526001600160a01b0392831694810194909452602484018590526060604485015260006064850181905290519190921692639bd9bbc69260a480830193919282900301818387803b1580156127e557600080fd5b505af1158015611741573d6000803e3d6000fd5b6004546001600160a01b031681565b6000805b60145460ff908116908216116128445760ff8116600090815260136020526040902054831161283c579050611d30565b60010161280c565b505060145460ff16919050565b6008546001600160a01b0316331461289a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613dee602e913960400191505060405180910390fd5b600054600160a81b900460ff1615156001146128f6576040805162461bcd60e51b81526020600482015260166024820152757249434f2068617320746f2062652066726f7a656e2160501b604482015290519081900360640190fd5b60025461290b9061465063ffffffff612ea016565b612913612c89565b1461294f5760405162461bcd60e51b8152600401808060200182810382526047815260200180613d1d6047913960600191505060405180910390fd5b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b15801561299e57600080fd5b505afa1580156129b2573d6000803e3d6000fd5b505050506040513d60208110156129c857600080fd5b50516004805460408051634decdde360e11b81526001600160a01b0387811694820194909452602481018590526060604482015260006064820181905291519495503031949290931692639bd9bbc69260a4808301939282900301818387803b158015612a3457600080fd5b505af1158015612a48573d6000803e3d6000fd5b50506040516001600160a01b038616925083156108fc02915083906000818181858888f19350505050158015612a82573d6000803e3d6000fd5b50612a8b612e6a565b60085460ff91909116906001600160a01b0380861691167f97e1f0a494f6dcddabfe8372c43b6c3fb5a19759e98943fa5fffd36e13a7ca56612acb612c89565b60408051918252519081900360200190a460405182906001600160a01b03851690600790600080516020613f8683398151915290600090a460405181906001600160a01b03851690600890600080516020613f8683398151915290600090a4505050565b60115481565b601e5481565b601a5481565b60ff8116600090815260136020526040812060010154611ecf90670de0b6b3a764000090611ec390869063ffffffff613a4b16565b600080612b81612c89565b905083612b92576000915050611819565b601c548110158015612ba55750601d5481105b15612c3457601c548390811015612bcd57601c54612bca90600163ffffffff6133df16565b90505b6000612bdf838363ffffffff6133df16565b90506000612bf883601d546133df90919063ffffffff16565b9050612c2968056bc75e2d63100000611ec3612c1c8482878563ffffffff613a4b16565b8a9063ffffffff613a4b16565b945050505050611819565b601d548110612c465783915050611819565b5060009392505050565b600b5481565b60185481565b600080612c6d601f54602154612b76565b602054909150612c83908263ffffffff612ea016565b91505090565b6000611cff600154436133df90919063ffffffff16565b600d5481565b600054600160a01b900460ff161515600114612cf7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615612d48576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b612d52333461111a565b565b6007546001600160a01b03163314612d9d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615612dee576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b600780546001600160a01b0319908116909155600880549091169055612e12612c89565b612e1a612e6a565b60075460405160ff92909216916001600160a01b03909116907f67418f39698b6c86da32d11c63208a646f1d27fe8c0ad2236320488f7e391c8b90600090a4565b60095481565b6000611cff611d285b6000611cff612e86600a546009546133df90919063ffffffff16565b612808565b600e5481565b60145460ff1681565b60105481565b600082820183811015611ecf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600054600160a01b900460ff161515600114612f4b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615612f9c576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000612fa6612c89565b90506019548110158015612fbc5750601d548111155b612ff75760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b6001600160a01b0382166000908152601560205260409020600481015461301e575061134a565b6000613028612e6a565b905060008061303686613b63565b600384015461304a57600784015460018501555b60005b60145460ff908116908216116132e35760ff811660009081526008860160205260409020805461307d57506132db565b8460ff168260ff1610156130d057805460ff861660009081526008880160205260409020546130b19163ffffffff612ea016565b60ff8616600090815260088801602052604081209190915590556132db565b60006130dc8387611748565b825490915060008083831115613181576130fc838563ffffffff6133df16565b60145485945090915060ff8781169116141561312c57905080613125888263ffffffff612ea016565b9750613181565b60ff6001870116600090815260088b016020526040902054613154908263ffffffff612ea016565b60ff6001880116600090815260088c016020526040902055845461317e908263ffffffff6133df16565b85555b600061318d8488611e91565b905061319f888263ffffffff612ea016565b60058c01549098506131b7908263ffffffff612ea016565b60058c015560028b01546131d1908263ffffffff612ea016565b60028c015560038b01546131eb908563ffffffff612ea016565b60038c015560048b015461320b90849061264f908763ffffffff6133df16565b60048c0155855461322890849061264f908763ffffffff6133df16565b8655600a5461323d908263ffffffff6133df16565b600a55600c5461325990849061264f908763ffffffff6133df16565b600c55600b5461326f908563ffffffff612ea016565b600b55601f54613285908563ffffffff612ea016565b601f8190555080848e6001600160a01b03167fb2164840ce0fc0bd8bb63f912be03052e55ed2918270ca7f3a3d1b28b6df76118a604051808260ff1660ff16815260200191505060405180910390a45050505050505b60010161304d565b5081156133495760405182906001600160a01b03881690600390600080516020613f8683398151915290600090a46040516001600160a01b0387169083156108fc029084906000818181858888f19350505050158015613347573d6000803e3d6000fd5b505b6004805460408051634decdde360e11b81526001600160a01b038a811694820194909452602481018590526060604482015260006064820181905291519390921692639bd9bbc69260a480820193929182900301818387803b1580156133ae57600080fd5b505af11580156133c2573d6000803e3d6000fd5b505050506133cf8661343c565b6133d76134ae565b505050505050565b600082821115613436576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03811660009081526015602052604090206006810154600582015461346d9163ffffffff612ea016565b81600201541461134a5760405162461bcd60e51b8152600401808060200182810382526046815260200180613ef66046913960600191505060405180910390fd5b602054601f546134c39163ffffffff612ea016565b600b54146135025760405162461bcd60e51b8152600401808060200182810382526046815260200180613e1c6046913960600191505060405180910390fd5b61352560105461264f600c54611b22601f54602054612ea090919063ffffffff16565b303114612d525760405162461bcd60e51b8152600401808060200182810382526044815260200180613bad6044913960600191505060405180910390fd5b600054600160a01b900460ff1615156001146135b4576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615613605576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b600061360f612c89565b905060195481101580156136255750601d548111155b6136605760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b6001600160a01b038316600090815260156020526040902061368184613b63565b600083116136c05760405162461bcd60e51b815260040180806020018281038252602c815260200180613eaa602c913960400191505060405180910390fd5b600081600501541180156136d8575060008160020154115b6137135760405162461bcd60e51b8152600401808060200182810382526030815260200180613c246030913960400191505060405180910390fd5b6000839050600080836005015483111561374757600584015461373d90849063ffffffff6133df16565b9150836005015492505b61379d68056bc75e2d63100000611ec361378c8760020154611ec368056bc75e2d6310000061378060018b6133df90919063ffffffff16565b9063ffffffff613a4b16565b60038801549063ffffffff613a4b16565b845468ffffffff0000000000198116650100000000009182900463ffffffff908116600101811690920217865560058601549192506137df919085906133df16565b600585015560028401546137f9908463ffffffff6133df16565b60028501556003840154613813908263ffffffff6133df16565b6003850155600a5461382b908463ffffffff612ea016565b600a55600e54613841908263ffffffff612ea016565b600e55600b54613857908263ffffffff6133df16565b600b55601f5461386d908263ffffffff6133df16565b601f55811561397d5760405160609083906001600160a01b038a1690600590600080516020613f8683398151915290600090a460048054604051634decdde360e11b81526001600160a01b038b8116938201938452602482018790526060604483019081528551606484015285519190931693639bd9bbc6938d9389938893929160840190602085019080838360005b838110156139155781810151838201526020016138fd565b50505050905090810190601f1680156139425780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561396357600080fd5b505af1158015613977573d6000803e3d6000fd5b50505050505b83546040805163ffffffff6501000000000090930492909216825251849183916001600160a01b038b16917fd7c6db51aa831aa589cb4100184601073068b102f0a83dd5beccc7afdf7d1df5919081900360200190a460405181906001600160a01b03891690600490600080516020613f8683398151915290600090a46040516001600160a01b0388169082156108fc029083906000818181858888f19350505050158015613a30573d6000803e3d6000fd5b50613a3a8761343c565b613a426134ae565b50505050505050565b600082613a5a57506000611819565b82820282848281613a6757fe5b0414611ecf5760405162461bcd60e51b8152600401808060200182810382526021815260200180613e626021913960400191505060405180910390fd5b6000808211613afa576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481613b0557fe5b04949350505050565b6000613b1e601f54602154612b76565b601f54909150613b34908263ffffffff6133df16565b601f55602054613b4a908263ffffffff612ea016565b602055613b55612c89565b602155613b606134ae565b50565b6001600160a01b0381166000908152601560205260409020613b8482612395565b6006820155613b9282611eeb565b6005820155613b9f612c89565b600782015561134a613b0e56fe50726f6a6563742073616e69747920636865636b206661696c6564212062616c616e6365203d20556e6c6f636b202b205265736572766564202d2057697468647261776e56616c75652073656e74206973206c6172676572207468616e20746865206d6178696d756d20636f6e747269627574696f6e2e596f752063616e206e6f742077697468647261772c20796f752068617665206e6f206c6f636b656420746f6b656e732e556e6b6e6f776e20746f6b656e20636f6e74726163742073656e7420746f6b656e732e4f6e6c79207468652077686974656c69737420636f6e74726f6c6c65722063616e2063616c6c2074686973206d6574686f642e52657175657374656420616d6f756e7420746f6f20686967682c206e6f7420656e6f75676820746f6b656e7320617661696c61626c652e546f20636f6e747269627574652063616c6c20636f6d6d69742829205b307833633761336166665d20616e642073656e642045544820616c6f6e672e4c657420697420636f6f6c2e2e2057616974206174206c65617374207e3320646179732028313830303020626c6b29206265666f7265206d6f76696e6720616e797468696e672e56616c75652073656e74206973206c657373207468616e20746865206d696e696d756d20636f6e747269627574696f6e2e52657175657374656420616d6f756e7420746f6f20686967682c206e6f7420656e6f7567682045544820756e6c6f636b65642e4f6e6c79207468652070726f6a6563742063616e2063616c6c2074686973206d6574686f642e4f6e6c7920746865207265736375657220616464726573732063616e2063616c6c2074686973206d6574686f642e50726f6a6563742053616e69747920636865636b206661696c656421205265736572766564202b20556e6c6f636b206d75737420657175616c20636f6d6d6974746564455448536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c7920746865206465706c6f7965722063616e2063616c6c2074686973206d6574686f642e596f752063616e206e6f7420776974686472617720776974686f75742073656e64696e6720746f6b656e732e436f6e7472616374206d75737420626520696e697469616c697a65642e0000005061727469636970616e742053616e69747920636865636b206661696c6564212052657365722e202b20556e6c6f636b206d75737420657175616c20746f74616c52657365725f77686974656c697374696e67416464726573732063616e6e6f7420626520307843757272656e7420626c6f636b206973206f75747369646520746865207249434f20706572696f642e2938c8ea03db725889f8f57dcc5e7e6e60a26dada7197cd0c4261bcc035d6fbc4f6e6c792074686520667265657a657220616464726573732063616e2063616c6c2074686973206d6574686f642ea265627a7a72315820453ed0f045b785f726ff75ef544b1e3d0e8582f04313972828329af94cc9057864736f6c63430005110032
Deployed Bytecode Sourcemap
5155:32074:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;12784:10;12732:36;12771:24;;;:12;:24;;;;;12822:28;;;;:36;;:28;:36;:74;;;;-1:-1:-1;12862:30:0;;;;;;;:34;;12822:74;12818:340;;;12913:8;:6;:8::i;:::-;12818:340;;;12986:15;;12974:9;:27;12966:100;;;;-1:-1:-1;;;12966:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13097:49;13124:10;13136:9;13097:26;:49::i;:::-;36961:1;5155:32074;13179:605;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13179:605:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;13179:605:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13179:605:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13179:605:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;13179:605:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13179:605:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13179:605:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;13179:605:0;;-1:-1:-1;13179:605:0;-1:-1:-1;13179:605:0;:::i;:::-;;15329:1192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15329:1192:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15329:1192:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15329:1192:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15329:1192:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;15329:1192:0;;-1:-1:-1;15329:1192:0;-1:-1:-1;15329:1192:0;;;;:::i;23316:736::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23316:736:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23316:736:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5746:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5746:34:0;;;:::i;:::-;;;;-1:-1:-1;;;;;5746:34:0;;;;;;;;;;;;;;5512:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5512:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;6012:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6012:25:0;;;:::i;10216:2396::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10216:2396:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;10216:2396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;6409:51::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6409:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6409:51:0;-1:-1:-1;;;;;6409:51:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6473;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6473:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6473:51:0;;:::i;22038:200::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22038:200:0;;;:::i;5474:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5474:23:0;;;:::i;5571:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5571:26:0;;;:::i;22804:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22804:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22804:158:0;;:::i;6327:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6327:37:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6327:37:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5620:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5620:31:0;;;:::i;18631:266::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18631:266:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18631:266:0;-1:-1:-1;;;;;18631:266:0;;:::i;5537:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5537:27:0;;;:::i;6537:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6537:31:0;;;:::i;6633:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6633:36:0;;;:::i;6729:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6729:36:0;;;:::i;13798:1349::-;;;:::i;5704:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5704:29:0;;;:::i;6834:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6834:31:0;;;:::i;24291:206::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24291:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24291:206:0;;;;;;;;;:::i;5793:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5793:29:0;;;:::i;6788:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6788:33:0;;;:::i;21191:461::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21191:461:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21191:461:0;-1:-1:-1;;;;;21191:461:0;;:::i;18921:257::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18921:257:0;;;:::i;19192:368::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19192:368:0;;;:::i;18335:286::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18335:286:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18335:286:0;-1:-1:-1;;;;;18335:286:0;;:::i;17886:439::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17886:439:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17886:439:0;;;;;;;;;;;;;;:::i;24511:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24511:110:0;;;:::i;21666:358::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21666:358:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21666:358:0;-1:-1:-1;;;;;21666:358:0;;:::i;17004:872::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17004:872:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17004:872:0;;:::i;5933:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5933:26:0;;;:::i;22563:225::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22563:225:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22563:225:0;;;;:::i;21025:152::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21025:152:0;;;:::i;6275:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6275:43:0;;;:::i;6129:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6129:35:0;;;:::i;5835:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5835:29:0;;;:::i;16535:455::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16535:455:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16535:455:0;;:::i;5664:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5664:27:0;;;:::i;22976:326::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22976:326:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22976:326:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;19885:843;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19885:843:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19885:843:0;-1:-1:-1;;;;;19885:843:0;;:::i;6226:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6226:42:0;;;:::i;6878:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6878:33:0;;;:::i;6682:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6682:34:0;;;:::i;24066:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24066:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24066:211:0;;;;;;;;;:::i;24797:974::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24797:974:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24797:974:0;;;;;;;:::i;5972:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5972:27:0;;;:::i;6589:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6589:31:0;;;:::i;20752:259::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20752:259:0;;;:::i;24635:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24635:148:0;;;:::i;6050:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6050:26:0;;;:::i;15161:154::-;;;:::i;19574:297::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19574:297:0;;;:::i;5887:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5887:33:0;;;:::i;22430:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22430:117:0;;;:::i;22254:162::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22254:162:0;;;:::i;6089:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6089:27:0;;;:::i;6371:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6371:23:0;;;:::i;6177:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6177:34:0;;;:::i;13798:1349::-;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;37016:19;37038:32;:30;:32::i;:::-;37016:54;;37104:21;;37089:11;:36;;:71;;;;;37144:16;;37129:11;:31;;37089:71;37081:125;;;;-1:-1:-1;;;37081:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13939:15;;13926:9;:28;;13918:90;;;;-1:-1:-1;;;13918:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14031:18;14052:17;:15;:17::i;:::-;14132:10;14080:36;14119:24;;;:12;:24;;;;;;;;14196:37;;;;;:23;;;:37;;;;;;14302:15;;14254:29;;;;14031:38;;-1:-1:-1;14119:24:0;;14196:37;;14302:15;14254:44;;14288:9;14254:44;:33;:44;:::i;:::-;:63;;14246:127;;;;-1:-1:-1;;;14246:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14400:30;;;;;;;14396:176;;14483:16;;;14466:34;;;;:16;:34;;;;;:47;;-1:-1:-1;;;;;;14466:47:0;14503:10;14466:47;;;14542:18;;14466:47;14542:18;;;14396:176;14594:32;;;;;;;;;:30;:32;;;;-1:-1:-1;;14594:32:0;;;;;;;;;14667:27;;;;:42;;14699:9;;14667:31;:42;:::i;:::-;14637:27;;;:72;14741:18;;:33;;14764:9;14741:33;:22;:33;:::i;:::-;14720:54;;14810:10;;:25;;14825:9;14810:25;:14;:25;:::i;:::-;14797:10;:38;14948:30;;14853:164;;;;;;;;;;14948:30;;;;;;;14917:9;;14892:10;;14853:164;;;;;;;;;;15044:28;;;;:36;;:28;:36;15040:100;;;15097:31;15117:10;15097:19;:31::i;:::-;37217:1;;;36961;13798:1349::o;27729:1385::-;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27919:33:0;;27880:36;27919:33;;;:12;:33;;;;;27995:27;;;;28048:26;28045:204;;28108:14;;28105:112;;28143:58;;-1:-1:-1;;;;;28143:46:0;;;:58;;;;;28190:10;;28143:58;;;;28190:10;28143:46;:58;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28143:58:0;28105:112;28231:7;;;;28045:204;28276:13;28271:132;28306:10;;;;;;28295:21;;;;28271:132;;28344:32;;;28390:1;28344:32;;;:23;;;:32;;;;;:47;28318:9;;28271:132;;;-1:-1:-1;28455:1:0;28425:27;;;:31;28493:11;;:38;;28509:21;28493:38;:15;:38;:::i;:::-;28479:11;:52;28555:10;;:37;;28570:21;28555:37;:14;:37;:::i;:::-;28542:10;:50;28700:30;;28620:112;;28700:30;;;;;;;28670:21;;-1:-1:-1;;;;;28620:112:0;;;;;28700:30;;28620:112;28748:151;;28867:21;;-1:-1:-1;;;;;28748:151:0;;;28782:35;;-1:-1:-1;;;;;;;;;;;28748:151:0;;;;-1:-1:-1;;;;;28924:46:0;;:85;28971:37;:21;28997:10;28971:37;:25;:37;:::i;:::-;28924:85;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28924:85:0;29032:43;29055:19;29032:22;:43::i;:::-;29086:20;:18;:20::i;36961:1::-;27729:1385;;:::o;13179:605::-;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;13454:12;;-1:-1:-1;;;;;13454:12:0;13440:10;:26;13432:74;;;;-1:-1:-1;;;13432:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13542:14;;-1:-1:-1;;;;;13533:23:0;;;13542:14;;13533:23;13529:248;;;13601:11;;:24;;13617:7;13601:24;:15;:24;:::i;:::-;13587:11;:38;13661:18;;:31;;13684:7;13661:31;:22;:31;:::i;:::-;13640:18;:52;13529:248;;;13741:24;13750:5;13757:7;13741:8;:24::i;:::-;13179:605;;;;;;;;:::o;15329:1192::-;36057:19;;-1:-1:-1;;;;;36057:19:0;36043:10;:33;36035:97;;;;-1:-1:-1;;;36035:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;37016:19;37038:32;:30;:32::i;:::-;37016:54;;37104:21;;37089:11;:36;;:71;;;;;37144:16;;37129:11;:31;;37089:71;37081:125;;;;-1:-1:-1;;;37081:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15522:21;15514:66;;;;;-1:-1:-1;;;15514:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15598:9;15593:921;15613:21;;;15593:921;;;15656:26;15685:10;;15696:1;15685:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15685:13:0;15715:36;15754:32;;;:12;:32;;;;;;;15685:13;;-1:-1:-1;;15803:700:0;;;;15840:28;;;;15836:277;;15924:35;;15955:4;-1:-1:-1;;15924:35:0;;;;;;;16025:27;;;;15987:106;;15924:35;16061:30;;;;;;-1:-1:-1;;;;;15987:106:0;;;;;-1:-1:-1;;15987:106:0;15836:277;16151:39;16171:18;16151:19;:39::i;:::-;15803:700;;;16233:36;;-1:-1:-1;;16233:36:0;;;;16331:27;;;;16293:106;;16233:36;16367:30;;;;;;-1:-1:-1;;;;;16293:106:0;;;;;-1:-1:-1;;16293:106:0;16438:49;16465:18;16485:1;16438:26;:49::i;:::-;-1:-1:-1;;15636:3:0;;15593:921;;;;36961:1;15329:1192;;;:::o;23316:736::-;23405:7;23425:14;23476:13;23465:24;;:8;:24;;;23462:493;;;23513:1;23506:8;;;;;23462:493;23559:10;;;;;;23547:22;;;;23544:411;;-1:-1:-1;23595:11:0;;23544:411;;;23651:13;23639:25;;:8;:25;;;23636:319;;;23690:105;23745:35;23768:11;;23745:18;;:22;;:35;;;;:::i;:::-;23690:21;;;;;;;:6;:21;;;;;:32;;:105;:36;:105;:::i;:::-;23681:114;;23636:319;;;23839:13;23828:24;;:8;:24;;;23825:130;;;23910:20;-1:-1:-1;;23917:12:0;;23910:20;;;;;;:6;:20;;;;;;:31;23878:16;;;;;;;:27;:64;;;:31;:64;:::i;:::-;23869:73;;23825:130;23974:70;24017:6;24035:8;23974:28;:70::i;:::-;23967:77;;;23316:736;;;;;:::o;5746:34::-;;;-1:-1:-1;;;;;5746:34:0;;:::o;5512:18::-;;;-1:-1:-1;;;5512:18:0;;;;;:::o;6012:25::-;;;;:::o;10216:2396::-;35895:16;;-1:-1:-1;;;;;35895:16:0;35881:10;:30;35873:82;;;;-1:-1:-1;;;35873:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36668:11;;-1:-1:-1;;;36668:11:0;;;;:20;36660:65;;;;;-1:-1:-1;;;36660:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10751:27:0;;10743:66;;;;;-1:-1:-1;;;10743:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10828:34:0;;10820:80;;;;-1:-1:-1;;;10820:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10919:29:0;;10911:70;;;;;-1:-1:-1;;;10911:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11000:29:0;;10992:70;;;;;-1:-1:-1;;;10992:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11081:29:0;;11073:70;;;;;-1:-1:-1;;;11073:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11176:12;:28;;-1:-1:-1;;;;;;11176:28:0;;;-1:-1:-1;;;;;11176:28:0;;;;;;;;;;11215:19;:42;;;;;;;;;;11268:14;:32;;;;;;;;;;11311:14;:32;;;;;;;;;;11354:14;:32;;;;;;;;;;;;;;11409:21;:46;;;11488:26;:19;-1:-1:-1;11488:23:0;:26::i;:::-;11466:19;:48;;;11573:21;;11549:53;;11600:1;;11549:46;;11466:48;11549:46;:23;:46;:::i;:::-;:50;:53;:50;:53;:::i;:::-;11525:21;:77;11613:16;:32;;;11658:10;:24;;-1:-1:-1;;11658:24:0;;;;;;;-1:-1:-1;11735:9:0;;:6;:9;;;11755:49;;;11815:22;:38;;;11755:49;-1:-1:-1;11959:386:0;11982:11;11977:16;;:1;:16;;;11959:386;;12053:9;;;12029:21;12053:9;;;:6;:9;;;;;12112:53;:23;12140:24;12112:53;:27;:53;:::i;:::-;12091:74;;;;-1:-1:-1;12288:45:0;12306:26;:19;:26;;;;:23;:26;:::i;:::-;12288:13;;:45;:17;:45;:::i;:::-;12267:18;;;;:66;11995:3;11959:386;;;-1:-1:-1;12377:18:0;:40;;;12438:16;:36;;;12516:47;12561:1;12516:40;12457:17;12398:19;12516:40;:20;:40;:::i;:47::-;12495:18;:68;-1:-1:-1;;12586:11:0;:18;;-1:-1:-1;;;;12586:18:0;-1:-1:-1;;;12586:18:0;;;-1:-1:-1;;;;;;;;;;;;10216:2396:0:o;6409:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6473:::-;;;;;;;;;;;;-1:-1:-1;;;;;6473:51:0;;:::o;22038:200::-;22102:7;22129:101;22184:35;22207:11;;22184:18;;:22;;:35;;;;:::i;:::-;22129:6;:25;22136:17;:15;:17::i;:::-;22129:25;;;;;;;;;;;;;-1:-1:-1;22129:25:0;:36;;:101;:40;:101;:::i;:::-;22122:108;;22038:200;:::o;5474:23::-;;;-1:-1:-1;;;5474:23:0;;;;;:::o;5571:26::-;;;;:::o;22804:158::-;22877:7;22904:50;22920:33;22941:11;22920:20;:33::i;:::-;22904:15;:50::i;:::-;22897:57;;22804:158;;;;:::o;6327:37::-;;;;;;;;;;;;;;;;;;;:::o;5620:31::-;;;-1:-1:-1;;;;;5620:31:0;;:::o;18631:266::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;18755:14;:28;;-1:-1:-1;;;;;;18755:28:0;-1:-1:-1;;;;;18755:28:0;;;;;18856:32;:30;:32::i;:::-;18837:17;:15;:17::i;:::-;18821:14;;18799:90;;;;;;;;-1:-1:-1;;;;;18821:14:0;;;;18799:90;;18821:14;;18799:90;18631:266;:::o;5537:27::-;;;;:::o;6537:31::-;;;;:::o;6633:36::-;;;;:::o;6729:::-;;;;:::o;5704:29::-;;;-1:-1:-1;;;;;5704:29:0;;:::o;6834:31::-;;;;:::o;24291:206::-;24461:16;;;24385:7;24461:16;;;:6;:16;;;;;:27;;;24412:77;;:34;:10;24437:8;24412:34;:24;:34;:::i;:::-;:48;:77;:48;:77;:::i;:::-;24405:84;24291:206;-1:-1:-1;;;24291:206:0:o;5793:29::-;;;-1:-1:-1;;;;;5793:29:0;;:::o;6788:33::-;;;;:::o;21191:461::-;-1:-1:-1;;;;;21338:33:0;;21279:7;21338:33;;;:12;:33;;;;;21387:39;;;;21384:84;;21455:1;21448:8;;;;;21384:84;21487:157;21545:88;21564:16;:39;;;21605:16;:27;;;21545:18;:88::i;:::-;21487:39;;;;;:157;:43;:157;:::i;18921:257::-;36229:14;;-1:-1:-1;;;;;36229:14:0;36215:10;:28;36207:87;;;;-1:-1:-1;;;36207:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;19010:6;:13;;-1:-1:-1;;;;19010:13:0;-1:-1:-1;;;19010:13:0;;;19048:32;:30;:32::i;:::-;19034:11;:46;;;19139:17;:15;:17::i;:::-;19123:14;;19108:62;;;;;;;;-1:-1:-1;;;;;19123:14:0;;;;19108:62;;19123:14;;19108:62;18921:257::o;19192:368::-;36229:14;;-1:-1:-1;;;;;36229:14:0;36215:10;:28;36207:87;;;;-1:-1:-1;;;36207:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36798:6;;-1:-1:-1;;;36798:6:0;;;;:14;;36808:4;36798:14;36790:49;;;;;-1:-1:-1;;;36790:49:0;;;;;;;;;;;;-1:-1:-1;;;36790:49:0;;;;;;;;;;;;;;;19280:20;19303:32;:30;:32::i;:::-;19357:5;19348:14;;-1:-1:-1;;;;19348:14:0;;;19436:11;;19280:55;;-1:-1:-1;19388:71:0;;19419:29;;19280:55;;19419:29;:16;:29;:::i;:::-;19388:12;;;:71;:16;:71;:::i;:::-;19373:12;:86;19539:12;19520:17;:15;:17::i;:::-;19504:14;;19487:65;;;;;;;;-1:-1:-1;;;;;19504:14:0;;;;19487:65;;19504:14;;19487:65;36850:1;19192:368::o;18335:286::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;18464:19;:33;;-1:-1:-1;;;;;;18464:33:0;-1:-1:-1;;;;;18464:33:0;;;;;18580:32;:30;:32::i;:::-;18561:17;:15;:17::i;:::-;18540:19;;18513:100;;;;;;;;-1:-1:-1;;;;;18540:19:0;;;;18513:100;;18540:19;;18513:100;18335:286;:::o;17886:439::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;18038:16;;;;;;;;:6;:16;;;;;:41;;;18090:27;;:41;;;18158:10;;;;;-1:-1:-1;18144:74:0;;;18185:10;:21;;-1:-1:-1;;18185:21:0;;;;;;;18144:74;18271:11;18258;18248:8;18235:82;;;18284:32;:30;:32::i;:::-;18235:82;;;;;;;;;;;;;;;17886:439;;;:::o;24511:110::-;24600:12;24511:110;:::o;21666:358::-;-1:-1:-1;;;;;21813:33:0;;21754:7;21813:33;;;:12;:33;;;;;21936:39;;;;21977:27;;;;21866:150;;21917:88;;:18;:88::i;:::-;21866:32;;;;;:150;:36;:150;:::i;17004:872::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;17149:23;:21;:23::i;:::-;17195:28;17226:44;17250:19;;17226;;:23;;:44;;;;:::i;:::-;17195:75;;17305:20;17291:10;:34;;17283:98;;;;-1:-1:-1;;;17283:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17404:20;:22;;;;;;17459:19;;:35;;17483:10;17459:35;:23;:35;:::i;:::-;17437:19;:57;17613:20;;17552:14;;17522:123;;;;;;;17581:10;;-1:-1:-1;;;;;17552:14:0;;17522:123;;17552:14;;17522:123;17742:14;;17661:131;;17771:10;;-1:-1:-1;;;;;17742:14:0;;17695:31;;-1:-1:-1;;;;;;;;;;;17661:131:0;;;;17831:14;;17815:53;;-1:-1:-1;;;;;17831:14:0;;;;17815:53;;;;;17857:10;;17831:14;17815:53;17831:14;17815:53;17857:10;17831:14;17815:53;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17815:53:0;36961:1;17004:872;:::o;5933:26::-;;;;:::o;22563:225::-;22661:10;;22625:7;;22661:10;;;;22649:22;;;;22645:89;;-1:-1:-1;22695:16:0;;;;;;;:6;:16;;;;;:27;;;22688:34;;22645:89;-1:-1:-1;;22758:10:0;;;;22751:18;;;;:6;:18;;;;;22758:10;22751:29;;;22563:225::o;21025:152::-;21080:7;21107:62;21149:19;;21107:23;:21;:23::i;:::-;:41;:62;:41;:62;:::i;6275:43::-;;;;:::o;6129:35::-;;;;:::o;5835:29::-;;;-1:-1:-1;;;;;5835:29:0;;:::o;16535:455::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;16684:11;;16668:12;:27;;16660:95;;;;-1:-1:-1;;;16660:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16792:11;;:29;;16808:12;16792:29;:15;:29;:::i;:::-;16778:11;:43;16853:18;;:36;;16876:12;16853:36;:22;:36;:::i;:::-;16832:18;:57;16930:12;;;16949:14;;16922:60;;;-1:-1:-1;;;16922:60:0;;-1:-1:-1;;;;;16949:14:0;;;16922:60;;;;;;;;;;;;;;;;;;16930:12;16922:60;;;;;;;;16930:12;;;;;16922:26;;:60;;;;;16930:12;;16922:60;;;;;16930:12;;16922:60;;;5:2:-1;;;;30:1;27;20:12;5:2;16922:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5664::0;;;-1:-1:-1;;;;;5664:27:0;;:::o;22976:326::-;23048:5;;23078:179;23113:10;;;;;;23102:21;;;;23078:179;;23169:15;;;;;;;:6;:15;;;;;:26;23154:41;;23151:95;;23223:7;-1:-1:-1;23216:14:0;;23151:95;23125:9;;23078:179;;;-1:-1:-1;;23284:10:0;;;;22976:326;;;:::o;19885:843::-;36391:14;;-1:-1:-1;;;;;36391:14:0;36377:10;:28;36369:87;;;;-1:-1:-1;;;36369:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36798:6;;-1:-1:-1;;;36798:6:0;;;;:14;;36808:4;36798:14;36790:49;;;;;-1:-1:-1;;;36790:49:0;;;;;;;;;;;;-1:-1:-1;;;36790:49:0;;;;;;;;;;;;;;;20031:11;;:22;;20047:5;20031:22;:15;:22;:::i;:::-;19995:32;:30;:32::i;:::-;:58;19987:142;;;;-1:-1:-1;;;19987:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20173:12;;;20165:46;;;-1:-1:-1;;;20165:46:0;;20205:4;20165:46;;;;;;;;20142:20;;-1:-1:-1;;;;;20173:12:0;;;;20165:31;;:46;;;;;;;;;;;;;;20173:12;20165:46;;;5:2:-1;;;;30:1;27;20:12;5:2;20165:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20165:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20165:46:0;20305:12;;;20297:49;;;-1:-1:-1;;;20297:49:0;;-1:-1:-1;;;;;20297:49:0;;;;;;;;;;;;;;;;;;;;;20222:18;20297:49;;;;;;;;20165:46;;-1:-1:-1;20251:4:0;20243:21;;20305:12;;;;;20297:26;;:49;;;;;20222:18;20297:49;;;;;20222:18;20305:12;20297:49;;;5:2:-1;;;;30:1;27;20:12;5:2;20297:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;20369:42:0;;-1:-1:-1;;;;;20369:30:0;;;-1:-1:-1;20369:42:0;;;;;-1:-1:-1;20400:10:0;;20369:42;;;;20400:10;20369:30;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20369:42:0;20480:17;:15;:17::i;:::-;20459:14;;20439:93;;;;;;-1:-1:-1;;;;;20439:93:0;;;;20459:14;20439:93;20499:32;:30;:32::i;:::-;20439:93;;;;;;;;;;;;;;;20550:79;;20616:12;;-1:-1:-1;;;;;20550:79:0;;;20570:38;;-1:-1:-1;;;;;;;;;;;20550:79:0;;;;20645:75;;20709:10;;-1:-1:-1;;;;;20645:75:0;;;20665:36;;-1:-1:-1;;;;;;;;;;;20645:75:0;;;;36850:1;;19885:843;:::o;6226:42::-;;;;:::o;6878:33::-;;;;:::o;6682:34::-;;;;:::o;24066:211::-;24217:16;;;24163:7;24217:16;;;:6;:16;;;;;:27;;;24190:79;;24260:8;;24190:55;;:12;;:55;:26;:55;:::i;24797:974::-;24883:7;24905:20;24928:32;:30;:32::i;:::-;24905:55;-1:-1:-1;24976:12:0;24973:52;;25012:1;25005:8;;;;;24973:52;25067:18;;25051:12;:34;;:69;;;;;25104:16;;25089:12;:31;25051:69;25047:688;;;25213:18;;25173:10;;25201:30;;25198:108;;;25264:18;;:25;;25287:1;25264:25;:22;:25;:::i;:::-;25252:37;;25198:108;25336:20;25359:27;:12;25376:9;25359:27;:16;:27;:::i;:::-;25336:50;;25417:23;25443:31;25464:9;25443:16;;:20;;:31;;;;:::i;:::-;25417:57;-1:-1:-1;25498:124:0;25613:8;25498:110;25528:65;25417:57;25498:110;25528:12;25613:8;25528:26;:16;:26;:::i;:65::-;25498:7;;:110;:11;:110;:::i;:124::-;25491:131;;;;;;;;25047:688;25676:16;;25660:12;:32;25656:79;;25716:7;25709:14;;;;;25656:79;-1:-1:-1;25762:1:0;;24797:974;-1:-1:-1;;;24797:974:0:o;5972:27::-;;;;:::o;6589:31::-;;;;:::o;20752:259::-;20806:7;20838:24;20865:67;20884:28;;20914:17;;20865:18;:67::i;:::-;20952:19;;20838:94;;-1:-1:-1;20952:51:0;;20838:94;20952:51;:33;:51;:::i;:::-;20945:58;;;20752:259;:::o;24635:148::-;24698:7;24725:49;24761:12;;24733;24725:35;;:49;;;;:::i;6050:26::-;;;;:::o;15161:154::-;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;15258:49;15285:10;15297:9;15258:26;:49::i;:::-;15161:154::o;19574:297::-;36229:14;;-1:-1:-1;;;;;36229:14:0;36215:10;:28;36207:87;;;;-1:-1:-1;;;36207:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;19675:14;:27;;-1:-1:-1;;;;;;19675:27:0;;;;;;19713:14;:27;;;;;;;19830:32;:30;:32::i;:::-;19811:17;:15;:17::i;:::-;19795:14;;19768:95;;;;;;;;-1:-1:-1;;;;;19795:14:0;;;;19768:95;;19795:14;;19768:95;19574:297::o;5887:33::-;;;;:::o;22430:117::-;22478:7;22505:34;22521:17;22254:162;22302:5;22327:81;22362:35;22385:11;;22362:18;;:22;;:35;;;;:::i;:::-;22327:20;:81::i;6089:27::-;;;;:::o;6371:23::-;;;;;;:::o;6177:34::-;;;;:::o;942:181::-;1000:7;1032:5;;;1056:6;;;;1048:46;;;;;-1:-1:-1;;;1048:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29130:3887;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;37016:19;37038:32;:30;:32::i;:::-;37016:54;;37104:21;;37089:11;:36;;:71;;;;;37144:16;;37129:11;:31;;37089:71;37081:125;;;;-1:-1:-1;;;37081:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29308:33:0;;29269:36;29308:33;;;:12;:33;;;;;29368:27;;;;29364:71;;29417:7;;;29364:71;29447:18;29468:17;:15;:17::i;:::-;29447:38;;29496:24;29531:30;29574:46;29600:19;29574:25;:46::i;:::-;29646:29;;;;29643:136;;29739:27;;;;29697:39;;;:69;29643:136;29806:13;29801:2740;29836:10;;;;;;29825:21;;;;29801:2740;;29916:32;;;29874:39;29916:32;;;:23;;;:32;;;;;29983:18;;29979:72;;30027:8;;;29979:72;30094:12;30084:22;;:7;:22;;;30081:289;;;30249:18;;30196:37;;;30249:18;30196:37;;;:23;;;:37;;;;;:48;:72;;;:52;:72;:::i;:::-;30145:37;;;;;;;:23;;;:37;;;;;:123;;;;30305:22;;30346:8;;30081:289;30402:25;30430:44;30452:7;30461:12;30430:21;:44::i;:::-;30519:18;;30402:72;;-1:-1:-1;30489:27:0;;30660:39;;;30656:660;;;30734:42;:19;30758:17;30734:42;:23;:42;:::i;:::-;30888:10;;30817:17;;-1:-1:-1;30720:56:0;;-1:-1:-1;30888:10:0;30877:21;;;30888:10;;30877:21;30873:428;;;30935:11;-1:-1:-1;30935:11:0;30988:31;:16;30935:11;30988:31;:20;:31;:::i;:::-;30969:50;;30873:428;;;31138:36;31172:1;31162:11;;31138:36;;;;;:23;;;:36;;;;;:47;:64;;31190:11;31138:64;:51;:64;:::i;:::-;31088:36;31122:1;31112:11;;31088:36;;;;;:23;;;:36;;;;;:114;31246:18;;:35;;31269:11;31246:35;:22;:35;:::i;:::-;31225:56;;30873:428;31346:22;31371:89;31417:19;31438:7;31371:27;:89::i;:::-;31346:114;-1:-1:-1;31502:42:0;:22;31346:114;31502:42;:26;:42;:::i;:::-;31617:39;;;;31477:67;;-1:-1:-1;31617:59:0;;31661:14;31617:59;:43;:59;:::i;:::-;31575:39;;;:101;31725:31;;;;:51;;31761:14;31725:51;:35;:51;:::i;:::-;31691:31;;;:85;31823:29;;;;:54;;31857:19;31823:54;:33;:54;:::i;:::-;31791:29;;;:86;31922:27;;;;:67;;31979:9;;31922:52;;31954:19;31922:52;:31;:52;:::i;:67::-;31892:27;;;:97;32027:18;;:58;;32075:9;;32027:43;;32050:19;32027:43;:22;:43;:::i;:58::-;32006:79;;32130:11;;:31;;32146:14;32130:31;:15;:31;:::i;:::-;32116:11;:45;32189:10;;:50;;32229:9;;32189:35;;32204:19;32189:35;:14;:35;:::i;:50::-;32176:10;:63;32269:12;;:37;;32286:19;32269:37;:16;:37;:::i;:::-;32254:12;:52;32352:28;;:53;;32385:19;32352:53;:32;:53;:::i;:::-;32321:28;:84;;;;32505:14;32484:19;32463;-1:-1:-1;;;;;32441:88:0;;32521:7;32441:88;;;;;;;;;;;;;;;;;;;;;;29801:2740;;;;;;;29848:9;;29801:2740;;;-1:-1:-1;32567:20:0;;32563:242;;32609:105;;32697:16;;-1:-1:-1;;;;;32609:105:0;;;32629:44;;-1:-1:-1;;;;;;;;;;;32609:105:0;;;;32729:64;;-1:-1:-1;;;;;32729:46:0;;;:64;;;;;32776:16;;32729:64;;;;32776:16;32729:46;:64;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32729:64:0;32563:242;32845:12;;;32837:75;;;-1:-1:-1;;;32837:75:0;;-1:-1:-1;;;;;32837:75:0;;;;;;;;;;;;;;;;;;;;;32845:12;32837:75;;;;;;;;32845:12;;;;;32837:26;;:75;;;;;32845:12;32837:75;;;;;;32845:12;;32837:75;;;5:2:-1;;;;30:1;27;20:12;5:2;32837:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32837:75:0;;;;32935:43;32958:19;32935:22;:43::i;:::-;32989:20;:18;:20::i;:::-;37217:1;;;;36961;29130:3887;:::o;1137:184::-;1195:7;1228:1;1223;:6;;1215:49;;;;;-1:-1:-1;;;1215:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1287:5:0;;;1137:184::o;26331:421::-;-1:-1:-1;;;;;26456:33:0;;26417:36;26456:33;;;:12;:33;;;;;26613:32;;;;26569:39;;;;:77;;;:43;:77;:::i;:::-;26534:16;:31;;;:112;26512:232;;;;-1:-1:-1;;;26512:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25795:522;25931:19;;25898:28;;:53;;;:32;:53;:::i;:::-;25882:12;;:69;25860:189;;;;-1:-1:-1;;;25860:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26119:94;26193:19;;26119:69;26177:10;;26119:53;26143:28;;26119:19;;:23;;:53;;;;:::i;:94::-;26102:4;26094:21;:119;26072:237;;;;-1:-1:-1;;;26072:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33033:2621;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;37016:19;37038:32;:30;:32::i;:::-;37016:54;;37104:21;;37089:11;:36;;:71;;;;;37144:16;;37129:11;:31;;37089:71;37081:125;;;;-1:-1:-1;;;37081:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33230:33:0;;33191:36;33230:33;;;:12;:33;;;;;33276:46;33243:19;33276:25;:46::i;:::-;33366:1;33343:20;:24;33335:81;;;;-1:-1:-1;;;33335:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33477:1;33435:16;:39;;;:43;:82;;;;;33516:1;33482:16;:31;;;:35;33435:82;33427:143;;;;-1:-1:-1;;;33427:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33583:27;33613:20;33583:50;;33644:30;33685:23;33757:16;:39;;;33735:19;:61;33731:259;;;33862:39;;;;33838:64;;:19;;:64;:23;:64;:::i;:::-;33813:89;;33939:16;:39;;;33917:61;;33731:259;34030:165;34186:8;34030:151;34078:92;34138:16;:31;;;34078:40;34109:8;34078:26;34102:1;34078:19;:23;;:26;;;;:::i;:::-;:30;:40;:30;:40;:::i;:92::-;34030:29;;;;;:151;:33;:151;:::i;:165::-;34220:28;;-1:-1:-1;;34220:28:0;;;;;;;;;;;;;;;;;;;;;:26;34301:39;;;34012:183;;-1:-1:-1;34301:64:0;;:39;34345:19;;34301:43;:64;:::i;:::-;34259:39;;;:106;34410:31;;;;:56;;34446:19;34410:56;:35;:56;:::i;:::-;34376:31;;;:90;34509:29;;;;:50;;34543:15;34509:50;:33;:50;:::i;:::-;34477:29;;;:82;34596:11;;:36;;34612:19;34596:36;:15;:36;:::i;:::-;34582:11;:50;34658:12;;:33;;34675:15;34658:33;:16;:33;:::i;:::-;34643:12;:48;34717:12;;:33;;34734:15;34717:33;:16;:33;:::i;:::-;34702:12;:48;34794:28;;:49;;34827:15;34794:49;:32;:49;:::i;:::-;34763:28;:80;34872:26;;34868:344;;34982:110;;34929:17;;35069:22;;-1:-1:-1;;;;;34982:110:0;;;35002:43;;-1:-1:-1;;;;;;;;;;;34982:110:0;;;;35131:12;;;35123:77;;-1:-1:-1;;;35123:77:0;;-1:-1:-1;;;;;35123:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35131:12;;;;;35123:26;;35150:19;;35171:22;;35195:4;;35123:77;;;;;;;;;;;;35131:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35123:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35123:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35123:77:0;;;;34868:344;;35325:26;;35239:114;;;35325:26;;;;;;;;;35239:114;;;35297:19;;35280:15;;-1:-1:-1;;;;;35239:114:0;;;;;;;;;;;;;35369:94;;35447:15;;-1:-1:-1;;;;;35369:94:0;;;35389:34;;-1:-1:-1;;;;;;;;;;;35369:94:0;;;;35486:63;;-1:-1:-1;;;;;35486:46:0;;;:63;;;;;35533:15;;35486:63;;;;35533:15;35486:46;:63;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35486:63:0;35572:43;35595:19;35572:22;:43::i;:::-;35626:20;:18;:20::i;:::-;37217:1;;;;36961;33033:2621;;:::o;1335:280::-;1393:7;1447:6;1443:47;;-1:-1:-1;1477:1:0;1470:8;;1443:47;1514:5;;;1518:1;1514;:5;:1;1538:5;;;;;:10;1530:56;;;;-1:-1:-1;;;1530:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1629:199;1687:7;1729:1;1725;:5;1717:44;;;;;-1:-1:-1;;;1717:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1772:9;1788:1;1784;:5;;;;;;;1629:199;-1:-1:-1;;;;1629:199:0:o;26766:431::-;26821:24;26848:67;26867:28;;26897:17;;26848:18;:67::i;:::-;26969:28;;26821:94;;-1:-1:-1;26969:50:0;;26821:94;26969:50;:32;:50;:::i;:::-;26938:28;:81;27052:19;;:41;;27076:16;27052:41;:23;:41;:::i;:::-;27030:19;:63;27124:32;:30;:32::i;:::-;27104:17;:52;27169:20;:18;:20::i;:::-;26766:431;:::o;27211:504::-;-1:-1:-1;;;;;27334:33:0;;27295:36;27334:33;;;:12;:33;;;;;27425:49;27347:19;27425:28;:49::i;:::-;27390:32;;;:84;27527:49;27556:19;27527:28;:49::i;:::-;27485:39;;;:91;27629:32;:30;:32::i;:::-;27599:27;;;:62;27684:23;:21;:23::i
Swarm Source
bzzr://453ed0f045b785f726ff75ef544b1e3d0e8582f04313972828329af94cc90578
Loading...
Loading
Loading...
Loading
OVERVIEW
It allows to reserve LYXe tokens and buy them over time without price risk. As tokens are gradually bought, exposure to LYXe is predictable. Sending returnable LYXe back to the rICO smart contract returns the equivalent of ETH back to the sender.The Reversible ICO is a concept by Fabian Vogelsteller, former Ethereum lead dApp developer, Author fo ERC 20 and developer of web3.js and the Mist Browser.
A full explanation can be found here: https://medium.com/lukso/rico-the-reversible-ico-5392bf64318b
Multichain Portfolio | 30 Chains
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.