#include <bits/stdc++.h>
using namespace std;
const int inf = 1999999999;
const double pi = acos(-1.0);
const double eps = 1e-10;
char gc() {
  char c;
  while (isspace(c = getchar()))
    ;
  return c;
}
int gs(char* s) {
  gets(s);
  int l = strlen(s);
  while (l && isspace(s[l - 1])) s[--l] = 0;
  return l;
}
int tiles[512];
void add(const string& s, int type) {
  int t = 0;
  for (int i = 0; i < ((int)(s).size()); i++) t = (2 * t) + (s[i] == 'O');
  tiles[t] = type;
}
void init() {
  add(".........", 3);
  add("....O....", 3);
  add("O.O...O.O", 3);
  add("O.O.O.O.O", 3);
  add("..O...O..", 1);
  add("..O.O.O..", 1);
  add("O.OO.OO.O", 1);
  add("O.......O", 2);
  add("O...O...O", 2);
  add("OOO...OOO", 2);
}
int n, m;
char str[1010][1010];
void scan() {
  gets(str[0]);
  sscanf(str[0], "%d%d", &n, &m);
  for (int i = 0; i < 4 * n + 1; i++) gets(str[i]);
}
bool hori[250][250], vert[250][250];
void gettile(int x, int y) {
  int tx = 4 * x + 1, ty = 4 * y + 1, t = 0;
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) t = (t * 2) + (str[tx + i][ty + j] == 'O');
  t = tiles[t];
  vert[x][y] = (t & 1);
  hori[x][y] = (t & 2);
}
const int MOD = 1000000007;
inline void addmod(int& a, int b) { a = (a + b) % MOD; }
inline void multmod(int& a, int b) { a = (int)(((long long)b * a) % MOD); }
int dp[251], dp2[251];
int getw1(int j) {
  if ((n % 2) != 0) return 0;
  for (int i = 0; i < n; i++)
    if (!vert[i][j]) return 0;
  return 1;
}
int getw2(int j) {
  memset((dp2), (0), sizeof(dp2));
  dp2[0] = 1;
  for (int i = 0; i < n; i++) {
    if (i < n - 1) {
      if (vert[i][j] && vert[i][j + 1] && vert[i + 1][j] && vert[i + 1][j + 1])
        addmod(dp2[i + 2], dp2[i]);
    }
    if (hori[i][j] && hori[i][j + 1]) addmod(dp2[i + 1], dp2[i]);
  }
  if ((n % 2) == 0) {
    bool ok = true;
    for (int i = 0; i < n; i++)
      if (!vert[i][j] || !vert[i][j + 1]) {
        ok = false;
        break;
      }
    if (ok) dp2[n]--;
  }
  return dp2[n];
}
void solve() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) gettile(i, j);
  memset((dp), (0), sizeof(dp));
  dp[0] = 1;
  for (int j = 0; j < m; j++) {
    if (j < m - 1) {
      int t = dp[j];
      multmod(t, getw2(j));
      addmod(dp[j + 2], t);
    }
    int t = dp[j];
    multmod(t, getw1(j));
    addmod(dp[j + 1], t);
  }
  printf("%d\n", dp[m]);
}
int main() {
  init();
  scan();
  solve();
}
