public static bool TryFrom(string value, AreaMap area, out QueryETag etag) { etag = null; var parts = value.Split('@'); if (parts.Length > 0 && FlowKey.TryFrom(parts[0], area, out var key)) { var checkpoint = parts.Length == 2 && long.TryParse(parts[1], out var position) ? new TimelinePosition(position) : TimelinePosition.None; etag = new QueryETag(key, checkpoint); } return(etag != null); }