#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define ll long long
ll mod = 1e9+7;
template<typename T>
using ordered_set = tree<
    T,
    null_type,
    less_equal<T>,          // less_equal<T> is used for multiset behavior
    rb_tree_tag,
    tree_order_statistics_node_update>;
template<typename T>
using ordered_multiset = tree<
    pair<T, int>,             // store value + unique ID
    null_type,
    less<pair<T, int>>,
    rb_tree_tag,
    tree_order_statistics_node_update>;
long long modPow(ll a,ll b){
    ll ans = 1;
    while(b>0){
        if(b&1) ans=(ans*a)%mod;
        b>>=1;
        a=(a*a)%mod;
    }
    return ans;
}
long long Pow(ll a,ll b){
    ll ans = 1;
    while(b>0){
        if(b&1) ans*=a;
        b>>=1;
        a*=a;
    }
    return ans;
}
void solve(){
    ll n ; cin >> n;
    vector<int>p(n);
    ordered_set<int> os_l,os_r;
    for(int i = 0;i< n;i++){
        cin >> p[i];
        os_r.insert(p[i]);
    }
    ll ans = 0;
    for(int i = 0;i < n ;i++){
        ll num = p[i];
        os_r.erase(os_r.find_by_order(os_r.order_of_key(p[i])));
        ll right =os_r.order_of_key(p[i]);
        ll left = os_l.order_of_key(p[i]);
        os_l.insert(p[i]);
        
        ans += (modPow(2,left)-1) *(modPow(2,right)-1);
        
        // ans += ((1<<left)-1)*((1<<right)-1);
        // cout<< left << ' ' << right<< endl;
        ans %= mod;
    }
    cout << ans << endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t; cin>> t;
    while(t--){
        solve();
    }
    return 0;
}