code: func traverse(path string, j interface{}) ([]*pair, error) {
  	kvs := make([]*pair, 0)
  
  	pathPre := ""
  	if path != "" {
  		pathPre = path + "/"
  	}
  
  	switch j.(type) {
  	case []interface{}:
  		for sk, sv := range j.([]interface{}) {
  			skvs, err := traverse(pathPre+strconv.Itoa(sk), sv)
  			if err != nil {
  				return nil, err
  			}
  			kvs = append(kvs, skvs...)
  		}
  	case map[string]interface{}:
  		for sk, sv := range j.(map[string]interface{}) {
  			skvs, err := traverse(pathPre+sk, sv)
  			if err != nil {
  				return nil, err
  			}
  			kvs = append(kvs, skvs...)
  		}
  	case int:
  		kvs = append(kvs, &pair{Key: path, Value: strconv.Itoa(j.(int))})
  	case int64:
  
  		var y int = int(j.(int64))
  
  		kvs = append(kvs, &pair{Key: path, Value: strconv.Itoa(y)})
  	case float64:
  		kvs = append(kvs, &pair{Key: path, Value: strconv.FormatFloat(j.(float64), 'f', -1, 64)})
  	case bool:
  		kvs = append(kvs, &pair{Key: path, Value: strconv.FormatBool(j.(bool))})
  	case nil:
  		kvs = append(kvs, &pair{Key: path, Value: ""})
  	default:
  		kvs = append(kvs, &pair{Key: path, Value: j.(string)})
  	}
  
  	return kvs, nil
  }
docs: // Traverse or walk hierarchical configuration in preparation for loading into Registry