#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
#define ft first
#define sd second
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int mod = 998244353;
const int maxn = 300000+5;
ll dp[maxn][2][2];
ll p2[maxn];
ll inv9;
string str[maxn];
ll kpow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b&1){
			ans = ans*a;
			ans%=mod;
		}
		b>>=1;
		a*=a;
		a%=mod;
	}
	return ans;
}
ll f(ll n){
	int t;
	if(n%2) t = -1;
	else t = 1;
	return ((((3LL*n+1)*p2[n]-t)%mod)*inv9)%mod;
}
int main() {
	p2[0] = 1;
	p2[1] = 2;
	inv9 = kpow(9,mod-2);
	//cout<<inv9<<endl;
	for(int i=2;i<=300000;i++){
		p2[i] = (p2[i-1]*2LL)%mod; 
	}  
	int n,m;
	cin>>n>>m;
	ll ans = 0;
	for(int i=1;i<=n;i++){
		cin>>str[i];
	}
	ll ct = 0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<m;j++){
			ct+=(str[i][j]=='o');
		} 
	} 
	for(int i=1;i<=n;i++){
		int cnt = 0;
		for(int j=0;j<m;j++){
			if(str[i][j]=='o'){
				cnt++;
			}else{
				if(cnt>=2){
					ans+=((f(cnt-1)*p2[ct-cnt])%mod);
					ans%=mod;
				}
				
				cnt = 0;	
			} 
		}
		if(cnt>=2){
			ans+=((f(cnt-1)*p2[ct-cnt])%mod);
			ans%=mod;
		} 
	}
	for(int i=0;i<m;i++){
		int cnt = 0;
		for(int j=1;j<=n;j++){
			if(str[j][i]=='o'){
				cnt++;
			}else{
				if(cnt>=2){
					ans+=((f(cnt-1)*p2[ct-cnt])%mod);
					ans%=mod;
						
				}
				cnt = 0;
					
			} 
		}
		if(cnt>=2){
			ans+=((f(cnt-1)*p2[ct-cnt])%mod);
			ans%=mod;
		} 
	}  
	
		
	cout<<ans<<endl;
	//cout<<dp[n][0][0]+dp[n][0][1]+dp[n][1][0]+dp[n][1][0]+dp[n][1][1]<<"\n";
    return 0;
}


