#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;
}