docs: public static NetFlowV9OptionTemplate parseOptionTemplate(ByteBuf bb, NetFlowV9FieldTypeRegistry typeRegistry) {
          int length = bb.readUnsignedShort();
          final int templateId = bb.readUnsignedShort();
  
          int optionScopeLength = bb.readUnsignedShort();
          int optionLength = bb.readUnsignedShort();
  
          int p = bb.readerIndex();
          int endOfScope = p + optionScopeLength;
          int endOfOption = endOfScope + optionLength;
          int endOfTemplate = p - 10 + length;
  
          final ImmutableList.Builder<NetFlowV9ScopeDef> scopeDefs = ImmutableList.builder();
          while (bb.readerIndex() < endOfScope) {
              int scopeType = bb.readUnsignedShort();
              int scopeLength = bb.readUnsignedShort();
              scopeDefs.add(NetFlowV9ScopeDef.create(scopeType, scopeLength));
          }
  
          // skip padding
          bb.readerIndex(endOfScope);
  
          final ImmutableList.Builder<NetFlowV9FieldDef> optionDefs = ImmutableList.builder();
          while (bb.readerIndex() < endOfOption) {
              int optType = bb.readUnsignedShort();
              int optLength = bb.readUnsignedShort();
              NetFlowV9FieldType t = typeRegistry.get(optType);
              if (t == null) {
                  t = NetFlowV9FieldType.create(optType, NetFlowV9FieldType.ValueType.byLength(optLength), "option_" + optType);
              }
              optionDefs.add(NetFlowV9FieldDef.create(t, optLength));
          }
  
          // skip padding
          bb.readerIndex(endOfTemplate);
  
          return NetFlowV9OptionTemplate.create(templateId, scopeDefs.build(), optionDefs.build());
      }