docs: protected void renderInputBegin(FacesContext facesContext,
              UIComponent component) throws IOException
      {
          ResponseWriter writer = facesContext.getResponseWriter();
  
          String clientId = component.getClientId(facesContext);
  
          writer.startElement(HTML.INPUT_ELEM, component);
          writer.writeAttribute(HTML.ID_ATTR, clientId, null);
          writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
          
          //allow extending classes to modify html input element's type
          String inputHtmlType = getInputHtmlType(component);
          writer.writeAttribute(HTML.TYPE_ATTR, inputHtmlType, null);
  
          renderValue(facesContext, component, writer);
  
          Map<String, List<ClientBehavior>> behaviors = null;
          if (component instanceof ClientBehaviorHolder)
          {
              behaviors = ((ClientBehaviorHolder) component).getClientBehaviors();
              
              long commonPropertiesMarked = 0L;
              if (isCommonPropertiesOptimizationEnabled(facesContext))
              {
                  commonPropertiesMarked = CommonPropertyUtils.getCommonPropertiesMarked(component);
              }
              if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
              {
                  CommonPropertyUtils.renderChangeEventProperty(writer, 
                          commonPropertiesMarked, component);
                  CommonPropertyUtils.renderEventProperties(writer, 
                          commonPropertiesMarked, component);
                  CommonPropertyUtils.renderFieldEventPropertiesWithoutOnchange(writer, 
                          commonPropertiesMarked, component);
              }
              else
              {
                  HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, component, behaviors);
                  if (isCommonEventsOptimizationEnabled(facesContext))
                  {
                      Long commonEventsMarked = CommonEventUtils.getCommonEventsMarked(component);
                      CommonEventUtils.renderBehaviorizedEventHandlers(facesContext, writer, 
                              commonPropertiesMarked, commonEventsMarked, component, behaviors);
                      CommonEventUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
                          facesContext, writer, commonPropertiesMarked, commonEventsMarked, component, behaviors);
                  }
                  else
                  {
                      HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
                      HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
                              facesContext, writer, component, behaviors);
                  }
              }
              if (isCommonPropertiesOptimizationEnabled(facesContext))
              {
                  CommonPropertyUtils.renderInputPassthroughPropertiesWithoutDisabledAndEvents(writer, 
                          commonPropertiesMarked, component);
              }
              else
              {
                  HtmlRendererUtils.renderHTMLAttributes(writer, component, 
                          HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS);
              }
          }
          else
          {
              if (isCommonPropertiesOptimizationEnabled(facesContext))
              {
                  CommonPropertyUtils.renderInputPassthroughPropertiesWithoutDisabled(writer, 
                          CommonPropertyUtils.getCommonPropertiesMarked(component), component);
              }
              else
              {
                  HtmlRendererUtils.renderHTMLAttributes(writer, component, 
                          HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
              }
          }
  
          if (isDisabled(facesContext, component))
          {
              writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
          }
  
          if (isAutocompleteOff(facesContext, component))
          {
              writer.writeAttribute(HTML.AUTOCOMPLETE_ATTR, AUTOCOMPLETE_VALUE_OFF, HTML.AUTOCOMPLETE_ATTR);
          }
      }