#include <bits/stdc++.h>
using namespace std;
char BUFFER[100000 + 5];
bool readn(int &n) { return scanf("%d", &n) == 1; }
bool readl(long long &n) { return scanf("%I64d", &n) == 1; }
bool readd(double &n) { return scanf("%lf", &n) == 1; }
bool reads(string &s) {
  s = "";
  int n = scanf("%s", BUFFER);
  if (n == 1) s = BUFFER;
  return n == 1;
}
bool readln(string &s) {
  char *valid = gets(BUFFER);
  if (valid) s = BUFFER;
  return ((bool)valid);
}
void Print(long long &n, bool printNewLine = true) {
  printNewLine ? printf("%I64d\n", n) : printf("%I64d", n);
}
const int maxn = 500 + 5;
int dp[maxn][maxn];
bool a[maxn][maxn][8][16];
vector<string> s;
int getFractal(int i, int j) {
  int sum = 0;
  sum += 1 * (s[i][j] == '*');
  sum += 2 * (s[i][j + 1] == '*');
  sum += 4 * (s[i + 1][j] == '*');
  sum += 8 * (s[i + 1][j + 1] == '*');
  return sum;
}
bool isAllBlack(int x1, int y1, int x2, int y2) {
  int len = (x2 - x1 + 1) * (y2 - y1 + 1);
  len -= (dp[x2 + 1][y2 + 1] + dp[x1][y1] - dp[x1][y2 + 1] - dp[x2 + 1][y1]);
  return (len == 0);
}
bool isFractal(int x1, int y1, int step, int fr, int st) {
  int x, y;
  x = x1, y = y1;
  if ((((fr) & (1 << (0))) != 0)) {
    if (false == isAllBlack(x, y, x + step - 1, y + step - 1)) return false;
  } else {
    if (false == a[x][y][st][fr]) return false;
  }
  x = x1, y = y1 + step;
  if ((((fr) & (1 << (1))) != 0)) {
    if (false == isAllBlack(x, y, x + step - 1, y + step - 1)) return false;
  } else {
    if (false == a[x][y][st][fr]) return false;
  }
  x = x1 + step, y = y1;
  if ((((fr) & (1 << (2))) != 0)) {
    if (false == isAllBlack(x, y, x + step - 1, y + step - 1)) return false;
  } else {
    if (false == a[x][y][st][fr]) return false;
  }
  x = x1 + step, y = y1 + step;
  if ((((fr) & (1 << (3))) != 0)) {
    if (false == isAllBlack(x, y, x + step - 1, y + step - 1)) return false;
  } else {
    if (false == a[x][y][st][fr]) return false;
  }
  return true;
}
int calc() {
  int i, j, step, fr, st, n, m, ans = 0;
  cin >> n >> m;
  s.resize(n);
  for (i = 0; i < ((int)s.size()); ++i) cin >> s[i];
  for (i = 1; i < n + 1; ++i)
    for (j = 1; j < m + 1; ++j)
      dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] +
                 (s[i - 1][j - 1] == '*');
  for (i = 0; i < n - 1; ++i)
    for (j = 0; j < m - 1; ++j) a[i][j][0][getFractal(i, j)] = true;
  bool vis;
  vis = a[0][2][0][4];
  vis = a[0][4][0][4];
  vis = a[2][4][0][4];
  for (fr = 0; fr < 16; ++fr)
    for (st = 1; st < 8; ++st) {
      step = (1 << (st + 1));
      for (i = 0; i < n; ++i) {
        if (i + step > n) break;
        for (j = 0; j < m; ++j) {
          if (j + step > m) break;
          if (isFractal(i, j, (1 << (st)), fr, st - 1)) {
            a[i][j][st][fr] = true;
            ans++;
          }
        }
      }
    }
  return ans;
}
int main() {
  cout << calc() << endl;
  return 0;
}
