text: define([
      "./core",
      "./manipulation/var/rcheckableType",
      "./core/init",
      "./traversing", // filter
      "./attributes/prop"
  ], function (jQuery, rcheckableType) {
  
      var r20 = /%20/g,
          rbracket = /\[\]$/,
          rCRLF = /\r?\n/g,
          rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
          rsubmittable = /^(?:input|select|textarea|keygen)/i;
  
      function buildParams(prefix, obj, traditional, add) {
          var name;
  
          if (jQuery.isArray(obj)) {
              // Serialize array item.
              jQuery.each(obj, function (i, v) {
                  if (traditional || rbracket.test(prefix)) {
                      // Treat each array item as a scalar.
                      add(prefix, v);
  
                  } else {
                      // Item is non-scalar (array or object), encode its numeric index.
                      buildParams(prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add);
                  }
              });
  
          } else if (!traditional && jQuery.type(obj) === "object") {
              // Serialize object item.
              for (name in obj) {
                  buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
              }
  
          } else {
              // Serialize scalar item.
              add(prefix, obj);
          }
      }
  
  // Serialize an array of form elements or a set of
  // key/values into a query string
      jQuery.param = function (a, traditional) {
          var prefix,
              s = [],
              add = function (key, value) {
                  // If value is a function, invoke it and return its value
                  value = jQuery.isFunction(value) ? value() : ( value == null ? "" : value );
                  s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
              };
  
          // Set traditional to true for jQuery <= 1.3.2 behavior.
          if (traditional === undefined) {
              traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
          }
  
          // If an array was passed in, assume that it is an array of form elements.
          if (jQuery.isArray(a) || ( a.jquery && !jQuery.isPlainObject(a) )) {
              // Serialize the form elements
              jQuery.each(a, function () {
                  add(this.name, this.value);
              });
  
          } else {
              // If traditional, encode the "old" way (the way 1.3.2 or older
              // did it), otherwise encode params recursively.
              for (prefix in a) {
                  buildParams(prefix, a[prefix], traditional, add);
              }
          }
  
          // Return the resulting serialization
          return s.join("&").replace(r20, "+");
      };
  
      jQuery.fn.extend({
          serialize: function () {
              return jQuery.param(this.serializeArray());
          },
          serializeArray: function () {
              return this.map(function () {
                  // Can add propHook for "elements" to filter or add form elements
                  var elements = jQuery.prop(this, "elements");
                  return elements ? jQuery.makeArray(elements) : this;
              })
                  .filter(function () {
                      var type = this.type;
  
                      // Use .is( ":disabled" ) so that fieldset[disabled] works
                      return this.name && !jQuery(this).is(":disabled") &&
                          rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) &&
                          ( this.checked || !rcheckableType.test(type) );
                  })
                  .map(function (i, elem) {
                      var val = jQuery(this).val();
  
                      return val == null ?
                          null :
                          jQuery.isArray(val) ?
                              jQuery.map(val, function (val) {
                                  return {name: elem.name, value: val.replace(rCRLF, "\r\n")};
                              }) :
                              {name: elem.name, value: val.replace(rCRLF, "\r\n")};
                  }).get();
          }
      });
  
      return jQuery;
  });
  