ETH Price: $2,079.70 (+6.58%)
 

More Info

Private Name Tags

Multichain Info

Transaction Hash
Method
Block
From
To
Cancel230694752025-08-04 18:25:23211 days ago1754331923IN
LUKSO: Reversible ICO
0 ETH0.000015490.59306753
Cancel230671882025-08-04 10:45:35211 days ago1754304335IN
LUKSO: Reversible ICO
0 ETH0.000007630.29212952
Cancel230597402025-08-03 9:47:59212 days ago1754214479IN
LUKSO: Reversible ICO
0 ETH0.000007490.28696736
Cancel230590022025-08-03 7:19:59213 days ago1754205599IN
LUKSO: Reversible ICO
0 ETH0.000005990.22952449
Cancel230563422025-08-02 22:25:35213 days ago1754173535IN
LUKSO: Reversible ICO
0 ETH0.000009060.34718104
Cancel230337762025-07-30 18:37:35216 days ago1753900655IN
LUKSO: Reversible ICO
0 ETH0.000086253.30178616
Cancel211794712024-11-13 14:48:59475 days ago1731509339IN
LUKSO: Reversible ICO
0.7 ETH0.0028485886.23185686
Transfer202551942024-07-07 14:20:59604 days ago1720362059IN
LUKSO: Reversible ICO
0.0001 ETH0.000404623.46692403
Transfer170053912023-04-08 18:18:231060 days ago1680977903IN
LUKSO: Reversible ICO
0.0001 ETH0.0008493622.84710633
Transfer166937892023-02-23 21:32:591104 days ago1677187979IN
LUKSO: Reversible ICO
1 wei0.0045842239.27844773
Transfer161082952022-12-04 1:54:231186 days ago1670118863IN
LUKSO: Reversible ICO
0.01 ETH0.0003628511.12151032
Transfer161082872022-12-04 1:52:471186 days ago1670118767IN
LUKSO: Reversible ICO
0.0001 ETH0.0002295310.93002048
Transfer136914572021-11-26 18:49:171558 days ago1637952557IN
LUKSO: Reversible ICO
0.01 ETH0.00380148102.2563704
Transfer134494452021-10-19 17:12:191596 days ago1634663539IN
LUKSO: Reversible ICO
0 ETH0.00236808112.76585097
Transfer134494252021-10-19 17:06:381596 days ago1634663198IN
LUKSO: Reversible ICO
0 ETH0.0024424116.30519165
Transfer134286652021-10-16 11:08:061599 days ago1634382486IN
LUKSO: Reversible ICO
0.001 ETH0.0019561352.61827007
Transfer132643472021-09-20 18:50:581625 days ago1632163858IN
LUKSO: Reversible ICO
100 wei0.0035443495.33958045
Transfer132436452021-09-17 14:12:301628 days ago1631887950IN
LUKSO: Reversible ICO
0.0001 ETH0.0067647657.96167167
Transfer132277582021-09-15 2:58:251631 days ago1631674705IN
LUKSO: Reversible ICO
0.00125931 ETH0.0019356552.06738002
Transfer131999472021-09-10 19:34:391635 days ago1631302479IN
LUKSO: Reversible ICO
1 wei0.0108332692.82124246
Transfer130454202021-08-17 22:11:201659 days ago1629238280IN
LUKSO: Reversible ICO
0.0000001 ETH0.0040407834.6221272
Transfer123827102021-05-06 19:45:211762 days ago1620330321IN
LUKSO: Reversible ICO
0.0031655 ETH0.003192152
Transfer123827102021-05-06 19:45:211762 days ago1620330321IN
LUKSO: Reversible ICO
0.00319858 ETH0.00252120
Transfer123827102021-05-06 19:45:211762 days ago1620330321IN
LUKSO: Reversible ICO
0 ETH0.00357170
Transfer123827102021-05-06 19:45:211762 days ago1620330321IN
LUKSO: Reversible ICO
0 ETH0.00357170
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer211794712024-11-13 14:48:59475 days ago1731509339
LUKSO: Reversible ICO
0.7 ETH
Transfer202551942024-07-07 14:20:59604 days ago1720362059
LUKSO: Reversible ICO
0.1001 ETH
Transfer170053912023-04-08 18:18:231060 days ago1680977903
LUKSO: Reversible ICO
0.0001 ETH
Transfer166937892023-02-23 21:32:591104 days ago1677187979
LUKSO: Reversible ICO
0.7 ETH
-136914572021-11-26 18:49:171558 days ago1637952557
LUKSO: Reversible ICO
0.01 ETH
-134286652021-10-16 11:08:061599 days ago1634382486
LUKSO: Reversible ICO
0.001 ETH
-132643472021-09-20 18:50:581625 days ago1632163858
LUKSO: Reversible ICO
100 wei
-132436452021-09-17 14:12:301628 days ago1631887950
LUKSO: Reversible ICO
0.35480129 ETH
-132277582021-09-15 2:58:251631 days ago1631674705
LUKSO: Reversible ICO
0.00125931 ETH
-131999472021-09-10 19:34:391635 days ago1631302479
LUKSO: Reversible ICO
3 ETH
-130454202021-08-17 22:11:201659 days ago1629238280
LUKSO: Reversible ICO
2.2000001 ETH
-123429222021-04-30 16:32:251768 days ago1619800345
LUKSO: Reversible ICO
0.15649 ETH
-123176122021-04-26 18:32:291772 days ago1619461949
LUKSO: Reversible ICO
0.2 ETH
-122857702021-04-21 20:40:441777 days ago1619037644
LUKSO: Reversible ICO
0.2001 ETH
-122348412021-04-13 23:52:581785 days ago1618357978
LUKSO: Reversible ICO
1.05 ETH
-121287312021-03-28 16:32:081801 days ago1616949128
LUKSO: Reversible ICO
5.001 ETH
-121221692021-03-27 16:31:511802 days ago1616862711
LUKSO: Reversible ICO
0.40001 ETH
-120915092021-03-22 23:03:011807 days ago1616454181
LUKSO: Reversible ICO
0.005 ETH
-120715562021-03-19 21:16:241810 days ago1616188584
LUKSO: Reversible ICO
0.0017231 ETH
-120667482021-03-19 3:28:361811 days ago1616124516
LUKSO: Reversible ICO
1.501 ETH
-120603432021-03-18 3:59:091812 days ago1616039949
LUKSO: Reversible ICO
0.105 ETH
-120517112021-03-16 19:59:481813 days ago1615924788
LUKSO: Reversible ICO
1.70428018 ETH
-120484302021-03-16 7:54:581814 days ago1615881298
LUKSO: Reversible ICO
2.9 ETH
-120454522021-03-15 20:54:341814 days ago1615841674
LUKSO: Reversible ICO
0.65 ETH
-120417582021-03-15 7:13:561815 days ago1615792436
LUKSO: Reversible ICO
0.901 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
ReversibleICO

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, Apache-2.0 license, Audited
/**
 *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 <micky@binarzone.com>, Marjorie Hernandez <marjorie@lukso.io>
 * @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

Contract ABI

API
[{"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"}]

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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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

0xE417b912F6cB6592ec2D71dbF6F2B48191b2CdF6
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.