Problem: There is a grid with H rows and W columns, where each square is painted black or white.

You are given H strings S_1, S_2, ..., S_H, each of length W. If the square at the i-th row from the top and the j-th column from the left is painted black, the j-th character in the string S_i is `#`; if that square is painted white, the j-th character in the string S_i is `.`.

Find the number of pairs of a black square c_1 and a white square c_2 that satisfy the following condition:

* There is a path from the square c_1 to the square c_2 where we repeatedly move to a vertically or horizontally adjacent square through an alternating sequence of black and white squares: black, white, black, white...

Constraints

* 1 \leq H, W \leq 400
* |S_i| = W (1 \leq i \leq H)
* For each i (1 \leq i \leq H), the string S_i consists of characters `#` and `.`.

Input

Input is given from Standard Input in the following format:


H W
S_1
S_2
:
S_H


Output

Print the answer.

Examples

Input

3 3
.#.
..#
#..


Output

10


Input

3 3
.#.
..#
..


Output

10


Input

2 4
....
....


Output

0


Input

4 3


...


Output

6

Solution (in CPP):

Solution:
#include<cstdio>
#include<vector>


using namespace std;
using ll=long long;
using vi=vector<int>;
using vvi=vector<vi>;
using vll=vector<ll>;
using vvll=vector<vll>;


void fill(vvi&f, int x, int y, int is_black, int&k, int &w)
{
	static const int vx[]={ 1, 0,-1, 0};
	static const int vy[]={ 0, 1, 0,-1};

	if(is_black) k++;
	else w++;

	f[y][x]='*';
	for(int i=0;i<4;i++)
	{
		int nx=x+vx[i];
		int ny=y+vy[i];
		if(is_black && f[ny][nx]=='.') fill(f, nx, ny, 0, k, w);
		if(!is_black && f[ny][nx]=='#') fill(f, nx, ny, 1, k, w);
	}
}


int main(void)
{
	int h, w;

	while(scanf("%d%d\n", &h, &w)==2)
	{
		vvi f(h+2);
		for(auto&mf:f) mf.assign(w+2, -1);

		for(int y=1;y<=h;y++)
		{
			char s[w+10];
			scanf("%[.#]\n", s+1);
			for(int x=1;x<=w;x++)
			{
				f[y][x]=s[x];
			}
		}

		ll ans=0;
		for(int y=1;y<=h;y++)
		{
			for(int x=1;x<=w;x++)
			{
				if(f[y][x]=='#')
				{
					int k=0, w=0;
					fill(f, x, y, 1, k, w);
					ans+=(ll)k*w;
				}
			}
		}
		printf("%lld\n", ans);
	}

	return 0;
}