#include <bits/stdc++.h>
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9;
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T>
T Max(T& a, T b) {
  return a = max(a, b);
}
template <class T>
T Min(T& a, T b) {
  return a = min(a, b);
}
template <class T1, class T2>
ostream& operator<<(ostream& o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream& operator<<(ostream& o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2>
istream& operator>>(istream& i, pair<T1, T2>& p) {
  return i >> p.first >> p.second;
}
template <class T>
ostream& operator<<(ostream& o, vector<T> a) {
  Int i = 0;
  for (T t : a) o << (i++ ? " " : "") << t;
  return o;
}
template <class T>
istream& operator>>(istream& i, vector<T>& a) {
  for (T& t : a) i >> t;
  return i;
}
class CumulativeSum2D {
 public:
  Int h, w;
  vector<vector<Int> > sum;
  CumulativeSum2D() {}
  CumulativeSum2D(vector<vector<Int> > A) {
    assert(A.size());
    h = A.size();
    w = A[0].size();
    sum.resize(h + 1, vector<Int>(w + 1));
    for (Int i = 1; i <= h; i++)
      for (Int j = 1; j <= w; j++) sum[i][j] += sum[i][j - 1] + A[i - 1][j - 1];
    for (Int j = 1; j <= w; j++)
      for (Int i = 1; i <= h; i++) sum[i][j] += sum[i - 1][j];
  }
  Int get(Int x, Int y, Int X, Int Y) {
    assert(x <= X && y <= Y);
    assert(0 <= x && x <= w && 0 <= X && x <= w);
    assert(0 <= y && y <= h && 0 <= Y && Y <= h);
    return sum[Y][X] - sum[y][X] - sum[Y][x] + sum[y][x];
  }
};
signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);
  Int H, W;
  cin >> H >> W;
  vector<string> mp(H);
  cin >> mp;
  Int N = (H + W) * 2 + 10;
  vector<vector<Int> > tmp(N, vector<Int>(N));
  Int ofset = H + W;
  for (Int i = 0; i < H; i++)
    for (Int j = 0; j < W; j++) {
      if (mp[i][j] != '#') continue;
      Int v = j - i + ofset;
      Int u = j + i + ofset;
      tmp[u][v] = 1;
    }
  CumulativeSum2D sum(tmp);
  Int ans = 0;
  for (Int i = 0; i < N; i++)
    for (Int l = 0; l < N; l++)
      for (Int r = l + 1; r < N; r++) {
        if (tmp[i][l] == 0 || tmp[i][r] == 0) continue;
        Int d = r - l;
        if (i - d >= 0) ans += sum.get(l, i - d, r + 1, i - d + 1);
        if (i + d < N) ans += sum.get(l, i + d, r + 1, i + d + 1);
      }
  for (Int i = 0; i < N; i++)
    for (Int l = 0; l < N; l++)
      for (Int r = l + 1; r < N; r++) {
        if (tmp[l][i] == 0 || tmp[r][i] == 0) continue;
        Int d = r - l;
        if (i - d >= 0) ans += sum.get(i - d, l + 1, i - d + 1, r);
        if (i + d < N) ans += sum.get(i + d, l + 1, i + d + 1, r);
      }
  cout << ans << endl;
  return 0;
}
