#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<int> vi;
typedef long double ld;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;
string s;
const int MOD = 1e9 + 7;
const int N = 3001;
ll dp[2][N][2];
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>s;
if(s[0] != '1')
{
dp[0][1][0] = 1;
}
if(s[0] != '0')
{
dp[0][1][1] = 1;
}
int n = s.length();
for(int i = 1; i < n; i++)
{
int cur = (i&1); int prev = (cur^1);
for(int j = 1; j <= i + 1; j++)
{
for(int k = 0; k < 2; k++)
{
dp[cur][j][k] = 0;
}
}
for(int j = 1; j <= i + 1; j++)
{
if(s[i] != '1') //use 0
{
dp[cur][j][0] = (dp[prev][j][0]+dp[prev][j-1][1])%MOD;
}
if(s[i] != '0') //use 1
{
dp[cur][j][1] = (dp[prev][j-1][0]+dp[prev][j][1])%MOD;
}
}
}
for(int i = 1; i <= n; i++)
{
cout << (dp[(n+1)&1][i][0]+dp[(n+1)&1][i][1])%MOD << ' ';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZibyBmaW5kX2J5X29yZGVyCiNkZWZpbmUgb29rIG9yZGVyX29mX2tleQogCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8bGwsbGw+IGlpOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOyAKdHlwZWRlZiB0cmVlPGludCwgbnVsbF90eXBlLCBsZXNzPGludD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+IHBiZHM7CnR5cGVkZWYgc2V0PGludD46Oml0ZXJhdG9yIHNpdDsKdHlwZWRlZiBtYXA8aW50LGludD46Oml0ZXJhdG9yIG1pdDsKdHlwZWRlZiB2ZWN0b3I8aW50Pjo6aXRlcmF0b3Igdml0OwogCnN0cmluZyBzOwpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKY29uc3QgaW50IE4gPSAzMDAxOwogCmxsIGRwWzJdW05dWzJdOwppbnQgbWFpbigpCnsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7CgljaW4+PnM7CglpZihzWzBdICE9ICcxJykKCXsKCQlkcFswXVsxXVswXSA9IDE7Cgl9CglpZihzWzBdICE9ICcwJykKCXsKCQlkcFswXVsxXVsxXSA9IDE7Cgl9CglpbnQgbiA9IHMubGVuZ3RoKCk7Cglmb3IoaW50IGkgPSAxOyBpIDwgbjsgaSsrKQoJewoJCWludCBjdXIgPSAoaSYxKTsgaW50IHByZXYgPSAoY3VyXjEpOwoJCWZvcihpbnQgaiA9IDE7IGogPD0gaSArIDE7IGorKykKCQl7CgkJCWZvcihpbnQgayA9IDA7IGsgPCAyOyBrKyspCgkJCXsKCQkJCWRwW2N1cl1bal1ba10gPSAwOwoJCQl9CgkJfQoJCWZvcihpbnQgaiA9IDE7IGogPD0gaSArIDE7IGorKykKCQl7CgkJCWlmKHNbaV0gIT0gJzEnKSAvL3VzZSAwCgkJCXsKCQkJCWRwW2N1cl1bal1bMF0gPSAoZHBbcHJldl1bal1bMF0rZHBbcHJldl1bai0xXVsxXSklTU9EOwoJCQl9CgkJCWlmKHNbaV0gIT0gJzAnKSAvL3VzZSAxCgkJCXsKCQkJCWRwW2N1cl1bal1bMV0gPSAoZHBbcHJldl1bai0xXVswXStkcFtwcmV2XVtqXVsxXSklTU9EOwoJCQl9CgkJfQoJfQoJZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspCgl7CgkJY291dCA8PCAoZHBbKG4rMSkmMV1baV1bMF0rZHBbKG4rMSkmMV1baV1bMV0pJU1PRCA8PCAnICc7Cgl9Cn0KIA==