#include<bits/stdc++.h>
using namespace std ;
	#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
	#define lli long long int
	#define ulli unsigned long long int
	#define ff first
	#define ss second
	#define mp make_pair
	#define pb push_back
	#define pf pop_front()
	#define lb lower_bound
	#define ub upper_bound
	#define bs binary_search
	#define rep(i,a,b) for(lli i=a;i<b;i++)
	#define repe(i,a,b) for(lli i=a;i<=b;i++)
	#define all(v) v.begin(), v.end()
	#define mod 1000000007
	#define inf 100000000000000000
	#define lld long double
	#define pll pair<long long int,long long int>
	#define pii pair<int,int>
	#define vll vector<lli>
	#define vii vector<int>
	#define endl '\n'
	#define pie  acosl(-1.0);
	#define setp(k, x) fixed << setprecision(k) << (x)
	#define deb(x) cerr << #x << ": " << x << " " << endl;
	#define debug(x) cout << "m here-" <<#x<<" ..."<<"\n";
	#define printa(a,n) for(lli i=0;i<n;i++) cout<<a[i]<<" "; cout<<"\n";
  #define printv(a) for(lli i=0;i<a.size();i++) cout<<a[i]<<" "; cout<<"\n";
	bool sortcol( const vector<lli>& v1, const vector<lli>& v2 ) //sort on basis of column //use- sort(vect.begin(), vect.end(),sortcol);
      { return v1[1] < v2[1]; }//[] o based indexing in column
	bool sortpair(const pair<lli, lli> &a, const pair<lli, lli> &b)
			{return a.second < b.second;}
	struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>

//////////////////////////////////////////////////////////////////////////////////////////////
void solve();
//////////////////////////////////////////////////////////////////////////////////////////////
string s[1001];
static lli dp[1001][1001];

lli recur(lli i, lli j)
{
  if(dp[i][j]!=-1)
    return dp[i][j];
  int f =0;

  if(i==0)
  {//debug(1)
    for(lli k = j ;k>=0;k--)
    {
      if(s[i][k]=='#')
      {  f=1;
        break;
      }
    }
    if(f==1)
    {  dp[i][j]=0;
      return dp[i][j];
    }
    else
    {  dp[i][j]=1;
        return dp[i][j];
      }
  }
  if(j==0)
  {//debug(2)
    for(lli k = i ;k>=0;k--)
    {
      if(s[k][j]=='#')
      {  f=1;
        break;
      }
    }
    if(f==1)
    {  dp[i][j]=0;
      return dp[i][j];
    }
    else
    {  dp[i][j]=1;
        return dp[i][j];
      }
  }

// deb(f)
  if(s[i][j]=='#')
  {  dp[i][j]=0;
    return dp[i][j];
  }
  else
  {
      lli a,b;
      if(dp[i-1][j]==-1)
        {
            a = recur(i-1,j);
            // deb(a)
        }
        else
          a = dp[i-1][j];
    if(dp[i][j-1]==-1)
      {
          b = recur(i,j-1);
          // deb(b)
      }
      else
        b = dp[i][j-1];
        // deb(i)
        // deb(j)
      dp[i][j]=(a%mod+b%mod)%mod;
     return  dp[i][j];
  }
}

int main ()
{
	// fastio
 	// lli  t;
 	// cin>>t;
 	// while(t--)
 	{
	solve();

 	}
}
///////////////////////////////////////////
void solve()
{
	lli n,i,d,a,b,c,j,k,m;
  cin>>n>>m;

  for(i=0;i<n;i++)
  {
    s[i]="";
  }
  // debug(1223)
  for(i=0;i<n;i++)
  {
    cin>>s[i];
  }


  memset(dp,-1,sizeof(dp));

//   for(i=0;i<n;i++)
// {  for(j=0;j<m;j++)
//     {
//       cout<<dp[i][j]<<" ";
//
//
//     }
//   cout<<"\n";
// }

  a = recur(n-1,m-1);
//
//   for(i=0;i<n;i++)
// {  for(j=0;j<m;j++)
//     {
//       cout<<dp[i][j]<<" ";
//
//
//     }
//   cout<<"\n";
// }
  // debug(1)
  cout<<a<<"\n";
}


Measured memory_bytes: 9216