// Slower C++ solution:
#include<bits/stdc++.h>



#define LL long long

#define RG register



using namespace std;

template<class T> inline void read(T &x) {

	x = 0; RG char c = getchar(); bool f = 0;

	while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;

	while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();

	x = f ? -x : x;

	return ;

}

template<class T> inline void write(T x) {

	if (!x) {putchar(48);return ;}

	if (x < 0) x = -x, putchar('-');

	int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;

	for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;

}

const int N = 200010, Mod = 1e9 + 7;

int fac[N], ifac[N], H, W, A, B;

int fpow(int a, int b) {

	int res = 1;

	for (; b; b >>= 1, a = 1ll * a * a % Mod)

		if (b & 1) res = 1ll * res * a % Mod;

	return res;

}

int C(int n, int m) {

	if (n < m) return 0;

	return 1ll * fac[n] * ifac[m] % Mod * ifac[n - m] % Mod;

}

int calc(int n, int m) {

	return C(n + m - 2, n - 1);

}

int main() {

	//freopen(".in", "r", stdin);

	//freopen(".out", "w", stdout);

	read(H), read(W), read(A), read(B);

	fac[0] = 1;

	for (int i = 1; i <= 200000; i++)

		fac[i] = 1ll * fac[i - 1] * i % Mod;

	ifac[200000] = fpow(fac[200000], Mod - 2);

	for (int i = 200000; i >= 1; i--)

		ifac[i - 1] = 1ll * ifac[i] * i % Mod;

	int ans = 0;

	for (int i = B + 1; i <= W; i++)

		(ans += 1ll * calc(H - A, i) * calc(A, W - i + 1) % Mod) %= Mod;

	printf("%d\n", ans);

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.5576042716615794x):
#include <bits/stdc++.h>



using namespace std;



long long options1[100010];

long long options2[100010];

long long moduo = 1e9 + 7;



long long fast_pow(long long n,long long k)

{

    if(k == 0) return 1;

    else

    {

        long long a = fast_pow(n,k/2)%moduo;

        if(k%2 == 0) return (a*a)%moduo;

        else return (((n*a)%moduo)*a)%moduo;

    }

}



void generate_opt1(int n,int m,int h,int w)

{

    options1[1] = 1;

    long long k = 2; /// bilo je ranije 1

    while(k <= n-h)

    {

        long long inverz = fast_pow(k-1,moduo-2)%moduo;

        /*if(options1[k] < 0)

        {

            cout<<options2[k]<<" "<<k<<" "<<inverz<<" __1"<<endl;

            system("PAUSE");

        }*/

        inverz%=moduo;

        options1[k] = (((options1[k-1]*(w+ k-1 +1-2))%moduo)*inverz)%moduo;

        options1[k] %= moduo;

        k++;

    }



    /*for(int i = 1; i <= n-h; i++)

    {

        cout<<"options1["<<i<<"]: "<<options1[i]<<endl;

    }*/

}



long long factoriel(long long a) /// treba da mod

{

    long long ret = 1;

    for(long long i = 1; i <= a; i++)

    {

        ret*=i;

        ret%=moduo;

    }



    return ret%moduo;

}



long long calculate_A_nad_B(long long a, long long b)

{

    if(a == b) return 1;

    long long ret = 0;

    long long pom1,pom2,pom3;

    //cout<<"a b "<<a<<" "<<b<<endl;

    pom1 = factoriel(a)%moduo; pom2 = factoriel(b)%moduo; pom3 = factoriel(a-b)%moduo; /// svuda si dodao %moduo

    //cout<<pom1<<" "<<pom2<<" "<<pom3<<endl;

    //cout<<"long_long_max"<<LONG_LONG_MAX<<endl;

    //ret = (pom1%moduo)*(fast_pow(pom2,moduo-2)%moduo)*(fast_pow(pom3,moduo-2)%moduo)%moduo; ///mnozenje inverzima zbog modula

    long long x = fast_pow(pom2,moduo-2)%moduo;

    long long y = fast_pow(pom3,moduo-2)%moduo;

    ret = (((pom1*x)%moduo)*y)%moduo;

    //cout<<ret<<endl;



    return ret%moduo;

}



void generate_opt2(int n,int m,int h,int w)

{

    long long d = m-w;

    long long k = h+1;

    long long br = k - 1;

    options2[k-br] = calculate_A_nad_B(k+d-2,k-1)%moduo; /// promenios sa opt od 1 na opt od k

    //cout<<"options2[1]: "<<options2[1]<<endl;



    k++; /// ovo si dodao

    while(k <= n)

    {

        //cout<<"k: "<<k<<endl;

        long long inverz = fast_pow(k-1,moduo-2)%moduo; ///umesto ka promenio si na k -1

        inverz%=moduo;

        //cout<<"k inverz1: "<<k<<" "<<inverz<<endl;

        options2[k -br] = (((options2[k-1 -br]*(d+ k-1 +1-2))%moduo)*inverz)%moduo; /// dodo si -br da bih ubacivao u niz pocevsi od indexa 1 , a ne od indexa k sto moze biti veliki br

        options2[k -br]%=moduo;

        /*if(options2[k - br] < 0)

        {

            cout<<options2[k - br]<<" "<<k<<" "<<inverz<<" __2"<<endl;

            system("PAUSE");

        }*/

        k++;

        //cout << "uso2"<<endl;

    }



    //for(int i = n-h; i>= 1; i--)

        //cout<<"options2["<<i<<"]: "<<options2[i]<<endl;

}



int main()

{

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);



    int n,m,h,w;

    cin>> n >> m >>h >> w;

    //cout<<fast_pow(n,m);



    generate_opt1(n,m,h,w);

    generate_opt2(n,m,h,w);



    long long res = 0;

    long long d = n-h;



    for(int i = 1; i <= d; i++)

    {

        long long pom1 = options1[i] % moduo;

        long long pom2 = options2[d-i+1] % moduo;

        long long pom3 = (pom1 * pom2) % moduo;

        res+= pom3;

        res%=moduo;

    }



    cout<< res;



    return 0;

}