#include<bits/stdc++.h>
using namespace std;
#define Ri register
template<typename T>inline T read(Ri T&t)
{Ri T f=1;Ri char ch=getchar();t=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch>='0'&&ch<='9')t=t*10+ch-'0',ch=getchar();t*=f;return t;}
template<typename T,typename...Args>
inline void read(T&t,Args&...args)
{read(t);read(args...);}
const long long p=1e9+7;
inline long long power(Ri long long x,Ri long long k=p-2)
{Ri long long re=1;for(;k;k>>=1,x=x*x%p)if(k&1)re=re*x%p;return re;}
long long fac[2000006],ifac[2000006];
inline long long C(int x,int y)
{if(y<0||x-y<0)return 0;return fac[x]*ifac[y]%p*ifac[x-y]%p;}
int X[10],Y[10];
struct OPT{int x,y,col;}opt[10];
inline long long G(OPT a,OPT b)
{return C(abs(a.x-b.x)+abs(a.y-b.y),abs(a.x-b.x));}
inline long long calc(OPT a,OPT b)
{
	long long ans=0;
	for(int i=X[3];i<=X[4];i++)
	{
		ans=(ans-G(a,(OPT){i,Y[3]-1,0})*G((OPT){i,Y[3],0},b)%p*(i+Y[3])%p+p)%p;//下边界,钦点从下方进入 
		ans=(ans+G(a,(OPT){i,Y[4],0})*G((OPT){i,Y[4]+1,0},b)%p*(i+Y[4]+1)%p)%p;//上边界,钦点从上方离开 
	}
	for(int i=Y[3];i<=Y[4];i++)
	{
		ans=(ans-G(a,(OPT){X[3]-1,i,0})*G((OPT){X[3],i,0},b)%p*(X[3]+i)%p+p)%p;//左边界,钦点从左边进入
		ans=(ans+G(a,(OPT){X[4],i,0})*G((OPT){X[4]+1,i,0},b)%p*(X[4]+i+1)%p)%p;//右边界,钦点从右边离开 
	}
//	printf("ans=%lld\n",ans);
	return (ans*a.col*b.col%p+p)%p;
}
int main()
{
	fac[0]=1;for(int i=1;i<=2000000;i++)fac[i]=fac[i-1]*i%p;
	ifac[2000000]=power(fac[2000000]);
	for(int i=2000000-1;i>=0;i--)ifac[i]=ifac[i+1]*(i+1)%p;
//	for(int i=1;i<=10;i++)printf("%lld",ifac[i]);printf("\n");
	for(int i=1;i<=6;i++)read(X[i]);
	for(int i=1;i<=6;i++)read(Y[i]);
	opt[1]=(OPT){X[1]-1,Y[1]-1,1};//第二个矩阵的关键点在右上方,旋转180
	opt[2]=(OPT){X[2],Y[1]-1,-1};
	opt[3]=(OPT){X[1]-1,Y[2],-1};
	opt[4]=(OPT){X[2],Y[2],1};
	
	opt[5]=(OPT){X[5],Y[5],1};
	opt[6]=(OPT){X[6]+1,Y[5],-1};
	opt[7]=(OPT){X[5],Y[6]+1,-1};
	opt[8]=(OPT){X[6]+1,Y[6]+1,1};
	long long ans=0;
	for(int i=1;i<=4;i++)
		for(int j=5;j<=8;j++)
			ans=(ans+calc(opt[i],opt[j]))%p;
	printf("%lld\n",ans);
	return 0;
}
