Given a matrix (H × W) which contains only 1 and 0, find the area of the largest rectangle which only contains 0s.

Constraints

* 1 ≤ H, W ≤ 1,400

Input


H W
c1,1 c1,2 ... c1,W
c2,1 c2,2 ... c2,W
:
cH,1 cH,2 ... cH,W


In the first line, two integers H and W separated by a space character are given. In the following H lines, ci,j, elements of the H × W matrix, are given.

Output

Print the area (the number of 0s) of the largest rectangle.

Example

Input

4 5
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 0 0 1 0


Output

6
#include<bits/stdc++.h>
#define range(i,a,b) for(int i = (a); i < (b); i++)
#define rep(i,b) for(int i = 0; i < (b); i++)
#define all(a) (a).begin(), (a).end()
#define show(x)  cerr << #x << " = " << (x) << endl;
//const int INF = 1e8;
using namespace std;

	int c[2000][2000] = {{0}};
int maximumRectangule(int h, int w, char m[2000][2000]){
	rep(i,w){
		int cnt = 0;
		rep(j,h){
			if(m[j][i] == '.'){
				cnt++;
				c[j][i] = cnt;
			}else{
				cnt = 0;
			}
		}
	}
	rep(i,h) c[i][w] = 0;

	int ans = 0;
	rep(i,h){
		vector<pair<int, int>> v; //height, pos
		rep(j,w + 1){
			if(v.empty()) v.emplace_back(c[i][j],j);
			else{
				if(v.back().first < c[i][j]) v.emplace_back(c[i][j],j);
				else{
					int target = j;
					while(not v.empty() && v.back().first >= c[i][j]){
						ans = max(ans, v.back().first * (j - v.back().second));
						target = v.back().second;
						v.pop_back();
					}
					v.emplace_back(c[i][j],target);
				}
			}
		}
	}
	return ans;
}

int main(){
	int h, w;
	cin >> h >> w;

	char m[2000][2000];
	rep(i,h){
		rep(j,w){
			int a;
			cin >> a;
			if(a) m[i][j] = '#';
			else m[i][j] = '.';
		}
	}
	cout << maximumRectangule(h,w,m) << endl;
}