#include <iostream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <bits/stdc++.h>
#include <set>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <map>
#define ll long long
using namespace __gnu_pbds;
using namespace std;
template <class T>
using ordered_set = tree<T , null_type , less<T> , rb_tree_tag , tree_order_statistics_node_update>;
template <class T>
using ordered_set1 = tree<T , null_type , greater<T> , rb_tree_tag , tree_order_statistics_node_update>;
// less<T>/greater<T> = ascending/descending.
// less_equal<>/greater_equal<> for ordered multiset
// ordered_multiset note : s.find(), s.erase() don't work + s.upper_bound() and s.lower_bound() swap jobs;
void fastIO(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
int main() {
fastIO();
string s; cin>>s;
ll size = s.size();
ll l = 0, r=l;
int freq[26]={0};
while (r<s.size() && r-l<=25) {
while (r<s.size() && s[r]=='?' && r-l<=25) {
r++;
}
if (r==s.size() || r-l>25) break;
freq[s[r]-'A']++;
while (freq[s[r]-'A']>1) {
if (s[l]!='?') {
freq[s[l]-'A']--;
}
l++;
}
r++;
}
string sub = s.substr(l,26);
if (r>l+25 && (s.size()-l>=26)) {
for (ll i = 0; i<sub.size(); i++) {
if (sub[i]=='?') {
for (ll j = 0; j<26; j++) {
if (freq[j]==0) {
freq[j]++;
sub[i]='A'+j;
break;
}
}
}
}
s.replace(l,26,sub);
for (ll i = 0; i<s.size(); i++) {
if (s[i]=='?') {
s[i]='A';
}
}
cout<<s;
}
else {
cout<<-1;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KI2luY2x1ZGUgPG1hcD4KI2RlZmluZSBsbCBsb25nIGxvbmcKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlIDxjbGFzcyBUPgp1c2luZyBvcmRlcmVkX3NldCA9IHRyZWU8VCAsIG51bGxfdHlwZSAsIGxlc3M8VD4gLCByYl90cmVlX3RhZyAsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CnRlbXBsYXRlIDxjbGFzcyBUPgp1c2luZyBvcmRlcmVkX3NldDEgPSB0cmVlPFQgLCBudWxsX3R5cGUgLCBncmVhdGVyPFQ+ICwgcmJfdHJlZV90YWcgLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+OwovLyBsZXNzPFQ+L2dyZWF0ZXI8VD4gPSBhc2NlbmRpbmcvZGVzY2VuZGluZy4KLy8gbGVzc19lcXVhbDw+L2dyZWF0ZXJfZXF1YWw8PiBmb3Igb3JkZXJlZCBtdWx0aXNldAovLyBvcmRlcmVkX211bHRpc2V0IG5vdGUgOiBzLmZpbmQoKSwgcy5lcmFzZSgpIGRvbid0IHdvcmsgKyBzLnVwcGVyX2JvdW5kKCkgYW5kIHMubG93ZXJfYm91bmQoKSBzd2FwIGpvYnM7CnZvaWQgZmFzdElPKHZvaWQpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKICAgIGNvdXQudGllKE5VTEwpOwp9CgppbnQgbWFpbigpIHsKICAgIGZhc3RJTygpOwogICAgc3RyaW5nIHM7IGNpbj4+czsKICAgIGxsIHNpemUgPSBzLnNpemUoKTsKICAgIGxsIGwgPSAwLCByPWw7CiAgICBpbnQgZnJlcVsyNl09ezB9OwogICAgd2hpbGUgKHI8cy5zaXplKCkgJiYgci1sPD0yNSkgewogICAgICAgIHdoaWxlIChyPHMuc2l6ZSgpICYmIHNbcl09PSc/JyAmJiByLWw8PTI1KSB7CiAgICAgICAgICAgIHIrKzsKICAgICAgICB9CiAgICAgICAgaWYgKHI9PXMuc2l6ZSgpIHx8IHItbD4yNSkgYnJlYWs7CiAgICAgICAgZnJlcVtzW3JdLSdBJ10rKzsKICAgICAgICB3aGlsZSAoZnJlcVtzW3JdLSdBJ10+MSkgewogICAgICAgICAgICBpZiAoc1tsXSE9Jz8nKSB7CiAgICAgICAgICAgICAgICBmcmVxW3NbbF0tJ0EnXS0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsKys7CiAgICAgICAgfQogICAgICAgIHIrKzsKICAgIH0KICAgIHN0cmluZyBzdWIgPSBzLnN1YnN0cihsLDI2KTsKICAgIGlmIChyPmwrMjUgJiYgKHMuc2l6ZSgpLWw+PTI2KSkgewogICAgICAgIGZvciAobGwgaSA9IDA7IGk8c3ViLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChzdWJbaV09PSc/JykgewogICAgICAgICAgICAgICAgZm9yIChsbCBqID0gMDsgajwyNjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZyZXFbal09PTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJlcVtqXSsrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWJbaV09J0EnK2o7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzLnJlcGxhY2UobCwyNixzdWIpOwogICAgICAgIGZvciAobGwgaSA9IDA7IGk8cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICBpZiAoc1tpXT09Jz8nKSB7CiAgICAgICAgICAgICAgICBzW2ldPSdBJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb3V0PDxzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgY291dDw8LTE7CiAgICB9Cn0=