#include using namespace std; typedef long long LL; typedef pair PII; // chmax, chmin template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } template function op_max = [](T a, T b) -> T { return max(a, b); }; template function op_min = [](T a, T b) -> T { return min(a, b); }; template function op_sum = [](T a, T b) -> T { return a + b; }; namespace detail { template struct vector_builder { using type = std::vector::type>; static type make(std::vector dims, const T& v = {}) { const auto vec = std::vector(dims.empty() ? 0 : dims.back(), v); if (!dims.empty()) dims.pop_back(); return vector_builder, NDIMS - 1>::make(dims, vec); } }; template struct vector_builder { using type = std::vector; static type make(std::vector dims, const T& v = {}) { return type(dims.empty() ? 0 : dims.back(), v); } }; } // namespace detail template auto exvector(const T& v, SIZE_T... dims) { static_assert(sizeof...(dims) != 0, "invalid dimension"); std::vector vec_dims{dims...}; return detail::vector_builder::make(vec_dims, v); } using namespace std; //******************** dumps ************************// template void dump(const T& data, vector& iter) { cout << data << " "; } template void dump(const vector& data, vector& iter) { for (auto elem : data) dump(elem, iter); cout << endl; } template void dump(const vector>& data, vector& iter) { for (auto elem : iter) { cout << "[" << elem << "]"; } cout << endl; for (int i = 0; i < data.size(); i++) { iter.push_back(i); dump(data[i], iter); iter.pop_back(); } cout << endl; } template void dump(const vector& data, int dummy) { for (int i = 0; i < data.size(); i++) { cout << "[" << i << "] " << data[i] << endl; } } template void dump(const T& data) { // T : data, U = base type val. vector iter; dump(data, iter); } /////////////////////////////////////////////// long long mul(long long a, long long b, const long long MOD) { return b ? (mul(a * 2, b / 2, MOD) + (b & 1 ? a : 0)) % MOD : 0; } long long bpow(long long a, long long b, const long long MOD) { return (b ? bpow(a * a % MOD, b / 2, MOD) * (b & 1 ? a : 1) : 1) % MOD; } long long inv(long long a, const long long MOD) { return bpow(a, MOD - 2, MOD); } vector MODS = {1000000007}; template class mint { public: long long v; mint() : v(0) {} mint(long long v) : v((v % MODS[kind] + MODS[kind]) % MODS[kind]) {} long long get_mod() { return MODS[kind]; } long long get_val() { return v; } }; template ostream& operator<<(ostream& os, const mint& x) { return os << x.v; } template mint& operator+=(mint& a, mint b) { return a = a.v + b.v; } template mint& operator-=(mint& a, mint b) { return a = a.v - b.v; } template mint& operator*=(mint& a, mint b) { return a = a.v * b.v; } template mint& operator/=(mint& a, mint b) { return a = a.v * inv(b.v, a.get_mod()); } template mint operator+(mint a, mint b) { return a += b; } template mint operator-(mint a, mint b) { return a -= b; } template mint operator*(mint a, mint b) { return a *= b; } template mint operator/(mint a, mint b) { return a /= b; } template mint& operator+=(mint& a, long long b) { return a = a.v + b; } template mint& operator-=(mint& a, long long b) { return a = a.v - b; } template mint& operator*=(mint& a, long long b) { return a = a.v * b; } template mint& operator/=(mint& a, long long b) { return a = a.v * inv(b, a.get_mod()); } template mint operator+(mint a, long long b) { return a += b; } template mint operator-(mint a, long long b) { return a -= b; } template mint operator*(mint a, long long b) { return a *= b; } template mint operator/(mint a, long long b) { return a /= b; } vector> kaijo; void init() { kaijo.push_back(mint<>(1)); for (int i = 1; i <= 400000; i++) { kaijo.push_back(kaijo.back() * i); } } mint<> comb(LL N, LL K) { if (K < 0) return mint<>(0); if (K > N) return mint<>(0); return kaijo[N] / kaijo[N - K] / kaijo[K]; } int main() { init(); mint<> ans; LL a, b, c, d; cin >> a >> b >> c >> d; ans += (b - a + 1) * (d - c + 1); ans -= max(0LL, min(b, d) - max(a, c) + 1); cout << ans << endl; return 0; }