Contract Address Details

0x653c8F8f8627EeD1982E650deDC120cEf401b4ed

Contract Name
ILO
Creator
0x202172–8bc512 at 0xb1fdff–ce117f
Balance
0 EWT ( )
Tokens
Fetching tokens...
Transactions
504 Transactions
Transfers
86 Transfers
Gas Used
43,223,067
Last Balance Update
32215161
Contract name:
ILO




Optimization enabled
false
Compiler version
v0.8.9+commit.e5eed63a




EVM Version
default




Verified at
2022-03-11T15:18:33.258661Z

Constructor Arguments

0000000000000000000000000b2c1514e85967c65fbb6cd6c7459b512fc83bc40000000000000000000000007c6ddcc3dd33290feb0c32023fa3e3cd0bbdd36f

Arg [0] (address) : 0x0b2c1514e85967c65fbb6cd6c7459b512fc83bc4
Arg [1] (address) : 0x7c6ddcc3dd33290feb0c32023fa3e3cd0bbdd36f

              

Contract source code

// File: contracts/ILO.sol



pragma solidity 0.8.9;

interface ERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        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) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }
}

contract ILO {

    using SafeMath for uint256;
    ERC20 public token;

    uint256 public startTime;

    uint256 public weiRaised;
    uint256 public tokensSold;
    uint256 public tokensUnsold = SafeMath.mul(150000000, 10**(18)); // 150,000,000 ELIST


    uint256 public phaseOneSupply;
    uint256 public phaseTwoSupply;
    uint256 public phaseThreeSupply;

    uint256 public phaseOneTimeLock;
    uint256 public phaseTwoTimeLock;
    uint256 public phaseThreeTimeLock;
    
    uint256 public idleTime;

    uint256 public vestingPhase1;
    uint256 public vestingPhase2;
    uint256 public vestingPhase3;


    uint256 public phase1Rate = 120;
    uint256 public phase2Rate = 58;
    uint256 public phase3Rate = 31; 
    
    uint256 public purchaseCount = 0;


    struct Purchase {
            address buyer;
            uint256 weiInvested;
            uint256 tokensBuyed; 
        }

    Purchase[] public latestPurchases;
    

    struct Investors {
        address payable buyer;

        uint256 tokensAmount;

        uint256 weiAmountPhase1;
        uint256 tokensAmountPhase1;

        uint256 weiAmountPhase2;
        uint256 tokensAmountPhase2;

        uint256 weiAmountPhase3;
        uint256 tokensAmountPhase3;    }

    mapping(address => Investors) public investors;

    address payable public governance;

    event TokenPurchase(
        address indexed purchaser,
        uint256 value,
        uint256 amount
    );

    constructor(
        address payable _governance,
        ERC20 _token         
    )  {
        governance = _governance;
        token = _token;

        startTime = 1647298800; // Tue Mar 15 2022 00:00:00 GMT+0100 (hora estándar de Europa central)
        idleTime = SafeMath.add(idleTime, 1440 minutes); 

        phaseOneTimeLock = SafeMath.add(startTime, 8640 minutes); 
        phaseTwoTimeLock = SafeMath.add(phaseOneTimeLock, 10080 minutes); 
        phaseThreeTimeLock = SafeMath.add(phaseTwoTimeLock, 11520 minutes); 

        vestingPhase1 = SafeMath.add(phaseThreeTimeLock, 86400 minutes); 
        vestingPhase2 = SafeMath.add(phaseThreeTimeLock, 43200 minutes); 
        vestingPhase3 = SafeMath.add(phaseThreeTimeLock, 20160 minutes); 

        phaseOneSupply = SafeMath.mul(40000000, 10**(18));   // 40,000,000 ELIST
        phaseTwoSupply = SafeMath.mul(50000000, 10**(18));   // 50,000,000 ELIST
        phaseThreeSupply = SafeMath.mul(60000000, 10**(18)); // 60,000,000 ELIST
    }

    receive() external payable {
        buyTokens();
    }

    function _getTokensBasedOnPhase(uint256 _weiAmount) internal returns (uint256 _tokens) {
        
        uint256 _now = block.timestamp;
        uint256 _tokensAmount = 0;

        _tokens = SafeMath.add(_tokensAmount, _weiAmount.mul(getCurrentRate()));

        if (_now <= (phaseOneTimeLock - (idleTime))) {
            if ((phaseOneSupply - _tokens) >= 0) {
                require(
                    (phaseOneSupply - _tokens) >= 0,
                    "Phase One Supply Ended !"
                );
                phaseOneSupply = phaseOneSupply.sub(_tokens);
            } else {
                _tokens = 0;
            }
        } else if (
            _now > (phaseOneTimeLock - (idleTime)) && _now < phaseOneTimeLock
        ) {
            _tokens = 0;
            require(0 != 0, "IDLE TIME 1 !");
            phaseTwoSupply = phaseTwoSupply.sub(_tokens);
        } else if (
            _now > phaseOneTimeLock && _now < (phaseTwoTimeLock - (idleTime))
        ) {
            if ((phaseTwoSupply - _tokens) >= 0) {
                require(
                    (phaseTwoSupply - _tokens) >= 0,
                    "Phase Two Supply Ended !"
                );
                phaseTwoSupply = phaseTwoSupply.sub(_tokens);
            } else {
                _tokens = 0;
            }
        } else if (
            _now > (phaseTwoTimeLock - (idleTime)) && _now < phaseTwoTimeLock
        ) {
            _tokens = 0;
            require(0 != 0, "IDLE TIME 2 !");
            phaseTwoSupply = phaseTwoSupply - _tokens;
        } else if (_now > phaseTwoTimeLock && _now < (phaseThreeTimeLock)) {
            if (phaseThreeSupply - _tokens >= 0) {
                require(
                    (phaseThreeSupply - _tokens) >= 0,
                    "Phase Three Supply Ended !"
                );
                phaseThreeSupply = phaseThreeSupply.sub(_tokens);
            } else {
                _tokens = 0;
            }
        }
        return _tokens;
    }

    function buyTokens() public payable {

        uint256 weiAmount = msg.value;

        require(
            weiAmount >= 0.0000000000001 ether,
            "investment should be more than 0.0000000000001 EWT"
        );
        require(block.timestamp <= phaseThreeTimeLock, "ELIST ILO is Closed !");
        require(block.timestamp >= startTime, "ELIST ILO is not open yet!");
        Investors storage investor = investors[msg.sender];

        uint256 tokens = 0;

        tokens = _getTokensBasedOnPhase(weiAmount);
        require(tokens > 0, "NOT POSSIBLE TO PURCHASE ELIST");
        weiRaised = weiRaised.add(weiAmount);

        investor.buyer = payable(msg.sender);

        latestPurchases.push(
            Purchase(msg.sender, weiAmount, tokens)
        );
        purchaseCount = purchaseCount + 1;
         

        if(block.timestamp < (phaseOneTimeLock-idleTime)){
        investor.weiAmountPhase1 = investor.weiAmountPhase1 + weiAmount;
        investor.tokensAmountPhase1 = investor.tokensAmountPhase1 + tokens;

        }else if( block.timestamp > phaseOneTimeLock && block.timestamp < (phaseTwoTimeLock-idleTime)){
        investor.weiAmountPhase2 = investor.weiAmountPhase2 + weiAmount;
        investor.tokensAmountPhase2 = investor.tokensAmountPhase2 + tokens;

        }else if(block.timestamp > phaseTwoTimeLock && block.timestamp < phaseThreeTimeLock){
        investor.weiAmountPhase3 = investor.weiAmountPhase3 + weiAmount;
        investor.tokensAmountPhase3 = investor.tokensAmountPhase3 + tokens;
        }

        investor.tokensAmount = investor.tokensAmount + tokens;


        tokensSold = tokensSold.add(tokens);
        tokensUnsold = tokensUnsold.sub(tokens);

        
        governance.transfer(weiAmount);

        emit TokenPurchase(msg.sender, weiAmount, tokens);
    }

    function withdrawTokens() public returns (bool success) {

        Investors storage investor = investors[msg.sender];
        address buyer = investor.buyer;

        require(msg.sender == buyer, "Not valid investor to withdraw !");
        require(block.timestamp >= vestingPhase3,"ELIST still locked");


        if(investor.tokensAmountPhase3 > 0 && block.timestamp >= vestingPhase3){

            require(block.timestamp >= vestingPhase3, "Still in Vesting PH3");
            require(token.transfer(buyer, investor.tokensAmountPhase3), "Can NOT transfer ELIST from Phase 3");
            investor.tokensAmount = SafeMath.sub(investor.tokensAmount, investor.tokensAmountPhase3);
            investor.tokensAmountPhase3 = 0;
                
        }
        
        if(investor.tokensAmountPhase2 > 0 && block.timestamp >= vestingPhase2){
            require(block.timestamp >= vestingPhase2, "Still in Vesting PH2");
            require(token.transfer(buyer, investor.tokensAmountPhase2), "Can NOT transfer ELIST from Phase 2");
            investor.tokensAmount = SafeMath.sub(investor.tokensAmount, investor.tokensAmountPhase2);
            investor.tokensAmountPhase2 = 0;

        }

        if(investor.tokensAmountPhase1 > 0 && block.timestamp >= vestingPhase1){
        require(block.timestamp >= vestingPhase1, "Still in Vesting PH1");
        
                require(token.transfer(buyer, investor.tokensAmountPhase1), "Can NOT transfer ELIST from Phase 1");
                
        
            investor.tokensAmount = SafeMath.sub(investor.tokensAmount, investor.tokensAmountPhase1);
            investor.tokensAmountPhase1 = 0;

        }

        return true;
    }

    function getTokenCount() public view returns (uint256) {
        Investors storage investor = investors[msg.sender];
    
        uint256 _totalTokens = investor.tokensAmountPhase1 + investor.tokensAmountPhase2 + investor.tokensAmountPhase3;

        return _totalTokens;
    }

    function withdrawUnsoldTokens() public returns (bool success) {
        
        require(msg.sender == governance, "!governance");
        require(block.timestamp > phaseThreeTimeLock, "ELIST ILO is not finished");

        require(token.transfer(governance, tokensUnsold), "Transfer not successful");

        return true;
    }

    function setGovernance(address payable _governance) public returns (bool success) {
        
        require(msg.sender == governance, "!governance");
        governance = _governance;

        return true;
    }

    function withdrawEthers(uint256 _weiAmount) public returns (bool success) {
        
        require(msg.sender == governance, "!governance");
        governance.transfer(_weiAmount);

        return true;
    }

    function getCurrentRate() public view returns (uint256) {

        if(block.timestamp < phaseOneTimeLock){
            return phase1Rate;
        }else if(block.timestamp < phaseTwoTimeLock && block.timestamp >= phaseOneTimeLock){
            return phase2Rate;
        }else if(block.timestamp < phaseThreeTimeLock || block.timestamp > phaseThreeTimeLock){
            return phase3Rate;
        }
        
        return 0;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_governance","internalType":"address payable"},{"type":"address","name":"_token","internalType":"contract ERC20"}]},{"type":"event","name":"TokenPurchase","inputs":[{"type":"address","name":"purchaser","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"payable","outputs":[],"name":"buyTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCurrentRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTokenCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"idleTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"buyer","internalType":"address payable"},{"type":"uint256","name":"tokensAmount","internalType":"uint256"},{"type":"uint256","name":"weiAmountPhase1","internalType":"uint256"},{"type":"uint256","name":"tokensAmountPhase1","internalType":"uint256"},{"type":"uint256","name":"weiAmountPhase2","internalType":"uint256"},{"type":"uint256","name":"tokensAmountPhase2","internalType":"uint256"},{"type":"uint256","name":"weiAmountPhase3","internalType":"uint256"},{"type":"uint256","name":"tokensAmountPhase3","internalType":"uint256"}],"name":"investors","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"buyer","internalType":"address"},{"type":"uint256","name":"weiInvested","internalType":"uint256"},{"type":"uint256","name":"tokensBuyed","internalType":"uint256"}],"name":"latestPurchases","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phase1Rate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phase2Rate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phase3Rate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseOneSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseOneTimeLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseThreeSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseThreeTimeLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseTwoSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseTwoTimeLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"purchaseCount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"setGovernance","inputs":[{"type":"address","name":"_governance","internalType":"address payable"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ERC20"}],"name":"token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensSold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensUnsold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vestingPhase1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vestingPhase2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vestingPhase3","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"weiRaised","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"withdrawEthers","inputs":[{"type":"uint256","name":"_weiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"withdrawTokens","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"withdrawUnsoldTokens","inputs":[]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x6080604052600436106101c65760003560e01c806378a89567116100f7578063ba982c4111610095578063d76b609511610064578063d76b60951461062b578063f420670614610656578063f7fb07b014610693578063fc0c546a146106be576101d5565b8063ba982c41146105a0578063c44aa1f4146105cb578063c8bdbfb6146105f6578063d0febe4c14610621576101d5565b80638d8f2adb116100d15780638d8f2adb146104e257806393bd73851461050d578063a1e33a8914610538578063ab033ea914610563576101d5565b806378a895671461046157806378e979251461048c5780637f18d9e3146104b7576101d5565b80634302c41711610164578063595d22131161013e578063595d22131461039c5780635aa6e675146103c757806362f3b1f6146103f25780636f7bc9be1461041d576101d5565b80634302c4171461031b578063518ab2a81461034657806355a16c2414610371576101d5565b80632236fa1d116101a05780632236fa1d1461026f5780632b85ed9c1461029a5780634042b66f146102c557806341338cc5146102f0576101d5565b806303b4a479146101da57806310095cd21461020557806319152e4214610244576101d5565b366101d5576101d36106e9565b005b600080fd5b3480156101e657600080fd5b506101ef610b78565b6040516101fc9190611bfe565b60405180910390f35b34801561021157600080fd5b5061022c60048036038101906102279190611c4a565b610b7e565b60405161023b93929190611cb8565b60405180910390f35b34801561025057600080fd5b50610259610bd8565b6040516102669190611bfe565b60405180910390f35b34801561027b57600080fd5b50610284610bde565b6040516102919190611bfe565b60405180910390f35b3480156102a657600080fd5b506102af610be4565b6040516102bc9190611bfe565b60405180910390f35b3480156102d157600080fd5b506102da610bea565b6040516102e79190611bfe565b60405180910390f35b3480156102fc57600080fd5b50610305610bf0565b6040516103129190611bfe565b60405180910390f35b34801561032757600080fd5b50610330610bf6565b60405161033d9190611bfe565b60405180910390f35b34801561035257600080fd5b5061035b610bfc565b6040516103689190611bfe565b60405180910390f35b34801561037d57600080fd5b50610386610c02565b6040516103939190611bfe565b60405180910390f35b3480156103a857600080fd5b506103b1610c08565b6040516103be9190611bfe565b60405180910390f35b3480156103d357600080fd5b506103dc610c0e565b6040516103e99190611d10565b60405180910390f35b3480156103fe57600080fd5b50610407610c34565b6040516104149190611bfe565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190611d57565b610c3a565b604051610458989796959493929190611d84565b60405180910390f35b34801561046d57600080fd5b50610476610ca2565b6040516104839190611bfe565b60405180910390f35b34801561049857600080fd5b506104a1610d15565b6040516104ae9190611bfe565b60405180910390f35b3480156104c357600080fd5b506104cc610d1b565b6040516104d99190611bfe565b60405180910390f35b3480156104ee57600080fd5b506104f7610d21565b6040516105049190611e1d565b60405180910390f35b34801561051957600080fd5b506105226112a9565b60405161052f9190611bfe565b60405180910390f35b34801561054457600080fd5b5061054d6112af565b60405161055a9190611bfe565b60405180910390f35b34801561056f57600080fd5b5061058a60048036038101906105859190611e64565b6112b5565b6040516105979190611e1d565b60405180910390f35b3480156105ac57600080fd5b506105b5611391565b6040516105c29190611bfe565b60405180910390f35b3480156105d757600080fd5b506105e0611397565b6040516105ed9190611bfe565b60405180910390f35b34801561060257600080fd5b5061060b61139d565b6040516106189190611e1d565b60405180910390f35b6106296106e9565b005b34801561063757600080fd5b5061064061158a565b60405161064d9190611bfe565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190611c4a565b611590565b60405161068a9190611e1d565b60405180910390f35b34801561069f57600080fd5b506106a8611694565b6040516106b59190611bfe565b60405180910390f35b3480156106ca57600080fd5b506106d36116f4565b6040516106e09190611ef0565b60405180910390f35b6000349050620186a0811015610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072b90611f8e565b60405180910390fd5b600a54421115610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077090611ffa565b60405180910390fd5b6001544210156107be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b590612066565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061080c836117f1565b905060008111610851576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610848906120d2565b60405180910390fd5b6108668360025461179390919063ffffffff16565b600281905550338260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601360405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200183815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155505060016012546109779190612121565b601281905550600b5460085461098d9190612177565b4210156109c9578282600201546109a49190612121565b82600201819055508082600301546109bc9190612121565b8260030181905550610a6c565b600854421180156109e85750600b546009546109e59190612177565b42105b15610a22578282600401546109fd9190612121565b8260040181905550808260050154610a159190612121565b8260050181905550610a6b565b60095442118015610a345750600a5442105b15610a6a57828260060154610a499190612121565b8260060181905550808260070154610a619190612121565b82600701819055505b5b5b808260010154610a7c9190612121565b8260010181905550610a998160035461179390919063ffffffff16565b600381905550610ab481600454611b3790919063ffffffff16565b600481905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610b22573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f8483604051610b6b9291906121ab565b60405180910390a2505050565b60075481565b60138181548110610b8e57600080fd5b90600052602060002090600302016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b60095481565b60115481565b60125481565b60025481565b60105481565b600e5481565b60035481565b60055481565b60065481565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b60146020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060154908060070154905088565b600080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816007015482600501548360030154610d019190612121565b610d0b9190612121565b9050809250505090565b60015481565b600c5481565b600080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390612220565b60405180910390fd5b600e54421015610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e389061228c565b60405180910390fd5b60008260070154118015610e575750600e544210155b15610fb657600e54421015610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e98906122f8565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8284600701546040518363ffffffff1660e01b8152600401610f00929190612318565b602060405180830381600087803b158015610f1a57600080fd5b505af1158015610f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f52919061236d565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061240c565b60405180910390fd5b610fa382600101548360070154611b37565b8260010181905550600082600701819055505b60008260050154118015610fcc5750600d544210155b1561112b57600d54421015611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d90612478565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8284600501546040518363ffffffff1660e01b8152600401611075929190612318565b602060405180830381600087803b15801561108f57600080fd5b505af11580156110a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c7919061236d565b611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd9061250a565b60405180910390fd5b61111882600101548360050154611b37565b8260010181905550600082600501819055505b600082600301541180156111415750600c544210155b156112a057600c5442101561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290612576565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8284600301546040518363ffffffff1660e01b81526004016111ea929190612318565b602060405180830381600087803b15801561120457600080fd5b505af1158015611218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123c919061236d565b61127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290612608565b60405180910390fd5b61128d82600101548360030154611b37565b8260010181905550600082600301819055505b60019250505090565b600b5481565b600d5481565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133e90612674565b60405180910390fd5b81601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60045481565b60085481565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690612674565b60405180910390fd5b600a544211611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a906126e0565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004546040518363ffffffff1660e01b81526004016114f2929190612721565b602060405180830381600087803b15801561150c57600080fd5b505af1158015611520573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611544919061236d565b611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90612796565b60405180910390fd5b6001905090565b600f5481565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990612674565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561168a573d6000803e3d6000fd5b5060019050919050565b60006008544210156116aa57600f5490506116f1565b600954421080156116bd57506008544210155b156116cc5760105490506116f1565b600a544210806116dd5750600a5442115b156116ec5760115490506116f1565b600090505b90565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008083141561172b576000905061178d565b6000828461173991906127b6565b9050828482611748919061283f565b14611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f906128e2565b60405180910390fd5b809150505b92915050565b60008082846117a29190612121565b9050838110156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de9061294e565b60405180910390fd5b8091505092915050565b600080429050600061181c81611817611808611694565b8761171890919063ffffffff16565b611793565b9250600b5460085461182e9190612177565b82116118c4576000836005546118449190612177565b106118ba576000836005546118599190612177565b101561189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906129ba565b60405180910390fd5b6118af83600554611b3790919063ffffffff16565b6005819055506118bf565b600092505b611b30565b600b546008546118d49190612177565b821180156118e3575060085482105b1561195057600092506000801415611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790612a26565b60405180910390fd5b61194583600654611b3790919063ffffffff16565b600681905550611b2f565b6008548211801561196f5750600b5460095461196c9190612177565b82105b15611a04576000836006546119849190612177565b106119fa576000836006546119999190612177565b10156119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190612a92565b60405180910390fd5b6119ef83600654611b3790919063ffffffff16565b6006819055506119ff565b600092505b611b2e565b600b54600954611a149190612177565b82118015611a23575060095482105b15611a8957600092506000801415611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790612afe565b60405180910390fd5b82600654611a7e9190612177565b600681905550611b2d565b60095482118015611a9b5750600a5482105b15611b2c57600083600754611ab09190612177565b10611b2657600083600754611ac59190612177565b1015611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90612b6a565b60405180910390fd5b611b1b83600754611b3790919063ffffffff16565b600781905550611b2b565b600092505b5b5b5b5b5b5050919050565b6000611b7983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b81565b905092915050565b6000838311158290611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc09190612c12565b60405180910390fd5b5060008385611bd89190612177565b9050809150509392505050565b6000819050919050565b611bf881611be5565b82525050565b6000602082019050611c136000830184611bef565b92915050565b600080fd5b611c2781611be5565b8114611c3257600080fd5b50565b600081359050611c4481611c1e565b92915050565b600060208284031215611c6057611c5f611c19565b5b6000611c6e84828501611c35565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ca282611c77565b9050919050565b611cb281611c97565b82525050565b6000606082019050611ccd6000830186611ca9565b611cda6020830185611bef565b611ce76040830184611bef565b949350505050565b6000611cfa82611c77565b9050919050565b611d0a81611cef565b82525050565b6000602082019050611d256000830184611d01565b92915050565b611d3481611c97565b8114611d3f57600080fd5b50565b600081359050611d5181611d2b565b92915050565b600060208284031215611d6d57611d6c611c19565b5b6000611d7b84828501611d42565b91505092915050565b600061010082019050611d9a600083018b611d01565b611da7602083018a611bef565b611db46040830189611bef565b611dc16060830188611bef565b611dce6080830187611bef565b611ddb60a0830186611bef565b611de860c0830185611bef565b611df560e0830184611bef565b9998505050505050505050565b60008115159050919050565b611e1781611e02565b82525050565b6000602082019050611e326000830184611e0e565b92915050565b611e4181611cef565b8114611e4c57600080fd5b50565b600081359050611e5e81611e38565b92915050565b600060208284031215611e7a57611e79611c19565b5b6000611e8884828501611e4f565b91505092915050565b6000819050919050565b6000611eb6611eb1611eac84611c77565b611e91565b611c77565b9050919050565b6000611ec882611e9b565b9050919050565b6000611eda82611ebd565b9050919050565b611eea81611ecf565b82525050565b6000602082019050611f056000830184611ee1565b92915050565b600082825260208201905092915050565b7f696e766573746d656e742073686f756c64206265206d6f7265207468616e203060008201527f2e30303030303030303030303031204557540000000000000000000000000000602082015250565b6000611f78603283611f0b565b9150611f8382611f1c565b604082019050919050565b60006020820190508181036000830152611fa781611f6b565b9050919050565b7f454c49535420494c4f20697320436c6f73656420210000000000000000000000600082015250565b6000611fe4601583611f0b565b9150611fef82611fae565b602082019050919050565b6000602082019050818103600083015261201381611fd7565b9050919050565b7f454c49535420494c4f206973206e6f74206f70656e2079657421000000000000600082015250565b6000612050601a83611f0b565b915061205b8261201a565b602082019050919050565b6000602082019050818103600083015261207f81612043565b9050919050565b7f4e4f5420504f535349424c4520544f20505552434841534520454c4953540000600082015250565b60006120bc601e83611f0b565b91506120c782612086565b602082019050919050565b600060208201905081810360008301526120eb816120af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061212c82611be5565b915061213783611be5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561216c5761216b6120f2565b5b828201905092915050565b600061218282611be5565b915061218d83611be5565b9250828210156121a05761219f6120f2565b5b828203905092915050565b60006040820190506121c06000830185611bef565b6121cd6020830184611bef565b9392505050565b7f4e6f742076616c696420696e766573746f7220746f2077697468647261772021600082015250565b600061220a602083611f0b565b9150612215826121d4565b602082019050919050565b60006020820190508181036000830152612239816121fd565b9050919050565b7f454c495354207374696c6c206c6f636b65640000000000000000000000000000600082015250565b6000612276601283611f0b565b915061228182612240565b602082019050919050565b600060208201905081810360008301526122a581612269565b9050919050565b7f5374696c6c20696e2056657374696e6720504833000000000000000000000000600082015250565b60006122e2601483611f0b565b91506122ed826122ac565b602082019050919050565b60006020820190508181036000830152612311816122d5565b9050919050565b600060408201905061232d6000830185611ca9565b61233a6020830184611bef565b9392505050565b61234a81611e02565b811461235557600080fd5b50565b60008151905061236781612341565b92915050565b60006020828403121561238357612382611c19565b5b600061239184828501612358565b91505092915050565b7f43616e204e4f54207472616e7366657220454c4953542066726f6d205068617360008201527f6520330000000000000000000000000000000000000000000000000000000000602082015250565b60006123f6602383611f0b565b91506124018261239a565b604082019050919050565b60006020820190508181036000830152612425816123e9565b9050919050565b7f5374696c6c20696e2056657374696e6720504832000000000000000000000000600082015250565b6000612462601483611f0b565b915061246d8261242c565b602082019050919050565b6000602082019050818103600083015261249181612455565b9050919050565b7f43616e204e4f54207472616e7366657220454c4953542066726f6d205068617360008201527f6520320000000000000000000000000000000000000000000000000000000000602082015250565b60006124f4602383611f0b565b91506124ff82612498565b604082019050919050565b60006020820190508181036000830152612523816124e7565b9050919050565b7f5374696c6c20696e2056657374696e6720504831000000000000000000000000600082015250565b6000612560601483611f0b565b915061256b8261252a565b602082019050919050565b6000602082019050818103600083015261258f81612553565b9050919050565b7f43616e204e4f54207472616e7366657220454c4953542066726f6d205068617360008201527f6520310000000000000000000000000000000000000000000000000000000000602082015250565b60006125f2602383611f0b565b91506125fd82612596565b604082019050919050565b60006020820190508181036000830152612621816125e5565b9050919050565b7f21676f7665726e616e6365000000000000000000000000000000000000000000600082015250565b600061265e600b83611f0b565b915061266982612628565b602082019050919050565b6000602082019050818103600083015261268d81612651565b9050919050565b7f454c49535420494c4f206973206e6f742066696e697368656400000000000000600082015250565b60006126ca601983611f0b565b91506126d582612694565b602082019050919050565b600060208201905081810360008301526126f9816126bd565b9050919050565b600061270b82611ebd565b9050919050565b61271b81612700565b82525050565b60006040820190506127366000830185612712565b6127436020830184611bef565b9392505050565b7f5472616e73666572206e6f74207375636365737366756c000000000000000000600082015250565b6000612780601783611f0b565b915061278b8261274a565b602082019050919050565b600060208201905081810360008301526127af81612773565b9050919050565b60006127c182611be5565b91506127cc83611be5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612805576128046120f2565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061284a82611be5565b915061285583611be5565b92508261286557612864612810565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006128cc602183611f0b565b91506128d782612870565b604082019050919050565b600060208201905081810360008301526128fb816128bf565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612938601b83611f0b565b915061294382612902565b602082019050919050565b600060208201905081810360008301526129678161292b565b9050919050565b7f5068617365204f6e6520537570706c7920456e64656420210000000000000000600082015250565b60006129a4601883611f0b565b91506129af8261296e565b602082019050919050565b600060208201905081810360008301526129d381612997565b9050919050565b7f49444c452054494d452031202100000000000000000000000000000000000000600082015250565b6000612a10600d83611f0b565b9150612a1b826129da565b602082019050919050565b60006020820190508181036000830152612a3f81612a03565b9050919050565b7f50686173652054776f20537570706c7920456e64656420210000000000000000600082015250565b6000612a7c601883611f0b565b9150612a8782612a46565b602082019050919050565b60006020820190508181036000830152612aab81612a6f565b9050919050565b7f49444c452054494d452032202100000000000000000000000000000000000000600082015250565b6000612ae8600d83611f0b565b9150612af382612ab2565b602082019050919050565b60006020820190508181036000830152612b1781612adb565b9050919050565b7f506861736520546872656520537570706c7920456e6465642021000000000000600082015250565b6000612b54601a83611f0b565b9150612b5f82612b1e565b602082019050919050565b60006020820190508181036000830152612b8381612b47565b9050919050565b600081519050919050565b60005b83811015612bb3578082015181840152602081019050612b98565b83811115612bc2576000848401525b50505050565b6000601f19601f8301169050919050565b6000612be482612b8a565b612bee8185611f0b565b9350612bfe818560208601612b95565b612c0781612bc8565b840191505092915050565b60006020820190508181036000830152612c2c8184612bd9565b90509291505056fea2646970667358221220855f3c5541def9cb5748a3af0231ef35154b516f55e5d0a404d14c643d9b3a5b64736f6c63430008090033