docs: static List[] findTypos(Collection<String> fields, Mapping mapping) {
          Set<String> keys = mapping.flatten().keySet();
  
          // find missing
          List<String> missing = new ArrayList<String>(fields.size());
  
          for (String field : fields) {
              if (!keys.contains(field) && !isBuiltIn(field)) {
                  missing.add(field);
              }
          }
          if (missing.isEmpty()) {
              return null;
          }
          Map<String, String> unwrapped = new LinkedHashMap<String, String>();
          // find similar
          for (String key : keys) {
              int match = key.lastIndexOf(".");
              if (match > 0) {
                  String leafField = key.substring(match + 1);
                  // leaf fields are secondary to top-level ones (in case of overwrite, the top level ones win)
                  if (!unwrapped.containsKey(leafField)) {
                      unwrapped.put(leafField, key);
                  }
              }
              unwrapped.put(key, key);
          }
  
          List<String> typos = new ArrayList<String>();
  
          Set<String> similar = unwrapped.keySet();
          for (String string : missing) {
              List<String> matches = StringUtils.findSimiliar(string, similar);
              for (String match : matches) {
                  // get actual field
                  typos.add(unwrapped.get(match));
              }
          }
  
          return new List[] { missing, typos };
      }