#include <bits/stdc++.h>
using namespace std;
long long p9 = 998244353;
long long p1 = 1000000007;
vector<long long> kai;
vector<long long> inv_kai;
vector<long long> inv;
long long root(long long x, vector<long long>& pa) {
  if (pa[x] == -1) {
    return x;
  }
  long long ans = root(pa[x], pa);
  pa[x] = ans;
  return ans;
}
bool mar(long long x, long long y, vector<long long>& pa) {
  x = root(x, pa);
  y = root(y, pa);
  if (x != y) {
    pa[x] = y;
  }
  return (x != y);
}
long long gcd(long long x, long long y) {
  if (x < y) {
    return gcd(y, x);
  }
  if (y == 0) {
    return x;
  }
  return gcd(y, x % y);
}
long long lcm(long long x, long long y) {
  x = abs(x);
  y = abs(y);
  return x * (y / gcd(x, y));
}
long long modinv(long long a, long long m) {
  long long b = m, u = 1, v = 0;
  while (b) {
    long long t = a / b;
    a -= t * b;
    swap(a, b);
    u -= t * v;
    swap(u, v);
  }
  u %= m;
  if (u < 0) u += m;
  return u;
}
void make_inv(long long max_inv, long long p) {
  inv = vector<long long>(max_inv + 1, 1);
  for (long long i = 2; i <= max_inv; i++) {
    inv[i] = p - ((p / i) * inv[p % i]) % p;
  }
}
void make_kai(long long max_kai, long long p) {
  kai = vector<long long>(max_kai + 1, 1);
  inv_kai = kai;
  make_inv(max_kai, p);
  for (long long i = 0; i < max_kai; i++) {
    kai[i + 1] = kai[i] * (i + 1);
    kai[i + 1] %= p;
    inv_kai[i + 1] = inv_kai[i] * inv[i + 1];
    inv_kai[i + 1] %= p;
  }
}
long long com(long long n, long long r, long long p) {
  if ((n < 0) || (r < 0) || (r > n)) {
    return 0;
  }
  long long ans = (kai[n] * inv_kai[r]) % p;
  return (ans * inv_kai[n - r]) % p;
}
long long per(long long n, long long r, long long p) {
  if ((n < 0) || (r < 0) || (r > n)) {
    return 0;
  }
  return (kai[n] * inv_kai[n - r]) % p;
}
vector<long long> uni(vector<long long> x) {
  if (x.size() == 0) {
    return x;
  }
  sort(x.begin(), x.end());
  long long n = x.size();
  vector<long long> ans(1, x[0]);
  for (long long j = 1; j < n; j++) {
    if (x[j - 1] != x[j]) {
      ans.push_back(x[j]);
    }
  }
  x = ans;
  return x;
}
vector<long long> dijk(vector<vector<pair<long long, long long>>>& way,
                       long long st, long long inf) {
  long long n = way.size();
  vector<long long> dist(n, inf);
  dist[st] = 0;
  priority_queue<pair<long long, long long>, vector<pair<long long, long long>>,
                 greater<pair<long long, long long>>>
      pq;
  pq.push(make_pair(0, st));
  vector<bool> is_checked(n, false);
  while (!pq.empty()) {
    pair<long long, long long> x = pq.top();
    pq.pop();
    long long pot = x.second;
    if (!is_checked[pot]) {
      is_checked[pot] = true;
      for (auto y : way[pot]) {
        long long nex_dist = x.first + y.second;
        long long nex_pot = y.first;
        if (dist[nex_pot] > nex_dist) {
          dist[nex_pot] = nex_dist;
          pq.push(make_pair(nex_dist, y.first));
        }
      }
    }
  }
  return dist;
}
void make_tree(vector<vector<long long>>& chi, vector<long long>& par,
               long long n) {
  vector<vector<pair<long long, long long>>> way(n);
  for (long long i = 0; i < n - 1; i++) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    way[a].push_back(make_pair(b, 1));
    way[b].push_back(make_pair(a, 1));
  }
  vector<long long> dist = dijk(way, 0, n + 1);
  par = vector<long long>(n, -1);
  chi = vector<vector<long long>>(n);
  for (long long i = 0; i < n; i++) {
    for (auto nex : way[i]) {
      long long pot = nex.first;
      if (dist[pot] > dist[i]) {
        chi[i].push_back(pot);
      } else {
        par[i] = pot;
      }
    }
  }
}
void pri(vector<long long>& v) {
  if (v.size() == 0) {
    return;
  }
  cout << v[0];
  for (long long i = 0; i < v.size() - 1; i++) {
    cout << " " << v[i + 1];
  }
  cout << "\n";
  return;
}
long long modpow(long long a, long long n, long long p) {
  if (n == 0) {
    return 1;
  }
  long long m = n / 2;
  long long x = modpow(a, n / 2, p);
  x *= x;
  x %= p;
  if (n % 2 == 1) {
    x *= a;
    x %= p;
  }
  return x;
}
vector<vector<long long>> disj_min(vector<long long>& v) {
  long long n = v.size();
  vector<vector<long long>> ret(22, vector<long long>(n));
  ret[0] = v;
  for (long long i = 0; i < 21; i++) {
    for (long long j = 0; j < n; j++) {
      long long nex = j + (1 << i);
      if (nex < n) {
        ret[i + 1][j] = min(ret[i][j], ret[i][nex]);
      } else {
        ret[i + 1][j] = ret[i][j];
      }
    }
  }
  return ret;
}
long long find_min(vector<vector<long long>>& dv, long long l, long long r) {
  long long i = 21;
  while (l + (1 << i) > r) {
    i--;
  }
  while (i >= 0) {
    if (dv[i][l] > dv[i][r - (1 << i)]) {
      l = r - (1 << i);
    } else {
      r = l + (1 << i);
    }
    i--;
  }
  return l;
}
void sol(vector<string>& t, long long i, string u) {
  t.push_back(u);
  if (i < u.size()) {
    sol(t, i + 1, u);
    u[i] = '.';
    sol(t, i + 1, u);
  }
}
vector<vector<pair<long long, long long>>> dbl(
    vector<pair<long long, long long>>& v) {
  vector<vector<pair<long long, long long>>> ans(
      20, vector<pair<long long, long long>>(v));
  long long n = v.size();
  for (long long i = 0; i < 19; i++) {
    for (long long j = 0; j < n; j++) {
      ans[i + 1][j].first = ans[i][ans[i][j].first].first;
      ans[i + 1][j].second =
          max(ans[i][j].second, ans[i][ans[i][j].first].second);
    }
  }
  return ans;
}
long long lca(long long s, long long t, long long diff,
              vector<vector<pair<long long, long long>>>& pa) {
  if (diff < 0) {
    return lca(t, s, -diff, pa);
  }
  long long ans = 0;
  for (long long i = 0; i < 19; i++) {
    if ((diff & (1 << i)) != 0) {
      ans = max(ans, pa[i][s].second);
      s = pa[i][s].first;
    }
  }
  for (long long i = 19; i >= 0; i--) {
    if (pa[i][s] != pa[i][t]) {
      ans = max(ans, pa[i][s].second);
      s = pa[i][s].first;
      ans = max(ans, pa[i][t].second);
      t = pa[i][t].first;
    }
  }
  if (s != t) {
    ans = max(ans, pa[0][s].second);
    ans = max(ans, pa[0][t].second);
  }
  return ans;
}
void alp(long long n, vector<long long>& pr) {
  for (long long i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      pr.push_back(i);
      while (n % i == 0) {
        n /= i;
      }
    }
  }
  if (n != 1) {
    pr.push_back(n);
  }
}
vector<long long> dx = {0, 0, -1, 1};
vector<long long> dy = {1, -1, 0, 0};
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  ;
  long long h, w;
  cin >> h >> w;
  vector<string> s(h);
  for (long long i = 0; i < h; i++) {
    cin >> s[i];
  }
  for (long long i = 0; i < h; i++) {
    for (long long j = 0; j < w; j++) {
      if (s[i][j] == '#') {
        bool fl = false;
        for (long long k = 0; k < 4; k++) {
          long long di = i + dx[k];
          long long dj = j + dy[k];
          if (s[di][dj] == '#') {
            fl = true;
            break;
          }
        }
        if (!fl) {
          cout << "No"
               << "\n";
          return 0;
        }
      }
    }
  }
  cout << "Yes"
       << "\n";
  return 0;
}
