#include <bits/stdc++.h>
using namespace std;
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int h, w, ans = 0, twice = 0;
  cin >> h >> w;
  char s[310][310];
  vector<int> stx[610], sty[610];
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> s[i][j];
      if (s[i][j] == '#') {
        int x = i + 300, y = j;
        stx[x + y - 300].push_back(x - y);
        sty[x - y].push_back(x + y - 300);
      }
    }
  }
  for (int i = 0; i < 600; i++) {
    sort(stx[i].begin(), stx[i].end());
    sort(sty[i].begin(), sty[i].end());
  }
  for (int x = 0; x < 600; x++) {
    for (int y1 : stx[x]) {
      for (int y2 : stx[x]) {
        if (y1 >= y2) continue;
        int d = y2 - y1;
        if (x - d >= 0) {
          ans += upper_bound(stx[x - d].begin(), stx[x - d].end(), y2) -
                 lower_bound(stx[x - d].begin(), stx[x - d].end(), y1);
          twice += upper_bound(stx[x - d].begin(), stx[x - d].end(), y2) -
                   lower_bound(stx[x - d].begin(), stx[x - d].end(), y2);
          twice += upper_bound(stx[x - d].begin(), stx[x - d].end(), y1) -
                   lower_bound(stx[x - d].begin(), stx[x - d].end(), y1);
        }
        if (x + d < 600) {
          ans += upper_bound(stx[x + d].begin(), stx[x + d].end(), y2) -
                 lower_bound(stx[x + d].begin(), stx[x + d].end(), y1);
          twice += upper_bound(stx[x + d].begin(), stx[x + d].end(), y2) -
                   lower_bound(stx[x + d].begin(), stx[x + d].end(), y2);
          twice += upper_bound(stx[x + d].begin(), stx[x + d].end(), y1) -
                   lower_bound(stx[x + d].begin(), stx[x + d].end(), y1);
        }
      }
    }
  }
  for (int y = 0; y < 600; y++) {
    for (int x1 : sty[y]) {
      for (int x2 : sty[y]) {
        if (x1 >= x2) continue;
        int d = x2 - x1;
        if (y - d >= 0) {
          ans += upper_bound(sty[y - d].begin(), sty[y - d].end(), x2) -
                 lower_bound(sty[y - d].begin(), sty[y - d].end(), x1);
          twice += upper_bound(sty[y - d].begin(), sty[y - d].end(), x2) -
                   lower_bound(sty[y - d].begin(), sty[y - d].end(), x2);
          twice += upper_bound(sty[y - d].begin(), sty[y - d].end(), x1) -
                   lower_bound(sty[y - d].begin(), sty[y - d].end(), x1);
        }
        if (y + d < 600) {
          ans += upper_bound(sty[y + d].begin(), sty[y + d].end(), x2) -
                 lower_bound(sty[y + d].begin(), sty[y + d].end(), x1);
          twice += upper_bound(sty[y + d].begin(), sty[y + d].end(), x2) -
                   lower_bound(sty[y + d].begin(), sty[y + d].end(), x2);
          twice += upper_bound(sty[y + d].begin(), sty[y + d].end(), x1) -
                   lower_bound(sty[y + d].begin(), sty[y + d].end(), x1);
        }
      }
    }
  }
  cout << ans - twice / 2 << endl;
  return 0;
}
