#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <climits>
#include <complex>
using namespace std;

#define REP(i,a,n) for(int i=(a); i<(int)(n); i++)
#define rep(i,n) REP(i,0,n)
#define all(x) (x).begin(),(x).end()
#define mp make_pair
#define pb push_back
#define EPS 1e-8
#define DEB 0


char field[512];
int memo[2][512];
class state{
  public:
	int h,id;
	state(int _h, int _i){
		h = _h;
		id = _i;
	}
};

int main(){
	int w,h;
	
	while(scanf(" %d%d ",&h,&w),w|h){
		memset(memo,0,sizeof(memo));
		int maxarea = 0;
		rep(i,h){
			int cur = i%2;
			int next = (i+1)%2;
			scanf("%s",field);
			if( i==0 ){
				rep(j,w){
					memo[next][j] = (field[j]=='.' ? 1 : 0);
				}
			}else{
				rep(j,w){
					memo[next][j] = (field[j]=='.' ? memo[cur][j]+1 : 0);
				}
			}
			memo[next][w] = 0;

#if DEB
			rep(j,w){
				printf("%2d ",memo[next][j]);
			}
			puts("");
#endif			

			stack<state> st;
			rep(j,w+1){
				int nh = memo[next][j];
				if( st.empty() ){
					st.push(state(nh,j));
				}else if( st.top().h < nh ){
					st.push(state(nh,j));
				}else if( st.top().h > nh ){
					int prev = j-1;
					int tmp;
					while( !st.empty() && st.top().h >= nh ){
#if DEB
						printf("maxarea:%d  (%d-%d+1)*%d\n",maxarea,prev,st.top().id,st.top().h);
#endif						
						maxarea = max(maxarea, (prev-st.top().id+1)*st.top().h);
						tmp = st.top().id;
						st.pop();
					}
					st.push(state(nh,tmp));
				}
			}
		}

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