docs: function oInspect (target, index, maxVals, pickAddr, path){//{{{
  
      for (let k in target) {
          var addr = path ? path+"."+k : k;
          var v = target[k];
          var t = getType(v, k);
  
          if (! index[k]) {
              ///console.log(k);
              index[k] = {
                  __: {
                      _PATH_: addr,
                      _COUNT_: 0,
                      _EMPTY_COUNT_: 0,
                      _TYPES_: {},
                  },
                  _ITEMS_: {},
              };
              if (pickAddr[addr]) index[k].__._DATA_ = {};
              if ("object" != typeof v) {
                  index[k].__._VALUES_ = {};
              };
          };
  
          index[k].__._COUNT_ += t == "ARRAY"
              ? v.length
              : 1
          ;
          index[k].__._TYPES_[t] = true; // Annotate type
  
          switch(t) {
              case "OBJECT":
                  oInspect(v, index[k]._ITEMS_, maxVals, pickAddr, addr);
                  if (! Object.keys(v).length) index[k].__._EMPTY_COUNT_++;
                  break;
              case "ARRAY":
                  for (let tt of v) oInspect(tt, index[k]._ITEMS_, maxVals, pickAddr, addr);
                  if (! v.length) index[k].__._EMPTY_COUNT_++;
                  break;
              default:
                  if (! String(v).trim()) index[k].__._EMPTY_COUNT_++;
                  if (index[k].__._VALUES_) {
                      if (Object.keys(index[k].__._VALUES_).length > maxVals) {
                          delete index[k].__._VALUES_;
                      } else {
                          index[k].__._VALUES_[v] = true;
                      };
                  };
                  if (pickAddr[addr]) {
                      index[k].__._DATA_[v] = true;
                  };
  
          };
  
      };
  }