#include <iostream>
#include <sstream>
#include <cmath>
#include <algorithm>
#include <utility>
#include <functional>
#include <iomanip>
#include <typeinfo>
#include <iterator>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <tuple>
#include <map>
#include <set>
#include <numeric>
using namespace std;

#define repr(itr, bgn, end) for (ll itr = (ll)bgn; itr < (ll)end; ++itr)
#define rep(itr, end) repr(itr, 0, end)
#define reprrev(itr, bgn, end) for (ll itr = (ll)end - 1; itr >= (ll)bgn; --i)
#define reprev(itr, end) reprrev(itr, 0, end)
#define all(container) container.begin(), container.end()
#define sortall(container) sort(all(container))
#define yn(cond) cond ? (cout << "Yes" << endl) : (cout << "No" << endl)
#define YN(cond) cond ? (cout << "YES" << endl) : (cout << "NO" << endl)
#define LLONG_MAX numeric_limits<ll>::max()
#define INT_MAX numeric_limits<int>::max()

typedef long long       ll;
typedef struct edge_ { ll to; ll cost; } edge;
typedef vector<int>     vi;
typedef vector<ll>      vll;
typedef vector<double>  vd;
typedef vector<bool>    vb;
typedef vector<string>  vs;
typedef vector<char>    vc;
typedef vector<edge>    ve;
typedef pair<int, int>  pii;
typedef pair<ll, ll>    pll;
typedef vector<pii>     vpii;
typedef vector<pll>     vpll;
typedef vector<vll>		vvll;
typedef vector<vi>		vvi;
typedef vector<ve>      vve;
typedef vector<vc>		vvc;

constexpr double	PI = 3.14159265358979323846;
constexpr ll		INF = 1 << 15;
constexpr ll		MOD = (ll)1e9 + 7;
constexpr double	EPS = 1e-7;
constexpr int		dy4[4] = { 0, 1, 0, -1 };
constexpr int		dx4[4] = { 1, 0, -1, 0 };
constexpr int		dy8[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };
constexpr int		dx8[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };

template <int mod>
class modint {
private:
	long long num;
	modint set(int _num) { num = _num % mod; return *this; }

public:
	modint() { num = 0; }
	modint(int num) : num(num % mod) {}

	modint operator =  (const int& x) { return set(x % mod); }
	modint operator +  (const int& x) { return modint<mod>(num + (x % mod)); }
	modint operator -  (const int& x) { return modint<mod>(num - (x % mod)); }
	modint operator *  (const int& x) { return modint<mod>(num * (x % mod)); }
	modint operator /  (const int& x) { return modint<mod>(num / (x % mod)); }
	modint operator += (const int& x) { return set(num + (x % mod)); }
	modint operator -= (const int& x) { return set(num - (x % mod)); }
	modint operator *= (const int& x) { return set(num * (x % mod)); }

	friend ostream& operator << (ostream& os, const modint<mod>& x) {
		os << x.num;
		return os;
	}
};

template<typename T>
istream& operator >> (istream& is, vector<T>& vec) {
	for (T& x : vec) is >> x;
	return is;
}

template<typename T>
ostream& operator << (ostream& os, const vector<T>& vec) {
	for (const T& x : vec) os << x << " ";
	return os;
}

template<typename S, typename T>
istream& operator >> (istream& is, pair<S, T>& p) {
	is >> p.first >> p.second;
	return is;
}

template<typename S, typename T>
ostream& operator << (ostream& os, const pair<S, T>& p) {
	os << p.first << " " << p.second;
	return os;
}

/******************************************************************************/
/**********************         Don't make WA !!         **********************/
/******************************************************************************/

class Combination {
private:
	long long mod;
	vector<long long> table;
	vector<long long> invTable;

	long long mpow(long long a, long long n) {
		long long x = 1LL;
		for (; n > 0; n >>= 1, a = (a * a) % mod)
			x = (n & 1) ? (x * a) % mod : x;
		return x;
	}

	void compute(long long n) {
		table = vector<long long>(n + 1, 1);
		invTable = vector<long long>(n + 1, 1);
		for (long long i = 1LL; i < n + 1; i++) {
			table[i] = table[i - 1] * i % mod;
			invTable[i] = mpow(table[i], mod - 2);
		}
	}

public:
	Combination(long long n, long long mod = (long long)1e9 + 7) : mod(mod) { compute(n); }
	long long get(long long n, long long r) { return n < r ? 0 : (((invTable[n - r] * invTable[r]) % mod) * table[n]) % mod; }
};


int main()
{
	int h, w, a, b;
	cin >> h >> w >> a >> b;
	Combination com(h + w);
	ll sum = 0;
	for (int i = 0; i < h - a; i++) {
		sum = (sum + (com.get(b + i - 1, b - 1) * com.get((h - 1 - i) + w - b - 1, w - b - 1)) % MOD) % MOD;
	}

	cout << sum << endl;
	return 0;


	/*int n;
	cin >> n;
	vi a(n + 1);
	cin >> a;

	vi count(n + 1, 0);
	int l = -1, r, num;
	for (int i = 0; i < n + 1; i++) {
		if (count[a[i]] > 0) {
			num = a[i];
			break;
		}
		count[a[i]]++;
	}

	for (int i = 0; i < n + 1; i++)
		if (a[i] == num)
			if (l < 0) l = i + 1;
			else r = i + 1;

	Combination comb(n + 1);
	for (int k = 1; k <= n + 1; k++) {
		cout << comb.get(n + 1, k) - comb.get(l - 1 + n + 1 - r, k - 1) << endl;
	}*/


	return 0;
}

Measured memory_bytes: 3328