#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const double pi = acos(-1);
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  for (ll i = (0), __last_i = (v.size()); i < __last_i; i++) {
    if (i) os << " ";
    os << v[i];
  }
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<vector<T>>& v) {
  for (ll i = (0), __last_i = (v.size()); i < __last_i; i++) {
    if (i) os << endl;
    os << v[i];
  }
  return os;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int dx4[4] = {1, 0, -1, 0};
const int dy4[4] = {0, 1, 0, -1};
const int dx8[8] = {1, 1, 0, -1, -1, -1, 0, 1};
const int dy8[8] = {0, 1, 1, 1, 0, -1, -1, -1};
vector<vector<int>> Graph;
vector<int> value;
int main(int argc, const char* argv[]) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int H, W;
  cin >> H >> W;
  vector<string> field(H);
  for (ll i = (0), __last_i = (H); i < __last_i; i++) cin >> field[i];
  bool isAns = true;
  int count = 0;
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      int nowH = i;
      int nowW = j;
      if (field[nowH][nowW] != '#') continue;
      count++;
      bool ispart = false;
      for (ll k = (0), __last_k = (4); k < __last_k; k++) {
        int newH = nowH + dx4[k];
        int newW = nowW + dy4[k];
        if (!(0 <= newH && newH < H && 0 <= newW && newW < W)) continue;
        if (field[newH][newW] == '#') ispart = true;
      }
      if (!ispart) isAns = false;
      ispart = false;
    }
  }
  if (isAns && count)
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
}
