#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<string>
#include<stack>
#include<cstdio>
#include<cmath>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> P;
typedef pair<int,P> P1;

#define fr first
#define sc second
#define mp make_pair
#define pb push_back
#define rep(i,x) for(int i=0;i<x;i++)
#define rep1(i,x) for(int i=1;i<=x;i++)
#define rrep(i,x) for(int i=x-1;i>=0;i--)
#define rrep1(i,x) for(int i=x;i>0;i--)
#define sor(v) sort(v.begin(),v.end())
#define rev(s) reverse(s.begin(),s.end())
#define lb(vec,a) lower_bound(vec.begin(),vec.end(),a)
#define ub(vec,a) upper_bound(vec.begin(),vec.end(),a)
#define uniq(vec) vec.erase(unique(vec.begin(),vec.end()),vec.end())
#define mp1(a,b,c) P1(a,P(b,c))

const int INF=1000000000;
const int dir_4[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
const int dir_8[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};

const ll M = 1000000007;

int main(){
	static ll n,a,b;
	static ll s[100010];
	scanf("%lld%lld%lld",&n,&a,&b);
	rep1(i,n)scanf("%lld",&s[i]);
	if(a>b)swap(a,b);
	
	for(int i = 1 ; i+2 <= n ; i ++){
		if(s[i+2]-s[i] < a){
			puts("0");
			return 0;
		}
	}
	static int l[100010],r[100010];
	rep1(i,n){
		l[i] = -1;
		if(i>1&&s[i]-s[i-1]<a){
			if(l[i-1] == -1){
				l[i] = l[i-1] = i-1;
			}
			else {
				l[i] = l[i-1];
			}
		}
	}
	rrep1(i,n){
		r[i] = -1;
		if(i<n&&s[i+1]-s[i]<a){
			if(r[i+1] == -1){
				r[i] = r[i+1] = i+1;
			}
			else {
				r[i] = r[i+1];
			}
		}
	}
	/*rep1(i,n){
		cout << l[i] << " " << r[i] << endl;
	}*/
	//return 0;
	s[0] = -1000000000000000000;
	
	ll dp[100010] = {},sum[100010] = {};
	int L = 0;
	int K = 0;
	dp[0] = 1;
	rep(i,100010)sum[i] = 1;
	rep1(i,n){
		if(l[i] == -1){
			while(K+1 <= i && s[i]-s[K+1] >= b)K ++;
			dp[i] = sum[K]-sum[L]+dp[L]+M;
			while(dp[i] >= M)dp[i] -= M;
			sum[i] = sum[i-1]+dp[i];
			if(sum[i] >= M)sum[i] -= M;
		}
		else {
			if((r[i]-l[i])&1){
				while(K+1 <= i && s[i]-s[K+1] >= b)K ++;
				dp[r[i]-1] = sum[K]-sum[L]+dp[L]+M;
				while(dp[r[i]-1] >= M)dp[r[i]-1] -= M;
				while(K+1 <= i+1 && s[i+1]-s[K+1] >= b)K ++;
				dp[r[i]] = sum[K]-sum[L]+dp[L]+M;
				while(dp[r[i]] >= M)dp[r[i]] -= M;
				for(int j = l[i] ; j+2 <= r[i] ; j += 2){
					if(s[j+2]-s[j]<b)dp[r[i]-1] = 0;
				}
				for(int j = l[i]+1 ; j+2 <= r[i] ; j += 2){
					if(s[j+2]-s[j]<b)dp[r[i]] = 0;
				}
			}
			else {
				while(K+1 <= i && s[i]-s[K+1] >= b)K ++;
				dp[r[i]] = sum[K]-sum[L]+dp[L]+M;
				while(dp[r[i]] >= M)dp[r[i]] -= M;
				while(K+1 <= i+1 && s[i+1]-s[K+1] >= b)K ++;
				dp[r[i]-1] = sum[K]-sum[L]+dp[L]+M;
				while(dp[r[i]-1] >= M)dp[r[i]-1] -= M;
				for(int j = l[i] ; j+2 <= r[i] ; j += 2){
					if(s[j+2]-s[j]<b)dp[r[i]] = 0;
				}
				for(int j = l[i]+1 ; j+2 <= r[i] ; j += 2){
					if(s[j+2]-s[j]<b)dp[r[i]-1] = 0;
				}
			}
			L = r[i]-1;
			K = r[i]-2;
			dp[r[i]-2] = 0;
			sum[r[i]-2] = 0;
			sum[r[i]-1] = dp[r[i]-1];
			sum[r[i]] = dp[r[i]]+dp[r[i]-1];
			if(sum[r[i]]>=M)sum[r[i]] -= M;
			i = r[i];
		}
		/*cout << i << endl;
		rep(i,n+1){
			cout << dp[i] << " ";
		}cout << endl;
		rep(i,n+1){
			cout << sum[i] << " ";
		}cout << endl;*/
	}
	
	static ll ret = sum[n]-sum[L]+dp[L]+M;
	cout << ret%M << endl;
}


Measured memory_bytes: 3328