
import std.algorithm;
import std.conv;
import std.stdio;
import std.string;

void main()
{
	auto hw = readln.split.map!( to!byte );
	auto s = new string[ hw[ 0 ] ];
	foreach( ref sl; s )
	{
		sl = readln.strip;
	}
	
	writeln( solve( hw[ 0 ], hw[ 1 ], s ) );
}

string solve( in byte h, in byte w, in string[] s )
{
	bool[][] r;
	
	r.length = h;
	foreach( ref rl; r )
	{
		rl.length = w;
	}
	
	foreach( y; 0 .. h )
	{
		foreach( x; 0 .. w )
		{
			if( s[ y ][ x ] == '#' )
			{
				if( y + 1 < h && s[ y + 1 ][ x ] == '#' )
				{
					r[ y + 1 ][ x ] = true;
					r[ y ][ x ] = true;
				}
				if( x + 1 < w && s[ y ][ x + 1 ] == '#' )
				{
					r[ y ][ x + 1 ] = true;
					r[ y ][ x ] = true;
				}
				if( r[ y ][ x ] == false ) return "No";
			}
		}
	}
	
	return "Yes";
}

unittest
{
	assert( solve( 3, 3, [ ".#.", "###", ".#." ] ) == "Yes" );
	assert( solve( 5, 5, [ "#.#.#", ".#.#.", "#.#.#", ".#.#.", "#.#.#" ] ) == "No" );
	assert( solve( 11, 11, [ "...#####...", ".##.....##.", "#..##.##..#", "#..##.##..#", "#.........#", "#...###...#", ".#########.", ".#.#.#.#.#.", "##.#.#.#.##", "..##.#.##..", ".##..#..##." ] ) == "Yes" );
	assert( solve( 4, 3, [ "##.", ".##", "##.", ".##" ] ) == "Yes" );
}
