#include <bits/stdc++.h>
using namespace std;

#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define rep3(i,m,n) for(int (i)=m;(i)<=(n);(i)++)
#define rep3rev(i,m,n) for(int (i)=m;(i)>=(n);(i)--)
#define all(a) (a.begin()),(a.end())
#define rall(a) (a.rbegin()),(a.rend())
#define fi first
#define se second
#define pb push_back
#define eb emplace_back

using ll = long long;
using vll = vector<ll>;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using P = pair<int, int>;
using LD = long double;

template <typename T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; }
template <typename T> bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; } return false; }
template <typename T> void coutall(T v) { if(v.empty()){cout << endl; return;} for(auto i = v.begin(); i != --v.end(); i++){cout << *i << " ";} cout << *--v.end() << endl; }
template <typename T> void DEBUGall(T v) { if(v.empty()){cerr << endl; return;} for(auto i = v.begin(); i != --v.end(); i++){cerr << *i << " ";} cerr << *--v.end() << endl; }
inline void IN(void){ return; }
template <typename First, typename... Rest> void IN(First& first, Rest&... rest){ cin >> first; IN(rest...); return; }
inline void OUT(void){ cout << "\n"; return; }
template <typename First, typename... Rest> void OUT(First first, Rest... rest){ cout << first << " "; OUT(rest...); return; }
inline void DEBUG(void){ cerr << "\n"; return; }
template <typename First, typename... Rest> void DEBUG(First first, Rest... rest){ cerr << first << " "; DEBUG(rest...); return; }

void yes(bool ok = true){ cout << (ok ? "yes" : "no") << endl; }
void Yes(bool ok = true){ cout << (ok ? "Yes" : "No") << endl; }
void YES(bool ok = true){ cout << (ok ? "YES" : "NO") << endl; }
ll myceil(ll a, ll b) { return a >= 0 ? (a+b-1)/b : -((-a)/b); }
ll myfloor(ll a, ll b) { return a >= 0 ? a/b : -myceil(-a, b); }

void Main(){
    int h, w, x, y; IN(h, w, x, y);
    x--; y--;
    vector<string> s(h);
    rep(i, h) cin >> s[i];
    int ans = 1;
    rep3(i, x, x){
        rep3(j, y+1, w-1){
            if(s[i][j] == '.') ans++;
            else break;
        }
        rep3rev(j, y-1, 0){
            if(s[i][j] == '.') ans++;
            else break;
        }
    }
    rep3(j, y, y){
        rep3(i, x+1, h-1){
            if(s[i][j] == '.') ans++;
            else break;
        }
        rep3rev(i, x-1, 0){
            if(s[i][j] == '.') ans++;
            else break;
        }
    }
    OUT(ans);
    return;
}

int main(){
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    cout << fixed << setprecision(15);
    Main();
    return 0;
}
#include<bits/stdc++.h>
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ll long long
#define ii pair<ll,ll>
#define vi vector<ll>
#define vii vector<ii>
#define INF 1000000000
#define endl '\n'
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); 
using namespace std;
#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>
#define ordered_multiset tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update>
 ll nni[2000005],fni[2000005],fact[2000005];
 const ll md=1e9+7;
 void ion()
{
  nni[0]=nni[1]=1;
  for(int i=2;i<2000005;i++)
  {
    nni[i]=nni[md%i]*(md-md/i)%md;
  }
}
void iof()
{
   fni[0]=fni[1]=1;
   for(int i=2;i<2000005;i++)
   {
     fni[i]=(nni[i]*fni[i-1])%md;
   }
}
void fac()
{
  fact[0]=1;
  for(int i=1;i<2000005;i++)
  {
    fact[i]=(fact[i-1]*i)%md;
  }
}
int main(){
	IOS
	ll t;
	t=1;
	ion();
  iof();
  fac();
	while(t--)
	{
      ll w,b,k;
	  cin>>w>>b>>k;
	  if(w>b+k){cout<<"0"<<"\n";return 0;}
	  ll to=(((fact[w+b]*fni[w-(k+1)])%md)*fni[b+k+1])%md;
	  ll ans=(((((fact[w+b]*fni[w])%md)*fni[b])%md)-to+md)%md;
	  cout<<ans<<"\n";


	}

return 0;
}