#include <bits/stdc++.h>
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1ll;
  long long _tmp = mypow(_a, _x / 2, _mod);
  _tmp = (_tmp * _tmp) % _mod;
  if (_x & 1) _tmp = (_tmp * _a) % _mod;
  return _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x + _y;
  if (_ >= _mod) _ -= _mod;
  return _;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x - _y;
  if (_ < 0) _ += _mod;
  return _;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x * _y;
  if (_ >= _mod) _ %= _mod;
  return _;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-9 && _x < _y + 1e-9;
}
int __ = 1, _cs;
int st[3030 << 2];
void modify(int no, int l, int r, int p, int dlt) {
  if (l == r) {
    st[no] += dlt;
    return;
  }
  if (p <= ((l + r) >> 1))
    modify((no << 1), l, ((l + r) >> 1), p, dlt);
  else
    modify((1 + (no << 1)), ((l + r) >> 1) + 1, r, p, dlt);
  st[no] = st[(no << 1)] + st[(1 + (no << 1))];
}
int query(int no, int l, int r, int ql, int qr) {
  if (l == ql && r == qr) return st[no];
  if (qr <= ((l + r) >> 1)) return query((no << 1), l, ((l + r) >> 1), ql, qr);
  if (((l + r) >> 1) < ql)
    return query((1 + (no << 1)), ((l + r) >> 1) + 1, r, ql, qr);
  return query((no << 1), l, ((l + r) >> 1), ql, ((l + r) >> 1)) +
         query((1 + (no << 1)), ((l + r) >> 1) + 1, r, ((l + r) >> 1) + 1, qr);
}
void build() {}
int n, m;
char c[3030][3030];
int dpl[3030][3030], dpr[3030][3030];
void init() {
  n = getint();
  m = getint();
  for (int i = 1; i <= n; i++) scanf("%s", c[i] + 1);
}
set<pair<int, int> > S;
void Clear() {
  for (set<pair<int, int> >::iterator it = S.begin(); it != S.end(); it++)
    modify(1, 1, m, it->second, -1);
  S.clear();
}
long long ans;
void solve() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      if (c[i][j] == 'z') {
        ans++;
        dpl[i][j] = dpl[i][j - 1] + 1;
      }
    for (int j = m; j >= 1; j--)
      if (c[i][j] == 'z') dpr[i][j] = dpr[i][j + 1] + 1;
  }
  for (int ss = 3; ss <= n + m - 1; ss++) {
    for (int i = max(1, ss - m); i <= min(n, ss - 1); i++) {
      int j = ss - i;
      if (c[i][j] == '.') {
        Clear();
        continue;
      }
      while (S.size() && (*--S.end()).first > j) {
        modify(1, 1, m, (*--S.end()).second, -1);
        S.erase(--S.end());
      }
      ans += query(1, 1, m, j, j + dpr[i][j] - 1);
      S.insert(make_pair(j - dpl[i][j] + 1, j));
      modify(1, 1, m, j, 1);
    }
    Clear();
  }
  cout << ans << endl;
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
