#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pf push_front
#define iter(v, i) for (__typeof__((v).begin()) i = (v).begin(); i != (v).end(); i++)
#define fast_io_without_cstdio ios_base::sync_with_stdio(false), cin.tie(NULL)
#define all(v) (v).begin(), (v).end()

#ifdef __linux__
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc getchar
#define pc putchar
#endif

#if __cplusplus <= 199711L
template<class BidirIt>
BidirIt prev(BidirIt it, typename iterator_traits<BidirIt>::difference_type n = 1) {
    advance(it, -n);
    return it;
}

template<class ForwardIt>
ForwardIt next(ForwardIt it, typename iterator_traits<ForwardIt>::difference_type n = 1) {
    advance(it, n);
    return it;
}
#endif

typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;

const double EPS = 1e-9;
const double PI = 3.141592653589793238462;

template<typename T>
inline T sq(T a) { return a * a; }

const int MAXN = 1e5 + 5;
const int MOD = 1e9 + 7;
const ll INF = 1e18 + 5;
const int LOGN = 19;

inline void add_mod(int &a, int b) {
    a += b;
    if (a >= MOD) a -= MOD;
}

int dp[MAXN][2];
int lg[MAXN];
ll s[MAXN], AB[2];
ll spt[MAXN][LOGN];

ll query(int a, int b) {
    if (a > b) return INF;
    int log = lg[b - a + 1];
    return min(spt[a][log], spt[b - (1 << log) + 1][log]);
}

int main() {
    lg[1] = 0;
    for (int i = 2; i < MAXN; i++)
        lg[i] = lg[i >> 1] + 1;
    //freopen("", "rt", stdin);
    //freopen("", "wt", stdout);
    int n;
    scanf("%d %lld %lld", &n, &AB[0], &AB[1]);
    s[0] = -INF;
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &s[i]);
        spt[i][0] = s[i] - s[i-1];
    }
    for (int j = 1; (1 << j) <= n; j++) {
        for (int i = 1; i + (1 << j) - 1 <= n; i++)
            spt[i][j] = min(spt[i][j-1], spt[i + (1 << (j - 1))][j-1]);
    }
    dp[0][0] = dp[0][1] = 1;
    for (int i = 1; i <= n; i++) {
        for (int opt = 0; opt <= 1; opt++) {
            if (s[i] - s[i-1] >= AB[opt])
                add_mod(dp[i][opt], dp[i-1][opt]);
            int lo = 1, hi = i-1, j = i-1;
            while (lo <= hi) {
                int mid = (lo + hi) >> 1;
                if (query(mid + 1, i - 1) >= AB[opt ^ 1]) {
                    j = mid;
                    hi = mid-1;
                } else
                    lo = mid+1;
            }
            lo = max(1, j), hi = i-1, j = -1;
            while (lo <= hi) {
                int mid = (lo + hi) >> 1;
                if (s[i] - s[mid-1] >= AB[opt]) {
                    j = mid;
                    lo = mid+1;
                } else
                    hi = mid-1;
            }
            if (j != -1)
                add_mod(dp[i][opt], dp[j][opt ^ 1]);
            /*
            ll last = INF;
            for (int j = i-1; j >= 1; j--) {
                if (last - s[j] < AB[opt ^ 1]) break;
                last = s[j];
                if (s[i] - s[j-1] >= AB[opt]) {
                    dp[i][opt] += dp[j][opt ^ 1];
                    break;
                }
            }
            */
        }
    }
    printf("%d\n", (dp[n][0] + dp[n][1]) % MOD);
    return 0;
}





Measured memory_bytes: 17152