#include<iostream>
#include<bits/stdc++.h>
#define ull signed long long int
#define ll long long int
#define pb emplace_back
#define repi(s,e,t) for(ull i=s;i<=e;i+=t)
#define repj(s,e,t) for(ull j=s;j<=e;j+=t)
#define repk(s,e,t) for(ull k=s;k<=e;k+=t)
#define rev_repi(s,e,t) for(ull i=s;i>=e;i-=t)
#define rev_repj(s,e,t) for(ull j=s;j>=e;j-=t)
#define rev_repk(s,e,t) for(ull k=s;k>=e;k-=t)
#define rev_str(s) reverse(s.begin(),s.end())
#define rev_vec(v) reverse(v.begin(),v.end())
#define rev_arr(a,n) reverse(a,a+n)
#define sort_str(s) sort(s.begin(),s.end())
#define sort_vec(v) sort(v.begin(),v.end())
#define sort_arr(a,n) sort(a,a+n)
#define sort_dec_str(s) sort(s.rbegin(),s.rend())
#define sort_dec_vec(v) sort(v.rbegin(),v.rend())
#define nw '\n'
using namespace std;
bool isprime(ull n)
{
    if(n==1)
    {
        return false;
    }
    for(ull i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            return false;
        }
    }
    return true;
}
vector<ull> allprimebetween(ull l,ull r)
{
    vector<bool> v(1000001,true);
    v[0]=v[1]=false;
    for(ull i=2;i*i<=1000001;i++)
    {
        if(v[i])
        {
            for(ull j=i*i;j<=1000001;j+=i)
            {
                v[j]=false;
            }
        }
    }
    vector<ull> prime;
    for(ull i=l;i<=r;i++)
    {
        if(v[i])
        {
            prime.pb(i);
        }
    }
    return prime;
}
bool samefreq(string a,string b)
{
    map<ull,ull>mpa;
    map<ull,ull>mpb;
    for(ull i=0;i<a.size();i++)
    {
        mpa[a[i]-'a']++;
    }
    for(ull i=0;i<b.size();i++)
    {
        mpb[b[i]-'a']++;
    }
    for(ull i=0;i<26;i++)
    {
        if(mpa[i]!=mpb[i])
        {
            return false;
        }
    }
    return true;
}
map<ull,ull> getfreq(string s)
{
    map<ull,ull> mp;
    for(ull i=0;i<s.size();i++)
    {
        mp[s[i]-'a']++;
    }
    return mp;
}
vector<ull> getfactors(ull n)
{
    vector<ull> v;
    for(ull i=1;i*i<=n;i++)
    {
        if(n%i==0)
        {
            v.pb(i);
            if((n/i)!=i)
            {
                v.pb(n/i);
            }
            else
            {
                break;
            }
        }
    }
    sort_vec(v);
    return v;
}
bool ispalindrome(string s)
{
    string t(s.rbegin(),s.rend());
    return s==t;
}
int main() 
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ull testcases;
    cin>>testcases;
    while(testcases--)
    { 
        ull a,b;    // a : zero's    b : one's
        cin>>a>>b;
        ull x=a;
        ull y=b;
        string s;
        cin>>s;
        if(s.size()%2==0 && (a%2!=0 || b%2!=0))
        {
            cout<<-1<<nw;
            continue;
        }
        ull n=s.size();
        a=a-count(s.begin(),s.end(),'0');
        b=b-count(s.begin(),s.end(),'1');
        //cout<<a<<b<<nw;
        string t;
        bool flag=true;
        repi(0,n-1,1)
        {
            if(s[i]!=s[n-1-i])
            {
                if(s[i]=='?')
                {
                    if(s[n-1-i]=='1')
                    {
                        if(b>=1)
                        {
                            s[i]='1';
                            b--;
                            continue;
                        }
                        flag=false;
                        break;
                    }
                    if(s[n-1-i]=='0')
                    {
                        if(a>=1)
                        {
                            s[i]='0';
                            a--;
                            continue;
                        }
                        flag=false;
                        break;
                    }
                }
                if(s[i]=='1')
                {
                    if(s[n-1-i]=='?')
                    {
                        if(b>=1)
                        {
                            s[n-1-i]='1';
                            b--;
                            continue;
                        }
                        flag=false;
                        break;
                    }
                    else
                    {
                        flag=false;
                        break;
                    }
                }
                if(s[i]=='0')
                {
                    if(s[n-1-i]=='?')
                    {
                        if(a>=1)
                        {
                            s[n-1-i]='0';
                            a--;
                            continue;
                        }
                        flag=false;
                        break;
                    }
                    else
                    {
                        flag=false;
                        break;
                    }
                }
            }
        }
        if(!flag || a<0 || b<0)
        {
            cout<<-1<<nw;
            continue;
        }
        ull mid=-1;
        repi(0,n-1,1)
        {
            if(i==(n-1-i))
            {
                mid=i;
                continue;
            }
            else
            {
                if(s[i]==s[n-1-i])
                {
                    if(s[i]=='?')
                    {
                        if(a>=2)
                        {
                            s[i]='0';
                            s[n-1-i]='0';
                            a-=2;
                            continue;
                        }
                        if(b>=2)
                        {
                            s[i]='1';
                            s[n-1-i]='1';
                            b-=2;
                            continue;
                        }
                        flag=false;
                        break;
                    }
                }
            }
        }
        if(!flag)
        {
            cout<<-1<<nw;
            continue;
        }
        if(mid!=-1)
        {
            if(a>=1)
            {
                s[mid]='0';
                a--;
            }
            else if(b>=1)
            {
                s[mid]='1';
                b--;
                
            }
        }
        if(ispalindrome(s))
        {
            if(count(s.begin(),s.end(),'0')==x && count(s.begin(),s.end(),'1')==y)
            {
                cout<<s<<nw;
            }
            else
            {
                cout<<-1<<nw;
            }
        }
        else
        {
            cout<<-1<<nw;
        }
    }
	return 0;
}