#include <stdio.h>

#define MAX 501

char str[MAX][MAX];
int DP[MAX][MAX];

int is_secure(int x,int y){
	if(x < 0 || x >= MAX || y < 0 || y >= MAX){
		return 0;
	}else{
		return 1;
	}
}

int get_x(int dp[MAX][MAX],int x,int y){
	return dp[y][x] >> 16;
}

int get_y(int dp[MAX][MAX],int x,int y){
	return dp[y][x] & 0x0000FFFF;
}

void set_x(int dp[MAX][MAX],int x,int y,int num){
	dp[y][x] = (dp[y][x] & 0x0000FFFF) | (num << 16);
}

void set_y(int dp[MAX][MAX],int x,int y,int num){
	dp[y][x] = (dp[y][x] & 0xFFFF0000) | (num & 0x0000FFFF);
}


int main(int argc, char** argv)
{
	int max_x,max_y,i,j;

	for(;;){
		int max = 0;
		
		scanf("%d %d",&max_y,&max_x);
		
		if(max_x == 0 && max_y == 0){
			break;
		}

		for(i = 0; i < max_y; i++){
			scanf("%s",str[i]);
		}

		for(i = 0; i < max_y; i++){
			for(j = 0; j < max_x; j++){
				if(i != 0 && j != 0){
					if(str[i][j] == '.'){
						set_x(DP,j,i,get_x(DP,j-1,i)+1);
						set_y(DP,j,i,get_y(DP,j,i-1)+1);
					}else{
						set_x(DP,j,i,0);
						set_y(DP,j,i,0);
					}
				}else{
					if(i == 0 && j == 0){
						if(str[i][j] == '.'){
							set_x(DP,j,i,1);
							set_y(DP,j,i,1);
						}else{
							set_x(DP,j,i,0);
							set_y(DP,j,i,0);
						}
					}else if(i == 0){
						if(str[i][j] == '.'){
							set_x(DP,j,i,get_x(DP,j-1,i)+1);
							set_y(DP,j,i,1);
						}else{
							set_x(DP,j,i,0);
							set_y(DP,j,i,0);
						}
					}else if(j == 0){
						if(str[i][j] == '.'){
							set_y(DP,j,i,get_y(DP,j,i-1)+1);
							set_x(DP,j,i,1);
						}else{
							set_x(DP,j,i,0);
							set_y(DP,j,i,0);
						}
					}
				}


				if(max < get_x(DP,j,i)*get_y(DP,j,i)){
					max = get_x(DP,j,i)*get_y(DP,j,i);
				}
			}
		}

		printf("%d\n",max);
	}
	
	return 0;
}