//khodaya khodet komak kon
#include <bits/stdc++.h>

#define F first
#define S second
#define pb push_back
#define all(x) x.begin(), x.end()
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#define int long long

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int N = 105 + 10;
const ll MOD = 1000000000 + 7;
const ll INF = 1000000010;
const ll LOG = 25;

int n, m, px, py, A[N][N], B[N][N], C[N][N];
char s[N][N];
 
int f[N][N][N];
 
int32_t main(){
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%s", s[i] + 1);
		for (int j = 1; j <= m; ++j) {
			A[i][j] = s[i][j] == 'o';
			B[i][j] = B[i][j - 1] + A[i][j];
			C[i][j] = C[i - 1][j] + A[i][j];
			if (s[i][j] == 'E') px = i, py = j;
		}
	}
	for (int u = 0; u <= px - 1; ++u) {
		for (int d = 0; d <= n - px; ++d) {
			for (int l = 0; l <= py - 1; ++l) {
				for (int r = 0; r <= m - py; ++r) {
					int tu = max(px - u, 1 + d);
					int td = min(px + d, n - u);
					int tl = max(py - l, 1 + r);
					int tr = min(py + r, m - l);
					if (u && px - u == tu && tl <= tr) f[d][l][r] += B[px - u][tr] - B[px - u][tl - 1];
					if (d) f[d][l][r] = max(f[d][l][r], f[d - 1][l][r] + (px + d == td && tl <= tr ? B[px + d][tr] - B[px + d][tl - 1] : 0));
					if (l) f[d][l][r] = max(f[d][l][r], f[d][l - 1][r] + (py - l == tl && tu <= td ? C[td][py - l] - C[tu - 1][py - l] : 0));
					if (r) f[d][l][r] = max(f[d][l][r], f[d][l][r - 1] + (py + r == tr && tu <= td ? C[td][py + r] - C[tu - 1][py + r] : 0));
				}
			}
		}
	}
	printf("%d\n", f[n - px][py - 1][m - py]);
	return 0;
}