#include <iostream>
#include <vector>
template <typename String>
struct First {
template <typename T>
using ArrayType = std::vector<T>;
};
template <typename String, typename T>
struct Second {
void go() { std::cout << "General\n"; }
};
template <typename String, typename T>
struct Second < String, typename First<String>::template ArrayType<T> > {
void go() { std::cout << "Specialized\n"; }
};
int main() {
Second < std::vector<char>, std::vector<int> > second;
second.go();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZz4Kc3RydWN0IEZpcnN0IHsKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJdXNpbmcgQXJyYXlUeXBlID0gc3RkOjp2ZWN0b3I8VD47Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nLCB0eXBlbmFtZSBUPgpzdHJ1Y3QgU2Vjb25kIHsKCXZvaWQgZ28oKSB7IHN0ZDo6Y291dCA8PCAiR2VuZXJhbFxuIjsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZywgdHlwZW5hbWUgVD4Kc3RydWN0IFNlY29uZCA8IFN0cmluZywgdHlwZW5hbWUgRmlyc3Q8U3RyaW5nPjo6dGVtcGxhdGUgQXJyYXlUeXBlPFQ+ID4gewoJdm9pZCBnbygpIHsgc3RkOjpjb3V0IDw8ICJTcGVjaWFsaXplZFxuIjsgfQp9OwoKaW50IG1haW4oKSB7CglTZWNvbmQgPCBzdGQ6OnZlY3RvcjxjaGFyPiwgc3RkOjp2ZWN0b3I8aW50PiA+IHNlY29uZDsKCXNlY29uZC5nbygpOwoJcmV0dXJuIDA7Cn0=