rt
#include <iostream>
using namespace std;
#define int __int128
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
inline int read(){
char get=getchar();int out=0;
while(get<'0')get=getchar();
while(get>='0')out*=10,out+=get-'0',get=getchar();
return out;
}
inline void write(int in,bool z=1){
if(!in){
if(z)putchar('0');
return;
}
write(in/10,0);
putchar(in%10+'0');
}
inline string to_string(int a,bool z=1){
if(!a){
if(z)return "0";
return "";
}
string out;
out+=(a%10+'0');
return to_string(a/10,0)+out;
}
int mod=1e9+7;
struct node{
int v[3][3]={};
int n,m;
node(){
n=m=0;
}
node(int x,int y,bool one=0){
n=x,m=y;
if(one)for(int i=1;i<=2;i++)v[i][i]=1;
}
void one(){
for(int i=1;i<=2;i++)v[i][i]=1;
}
int& operator()(int a,int b){
return v[a][b];
}
string out(){
string ret;
for(int i=1;i<=n;i++){
ret+="| ";
for(int j=1;j<=m;j++){
ret+=to_string(v[i][j]);
ret+=" ";
}
ret+="|";
if(i!=n)ret+="\n";
}
return ret;
}
};
node mul(node a,node b){
node c(a.n,b.m);
for(int i=1;i<=a.n;i++)
for(int k=1;k<=a.m;k++)
for(int j=1;j<=b.m;j++){
c.v[i][j]+=a.v[i][k]*b.v[k][j]%mod;
c.v[i][j]%=mod;
}
return c;
}
string n,m;
int a,b,c,d;
node bim[10],bin[10],bimn[10];
node ans(1,2),mom(2,2),mon(2,2);
node ks(node a,int b){
node c(a.n,a.m,1);
while(b){
if(b%2)c=mul(c,a);
a=mul(a,a);
b/=2;
}
return c;
}
node ksm(string b){
node a(2,2,1);
for(int i=0;i<b.length();i++){
a=mul(a,bim[b[i]-'0']);
if(i!=b.length()-1)a=ks(a,10);
}
return a;
}
node ksn(string b){
node a(2,2,1);
for(int i=0;i<b.length();i++){
a=mul(a,bin[b[i]-'0']);
if(i!=b.length()-1)a=ks(a,10);
}
return a;
}
node ksmn(string b){
node a(2,2,1);
for(int i=0;i<b.length();i++){
a=mul(a,bimn[b[i]-'0']);
if(i!=b.length()-1)a=ks(a,10);
}
return a;
}
signed main(int argc, char** argv) {
for(int i=0;i<=9;i++)bim[i].n=2,bim[i].m=2;
bim[0].one();
for(int i=0;i<=9;i++)bin[i].n=2,bin[i].m=2;
bin[0].one();
for(int i=0;i<=9;i++)bimn[i].n=2,bimn[i].m=2;
bimn[0].one();
cin>>n>>m;
n[n.length()-1]-=1;
for(int i=n.length()-1;i>=1;i--){
if(n[i]<'0')n[i-1]-=1,n[i]='9';
else break;
}if(n[0]=='0')n=n.substr(1,n.length()-1);
m[m.length()-1]-=1;
for(int i=m.length()-1;i>=1;i--){
if(m[i]<'0')m[i-1]-=1,m[i]='9';
else break;
}if(m[0]=='0')n=n.substr(1,m.length()-1);
a=read(),b=read(),c=read(),d=read();
ans(1,1)=ans(1,2)=1;
mom(1,1)=a,mom(2,1)=b,mom(1,2)=0,mom(2,2)=1;
mon(1,1)=c,mon(2,1)=d,mon(1,2)=0,mon(2,2)=1;
for(int i=1;i<=9;i++){
bim[i]=mul(bim[i-1],mom);
}
for(int i=1;i<=9;i++){
bin[i]=mul(bin[i-1],mon);
}
node ls;
ls=mul(bin[1],ksm(m));
for(int i=1;i<=9;i++){
bimn[i]=mul(bimn[i-1],ls);
}
ans=mul(ans,mul(ksm(m),ksmn(n)));
// ans=mul(ans,mul(ksm(m),mul(ksmn(n),ksn(n))));
write(ans(1,1)%mod);
return 0;
}