#include <bits/stdc++.h>
using namespace std;
template <typename T, typename C>
ostream &operator<<(ostream &os, pair<T, C> x) {
  return os << "<" << x.first << ", " << x.second << ">";
}
template <typename T>
auto operator<<(ostream &os, T x) ->
    typename enable_if<is_same<decltype(x.begin()), decltype(x.end())>::value &&
                           !is_same<T, string>::value,
                       ostream &>::type {
  os << "{";
  int cou = 0;
  for (auto c : x) {
    if (cou++) os << ", ";
    os << c;
  }
  return os << "}";
}
template <typename T>
string strmask(T r) {
  string ans;
  for (int i = 0; i < (8 * (int)sizeof(T)); i++) {
    ans += '0' + !!(((T)1 << i) & r);
    if (i % 5 == 4) ans += '.';
  }
  return ans;
}
const int MN = 50, MM = 1010, mod = 1e9 + 7;
unordered_map<bitset<MN>, int> __coustoe;
bitset<MN> in[MM];
char str[MM];
long long binom[MM][MM];
long long spl[MM];
int main() {
  int n, m;
  scanf("%d%d", &m, &n);
  for (int i = 0; i < (n); i++) {
    scanf("%s", str);
    for (int j = 0; j < (m); j++)
      if (str[j] == '1') in[j][i] = 1;
  }
  for (int i = 0; i < (m); i++) __coustoe[in[i]]++;
  long long ans = 1;
  binom[0][0] = 1;
  for (int i = 1; i <= (MM - 1); i++) {
    binom[i][0] = binom[i][i] = 1;
    for (int j = 1; j <= (i - 1); j++)
      binom[i][j] = (binom[i - 1][j] + binom[i - 1][j - 1]) % mod;
  }
  if (0)
    cout << "binom"
         << "["
         << "10"
         << "]["
         << "5"
         << "] = "
         << "binom"
         << "[" << 10 << "][" << 5 << "] = " << binom[10][5] << ' ' << "binom"
         << "["
         << "1000"
         << "]["
         << "5"
         << "] = "
         << "binom"
         << "[" << 1000 << "][" << 5 << "] = " << binom[1000][5] << ' '
         << "binom"
         << "["
         << "1001"
         << "]["
         << "666"
         << "] = "
         << "binom"
         << "[" << 1001 << "][" << 666 << "] = " << binom[1001][666] << ' '
         << endl;
  spl[0] = 1;
  for (int i = 1; i <= (MM - 1); i++) {
    for (int c = 0; c <= (i - 1); c++)
      spl[i] = (spl[i] + binom[i - 1][c] * spl[i - c - 1]) % mod;
  }
  for (int i = 0; i < (20); i++)
    if (0)
      cout << "spl"
           << "["
           << "i"
           << "] = "
           << "spl"
           << "[" << i << "] = " << spl[i] << ' ' << endl;
  for (auto &x : __coustoe) ans = ans * spl[x.second] % mod;
  if (0)
    cout << "count"
         << " = " << (__coustoe) << ' ' << endl;
  printf("%lld\n", (ans % mod + mod) % mod);
}
