#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <vector>
#include <algorithm>
#define ll unsigned long long
#define PB push_back
#define rep(i,n) for (int i = 0; i<n; i++)
#define clr(x, y) memset(x, y, sizeof x)
#define MAX 2010
#define MOD 1000000007
using namespace std;
char s[MAX];
int freq[40];
vector <ll> primes;
bool *isprime = new bool[MAX];
bool *compute = new bool[MAX];
void sieve (){
ll i, j;
for (i = 0; i<=MAX; i++) isprime[i] = true;
isprime[0] = isprime[1] = false;
primes.PB (2);
for (i = 4; i<=MAX; i += 2) isprime[i] = false;
for (i = 3; i<=MAX; i += 2){
if (isprime[i]){
primes.PB (i);
for (j = i*i; j<MAX; j += i)
isprime[j] = false;
}
}
}
map<ll, int> eq;
map<ll, int> :: iterator it;
void factors (int n, bool add){
ll aux = n;
int i = 0;
while (primes[i]*primes[i] <= n){
if (aux%primes[i] == 0){
while (aux%primes[i] == 0) {
aux /= primes[i];
if(add) eq[primes[i]]++;
else eq[primes[i]]--;
}
}
i++;
}
if (aux > 1) {
if(add) eq[aux]++;
else eq[aux]--;
}
}
// computa o fatorial transformando em um numero primo
void fatorial(int x, bool add){
for(int i = 2; i<=x; i++) factors (i, add);
}
ll mulmod(ll a, ll b, ll c){
ll x = 0,y = a%c;
while(b > 0){
if(b%2 == 1) x = (x+y)%c;
y = (y*2)%c;
b /= 2;
}
return x%c;
}
// (a ^ b) % c
ll pow(ll a, ll b, ll c){
ll x=1, y=a;
while(b > 0){
if(b%2LLU == 1) x = mulmod(x, y, c);
y = mulmod(y, y, c);
b /= 2LLU;
}
return x%c;
}
int main (){
// calculo dos numeros primos menores que 2*10^3
sieve();
while(scanf("%s", s) != EOF){
clr(freq, 0);
eq.clear();
int sz = strlen(s);
// fatorial do tamanho da string que entrada
// "true" indica que estou somando o expoente do fatorial
fatorial(sz, true);
// calcula as repeticoes da letras
for (int i = 0; i<sz; i++) freq[s[i] - 'A']++;
// para cada letra, calculo o fatorial de quantas vezes ela apareceu
// "false" indica que estou removendo o expoente..
for (int i = 0; i<29; i++) if(freq[i]) fatorial(freq[i], false);
ll ans = 1;
// uma "lista" com os numeros primos e seus expoentes.
for(it = eq.begin(); it != eq.end(); it++){
// a^b
int a = it->first;
int b = it->second;
ans = (ans * pow(a, b, MOD)) % 1000000007;
}
printf("%llu\n", ans);
}
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKI2RlZmluZSBsbCB1bnNpZ25lZCBsb25nIGxvbmcKI2RlZmluZSBQQiBwdXNoX2JhY2sKCiNkZWZpbmUgcmVwKGksbikgZm9yIChpbnQgaSA9IDA7IGk8bjsgaSsrKQojZGVmaW5lIGNscih4LCB5KSBtZW1zZXQoeCwgeSwgc2l6ZW9mIHgpCgojZGVmaW5lIE1BWCAyMDEwCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjaGFyIHNbTUFYXTsKaW50IGZyZXFbNDBdOwoKdmVjdG9yIDxsbD4gcHJpbWVzOwpib29sICppc3ByaW1lID0gbmV3IGJvb2xbTUFYXTsKYm9vbCAqY29tcHV0ZSA9IG5ldyBib29sW01BWF07Cgp2b2lkIHNpZXZlICgpewoJbGwgaSwgajsKCglmb3IgKGkgPSAwOyBpPD1NQVg7IGkrKykgaXNwcmltZVtpXSA9IHRydWU7CgoJaXNwcmltZVswXSA9IGlzcHJpbWVbMV0gPSBmYWxzZTsKCXByaW1lcy5QQiAoMik7Cglmb3IgKGkgPSA0OyBpPD1NQVg7IGkgKz0gMikgaXNwcmltZVtpXSA9IGZhbHNlOwoKCWZvciAoaSA9IDM7IGk8PU1BWDsgaSArPSAyKXsKCQlpZiAoaXNwcmltZVtpXSl7CgkJCXByaW1lcy5QQiAoaSk7CgkJCWZvciAoaiA9IGkqaTsgajxNQVg7IGogKz0gaSkKCQkJCWlzcHJpbWVbal0gPSBmYWxzZTsKCQl9Cgl9Cn0KCm1hcDxsbCwgaW50PiBlcTsKbWFwPGxsLCBpbnQ+IDo6IGl0ZXJhdG9yIGl0OwoKdm9pZCBmYWN0b3JzIChpbnQgbiwgYm9vbCBhZGQpewoJbGwgYXV4ID0gbjsKCWludCBpID0gMDsKCgl3aGlsZSAocHJpbWVzW2ldKnByaW1lc1tpXSA8PSBuKXsKCQlpZiAoYXV4JXByaW1lc1tpXSA9PSAwKXsKCQkJd2hpbGUgKGF1eCVwcmltZXNbaV0gPT0gMCkgewoJCQkJYXV4IC89IHByaW1lc1tpXTsKCQkJCQoJCQkJaWYoYWRkKSBlcVtwcmltZXNbaV1dKys7CgkJCQllbHNlIGVxW3ByaW1lc1tpXV0tLTsKCQkJfQoJCX0KCQkKCQlpKys7Cgl9CgkKCWlmIChhdXggPiAxKSB7CgkJaWYoYWRkKSBlcVthdXhdKys7CgkJZWxzZSBlcVthdXhdLS07Cgl9Cn0KCi8vIGNvbXB1dGEgbyBmYXRvcmlhbCB0cmFuc2Zvcm1hbmRvIGVtIHVtIG51bWVybyBwcmltbwp2b2lkIGZhdG9yaWFsKGludCB4LCBib29sIGFkZCl7Cglmb3IoaW50IGkgPSAyOyBpPD14OyBpKyspIGZhY3RvcnMgKGksIGFkZCk7Cn0KCmxsIG11bG1vZChsbCBhLCBsbCBiLCBsbCBjKXsKCWxsIHggPSAwLHkgPSBhJWM7Cgl3aGlsZShiID4gMCl7CgkJaWYoYiUyID09IDEpIHggPSAoeCt5KSVjOwoJCXkgPSAoeSoyKSVjOwoJCWIgLz0gMjsKCX0KCXJldHVybiB4JWM7Cn0KCi8vIChhIF4gYikgJSBjCmxsIHBvdyhsbCBhLCBsbCBiLCBsbCBjKXsKCWxsIHg9MSwgeT1hOwoJd2hpbGUoYiA+IDApewoJCWlmKGIlMkxMVSA9PSAxKSB4ID0gbXVsbW9kKHgsIHksIGMpOwoJCXkgPSBtdWxtb2QoeSwgeSwgYyk7CgkJYiAvPSAyTExVOwoJfQoJcmV0dXJuIHglYzsKfQoKaW50IG1haW4gKCl7CgkvLyBjYWxjdWxvIGRvcyBudW1lcm9zIHByaW1vcyBtZW5vcmVzIHF1ZSAyKjEwXjMKCXNpZXZlKCk7CgoJd2hpbGUoc2NhbmYoIiVzIiwgcykgIT0gRU9GKXsKCQljbHIoZnJlcSwgMCk7CgkJZXEuY2xlYXIoKTsKCQkKCQlpbnQgc3ogPSBzdHJsZW4ocyk7CgkJCgkJLy8gZmF0b3JpYWwgZG8gdGFtYW5obyBkYSBzdHJpbmcgcXVlIGVudHJhZGEKCQkvLyAidHJ1ZSIgaW5kaWNhIHF1ZSBlc3RvdSBzb21hbmRvIG8gZXhwb2VudGUgZG8gZmF0b3JpYWwKCQlmYXRvcmlhbChzeiwgdHJ1ZSk7CgkJCgkJLy8gY2FsY3VsYSBhcyByZXBldGljb2VzIGRhIGxldHJhcwoJCWZvciAoaW50IGkgPSAwOyBpPHN6OyBpKyspIGZyZXFbc1tpXSAtICdBJ10rKzsKCQkKCQkvLyBwYXJhIGNhZGEgbGV0cmEsIGNhbGN1bG8gbyBmYXRvcmlhbCBkZSBxdWFudGFzIHZlemVzIGVsYSBhcGFyZWNldQoJCS8vICJmYWxzZSIgaW5kaWNhIHF1ZSBlc3RvdSByZW1vdmVuZG8gbyBleHBvZW50ZS4uCgkJZm9yIChpbnQgaSA9IDA7IGk8Mjk7IGkrKykgaWYoZnJlcVtpXSkgZmF0b3JpYWwoZnJlcVtpXSwgZmFsc2UpOwoKCQlsbCBhbnMgPSAxOwoJCQoJCS8vIHVtYSAibGlzdGEiIGNvbSBvcyBudW1lcm9zIHByaW1vcyBlIHNldXMgZXhwb2VudGVzLgoJCWZvcihpdCA9IGVxLmJlZ2luKCk7IGl0ICE9IGVxLmVuZCgpOyBpdCsrKXsKCQkJLy8gYV5iCgkJCWludCBhID0gaXQtPmZpcnN0OwoJCQlpbnQgYiA9IGl0LT5zZWNvbmQ7CgkJCQoJCQlhbnMgPSAoYW5zICogcG93KGEsIGIsIE1PRCkpICUgMTAwMDAwMDAwNzsKCQl9CgoJCXByaW50ZigiJWxsdVxuIiwgYW5zKTsKCX0KCgoJcmV0dXJuIDA7Cn0K