#include using namespace std; #define fi first #define se second #define mp make_pair #define gc getchar #define pb push_back #define eb emplace_back #define all(x) (x).begin(),(x).end() #define x1 uvuvwevwevwe #define y1 onyetenyevwe #define x2 ugwemubwem #define y2 ossas typedef long long LL; typedef long double LD; typedef pair pii; template void scan(T &angka){ angka=0;char input=gc();T kali=1; while(!(48<=input&&input<=57)){ if(input=='-') kali=-1;input=gc();} while(48<=input&&input<=57) angka=(angka<<3)+(angka<<1)+input-48,input=gc();angka*=kali; } template void scan(T1 &angka1,T2 &angka2){ scan(angka1);scan(angka2); } const LL mods=1000000007LL; const int MAXN=100000; struct M{ LL x; M(LL angka){ if(angka>=mods||angka<=-mods) angka%=mods; if(angka<0) angka+=mods; x=angka; } M(){ x=0; } M operator + (const M &other) const{ return M(x+other.x); } M operator - (const M &other) const{ return M(x-other.x); } M operator * (const M &other) const{ return M(x*other.x); } M operator - () const{ return M(-x); } bool operator == (const M &other) const{ return x==other.x; } }; struct listocc{ int occ[26]; listocc(){ for(int i=0;i<26;i++) occ[i]=0; } listocc operator - (const listocc &other) const{ listocc ret; for(int i=0;i<26;i++) ret.occ[i]=occ[i]-other.occ[i]; return ret; } }; listocc pre[MAXN+5],occurence; int panjang,q; string input; M fakt[MAXN+5],inv[MAXN+5]; M DnC(M angka,int pangkat){ if(pangkat==0) return M(1); M ret=DnC(angka,pangkat>>1); ret=ret*ret; if(pangkat&1) ret=ret*angka; return ret; } M invers(M x){ return DnC(x,mods-2); } void isifakt(){ fakt[0]=1; for(int i=1;i<=MAXN;i++) fakt[i]=fakt[i-1]*i; for(int i=0;i<=MAXN;i++) inv[i]=invers(fakt[i]); } int main() { isifakt(); cin>>input; panjang=input.length(); for(int i=0;i>1; ans=ans*inv[occurence.occ[j]>>1]; } ans=ans*fakt[sum]; if(ganjil==0) ganjil=1; ans=ans*ganjil; cout<