function purchaseMIT(address recipient) external senderIsWhitelisted payable saleActive hasValue recipientIsValid(recipient) returns (uint increaseMIT) {

        
        if (!exitAddress.send(msg.value)) {
            throw;
        }

        
        senderETH[msg.sender] += msg.value;
        recipientETH[recipient] += msg.value;
        totalETH += msg.value;

        
        uint MIT = msg.value * 10;   

        
        if (block.timestamp - start < 2 weeks) {
            MIT += MIT / 10;    
        }
        else if (block.timestamp - start < 5 weeks) {
            MIT += MIT / 20;    
        }

        
        senderMIT[msg.sender] += MIT;
        recipientMIT[recipient] += MIT;

        
        uint oldExtra = recipientExtraMIT[recipient];

        
        if (recipientETH[recipient] >= bonus2StartETH) {
            recipientExtraMIT[recipient] = (recipientMIT[recipient] * 75) / 1000;      
        }
        else if (recipientETH[recipient] >= bonus1StartETH) {
            recipientExtraMIT[recipient] = (recipientMIT[recipient] * 375) / 10000;      
        }

        
        increaseMIT = MIT + (recipientExtraMIT[recipient] - oldExtra);

        
        mainstreetToken.addTokens(recipient, increaseMIT);

        
        MITPurchase(msg.sender, recipient, msg.value, increaseMIT);
    }