#include<bits/stdc++.h>
#define LIM 203000
#define mod 1000000007
#define ll long long int
using namespace std;
int tlef[LIM],trig[LIM],lef[LIM],rig[LIM];
int arr[LIM],mm;
map<int,int>inv;
ll po(ll a,ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1)
			ans=(ans*a)%mod;
		a=(a*a)%mod;
		b=b>>1;
	}
	return ans;
}
void compress(int n)
{
	int i,c=0,j;
	map<int,int>mp;
	map<int,int>::iterator it;
	for(i=1;i<=n;i++)
		mp[arr[i]]++;
	for(it=mp.begin();it!=mp.end();it++)
	{
		c+=mp[it->first];
		mp[it->first]=c;
	}
	vector<pair<int,int> >vv;
	for(i=n;i>=1;i--)
	{
		mp[arr[i]]--;
		inv[mp[arr[i]]+1]=arr[i];
		arr[i]=mp[arr[i]]+1;
		mm=max(mm,arr[i]);
		vv.push_back(make_pair(arr[i],i));
	}
	set<int>ind;
	set<int>::iterator it2;
	sort(vv.begin(),vv.end());
	for(i=n-1;i>=0;i--)
	{
		int inn=vv[i].second;
		it2=ind.lower_bound(inn);
		if(it2!=ind.end())
		{
			rig[inn]=(*it2);
		}
		if(it2!=ind.begin())
		{
			it2--;
			lef[inn]=*it2;
		}
		ind.insert(inn);
	}	
}
ll ways[LIM],pres[LIM],presf[LIM],sq[LIM];
int main()
{
	int n,i;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&arr[i]);
	for(i=0;i<LIM;i++)
	{
		tlef[i]=INT_MAX;
		rig[i]=n+1;
		presf[i]=i;
		sq[i]=((ll)i*i)%mod;
		pres[i]=((ll)i*(i+1)/2)%mod;
		if(i)
		{
			sq[i]=(sq[i]+sq[i-1])%mod;
			pres[i]=(pres[i]+pres[i-1])%mod;
			presf[i]=(presf[i]+presf[i-1])%mod;
		}
	}
	compress(n);
	for(i=1;i<=n;i++)
	{
		tlef[arr[n-i+1]]=n-i+1;
		trig[arr[i]]=i;
	}
	for(i=LIM-2;i>=0;i--)
	{
		tlef[i]=min(tlef[i],tlef[i+1]);
		trig[i]=max(trig[i],trig[i+1]);
	}
	for(i=1;i<=n;i++)
	{
		int ele=arr[i];
		if(ele==mm)
		{
			ll ww=((long long int)n*(n+1)/2)%mod,riga=n-i+1,liga=i-1+1,last=0;
			ww=(ww*(ww+1))%mod;
			ww=(ww*po(2,mod-2))%mod;
			ways[ele]=ww;
			for(int curr=1;curr<=n;curr++)
			{
				liga=max(0LL,liga-1);
				riga=max(0LL,riga-1);
				ways[ele]=(ways[ele]+mod-(liga*(liga+1)/2)%mod)%mod;
				ways[ele]=(ways[ele]+mod-(riga*(riga+1)/2)%mod)%mod;
				ways[ele]=(ways[ele]+mod-(liga*last)%mod)%mod;
				last=riga;
			}
			continue;
		}
		long long int l=i-lef[i]-1,r=rig[i]-i-1,_l=0,_r=0;
		if(lef[i]==0)	_l=n-trig[arr[i]+1];
		if(rig[i]==n+1)	_r=tlef[arr[i]+1]-1;
		long long int m,tlen=l+r+1,curr=1;
		ways[ele]=((l+1)*(r+1))%mod;
		if(_r)
		ways[ele]=((l+1)*(r+_r))%mod;
		for(curr=2;curr<=tlen;curr++)
		{
			if(curr<=min(l,r)+1)
			{
				m=curr;
				int st=curr,en=min(l,r)+1;
				ways[ele]=(ways[ele]+(pres[en]-pres[st-1]+mod))%mod;
				ways[ele]=(ways[ele]+((l+1)*(r+1)%mod)*(en-st+1)%mod)%mod;
				ways[ele]=(ways[ele]+mod-(sq[en]-sq[st-1]+mod)%mod)%mod;
				curr=en;
			}
			else if(curr<=max(l,r)+1)
			{
				m=min(l,r)+1;
				int st=curr,en=max(l,r)+1;
				if(l==min(l,r))
				{
					ways[ele]=(ways[ele]+((m*(m+1)/2+m*(r+1))%mod*(en-st+1))%mod)%mod;
					ways[ele]=(ways[ele]+mod-m*(presf[en]-presf[st-1]+mod)%mod)%mod;
				}
				else
				{
					ways[ele]=(ways[ele]+((m*(m+1)/2+m*(l+1))%mod*(en-st+1))%mod)%mod;
					ways[ele]=(ways[ele]+mod-m*(presf[en]-presf[st-1]+mod)%mod)%mod;
				}
				curr=en;
			}
			else
			{
				m=tlen-curr+1;
				int st=1,en=tlen-curr+1;
				ways[ele]=(ways[ele]+(pres[en]-pres[st-1]+mod)%mod)%mod;
				curr=tlen;
			}
		}
		if(_l!=0)
		{
			for(curr=2;curr<=tlen&&(_l>=(curr-1));curr++)
			{
				if(curr<=min(l,r)+1)
				{
					m=curr;
					int st=curr,en=min(min(l,r)+1,_l+1);
					ways[ele]=(ways[ele]+((_l+2)*(r+1)%mod)*(en-st+1)%mod)%mod;
					ways[ele]=(ways[ele]+mod-(r+1)*(presf[en]-presf[st-1]+mod)%mod)%mod;
					curr=en;
				}
				else if(curr<=max(l,r)+1)
				{
					m=min(l,r)+1;
					int st=curr,en=min(max(l,r)+1,_l+1);
					ways[ele]=(ways[ele]+(m*(_l+2)%mod)*(en-st+1)%mod)%mod;
					ways[ele]=(ways[ele]+(mod-m*(presf[en]-presf[st-1])%mod)%mod)%mod;
					if(l==min(l,r))
					{
						ways[ele]=(ways[ele]+(_l+2)*(r+1)%mod*(en-st+1)%mod)%mod;
						ways[ele]=(ways[ele]+sq[en]-sq[st-1]+mod)%mod;
						ways[ele]=(ways[ele]+mod-(_l+r+3)*(presf[en]-presf[st-1]+mod)%mod)%mod;
					}
					curr=en;
				}
				else
				{
					m=tlen-curr+1;
					int st=curr,en=min(tlen,_l+1);
					ways[ele]=(ways[ele]+((ll)(tlen+1)*(_l+2)%mod)*(en-st+1)%mod);
					ways[ele]=(ways[ele]+(sq[en]-sq[st-1])%mod)%mod;
					ways[ele]=(ways[ele]+mod-(tlen+_l+3)*(presf[en]-presf[st-1]+mod)%mod)%mod;
					curr=en;
				}
			}
		}
		else if(_r!=0)
		{
			for(curr=2;curr<=tlen&&(_r>=(curr+1));curr++)
			{
				if(curr<=min(l,r)+1)
				{
					m=curr;
					int st=curr,en=min(min(l,r)+1,_r-1);
					ways[ele]=(ways[ele]+((l+1)*(_r)%mod)*(en-st+1)%mod)%mod;
					ways[ele]=(ways[ele]+mod-(l+1)*(presf[en]-presf[st-1]+mod)%mod)%mod;
					curr=en;
				}
				else if(curr<=max(l,r)+1)
				{
					m=min(l,r)+1;
					int st=curr,en=min(max(l,r)+1,_r-1);
					ways[ele]=(ways[ele]+(m*(_r)%mod)*(en-st+1)%mod)%mod;
					ways[ele]=(ways[ele]+(mod-m*(presf[en]-presf[st-1])%mod)%mod)%mod;
					if(r==min(l,r))
					{
						ways[ele]=(ways[ele]+(l+1)*(_r)%mod*(en-st+1)%mod)%mod;
						ways[ele]=(ways[ele]+sq[en]-sq[st-1]+mod)%mod;
						ways[ele]=(ways[ele]+mod-(l+_r+1)*(presf[en]-presf[st-1]+mod)%mod)%mod;
					}
					curr=en;
				}
				else
				{
					m=tlen-curr+1;
					int st=curr,en=min(tlen,_r-1);
					ways[ele]=(ways[ele]+((ll)(tlen+1)*(_r)%mod)*(en-st+1)%mod);
					ways[ele]=(ways[ele]+(sq[en]-sq[st-1])%mod)%mod;
					ways[ele]=(ways[ele]+mod-(tlen+_r+1)*(presf[en]-presf[st-1]+mod)%mod)%mod;
					curr=en;
				}
			}
		}
             assert(ways[ele]>=0);
	}
	ll ans=0;
	for(i=0;i<LIM;i++)
    {
   if(inv.find(i)!=inv.end())
		ans=(ans+ways[i]*inv[i])%mod;
    }
	printf("%lld\n",ans);
	return 0;
}