#include <bits/stdc++.h>
using namespace std;
int n, m, mm, ans, now, f[2][(1 << 16) + 5][2], mod = 1e9 + 7;
char mat[255][255];
void add(int &x, int y) {
  x += y;
  if (x >= mod) x -= mod;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", mat[i]);
  if (n < m) {
    for (int i = 0; i < n; i++)
      for (int j = i; j < m; j++) swap(mat[i][j], mat[j][i]);
    swap(n, m);
  }
  mm = (1 << (m + 1)) - 1;
  f[0][0][0] = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      now ^= 1;
      memset(f[now], 0, sizeof(f[now]));
      for (int sta = 0; sta <= mm; sta++) {
        int x = j, y = j + 1, p = (sta >> x) & 1, q = (sta >> y) & 1,
            tmp = sta ^ (p << x) ^ (q << y), s0 = f[now ^ 1][sta][0],
            s1 = f[now ^ 1][sta][1];
        if (!s0 && !s1) continue;
        if (mat[i][j] == 'x') {
          add(f[now][tmp][0], s0);
          add(f[now][tmp][1], s1);
          continue;
        }
        add(f[now][tmp | (1 << x) | (1 << y)][0], s0);
        add(f[now][tmp | (1 << x) | (1 << y)][1], s1);
        if (p || q) {
          add(f[now][tmp | (q << x) | (p << y)][0], s0);
          add(f[now][tmp | (q << x) | (p << y)][1], s1);
        } else
          add(f[now][tmp][1], s0);
      }
    }
    now ^= 1;
    memset(f[now], 0, sizeof(f[now]));
    for (int sta = 0; sta <= mm; sta++) {
      add(f[now][(sta << 1) & mm][0], f[now ^ 1][sta][0]);
      add(f[now][(sta << 1) & mm][1], f[now ^ 1][sta][1]);
    }
  }
  for (int sta = 0; sta <= mm; sta++) {
    add(ans, f[now][sta][0]);
    add(ans, f[now][sta][1]);
  }
  printf("%d", ans);
  return 0;
}
