text: YUI.add('features', function (Y, NAME) {
  
  var feature_tests = {};
  
  /**
  Contains the core of YUI's feature test architecture.
  @module features
  */
  
  /**
  * Feature detection
  * @class Features
  * @static
  */
  
  Y.mix(Y.namespace('Features'), {
      
      /**
      * Object hash of all registered feature tests
      * @property tests
      * @type Object
      */
      tests: feature_tests,
      
      /**
      * Add a test to the system
      * 
      *   ```
      *   Y.Features.add("load", "1", {});
      *   ```
      * 
      * @method add
      * @param {String} cat The category, right now only 'load' is supported
      * @param {String} name The number sequence of the test, how it's reported in the URL or config: 1, 2, 3
      * @param {Object} o Object containing test properties
      * @param {String} o.name The name of the test
      * @param {Function} o.test The test function to execute, the only argument to the function is the `Y` instance
      * @param {String} o.trigger The module that triggers this test.
      */
      add: function(cat, name, o) {
          feature_tests[cat] = feature_tests[cat] || {};
          feature_tests[cat][name] = o;
      },
      /**
      * Execute all tests of a given category and return the serialized results
      *
      *   ```
      *   caps=1:1;2:1;3:0
      *   ```
      * @method all
      * @param {String} cat The category to execute
      * @param {Array} args The arguments to pass to the test function
      * @return {String} A semi-colon separated string of tests and their success/failure: 1:1;2:1;3:0
      */
      all: function(cat, args) {
          var cat_o = feature_tests[cat],
              // results = {};
              result = [];
          if (cat_o) {
              Y.Object.each(cat_o, function(v, k) {
                  result.push(k + ':' + (Y.Features.test(cat, k, args) ? 1 : 0));
              });
          }
  
          return (result.length) ? result.join(';') : '';
      },
      /**
      * Run a sepecific test and return a Boolean response.
      *
      *   ```
      *   Y.Features.test("load", "1");
      *   ```
      *
      * @method test
      * @param {String} cat The category of the test to run
      * @param {String} name The name of the test to run
      * @param {Array} args The arguments to pass to the test function
      * @return {Boolean} True or false if the test passed/failed.
      */
      test: function(cat, name, args) {
          args = args || [];
          var result, ua, test,
              cat_o = feature_tests[cat],
              feature = cat_o && cat_o[name];
  
          if (!feature) {
          } else {
  
              result = feature.result;
  
              if (Y.Lang.isUndefined(result)) {
  
                  ua = feature.ua;
                  if (ua) {
                      result = (Y.UA[ua]);
                  }
  
                  test = feature.test;
                  if (test && ((!ua) || result)) {
                      result = test.apply(Y, args);
                  }
  
                  feature.result = result;
              }
          }
  
          return result;
      }
  });
  
  // Y.Features.add("load", "1", {});
  // Y.Features.test("load", "1");
  // caps=1:1;2:0;3:1;
  
  /* This file is auto-generated by (yogi loader --yes --mix --start ../) */
  var add = Y.Features.add;
  // app-transitions-native
  add('load', '0', {
      "name": "app-transitions-native",
      "test": function (Y) {
      var doc  = Y.config.doc,
          node = doc ? doc.documentElement : null;
  
      if (node && node.style) {
          return ('MozTransition' in node.style || 'WebkitTransition' in node.style || 'transition' in node.style);
      }
  
      return false;
  },
      "trigger": "app-transitions"
  });
  // autocomplete-list-keys
  add('load', '1', {
      "name": "autocomplete-list-keys",
      "test": function (Y) {
      // Only add keyboard support to autocomplete-list if this doesn't appear to
      // be an iOS or Android-based mobile device.
      //
      // There's currently no feasible way to actually detect whether a device has
      // a hardware keyboard, so this sniff will have to do. It can easily be
      // overridden by manually loading the autocomplete-list-keys module.
      //
      // Worth noting: even though iOS supports bluetooth keyboards, Mobile Safari
      // doesn't fire the keyboard events used by AutoCompleteList, so there's
      // no point loading the -keys module even when a bluetooth keyboard may be
      // available.
      return !(Y.UA.ios || Y.UA.android);
  },
      "trigger": "autocomplete-list"
  });
  // dd-gestures
  add('load', '2', {
      "name": "dd-gestures",
      "trigger": "dd-drag",
      "ua": "touchEnabled"
  });
  // dom-style-ie
  add('load', '3', {
      "name": "dom-style-ie",
      "test": function (Y) {
  
      var testFeature = Y.Features.test,
          addFeature = Y.Features.add,
          WINDOW = Y.config.win,
          DOCUMENT = Y.config.doc,
          DOCUMENT_ELEMENT = 'documentElement',
          ret = false;
  
      addFeature('style', 'computedStyle', {
          test: function() {
              return WINDOW && 'getComputedStyle' in WINDOW;
          }
      });
  
      addFeature('style', 'opacity', {
          test: function() {
              return DOCUMENT && 'opacity' in DOCUMENT[DOCUMENT_ELEMENT].style;
          }
      });
  
      ret =  (!testFeature('style', 'opacity') &&
              !testFeature('style', 'computedStyle'));
  
      return ret;
  },
      "trigger": "dom-style"
  });
  // editor-para-ie
  add('load', '4', {
      "name": "editor-para-ie",
      "trigger": "editor-para",
      "ua": "ie",
      "when": "instead"
  });
  // event-base-ie
  add('load', '5', {
      "name": "event-base-ie",
      "test": function(Y) {
      var imp = Y.config.doc && Y.config.doc.implementation;
      return (imp && (!imp.hasFeature('Events', '2.0')));
  },
      "trigger": "node-base"
  });
  // graphics-canvas
  add('load', '6', {
      "name": "graphics-canvas",
      "test": function(Y) {
      var DOCUMENT = Y.config.doc,
          useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
  		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
          svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
      return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
  },
      "trigger": "graphics"
  });
  // graphics-canvas-default
  add('load', '7', {
      "name": "graphics-canvas-default",
      "test": function(Y) {
      var DOCUMENT = Y.config.doc,
          useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
  		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
          svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
      return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
  },
      "trigger": "graphics"
  });
  // graphics-svg
  add('load', '8', {
      "name": "graphics-svg",
      "test": function(Y) {
      var DOCUMENT = Y.config.doc,
          useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
  		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
          svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
      
      return svg && (useSVG || !canvas);
  },
      "trigger": "graphics"
  });
  // graphics-svg-default
  add('load', '9', {
      "name": "graphics-svg-default",
      "test": function(Y) {
      var DOCUMENT = Y.config.doc,
          useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
  		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
          svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
      
      return svg && (useSVG || !canvas);
  },
      "trigger": "graphics"
  });
  // graphics-vml
  add('load', '10', {
      "name": "graphics-vml",
      "test": function(Y) {
      var DOCUMENT = Y.config.doc,
  		canvas = DOCUMENT && DOCUMENT.createElement("canvas");
      return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
  },
      "trigger": "graphics"
  });
  // graphics-vml-default
  add('load', '11', {
      "name": "graphics-vml-default",
      "test": function(Y) {
      var DOCUMENT = Y.config.doc,
  		canvas = DOCUMENT && DOCUMENT.createElement("canvas");
      return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
  },
      "trigger": "graphics"
  });
  // history-hash-ie
  add('load', '12', {
      "name": "history-hash-ie",
      "test": function (Y) {
      var docMode = Y.config.doc && Y.config.doc.documentMode;
  
      return Y.UA.ie && (!('onhashchange' in Y.config.win) ||
              !docMode || docMode < 8);
  },
      "trigger": "history-hash"
  });
  // io-nodejs
  add('load', '13', {
      "name": "io-nodejs",
      "trigger": "io-base",
      "ua": "nodejs"
  });
  // scrollview-base-ie
  add('load', '14', {
      "name": "scrollview-base-ie",
      "trigger": "scrollview-base",
      "ua": "ie"
  });
  // selector-css2
  add('load', '15', {
      "name": "selector-css2",
      "test": function (Y) {
      var DOCUMENT = Y.config.doc,
          ret = DOCUMENT && !('querySelectorAll' in DOCUMENT);
  
      return ret;
  },
      "trigger": "selector"
  });
  // transition-timer
  add('load', '16', {
      "name": "transition-timer",
      "test": function (Y) {
      var DOCUMENT = Y.config.doc,
          node = (DOCUMENT) ? DOCUMENT.documentElement: null,
          ret = true;
  
      if (node && node.style) {
          ret = !('MozTransition' in node.style || 'WebkitTransition' in node.style || 'transition' in node.style);
      }
  
      return ret;
  },
      "trigger": "transition"
  });
  // widget-base-ie
  add('load', '17', {
      "name": "widget-base-ie",
      "trigger": "widget-base",
      "ua": "ie"
  });
  // yql-nodejs
  add('load', '18', {
      "name": "yql-nodejs",
      "trigger": "yql",
      "ua": "nodejs",
      "when": "after"
  });
  // yql-winjs
  add('load', '19', {
      "name": "yql-winjs",
      "trigger": "yql",
      "ua": "winjs",
      "when": "after"
  });
  
  }, '@VERSION@', {"requires": ["yui-base"]});
  