#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
typedef pair<ll, P> P3;
typedef pair<P ,P> PP;
constexpr ll MOD = ll(1e9) + 7;
constexpr int IINF = INT_MAX;
constexpr ll LLINF = LLONG_MAX;
constexpr int MAX_N = int(1e5) + 5;
constexpr double EPS = 1e-9;
constexpr int di[] = {0, 1, 0, -1}, dj[] = {1, 0, -1, 0};
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i > 0; i--)
#define SORT(v) sort((v).begin(), (v).end())
#define SORTR(v) sort((v).rbegin(), (v).rend())
#define ALL(v) (v).begin(), (v).end()

int o_rank(char c){
    if(c == '+') return 0;
    else if (c == '-') return 1;
    else if (c == '*') return 2;
    else return -1;
}

bool comp(char a, char b){
    return o_rank(a) > o_rank(b);
}

bool calc(stack<int> &num, stack<char> &ope){
    if(num.size() < 2 || ope.size() < 1) return false;
    if(ope.top() == '(') return false;
    if(ope.top() == '+'){
        int n1, n2;
        n2 = num.top(); num.pop();
        n1 = num.top(); num.pop();
        num.push(n1+n2);
    }
    else if(ope.top() == '-'){
        int n1, n2;
        n2 = num.top(); num.pop();
        n1 = num.top(); num.pop();
        num.push(n1-n2);
    }
    else if(ope.top() == '*'){
        int n1, n2;
        n2 = num.top(); num.pop();
        n1 = num.top(); num.pop();
        num.push(n1*n2);
    }
    else return false;
    if(num.top() < 0 || num.top() >= (1<<10)) return false;
    ope.pop();
    return true;
}

int solve(string &s){
    stack<int> num;
    stack<char> ope;
    int b = -IINF;
    char pre = '#';
    for(auto c : s){
        if(c == '0' || c == '1'){
            if(b == -IINF) b = 0;
            b = (b<<1) + c-'0';
        }
        else if(c == '('){
            if(b != -IINF) return -IINF;
            ope.push('(');
        }
        else if(c == ')'){
            if(pre == '+' || pre == '-' || pre == '*') return -IINF;
            if(b != -IINF){
                num.push(b);
                b = -IINF;
            }
            int cnt = 0;
            while(calc(num, ope)) cnt++;
            if(ope.empty() || ope.top() != '(' || cnt == 0){
                return -IINF;
            }
            ope.pop();
        }
        else if(c=='+' || c=='-' || c=='*'){
            if(b != -IINF){
                num.push(b);
                b = -IINF;
            }
            while(!ope.empty() && comp(ope.top(), c)){
                if(!calc(num, ope)){
                    return -IINF;
                }
            }
            ope.push(c);
        }
        else{
            return -IINF;
        }
        if(!num.empty() && (num.top() < 0 || num.top() >= (1<<10))) return -IINF;
        pre = c;
    }
    if(b != -IINF) num.push(b);
    while(calc(num, ope));
    if(num.size() != 1 || ope.size() != 0 || num.top() < 0 || num.top() >= (1<<10)){
        return -IINF;
    }
    else return num.top();
}

int main() {
    string s;
    vector<int> dots;
    vector<char> ch = {'0', '1', '+', '-', '*', '(', ')'};
    cin >> s;
    for(int i=0;i<s.size();i++){
        if(s[i]=='.'){
            dots.push_back(i);
        }
    }
    int m = int(pow(7, dots.size()));
    int ans = solve(s);
    for(int i=0;i<m;i++){
        int t = i;
        for(int j=0;j<int(dots.size());j++){
            s[dots[j]] = ch[t%7];
            t /= 7;
        }
        int tmp = solve(s);
        ans = max(ans, tmp);
    }
    if(ans == -IINF) ans = -1;
    cout << ans << endl;
    return 0;
}



Measured memory_bytes: 3364