contract admined { //This token contract is administered
    address public admin; //Admin address is public
    uint public lockThreshold; //Lock tiime is public
    address public allowedAddr; //There can be an address that can use the token during a lock, its public

    function admined() internal {
        admin = msg.sender; //Set initial admin to contract creator
        Admined(admin);
    }

    modifier onlyAdmin() { //A modifier to define admin-only functions
        require(msg.sender == admin);
        _;
    }

    modifier endOfLock() { //A modifier to lock transactions until finish of time (or being allowed)
        require(now > lockThreshold || msg.sender == allowedAddr);
        _;
    }

    function transferAdminship(address _newAdmin) onlyAdmin public { //Admin can be transfered
        admin = _newAdmin;
        TransferAdminship(admin);
    }

    function addAllowedToTransfer (address _allowedAddr) onlyAdmin public { //Here the special address that can transfer during a lock is set
        allowedAddr = _allowedAddr;
        AddAllowedToTransfer (allowedAddr);
    }

    function setLock(uint _timeInMins) onlyAdmin public { //Only the admin can set a lock on transfers
        require(_timeInMins > 0);
        uint mins = _timeInMins * 1 minutes;
        lockThreshold = SafeMath.add(now,mins);
        SetLock(lockThreshold);
    }

    //All admin actions have a log for public review
    event SetLock(uint timeInMins);
    event AddAllowedToTransfer (address allowedAddress);
    event TransferAdminship(address newAdminister);
    event Admined(address administer);

}
function admined() internal {
    admin = msg.sender; //Set initial admin to contract creator
    Admined(admin);
}

//There can be an address that can use the token during a lock, its public