#include<stdio.h>
#include<algorithm>
using namespace std;
int x[131072],y[131072];
struct node{
	int l;
	int r;
	int wz;
	bool operator<(node b) const
	{
		if(l==b.l)
		{
			return r<b.r;
		}
		return l<b.l;
	}
};
node nn[131072];
int num=0;
int c[131072];
void inc(int x,int val)
{
	for(int i=x;i<=num;i+=(i&(-i)))
	{
		c[i]+=val;
		if(c[i]>=1000000007)
		{
			c[i]-=1000000007;
		}
	}
}
int query(int x)
{
	int ans=0;
	for(int i=x;i>0;i-=(i&(-i)))
	{
		ans+=c[i];
		if(ans>=1000000007)
		{
			ans-=1000000007;
		}
	}
	return ans;
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&x[i]);
	}
	for(int i=0;i<m;i++)
	{
		scanf("%d",&y[i]);
	}
	int now=0;
	for(int i=0;i<n;i++)
	{
		if(x[i]>y[m-1])
		{
			break;
		}
		while(x[i]>y[now])
		{
			now++;
		}
		if(now==0)
		{
			continue;
		}
		nn[num].l=y[now-1]-x[i];
		nn[num].r=y[now]-x[i];
		num++;
	}
	if(num==0)
	{
		printf("1\n");
		return 0;
	}
	sort(nn,nn+num);
	int num2=0;
	for(int i=1;i<num;i++)
	{
		if(nn[num2]<nn[i])
		{
			num2++;
			nn[num2]=nn[i];
		}
	}
	num2++;
	num=num2;
	for(int i=0;i<num;i++)
	{
		nn[i].wz=i;
		int t=nn[i].l;
		nn[i].l=nn[i].r;
		nn[i].r=t;
	}
	sort(nn,nn+num);
	inc(1,1);
	for(int i=0;i<num;i++)
	{
		int val=query(num-nn[i].wz);
		inc(num-nn[i].wz,val);
	}
	printf("%d\n",query(num));
	return 0;
}