#include <bits/stdc++.h>
using namespace std;
void SO() { cout << endl; }
template <typename S, typename... Strings>
void SO(S x, const Strings &...rest) {
  cout << x << ' ';
  SO(rest...);
}
const long double PI = 3.1415926535897932384626433832795;
const int v5 = 100000;
const int v9 = 1000000000;
const int v6 = 1000000;
inline long int ABS(long int a) {
  if (a < 0) return (-a);
  return a;
}
inline long int min(long int a, long int b, long int c) {
  return min(a, min(b, c));
}
inline long int max(long int a, long int b, long int c) {
  return max(a, max(b, c));
}
inline void AI(long int x[], long int n) {
  for (long int i = 0; i < (n); ++i) cin >> (x[i]);
}
inline void VI(vector<long int> &arr, long int n) {
  for (long int i = 0; i < (n); ++i) {
    long int x;
    cin >> (x);
    arr.push_back(x);
  };
}
map<long int, vector<long int> > g;
long int a, b, c, d, B = 0, C = 0, A, D;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> a >> b;
  cin >> c >> d;
  if (a == 0 and b == 0 and c == 0) {
    for (long int i = 0; i < 100001; i++)
      if (i * (i - 1) == 2 * d) D = i;
    string s;
    for (int i = (0); i < (D); ++i) s += '1';
    if (D == 0)
      SO("Impossible");
    else
      SO(s);
    return 0;
  }
  if (d == 0 and a == 0 and b == 0 and c == 1) {
    SO("10");
    return 0;
  }
  if (d == 0 and a == 0 and b == 1 and c == 0) {
    SO("01");
    return 0;
  }
  if (d == 0 and b == 0 and c == 0) {
    for (long int i = 0; i < 100001; i++)
      if (i * (i - 1) == 2 * a) D = i;
    string s;
    for (int i = (0); i < (D); ++i) s += '0';
    if (D == 0)
      SO("Impossible");
    else
      SO(s);
    return 0;
  }
  for (long int i = 0; i < 100001; i++) {
    if (i * (i - 1) == 2 * a) A = i;
    if (i * (i - 1) == 2 * d) D = i;
  }
  a = A;
  d = D;
  B = a * d;
  if (a == 0 or d == 0 or !(B - b == c)) {
    SO("Impossible");
    return 0;
  }
  string s;
  for (int i = (0); i < (a); ++i) s += '0';
  for (int i = (0); i < (d); ++i) s += '1';
  long int start1 = a, reqd = c, mn = 0;
  while (start1 < s.length() and a <= reqd) {
    s[mn] = '1';
    s[start1] = '0';
    reqd -= a;
    mn++;
    start1++;
  }
  if (start1 < s.length() and reqd > 0) {
    long int j = start1 - reqd;
    s[j] = '1';
    s[start1] = '0';
    reqd -= (start1 - j);
    start1++;
  }
  if (reqd == 0)
    SO(s);
  else
    SO("Impossible");
  return 0;
}

### Prompt

Your task is to create a CPP solution to the following problem:

For each string s consisting of characters '0' and '1' one can define four integers a00, a01, a10 and a11, where axy is the number of subsequences of length 2 of the string s equal to the sequence {x, y}. 

In these problem you are given four integers a00, a01, a10, a11 and have to find any non-empty string s that matches them, or determine that there is no such string. One can prove that if at least one answer exists, there exists an answer of length no more than 1 000 000.

Input

The only line of the input contains four non-negative integers a00, a01, a10 and a11. Each of them doesn't exceed 109.

Output

If there exists a non-empty string that matches four integers from the input, print it in the only line of the output. Otherwise, print "Impossible". The length of your answer must not exceed 1 000 000.

Examples

Input

1 2 3 4


Output

Impossible


Input

1 2 2 1


Output

0110

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
void SO() { cout << endl; }
template <typename S, typename... Strings>
void SO(S x, const Strings &...rest) {
  cout << x << ' ';
  SO(rest...);
}
const long double PI = 3.1415926535897932384626433832795;
const int v5 = 100000;
const int v9 = 1000000000;
const int v6 = 1000000;
inline long int ABS(long int a) {
  if (a < 0) return (-a);
  return a;
}
inline long int min(long int a, long int b, long int c) {
  return min(a, min(b, c));
}
inline long int max(long int a, long int b, long int c) {
  return max(a, max(b, c));
}
inline void AI(long int x[], long int n) {
  for (long int i = 0; i < (n); ++i) cin >> (x[i]);
}
inline void VI(vector<long int> &arr, long int n) {
  for (long int i = 0; i < (n); ++i) {
    long int x;
    cin >> (x);
    arr.push_back(x);
  };
}
map<long int, vector<long int> > g;
long int a, b, c, d, B = 0, C = 0, A, D;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> a >> b;
  cin >> c >> d;
  if (a == 0 and b == 0 and c == 0) {
    for (long int i = 0; i < 100001; i++)
      if (i * (i - 1) == 2 * d) D = i;
    string s;
    for (int i = (0); i < (D); ++i) s += '1';
    if (D == 0)
      SO("Impossible");
    else
      SO(s);
    return 0;
  }
  if (d == 0 and a == 0 and b == 0 and c == 1) {
    SO("10");
    return 0;
  }
  if (d == 0 and a == 0 and b == 1 and c == 0) {
    SO("01");
    return 0;
  }
  if (d == 0 and b == 0 and c == 0) {
    for (long int i = 0; i < 100001; i++)
      if (i * (i - 1) == 2 * a) D = i;
    string s;
    for (int i = (0); i < (D); ++i) s += '0';
    if (D == 0)
      SO("Impossible");
    else
      SO(s);
    return 0;
  }
  for (long int i = 0; i < 100001; i++) {
    if (i * (i - 1) == 2 * a) A = i;
    if (i * (i - 1) == 2 * d) D = i;
  }
  a = A;
  d = D;
  B = a * d;
  if (a == 0 or d == 0 or !(B - b == c)) {
    SO("Impossible");
    return 0;
  }
  string s;
  for (int i = (0); i < (a); ++i) s += '0';
  for (int i = (0); i < (d); ++i) s += '1';
  long int start1 = a, reqd = c, mn = 0;
  while (start1 < s.length() and a <= reqd) {
    s[mn] = '1';
    s[start1] = '0';
    reqd -= a;
    mn++;
    start1++;
  }
  if (start1 < s.length() and reqd > 0) {
    long int j = start1 - reqd;
    s[j] = '1';
    s[start1] = '0';
    reqd -= (start1 - j);
    start1++;
  }
  if (reqd == 0)
    SO(s);
  else
    SO("Impossible");
  return 0;
}

```