#include <stdio.h>
#include <algorithm>
#include <string.h>
#define int long long
#define N 100005
using namespace std;
typedef long long ll;
const signed mo=1e9+7;
const int INF=0x3f3f3f3f;
inline int read(){
	char ch=getchar();int x=0, f=1;
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
int n, a[N], ans, dp[N][2], cnt[N][2];
int mul(int a, int b){
	int ret=0, tmp=a;
	for(; b; b>>=1, tmp=(tmp+tmp)%mo)
		if(b&1) ret=(ret+tmp)%mo;
	return ret;
}
int add(int x, int y){return (x+y)%mo;}
int mus(int x, int y){return ((x-y)%mo+mo)%mo;}
signed main(){
	n=read();
	for(int i=1; i<=n; i++)
		a[i]=read()%mo;
	dp[1][0]=a[1], dp[1][1]=0;
	dp[2][0]=add(a[1], a[2]), dp[2][1]=mus(a[1], a[2]);
	cnt[2][0]=cnt[2][1]=1;
	for(int i=3; i<=n; i++){
		cnt[i][0]=add(cnt[i-1][0], cnt[i-1][1]);
		cnt[i][1]=cnt[i-1][0];
		dp[i][0]=add(add(dp[i-1][0], dp[i-1][1]), mul(cnt[i][0], a[i]));
		dp[i][1]=mus(dp[i-1][0], mul(cnt[i][1], a[i]));
	}
	ans=add(dp[n][0], dp[n][1]);
	printf("%lld", (ans%mo+mo)%mo);
	return 0;
}
/*
5
1 2 3 4 5
 + + + +
 - + + +
 + - + +
 + + - +
 + + + -
 + - + -
 - + - +
 - + + -
 5 6 6 5
 3 2 2 3
 
 2 4 4 2
 
 
*/
#include <stdio.h>
long long n, z;
long long p = 1000000007;
long long a[100000];
long long f[100005];
long long g[100005];
int main() {
	scanf("%lld", &n);
	for (int i = 0; i < n; i++) {
		scanf("%lld", a + i);
	}
	f[0] = 1;
	g[0] = 2;
	g[1] = 1;
	for (int i = 2; i < n + 5; i++) {
		f[i] = (f[i - 1] + f[i - 2]) % p;
		g[i] = (g[i - 1] + g[i - 2]) % p;
	}
	z = a[0] * f[n + 2] % p;
	for (int i = 1; i < n; i++) {
		z += a[i] * ((f[n - i] * f[i - 1] + g[n - i] * f[i]) % p) % p;
		z %= p;
	}
	printf("%lld\n", z);
}