contract TGCToken is MintableToken {
  string public constant name = "TokensGate Coin";
  string public constant symbol = "TGC";
  uint8 public constant decimals = 18;
    
  mapping(address => uint256) public whitelistAddresses;
    
  event Burn(address indexed burner, uint256 value);
    
  function setWhitelist(address _holder, uint256 _utDate) onlyOwner public {
    require(_holder != address(0));
      
    whitelistAddresses[_holder] = _utDate;
  }
    
  // overriding StandardToken#approve
  function approve(address _spender, uint256 _value) public returns (bool) {
    require(whitelistAddresses[msg.sender] > 0);
    require(now >= whitelistAddresses[msg.sender]);
    
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }
    
  // overriding BasicToken#transfer
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);
    require(whitelistAddresses[msg.sender] > 0);
    require(now >= whitelistAddresses[msg.sender]);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }
    
  function burn(address _burner, uint256 _value) onlyOwner public {
    require(_value <= balances[_burner]);

    balances[_burner] = balances[_burner].sub(_value);
    totalSupply = totalSupply.sub(_value);
    Burn(_burner, _value);
    Transfer(_burner, address(0), _value);
  }
}
function approve(address _spender, uint256 _value) public returns (bool) {
  require(whitelistAddresses[msg.sender] > 0);
  require(now >= whitelistAddresses[msg.sender]);
    
  allowed[msg.sender][_spender] = _value;
  Approval(msg.sender, _spender, _value);
  return true;
}

// overriding StandardToken#approve