static S selfLink() { ret getActualURI(); } static S selfLink(S p1, O... params) { S uri; if (even(l(params))) uri = botLink(programID(), p1); else uri = getActualURI(); ret uri + htmlQuery(litorderedmap(concatArrays(new O[] {p1}, params))); } static S selfLink(Map params, L keepFields, S... newValues) { new Map map; for (S key : keepFields) { S val = params.get(key); if (val != null) map.put(key, val); } for (int i = 0; i+1 < l(newValues); i += 2) { S key = get(newValues, i); S val = get(newValues, i+1); if (empty(key)) continue; if (empty(val)) map.remove(key); else map.put(key, val); } ret getActualURI() + htmlQuery(map); }