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 <bits/stdc++.h>
#define y1 __zzd001
using namespace std;
typedef long long LL;
LL read(){
	LL x=0;
	char ch=getchar();
	while (!isdigit(ch))
		ch=getchar();
	while (isdigit(ch))
		x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x;
}
const int N=605;
int n,m;
int a[N][N],R[N][N],C[N][N];
char g[N][N];
int main(){
	n=read(),m=read();
	for (int i=1;i<=n;i++){
		scanf("%s",g[i]+1);
		for (int j=1;j<=m;j++)
			if (g[i][j]=='#')
				a[i+j][i-j+300]=1;
	}
	int n=600;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++){
			R[i][j]=R[i][j-1]+a[i][j];
			C[i][j]=C[i-1][j]+a[i][j];
		}
	LL ans=0;
	for (int x=1;x<=n;x++)
		for (int y1=1,t;y1<=n;y1++)
			if (a[x][y1])
				for (int y2=y1+1;y2<=n;y2++){
					if (!a[x][y2])
						continue;
					t=y2-y1;
					if (x>t)
						ans+=R[x-t][y2]-R[x-t][y1-1];
					if (x+t<=n)
						ans+=R[x+t][y2]-R[x+t][y1-1];
				}
	for (int x=1;x<=n;x++)
		for (int y1=1,t;y1<=n;y1++)
			if (a[y1][x])
				for (int y2=y1+1;y2<=n;y2++){
					if (!a[y2][x])
						continue;
					t=y2-y1;
					if (x>t)
						ans+=C[y2-1][x-t]-C[y1][x-t];
					if (x+t<=n)
						ans+=C[y2-1][x+t]-C[y1][x+t];
				}
	cout << ans;
	return 0;
}