#include <bits/stdc++.h>
using namespace std;
int main() {
  int h, w;
  cin >> h >> w;
  vector<string> grid(h);
  for (int i = 0; i < h; ++i) {
    cin >> grid[i];
  }
  auto bfs = [&](int startx, int starty) {
    if (grid[startx][starty] == '.') return;
    queue<pair<int, int>> q;
    q.push({startx, starty});
    vector<string> temp = grid;
    temp[startx][starty] = '.';
    int count = 1;
    while (!q.empty()) {
      pair<int, int> current = q.front();
      q.pop();
      if (current.first >= 1) {
        if (temp[current.first - 1][current.second] == '#') {
          q.push({current.first - 1, current.second});
          temp[current.first - 1][current.second] = '.';
          count++;
        }
      }
      if (current.first < w - 1) {
        if (temp[current.first + 1][current.second] == '#') {
          q.push({current.first + 1, current.second});
          temp[current.first + 1][current.second] = '.';
          count++;
        }
      }
      if (current.second >= 1) {
        if (temp[current.first][current.second - 1] == '#') {
          q.push({current.first, current.second - 1});
          temp[current.first][current.second - 1] = '.';
          count++;
        }
      }
      if (current.second < h - 1) {
        if (temp[current.first][current.second + 1] == '#') {
          q.push({current.first, current.second + 1});
          temp[current.first][current.second + 1] = '.';
          count++;
        }
      }
    }
    if (count > 1) {
      grid = temp;
    }
  };
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (grid[i][j] == '#') {
        bfs(i, j);
      }
    }
  }
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (grid[i][j] == '#') {
        cout << "No" << endl;
        return 0;
      }
    }
  }
  cout << "Yes" << endl;
  return 0;
}
