// Original C++ solution (slower):
#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;

}


// Optimized solution to the same problem (faster):
#include <iostream>

#include <algorithm>

#include <vector>

#define repeat(n) for (size_t i = 0; i < n; i++)

#define ull unsigned long long

#define vll vector<ull>

constexpr ull MOD = 10e8+7;



using namespace std;



ull mod_saberi(ull x, ull y)

{

	return (x % MOD + y % MOD) % MOD;

}

ull mod_pomnozi(ull x, ull y)

{

	return ((x % MOD) * (y % MOD)) % MOD;

}

bool je_paran(ull broj) { return !(broj & 1); }

ull brzo_stepenuj(ull osnova, ull exponent)

{

	if (exponent == 0)

		return 1;

	if (je_paran(exponent))

	{

		ull exp_pola = brzo_stepenuj(osnova, exponent / 2);

		return mod_pomnozi(exp_pola, exp_pola);

	}

	else

	{

		ull ostatak = osnova;

		ull exp_pola = brzo_stepenuj(osnova, (exponent - 1) / 2);

		return mod_pomnozi(ostatak, mod_pomnozi(exp_pola, exp_pola));

	}

}

ull n_choose_k(ull n_faktorijel, ull k_faktorijel, ull nk_faktorijel)

{

	return mod_pomnozi(n_faktorijel, brzo_stepenuj(mod_pomnozi(k_faktorijel, nk_faktorijel), MOD - 2));

}



vll broj_nacina_do_polja(ull polja_horizontalno, ull polja_vertikalno, int broj_polja)

{

	vll broj_nacina = vll(broj_polja);

	ull n_faktorijel = 1, k_faktorijel = 1, nk_faktorijel = 1;

	for (ull i = 1; i <= polja_horizontalno + polja_vertikalno; i++)

	{

		n_faktorijel = mod_pomnozi(n_faktorijel, i);

		if (i == (polja_vertikalno))

			nk_faktorijel = n_faktorijel;

		if (i == polja_horizontalno)

			k_faktorijel = n_faktorijel;

	}



	for (size_t i = 1; i <= broj_polja; i++)

	{

		broj_nacina[i - 1] = n_choose_k(n_faktorijel, k_faktorijel, nk_faktorijel);

		n_faktorijel = mod_pomnozi(n_faktorijel, polja_horizontalno + polja_vertikalno + i);

		nk_faktorijel = mod_pomnozi(nk_faktorijel, polja_vertikalno + i);

	}

	return broj_nacina;

}

int main()

{

	ios::sync_with_stdio(false);

	cin.tie(0);

	int H, W, A, B;

	cin >> H >> W >> A >> B;

	vll broj_nacina_desno = broj_nacina_do_polja(W - B - 1, A, H - A);

	reverse(broj_nacina_desno.begin(), broj_nacina_desno.end());

	vll broj_nacina_levo = broj_nacina_do_polja(B - 1, 0, H - A);

	ull ukupno_nacina = 0;

	for (size_t i = 0; i < broj_nacina_levo.size(); i++)

	{

		ukupno_nacina = mod_saberi(ukupno_nacina, mod_pomnozi(broj_nacina_levo[i], broj_nacina_desno[i]));

	}

	cout << ukupno_nacina << "\n";

	return 0;

}

// Fastest known solution for this problem: