static <A> S replaceAngleBracketVars(S s, Map<S, A> map) {
  ret empty(map) ? s : join(replaceAngleBracketVars(javaTokWithAngleBrackets(s), map));
}

static <A> LS replaceAngleBracketVars(LS tok, Map<S, A> map, BitSet replacedTokens_out default null) {
  if (empty(map)) ret tok;
  tok = cloneList(tok);
  for (int i = 1; i < l(tok); i += 2) {
    S t = tok.get(i);
    if (isAngleBracketed(t)) {
      A t2 = map.get(t);
      if (t2 == null) t2 = map.get(deAngleBracket(t));
      if (t2 != null) {
        tok.set(i, str(t2));
        bitSetSet(replacedTokens_out, i);
      }
    }
  }
  ret tok;
}

sS replaceAngleBracketVars(S s, O... params) {
  ret replaceAngleBracketVars(s, paramsToMap(params));
}