Problem: There are some coins in the xy-plane. The positions of the coins are represented by a grid of characters with H rows and W columns. If the character at the i-th row and j-th column, s_{ij}, is `#`, there is one coin at point (i,j); if that character is `.`, there is no coin at point (i,j). There are no other coins in the xy-plane.

There is no coin at point (x,y) where 1\leq i\leq H,1\leq j\leq W does not hold. There is also no coin at point (x,y) where x or y (or both) is not an integer. Additionally, two or more coins never exist at the same point.

Find the number of triples of different coins that satisfy the following condition:

* Choosing any two of the three coins would result in the same Manhattan distance between the points where they exist.



Here, the Manhattan distance between points (x,y) and (x',y') is |x-x'|+|y-y'|. Two triples are considered the same if the only difference between them is the order of the coins.

Constraints

* 1 \leq H,W \leq 300
* s_{ij} is `#` or `.`.

Input

Input is given from Standard Input in the following format:


H W
s_{11}...s_{1W}
:
s_{H1}...s_{HW}


Output

Print the number of triples that satisfy the condition.

Examples

Input

5 4
#.##
.##.
#...
..##
...#


Output

3


Input

5 4
.##
.##.
...
..##
...#


Output

3


Input

13 27
......#.........#.......#..
...#.....###..
..............#####...##...
...#######......#...#######
...#.....#.....###...#...#.
...#######....#.#.#.#.###.#
..............#.#.#...#.#..
.#.#.#...###..
...........#...#...#######
..#######..#...#...#.....#
..#.....#..#...#...#.###.#
..#######..#...#...#.#.#.#
..........##...#...#.#####


Output

870

Solution (in CPP):

Solution:
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <limits.h>
#include <math.h>
#include <functional>
#include <bitset>
#include <iomanip>

#define repeat(i,n) for (long long i = 0; (i) < (n); ++ (i))
#define debug(x) cerr << #x << ": " << x << '\n'
#define debugArray(x,n) for(long long i = 0; (i) < (n); ++ (i)) cerr << #x << "[" << i << "]: " << x[i] << '\n'
#define debugArrayP(x,n) for(long long i = 0; (i) < (n); ++ (i)) cerr << #x << "[" << i << "]: " << x[i].first<< " " << x[i].second << '\n'

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> Pii;
typedef vector<int> vint;
typedef vector<ll> vll;
const ll INF = LLONG_MAX;
const ll MOD = 1e9+7;

int c[800][800];
int sumc[800][800],sumr[800][800];

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);
  int H,W;cin>>H>>W;
  repeat(i,H){
    string s;cin>>s;
    repeat(j,W){
      if(s[j]=='#'){
        c[i+j+1][300+j-i]=1;
      }
    }
  }
  /*
  repeat(i,10){
    for(int j=300-10;j<300+10;j++){
      cerr << c[i][j];
    }
    cerr<<endl;
  }
  */
  repeat(i,780){
    repeat(j,780){
      sumc[i][j+1]=sumc[i][j]+c[i][j+1];
      sumr[i+1][j]=sumr[i][j]+c[i+1][j];
    }
  }
  /*
  cerr<<endl;
  repeat(i,10){
    for(int j=300-10;j<300+10;j++){
      cerr << sumc[i][j];
    }
    cerr<<endl;
  }
  repeat(i,10){
    for(int j=300-10;j<300+10;j++){
      cerr << sumr[i][j];
    }
    cerr<<endl;
  }
  */
  ll ans = 0;
  repeat(i,780){
    repeat(j,780)if(c[i][j+1]){
      repeat(k,j)if(c[i][k+1]){
        int l=i-(j-k);
        if(0<=l)ans += sumc[l][j+1]-sumc[l][k];
        int r=i+(j-k);
        if(r<=780)ans += sumc[r][j+1]-sumc[r][k];
      }
    }
  }
  repeat(j,780){
    repeat(i,780)if(c[i+1][j]){
      repeat(k,i)if(c[k+1][j]){
        int l=j-(i-k);
        if(0<=l)ans += sumr[i][l]-sumr[k+1][l];
        int r=j+(i-k);
        if(r<=780)ans += sumr[i][r]-sumr[k+1][r];
      }
    }
  }
  cout << ans << endl;
  return 0;
}