#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
inline void add(int& a, const int& b) {
  a += b;
  if (a >= mod) a -= mod;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<vector<int> > v(max(n, m), vector<int>(min(n, m), 0));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      char x;
      cin >> x;
      if (n > m)
        v[i][j] = (x == '.' ? 1 : 0);
      else
        v[j][i] = (x == '.' ? 1 : 0);
    }
  }
  if (n < m) swap(n, m);
  vector<array<array<int, 2>, 2> > dp(1 << m), prev(1 << m);
  for (int j = 0; j < (1 << m); j++)
    for (int k = 0; k < 2; k++)
      for (int l = 0; l < 2; l++) prev[j][k][l] = 0;
  prev[0][0][0] = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      for (int mask = 0; mask < (1 << m); mask++)
        for (int k = 0; k < 2; k++)
          for (int l = 0; l < 2; l++) dp[mask][k][l] = 0;
      for (int mask = 0; mask < (1 << m); mask++) {
        for (int bad = 0; bad < 2; bad++) {
          for (int cl = 0; cl < 2; cl++) {
            if (v[i][j]) {
              if ((j && cl) || (mask & (1 << j))) {
                add(dp[mask][bad][(j ? cl : 0)], prev[mask][bad][cl]);
                add(dp[mask | (1 << j)][bad][1], prev[mask][bad][cl]);
              } else {
                add(dp[mask | (1 << j)][bad][1], prev[mask][bad][cl]);
                if (!bad) add(dp[mask][1][0], prev[mask][bad][cl]);
              }
            } else {
              add(dp[mask & (((1 << m) - 1) ^ (1 << j))][bad][0],
                  prev[mask][bad][cl]);
            }
          }
        }
      }
      prev = dp;
    }
  }
  int ans = 0;
  for (int mask = 0; mask < (1 << m); mask++) {
    for (int bad = 0; bad < 2; bad++) {
      for (int cl = 0; cl < 2; cl++) {
        add(ans, dp[mask][bad][cl]);
      }
    }
  }
  cout << ans << "\n";
  return 0;
}
