#include <bits/stdc++.h>
using namespace std;
#define iinf 2000000000
#define linf 1000000000000000000LL
#define ulinf 10000000000000000000ull
#define MOD1 1000000007LL
#define mpr make_pair
typedef long long LL;
typedef unsigned long long ULL;
typedef unsigned long UL;
typedef unsigned short US;
typedef pair < int , int > pii;
clock_t __stt;
inline void TStart(){__stt=clock();}
inline void TReport(){printf("\nTaken Time : %.3lf sec\n",(double)(clock()-__stt)/CLOCKS_PER_SEC);}
template < typename T > T MIN(T a,T b){return a<b?a:b;}
template < typename T > T MAX(T a,T b){return a>b?a:b;}
template < typename T > T ABS(T a){return a>0?a:(-a);}
template < typename T > void UMIN(T &a,T b){if(b<a) a=b;}
template < typename T > void UMAX(T &a,T b){if(b>a) a=b;}
int n,m,sl[605][605],sc[605][605],N;
bool g[605][605];
LL res;
bool readch(){
	char c=getchar();
	while(c==' '||c=='\n') c=getchar();
	return (c=='#');
}
int main(){
    // inputting start
    // 数据结构记得初始化！ n，m别写反！
    int i,j,k;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;++i){
		for(j=0;j<m;++j){
			g[i+j][i-j+m-1]=readch();
		}
	}
    #ifdef LOCAL
        TStart();
    #endif
    // calculation start
    // 数据结构记得初始化！ n，m别写反！
	N=n+m-1;
	for(i=0;i<N;++i){
		for(j=0;j<N;++j){
			sl[i][j]=sc[i][j]=g[i][j];
			if(j) sl[i][j]+=sl[i][j-1];
			if(i) sc[i][j]+=sc[i-1][j];
		}
	}
    for(i=0;i<N;++i){
		for(j=0;j<N;++j){
			if(g[i][j]) for(k=j+1;k<N;++k){
				if(g[i][k]){
					int d=k-j;
					if(i+d<N) res+=(LL)sl[i+d][k];
					if(i+d<N && j) res-=(LL)sl[i+d][j-1];
					if(i>=d) res+=(LL)sl[i-d][k];
					if(i>=d && j) res-=(LL)sl[i-d][j-1];
				}
			}
		}
	}
	for(i=0;i<N;++i){
		for(j=0;j<N;++j){
			if(g[j][i]) for(k=j+1;k<N;++k){
				if(g[k][i]){
					int d=k-j;
					if(i+d<N) res+=(LL)sc[k-1][i+d];
					if(i+d<N) res-=(LL)sc[j][i+d];
					if(i>=d) res+=(LL)sc[k-1][i-d];
					if(i>=d) res-=(LL)sc[j][i-d];
				}
			}
		}
	}
	printf("%lld\n",res);
    #ifdef LOCAL
        TReport();
    #endif
    return 0;
}