static Uri()
{
// alpha/digits characters
byte unreserved = SCHEME | USER | HOST | PATH | QUERY | FRAG;
for (int i='a'; i<='z'; ++i) { charMap[i] = unreserved; nameMap[i] = true; }
for (int i='A'; i<='Z'; ++i) { charMap[i] = unreserved; nameMap[i] = true; }
for (int i='0'; i<='9'; ++i) { charMap[i] = unreserved; nameMap[i] = true; }
// unreserved symbols
charMap['-'] = unreserved; nameMap['-'] = true;
charMap['.'] = unreserved; nameMap['.'] = true;
charMap['_'] = unreserved; nameMap['_'] = true;
charMap['~'] = unreserved; nameMap['~'] = true;
// hex
for (int i='0'; i<='9'; ++i) charMap[i] |= HEX | DIGIT;
for (int i='a'; i<='f'; ++i) charMap[i] |= HEX;
for (int i='A'; i<='F'; ++i) charMap[i] |= HEX;
// sub-delimiter symbols
charMap['!'] = USER | HOST | PATH | QUERY | FRAG;
charMap['$'] = USER | HOST | PATH | QUERY | FRAG;
charMap['&'] = USER | HOST | PATH | QUERY | FRAG;
charMap['\''] = USER | HOST | PATH | QUERY | FRAG;
charMap['('] = USER | HOST | PATH | QUERY | FRAG;
charMap[')'] = USER | HOST | PATH | QUERY | FRAG;
charMap['*'] = USER | HOST | PATH | QUERY | FRAG;
charMap['+'] = SCHEME | USER | HOST | PATH | FRAG;
charMap[','] = USER | HOST | PATH | QUERY | FRAG;
charMap[';'] = USER | HOST | PATH | QUERY | FRAG;
charMap['='] = USER | HOST | PATH | QUERY | FRAG;
// gen-delimiter symbols
charMap[':'] = PATH | USER | QUERY | FRAG;
charMap['/'] = PATH | QUERY | FRAG;
charMap['?'] = QUERY | FRAG;
charMap['#'] = 0;
charMap['['] = 0;
charMap[']'] = 0;
charMap['@'] = PATH | QUERY | FRAG;
// delimiter escape map - which characters need to
// be backslashed escaped in each section
delimEscMap[':'] = PATH;
delimEscMap['/'] = PATH;
delimEscMap['?'] = PATH;
delimEscMap['#'] = PATH | QUERY;
delimEscMap['&'] = QUERY;
delimEscMap[';'] = QUERY;
delimEscMap['='] = QUERY;
delimEscMap['\\'] = SCHEME | USER | HOST | PATH | QUERY | FRAG;
}