#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

const i64 MOD = i64(1e9) + 7;
const i64 INF = i64(1e18) + 7;


template <typename T>
bool chmin(T& x, T y){
    if(x > y){
        x = y;
        return true;
    }
    return false;
}

template <typename T>
bool chmax(T& x, T y){
    if(x < y){
        x = y;
        return true;
    }
    return false;
}

template <i64 mod = MOD>
struct ModInt{
    i64 p;

    ModInt() : p(0){}
    ModInt(i64 x){p = x >= 0 ? x % mod : x + (-x + mod - 1) / mod * mod;}

    ModInt& operator+=(const ModInt& y){p = p + *y - ((p + *y) >= mod ? mod : 0); return *this;}
    ModInt& operator-=(const ModInt& y){p = p - *y + (p - *y < 0 ? mod : 0); return *this;}
    ModInt& operator*=(const ModInt& y){p = (p * *y) % mod; return *this;}
    ModInt& operator%=(const ModInt& y){if(y)p %= *y; return *this;}

    ModInt operator+(const ModInt& y) const{ModInt x = *this; return x += y;}
    ModInt operator-(const ModInt& y) const{ModInt x = *this; return x -= y;}
    ModInt operator*(const ModInt& y) const{ModInt x = *this; return x *= y;}
    ModInt operator%(const ModInt& y) const{ModInt x = *this; return x %= y;}

    friend ostream& operator<<(ostream& stream, const ModInt<mod>& x){
        stream << *x;
        return stream;
    }

    friend ostream& operator>>(ostream& stream, const ModInt<mod>& x){
        stream >> *x;
        return stream;
    }

    ModInt& operator++(){p = (p + 1) % mod; return *this;}
    ModInt& operator--(){p = (p - 1 + mod) % mod; return *this;}

    bool operator==(const ModInt& y) const{return p == *y;}
    bool operator!=(const ModInt& y) const{return p != *y;}

    const i64& operator*() const{return p;}
    i64& operator*(){return p;}

};

using mint = ModInt<>;


mint dp[64][2][2][2];

signed main(){
    i64 mi, ma;
    cin >> mi >> ma;

    dp[63][0][0][0] = 1;
    for(int i = 62; i >= 0; --i){
        // 1 << iを決める

        // flagがfalseな時は等しい


        // 0, 0で遷移
        dp[i][(ma >> i) & 1][1][0] += dp[i + 1][0][1][0];
        dp[i][(ma >> i) & 1][1][1] += dp[i + 1][0][1][1];
        dp[i][1][1][0] += dp[i + 1][1][1][0];
        dp[i][1][1][1] += dp[i + 1][1][1][1];
        // k=miなので、miの該当bitが立ってたら遷移できない
        if(!(mi & (1LL << i))){
            dp[i][(ma >> i) & 1][0][0] += dp[i + 1][0][0][0];
            dp[i][(ma >> i) & 1][0][1] += dp[i + 1][0][0][1];
            dp[i][1][0][0] += dp[i + 1][1][0][0];
            dp[i][1][0][1] += dp[i + 1][1][0][1];
        }

        // 1, 0で遷移
        // MSBが立ってないと遷移できない
        dp[i][1][1][1] += dp[i + 1][1][1][1];
        if(!(mi & (1LL << i)))
            dp[i][1][0][1] += dp[i + 1][1][0][1];
        if(ma & (1LL << i))
            dp[i][0][1][1] += dp[i + 1][0][1][1];
        if(!(mi & (1LL << i)) && (ma & (1LL << i)))
            dp[i][0][0][1] += dp[i + 1][0][0][1];

        // 1, 1で遷移
        dp[i][1][1][1] += dp[i + 1][1][1][0];
        dp[i][1][1][1] += dp[i + 1][1][1][1];
        dp[i][1][!(mi & (1LL << i))][1] += dp[i + 1][1][0][0];
        dp[i][1][!(mi & (1LL << i))][1] += dp[i + 1][1][0][1];
        // j=maなので、maの該当bitが立ってなかったら遷移できない
        if(ma & (1LL << i)){
            dp[i][0][1][1] += dp[i + 1][0][1][0];
            dp[i][0][1][1] += dp[i + 1][0][1][1];
            dp[i][0][!(mi & (1LL << i))][1] += dp[i + 1][0][0][0];
            dp[i][0][!(mi & (1LL << i))][1] += dp[i + 1][0][0][1];
        }
    }
    mint ans = 0;
    for(int i = 0; i < 2; ++i)
        for(int j = 0; j < 2; ++j)
            for(int k = 0; k < 2; ++k)
                ans += dp[0][i][j][k];
    cout << ans << endl;

}



Measured memory_bytes: 256