packages feed

react-haskell 1.3.0.0 → 2.0.0

raw patch · 20 files changed

+21300/−1856 lines, 20 filesdep +aesondep +ghcjs-basedep +ghcjs-domdep −haste-compilerdep −haste-lib

Dependencies added: aeson, ghcjs-base, ghcjs-dom, ghcjs-prim, text, unordered-containers

Dependencies removed: haste-compiler, haste-lib

Files

− lib/bezier.js
@@ -1,156 +0,0 @@-/**- * BezierEasing - use bezier curve for transition easing function- * by Gaëtan Renaudeau 2014 – MIT License- *- * Credits: is based on Firefox's nsSMILKeySpline.cpp- * Usage:- * var spline = BezierEasing(0.25, 0.1, 0.25, 1.0)- * spline(x) => returns the easing value | x must be in [0, 1] range- *- */-(function (definition) {-  if (typeof exports === "object") {-    module.exports = definition();-  } else if (typeof define === 'function' && define.amd) {-    define([], definition);-  } else {-    window.BezierEasing = definition();-  }-}(function () {-  var global = this;--  // These values are established by empiricism with tests (tradeoff: performance VS precision)-  var NEWTON_ITERATIONS = 4;-  var NEWTON_MIN_SLOPE = 0.001;-  var SUBDIVISION_PRECISION = 0.0000001;-  var SUBDIVISION_MAX_ITERATIONS = 10;--  var kSplineTableSize = 11;-  var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);--  var float32ArraySupported = 'Float32Array' in global;--  function BezierEasing (mX1, mY1, mX2, mY2) {-    // Validate arguments-    if (arguments.length !== 4) {-      throw new Error("BezierEasing requires 4 arguments.");-    }-    for (var i=0; i<4; ++i) {-      if (typeof arguments[i] !== "number" || isNaN(arguments[i]) || !isFinite(arguments[i])) {-        throw new Error("BezierEasing arguments should be integers.");-      } -    }-    if (mX1 < 0 || mX1 > 1 || mX2 < 0 || mX2 > 1) {-      throw new Error("BezierEasing x values must be in [0, 1] range.");-    }--    var mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);-   -    function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }-    function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }-    function C (aA1)      { return 3.0 * aA1; }-   -    // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.-    function calcBezier (aT, aA1, aA2) {-      return ((A(aA1, aA2)*aT + B(aA1, aA2))*aT + C(aA1))*aT;-    }-   -    // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.-    function getSlope (aT, aA1, aA2) {-      return 3.0 * A(aA1, aA2)*aT*aT + 2.0 * B(aA1, aA2) * aT + C(aA1);-    }--    function newtonRaphsonIterate (aX, aGuessT) {-      for (var i = 0; i < NEWTON_ITERATIONS; ++i) {-        var currentSlope = getSlope(aGuessT, mX1, mX2);-        if (currentSlope === 0.0) return aGuessT;-        var currentX = calcBezier(aGuessT, mX1, mX2) - aX;-        aGuessT -= currentX / currentSlope;-      }-      return aGuessT;-    }--    function calcSampleValues () {-      for (var i = 0; i < kSplineTableSize; ++i) {-        mSampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);-      }-    }--    function binarySubdivide (aX, aA, aB) {-      var currentX, currentT, i = 0;-      do {-        currentT = aA + (aB - aA) / 2.0;-        currentX = calcBezier(currentT, mX1, mX2) - aX;-        if (currentX > 0.0) {-          aB = currentT;-        } else {-          aA = currentT;-        }-      } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);-      return currentT;-    }--    function getTForX (aX) {-      var intervalStart = 0.0;-      var currentSample = 1;-      var lastSample = kSplineTableSize - 1;--      for (; currentSample != lastSample && mSampleValues[currentSample] <= aX; ++currentSample) {-        intervalStart += kSampleStepSize;-      }-      --currentSample;--      // Interpolate to provide an initial guess for t-      var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample+1] - mSampleValues[currentSample]);-      var guessForT = intervalStart + dist * kSampleStepSize;--      var initialSlope = getSlope(guessForT, mX1, mX2);-      if (initialSlope >= NEWTON_MIN_SLOPE) {-        return newtonRaphsonIterate(aX, guessForT);-      } else if (initialSlope === 0.0) {-        return guessForT;-      } else {-        return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize);-      }-    }--    var _precomputed = false;-    function precompute() {-      _precomputed = true;-      if (mX1 != mY1 || mX2 != mY2)-        calcSampleValues();-    }--    var f = function (aX) {-      if (!_precomputed) precompute();-      if (mX1 === mY1 && mX2 === mY2) return aX; // linear-      // Because JavaScript number are imprecise, we should guarantee the extremes are right.-      if (aX === 0) return 0;-      if (aX === 1) return 1;-      return calcBezier(getTForX(aX), mY1, mY2);-    };--    f.getControlPoints = function() { return [{ x: mX1, y: mY1 }, { x: mX2, y: mY2 }]; };--    var args = [mX1, mY1, mX2, mY2];-    var str = "BezierEasing("+args+")";-    f.toString = function () { return str; };--    var css = "cubic-bezier("+args+")";-    f.toCSS = function () { return css; };--    return f;-  }--  // CSS mapping-  BezierEasing.css = {-    "ease":        BezierEasing(0.25, 0.1, 0.25, 1.0),-    "linear":      BezierEasing(0.00, 0.0, 1.00, 1.0),-    "ease-in":     BezierEasing(0.42, 0.0, 1.00, 1.0),-    "ease-out":    BezierEasing(0.00, 0.0, 0.58, 1.0),-    "ease-in-out": BezierEasing(0.42, 0.0, 0.58, 1.0)-  };--  return BezierEasing;--}));
+ lib/react.js view
@@ -0,0 +1,19602 @@+/**+ * React v0.13.3+ */+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.React = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule React+ */++/* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/++'use strict';++var EventPluginUtils = _dereq_(19);+var ReactChildren = _dereq_(32);+var ReactComponent = _dereq_(34);+var ReactClass = _dereq_(33);+var ReactContext = _dereq_(38);+var ReactCurrentOwner = _dereq_(39);+var ReactElement = _dereq_(57);+var ReactElementValidator = _dereq_(58);+var ReactDOM = _dereq_(40);+var ReactDOMTextComponent = _dereq_(51);+var ReactDefaultInjection = _dereq_(54);+var ReactInstanceHandles = _dereq_(66);+var ReactMount = _dereq_(70);+var ReactPerf = _dereq_(75);+var ReactPropTypes = _dereq_(78);+var ReactReconciler = _dereq_(81);+var ReactServerRendering = _dereq_(84);++var assign = _dereq_(27);+var findDOMNode = _dereq_(117);+var onlyChild = _dereq_(144);++ReactDefaultInjection.inject();++var createElement = ReactElement.createElement;+var createFactory = ReactElement.createFactory;+var cloneElement = ReactElement.cloneElement;++if ("production" !== "development") {+  createElement = ReactElementValidator.createElement;+  createFactory = ReactElementValidator.createFactory;+  cloneElement = ReactElementValidator.cloneElement;+}++var render = ReactPerf.measure('React', 'render', ReactMount.render);++var React = {+  Children: {+    map: ReactChildren.map,+    forEach: ReactChildren.forEach,+    count: ReactChildren.count,+    only: onlyChild+  },+  Component: ReactComponent,+  DOM: ReactDOM,+  PropTypes: ReactPropTypes,+  initializeTouchEvents: function(shouldUseTouch) {+    EventPluginUtils.useTouchEvents = shouldUseTouch;+  },+  createClass: ReactClass.createClass,+  createElement: createElement,+  cloneElement: cloneElement,+  createFactory: createFactory,+  createMixin: function(mixin) {+    // Currently a noop. Will be used to validate and trace mixins.+    return mixin;+  },+  constructAndRenderComponent: ReactMount.constructAndRenderComponent,+  constructAndRenderComponentByID: ReactMount.constructAndRenderComponentByID,+  findDOMNode: findDOMNode,+  render: render,+  renderToString: ReactServerRendering.renderToString,+  renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup,+  unmountComponentAtNode: ReactMount.unmountComponentAtNode,+  isValidElement: ReactElement.isValidElement,+  withContext: ReactContext.withContext,++  // Hook for JSX spread, don't use this for anything else.+  __spread: assign+};++// Inject the runtime into a devtools global hook regardless of browser.+// Allows for debugging when the hook is injected on the page.+if (+  typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&+  typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {+  __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({+    CurrentOwner: ReactCurrentOwner,+    InstanceHandles: ReactInstanceHandles,+    Mount: ReactMount,+    Reconciler: ReactReconciler,+    TextComponent: ReactDOMTextComponent+  });+}++if ("production" !== "development") {+  var ExecutionEnvironment = _dereq_(21);+  if (ExecutionEnvironment.canUseDOM && window.top === window.self) {++    // If we're in Chrome, look for the devtools marker and provide a download+    // link if not installed.+    if (navigator.userAgent.indexOf('Chrome') > -1) {+      if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {+        console.debug(+          'Download the React DevTools for a better development experience: ' ++          'https://fb.me/react-devtools'+        );+      }+    }++    var expectedFeatures = [+      // shims+      Array.isArray,+      Array.prototype.every,+      Array.prototype.forEach,+      Array.prototype.indexOf,+      Array.prototype.map,+      Date.now,+      Function.prototype.bind,+      Object.keys,+      String.prototype.split,+      String.prototype.trim,++      // shams+      Object.create,+      Object.freeze+    ];++    for (var i = 0; i < expectedFeatures.length; i++) {+      if (!expectedFeatures[i]) {+        console.error(+          'One or more ES5 shim/shams expected by React are not available: ' ++          'https://fb.me/react-warning-polyfills'+        );+        break;+      }+    }+  }+}++React.version = '0.13.3';++module.exports = React;++},{"117":117,"144":144,"19":19,"21":21,"27":27,"32":32,"33":33,"34":34,"38":38,"39":39,"40":40,"51":51,"54":54,"57":57,"58":58,"66":66,"70":70,"75":75,"78":78,"81":81,"84":84}],2:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule AutoFocusMixin+ * @typechecks static-only+ */++'use strict';++var focusNode = _dereq_(119);++var AutoFocusMixin = {+  componentDidMount: function() {+    if (this.props.autoFocus) {+      focusNode(this.getDOMNode());+    }+  }+};++module.exports = AutoFocusMixin;++},{"119":119}],3:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015 Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule BeforeInputEventPlugin+ * @typechecks static-only+ */++'use strict';++var EventConstants = _dereq_(15);+var EventPropagators = _dereq_(20);+var ExecutionEnvironment = _dereq_(21);+var FallbackCompositionState = _dereq_(22);+var SyntheticCompositionEvent = _dereq_(93);+var SyntheticInputEvent = _dereq_(97);++var keyOf = _dereq_(141);++var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space+var START_KEYCODE = 229;++var canUseCompositionEvent = (+  ExecutionEnvironment.canUseDOM &&+  'CompositionEvent' in window+);++var documentMode = null;+if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {+  documentMode = document.documentMode;+}++// Webkit offers a very useful `textInput` event that can be used to+// directly represent `beforeInput`. The IE `textinput` event is not as+// useful, so we don't use it.+var canUseTextInputEvent = (+  ExecutionEnvironment.canUseDOM &&+  'TextEvent' in window &&+  !documentMode &&+  !isPresto()+);++// In IE9+, we have access to composition events, but the data supplied+// by the native compositionend event may be incorrect. Japanese ideographic+// spaces, for instance (\u3000) are not recorded correctly.+var useFallbackCompositionData = (+  ExecutionEnvironment.canUseDOM &&+  (+    (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11)+  )+);++/**+ * Opera <= 12 includes TextEvent in window, but does not fire+ * text input events. Rely on keypress instead.+ */+function isPresto() {+  var opera = window.opera;+  return (+    typeof opera === 'object' &&+    typeof opera.version === 'function' &&+    parseInt(opera.version(), 10) <= 12+  );+}++var SPACEBAR_CODE = 32;+var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);++var topLevelTypes = EventConstants.topLevelTypes;++// Events and their corresponding property names.+var eventTypes = {+  beforeInput: {+    phasedRegistrationNames: {+      bubbled: keyOf({onBeforeInput: null}),+      captured: keyOf({onBeforeInputCapture: null})+    },+    dependencies: [+      topLevelTypes.topCompositionEnd,+      topLevelTypes.topKeyPress,+      topLevelTypes.topTextInput,+      topLevelTypes.topPaste+    ]+  },+  compositionEnd: {+    phasedRegistrationNames: {+      bubbled: keyOf({onCompositionEnd: null}),+      captured: keyOf({onCompositionEndCapture: null})+    },+    dependencies: [+      topLevelTypes.topBlur,+      topLevelTypes.topCompositionEnd,+      topLevelTypes.topKeyDown,+      topLevelTypes.topKeyPress,+      topLevelTypes.topKeyUp,+      topLevelTypes.topMouseDown+    ]+  },+  compositionStart: {+    phasedRegistrationNames: {+      bubbled: keyOf({onCompositionStart: null}),+      captured: keyOf({onCompositionStartCapture: null})+    },+    dependencies: [+      topLevelTypes.topBlur,+      topLevelTypes.topCompositionStart,+      topLevelTypes.topKeyDown,+      topLevelTypes.topKeyPress,+      topLevelTypes.topKeyUp,+      topLevelTypes.topMouseDown+    ]+  },+  compositionUpdate: {+    phasedRegistrationNames: {+      bubbled: keyOf({onCompositionUpdate: null}),+      captured: keyOf({onCompositionUpdateCapture: null})+    },+    dependencies: [+      topLevelTypes.topBlur,+      topLevelTypes.topCompositionUpdate,+      topLevelTypes.topKeyDown,+      topLevelTypes.topKeyPress,+      topLevelTypes.topKeyUp,+      topLevelTypes.topMouseDown+    ]+  }+};++// Track whether we've ever handled a keypress on the space key.+var hasSpaceKeypress = false;++/**+ * Return whether a native keypress event is assumed to be a command.+ * This is required because Firefox fires `keypress` events for key commands+ * (cut, copy, select-all, etc.) even though no character is inserted.+ */+function isKeypressCommand(nativeEvent) {+  return (+    (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&+    // ctrlKey && altKey is equivalent to AltGr, and is not a command.+    !(nativeEvent.ctrlKey && nativeEvent.altKey)+  );+}+++/**+ * Translate native top level events into event types.+ *+ * @param {string} topLevelType+ * @return {object}+ */+function getCompositionEventType(topLevelType) {+  switch (topLevelType) {+    case topLevelTypes.topCompositionStart:+      return eventTypes.compositionStart;+    case topLevelTypes.topCompositionEnd:+      return eventTypes.compositionEnd;+    case topLevelTypes.topCompositionUpdate:+      return eventTypes.compositionUpdate;+  }+}++/**+ * Does our fallback best-guess model think this event signifies that+ * composition has begun?+ *+ * @param {string} topLevelType+ * @param {object} nativeEvent+ * @return {boolean}+ */+function isFallbackCompositionStart(topLevelType, nativeEvent) {+  return (+    topLevelType === topLevelTypes.topKeyDown &&+    nativeEvent.keyCode === START_KEYCODE+  );+}++/**+ * Does our fallback mode think that this event is the end of composition?+ *+ * @param {string} topLevelType+ * @param {object} nativeEvent+ * @return {boolean}+ */+function isFallbackCompositionEnd(topLevelType, nativeEvent) {+  switch (topLevelType) {+    case topLevelTypes.topKeyUp:+      // Command keys insert or clear IME input.+      return (END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1);+    case topLevelTypes.topKeyDown:+      // Expect IME keyCode on each keydown. If we get any other+      // code we must have exited earlier.+      return (nativeEvent.keyCode !== START_KEYCODE);+    case topLevelTypes.topKeyPress:+    case topLevelTypes.topMouseDown:+    case topLevelTypes.topBlur:+      // Events are not possible without cancelling IME.+      return true;+    default:+      return false;+  }+}++/**+ * Google Input Tools provides composition data via a CustomEvent,+ * with the `data` property populated in the `detail` object. If this+ * is available on the event object, use it. If not, this is a plain+ * composition event and we have nothing special to extract.+ *+ * @param {object} nativeEvent+ * @return {?string}+ */+function getDataFromCustomEvent(nativeEvent) {+  var detail = nativeEvent.detail;+  if (typeof detail === 'object' && 'data' in detail) {+    return detail.data;+  }+  return null;+}++// Track the current IME composition fallback object, if any.+var currentComposition = null;++/**+ * @param {string} topLevelType Record from `EventConstants`.+ * @param {DOMEventTarget} topLevelTarget The listening component root node.+ * @param {string} topLevelTargetID ID of `topLevelTarget`.+ * @param {object} nativeEvent Native browser event.+ * @return {?object} A SyntheticCompositionEvent.+ */+function extractCompositionEvent(+  topLevelType,+  topLevelTarget,+  topLevelTargetID,+  nativeEvent+) {+  var eventType;+  var fallbackData;++  if (canUseCompositionEvent) {+    eventType = getCompositionEventType(topLevelType);+  } else if (!currentComposition) {+    if (isFallbackCompositionStart(topLevelType, nativeEvent)) {+      eventType = eventTypes.compositionStart;+    }+  } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {+    eventType = eventTypes.compositionEnd;+  }++  if (!eventType) {+    return null;+  }++  if (useFallbackCompositionData) {+    // The current composition is stored statically and must not be+    // overwritten while composition continues.+    if (!currentComposition && eventType === eventTypes.compositionStart) {+      currentComposition = FallbackCompositionState.getPooled(topLevelTarget);+    } else if (eventType === eventTypes.compositionEnd) {+      if (currentComposition) {+        fallbackData = currentComposition.getData();+      }+    }+  }++  var event = SyntheticCompositionEvent.getPooled(+    eventType,+    topLevelTargetID,+    nativeEvent+  );++  if (fallbackData) {+    // Inject data generated from fallback path into the synthetic event.+    // This matches the property of native CompositionEventInterface.+    event.data = fallbackData;+  } else {+    var customData = getDataFromCustomEvent(nativeEvent);+    if (customData !== null) {+      event.data = customData;+    }+  }++  EventPropagators.accumulateTwoPhaseDispatches(event);+  return event;+}++/**+ * @param {string} topLevelType Record from `EventConstants`.+ * @param {object} nativeEvent Native browser event.+ * @return {?string} The string corresponding to this `beforeInput` event.+ */+function getNativeBeforeInputChars(topLevelType, nativeEvent) {+  switch (topLevelType) {+    case topLevelTypes.topCompositionEnd:+      return getDataFromCustomEvent(nativeEvent);+    case topLevelTypes.topKeyPress:+      /**+       * If native `textInput` events are available, our goal is to make+       * use of them. However, there is a special case: the spacebar key.+       * In Webkit, preventing default on a spacebar `textInput` event+       * cancels character insertion, but it *also* causes the browser+       * to fall back to its default spacebar behavior of scrolling the+       * page.+       *+       * Tracking at:+       * https://code.google.com/p/chromium/issues/detail?id=355103+       *+       * To avoid this issue, use the keypress event as if no `textInput`+       * event is available.+       */+      var which = nativeEvent.which;+      if (which !== SPACEBAR_CODE) {+        return null;+      }++      hasSpaceKeypress = true;+      return SPACEBAR_CHAR;++    case topLevelTypes.topTextInput:+      // Record the characters to be added to the DOM.+      var chars = nativeEvent.data;++      // If it's a spacebar character, assume that we have already handled+      // it at the keypress level and bail immediately. Android Chrome+      // doesn't give us keycodes, so we need to blacklist it.+      if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {+        return null;+      }++      return chars;++    default:+      // For other native event types, do nothing.+      return null;+  }+}++/**+ * For browsers that do not provide the `textInput` event, extract the+ * appropriate string to use for SyntheticInputEvent.+ *+ * @param {string} topLevelType Record from `EventConstants`.+ * @param {object} nativeEvent Native browser event.+ * @return {?string} The fallback string for this `beforeInput` event.+ */+function getFallbackBeforeInputChars(topLevelType, nativeEvent) {+  // If we are currently composing (IME) and using a fallback to do so,+  // try to extract the composed characters from the fallback object.+  if (currentComposition) {+    if (+      topLevelType === topLevelTypes.topCompositionEnd ||+      isFallbackCompositionEnd(topLevelType, nativeEvent)+    ) {+      var chars = currentComposition.getData();+      FallbackCompositionState.release(currentComposition);+      currentComposition = null;+      return chars;+    }+    return null;+  }++  switch (topLevelType) {+    case topLevelTypes.topPaste:+      // If a paste event occurs after a keypress, throw out the input+      // chars. Paste events should not lead to BeforeInput events.+      return null;+    case topLevelTypes.topKeyPress:+      /**+       * As of v27, Firefox may fire keypress events even when no character+       * will be inserted. A few possibilities:+       *+       * - `which` is `0`. Arrow keys, Esc key, etc.+       *+       * - `which` is the pressed key code, but no char is available.+       *   Ex: 'AltGr + d` in Polish. There is no modified character for+       *   this key combination and no character is inserted into the+       *   document, but FF fires the keypress for char code `100` anyway.+       *   No `input` event will occur.+       *+       * - `which` is the pressed key code, but a command combination is+       *   being used. Ex: `Cmd+C`. No character is inserted, and no+       *   `input` event will occur.+       */+      if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {+        return String.fromCharCode(nativeEvent.which);+      }+      return null;+    case topLevelTypes.topCompositionEnd:+      return useFallbackCompositionData ? null : nativeEvent.data;+    default:+      return null;+  }+}++/**+ * Extract a SyntheticInputEvent for `beforeInput`, based on either native+ * `textInput` or fallback behavior.+ *+ * @param {string} topLevelType Record from `EventConstants`.+ * @param {DOMEventTarget} topLevelTarget The listening component root node.+ * @param {string} topLevelTargetID ID of `topLevelTarget`.+ * @param {object} nativeEvent Native browser event.+ * @return {?object} A SyntheticInputEvent.+ */+function extractBeforeInputEvent(+  topLevelType,+  topLevelTarget,+  topLevelTargetID,+  nativeEvent+) {+  var chars;++  if (canUseTextInputEvent) {+    chars = getNativeBeforeInputChars(topLevelType, nativeEvent);+  } else {+    chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);+  }++  // If no characters are being inserted, no BeforeInput event should+  // be fired.+  if (!chars) {+    return null;+  }++  var event = SyntheticInputEvent.getPooled(+    eventTypes.beforeInput,+    topLevelTargetID,+    nativeEvent+  );++  event.data = chars;+  EventPropagators.accumulateTwoPhaseDispatches(event);+  return event;+}++/**+ * Create an `onBeforeInput` event to match+ * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.+ *+ * This event plugin is based on the native `textInput` event+ * available in Chrome, Safari, Opera, and IE. This event fires after+ * `onKeyPress` and `onCompositionEnd`, but before `onInput`.+ *+ * `beforeInput` is spec'd but not implemented in any browsers, and+ * the `input` event does not provide any useful information about what has+ * actually been added, contrary to the spec. Thus, `textInput` is the best+ * available event to identify the characters that have actually been inserted+ * into the target node.+ *+ * This plugin is also responsible for emitting `composition` events, thus+ * allowing us to share composition fallback code for both `beforeInput` and+ * `composition` event types.+ */+var BeforeInputEventPlugin = {++  eventTypes: eventTypes,++  /**+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {DOMEventTarget} topLevelTarget The listening component root node.+   * @param {string} topLevelTargetID ID of `topLevelTarget`.+   * @param {object} nativeEvent Native browser event.+   * @return {*} An accumulation of synthetic events.+   * @see {EventPluginHub.extractEvents}+   */+  extractEvents: function(+    topLevelType,+    topLevelTarget,+    topLevelTargetID,+    nativeEvent+  ) {+    return [+      extractCompositionEvent(+        topLevelType,+        topLevelTarget,+        topLevelTargetID,+        nativeEvent+      ),+      extractBeforeInputEvent(+        topLevelType,+        topLevelTarget,+        topLevelTargetID,+        nativeEvent+      )+    ];+  }+};++module.exports = BeforeInputEventPlugin;++},{"141":141,"15":15,"20":20,"21":21,"22":22,"93":93,"97":97}],4:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule CSSProperty+ */++'use strict';++/**+ * CSS properties which accept numbers but are not in units of "px".+ */+var isUnitlessNumber = {+  boxFlex: true,+  boxFlexGroup: true,+  columnCount: true,+  flex: true,+  flexGrow: true,+  flexPositive: true,+  flexShrink: true,+  flexNegative: true,+  fontWeight: true,+  lineClamp: true,+  lineHeight: true,+  opacity: true,+  order: true,+  orphans: true,+  widows: true,+  zIndex: true,+  zoom: true,++  // SVG-related properties+  fillOpacity: true,+  strokeDashoffset: true,+  strokeOpacity: true,+  strokeWidth: true+};++/**+ * @param {string} prefix vendor-specific prefix, eg: Webkit+ * @param {string} key style name, eg: transitionDuration+ * @return {string} style name prefixed with `prefix`, properly camelCased, eg:+ * WebkitTransitionDuration+ */+function prefixKey(prefix, key) {+  return prefix + key.charAt(0).toUpperCase() + key.substring(1);+}++/**+ * Support style names that may come passed in prefixed by adding permutations+ * of vendor prefixes.+ */+var prefixes = ['Webkit', 'ms', 'Moz', 'O'];++// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an+// infinite loop, because it iterates over the newly added props too.+Object.keys(isUnitlessNumber).forEach(function(prop) {+  prefixes.forEach(function(prefix) {+    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];+  });+});++/**+ * Most style properties can be unset by doing .style[prop] = '' but IE8+ * doesn't like doing that with shorthand properties so for the properties that+ * IE8 breaks on, which are listed here, we instead unset each of the+ * individual properties. See http://bugs.jquery.com/ticket/12385.+ * The 4-value 'clock' properties like margin, padding, border-width seem to+ * behave without any problems. Curiously, list-style works too without any+ * special prodding.+ */+var shorthandPropertyExpansions = {+  background: {+    backgroundImage: true,+    backgroundPosition: true,+    backgroundRepeat: true,+    backgroundColor: true+  },+  border: {+    borderWidth: true,+    borderStyle: true,+    borderColor: true+  },+  borderBottom: {+    borderBottomWidth: true,+    borderBottomStyle: true,+    borderBottomColor: true+  },+  borderLeft: {+    borderLeftWidth: true,+    borderLeftStyle: true,+    borderLeftColor: true+  },+  borderRight: {+    borderRightWidth: true,+    borderRightStyle: true,+    borderRightColor: true+  },+  borderTop: {+    borderTopWidth: true,+    borderTopStyle: true,+    borderTopColor: true+  },+  font: {+    fontStyle: true,+    fontVariant: true,+    fontWeight: true,+    fontSize: true,+    lineHeight: true,+    fontFamily: true+  }+};++var CSSProperty = {+  isUnitlessNumber: isUnitlessNumber,+  shorthandPropertyExpansions: shorthandPropertyExpansions+};++module.exports = CSSProperty;++},{}],5:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule CSSPropertyOperations+ * @typechecks static-only+ */++'use strict';++var CSSProperty = _dereq_(4);+var ExecutionEnvironment = _dereq_(21);++var camelizeStyleName = _dereq_(108);+var dangerousStyleValue = _dereq_(113);+var hyphenateStyleName = _dereq_(133);+var memoizeStringOnly = _dereq_(143);+var warning = _dereq_(154);++var processStyleName = memoizeStringOnly(function(styleName) {+  return hyphenateStyleName(styleName);+});++var styleFloatAccessor = 'cssFloat';+if (ExecutionEnvironment.canUseDOM) {+  // IE8 only supports accessing cssFloat (standard) as styleFloat+  if (document.documentElement.style.cssFloat === undefined) {+    styleFloatAccessor = 'styleFloat';+  }+}++if ("production" !== "development") {+  // 'msTransform' is correct, but the other prefixes should be capitalized+  var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;++  // style values shouldn't contain a semicolon+  var badStyleValueWithSemicolonPattern = /;\s*$/;++  var warnedStyleNames = {};+  var warnedStyleValues = {};++  var warnHyphenatedStyleName = function(name) {+    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {+      return;+    }++    warnedStyleNames[name] = true;+    ("production" !== "development" ? warning(+      false,+      'Unsupported style property %s. Did you mean %s?',+      name,+      camelizeStyleName(name)+    ) : null);+  };++  var warnBadVendoredStyleName = function(name) {+    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {+      return;+    }++    warnedStyleNames[name] = true;+    ("production" !== "development" ? warning(+      false,+      'Unsupported vendor-prefixed style property %s. Did you mean %s?',+      name,+      name.charAt(0).toUpperCase() + name.slice(1)+    ) : null);+  };++  var warnStyleValueWithSemicolon = function(name, value) {+    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {+      return;+    }++    warnedStyleValues[value] = true;+    ("production" !== "development" ? warning(+      false,+      'Style property values shouldn\'t contain a semicolon. ' ++      'Try "%s: %s" instead.',+      name,+      value.replace(badStyleValueWithSemicolonPattern, '')+    ) : null);+  };++  /**+   * @param {string} name+   * @param {*} value+   */+  var warnValidStyle = function(name, value) {+    if (name.indexOf('-') > -1) {+      warnHyphenatedStyleName(name);+    } else if (badVendoredStyleNamePattern.test(name)) {+      warnBadVendoredStyleName(name);+    } else if (badStyleValueWithSemicolonPattern.test(value)) {+      warnStyleValueWithSemicolon(name, value);+    }+  };+}++/**+ * Operations for dealing with CSS properties.+ */+var CSSPropertyOperations = {++  /**+   * Serializes a mapping of style properties for use as inline styles:+   *+   *   > createMarkupForStyles({width: '200px', height: 0})+   *   "width:200px;height:0;"+   *+   * Undefined values are ignored so that declarative programming is easier.+   * The result should be HTML-escaped before insertion into the DOM.+   *+   * @param {object} styles+   * @return {?string}+   */+  createMarkupForStyles: function(styles) {+    var serialized = '';+    for (var styleName in styles) {+      if (!styles.hasOwnProperty(styleName)) {+        continue;+      }+      var styleValue = styles[styleName];+      if ("production" !== "development") {+        warnValidStyle(styleName, styleValue);+      }+      if (styleValue != null) {+        serialized += processStyleName(styleName) + ':';+        serialized += dangerousStyleValue(styleName, styleValue) + ';';+      }+    }+    return serialized || null;+  },++  /**+   * Sets the value for multiple styles on a node.  If a value is specified as+   * '' (empty string), the corresponding style property will be unset.+   *+   * @param {DOMElement} node+   * @param {object} styles+   */+  setValueForStyles: function(node, styles) {+    var style = node.style;+    for (var styleName in styles) {+      if (!styles.hasOwnProperty(styleName)) {+        continue;+      }+      if ("production" !== "development") {+        warnValidStyle(styleName, styles[styleName]);+      }+      var styleValue = dangerousStyleValue(styleName, styles[styleName]);+      if (styleName === 'float') {+        styleName = styleFloatAccessor;+      }+      if (styleValue) {+        style[styleName] = styleValue;+      } else {+        var expansion = CSSProperty.shorthandPropertyExpansions[styleName];+        if (expansion) {+          // Shorthand property that IE8 won't like unsetting, so unset each+          // component to placate it+          for (var individualStyleName in expansion) {+            style[individualStyleName] = '';+          }+        } else {+          style[styleName] = '';+        }+      }+    }+  }++};++module.exports = CSSPropertyOperations;++},{"108":108,"113":113,"133":133,"143":143,"154":154,"21":21,"4":4}],6:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule CallbackQueue+ */++'use strict';++var PooledClass = _dereq_(28);++var assign = _dereq_(27);+var invariant = _dereq_(135);++/**+ * A specialized pseudo-event module to help keep track of components waiting to+ * be notified when their DOM representations are available for use.+ *+ * This implements `PooledClass`, so you should never need to instantiate this.+ * Instead, use `CallbackQueue.getPooled()`.+ *+ * @class ReactMountReady+ * @implements PooledClass+ * @internal+ */+function CallbackQueue() {+  this._callbacks = null;+  this._contexts = null;+}++assign(CallbackQueue.prototype, {++  /**+   * Enqueues a callback to be invoked when `notifyAll` is invoked.+   *+   * @param {function} callback Invoked when `notifyAll` is invoked.+   * @param {?object} context Context to call `callback` with.+   * @internal+   */+  enqueue: function(callback, context) {+    this._callbacks = this._callbacks || [];+    this._contexts = this._contexts || [];+    this._callbacks.push(callback);+    this._contexts.push(context);+  },++  /**+   * Invokes all enqueued callbacks and clears the queue. This is invoked after+   * the DOM representation of a component has been created or updated.+   *+   * @internal+   */+  notifyAll: function() {+    var callbacks = this._callbacks;+    var contexts = this._contexts;+    if (callbacks) {+      ("production" !== "development" ? invariant(+        callbacks.length === contexts.length,+        'Mismatched list of contexts in callback queue'+      ) : invariant(callbacks.length === contexts.length));+      this._callbacks = null;+      this._contexts = null;+      for (var i = 0, l = callbacks.length; i < l; i++) {+        callbacks[i].call(contexts[i]);+      }+      callbacks.length = 0;+      contexts.length = 0;+    }+  },++  /**+   * Resets the internal queue.+   *+   * @internal+   */+  reset: function() {+    this._callbacks = null;+    this._contexts = null;+  },++  /**+   * `PooledClass` looks for this.+   */+  destructor: function() {+    this.reset();+  }++});++PooledClass.addPoolingTo(CallbackQueue);++module.exports = CallbackQueue;++},{"135":135,"27":27,"28":28}],7:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ChangeEventPlugin+ */++'use strict';++var EventConstants = _dereq_(15);+var EventPluginHub = _dereq_(17);+var EventPropagators = _dereq_(20);+var ExecutionEnvironment = _dereq_(21);+var ReactUpdates = _dereq_(87);+var SyntheticEvent = _dereq_(95);++var isEventSupported = _dereq_(136);+var isTextInputElement = _dereq_(138);+var keyOf = _dereq_(141);++var topLevelTypes = EventConstants.topLevelTypes;++var eventTypes = {+  change: {+    phasedRegistrationNames: {+      bubbled: keyOf({onChange: null}),+      captured: keyOf({onChangeCapture: null})+    },+    dependencies: [+      topLevelTypes.topBlur,+      topLevelTypes.topChange,+      topLevelTypes.topClick,+      topLevelTypes.topFocus,+      topLevelTypes.topInput,+      topLevelTypes.topKeyDown,+      topLevelTypes.topKeyUp,+      topLevelTypes.topSelectionChange+    ]+  }+};++/**+ * For IE shims+ */+var activeElement = null;+var activeElementID = null;+var activeElementValue = null;+var activeElementValueProp = null;++/**+ * SECTION: handle `change` event+ */+function shouldUseChangeEvent(elem) {+  return (+    elem.nodeName === 'SELECT' ||+    (elem.nodeName === 'INPUT' && elem.type === 'file')+  );+}++var doesChangeEventBubble = false;+if (ExecutionEnvironment.canUseDOM) {+  // See `handleChange` comment below+  doesChangeEventBubble = isEventSupported('change') && (+    (!('documentMode' in document) || document.documentMode > 8)+  );+}++function manualDispatchChangeEvent(nativeEvent) {+  var event = SyntheticEvent.getPooled(+    eventTypes.change,+    activeElementID,+    nativeEvent+  );+  EventPropagators.accumulateTwoPhaseDispatches(event);++  // If change and propertychange bubbled, we'd just bind to it like all the+  // other events and have it go through ReactBrowserEventEmitter. Since it+  // doesn't, we manually listen for the events and so we have to enqueue and+  // process the abstract event manually.+  //+  // Batching is necessary here in order to ensure that all event handlers run+  // before the next rerender (including event handlers attached to ancestor+  // elements instead of directly on the input). Without this, controlled+  // components don't work properly in conjunction with event bubbling because+  // the component is rerendered and the value reverted before all the event+  // handlers can run. See https://github.com/facebook/react/issues/708.+  ReactUpdates.batchedUpdates(runEventInBatch, event);+}++function runEventInBatch(event) {+  EventPluginHub.enqueueEvents(event);+  EventPluginHub.processEventQueue();+}++function startWatchingForChangeEventIE8(target, targetID) {+  activeElement = target;+  activeElementID = targetID;+  activeElement.attachEvent('onchange', manualDispatchChangeEvent);+}++function stopWatchingForChangeEventIE8() {+  if (!activeElement) {+    return;+  }+  activeElement.detachEvent('onchange', manualDispatchChangeEvent);+  activeElement = null;+  activeElementID = null;+}++function getTargetIDForChangeEvent(+    topLevelType,+    topLevelTarget,+    topLevelTargetID) {+  if (topLevelType === topLevelTypes.topChange) {+    return topLevelTargetID;+  }+}+function handleEventsForChangeEventIE8(+    topLevelType,+    topLevelTarget,+    topLevelTargetID) {+  if (topLevelType === topLevelTypes.topFocus) {+    // stopWatching() should be a noop here but we call it just in case we+    // missed a blur event somehow.+    stopWatchingForChangeEventIE8();+    startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);+  } else if (topLevelType === topLevelTypes.topBlur) {+    stopWatchingForChangeEventIE8();+  }+}+++/**+ * SECTION: handle `input` event+ */+var isInputEventSupported = false;+if (ExecutionEnvironment.canUseDOM) {+  // IE9 claims to support the input event but fails to trigger it when+  // deleting text, so we ignore its input events+  isInputEventSupported = isEventSupported('input') && (+    (!('documentMode' in document) || document.documentMode > 9)+  );+}++/**+ * (For old IE.) Replacement getter/setter for the `value` property that gets+ * set on the active element.+ */+var newValueProp =  {+  get: function() {+    return activeElementValueProp.get.call(this);+  },+  set: function(val) {+    // Cast to a string so we can do equality checks.+    activeElementValue = '' + val;+    activeElementValueProp.set.call(this, val);+  }+};++/**+ * (For old IE.) Starts tracking propertychange events on the passed-in element+ * and override the value property so that we can distinguish user events from+ * value changes in JS.+ */+function startWatchingForValueChange(target, targetID) {+  activeElement = target;+  activeElementID = targetID;+  activeElementValue = target.value;+  activeElementValueProp = Object.getOwnPropertyDescriptor(+    target.constructor.prototype,+    'value'+  );++  Object.defineProperty(activeElement, 'value', newValueProp);+  activeElement.attachEvent('onpropertychange', handlePropertyChange);+}++/**+ * (For old IE.) Removes the event listeners from the currently-tracked element,+ * if any exists.+ */+function stopWatchingForValueChange() {+  if (!activeElement) {+    return;+  }++  // delete restores the original property definition+  delete activeElement.value;+  activeElement.detachEvent('onpropertychange', handlePropertyChange);++  activeElement = null;+  activeElementID = null;+  activeElementValue = null;+  activeElementValueProp = null;+}++/**+ * (For old IE.) Handles a propertychange event, sending a `change` event if+ * the value of the active element has changed.+ */+function handlePropertyChange(nativeEvent) {+  if (nativeEvent.propertyName !== 'value') {+    return;+  }+  var value = nativeEvent.srcElement.value;+  if (value === activeElementValue) {+    return;+  }+  activeElementValue = value;++  manualDispatchChangeEvent(nativeEvent);+}++/**+ * If a `change` event should be fired, returns the target's ID.+ */+function getTargetIDForInputEvent(+    topLevelType,+    topLevelTarget,+    topLevelTargetID) {+  if (topLevelType === topLevelTypes.topInput) {+    // In modern browsers (i.e., not IE8 or IE9), the input event is exactly+    // what we want so fall through here and trigger an abstract event+    return topLevelTargetID;+  }+}++// For IE8 and IE9.+function handleEventsForInputEventIE(+    topLevelType,+    topLevelTarget,+    topLevelTargetID) {+  if (topLevelType === topLevelTypes.topFocus) {+    // In IE8, we can capture almost all .value changes by adding a+    // propertychange handler and looking for events with propertyName+    // equal to 'value'+    // In IE9, propertychange fires for most input events but is buggy and+    // doesn't fire when text is deleted, but conveniently, selectionchange+    // appears to fire in all of the remaining cases so we catch those and+    // forward the event if the value has changed+    // In either case, we don't want to call the event handler if the value+    // is changed from JS so we redefine a setter for `.value` that updates+    // our activeElementValue variable, allowing us to ignore those changes+    //+    // stopWatching() should be a noop here but we call it just in case we+    // missed a blur event somehow.+    stopWatchingForValueChange();+    startWatchingForValueChange(topLevelTarget, topLevelTargetID);+  } else if (topLevelType === topLevelTypes.topBlur) {+    stopWatchingForValueChange();+  }+}++// For IE8 and IE9.+function getTargetIDForInputEventIE(+    topLevelType,+    topLevelTarget,+    topLevelTargetID) {+  if (topLevelType === topLevelTypes.topSelectionChange ||+      topLevelType === topLevelTypes.topKeyUp ||+      topLevelType === topLevelTypes.topKeyDown) {+    // On the selectionchange event, the target is just document which isn't+    // helpful for us so just check activeElement instead.+    //+    // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire+    // propertychange on the first input event after setting `value` from a+    // script and fires only keydown, keypress, keyup. Catching keyup usually+    // gets it and catching keydown lets us fire an event for the first+    // keystroke if user does a key repeat (it'll be a little delayed: right+    // before the second keystroke). Other input methods (e.g., paste) seem to+    // fire selectionchange normally.+    if (activeElement && activeElement.value !== activeElementValue) {+      activeElementValue = activeElement.value;+      return activeElementID;+    }+  }+}+++/**+ * SECTION: handle `click` event+ */+function shouldUseClickEvent(elem) {+  // Use the `click` event to detect changes to checkbox and radio inputs.+  // This approach works across all browsers, whereas `change` does not fire+  // until `blur` in IE8.+  return (+    elem.nodeName === 'INPUT' &&+    (elem.type === 'checkbox' || elem.type === 'radio')+  );+}++function getTargetIDForClickEvent(+    topLevelType,+    topLevelTarget,+    topLevelTargetID) {+  if (topLevelType === topLevelTypes.topClick) {+    return topLevelTargetID;+  }+}++/**+ * This plugin creates an `onChange` event that normalizes change events+ * across form elements. This event fires at a time when it's possible to+ * change the element's value without seeing a flicker.+ *+ * Supported elements are:+ * - input (see `isTextInputElement`)+ * - textarea+ * - select+ */+var ChangeEventPlugin = {++  eventTypes: eventTypes,++  /**+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {DOMEventTarget} topLevelTarget The listening component root node.+   * @param {string} topLevelTargetID ID of `topLevelTarget`.+   * @param {object} nativeEvent Native browser event.+   * @return {*} An accumulation of synthetic events.+   * @see {EventPluginHub.extractEvents}+   */+  extractEvents: function(+      topLevelType,+      topLevelTarget,+      topLevelTargetID,+      nativeEvent) {++    var getTargetIDFunc, handleEventFunc;+    if (shouldUseChangeEvent(topLevelTarget)) {+      if (doesChangeEventBubble) {+        getTargetIDFunc = getTargetIDForChangeEvent;+      } else {+        handleEventFunc = handleEventsForChangeEventIE8;+      }+    } else if (isTextInputElement(topLevelTarget)) {+      if (isInputEventSupported) {+        getTargetIDFunc = getTargetIDForInputEvent;+      } else {+        getTargetIDFunc = getTargetIDForInputEventIE;+        handleEventFunc = handleEventsForInputEventIE;+      }+    } else if (shouldUseClickEvent(topLevelTarget)) {+      getTargetIDFunc = getTargetIDForClickEvent;+    }++    if (getTargetIDFunc) {+      var targetID = getTargetIDFunc(+        topLevelType,+        topLevelTarget,+        topLevelTargetID+      );+      if (targetID) {+        var event = SyntheticEvent.getPooled(+          eventTypes.change,+          targetID,+          nativeEvent+        );+        EventPropagators.accumulateTwoPhaseDispatches(event);+        return event;+      }+    }++    if (handleEventFunc) {+      handleEventFunc(+        topLevelType,+        topLevelTarget,+        topLevelTargetID+      );+    }+  }++};++module.exports = ChangeEventPlugin;++},{"136":136,"138":138,"141":141,"15":15,"17":17,"20":20,"21":21,"87":87,"95":95}],8:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ClientReactRootIndex+ * @typechecks+ */++'use strict';++var nextReactRootIndex = 0;++var ClientReactRootIndex = {+  createReactRootIndex: function() {+    return nextReactRootIndex++;+  }+};++module.exports = ClientReactRootIndex;++},{}],9:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule DOMChildrenOperations+ * @typechecks static-only+ */++'use strict';++var Danger = _dereq_(12);+var ReactMultiChildUpdateTypes = _dereq_(72);++var setTextContent = _dereq_(149);+var invariant = _dereq_(135);++/**+ * Inserts `childNode` as a child of `parentNode` at the `index`.+ *+ * @param {DOMElement} parentNode Parent node in which to insert.+ * @param {DOMElement} childNode Child node to insert.+ * @param {number} index Index at which to insert the child.+ * @internal+ */+function insertChildAt(parentNode, childNode, index) {+  // By exploiting arrays returning `undefined` for an undefined index, we can+  // rely exclusively on `insertBefore(node, null)` instead of also using+  // `appendChild(node)`. However, using `undefined` is not allowed by all+  // browsers so we must replace it with `null`.+  parentNode.insertBefore(+    childNode,+    parentNode.childNodes[index] || null+  );+}++/**+ * Operations for updating with DOM children.+ */+var DOMChildrenOperations = {++  dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup,++  updateTextContent: setTextContent,++  /**+   * Updates a component's children by processing a series of updates. The+   * update configurations are each expected to have a `parentNode` property.+   *+   * @param {array<object>} updates List of update configurations.+   * @param {array<string>} markupList List of markup strings.+   * @internal+   */+  processUpdates: function(updates, markupList) {+    var update;+    // Mapping from parent IDs to initial child orderings.+    var initialChildren = null;+    // List of children that will be moved or removed.+    var updatedChildren = null;++    for (var i = 0; i < updates.length; i++) {+      update = updates[i];+      if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING ||+          update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) {+        var updatedIndex = update.fromIndex;+        var updatedChild = update.parentNode.childNodes[updatedIndex];+        var parentID = update.parentID;++        ("production" !== "development" ? invariant(+          updatedChild,+          'processUpdates(): Unable to find child %s of element. This ' ++          'probably means the DOM was unexpectedly mutated (e.g., by the ' ++          'browser), usually due to forgetting a <tbody> when using tables, ' ++          'nesting tags like <form>, <p>, or <a>, or using non-SVG elements ' ++          'in an <svg> parent. Try inspecting the child nodes of the element ' ++          'with React ID `%s`.',+          updatedIndex,+          parentID+        ) : invariant(updatedChild));++        initialChildren = initialChildren || {};+        initialChildren[parentID] = initialChildren[parentID] || [];+        initialChildren[parentID][updatedIndex] = updatedChild;++        updatedChildren = updatedChildren || [];+        updatedChildren.push(updatedChild);+      }+    }++    var renderedMarkup = Danger.dangerouslyRenderMarkup(markupList);++    // Remove updated children first so that `toIndex` is consistent.+    if (updatedChildren) {+      for (var j = 0; j < updatedChildren.length; j++) {+        updatedChildren[j].parentNode.removeChild(updatedChildren[j]);+      }+    }++    for (var k = 0; k < updates.length; k++) {+      update = updates[k];+      switch (update.type) {+        case ReactMultiChildUpdateTypes.INSERT_MARKUP:+          insertChildAt(+            update.parentNode,+            renderedMarkup[update.markupIndex],+            update.toIndex+          );+          break;+        case ReactMultiChildUpdateTypes.MOVE_EXISTING:+          insertChildAt(+            update.parentNode,+            initialChildren[update.parentID][update.fromIndex],+            update.toIndex+          );+          break;+        case ReactMultiChildUpdateTypes.TEXT_CONTENT:+          setTextContent(+            update.parentNode,+            update.textContent+          );+          break;+        case ReactMultiChildUpdateTypes.REMOVE_NODE:+          // Already removed by the for-loop above.+          break;+      }+    }+  }++};++module.exports = DOMChildrenOperations;++},{"12":12,"135":135,"149":149,"72":72}],10:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule DOMProperty+ * @typechecks static-only+ */++/*jslint bitwise: true */++'use strict';++var invariant = _dereq_(135);++function checkMask(value, bitmask) {+  return (value & bitmask) === bitmask;+}++var DOMPropertyInjection = {+  /**+   * Mapping from normalized, camelcased property names to a configuration that+   * specifies how the associated DOM property should be accessed or rendered.+   */+  MUST_USE_ATTRIBUTE: 0x1,+  MUST_USE_PROPERTY: 0x2,+  HAS_SIDE_EFFECTS: 0x4,+  HAS_BOOLEAN_VALUE: 0x8,+  HAS_NUMERIC_VALUE: 0x10,+  HAS_POSITIVE_NUMERIC_VALUE: 0x20 | 0x10,+  HAS_OVERLOADED_BOOLEAN_VALUE: 0x40,++  /**+   * Inject some specialized knowledge about the DOM. This takes a config object+   * with the following properties:+   *+   * isCustomAttribute: function that given an attribute name will return true+   * if it can be inserted into the DOM verbatim. Useful for data-* or aria-*+   * attributes where it's impossible to enumerate all of the possible+   * attribute names,+   *+   * Properties: object mapping DOM property name to one of the+   * DOMPropertyInjection constants or null. If your attribute isn't in here,+   * it won't get written to the DOM.+   *+   * DOMAttributeNames: object mapping React attribute name to the DOM+   * attribute name. Attribute names not specified use the **lowercase**+   * normalized name.+   *+   * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.+   * Property names not specified use the normalized name.+   *+   * DOMMutationMethods: Properties that require special mutation methods. If+   * `value` is undefined, the mutation method should unset the property.+   *+   * @param {object} domPropertyConfig the config as described above.+   */+  injectDOMPropertyConfig: function(domPropertyConfig) {+    var Properties = domPropertyConfig.Properties || {};+    var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};+    var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};+    var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};++    if (domPropertyConfig.isCustomAttribute) {+      DOMProperty._isCustomAttributeFunctions.push(+        domPropertyConfig.isCustomAttribute+      );+    }++    for (var propName in Properties) {+      ("production" !== "development" ? invariant(+        !DOMProperty.isStandardName.hasOwnProperty(propName),+        'injectDOMPropertyConfig(...): You\'re trying to inject DOM property ' ++        '\'%s\' which has already been injected. You may be accidentally ' ++        'injecting the same DOM property config twice, or you may be ' ++        'injecting two configs that have conflicting property names.',+        propName+      ) : invariant(!DOMProperty.isStandardName.hasOwnProperty(propName)));++      DOMProperty.isStandardName[propName] = true;++      var lowerCased = propName.toLowerCase();+      DOMProperty.getPossibleStandardName[lowerCased] = propName;++      if (DOMAttributeNames.hasOwnProperty(propName)) {+        var attributeName = DOMAttributeNames[propName];+        DOMProperty.getPossibleStandardName[attributeName] = propName;+        DOMProperty.getAttributeName[propName] = attributeName;+      } else {+        DOMProperty.getAttributeName[propName] = lowerCased;+      }++      DOMProperty.getPropertyName[propName] =+        DOMPropertyNames.hasOwnProperty(propName) ?+          DOMPropertyNames[propName] :+          propName;++      if (DOMMutationMethods.hasOwnProperty(propName)) {+        DOMProperty.getMutationMethod[propName] = DOMMutationMethods[propName];+      } else {+        DOMProperty.getMutationMethod[propName] = null;+      }++      var propConfig = Properties[propName];+      DOMProperty.mustUseAttribute[propName] =+        checkMask(propConfig, DOMPropertyInjection.MUST_USE_ATTRIBUTE);+      DOMProperty.mustUseProperty[propName] =+        checkMask(propConfig, DOMPropertyInjection.MUST_USE_PROPERTY);+      DOMProperty.hasSideEffects[propName] =+        checkMask(propConfig, DOMPropertyInjection.HAS_SIDE_EFFECTS);+      DOMProperty.hasBooleanValue[propName] =+        checkMask(propConfig, DOMPropertyInjection.HAS_BOOLEAN_VALUE);+      DOMProperty.hasNumericValue[propName] =+        checkMask(propConfig, DOMPropertyInjection.HAS_NUMERIC_VALUE);+      DOMProperty.hasPositiveNumericValue[propName] =+        checkMask(propConfig, DOMPropertyInjection.HAS_POSITIVE_NUMERIC_VALUE);+      DOMProperty.hasOverloadedBooleanValue[propName] =+        checkMask(propConfig, DOMPropertyInjection.HAS_OVERLOADED_BOOLEAN_VALUE);++      ("production" !== "development" ? invariant(+        !DOMProperty.mustUseAttribute[propName] ||+          !DOMProperty.mustUseProperty[propName],+        'DOMProperty: Cannot require using both attribute and property: %s',+        propName+      ) : invariant(!DOMProperty.mustUseAttribute[propName] ||+        !DOMProperty.mustUseProperty[propName]));+      ("production" !== "development" ? invariant(+        DOMProperty.mustUseProperty[propName] ||+          !DOMProperty.hasSideEffects[propName],+        'DOMProperty: Properties that have side effects must use property: %s',+        propName+      ) : invariant(DOMProperty.mustUseProperty[propName] ||+        !DOMProperty.hasSideEffects[propName]));+      ("production" !== "development" ? invariant(+        !!DOMProperty.hasBooleanValue[propName] ++          !!DOMProperty.hasNumericValue[propName] ++          !!DOMProperty.hasOverloadedBooleanValue[propName] <= 1,+        'DOMProperty: Value can be one of boolean, overloaded boolean, or ' ++        'numeric value, but not a combination: %s',+        propName+      ) : invariant(!!DOMProperty.hasBooleanValue[propName] ++        !!DOMProperty.hasNumericValue[propName] ++        !!DOMProperty.hasOverloadedBooleanValue[propName] <= 1));+    }+  }+};+var defaultValueCache = {};++/**+ * DOMProperty exports lookup objects that can be used like functions:+ *+ *   > DOMProperty.isValid['id']+ *   true+ *   > DOMProperty.isValid['foobar']+ *   undefined+ *+ * Although this may be confusing, it performs better in general.+ *+ * @see http://jsperf.com/key-exists+ * @see http://jsperf.com/key-missing+ */+var DOMProperty = {++  ID_ATTRIBUTE_NAME: 'data-reactid',++  /**+   * Checks whether a property name is a standard property.+   * @type {Object}+   */+  isStandardName: {},++  /**+   * Mapping from lowercase property names to the properly cased version, used+   * to warn in the case of missing properties.+   * @type {Object}+   */+  getPossibleStandardName: {},++  /**+   * Mapping from normalized names to attribute names that differ. Attribute+   * names are used when rendering markup or with `*Attribute()`.+   * @type {Object}+   */+  getAttributeName: {},++  /**+   * Mapping from normalized names to properties on DOM node instances.+   * (This includes properties that mutate due to external factors.)+   * @type {Object}+   */+  getPropertyName: {},++  /**+   * Mapping from normalized names to mutation methods. This will only exist if+   * mutation cannot be set simply by the property or `setAttribute()`.+   * @type {Object}+   */+  getMutationMethod: {},++  /**+   * Whether the property must be accessed and mutated as an object property.+   * @type {Object}+   */+  mustUseAttribute: {},++  /**+   * Whether the property must be accessed and mutated using `*Attribute()`.+   * (This includes anything that fails `<propName> in <element>`.)+   * @type {Object}+   */+  mustUseProperty: {},++  /**+   * Whether or not setting a value causes side effects such as triggering+   * resources to be loaded or text selection changes. We must ensure that+   * the value is only set if it has changed.+   * @type {Object}+   */+  hasSideEffects: {},++  /**+   * Whether the property should be removed when set to a falsey value.+   * @type {Object}+   */+  hasBooleanValue: {},++  /**+   * Whether the property must be numeric or parse as a+   * numeric and should be removed when set to a falsey value.+   * @type {Object}+   */+  hasNumericValue: {},++  /**+   * Whether the property must be positive numeric or parse as a positive+   * numeric and should be removed when set to a falsey value.+   * @type {Object}+   */+  hasPositiveNumericValue: {},++  /**+   * Whether the property can be used as a flag as well as with a value. Removed+   * when strictly equal to false; present without a value when strictly equal+   * to true; present with a value otherwise.+   * @type {Object}+   */+  hasOverloadedBooleanValue: {},++  /**+   * All of the isCustomAttribute() functions that have been injected.+   */+  _isCustomAttributeFunctions: [],++  /**+   * Checks whether a property name is a custom attribute.+   * @method+   */+  isCustomAttribute: function(attributeName) {+    for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) {+      var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i];+      if (isCustomAttributeFn(attributeName)) {+        return true;+      }+    }+    return false;+  },++  /**+   * Returns the default property value for a DOM property (i.e., not an+   * attribute). Most default values are '' or false, but not all. Worse yet,+   * some (in particular, `type`) vary depending on the type of element.+   *+   * TODO: Is it better to grab all the possible properties when creating an+   * element to avoid having to create the same element twice?+   */+  getDefaultValueForProperty: function(nodeName, prop) {+    var nodeDefaults = defaultValueCache[nodeName];+    var testElement;+    if (!nodeDefaults) {+      defaultValueCache[nodeName] = nodeDefaults = {};+    }+    if (!(prop in nodeDefaults)) {+      testElement = document.createElement(nodeName);+      nodeDefaults[prop] = testElement[prop];+    }+    return nodeDefaults[prop];+  },++  injection: DOMPropertyInjection+};++module.exports = DOMProperty;++},{"135":135}],11:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule DOMPropertyOperations+ * @typechecks static-only+ */++'use strict';++var DOMProperty = _dereq_(10);++var quoteAttributeValueForBrowser = _dereq_(147);+var warning = _dereq_(154);++function shouldIgnoreValue(name, value) {+  return value == null ||+    (DOMProperty.hasBooleanValue[name] && !value) ||+    (DOMProperty.hasNumericValue[name] && isNaN(value)) ||+    (DOMProperty.hasPositiveNumericValue[name] && (value < 1)) ||+    (DOMProperty.hasOverloadedBooleanValue[name] && value === false);+}++if ("production" !== "development") {+  var reactProps = {+    children: true,+    dangerouslySetInnerHTML: true,+    key: true,+    ref: true+  };+  var warnedProperties = {};++  var warnUnknownProperty = function(name) {+    if (reactProps.hasOwnProperty(name) && reactProps[name] ||+        warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {+      return;+    }++    warnedProperties[name] = true;+    var lowerCasedName = name.toLowerCase();++    // data-* attributes should be lowercase; suggest the lowercase version+    var standardName = (+      DOMProperty.isCustomAttribute(lowerCasedName) ?+        lowerCasedName :+      DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ?+        DOMProperty.getPossibleStandardName[lowerCasedName] :+        null+    );++    // For now, only warn when we have a suggested correction. This prevents+    // logging too much when using transferPropsTo.+    ("production" !== "development" ? warning(+      standardName == null,+      'Unknown DOM property %s. Did you mean %s?',+      name,+      standardName+    ) : null);++  };+}++/**+ * Operations for dealing with DOM properties.+ */+var DOMPropertyOperations = {++  /**+   * Creates markup for the ID property.+   *+   * @param {string} id Unescaped ID.+   * @return {string} Markup string.+   */+  createMarkupForID: function(id) {+    return DOMProperty.ID_ATTRIBUTE_NAME + '=' ++      quoteAttributeValueForBrowser(id);+  },++  /**+   * Creates markup for a property.+   *+   * @param {string} name+   * @param {*} value+   * @return {?string} Markup string, or null if the property was invalid.+   */+  createMarkupForProperty: function(name, value) {+    if (DOMProperty.isStandardName.hasOwnProperty(name) &&+        DOMProperty.isStandardName[name]) {+      if (shouldIgnoreValue(name, value)) {+        return '';+      }+      var attributeName = DOMProperty.getAttributeName[name];+      if (DOMProperty.hasBooleanValue[name] ||+          (DOMProperty.hasOverloadedBooleanValue[name] && value === true)) {+        return attributeName;+      }+      return attributeName + '=' + quoteAttributeValueForBrowser(value);+    } else if (DOMProperty.isCustomAttribute(name)) {+      if (value == null) {+        return '';+      }+      return name + '=' + quoteAttributeValueForBrowser(value);+    } else if ("production" !== "development") {+      warnUnknownProperty(name);+    }+    return null;+  },++  /**+   * Sets the value for a property on a node.+   *+   * @param {DOMElement} node+   * @param {string} name+   * @param {*} value+   */+  setValueForProperty: function(node, name, value) {+    if (DOMProperty.isStandardName.hasOwnProperty(name) &&+        DOMProperty.isStandardName[name]) {+      var mutationMethod = DOMProperty.getMutationMethod[name];+      if (mutationMethod) {+        mutationMethod(node, value);+      } else if (shouldIgnoreValue(name, value)) {+        this.deleteValueForProperty(node, name);+      } else if (DOMProperty.mustUseAttribute[name]) {+        // `setAttribute` with objects becomes only `[object]` in IE8/9,+        // ('' + value) makes it output the correct toString()-value.+        node.setAttribute(DOMProperty.getAttributeName[name], '' + value);+      } else {+        var propName = DOMProperty.getPropertyName[name];+        // Must explicitly cast values for HAS_SIDE_EFFECTS-properties to the+        // property type before comparing; only `value` does and is string.+        if (!DOMProperty.hasSideEffects[name] ||+            ('' + node[propName]) !== ('' + value)) {+          // Contrary to `setAttribute`, object properties are properly+          // `toString`ed by IE8/9.+          node[propName] = value;+        }+      }+    } else if (DOMProperty.isCustomAttribute(name)) {+      if (value == null) {+        node.removeAttribute(name);+      } else {+        node.setAttribute(name, '' + value);+      }+    } else if ("production" !== "development") {+      warnUnknownProperty(name);+    }+  },++  /**+   * Deletes the value for a property on a node.+   *+   * @param {DOMElement} node+   * @param {string} name+   */+  deleteValueForProperty: function(node, name) {+    if (DOMProperty.isStandardName.hasOwnProperty(name) &&+        DOMProperty.isStandardName[name]) {+      var mutationMethod = DOMProperty.getMutationMethod[name];+      if (mutationMethod) {+        mutationMethod(node, undefined);+      } else if (DOMProperty.mustUseAttribute[name]) {+        node.removeAttribute(DOMProperty.getAttributeName[name]);+      } else {+        var propName = DOMProperty.getPropertyName[name];+        var defaultValue = DOMProperty.getDefaultValueForProperty(+          node.nodeName,+          propName+        );+        if (!DOMProperty.hasSideEffects[name] ||+            ('' + node[propName]) !== defaultValue) {+          node[propName] = defaultValue;+        }+      }+    } else if (DOMProperty.isCustomAttribute(name)) {+      node.removeAttribute(name);+    } else if ("production" !== "development") {+      warnUnknownProperty(name);+    }+  }++};++module.exports = DOMPropertyOperations;++},{"10":10,"147":147,"154":154}],12:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule Danger+ * @typechecks static-only+ */++/*jslint evil: true, sub: true */++'use strict';++var ExecutionEnvironment = _dereq_(21);++var createNodesFromMarkup = _dereq_(112);+var emptyFunction = _dereq_(114);+var getMarkupWrap = _dereq_(127);+var invariant = _dereq_(135);++var OPEN_TAG_NAME_EXP = /^(<[^ \/>]+)/;+var RESULT_INDEX_ATTR = 'data-danger-index';++/**+ * Extracts the `nodeName` from a string of markup.+ *+ * NOTE: Extracting the `nodeName` does not require a regular expression match+ * because we make assumptions about React-generated markup (i.e. there are no+ * spaces surrounding the opening tag and there is at least one attribute).+ *+ * @param {string} markup String of markup.+ * @return {string} Node name of the supplied markup.+ * @see http://jsperf.com/extract-nodename+ */+function getNodeName(markup) {+  return markup.substring(1, markup.indexOf(' '));+}++var Danger = {++  /**+   * Renders markup into an array of nodes. The markup is expected to render+   * into a list of root nodes. Also, the length of `resultList` and+   * `markupList` should be the same.+   *+   * @param {array<string>} markupList List of markup strings to render.+   * @return {array<DOMElement>} List of rendered nodes.+   * @internal+   */+  dangerouslyRenderMarkup: function(markupList) {+    ("production" !== "development" ? invariant(+      ExecutionEnvironment.canUseDOM,+      'dangerouslyRenderMarkup(...): Cannot render markup in a worker ' ++      'thread. Make sure `window` and `document` are available globally ' ++      'before requiring React when unit testing or use ' ++      'React.renderToString for server rendering.'+    ) : invariant(ExecutionEnvironment.canUseDOM));+    var nodeName;+    var markupByNodeName = {};+    // Group markup by `nodeName` if a wrap is necessary, else by '*'.+    for (var i = 0; i < markupList.length; i++) {+      ("production" !== "development" ? invariant(+        markupList[i],+        'dangerouslyRenderMarkup(...): Missing markup.'+      ) : invariant(markupList[i]));+      nodeName = getNodeName(markupList[i]);+      nodeName = getMarkupWrap(nodeName) ? nodeName : '*';+      markupByNodeName[nodeName] = markupByNodeName[nodeName] || [];+      markupByNodeName[nodeName][i] = markupList[i];+    }+    var resultList = [];+    var resultListAssignmentCount = 0;+    for (nodeName in markupByNodeName) {+      if (!markupByNodeName.hasOwnProperty(nodeName)) {+        continue;+      }+      var markupListByNodeName = markupByNodeName[nodeName];++      // This for-in loop skips the holes of the sparse array. The order of+      // iteration should follow the order of assignment, which happens to match+      // numerical index order, but we don't rely on that.+      var resultIndex;+      for (resultIndex in markupListByNodeName) {+        if (markupListByNodeName.hasOwnProperty(resultIndex)) {+          var markup = markupListByNodeName[resultIndex];++          // Push the requested markup with an additional RESULT_INDEX_ATTR+          // attribute.  If the markup does not start with a < character, it+          // will be discarded below (with an appropriate console.error).+          markupListByNodeName[resultIndex] = markup.replace(+            OPEN_TAG_NAME_EXP,+            // This index will be parsed back out below.+            '$1 ' + RESULT_INDEX_ATTR + '="' + resultIndex + '" '+          );+        }+      }++      // Render each group of markup with similar wrapping `nodeName`.+      var renderNodes = createNodesFromMarkup(+        markupListByNodeName.join(''),+        emptyFunction // Do nothing special with <script> tags.+      );++      for (var j = 0; j < renderNodes.length; ++j) {+        var renderNode = renderNodes[j];+        if (renderNode.hasAttribute &&+            renderNode.hasAttribute(RESULT_INDEX_ATTR)) {++          resultIndex = +renderNode.getAttribute(RESULT_INDEX_ATTR);+          renderNode.removeAttribute(RESULT_INDEX_ATTR);++          ("production" !== "development" ? invariant(+            !resultList.hasOwnProperty(resultIndex),+            'Danger: Assigning to an already-occupied result index.'+          ) : invariant(!resultList.hasOwnProperty(resultIndex)));++          resultList[resultIndex] = renderNode;++          // This should match resultList.length and markupList.length when+          // we're done.+          resultListAssignmentCount += 1;++        } else if ("production" !== "development") {+          console.error(+            'Danger: Discarding unexpected node:',+            renderNode+          );+        }+      }+    }++    // Although resultList was populated out of order, it should now be a dense+    // array.+    ("production" !== "development" ? invariant(+      resultListAssignmentCount === resultList.length,+      'Danger: Did not assign to every index of resultList.'+    ) : invariant(resultListAssignmentCount === resultList.length));++    ("production" !== "development" ? invariant(+      resultList.length === markupList.length,+      'Danger: Expected markup to render %s nodes, but rendered %s.',+      markupList.length,+      resultList.length+    ) : invariant(resultList.length === markupList.length));++    return resultList;+  },++  /**+   * Replaces a node with a string of markup at its current position within its+   * parent. The markup must render into a single root node.+   *+   * @param {DOMElement} oldChild Child node to replace.+   * @param {string} markup Markup to render in place of the child node.+   * @internal+   */+  dangerouslyReplaceNodeWithMarkup: function(oldChild, markup) {+    ("production" !== "development" ? invariant(+      ExecutionEnvironment.canUseDOM,+      'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a ' ++      'worker thread. Make sure `window` and `document` are available ' ++      'globally before requiring React when unit testing or use ' ++      'React.renderToString for server rendering.'+    ) : invariant(ExecutionEnvironment.canUseDOM));+    ("production" !== "development" ? invariant(markup, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(markup));+    ("production" !== "development" ? invariant(+      oldChild.tagName.toLowerCase() !== 'html',+      'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' ++      '<html> node. This is because browser quirks make this unreliable ' ++      'and/or slow. If you want to render to the root you must use ' ++      'server rendering. See React.renderToString().'+    ) : invariant(oldChild.tagName.toLowerCase() !== 'html'));++    var newChild = createNodesFromMarkup(markup, emptyFunction)[0];+    oldChild.parentNode.replaceChild(newChild, oldChild);+  }++};++module.exports = Danger;++},{"112":112,"114":114,"127":127,"135":135,"21":21}],13:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule DefaultEventPluginOrder+ */++'use strict';++var keyOf = _dereq_(141);++/**+ * Module that is injectable into `EventPluginHub`, that specifies a+ * deterministic ordering of `EventPlugin`s. A convenient way to reason about+ * plugins, without having to package every one of them. This is better than+ * having plugins be ordered in the same order that they are injected because+ * that ordering would be influenced by the packaging order.+ * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that+ * preventing default on events is convenient in `SimpleEventPlugin` handlers.+ */+var DefaultEventPluginOrder = [+  keyOf({ResponderEventPlugin: null}),+  keyOf({SimpleEventPlugin: null}),+  keyOf({TapEventPlugin: null}),+  keyOf({EnterLeaveEventPlugin: null}),+  keyOf({ChangeEventPlugin: null}),+  keyOf({SelectEventPlugin: null}),+  keyOf({BeforeInputEventPlugin: null}),+  keyOf({AnalyticsEventPlugin: null}),+  keyOf({MobileSafariClickEventPlugin: null})+];++module.exports = DefaultEventPluginOrder;++},{"141":141}],14:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule EnterLeaveEventPlugin+ * @typechecks static-only+ */++'use strict';++var EventConstants = _dereq_(15);+var EventPropagators = _dereq_(20);+var SyntheticMouseEvent = _dereq_(99);++var ReactMount = _dereq_(70);+var keyOf = _dereq_(141);++var topLevelTypes = EventConstants.topLevelTypes;+var getFirstReactDOM = ReactMount.getFirstReactDOM;++var eventTypes = {+  mouseEnter: {+    registrationName: keyOf({onMouseEnter: null}),+    dependencies: [+      topLevelTypes.topMouseOut,+      topLevelTypes.topMouseOver+    ]+  },+  mouseLeave: {+    registrationName: keyOf({onMouseLeave: null}),+    dependencies: [+      topLevelTypes.topMouseOut,+      topLevelTypes.topMouseOver+    ]+  }+};++var extractedEvents = [null, null];++var EnterLeaveEventPlugin = {++  eventTypes: eventTypes,++  /**+   * For almost every interaction we care about, there will be both a top-level+   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that+   * we do not extract duplicate events. However, moving the mouse into the+   * browser from outside will not fire a `mouseout` event. In this case, we use+   * the `mouseover` top-level event.+   *+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {DOMEventTarget} topLevelTarget The listening component root node.+   * @param {string} topLevelTargetID ID of `topLevelTarget`.+   * @param {object} nativeEvent Native browser event.+   * @return {*} An accumulation of synthetic events.+   * @see {EventPluginHub.extractEvents}+   */+  extractEvents: function(+      topLevelType,+      topLevelTarget,+      topLevelTargetID,+      nativeEvent) {+    if (topLevelType === topLevelTypes.topMouseOver &&+        (nativeEvent.relatedTarget || nativeEvent.fromElement)) {+      return null;+    }+    if (topLevelType !== topLevelTypes.topMouseOut &&+        topLevelType !== topLevelTypes.topMouseOver) {+      // Must not be a mouse in or mouse out - ignoring.+      return null;+    }++    var win;+    if (topLevelTarget.window === topLevelTarget) {+      // `topLevelTarget` is probably a window object.+      win = topLevelTarget;+    } else {+      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.+      var doc = topLevelTarget.ownerDocument;+      if (doc) {+        win = doc.defaultView || doc.parentWindow;+      } else {+        win = window;+      }+    }++    var from, to;+    if (topLevelType === topLevelTypes.topMouseOut) {+      from = topLevelTarget;+      to =+        getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) ||+        win;+    } else {+      from = win;+      to = topLevelTarget;+    }++    if (from === to) {+      // Nothing pertains to our managed components.+      return null;+    }++    var fromID = from ? ReactMount.getID(from) : '';+    var toID = to ? ReactMount.getID(to) : '';++    var leave = SyntheticMouseEvent.getPooled(+      eventTypes.mouseLeave,+      fromID,+      nativeEvent+    );+    leave.type = 'mouseleave';+    leave.target = from;+    leave.relatedTarget = to;++    var enter = SyntheticMouseEvent.getPooled(+      eventTypes.mouseEnter,+      toID,+      nativeEvent+    );+    enter.type = 'mouseenter';+    enter.target = to;+    enter.relatedTarget = from;++    EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);++    extractedEvents[0] = leave;+    extractedEvents[1] = enter;++    return extractedEvents;+  }++};++module.exports = EnterLeaveEventPlugin;++},{"141":141,"15":15,"20":20,"70":70,"99":99}],15:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule EventConstants+ */++'use strict';++var keyMirror = _dereq_(140);++var PropagationPhases = keyMirror({bubbled: null, captured: null});++/**+ * Types of raw signals from the browser caught at the top level.+ */+var topLevelTypes = keyMirror({+  topBlur: null,+  topChange: null,+  topClick: null,+  topCompositionEnd: null,+  topCompositionStart: null,+  topCompositionUpdate: null,+  topContextMenu: null,+  topCopy: null,+  topCut: null,+  topDoubleClick: null,+  topDrag: null,+  topDragEnd: null,+  topDragEnter: null,+  topDragExit: null,+  topDragLeave: null,+  topDragOver: null,+  topDragStart: null,+  topDrop: null,+  topError: null,+  topFocus: null,+  topInput: null,+  topKeyDown: null,+  topKeyPress: null,+  topKeyUp: null,+  topLoad: null,+  topMouseDown: null,+  topMouseMove: null,+  topMouseOut: null,+  topMouseOver: null,+  topMouseUp: null,+  topPaste: null,+  topReset: null,+  topScroll: null,+  topSelectionChange: null,+  topSubmit: null,+  topTextInput: null,+  topTouchCancel: null,+  topTouchEnd: null,+  topTouchMove: null,+  topTouchStart: null,+  topWheel: null+});++var EventConstants = {+  topLevelTypes: topLevelTypes,+  PropagationPhases: PropagationPhases+};++module.exports = EventConstants;++},{"140":140}],16:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ *+ * @providesModule EventListener+ * @typechecks+ */++var emptyFunction = _dereq_(114);++/**+ * Upstream version of event listener. Does not take into account specific+ * nature of platform.+ */+var EventListener = {+  /**+   * Listen to DOM events during the bubble phase.+   *+   * @param {DOMEventTarget} target DOM element to register listener on.+   * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.+   * @param {function} callback Callback function.+   * @return {object} Object with a `remove` method.+   */+  listen: function(target, eventType, callback) {+    if (target.addEventListener) {+      target.addEventListener(eventType, callback, false);+      return {+        remove: function() {+          target.removeEventListener(eventType, callback, false);+        }+      };+    } else if (target.attachEvent) {+      target.attachEvent('on' + eventType, callback);+      return {+        remove: function() {+          target.detachEvent('on' + eventType, callback);+        }+      };+    }+  },++  /**+   * Listen to DOM events during the capture phase.+   *+   * @param {DOMEventTarget} target DOM element to register listener on.+   * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.+   * @param {function} callback Callback function.+   * @return {object} Object with a `remove` method.+   */+  capture: function(target, eventType, callback) {+    if (!target.addEventListener) {+      if ("production" !== "development") {+        console.error(+          'Attempted to listen to events during the capture phase on a ' ++          'browser that does not support the capture phase. Your application ' ++          'will not receive some events.'+        );+      }+      return {+        remove: emptyFunction+      };+    } else {+      target.addEventListener(eventType, callback, true);+      return {+        remove: function() {+          target.removeEventListener(eventType, callback, true);+        }+      };+    }+  },++  registerDefault: function() {}+};++module.exports = EventListener;++},{"114":114}],17:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule EventPluginHub+ */++'use strict';++var EventPluginRegistry = _dereq_(18);+var EventPluginUtils = _dereq_(19);++var accumulateInto = _dereq_(105);+var forEachAccumulated = _dereq_(120);+var invariant = _dereq_(135);++/**+ * Internal store for event listeners+ */+var listenerBank = {};++/**+ * Internal queue of events that have accumulated their dispatches and are+ * waiting to have their dispatches executed.+ */+var eventQueue = null;++/**+ * Dispatches an event and releases it back into the pool, unless persistent.+ *+ * @param {?object} event Synthetic event to be dispatched.+ * @private+ */+var executeDispatchesAndRelease = function(event) {+  if (event) {+    var executeDispatch = EventPluginUtils.executeDispatch;+    // Plugins can provide custom behavior when dispatching events.+    var PluginModule = EventPluginRegistry.getPluginModuleForEvent(event);+    if (PluginModule && PluginModule.executeDispatch) {+      executeDispatch = PluginModule.executeDispatch;+    }+    EventPluginUtils.executeDispatchesInOrder(event, executeDispatch);++    if (!event.isPersistent()) {+      event.constructor.release(event);+    }+  }+};++/**+ * - `InstanceHandle`: [required] Module that performs logical traversals of DOM+ *   hierarchy given ids of the logical DOM elements involved.+ */+var InstanceHandle = null;++function validateInstanceHandle() {+  var valid =+    InstanceHandle &&+    InstanceHandle.traverseTwoPhase &&+    InstanceHandle.traverseEnterLeave;+  ("production" !== "development" ? invariant(+    valid,+    'InstanceHandle not injected before use!'+  ) : invariant(valid));+}++/**+ * This is a unified interface for event plugins to be installed and configured.+ *+ * Event plugins can implement the following properties:+ *+ *   `extractEvents` {function(string, DOMEventTarget, string, object): *}+ *     Required. When a top-level event is fired, this method is expected to+ *     extract synthetic events that will in turn be queued and dispatched.+ *+ *   `eventTypes` {object}+ *     Optional, plugins that fire events must publish a mapping of registration+ *     names that are used to register listeners. Values of this mapping must+ *     be objects that contain `registrationName` or `phasedRegistrationNames`.+ *+ *   `executeDispatch` {function(object, function, string)}+ *     Optional, allows plugins to override how an event gets dispatched. By+ *     default, the listener is simply invoked.+ *+ * Each plugin that is injected into `EventsPluginHub` is immediately operable.+ *+ * @public+ */+var EventPluginHub = {++  /**+   * Methods for injecting dependencies.+   */+  injection: {++    /**+     * @param {object} InjectedMount+     * @public+     */+    injectMount: EventPluginUtils.injection.injectMount,++    /**+     * @param {object} InjectedInstanceHandle+     * @public+     */+    injectInstanceHandle: function(InjectedInstanceHandle) {+      InstanceHandle = InjectedInstanceHandle;+      if ("production" !== "development") {+        validateInstanceHandle();+      }+    },++    getInstanceHandle: function() {+      if ("production" !== "development") {+        validateInstanceHandle();+      }+      return InstanceHandle;+    },++    /**+     * @param {array} InjectedEventPluginOrder+     * @public+     */+    injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,++    /**+     * @param {object} injectedNamesToPlugins Map from names to plugin modules.+     */+    injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName++  },++  eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs,++  registrationNameModules: EventPluginRegistry.registrationNameModules,++  /**+   * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent.+   *+   * @param {string} id ID of the DOM element.+   * @param {string} registrationName Name of listener (e.g. `onClick`).+   * @param {?function} listener The callback to store.+   */+  putListener: function(id, registrationName, listener) {+    ("production" !== "development" ? invariant(+      !listener || typeof listener === 'function',+      'Expected %s listener to be a function, instead got type %s',+      registrationName, typeof listener+    ) : invariant(!listener || typeof listener === 'function'));++    var bankForRegistrationName =+      listenerBank[registrationName] || (listenerBank[registrationName] = {});+    bankForRegistrationName[id] = listener;+  },++  /**+   * @param {string} id ID of the DOM element.+   * @param {string} registrationName Name of listener (e.g. `onClick`).+   * @return {?function} The stored callback.+   */+  getListener: function(id, registrationName) {+    var bankForRegistrationName = listenerBank[registrationName];+    return bankForRegistrationName && bankForRegistrationName[id];+  },++  /**+   * Deletes a listener from the registration bank.+   *+   * @param {string} id ID of the DOM element.+   * @param {string} registrationName Name of listener (e.g. `onClick`).+   */+  deleteListener: function(id, registrationName) {+    var bankForRegistrationName = listenerBank[registrationName];+    if (bankForRegistrationName) {+      delete bankForRegistrationName[id];+    }+  },++  /**+   * Deletes all listeners for the DOM element with the supplied ID.+   *+   * @param {string} id ID of the DOM element.+   */+  deleteAllListeners: function(id) {+    for (var registrationName in listenerBank) {+      delete listenerBank[registrationName][id];+    }+  },++  /**+   * Allows registered plugins an opportunity to extract events from top-level+   * native browser events.+   *+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {DOMEventTarget} topLevelTarget The listening component root node.+   * @param {string} topLevelTargetID ID of `topLevelTarget`.+   * @param {object} nativeEvent Native browser event.+   * @return {*} An accumulation of synthetic events.+   * @internal+   */+  extractEvents: function(+      topLevelType,+      topLevelTarget,+      topLevelTargetID,+      nativeEvent) {+    var events;+    var plugins = EventPluginRegistry.plugins;+    for (var i = 0, l = plugins.length; i < l; i++) {+      // Not every plugin in the ordering may be loaded at runtime.+      var possiblePlugin = plugins[i];+      if (possiblePlugin) {+        var extractedEvents = possiblePlugin.extractEvents(+          topLevelType,+          topLevelTarget,+          topLevelTargetID,+          nativeEvent+        );+        if (extractedEvents) {+          events = accumulateInto(events, extractedEvents);+        }+      }+    }+    return events;+  },++  /**+   * Enqueues a synthetic event that should be dispatched when+   * `processEventQueue` is invoked.+   *+   * @param {*} events An accumulation of synthetic events.+   * @internal+   */+  enqueueEvents: function(events) {+    if (events) {+      eventQueue = accumulateInto(eventQueue, events);+    }+  },++  /**+   * Dispatches all synthetic events on the event queue.+   *+   * @internal+   */+  processEventQueue: function() {+    // Set `eventQueue` to null before processing it so that we can tell if more+    // events get enqueued while processing.+    var processingEventQueue = eventQueue;+    eventQueue = null;+    forEachAccumulated(processingEventQueue, executeDispatchesAndRelease);+    ("production" !== "development" ? invariant(+      !eventQueue,+      'processEventQueue(): Additional events were enqueued while processing ' ++      'an event queue. Support for this has not yet been implemented.'+    ) : invariant(!eventQueue));+  },++  /**+   * These are needed for tests only. Do not use!+   */+  __purge: function() {+    listenerBank = {};+  },++  __getListenerBank: function() {+    return listenerBank;+  }++};++module.exports = EventPluginHub;++},{"105":105,"120":120,"135":135,"18":18,"19":19}],18:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule EventPluginRegistry+ * @typechecks static-only+ */++'use strict';++var invariant = _dereq_(135);++/**+ * Injectable ordering of event plugins.+ */+var EventPluginOrder = null;++/**+ * Injectable mapping from names to event plugin modules.+ */+var namesToPlugins = {};++/**+ * Recomputes the plugin list using the injected plugins and plugin ordering.+ *+ * @private+ */+function recomputePluginOrdering() {+  if (!EventPluginOrder) {+    // Wait until an `EventPluginOrder` is injected.+    return;+  }+  for (var pluginName in namesToPlugins) {+    var PluginModule = namesToPlugins[pluginName];+    var pluginIndex = EventPluginOrder.indexOf(pluginName);+    ("production" !== "development" ? invariant(+      pluginIndex > -1,+      'EventPluginRegistry: Cannot inject event plugins that do not exist in ' ++      'the plugin ordering, `%s`.',+      pluginName+    ) : invariant(pluginIndex > -1));+    if (EventPluginRegistry.plugins[pluginIndex]) {+      continue;+    }+    ("production" !== "development" ? invariant(+      PluginModule.extractEvents,+      'EventPluginRegistry: Event plugins must implement an `extractEvents` ' ++      'method, but `%s` does not.',+      pluginName+    ) : invariant(PluginModule.extractEvents));+    EventPluginRegistry.plugins[pluginIndex] = PluginModule;+    var publishedEvents = PluginModule.eventTypes;+    for (var eventName in publishedEvents) {+      ("production" !== "development" ? invariant(+        publishEventForPlugin(+          publishedEvents[eventName],+          PluginModule,+          eventName+        ),+        'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.',+        eventName,+        pluginName+      ) : invariant(publishEventForPlugin(+        publishedEvents[eventName],+        PluginModule,+        eventName+      )));+    }+  }+}++/**+ * Publishes an event so that it can be dispatched by the supplied plugin.+ *+ * @param {object} dispatchConfig Dispatch configuration for the event.+ * @param {object} PluginModule Plugin publishing the event.+ * @return {boolean} True if the event was successfully published.+ * @private+ */+function publishEventForPlugin(dispatchConfig, PluginModule, eventName) {+  ("production" !== "development" ? invariant(+    !EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName),+    'EventPluginHub: More than one plugin attempted to publish the same ' ++    'event name, `%s`.',+    eventName+  ) : invariant(!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName)));+  EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;++  var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;+  if (phasedRegistrationNames) {+    for (var phaseName in phasedRegistrationNames) {+      if (phasedRegistrationNames.hasOwnProperty(phaseName)) {+        var phasedRegistrationName = phasedRegistrationNames[phaseName];+        publishRegistrationName(+          phasedRegistrationName,+          PluginModule,+          eventName+        );+      }+    }+    return true;+  } else if (dispatchConfig.registrationName) {+    publishRegistrationName(+      dispatchConfig.registrationName,+      PluginModule,+      eventName+    );+    return true;+  }+  return false;+}++/**+ * Publishes a registration name that is used to identify dispatched events and+ * can be used with `EventPluginHub.putListener` to register listeners.+ *+ * @param {string} registrationName Registration name to add.+ * @param {object} PluginModule Plugin publishing the event.+ * @private+ */+function publishRegistrationName(registrationName, PluginModule, eventName) {+  ("production" !== "development" ? invariant(+    !EventPluginRegistry.registrationNameModules[registrationName],+    'EventPluginHub: More than one plugin attempted to publish the same ' ++    'registration name, `%s`.',+    registrationName+  ) : invariant(!EventPluginRegistry.registrationNameModules[registrationName]));+  EventPluginRegistry.registrationNameModules[registrationName] = PluginModule;+  EventPluginRegistry.registrationNameDependencies[registrationName] =+    PluginModule.eventTypes[eventName].dependencies;+}++/**+ * Registers plugins so that they can extract and dispatch events.+ *+ * @see {EventPluginHub}+ */+var EventPluginRegistry = {++  /**+   * Ordered list of injected plugins.+   */+  plugins: [],++  /**+   * Mapping from event name to dispatch config+   */+  eventNameDispatchConfigs: {},++  /**+   * Mapping from registration name to plugin module+   */+  registrationNameModules: {},++  /**+   * Mapping from registration name to event name+   */+  registrationNameDependencies: {},++  /**+   * Injects an ordering of plugins (by plugin name). This allows the ordering+   * to be decoupled from injection of the actual plugins so that ordering is+   * always deterministic regardless of packaging, on-the-fly injection, etc.+   *+   * @param {array} InjectedEventPluginOrder+   * @internal+   * @see {EventPluginHub.injection.injectEventPluginOrder}+   */+  injectEventPluginOrder: function(InjectedEventPluginOrder) {+    ("production" !== "development" ? invariant(+      !EventPluginOrder,+      'EventPluginRegistry: Cannot inject event plugin ordering more than ' ++      'once. You are likely trying to load more than one copy of React.'+    ) : invariant(!EventPluginOrder));+    // Clone the ordering so it cannot be dynamically mutated.+    EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder);+    recomputePluginOrdering();+  },++  /**+   * Injects plugins to be used by `EventPluginHub`. The plugin names must be+   * in the ordering injected by `injectEventPluginOrder`.+   *+   * Plugins can be injected as part of page initialization or on-the-fly.+   *+   * @param {object} injectedNamesToPlugins Map from names to plugin modules.+   * @internal+   * @see {EventPluginHub.injection.injectEventPluginsByName}+   */+  injectEventPluginsByName: function(injectedNamesToPlugins) {+    var isOrderingDirty = false;+    for (var pluginName in injectedNamesToPlugins) {+      if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {+        continue;+      }+      var PluginModule = injectedNamesToPlugins[pluginName];+      if (!namesToPlugins.hasOwnProperty(pluginName) ||+          namesToPlugins[pluginName] !== PluginModule) {+        ("production" !== "development" ? invariant(+          !namesToPlugins[pluginName],+          'EventPluginRegistry: Cannot inject two different event plugins ' ++          'using the same name, `%s`.',+          pluginName+        ) : invariant(!namesToPlugins[pluginName]));+        namesToPlugins[pluginName] = PluginModule;+        isOrderingDirty = true;+      }+    }+    if (isOrderingDirty) {+      recomputePluginOrdering();+    }+  },++  /**+   * Looks up the plugin for the supplied event.+   *+   * @param {object} event A synthetic event.+   * @return {?object} The plugin that created the supplied event.+   * @internal+   */+  getPluginModuleForEvent: function(event) {+    var dispatchConfig = event.dispatchConfig;+    if (dispatchConfig.registrationName) {+      return EventPluginRegistry.registrationNameModules[+        dispatchConfig.registrationName+      ] || null;+    }+    for (var phase in dispatchConfig.phasedRegistrationNames) {+      if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) {+        continue;+      }+      var PluginModule = EventPluginRegistry.registrationNameModules[+        dispatchConfig.phasedRegistrationNames[phase]+      ];+      if (PluginModule) {+        return PluginModule;+      }+    }+    return null;+  },++  /**+   * Exposed for unit testing.+   * @private+   */+  _resetEventPlugins: function() {+    EventPluginOrder = null;+    for (var pluginName in namesToPlugins) {+      if (namesToPlugins.hasOwnProperty(pluginName)) {+        delete namesToPlugins[pluginName];+      }+    }+    EventPluginRegistry.plugins.length = 0;++    var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;+    for (var eventName in eventNameDispatchConfigs) {+      if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {+        delete eventNameDispatchConfigs[eventName];+      }+    }++    var registrationNameModules = EventPluginRegistry.registrationNameModules;+    for (var registrationName in registrationNameModules) {+      if (registrationNameModules.hasOwnProperty(registrationName)) {+        delete registrationNameModules[registrationName];+      }+    }+  }++};++module.exports = EventPluginRegistry;++},{"135":135}],19:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule EventPluginUtils+ */++'use strict';++var EventConstants = _dereq_(15);++var invariant = _dereq_(135);++/**+ * Injected dependencies:+ */++/**+ * - `Mount`: [required] Module that can convert between React dom IDs and+ *   actual node references.+ */+var injection = {+  Mount: null,+  injectMount: function(InjectedMount) {+    injection.Mount = InjectedMount;+    if ("production" !== "development") {+      ("production" !== "development" ? invariant(+        InjectedMount && InjectedMount.getNode,+        'EventPluginUtils.injection.injectMount(...): Injected Mount module ' ++        'is missing getNode.'+      ) : invariant(InjectedMount && InjectedMount.getNode));+    }+  }+};++var topLevelTypes = EventConstants.topLevelTypes;++function isEndish(topLevelType) {+  return topLevelType === topLevelTypes.topMouseUp ||+         topLevelType === topLevelTypes.topTouchEnd ||+         topLevelType === topLevelTypes.topTouchCancel;+}++function isMoveish(topLevelType) {+  return topLevelType === topLevelTypes.topMouseMove ||+         topLevelType === topLevelTypes.topTouchMove;+}+function isStartish(topLevelType) {+  return topLevelType === topLevelTypes.topMouseDown ||+         topLevelType === topLevelTypes.topTouchStart;+}+++var validateEventDispatches;+if ("production" !== "development") {+  validateEventDispatches = function(event) {+    var dispatchListeners = event._dispatchListeners;+    var dispatchIDs = event._dispatchIDs;++    var listenersIsArr = Array.isArray(dispatchListeners);+    var idsIsArr = Array.isArray(dispatchIDs);+    var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0;+    var listenersLen = listenersIsArr ?+      dispatchListeners.length :+      dispatchListeners ? 1 : 0;++    ("production" !== "development" ? invariant(+      idsIsArr === listenersIsArr && IDsLen === listenersLen,+      'EventPluginUtils: Invalid `event`.'+    ) : invariant(idsIsArr === listenersIsArr && IDsLen === listenersLen));+  };+}++/**+ * Invokes `cb(event, listener, id)`. Avoids using call if no scope is+ * provided. The `(listener,id)` pair effectively forms the "dispatch" but are+ * kept separate to conserve memory.+ */+function forEachEventDispatch(event, cb) {+  var dispatchListeners = event._dispatchListeners;+  var dispatchIDs = event._dispatchIDs;+  if ("production" !== "development") {+    validateEventDispatches(event);+  }+  if (Array.isArray(dispatchListeners)) {+    for (var i = 0; i < dispatchListeners.length; i++) {+      if (event.isPropagationStopped()) {+        break;+      }+      // Listeners and IDs are two parallel arrays that are always in sync.+      cb(event, dispatchListeners[i], dispatchIDs[i]);+    }+  } else if (dispatchListeners) {+    cb(event, dispatchListeners, dispatchIDs);+  }+}++/**+ * Default implementation of PluginModule.executeDispatch().+ * @param {SyntheticEvent} SyntheticEvent to handle+ * @param {function} Application-level callback+ * @param {string} domID DOM id to pass to the callback.+ */+function executeDispatch(event, listener, domID) {+  event.currentTarget = injection.Mount.getNode(domID);+  var returnValue = listener(event, domID);+  event.currentTarget = null;+  return returnValue;+}++/**+ * Standard/simple iteration through an event's collected dispatches.+ */+function executeDispatchesInOrder(event, cb) {+  forEachEventDispatch(event, cb);+  event._dispatchListeners = null;+  event._dispatchIDs = null;+}++/**+ * Standard/simple iteration through an event's collected dispatches, but stops+ * at the first dispatch execution returning true, and returns that id.+ *+ * @return id of the first dispatch execution who's listener returns true, or+ * null if no listener returned true.+ */+function executeDispatchesInOrderStopAtTrueImpl(event) {+  var dispatchListeners = event._dispatchListeners;+  var dispatchIDs = event._dispatchIDs;+  if ("production" !== "development") {+    validateEventDispatches(event);+  }+  if (Array.isArray(dispatchListeners)) {+    for (var i = 0; i < dispatchListeners.length; i++) {+      if (event.isPropagationStopped()) {+        break;+      }+      // Listeners and IDs are two parallel arrays that are always in sync.+      if (dispatchListeners[i](event, dispatchIDs[i])) {+        return dispatchIDs[i];+      }+    }+  } else if (dispatchListeners) {+    if (dispatchListeners(event, dispatchIDs)) {+      return dispatchIDs;+    }+  }+  return null;+}++/**+ * @see executeDispatchesInOrderStopAtTrueImpl+ */+function executeDispatchesInOrderStopAtTrue(event) {+  var ret = executeDispatchesInOrderStopAtTrueImpl(event);+  event._dispatchIDs = null;+  event._dispatchListeners = null;+  return ret;+}++/**+ * Execution of a "direct" dispatch - there must be at most one dispatch+ * accumulated on the event or it is considered an error. It doesn't really make+ * sense for an event with multiple dispatches (bubbled) to keep track of the+ * return values at each dispatch execution, but it does tend to make sense when+ * dealing with "direct" dispatches.+ *+ * @return The return value of executing the single dispatch.+ */+function executeDirectDispatch(event) {+  if ("production" !== "development") {+    validateEventDispatches(event);+  }+  var dispatchListener = event._dispatchListeners;+  var dispatchID = event._dispatchIDs;+  ("production" !== "development" ? invariant(+    !Array.isArray(dispatchListener),+    'executeDirectDispatch(...): Invalid `event`.'+  ) : invariant(!Array.isArray(dispatchListener)));+  var res = dispatchListener ?+    dispatchListener(event, dispatchID) :+    null;+  event._dispatchListeners = null;+  event._dispatchIDs = null;+  return res;+}++/**+ * @param {SyntheticEvent} event+ * @return {bool} True iff number of dispatches accumulated is greater than 0.+ */+function hasDispatches(event) {+  return !!event._dispatchListeners;+}++/**+ * General utilities that are useful in creating custom Event Plugins.+ */+var EventPluginUtils = {+  isEndish: isEndish,+  isMoveish: isMoveish,+  isStartish: isStartish,++  executeDirectDispatch: executeDirectDispatch,+  executeDispatch: executeDispatch,+  executeDispatchesInOrder: executeDispatchesInOrder,+  executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,+  hasDispatches: hasDispatches,+  injection: injection,+  useTouchEvents: false+};++module.exports = EventPluginUtils;++},{"135":135,"15":15}],20:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule EventPropagators+ */++'use strict';++var EventConstants = _dereq_(15);+var EventPluginHub = _dereq_(17);++var accumulateInto = _dereq_(105);+var forEachAccumulated = _dereq_(120);++var PropagationPhases = EventConstants.PropagationPhases;+var getListener = EventPluginHub.getListener;++/**+ * Some event types have a notion of different registration names for different+ * "phases" of propagation. This finds listeners by a given phase.+ */+function listenerAtPhase(id, event, propagationPhase) {+  var registrationName =+    event.dispatchConfig.phasedRegistrationNames[propagationPhase];+  return getListener(id, registrationName);+}++/**+ * Tags a `SyntheticEvent` with dispatched listeners. Creating this function+ * here, allows us to not have to bind or create functions for each event.+ * Mutating the event's members allows us to not have to create a wrapping+ * "dispatch" object that pairs the event with the listener.+ */+function accumulateDirectionalDispatches(domID, upwards, event) {+  if ("production" !== "development") {+    if (!domID) {+      throw new Error('Dispatching id must not be null');+    }+  }+  var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured;+  var listener = listenerAtPhase(domID, event, phase);+  if (listener) {+    event._dispatchListeners =+      accumulateInto(event._dispatchListeners, listener);+    event._dispatchIDs = accumulateInto(event._dispatchIDs, domID);+  }+}++/**+ * Collect dispatches (must be entirely collected before dispatching - see unit+ * tests). Lazily allocate the array to conserve memory.  We must loop through+ * each event and perform the traversal for each one. We can not perform a+ * single traversal for the entire collection of events because each event may+ * have a different target.+ */+function accumulateTwoPhaseDispatchesSingle(event) {+  if (event && event.dispatchConfig.phasedRegistrationNames) {+    EventPluginHub.injection.getInstanceHandle().traverseTwoPhase(+      event.dispatchMarker,+      accumulateDirectionalDispatches,+      event+    );+  }+}+++/**+ * Accumulates without regard to direction, does not look for phased+ * registration names. Same as `accumulateDirectDispatchesSingle` but without+ * requiring that the `dispatchMarker` be the same as the dispatched ID.+ */+function accumulateDispatches(id, ignoredDirection, event) {+  if (event && event.dispatchConfig.registrationName) {+    var registrationName = event.dispatchConfig.registrationName;+    var listener = getListener(id, registrationName);+    if (listener) {+      event._dispatchListeners =+        accumulateInto(event._dispatchListeners, listener);+      event._dispatchIDs = accumulateInto(event._dispatchIDs, id);+    }+  }+}++/**+ * Accumulates dispatches on an `SyntheticEvent`, but only for the+ * `dispatchMarker`.+ * @param {SyntheticEvent} event+ */+function accumulateDirectDispatchesSingle(event) {+  if (event && event.dispatchConfig.registrationName) {+    accumulateDispatches(event.dispatchMarker, null, event);+  }+}++function accumulateTwoPhaseDispatches(events) {+  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);+}++function accumulateEnterLeaveDispatches(leave, enter, fromID, toID) {+  EventPluginHub.injection.getInstanceHandle().traverseEnterLeave(+    fromID,+    toID,+    accumulateDispatches,+    leave,+    enter+  );+}+++function accumulateDirectDispatches(events) {+  forEachAccumulated(events, accumulateDirectDispatchesSingle);+}++++/**+ * A small set of propagation patterns, each of which will accept a small amount+ * of information, and generate a set of "dispatch ready event objects" - which+ * are sets of events that have already been annotated with a set of dispatched+ * listener functions/ids. The API is designed this way to discourage these+ * propagation strategies from actually executing the dispatches, since we+ * always want to collect the entire set of dispatches before executing event a+ * single one.+ *+ * @constructor EventPropagators+ */+var EventPropagators = {+  accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,+  accumulateDirectDispatches: accumulateDirectDispatches,+  accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches+};++module.exports = EventPropagators;++},{"105":105,"120":120,"15":15,"17":17}],21:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ExecutionEnvironment+ */++/*jslint evil: true */++"use strict";++var canUseDOM = !!(+  (typeof window !== 'undefined' &&+  window.document && window.document.createElement)+);++/**+ * Simple, lightweight module assisting with the detection and context of+ * Worker. Helps avoid circular dependencies and allows code to reason about+ * whether or not they are in a Worker, even if they never include the main+ * `ReactWorker` dependency.+ */+var ExecutionEnvironment = {++  canUseDOM: canUseDOM,++  canUseWorkers: typeof Worker !== 'undefined',++  canUseEventListeners:+    canUseDOM && !!(window.addEventListener || window.attachEvent),++  canUseViewport: canUseDOM && !!window.screen,++  isInWorker: !canUseDOM // For now, this is true - might change in the future.++};++module.exports = ExecutionEnvironment;++},{}],22:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule FallbackCompositionState+ * @typechecks static-only+ */++'use strict';++var PooledClass = _dereq_(28);++var assign = _dereq_(27);+var getTextContentAccessor = _dereq_(130);++/**+ * This helper class stores information about text content of a target node,+ * allowing comparison of content before and after a given event.+ *+ * Identify the node where selection currently begins, then observe+ * both its text content and its current position in the DOM. Since the+ * browser may natively replace the target node during composition, we can+ * use its position to find its replacement.+ *+ * @param {DOMEventTarget} root+ */+function FallbackCompositionState(root) {+  this._root = root;+  this._startText = this.getText();+  this._fallbackText = null;+}++assign(FallbackCompositionState.prototype, {+  /**+   * Get current text of input.+   *+   * @return {string}+   */+  getText: function() {+    if ('value' in this._root) {+      return this._root.value;+    }+    return this._root[getTextContentAccessor()];+  },++  /**+   * Determine the differing substring between the initially stored+   * text content and the current content.+   *+   * @return {string}+   */+  getData: function() {+    if (this._fallbackText) {+      return this._fallbackText;+    }++    var start;+    var startValue = this._startText;+    var startLength = startValue.length;+    var end;+    var endValue = this.getText();+    var endLength = endValue.length;++    for (start = 0; start < startLength; start++) {+      if (startValue[start] !== endValue[start]) {+        break;+      }+    }++    var minEnd = startLength - start;+    for (end = 1; end <= minEnd; end++) {+      if (startValue[startLength - end] !== endValue[endLength - end]) {+        break;+      }+    }++    var sliceTail = end > 1 ? 1 - end : undefined;+    this._fallbackText = endValue.slice(start, sliceTail);+    return this._fallbackText;+  }+});++PooledClass.addPoolingTo(FallbackCompositionState);++module.exports = FallbackCompositionState;++},{"130":130,"27":27,"28":28}],23:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule HTMLDOMPropertyConfig+ */++/*jslint bitwise: true*/++'use strict';++var DOMProperty = _dereq_(10);+var ExecutionEnvironment = _dereq_(21);++var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;+var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;+var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;+var HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS;+var HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE;+var HAS_POSITIVE_NUMERIC_VALUE =+  DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE;+var HAS_OVERLOADED_BOOLEAN_VALUE =+  DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE;++var hasSVG;+if (ExecutionEnvironment.canUseDOM) {+  var implementation = document.implementation;+  hasSVG = (+    implementation &&+    implementation.hasFeature &&+    implementation.hasFeature(+      'http://www.w3.org/TR/SVG11/feature#BasicStructure',+      '1.1'+    )+  );+}+++var HTMLDOMPropertyConfig = {+  isCustomAttribute: RegExp.prototype.test.bind(+    /^(data|aria)-[a-z_][a-z\d_.\-]*$/+  ),+  Properties: {+    /**+     * Standard Properties+     */+    accept: null,+    acceptCharset: null,+    accessKey: null,+    action: null,+    allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,+    allowTransparency: MUST_USE_ATTRIBUTE,+    alt: null,+    async: HAS_BOOLEAN_VALUE,+    autoComplete: null,+    // autoFocus is polyfilled/normalized by AutoFocusMixin+    // autoFocus: HAS_BOOLEAN_VALUE,+    autoPlay: HAS_BOOLEAN_VALUE,+    cellPadding: null,+    cellSpacing: null,+    charSet: MUST_USE_ATTRIBUTE,+    checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,+    classID: MUST_USE_ATTRIBUTE,+    // To set className on SVG elements, it's necessary to use .setAttribute;+    // this works on HTML elements too in all browsers except IE8. Conveniently,+    // IE8 doesn't support SVG and so we can simply use the attribute in+    // browsers that support SVG and the property in browsers that don't,+    // regardless of whether the element is HTML or SVG.+    className: hasSVG ? MUST_USE_ATTRIBUTE : MUST_USE_PROPERTY,+    cols: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,+    colSpan: null,+    content: null,+    contentEditable: null,+    contextMenu: MUST_USE_ATTRIBUTE,+    controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,+    coords: null,+    crossOrigin: null,+    data: null, // For `<object />` acts as `src`.+    dateTime: MUST_USE_ATTRIBUTE,+    defer: HAS_BOOLEAN_VALUE,+    dir: null,+    disabled: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,+    download: HAS_OVERLOADED_BOOLEAN_VALUE,+    draggable: null,+    encType: null,+    form: MUST_USE_ATTRIBUTE,+    formAction: MUST_USE_ATTRIBUTE,+    formEncType: MUST_USE_ATTRIBUTE,+    formMethod: MUST_USE_ATTRIBUTE,+    formNoValidate: HAS_BOOLEAN_VALUE,+    formTarget: MUST_USE_ATTRIBUTE,+    frameBorder: MUST_USE_ATTRIBUTE,+    headers: null,+    height: MUST_USE_ATTRIBUTE,+    hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,+    high: null,+    href: null,+    hrefLang: null,+    htmlFor: null,+    httpEquiv: null,+    icon: null,+    id: MUST_USE_PROPERTY,+    label: null,+    lang: null,+    list: MUST_USE_ATTRIBUTE,+    loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,+    low: null,+    manifest: MUST_USE_ATTRIBUTE,+    marginHeight: null,+    marginWidth: null,+    max: null,+    maxLength: MUST_USE_ATTRIBUTE,+    media: MUST_USE_ATTRIBUTE,+    mediaGroup: null,+    method: null,+    min: null,+    multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,+    muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,+    name: null,+    noValidate: HAS_BOOLEAN_VALUE,+    open: HAS_BOOLEAN_VALUE,+    optimum: null,+    pattern: null,+    placeholder: null,+    poster: null,+    preload: null,+    radioGroup: null,+    readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,+    rel: null,+    required: HAS_BOOLEAN_VALUE,+    role: MUST_USE_ATTRIBUTE,+    rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,+    rowSpan: null,+    sandbox: null,+    scope: null,+    scoped: HAS_BOOLEAN_VALUE,+    scrolling: null,+    seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,+    selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,+    shape: null,+    size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,+    sizes: MUST_USE_ATTRIBUTE,+    span: HAS_POSITIVE_NUMERIC_VALUE,+    spellCheck: null,+    src: null,+    srcDoc: MUST_USE_PROPERTY,+    srcSet: MUST_USE_ATTRIBUTE,+    start: HAS_NUMERIC_VALUE,+    step: null,+    style: null,+    tabIndex: null,+    target: null,+    title: null,+    type: null,+    useMap: null,+    value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS,+    width: MUST_USE_ATTRIBUTE,+    wmode: MUST_USE_ATTRIBUTE,++    /**+     * Non-standard Properties+     */+    // autoCapitalize and autoCorrect are supported in Mobile Safari for+    // keyboard hints.+    autoCapitalize: null,+    autoCorrect: null,+    // itemProp, itemScope, itemType are for+    // Microdata support. See http://schema.org/docs/gs.html+    itemProp: MUST_USE_ATTRIBUTE,+    itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,+    itemType: MUST_USE_ATTRIBUTE,+    // itemID and itemRef are for Microdata support as well but+    // only specified in the the WHATWG spec document. See+    // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api+    itemID: MUST_USE_ATTRIBUTE,+    itemRef: MUST_USE_ATTRIBUTE,+    // property is supported for OpenGraph in meta tags.+    property: null,+    // IE-only attribute that controls focus behavior+    unselectable: MUST_USE_ATTRIBUTE+  },+  DOMAttributeNames: {+    acceptCharset: 'accept-charset',+    className: 'class',+    htmlFor: 'for',+    httpEquiv: 'http-equiv'+  },+  DOMPropertyNames: {+    autoCapitalize: 'autocapitalize',+    autoComplete: 'autocomplete',+    autoCorrect: 'autocorrect',+    autoFocus: 'autofocus',+    autoPlay: 'autoplay',+    // `encoding` is equivalent to `enctype`, IE8 lacks an `enctype` setter.+    // http://www.w3.org/TR/html5/forms.html#dom-fs-encoding+    encType: 'encoding',+    hrefLang: 'hreflang',+    radioGroup: 'radiogroup',+    spellCheck: 'spellcheck',+    srcDoc: 'srcdoc',+    srcSet: 'srcset'+  }+};++module.exports = HTMLDOMPropertyConfig;++},{"10":10,"21":21}],24:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule LinkedValueUtils+ * @typechecks static-only+ */++'use strict';++var ReactPropTypes = _dereq_(78);++var invariant = _dereq_(135);++var hasReadOnlyValue = {+  'button': true,+  'checkbox': true,+  'image': true,+  'hidden': true,+  'radio': true,+  'reset': true,+  'submit': true+};++function _assertSingleLink(input) {+  ("production" !== "development" ? invariant(+    input.props.checkedLink == null || input.props.valueLink == null,+    'Cannot provide a checkedLink and a valueLink. If you want to use ' ++    'checkedLink, you probably don\'t want to use valueLink and vice versa.'+  ) : invariant(input.props.checkedLink == null || input.props.valueLink == null));+}+function _assertValueLink(input) {+  _assertSingleLink(input);+  ("production" !== "development" ? invariant(+    input.props.value == null && input.props.onChange == null,+    'Cannot provide a valueLink and a value or onChange event. If you want ' ++    'to use value or onChange, you probably don\'t want to use valueLink.'+  ) : invariant(input.props.value == null && input.props.onChange == null));+}++function _assertCheckedLink(input) {+  _assertSingleLink(input);+  ("production" !== "development" ? invariant(+    input.props.checked == null && input.props.onChange == null,+    'Cannot provide a checkedLink and a checked property or onChange event. ' ++    'If you want to use checked or onChange, you probably don\'t want to ' ++    'use checkedLink'+  ) : invariant(input.props.checked == null && input.props.onChange == null));+}++/**+ * @param {SyntheticEvent} e change event to handle+ */+function _handleLinkedValueChange(e) {+  /*jshint validthis:true */+  this.props.valueLink.requestChange(e.target.value);+}++/**+  * @param {SyntheticEvent} e change event to handle+  */+function _handleLinkedCheckChange(e) {+  /*jshint validthis:true */+  this.props.checkedLink.requestChange(e.target.checked);+}++/**+ * Provide a linked `value` attribute for controlled forms. You should not use+ * this outside of the ReactDOM controlled form components.+ */+var LinkedValueUtils = {+  Mixin: {+    propTypes: {+      value: function(props, propName, componentName) {+        if (!props[propName] ||+            hasReadOnlyValue[props.type] ||+            props.onChange ||+            props.readOnly ||+            props.disabled) {+          return null;+        }+        return new Error(+          'You provided a `value` prop to a form field without an ' ++          '`onChange` handler. This will render a read-only field. If ' ++          'the field should be mutable use `defaultValue`. Otherwise, ' ++          'set either `onChange` or `readOnly`.'+        );+      },+      checked: function(props, propName, componentName) {+        if (!props[propName] ||+            props.onChange ||+            props.readOnly ||+            props.disabled) {+          return null;+        }+        return new Error(+          'You provided a `checked` prop to a form field without an ' ++          '`onChange` handler. This will render a read-only field. If ' ++          'the field should be mutable use `defaultChecked`. Otherwise, ' ++          'set either `onChange` or `readOnly`.'+        );+      },+      onChange: ReactPropTypes.func+    }+  },++  /**+   * @param {ReactComponent} input Form component+   * @return {*} current value of the input either from value prop or link.+   */+  getValue: function(input) {+    if (input.props.valueLink) {+      _assertValueLink(input);+      return input.props.valueLink.value;+    }+    return input.props.value;+  },++  /**+   * @param {ReactComponent} input Form component+   * @return {*} current checked status of the input either from checked prop+   *             or link.+   */+  getChecked: function(input) {+    if (input.props.checkedLink) {+      _assertCheckedLink(input);+      return input.props.checkedLink.value;+    }+    return input.props.checked;+  },++  /**+   * @param {ReactComponent} input Form component+   * @return {function} change callback either from onChange prop or link.+   */+  getOnChange: function(input) {+    if (input.props.valueLink) {+      _assertValueLink(input);+      return _handleLinkedValueChange;+    } else if (input.props.checkedLink) {+      _assertCheckedLink(input);+      return _handleLinkedCheckChange;+    }+    return input.props.onChange;+  }+};++module.exports = LinkedValueUtils;++},{"135":135,"78":78}],25:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule LocalEventTrapMixin+ */++'use strict';++var ReactBrowserEventEmitter = _dereq_(30);++var accumulateInto = _dereq_(105);+var forEachAccumulated = _dereq_(120);+var invariant = _dereq_(135);++function remove(event) {+  event.remove();+}++var LocalEventTrapMixin = {+  trapBubbledEvent:function(topLevelType, handlerBaseName) {+    ("production" !== "development" ? invariant(this.isMounted(), 'Must be mounted to trap events') : invariant(this.isMounted()));+    // If a component renders to null or if another component fatals and causes+    // the state of the tree to be corrupted, `node` here can be null.+    var node = this.getDOMNode();+    ("production" !== "development" ? invariant(+      node,+      'LocalEventTrapMixin.trapBubbledEvent(...): Requires node to be rendered.'+    ) : invariant(node));+    var listener = ReactBrowserEventEmitter.trapBubbledEvent(+      topLevelType,+      handlerBaseName,+      node+    );+    this._localEventListeners =+      accumulateInto(this._localEventListeners, listener);+  },++  // trapCapturedEvent would look nearly identical. We don't implement that+  // method because it isn't currently needed.++  componentWillUnmount:function() {+    if (this._localEventListeners) {+      forEachAccumulated(this._localEventListeners, remove);+    }+  }+};++module.exports = LocalEventTrapMixin;++},{"105":105,"120":120,"135":135,"30":30}],26:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule MobileSafariClickEventPlugin+ * @typechecks static-only+ */++'use strict';++var EventConstants = _dereq_(15);++var emptyFunction = _dereq_(114);++var topLevelTypes = EventConstants.topLevelTypes;++/**+ * Mobile Safari does not fire properly bubble click events on non-interactive+ * elements, which means delegated click listeners do not fire. The workaround+ * for this bug involves attaching an empty click listener on the target node.+ *+ * This particular plugin works around the bug by attaching an empty click+ * listener on `touchstart` (which does fire on every element).+ */+var MobileSafariClickEventPlugin = {++  eventTypes: null,++  /**+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {DOMEventTarget} topLevelTarget The listening component root node.+   * @param {string} topLevelTargetID ID of `topLevelTarget`.+   * @param {object} nativeEvent Native browser event.+   * @return {*} An accumulation of synthetic events.+   * @see {EventPluginHub.extractEvents}+   */+  extractEvents: function(+      topLevelType,+      topLevelTarget,+      topLevelTargetID,+      nativeEvent) {+    if (topLevelType === topLevelTypes.topTouchStart) {+      var target = nativeEvent.target;+      if (target && !target.onclick) {+        target.onclick = emptyFunction;+      }+    }+  }++};++module.exports = MobileSafariClickEventPlugin;++},{"114":114,"15":15}],27:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule Object.assign+ */++// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign++'use strict';++function assign(target, sources) {+  if (target == null) {+    throw new TypeError('Object.assign target cannot be null or undefined');+  }++  var to = Object(target);+  var hasOwnProperty = Object.prototype.hasOwnProperty;++  for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) {+    var nextSource = arguments[nextIndex];+    if (nextSource == null) {+      continue;+    }++    var from = Object(nextSource);++    // We don't currently support accessors nor proxies. Therefore this+    // copy cannot throw. If we ever supported this then we must handle+    // exceptions and side-effects. We don't support symbols so they won't+    // be transferred.++    for (var key in from) {+      if (hasOwnProperty.call(from, key)) {+        to[key] = from[key];+      }+    }+  }++  return to;+}++module.exports = assign;++},{}],28:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule PooledClass+ */++'use strict';++var invariant = _dereq_(135);++/**+ * Static poolers. Several custom versions for each potential number of+ * arguments. A completely generic pooler is easy to implement, but would+ * require accessing the `arguments` object. In each of these, `this` refers to+ * the Class itself, not an instance. If any others are needed, simply add them+ * here, or in their own files.+ */+var oneArgumentPooler = function(copyFieldsFrom) {+  var Klass = this;+  if (Klass.instancePool.length) {+    var instance = Klass.instancePool.pop();+    Klass.call(instance, copyFieldsFrom);+    return instance;+  } else {+    return new Klass(copyFieldsFrom);+  }+};++var twoArgumentPooler = function(a1, a2) {+  var Klass = this;+  if (Klass.instancePool.length) {+    var instance = Klass.instancePool.pop();+    Klass.call(instance, a1, a2);+    return instance;+  } else {+    return new Klass(a1, a2);+  }+};++var threeArgumentPooler = function(a1, a2, a3) {+  var Klass = this;+  if (Klass.instancePool.length) {+    var instance = Klass.instancePool.pop();+    Klass.call(instance, a1, a2, a3);+    return instance;+  } else {+    return new Klass(a1, a2, a3);+  }+};++var fiveArgumentPooler = function(a1, a2, a3, a4, a5) {+  var Klass = this;+  if (Klass.instancePool.length) {+    var instance = Klass.instancePool.pop();+    Klass.call(instance, a1, a2, a3, a4, a5);+    return instance;+  } else {+    return new Klass(a1, a2, a3, a4, a5);+  }+};++var standardReleaser = function(instance) {+  var Klass = this;+  ("production" !== "development" ? invariant(+    instance instanceof Klass,+    'Trying to release an instance into a pool of a different type.'+  ) : invariant(instance instanceof Klass));+  if (instance.destructor) {+    instance.destructor();+  }+  if (Klass.instancePool.length < Klass.poolSize) {+    Klass.instancePool.push(instance);+  }+};++var DEFAULT_POOL_SIZE = 10;+var DEFAULT_POOLER = oneArgumentPooler;++/**+ * Augments `CopyConstructor` to be a poolable class, augmenting only the class+ * itself (statically) not adding any prototypical fields. Any CopyConstructor+ * you give this may have a `poolSize` property, and will look for a+ * prototypical `destructor` on instances (optional).+ *+ * @param {Function} CopyConstructor Constructor that can be used to reset.+ * @param {Function} pooler Customizable pooler.+ */+var addPoolingTo = function(CopyConstructor, pooler) {+  var NewKlass = CopyConstructor;+  NewKlass.instancePool = [];+  NewKlass.getPooled = pooler || DEFAULT_POOLER;+  if (!NewKlass.poolSize) {+    NewKlass.poolSize = DEFAULT_POOL_SIZE;+  }+  NewKlass.release = standardReleaser;+  return NewKlass;+};++var PooledClass = {+  addPoolingTo: addPoolingTo,+  oneArgumentPooler: oneArgumentPooler,+  twoArgumentPooler: twoArgumentPooler,+  threeArgumentPooler: threeArgumentPooler,+  fiveArgumentPooler: fiveArgumentPooler+};++module.exports = PooledClass;++},{"135":135}],29:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactBrowserComponentMixin+ */++'use strict';++var findDOMNode = _dereq_(117);++var ReactBrowserComponentMixin = {+  /**+   * Returns the DOM node rendered by this component.+   *+   * @return {DOMElement} The root node of this component.+   * @final+   * @protected+   */+  getDOMNode: function() {+    return findDOMNode(this);+  }+};++module.exports = ReactBrowserComponentMixin;++},{"117":117}],30:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactBrowserEventEmitter+ * @typechecks static-only+ */++'use strict';++var EventConstants = _dereq_(15);+var EventPluginHub = _dereq_(17);+var EventPluginRegistry = _dereq_(18);+var ReactEventEmitterMixin = _dereq_(61);+var ViewportMetrics = _dereq_(104);++var assign = _dereq_(27);+var isEventSupported = _dereq_(136);++/**+ * Summary of `ReactBrowserEventEmitter` event handling:+ *+ *  - Top-level delegation is used to trap most native browser events. This+ *    may only occur in the main thread and is the responsibility of+ *    ReactEventListener, which is injected and can therefore support pluggable+ *    event sources. This is the only work that occurs in the main thread.+ *+ *  - We normalize and de-duplicate events to account for browser quirks. This+ *    may be done in the worker thread.+ *+ *  - Forward these native events (with the associated top-level type used to+ *    trap it) to `EventPluginHub`, which in turn will ask plugins if they want+ *    to extract any synthetic events.+ *+ *  - The `EventPluginHub` will then process each event by annotating them with+ *    "dispatches", a sequence of listeners and IDs that care about that event.+ *+ *  - The `EventPluginHub` then dispatches the events.+ *+ * Overview of React and the event system:+ *+ * +------------+    .+ * |    DOM     |    .+ * +------------+    .+ *       |           .+ *       v           .+ * +------------+    .+ * | ReactEvent |    .+ * |  Listener  |    .+ * +------------+    .                         +-----------++ *       |           .               +--------+|SimpleEvent|+ *       |           .               |         |Plugin     |+ * +-----|------+    .               v         +-----------++ * |     |      |    .    +--------------+                    +------------++ * |     +-----------.--->|EventPluginHub|                    |    Event   |+ * |            |    .    |              |     +-----------+  | Propagators|+ * | ReactEvent |    .    |              |     |TapEvent   |  |------------|+ * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|+ * |            |    .    |              |     +-----------+  |  utilities |+ * |     +-----------.--->|              |                    +------------++ * |     |      |    .    +--------------++ * +-----|------+    .                ^        +-----------++ *       |           .                |        |Enter/Leave|+ *       +           .                +-------+|Plugin     |+ * +-------------+   .                         +-----------++ * | application |   .+ * |-------------|   .+ * |             |   .+ * |             |   .+ * +-------------+   .+ *                   .+ *    React Core     .  General Purpose Event Plugin System+ */++var alreadyListeningTo = {};+var isMonitoringScrollValue = false;+var reactTopListenersCounter = 0;++// For events like 'submit' which don't consistently bubble (which we trap at a+// lower node than `document`), binding at `document` would cause duplicate+// events so we don't include them here+var topEventMapping = {+  topBlur: 'blur',+  topChange: 'change',+  topClick: 'click',+  topCompositionEnd: 'compositionend',+  topCompositionStart: 'compositionstart',+  topCompositionUpdate: 'compositionupdate',+  topContextMenu: 'contextmenu',+  topCopy: 'copy',+  topCut: 'cut',+  topDoubleClick: 'dblclick',+  topDrag: 'drag',+  topDragEnd: 'dragend',+  topDragEnter: 'dragenter',+  topDragExit: 'dragexit',+  topDragLeave: 'dragleave',+  topDragOver: 'dragover',+  topDragStart: 'dragstart',+  topDrop: 'drop',+  topFocus: 'focus',+  topInput: 'input',+  topKeyDown: 'keydown',+  topKeyPress: 'keypress',+  topKeyUp: 'keyup',+  topMouseDown: 'mousedown',+  topMouseMove: 'mousemove',+  topMouseOut: 'mouseout',+  topMouseOver: 'mouseover',+  topMouseUp: 'mouseup',+  topPaste: 'paste',+  topScroll: 'scroll',+  topSelectionChange: 'selectionchange',+  topTextInput: 'textInput',+  topTouchCancel: 'touchcancel',+  topTouchEnd: 'touchend',+  topTouchMove: 'touchmove',+  topTouchStart: 'touchstart',+  topWheel: 'wheel'+};++/**+ * To ensure no conflicts with other potential React instances on the page+ */+var topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2);++function getListeningForDocument(mountAt) {+  // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`+  // directly.+  if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {+    mountAt[topListenersIDKey] = reactTopListenersCounter++;+    alreadyListeningTo[mountAt[topListenersIDKey]] = {};+  }+  return alreadyListeningTo[mountAt[topListenersIDKey]];+}++/**+ * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For+ * example:+ *+ *   ReactBrowserEventEmitter.putListener('myID', 'onClick', myFunction);+ *+ * This would allocate a "registration" of `('onClick', myFunction)` on 'myID'.+ *+ * @internal+ */+var ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, {++  /**+   * Injectable event backend+   */+  ReactEventListener: null,++  injection: {+    /**+     * @param {object} ReactEventListener+     */+    injectReactEventListener: function(ReactEventListener) {+      ReactEventListener.setHandleTopLevel(+        ReactBrowserEventEmitter.handleTopLevel+      );+      ReactBrowserEventEmitter.ReactEventListener = ReactEventListener;+    }+  },++  /**+   * Sets whether or not any created callbacks should be enabled.+   *+   * @param {boolean} enabled True if callbacks should be enabled.+   */+  setEnabled: function(enabled) {+    if (ReactBrowserEventEmitter.ReactEventListener) {+      ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled);+    }+  },++  /**+   * @return {boolean} True if callbacks are enabled.+   */+  isEnabled: function() {+    return !!(+      (ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled())+    );+  },++  /**+   * We listen for bubbled touch events on the document object.+   *+   * Firefox v8.01 (and possibly others) exhibited strange behavior when+   * mounting `onmousemove` events at some node that was not the document+   * element. The symptoms were that if your mouse is not moving over something+   * contained within that mount point (for example on the background) the+   * top-level listeners for `onmousemove` won't be called. However, if you+   * register the `mousemove` on the document object, then it will of course+   * catch all `mousemove`s. This along with iOS quirks, justifies restricting+   * top-level listeners to the document object only, at least for these+   * movement types of events and possibly all events.+   *+   * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html+   *+   * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but+   * they bubble to document.+   *+   * @param {string} registrationName Name of listener (e.g. `onClick`).+   * @param {object} contentDocumentHandle Document which owns the container+   */+  listenTo: function(registrationName, contentDocumentHandle) {+    var mountAt = contentDocumentHandle;+    var isListening = getListeningForDocument(mountAt);+    var dependencies = EventPluginRegistry.+      registrationNameDependencies[registrationName];++    var topLevelTypes = EventConstants.topLevelTypes;+    for (var i = 0, l = dependencies.length; i < l; i++) {+      var dependency = dependencies[i];+      if (!(+            (isListening.hasOwnProperty(dependency) && isListening[dependency])+          )) {+        if (dependency === topLevelTypes.topWheel) {+          if (isEventSupported('wheel')) {+            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(+              topLevelTypes.topWheel,+              'wheel',+              mountAt+            );+          } else if (isEventSupported('mousewheel')) {+            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(+              topLevelTypes.topWheel,+              'mousewheel',+              mountAt+            );+          } else {+            // Firefox needs to capture a different mouse scroll event.+            // @see http://www.quirksmode.org/dom/events/tests/scroll.html+            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(+              topLevelTypes.topWheel,+              'DOMMouseScroll',+              mountAt+            );+          }+        } else if (dependency === topLevelTypes.topScroll) {++          if (isEventSupported('scroll', true)) {+            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(+              topLevelTypes.topScroll,+              'scroll',+              mountAt+            );+          } else {+            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(+              topLevelTypes.topScroll,+              'scroll',+              ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE+            );+          }+        } else if (dependency === topLevelTypes.topFocus ||+            dependency === topLevelTypes.topBlur) {++          if (isEventSupported('focus', true)) {+            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(+              topLevelTypes.topFocus,+              'focus',+              mountAt+            );+            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(+              topLevelTypes.topBlur,+              'blur',+              mountAt+            );+          } else if (isEventSupported('focusin')) {+            // IE has `focusin` and `focusout` events which bubble.+            // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html+            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(+              topLevelTypes.topFocus,+              'focusin',+              mountAt+            );+            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(+              topLevelTypes.topBlur,+              'focusout',+              mountAt+            );+          }++          // to make sure blur and focus event listeners are only attached once+          isListening[topLevelTypes.topBlur] = true;+          isListening[topLevelTypes.topFocus] = true;+        } else if (topEventMapping.hasOwnProperty(dependency)) {+          ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(+            dependency,+            topEventMapping[dependency],+            mountAt+          );+        }++        isListening[dependency] = true;+      }+    }+  },++  trapBubbledEvent: function(topLevelType, handlerBaseName, handle) {+    return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(+      topLevelType,+      handlerBaseName,+      handle+    );+  },++  trapCapturedEvent: function(topLevelType, handlerBaseName, handle) {+    return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(+      topLevelType,+      handlerBaseName,+      handle+    );+  },++  /**+   * Listens to window scroll and resize events. We cache scroll values so that+   * application code can access them without triggering reflows.+   *+   * NOTE: Scroll events do not bubble.+   *+   * @see http://www.quirksmode.org/dom/events/scroll.html+   */+  ensureScrollValueMonitoring: function() {+    if (!isMonitoringScrollValue) {+      var refresh = ViewportMetrics.refreshScrollValues;+      ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);+      isMonitoringScrollValue = true;+    }+  },++  eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs,++  registrationNameModules: EventPluginHub.registrationNameModules,++  putListener: EventPluginHub.putListener,++  getListener: EventPluginHub.getListener,++  deleteListener: EventPluginHub.deleteListener,++  deleteAllListeners: EventPluginHub.deleteAllListeners++});++module.exports = ReactBrowserEventEmitter;++},{"104":104,"136":136,"15":15,"17":17,"18":18,"27":27,"61":61}],31:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactChildReconciler+ * @typechecks static-only+ */++'use strict';++var ReactReconciler = _dereq_(81);++var flattenChildren = _dereq_(118);+var instantiateReactComponent = _dereq_(134);+var shouldUpdateReactComponent = _dereq_(151);++/**+ * ReactChildReconciler provides helpers for initializing or updating a set of+ * children. Its output is suitable for passing it onto ReactMultiChild which+ * does diffed reordering and insertion.+ */+var ReactChildReconciler = {++  /**+   * Generates a "mount image" for each of the supplied children. In the case+   * of `ReactDOMComponent`, a mount image is a string of markup.+   *+   * @param {?object} nestedChildNodes Nested child maps.+   * @return {?object} A set of child instances.+   * @internal+   */+  instantiateChildren: function(nestedChildNodes, transaction, context) {+    var children = flattenChildren(nestedChildNodes);+    for (var name in children) {+      if (children.hasOwnProperty(name)) {+        var child = children[name];+        // The rendered children must be turned into instances as they're+        // mounted.+        var childInstance = instantiateReactComponent(child, null);+        children[name] = childInstance;+      }+    }+    return children;+  },++  /**+   * Updates the rendered children and returns a new set of children.+   *+   * @param {?object} prevChildren Previously initialized set of children.+   * @param {?object} nextNestedChildNodes Nested child maps.+   * @param {ReactReconcileTransaction} transaction+   * @param {object} context+   * @return {?object} A new set of child instances.+   * @internal+   */+  updateChildren: function(+    prevChildren,+    nextNestedChildNodes,+    transaction,+    context) {+    // We currently don't have a way to track moves here but if we use iterators+    // instead of for..in we can zip the iterators and check if an item has+    // moved.+    // TODO: If nothing has changed, return the prevChildren object so that we+    // can quickly bailout if nothing has changed.+    var nextChildren = flattenChildren(nextNestedChildNodes);+    if (!nextChildren && !prevChildren) {+      return null;+    }+    var name;+    for (name in nextChildren) {+      if (!nextChildren.hasOwnProperty(name)) {+        continue;+      }+      var prevChild = prevChildren && prevChildren[name];+      var prevElement = prevChild && prevChild._currentElement;+      var nextElement = nextChildren[name];+      if (shouldUpdateReactComponent(prevElement, nextElement)) {+        ReactReconciler.receiveComponent(+          prevChild, nextElement, transaction, context+        );+        nextChildren[name] = prevChild;+      } else {+        if (prevChild) {+          ReactReconciler.unmountComponent(prevChild, name);+        }+        // The child must be instantiated before it's mounted.+        var nextChildInstance = instantiateReactComponent(+          nextElement,+          null+        );+        nextChildren[name] = nextChildInstance;+      }+    }+    // Unmount children that are no longer present.+    for (name in prevChildren) {+      if (prevChildren.hasOwnProperty(name) &&+          !(nextChildren && nextChildren.hasOwnProperty(name))) {+        ReactReconciler.unmountComponent(prevChildren[name]);+      }+    }+    return nextChildren;+  },++  /**+   * Unmounts all rendered children. This should be used to clean up children+   * when this component is unmounted.+   *+   * @param {?object} renderedChildren Previously initialized set of children.+   * @internal+   */+  unmountChildren: function(renderedChildren) {+    for (var name in renderedChildren) {+      var renderedChild = renderedChildren[name];+      ReactReconciler.unmountComponent(renderedChild);+    }+  }++};++module.exports = ReactChildReconciler;++},{"118":118,"134":134,"151":151,"81":81}],32:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactChildren+ */++'use strict';++var PooledClass = _dereq_(28);+var ReactFragment = _dereq_(63);++var traverseAllChildren = _dereq_(153);+var warning = _dereq_(154);++var twoArgumentPooler = PooledClass.twoArgumentPooler;+var threeArgumentPooler = PooledClass.threeArgumentPooler;++/**+ * PooledClass representing the bookkeeping associated with performing a child+ * traversal. Allows avoiding binding callbacks.+ *+ * @constructor ForEachBookKeeping+ * @param {!function} forEachFunction Function to perform traversal with.+ * @param {?*} forEachContext Context to perform context with.+ */+function ForEachBookKeeping(forEachFunction, forEachContext) {+  this.forEachFunction = forEachFunction;+  this.forEachContext = forEachContext;+}+PooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler);++function forEachSingleChild(traverseContext, child, name, i) {+  var forEachBookKeeping = traverseContext;+  forEachBookKeeping.forEachFunction.call(+    forEachBookKeeping.forEachContext, child, i);+}++/**+ * Iterates through children that are typically specified as `props.children`.+ *+ * The provided forEachFunc(child, index) will be called for each+ * leaf child.+ *+ * @param {?*} children Children tree container.+ * @param {function(*, int)} forEachFunc.+ * @param {*} forEachContext Context for forEachContext.+ */+function forEachChildren(children, forEachFunc, forEachContext) {+  if (children == null) {+    return children;+  }++  var traverseContext =+    ForEachBookKeeping.getPooled(forEachFunc, forEachContext);+  traverseAllChildren(children, forEachSingleChild, traverseContext);+  ForEachBookKeeping.release(traverseContext);+}++/**+ * PooledClass representing the bookkeeping associated with performing a child+ * mapping. Allows avoiding binding callbacks.+ *+ * @constructor MapBookKeeping+ * @param {!*} mapResult Object containing the ordered map of results.+ * @param {!function} mapFunction Function to perform mapping with.+ * @param {?*} mapContext Context to perform mapping with.+ */+function MapBookKeeping(mapResult, mapFunction, mapContext) {+  this.mapResult = mapResult;+  this.mapFunction = mapFunction;+  this.mapContext = mapContext;+}+PooledClass.addPoolingTo(MapBookKeeping, threeArgumentPooler);++function mapSingleChildIntoContext(traverseContext, child, name, i) {+  var mapBookKeeping = traverseContext;+  var mapResult = mapBookKeeping.mapResult;++  var keyUnique = !mapResult.hasOwnProperty(name);+  if ("production" !== "development") {+    ("production" !== "development" ? warning(+      keyUnique,+      'ReactChildren.map(...): Encountered two children with the same key, ' ++      '`%s`. Child keys must be unique; when two children share a key, only ' ++      'the first child will be used.',+      name+    ) : null);+  }++  if (keyUnique) {+    var mappedChild =+      mapBookKeeping.mapFunction.call(mapBookKeeping.mapContext, child, i);+    mapResult[name] = mappedChild;+  }+}++/**+ * Maps children that are typically specified as `props.children`.+ *+ * The provided mapFunction(child, key, index) will be called for each+ * leaf child.+ *+ * TODO: This may likely break any calls to `ReactChildren.map` that were+ * previously relying on the fact that we guarded against null children.+ *+ * @param {?*} children Children tree container.+ * @param {function(*, int)} mapFunction.+ * @param {*} mapContext Context for mapFunction.+ * @return {object} Object containing the ordered map of results.+ */+function mapChildren(children, func, context) {+  if (children == null) {+    return children;+  }++  var mapResult = {};+  var traverseContext = MapBookKeeping.getPooled(mapResult, func, context);+  traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);+  MapBookKeeping.release(traverseContext);+  return ReactFragment.create(mapResult);+}++function forEachSingleChildDummy(traverseContext, child, name, i) {+  return null;+}++/**+ * Count the number of children that are typically specified as+ * `props.children`.+ *+ * @param {?*} children Children tree container.+ * @return {number} The number of children.+ */+function countChildren(children, context) {+  return traverseAllChildren(children, forEachSingleChildDummy, null);+}++var ReactChildren = {+  forEach: forEachChildren,+  map: mapChildren,+  count: countChildren+};++module.exports = ReactChildren;++},{"153":153,"154":154,"28":28,"63":63}],33:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactClass+ */++'use strict';++var ReactComponent = _dereq_(34);+var ReactCurrentOwner = _dereq_(39);+var ReactElement = _dereq_(57);+var ReactErrorUtils = _dereq_(60);+var ReactInstanceMap = _dereq_(67);+var ReactLifeCycle = _dereq_(68);+var ReactPropTypeLocations = _dereq_(77);+var ReactPropTypeLocationNames = _dereq_(76);+var ReactUpdateQueue = _dereq_(86);++var assign = _dereq_(27);+var invariant = _dereq_(135);+var keyMirror = _dereq_(140);+var keyOf = _dereq_(141);+var warning = _dereq_(154);++var MIXINS_KEY = keyOf({mixins: null});++/**+ * Policies that describe methods in `ReactClassInterface`.+ */+var SpecPolicy = keyMirror({+  /**+   * These methods may be defined only once by the class specification or mixin.+   */+  DEFINE_ONCE: null,+  /**+   * These methods may be defined by both the class specification and mixins.+   * Subsequent definitions will be chained. These methods must return void.+   */+  DEFINE_MANY: null,+  /**+   * These methods are overriding the base class.+   */+  OVERRIDE_BASE: null,+  /**+   * These methods are similar to DEFINE_MANY, except we assume they return+   * objects. We try to merge the keys of the return values of all the mixed in+   * functions. If there is a key conflict we throw.+   */+  DEFINE_MANY_MERGED: null+});+++var injectedMixins = [];++/**+ * Composite components are higher-level components that compose other composite+ * or native components.+ *+ * To create a new type of `ReactClass`, pass a specification of+ * your new class to `React.createClass`. The only requirement of your class+ * specification is that you implement a `render` method.+ *+ *   var MyComponent = React.createClass({+ *     render: function() {+ *       return <div>Hello World</div>;+ *     }+ *   });+ *+ * The class specification supports a specific protocol of methods that have+ * special meaning (e.g. `render`). See `ReactClassInterface` for+ * more the comprehensive protocol. Any other properties and methods in the+ * class specification will available on the prototype.+ *+ * @interface ReactClassInterface+ * @internal+ */+var ReactClassInterface = {++  /**+   * An array of Mixin objects to include when defining your component.+   *+   * @type {array}+   * @optional+   */+  mixins: SpecPolicy.DEFINE_MANY,++  /**+   * An object containing properties and methods that should be defined on+   * the component's constructor instead of its prototype (static methods).+   *+   * @type {object}+   * @optional+   */+  statics: SpecPolicy.DEFINE_MANY,++  /**+   * Definition of prop types for this component.+   *+   * @type {object}+   * @optional+   */+  propTypes: SpecPolicy.DEFINE_MANY,++  /**+   * Definition of context types for this component.+   *+   * @type {object}+   * @optional+   */+  contextTypes: SpecPolicy.DEFINE_MANY,++  /**+   * Definition of context types this component sets for its children.+   *+   * @type {object}+   * @optional+   */+  childContextTypes: SpecPolicy.DEFINE_MANY,++  // ==== Definition methods ====++  /**+   * Invoked when the component is mounted. Values in the mapping will be set on+   * `this.props` if that prop is not specified (i.e. using an `in` check).+   *+   * This method is invoked before `getInitialState` and therefore cannot rely+   * on `this.state` or use `this.setState`.+   *+   * @return {object}+   * @optional+   */+  getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED,++  /**+   * Invoked once before the component is mounted. The return value will be used+   * as the initial value of `this.state`.+   *+   *   getInitialState: function() {+   *     return {+   *       isOn: false,+   *       fooBaz: new BazFoo()+   *     }+   *   }+   *+   * @return {object}+   * @optional+   */+  getInitialState: SpecPolicy.DEFINE_MANY_MERGED,++  /**+   * @return {object}+   * @optional+   */+  getChildContext: SpecPolicy.DEFINE_MANY_MERGED,++  /**+   * Uses props from `this.props` and state from `this.state` to render the+   * structure of the component.+   *+   * No guarantees are made about when or how often this method is invoked, so+   * it must not have side effects.+   *+   *   render: function() {+   *     var name = this.props.name;+   *     return <div>Hello, {name}!</div>;+   *   }+   *+   * @return {ReactComponent}+   * @nosideeffects+   * @required+   */+  render: SpecPolicy.DEFINE_ONCE,++++  // ==== Delegate methods ====++  /**+   * Invoked when the component is initially created and about to be mounted.+   * This may have side effects, but any external subscriptions or data created+   * by this method must be cleaned up in `componentWillUnmount`.+   *+   * @optional+   */+  componentWillMount: SpecPolicy.DEFINE_MANY,++  /**+   * Invoked when the component has been mounted and has a DOM representation.+   * However, there is no guarantee that the DOM node is in the document.+   *+   * Use this as an opportunity to operate on the DOM when the component has+   * been mounted (initialized and rendered) for the first time.+   *+   * @param {DOMElement} rootNode DOM element representing the component.+   * @optional+   */+  componentDidMount: SpecPolicy.DEFINE_MANY,++  /**+   * Invoked before the component receives new props.+   *+   * Use this as an opportunity to react to a prop transition by updating the+   * state using `this.setState`. Current props are accessed via `this.props`.+   *+   *   componentWillReceiveProps: function(nextProps, nextContext) {+   *     this.setState({+   *       likesIncreasing: nextProps.likeCount > this.props.likeCount+   *     });+   *   }+   *+   * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop+   * transition may cause a state change, but the opposite is not true. If you+   * need it, you are probably looking for `componentWillUpdate`.+   *+   * @param {object} nextProps+   * @optional+   */+  componentWillReceiveProps: SpecPolicy.DEFINE_MANY,++  /**+   * Invoked while deciding if the component should be updated as a result of+   * receiving new props, state and/or context.+   *+   * Use this as an opportunity to `return false` when you're certain that the+   * transition to the new props/state/context will not require a component+   * update.+   *+   *   shouldComponentUpdate: function(nextProps, nextState, nextContext) {+   *     return !equal(nextProps, this.props) ||+   *       !equal(nextState, this.state) ||+   *       !equal(nextContext, this.context);+   *   }+   *+   * @param {object} nextProps+   * @param {?object} nextState+   * @param {?object} nextContext+   * @return {boolean} True if the component should update.+   * @optional+   */+  shouldComponentUpdate: SpecPolicy.DEFINE_ONCE,++  /**+   * Invoked when the component is about to update due to a transition from+   * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`+   * and `nextContext`.+   *+   * Use this as an opportunity to perform preparation before an update occurs.+   *+   * NOTE: You **cannot** use `this.setState()` in this method.+   *+   * @param {object} nextProps+   * @param {?object} nextState+   * @param {?object} nextContext+   * @param {ReactReconcileTransaction} transaction+   * @optional+   */+  componentWillUpdate: SpecPolicy.DEFINE_MANY,++  /**+   * Invoked when the component's DOM representation has been updated.+   *+   * Use this as an opportunity to operate on the DOM when the component has+   * been updated.+   *+   * @param {object} prevProps+   * @param {?object} prevState+   * @param {?object} prevContext+   * @param {DOMElement} rootNode DOM element representing the component.+   * @optional+   */+  componentDidUpdate: SpecPolicy.DEFINE_MANY,++  /**+   * Invoked when the component is about to be removed from its parent and have+   * its DOM representation destroyed.+   *+   * Use this as an opportunity to deallocate any external resources.+   *+   * NOTE: There is no `componentDidUnmount` since your component will have been+   * destroyed by that point.+   *+   * @optional+   */+  componentWillUnmount: SpecPolicy.DEFINE_MANY,++++  // ==== Advanced methods ====++  /**+   * Updates the component's currently mounted DOM representation.+   *+   * By default, this implements React's rendering and reconciliation algorithm.+   * Sophisticated clients may wish to override this.+   *+   * @param {ReactReconcileTransaction} transaction+   * @internal+   * @overridable+   */+  updateComponent: SpecPolicy.OVERRIDE_BASE++};++/**+ * Mapping from class specification keys to special processing functions.+ *+ * Although these are declared like instance properties in the specification+ * when defining classes using `React.createClass`, they are actually static+ * and are accessible on the constructor instead of the prototype. Despite+ * being static, they must be defined outside of the "statics" key under+ * which all other static methods are defined.+ */+var RESERVED_SPEC_KEYS = {+  displayName: function(Constructor, displayName) {+    Constructor.displayName = displayName;+  },+  mixins: function(Constructor, mixins) {+    if (mixins) {+      for (var i = 0; i < mixins.length; i++) {+        mixSpecIntoComponent(Constructor, mixins[i]);+      }+    }+  },+  childContextTypes: function(Constructor, childContextTypes) {+    if ("production" !== "development") {+      validateTypeDef(+        Constructor,+        childContextTypes,+        ReactPropTypeLocations.childContext+      );+    }+    Constructor.childContextTypes = assign(+      {},+      Constructor.childContextTypes,+      childContextTypes+    );+  },+  contextTypes: function(Constructor, contextTypes) {+    if ("production" !== "development") {+      validateTypeDef(+        Constructor,+        contextTypes,+        ReactPropTypeLocations.context+      );+    }+    Constructor.contextTypes = assign(+      {},+      Constructor.contextTypes,+      contextTypes+    );+  },+  /**+   * Special case getDefaultProps which should move into statics but requires+   * automatic merging.+   */+  getDefaultProps: function(Constructor, getDefaultProps) {+    if (Constructor.getDefaultProps) {+      Constructor.getDefaultProps = createMergedResultFunction(+        Constructor.getDefaultProps,+        getDefaultProps+      );+    } else {+      Constructor.getDefaultProps = getDefaultProps;+    }+  },+  propTypes: function(Constructor, propTypes) {+    if ("production" !== "development") {+      validateTypeDef(+        Constructor,+        propTypes,+        ReactPropTypeLocations.prop+      );+    }+    Constructor.propTypes = assign(+      {},+      Constructor.propTypes,+      propTypes+    );+  },+  statics: function(Constructor, statics) {+    mixStaticSpecIntoComponent(Constructor, statics);+  }+};++function validateTypeDef(Constructor, typeDef, location) {+  for (var propName in typeDef) {+    if (typeDef.hasOwnProperty(propName)) {+      // use a warning instead of an invariant so components+      // don't show up in prod but not in __DEV__+      ("production" !== "development" ? warning(+        typeof typeDef[propName] === 'function',+        '%s: %s type `%s` is invalid; it must be a function, usually from ' ++        'React.PropTypes.',+        Constructor.displayName || 'ReactClass',+        ReactPropTypeLocationNames[location],+        propName+      ) : null);+    }+  }+}++function validateMethodOverride(proto, name) {+  var specPolicy = ReactClassInterface.hasOwnProperty(name) ?+    ReactClassInterface[name] :+    null;++  // Disallow overriding of base class methods unless explicitly allowed.+  if (ReactClassMixin.hasOwnProperty(name)) {+    ("production" !== "development" ? invariant(+      specPolicy === SpecPolicy.OVERRIDE_BASE,+      'ReactClassInterface: You are attempting to override ' ++      '`%s` from your class specification. Ensure that your method names ' ++      'do not overlap with React methods.',+      name+    ) : invariant(specPolicy === SpecPolicy.OVERRIDE_BASE));+  }++  // Disallow defining methods more than once unless explicitly allowed.+  if (proto.hasOwnProperty(name)) {+    ("production" !== "development" ? invariant(+      specPolicy === SpecPolicy.DEFINE_MANY ||+      specPolicy === SpecPolicy.DEFINE_MANY_MERGED,+      'ReactClassInterface: You are attempting to define ' ++      '`%s` on your component more than once. This conflict may be due ' ++      'to a mixin.',+      name+    ) : invariant(specPolicy === SpecPolicy.DEFINE_MANY ||+    specPolicy === SpecPolicy.DEFINE_MANY_MERGED));+  }+}++/**+ * Mixin helper which handles policy validation and reserved+ * specification keys when building React classses.+ */+function mixSpecIntoComponent(Constructor, spec) {+  if (!spec) {+    return;+  }++  ("production" !== "development" ? invariant(+    typeof spec !== 'function',+    'ReactClass: You\'re attempting to ' ++    'use a component class as a mixin. Instead, just use a regular object.'+  ) : invariant(typeof spec !== 'function'));+  ("production" !== "development" ? invariant(+    !ReactElement.isValidElement(spec),+    'ReactClass: You\'re attempting to ' ++    'use a component as a mixin. Instead, just use a regular object.'+  ) : invariant(!ReactElement.isValidElement(spec)));++  var proto = Constructor.prototype;++  // By handling mixins before any other properties, we ensure the same+  // chaining order is applied to methods with DEFINE_MANY policy, whether+  // mixins are listed before or after these methods in the spec.+  if (spec.hasOwnProperty(MIXINS_KEY)) {+    RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);+  }++  for (var name in spec) {+    if (!spec.hasOwnProperty(name)) {+      continue;+    }++    if (name === MIXINS_KEY) {+      // We have already handled mixins in a special case above+      continue;+    }++    var property = spec[name];+    validateMethodOverride(proto, name);++    if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {+      RESERVED_SPEC_KEYS[name](Constructor, property);+    } else {+      // Setup methods on prototype:+      // The following member methods should not be automatically bound:+      // 1. Expected ReactClass methods (in the "interface").+      // 2. Overridden methods (that were mixed in).+      var isReactClassMethod =+        ReactClassInterface.hasOwnProperty(name);+      var isAlreadyDefined = proto.hasOwnProperty(name);+      var markedDontBind = property && property.__reactDontBind;+      var isFunction = typeof property === 'function';+      var shouldAutoBind =+        isFunction &&+        !isReactClassMethod &&+        !isAlreadyDefined &&+        !markedDontBind;++      if (shouldAutoBind) {+        if (!proto.__reactAutoBindMap) {+          proto.__reactAutoBindMap = {};+        }+        proto.__reactAutoBindMap[name] = property;+        proto[name] = property;+      } else {+        if (isAlreadyDefined) {+          var specPolicy = ReactClassInterface[name];++          // These cases should already be caught by validateMethodOverride+          ("production" !== "development" ? invariant(+            isReactClassMethod && (+              (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)+            ),+            'ReactClass: Unexpected spec policy %s for key %s ' ++            'when mixing in component specs.',+            specPolicy,+            name+          ) : invariant(isReactClassMethod && (+            (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)+          )));++          // For methods which are defined more than once, call the existing+          // methods before calling the new property, merging if appropriate.+          if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) {+            proto[name] = createMergedResultFunction(proto[name], property);+          } else if (specPolicy === SpecPolicy.DEFINE_MANY) {+            proto[name] = createChainedFunction(proto[name], property);+          }+        } else {+          proto[name] = property;+          if ("production" !== "development") {+            // Add verbose displayName to the function, which helps when looking+            // at profiling tools.+            if (typeof property === 'function' && spec.displayName) {+              proto[name].displayName = spec.displayName + '_' + name;+            }+          }+        }+      }+    }+  }+}++function mixStaticSpecIntoComponent(Constructor, statics) {+  if (!statics) {+    return;+  }+  for (var name in statics) {+    var property = statics[name];+    if (!statics.hasOwnProperty(name)) {+      continue;+    }++    var isReserved = name in RESERVED_SPEC_KEYS;+    ("production" !== "development" ? invariant(+      !isReserved,+      'ReactClass: You are attempting to define a reserved ' ++      'property, `%s`, that shouldn\'t be on the "statics" key. Define it ' ++      'as an instance property instead; it will still be accessible on the ' ++      'constructor.',+      name+    ) : invariant(!isReserved));++    var isInherited = name in Constructor;+    ("production" !== "development" ? invariant(+      !isInherited,+      'ReactClass: You are attempting to define ' ++      '`%s` on your component more than once. This conflict may be ' ++      'due to a mixin.',+      name+    ) : invariant(!isInherited));+    Constructor[name] = property;+  }+}++/**+ * Merge two objects, but throw if both contain the same key.+ *+ * @param {object} one The first object, which is mutated.+ * @param {object} two The second object+ * @return {object} one after it has been mutated to contain everything in two.+ */+function mergeIntoWithNoDuplicateKeys(one, two) {+  ("production" !== "development" ? invariant(+    one && two && typeof one === 'object' && typeof two === 'object',+    'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.'+  ) : invariant(one && two && typeof one === 'object' && typeof two === 'object'));++  for (var key in two) {+    if (two.hasOwnProperty(key)) {+      ("production" !== "development" ? invariant(+        one[key] === undefined,+        'mergeIntoWithNoDuplicateKeys(): ' ++        'Tried to merge two objects with the same key: `%s`. This conflict ' ++        'may be due to a mixin; in particular, this may be caused by two ' ++        'getInitialState() or getDefaultProps() methods returning objects ' ++        'with clashing keys.',+        key+      ) : invariant(one[key] === undefined));+      one[key] = two[key];+    }+  }+  return one;+}++/**+ * Creates a function that invokes two functions and merges their return values.+ *+ * @param {function} one Function to invoke first.+ * @param {function} two Function to invoke second.+ * @return {function} Function that invokes the two argument functions.+ * @private+ */+function createMergedResultFunction(one, two) {+  return function mergedResult() {+    var a = one.apply(this, arguments);+    var b = two.apply(this, arguments);+    if (a == null) {+      return b;+    } else if (b == null) {+      return a;+    }+    var c = {};+    mergeIntoWithNoDuplicateKeys(c, a);+    mergeIntoWithNoDuplicateKeys(c, b);+    return c;+  };+}++/**+ * Creates a function that invokes two functions and ignores their return vales.+ *+ * @param {function} one Function to invoke first.+ * @param {function} two Function to invoke second.+ * @return {function} Function that invokes the two argument functions.+ * @private+ */+function createChainedFunction(one, two) {+  return function chainedFunction() {+    one.apply(this, arguments);+    two.apply(this, arguments);+  };+}++/**+ * Binds a method to the component.+ *+ * @param {object} component Component whose method is going to be bound.+ * @param {function} method Method to be bound.+ * @return {function} The bound method.+ */+function bindAutoBindMethod(component, method) {+  var boundMethod = method.bind(component);+  if ("production" !== "development") {+    boundMethod.__reactBoundContext = component;+    boundMethod.__reactBoundMethod = method;+    boundMethod.__reactBoundArguments = null;+    var componentName = component.constructor.displayName;+    var _bind = boundMethod.bind;+    /* eslint-disable block-scoped-var, no-undef */+    boundMethod.bind = function(newThis ) {for (var args=[],$__0=1,$__1=arguments.length;$__0<$__1;$__0++) args.push(arguments[$__0]);+      // User is trying to bind() an autobound method; we effectively will+      // ignore the value of "this" that the user is trying to use, so+      // let's warn.+      if (newThis !== component && newThis !== null) {+        ("production" !== "development" ? warning(+          false,+          'bind(): React component methods may only be bound to the ' ++          'component instance. See %s',+          componentName+        ) : null);+      } else if (!args.length) {+        ("production" !== "development" ? warning(+          false,+          'bind(): You are binding a component method to the component. ' ++          'React does this for you automatically in a high-performance ' ++          'way, so you can safely remove this call. See %s',+          componentName+        ) : null);+        return boundMethod;+      }+      var reboundMethod = _bind.apply(boundMethod, arguments);+      reboundMethod.__reactBoundContext = component;+      reboundMethod.__reactBoundMethod = method;+      reboundMethod.__reactBoundArguments = args;+      return reboundMethod;+      /* eslint-enable */+    };+  }+  return boundMethod;+}++/**+ * Binds all auto-bound methods in a component.+ *+ * @param {object} component Component whose method is going to be bound.+ */+function bindAutoBindMethods(component) {+  for (var autoBindKey in component.__reactAutoBindMap) {+    if (component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) {+      var method = component.__reactAutoBindMap[autoBindKey];+      component[autoBindKey] = bindAutoBindMethod(+        component,+        ReactErrorUtils.guard(+          method,+          component.constructor.displayName + '.' + autoBindKey+        )+      );+    }+  }+}++var typeDeprecationDescriptor = {+  enumerable: false,+  get: function() {+    var displayName = this.displayName || this.name || 'Component';+    ("production" !== "development" ? warning(+      false,+      '%s.type is deprecated. Use %s directly to access the class.',+      displayName,+      displayName+    ) : null);+    Object.defineProperty(this, 'type', {+      value: this+    });+    return this;+  }+};++/**+ * Add more to the ReactClass base class. These are all legacy features and+ * therefore not already part of the modern ReactComponent.+ */+var ReactClassMixin = {++  /**+   * TODO: This will be deprecated because state should always keep a consistent+   * type signature and the only use case for this, is to avoid that.+   */+  replaceState: function(newState, callback) {+    ReactUpdateQueue.enqueueReplaceState(this, newState);+    if (callback) {+      ReactUpdateQueue.enqueueCallback(this, callback);+    }+  },++  /**+   * Checks whether or not this composite component is mounted.+   * @return {boolean} True if mounted, false otherwise.+   * @protected+   * @final+   */+  isMounted: function() {+    if ("production" !== "development") {+      var owner = ReactCurrentOwner.current;+      if (owner !== null) {+        ("production" !== "development" ? warning(+          owner._warnedAboutRefsInRender,+          '%s is accessing isMounted inside its render() function. ' ++          'render() should be a pure function of props and state. It should ' ++          'never access something that requires stale data from the previous ' ++          'render, such as refs. Move this logic to componentDidMount and ' ++          'componentDidUpdate instead.',+          owner.getName() || 'A component'+        ) : null);+        owner._warnedAboutRefsInRender = true;+      }+    }+    var internalInstance = ReactInstanceMap.get(this);+    return (+      internalInstance &&+      internalInstance !== ReactLifeCycle.currentlyMountingInstance+    );+  },++  /**+   * Sets a subset of the props.+   *+   * @param {object} partialProps Subset of the next props.+   * @param {?function} callback Called after props are updated.+   * @final+   * @public+   * @deprecated+   */+  setProps: function(partialProps, callback) {+    ReactUpdateQueue.enqueueSetProps(this, partialProps);+    if (callback) {+      ReactUpdateQueue.enqueueCallback(this, callback);+    }+  },++  /**+   * Replace all the props.+   *+   * @param {object} newProps Subset of the next props.+   * @param {?function} callback Called after props are updated.+   * @final+   * @public+   * @deprecated+   */+  replaceProps: function(newProps, callback) {+    ReactUpdateQueue.enqueueReplaceProps(this, newProps);+    if (callback) {+      ReactUpdateQueue.enqueueCallback(this, callback);+    }+  }+};++var ReactClassComponent = function() {};+assign(+  ReactClassComponent.prototype,+  ReactComponent.prototype,+  ReactClassMixin+);++/**+ * Module for creating composite components.+ *+ * @class ReactClass+ */+var ReactClass = {++  /**+   * Creates a composite component class given a class specification.+   *+   * @param {object} spec Class specification (which must define `render`).+   * @return {function} Component constructor function.+   * @public+   */+  createClass: function(spec) {+    var Constructor = function(props, context) {+      // This constructor is overridden by mocks. The argument is used+      // by mocks to assert on what gets mounted.++      if ("production" !== "development") {+        ("production" !== "development" ? warning(+          this instanceof Constructor,+          'Something is calling a React component directly. Use a factory or ' ++          'JSX instead. See: https://fb.me/react-legacyfactory'+        ) : null);+      }++      // Wire up auto-binding+      if (this.__reactAutoBindMap) {+        bindAutoBindMethods(this);+      }++      this.props = props;+      this.context = context;+      this.state = null;++      // ReactClasses doesn't have constructors. Instead, they use the+      // getInitialState and componentWillMount methods for initialization.++      var initialState = this.getInitialState ? this.getInitialState() : null;+      if ("production" !== "development") {+        // We allow auto-mocks to proceed as if they're returning null.+        if (typeof initialState === 'undefined' &&+            this.getInitialState._isMockFunction) {+          // This is probably bad practice. Consider warning here and+          // deprecating this convenience.+          initialState = null;+        }+      }+      ("production" !== "development" ? invariant(+        typeof initialState === 'object' && !Array.isArray(initialState),+        '%s.getInitialState(): must return an object or null',+        Constructor.displayName || 'ReactCompositeComponent'+      ) : invariant(typeof initialState === 'object' && !Array.isArray(initialState)));++      this.state = initialState;+    };+    Constructor.prototype = new ReactClassComponent();+    Constructor.prototype.constructor = Constructor;++    injectedMixins.forEach(+      mixSpecIntoComponent.bind(null, Constructor)+    );++    mixSpecIntoComponent(Constructor, spec);++    // Initialize the defaultProps property after all mixins have been merged+    if (Constructor.getDefaultProps) {+      Constructor.defaultProps = Constructor.getDefaultProps();+    }++    if ("production" !== "development") {+      // This is a tag to indicate that the use of these method names is ok,+      // since it's used with createClass. If it's not, then it's likely a+      // mistake so we'll warn you to use the static property, property+      // initializer or constructor respectively.+      if (Constructor.getDefaultProps) {+        Constructor.getDefaultProps.isReactClassApproved = {};+      }+      if (Constructor.prototype.getInitialState) {+        Constructor.prototype.getInitialState.isReactClassApproved = {};+      }+    }++    ("production" !== "development" ? invariant(+      Constructor.prototype.render,+      'createClass(...): Class specification must implement a `render` method.'+    ) : invariant(Constructor.prototype.render));++    if ("production" !== "development") {+      ("production" !== "development" ? warning(+        !Constructor.prototype.componentShouldUpdate,+        '%s has a method called ' ++        'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' ++        'The name is phrased as a question because the function is ' ++        'expected to return a value.',+        spec.displayName || 'A component'+      ) : null);+    }++    // Reduce time spent doing lookups by setting these on the prototype.+    for (var methodName in ReactClassInterface) {+      if (!Constructor.prototype[methodName]) {+        Constructor.prototype[methodName] = null;+      }+    }++    // Legacy hook+    Constructor.type = Constructor;+    if ("production" !== "development") {+      try {+        Object.defineProperty(Constructor, 'type', typeDeprecationDescriptor);+      } catch (x) {+        // IE will fail on defineProperty (es5-shim/sham too)+      }+    }++    return Constructor;+  },++  injection: {+    injectMixin: function(mixin) {+      injectedMixins.push(mixin);+    }+  }++};++module.exports = ReactClass;++},{"135":135,"140":140,"141":141,"154":154,"27":27,"34":34,"39":39,"57":57,"60":60,"67":67,"68":68,"76":76,"77":77,"86":86}],34:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactComponent+ */++'use strict';++var ReactUpdateQueue = _dereq_(86);++var invariant = _dereq_(135);+var warning = _dereq_(154);++/**+ * Base class helpers for the updating state of a component.+ */+function ReactComponent(props, context) {+  this.props = props;+  this.context = context;+}++/**+ * Sets a subset of the state. Always use this to mutate+ * state. You should treat `this.state` as immutable.+ *+ * There is no guarantee that `this.state` will be immediately updated, so+ * accessing `this.state` after calling this method may return the old value.+ *+ * There is no guarantee that calls to `setState` will run synchronously,+ * as they may eventually be batched together.  You can provide an optional+ * callback that will be executed when the call to setState is actually+ * completed.+ *+ * When a function is provided to setState, it will be called at some point in+ * the future (not synchronously). It will be called with the up to date+ * component arguments (state, props, context). These values can be different+ * from this.* because your function may be called after receiveProps but before+ * shouldComponentUpdate, and this new state, props, and context will not yet be+ * assigned to this.+ *+ * @param {object|function} partialState Next partial state or function to+ *        produce next partial state to be merged with current state.+ * @param {?function} callback Called after state is updated.+ * @final+ * @protected+ */+ReactComponent.prototype.setState = function(partialState, callback) {+  ("production" !== "development" ? invariant(+    typeof partialState === 'object' ||+    typeof partialState === 'function' ||+    partialState == null,+    'setState(...): takes an object of state variables to update or a ' ++    'function which returns an object of state variables.'+  ) : invariant(typeof partialState === 'object' ||+  typeof partialState === 'function' ||+  partialState == null));+  if ("production" !== "development") {+    ("production" !== "development" ? warning(+      partialState != null,+      'setState(...): You passed an undefined or null state object; ' ++      'instead, use forceUpdate().'+    ) : null);+  }+  ReactUpdateQueue.enqueueSetState(this, partialState);+  if (callback) {+    ReactUpdateQueue.enqueueCallback(this, callback);+  }+};++/**+ * Forces an update. This should only be invoked when it is known with+ * certainty that we are **not** in a DOM transaction.+ *+ * You may want to call this when you know that some deeper aspect of the+ * component's state has changed but `setState` was not called.+ *+ * This will not invoke `shouldComponentUpdate`, but it will invoke+ * `componentWillUpdate` and `componentDidUpdate`.+ *+ * @param {?function} callback Called after update is complete.+ * @final+ * @protected+ */+ReactComponent.prototype.forceUpdate = function(callback) {+  ReactUpdateQueue.enqueueForceUpdate(this);+  if (callback) {+    ReactUpdateQueue.enqueueCallback(this, callback);+  }+};++/**+ * Deprecated APIs. These APIs used to exist on classic React classes but since+ * we would like to deprecate them, we're not going to move them over to this+ * modern base class. Instead, we define a getter that warns if it's accessed.+ */+if ("production" !== "development") {+  var deprecatedAPIs = {+    getDOMNode: [+      'getDOMNode',+      'Use React.findDOMNode(component) instead.'+    ],+    isMounted: [+      'isMounted',+      'Instead, make sure to clean up subscriptions and pending requests in ' ++      'componentWillUnmount to prevent memory leaks.'+    ],+    replaceProps: [+      'replaceProps',+      'Instead call React.render again at the top level.'+    ],+    replaceState: [+      'replaceState',+      'Refactor your code to use setState instead (see ' ++      'https://github.com/facebook/react/issues/3236).'+    ],+    setProps: [+      'setProps',+      'Instead call React.render again at the top level.'+    ]+  };+  var defineDeprecationWarning = function(methodName, info) {+    try {+      Object.defineProperty(ReactComponent.prototype, methodName, {+        get: function() {+          ("production" !== "development" ? warning(+            false,+            '%s(...) is deprecated in plain JavaScript React classes. %s',+            info[0],+            info[1]+          ) : null);+          return undefined;+        }+      });+    } catch (x) {+      // IE will fail on defineProperty (es5-shim/sham too)+    }+  };+  for (var fnName in deprecatedAPIs) {+    if (deprecatedAPIs.hasOwnProperty(fnName)) {+      defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);+    }+  }+}++module.exports = ReactComponent;++},{"135":135,"154":154,"86":86}],35:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactComponentBrowserEnvironment+ */++/*jslint evil: true */++'use strict';++var ReactDOMIDOperations = _dereq_(44);+var ReactMount = _dereq_(70);++/**+ * Abstracts away all functionality of the reconciler that requires knowledge of+ * the browser context. TODO: These callers should be refactored to avoid the+ * need for this injection.+ */+var ReactComponentBrowserEnvironment = {++  processChildrenUpdates:+    ReactDOMIDOperations.dangerouslyProcessChildrenUpdates,++  replaceNodeWithMarkupByID:+    ReactDOMIDOperations.dangerouslyReplaceNodeWithMarkupByID,++  /**+   * If a particular environment requires that some resources be cleaned up,+   * specify this in the injected Mixin. In the DOM, we would likely want to+   * purge any cached node ID lookups.+   *+   * @private+   */+  unmountIDFromEnvironment: function(rootNodeID) {+    ReactMount.purgeID(rootNodeID);+  }++};++module.exports = ReactComponentBrowserEnvironment;++},{"44":44,"70":70}],36:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactComponentEnvironment+ */++'use strict';++var invariant = _dereq_(135);++var injected = false;++var ReactComponentEnvironment = {++  /**+   * Optionally injectable environment dependent cleanup hook. (server vs.+   * browser etc). Example: A browser system caches DOM nodes based on component+   * ID and must remove that cache entry when this instance is unmounted.+   */+  unmountIDFromEnvironment: null,++  /**+   * Optionally injectable hook for swapping out mount images in the middle of+   * the tree.+   */+  replaceNodeWithMarkupByID: null,++  /**+   * Optionally injectable hook for processing a queue of child updates. Will+   * later move into MultiChildComponents.+   */+  processChildrenUpdates: null,++  injection: {+    injectEnvironment: function(environment) {+      ("production" !== "development" ? invariant(+        !injected,+        'ReactCompositeComponent: injectEnvironment() can only be called once.'+      ) : invariant(!injected));+      ReactComponentEnvironment.unmountIDFromEnvironment =+        environment.unmountIDFromEnvironment;+      ReactComponentEnvironment.replaceNodeWithMarkupByID =+        environment.replaceNodeWithMarkupByID;+      ReactComponentEnvironment.processChildrenUpdates =+        environment.processChildrenUpdates;+      injected = true;+    }+  }++};++module.exports = ReactComponentEnvironment;++},{"135":135}],37:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactCompositeComponent+ */++'use strict';++var ReactComponentEnvironment = _dereq_(36);+var ReactContext = _dereq_(38);+var ReactCurrentOwner = _dereq_(39);+var ReactElement = _dereq_(57);+var ReactElementValidator = _dereq_(58);+var ReactInstanceMap = _dereq_(67);+var ReactLifeCycle = _dereq_(68);+var ReactNativeComponent = _dereq_(73);+var ReactPerf = _dereq_(75);+var ReactPropTypeLocations = _dereq_(77);+var ReactPropTypeLocationNames = _dereq_(76);+var ReactReconciler = _dereq_(81);+var ReactUpdates = _dereq_(87);++var assign = _dereq_(27);+var emptyObject = _dereq_(115);+var invariant = _dereq_(135);+var shouldUpdateReactComponent = _dereq_(151);+var warning = _dereq_(154);++function getDeclarationErrorAddendum(component) {+  var owner = component._currentElement._owner || null;+  if (owner) {+    var name = owner.getName();+    if (name) {+      return ' Check the render method of `' + name + '`.';+    }+  }+  return '';+}++/**+ * ------------------ The Life-Cycle of a Composite Component ------------------+ *+ * - constructor: Initialization of state. The instance is now retained.+ *   - componentWillMount+ *   - render+ *   - [children's constructors]+ *     - [children's componentWillMount and render]+ *     - [children's componentDidMount]+ *     - componentDidMount+ *+ *       Update Phases:+ *       - componentWillReceiveProps (only called if parent updated)+ *       - shouldComponentUpdate+ *         - componentWillUpdate+ *           - render+ *           - [children's constructors or receive props phases]+ *         - componentDidUpdate+ *+ *     - componentWillUnmount+ *     - [children's componentWillUnmount]+ *   - [children destroyed]+ * - (destroyed): The instance is now blank, released by React and ready for GC.+ *+ * -----------------------------------------------------------------------------+ */++/**+ * An incrementing ID assigned to each component when it is mounted. This is+ * used to enforce the order in which `ReactUpdates` updates dirty components.+ *+ * @private+ */+var nextMountID = 1;++/**+ * @lends {ReactCompositeComponent.prototype}+ */+var ReactCompositeComponentMixin = {++  /**+   * Base constructor for all composite component.+   *+   * @param {ReactElement} element+   * @final+   * @internal+   */+  construct: function(element) {+    this._currentElement = element;+    this._rootNodeID = null;+    this._instance = null;++    // See ReactUpdateQueue+    this._pendingElement = null;+    this._pendingStateQueue = null;+    this._pendingReplaceState = false;+    this._pendingForceUpdate = false;++    this._renderedComponent = null;++    this._context = null;+    this._mountOrder = 0;+    this._isTopLevel = false;++    // See ReactUpdates and ReactUpdateQueue.+    this._pendingCallbacks = null;+  },++  /**+   * Initializes the component, renders markup, and registers event listeners.+   *+   * @param {string} rootID DOM ID of the root node.+   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction+   * @return {?string} Rendered markup to be inserted into the DOM.+   * @final+   * @internal+   */+  mountComponent: function(rootID, transaction, context) {+    this._context = context;+    this._mountOrder = nextMountID++;+    this._rootNodeID = rootID;++    var publicProps = this._processProps(this._currentElement.props);+    var publicContext = this._processContext(this._currentElement._context);++    var Component = ReactNativeComponent.getComponentClassForElement(+      this._currentElement+    );++    // Initialize the public class+    var inst = new Component(publicProps, publicContext);++    if ("production" !== "development") {+      // This will throw later in _renderValidatedComponent, but add an early+      // warning now to help debugging+      ("production" !== "development" ? warning(+        inst.render != null,+        '%s(...): No `render` method found on the returned component ' ++        'instance: you may have forgotten to define `render` in your ' ++        'component or you may have accidentally tried to render an element ' ++        'whose type is a function that isn\'t a React component.',+        Component.displayName || Component.name || 'Component'+      ) : null);+    }++    // These should be set up in the constructor, but as a convenience for+    // simpler class abstractions, we set them up after the fact.+    inst.props = publicProps;+    inst.context = publicContext;+    inst.refs = emptyObject;++    this._instance = inst;++    // Store a reference from the instance back to the internal representation+    ReactInstanceMap.set(inst, this);++    if ("production" !== "development") {+      this._warnIfContextsDiffer(this._currentElement._context, context);+    }++    if ("production" !== "development") {+      // Since plain JS classes are defined without any special initialization+      // logic, we can not catch common errors early. Therefore, we have to+      // catch them here, at initialization time, instead.+      ("production" !== "development" ? warning(+        !inst.getInitialState ||+        inst.getInitialState.isReactClassApproved,+        'getInitialState was defined on %s, a plain JavaScript class. ' ++        'This is only supported for classes created using React.createClass. ' ++        'Did you mean to define a state property instead?',+        this.getName() || 'a component'+      ) : null);+      ("production" !== "development" ? warning(+        !inst.getDefaultProps ||+        inst.getDefaultProps.isReactClassApproved,+        'getDefaultProps was defined on %s, a plain JavaScript class. ' ++        'This is only supported for classes created using React.createClass. ' ++        'Use a static property to define defaultProps instead.',+        this.getName() || 'a component'+      ) : null);+      ("production" !== "development" ? warning(+        !inst.propTypes,+        'propTypes was defined as an instance property on %s. Use a static ' ++        'property to define propTypes instead.',+        this.getName() || 'a component'+      ) : null);+      ("production" !== "development" ? warning(+        !inst.contextTypes,+        'contextTypes was defined as an instance property on %s. Use a ' ++        'static property to define contextTypes instead.',+        this.getName() || 'a component'+      ) : null);+      ("production" !== "development" ? warning(+        typeof inst.componentShouldUpdate !== 'function',+        '%s has a method called ' ++        'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' ++        'The name is phrased as a question because the function is ' ++        'expected to return a value.',+        (this.getName() || 'A component')+      ) : null);+    }++    var initialState = inst.state;+    if (initialState === undefined) {+      inst.state = initialState = null;+    }+    ("production" !== "development" ? invariant(+      typeof initialState === 'object' && !Array.isArray(initialState),+      '%s.state: must be set to an object or null',+      this.getName() || 'ReactCompositeComponent'+    ) : invariant(typeof initialState === 'object' && !Array.isArray(initialState)));++    this._pendingStateQueue = null;+    this._pendingReplaceState = false;+    this._pendingForceUpdate = false;++    var childContext;+    var renderedElement;++    var previouslyMounting = ReactLifeCycle.currentlyMountingInstance;+    ReactLifeCycle.currentlyMountingInstance = this;+    try {+      if (inst.componentWillMount) {+        inst.componentWillMount();+        // When mounting, calls to `setState` by `componentWillMount` will set+        // `this._pendingStateQueue` without triggering a re-render.+        if (this._pendingStateQueue) {+          inst.state = this._processPendingState(inst.props, inst.context);+        }+      }++      childContext = this._getValidatedChildContext(context);+      renderedElement = this._renderValidatedComponent(childContext);+    } finally {+      ReactLifeCycle.currentlyMountingInstance = previouslyMounting;+    }++    this._renderedComponent = this._instantiateReactComponent(+      renderedElement,+      this._currentElement.type // The wrapping type+    );++    var markup = ReactReconciler.mountComponent(+      this._renderedComponent,+      rootID,+      transaction,+      this._mergeChildContext(context, childContext)+    );+    if (inst.componentDidMount) {+      transaction.getReactMountReady().enqueue(inst.componentDidMount, inst);+    }++    return markup;+  },++  /**+   * Releases any resources allocated by `mountComponent`.+   *+   * @final+   * @internal+   */+  unmountComponent: function() {+    var inst = this._instance;++    if (inst.componentWillUnmount) {+      var previouslyUnmounting = ReactLifeCycle.currentlyUnmountingInstance;+      ReactLifeCycle.currentlyUnmountingInstance = this;+      try {+        inst.componentWillUnmount();+      } finally {+        ReactLifeCycle.currentlyUnmountingInstance = previouslyUnmounting;+      }+    }++    ReactReconciler.unmountComponent(this._renderedComponent);+    this._renderedComponent = null;++    // Reset pending fields+    this._pendingStateQueue = null;+    this._pendingReplaceState = false;+    this._pendingForceUpdate = false;+    this._pendingCallbacks = null;+    this._pendingElement = null;++    // These fields do not really need to be reset since this object is no+    // longer accessible.+    this._context = null;+    this._rootNodeID = null;++    // Delete the reference from the instance to this internal representation+    // which allow the internals to be properly cleaned up even if the user+    // leaks a reference to the public instance.+    ReactInstanceMap.remove(inst);++    // Some existing components rely on inst.props even after they've been+    // destroyed (in event handlers).+    // TODO: inst.props = null;+    // TODO: inst.state = null;+    // TODO: inst.context = null;+  },++  /**+   * Schedule a partial update to the props. Only used for internal testing.+   *+   * @param {object} partialProps Subset of the next props.+   * @param {?function} callback Called after props are updated.+   * @final+   * @internal+   */+  _setPropsInternal: function(partialProps, callback) {+    // This is a deoptimized path. We optimize for always having an element.+    // This creates an extra internal element.+    var element = this._pendingElement || this._currentElement;+    this._pendingElement = ReactElement.cloneAndReplaceProps(+      element,+      assign({}, element.props, partialProps)+    );+    ReactUpdates.enqueueUpdate(this, callback);+  },++  /**+   * Filters the context object to only contain keys specified in+   * `contextTypes`+   *+   * @param {object} context+   * @return {?object}+   * @private+   */+  _maskContext: function(context) {+    var maskedContext = null;+    // This really should be getting the component class for the element,+    // but we know that we're not going to need it for built-ins.+    if (typeof this._currentElement.type === 'string') {+      return emptyObject;+    }+    var contextTypes = this._currentElement.type.contextTypes;+    if (!contextTypes) {+      return emptyObject;+    }+    maskedContext = {};+    for (var contextName in contextTypes) {+      maskedContext[contextName] = context[contextName];+    }+    return maskedContext;+  },++  /**+   * Filters the context object to only contain keys specified in+   * `contextTypes`, and asserts that they are valid.+   *+   * @param {object} context+   * @return {?object}+   * @private+   */+  _processContext: function(context) {+    var maskedContext = this._maskContext(context);+    if ("production" !== "development") {+      var Component = ReactNativeComponent.getComponentClassForElement(+        this._currentElement+      );+      if (Component.contextTypes) {+        this._checkPropTypes(+          Component.contextTypes,+          maskedContext,+          ReactPropTypeLocations.context+        );+      }+    }+    return maskedContext;+  },++  /**+   * @param {object} currentContext+   * @return {object}+   * @private+   */+  _getValidatedChildContext: function(currentContext) {+    var inst = this._instance;+    var childContext = inst.getChildContext && inst.getChildContext();+    if (childContext) {+      ("production" !== "development" ? invariant(+        typeof inst.constructor.childContextTypes === 'object',+        '%s.getChildContext(): childContextTypes must be defined in order to ' ++        'use getChildContext().',+        this.getName() || 'ReactCompositeComponent'+      ) : invariant(typeof inst.constructor.childContextTypes === 'object'));+      if ("production" !== "development") {+        this._checkPropTypes(+          inst.constructor.childContextTypes,+          childContext,+          ReactPropTypeLocations.childContext+        );+      }+      for (var name in childContext) {+        ("production" !== "development" ? invariant(+          name in inst.constructor.childContextTypes,+          '%s.getChildContext(): key "%s" is not defined in childContextTypes.',+          this.getName() || 'ReactCompositeComponent',+          name+        ) : invariant(name in inst.constructor.childContextTypes));+      }+      return childContext;+    }+    return null;+  },++  _mergeChildContext: function(currentContext, childContext) {+    if (childContext) {+      return assign({}, currentContext, childContext);+    }+    return currentContext;+  },++  /**+   * Processes props by setting default values for unspecified props and+   * asserting that the props are valid. Does not mutate its argument; returns+   * a new props object with defaults merged in.+   *+   * @param {object} newProps+   * @return {object}+   * @private+   */+  _processProps: function(newProps) {+    if ("production" !== "development") {+      var Component = ReactNativeComponent.getComponentClassForElement(+        this._currentElement+      );+      if (Component.propTypes) {+        this._checkPropTypes(+          Component.propTypes,+          newProps,+          ReactPropTypeLocations.prop+        );+      }+    }+    return newProps;+  },++  /**+   * Assert that the props are valid+   *+   * @param {object} propTypes Map of prop name to a ReactPropType+   * @param {object} props+   * @param {string} location e.g. "prop", "context", "child context"+   * @private+   */+  _checkPropTypes: function(propTypes, props, location) {+    // TODO: Stop validating prop types here and only use the element+    // validation.+    var componentName = this.getName();+    for (var propName in propTypes) {+      if (propTypes.hasOwnProperty(propName)) {+        var error;+        try {+          // This is intentionally an invariant that gets caught. It's the same+          // behavior as without this statement except with a better message.+          ("production" !== "development" ? invariant(+            typeof propTypes[propName] === 'function',+            '%s: %s type `%s` is invalid; it must be a function, usually ' ++            'from React.PropTypes.',+            componentName || 'React class',+            ReactPropTypeLocationNames[location],+            propName+          ) : invariant(typeof propTypes[propName] === 'function'));+          error = propTypes[propName](props, propName, componentName, location);+        } catch (ex) {+          error = ex;+        }+        if (error instanceof Error) {+          // We may want to extend this logic for similar errors in+          // React.render calls, so I'm abstracting it away into+          // a function to minimize refactoring in the future+          var addendum = getDeclarationErrorAddendum(this);++          if (location === ReactPropTypeLocations.prop) {+            // Preface gives us something to blacklist in warning module+            ("production" !== "development" ? warning(+              false,+              'Failed Composite propType: %s%s',+              error.message,+              addendum+            ) : null);+          } else {+            ("production" !== "development" ? warning(+              false,+              'Failed Context Types: %s%s',+              error.message,+              addendum+            ) : null);+          }+        }+      }+    }+  },++  receiveComponent: function(nextElement, transaction, nextContext) {+    var prevElement = this._currentElement;+    var prevContext = this._context;++    this._pendingElement = null;++    this.updateComponent(+      transaction,+      prevElement,+      nextElement,+      prevContext,+      nextContext+    );+  },++  /**+   * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate`+   * is set, update the component.+   *+   * @param {ReactReconcileTransaction} transaction+   * @internal+   */+  performUpdateIfNecessary: function(transaction) {+    if (this._pendingElement != null) {+      ReactReconciler.receiveComponent(+        this,+        this._pendingElement || this._currentElement,+        transaction,+        this._context+      );+    }++    if (this._pendingStateQueue !== null || this._pendingForceUpdate) {+      if ("production" !== "development") {+        ReactElementValidator.checkAndWarnForMutatedProps(+          this._currentElement+        );+      }++      this.updateComponent(+        transaction,+        this._currentElement,+        this._currentElement,+        this._context,+        this._context+      );+    }+  },++  /**+   * Compare two contexts, warning if they are different+   * TODO: Remove this check when owner-context is removed+   */+   _warnIfContextsDiffer: function(ownerBasedContext, parentBasedContext) {+    ownerBasedContext = this._maskContext(ownerBasedContext);+    parentBasedContext = this._maskContext(parentBasedContext);+    var parentKeys = Object.keys(parentBasedContext).sort();+    var displayName = this.getName() || 'ReactCompositeComponent';+    for (var i = 0; i < parentKeys.length; i++) {+      var key = parentKeys[i];+      ("production" !== "development" ? warning(+        ownerBasedContext[key] === parentBasedContext[key],+        'owner-based and parent-based contexts differ '  ++        '(values: `%s` vs `%s`) for key (%s) while mounting %s ' ++        '(see: http://fb.me/react-context-by-parent)',+        ownerBasedContext[key],+        parentBasedContext[key],+        key,+        displayName+      ) : null);+    }+  },++  /**+   * Perform an update to a mounted component. The componentWillReceiveProps and+   * shouldComponentUpdate methods are called, then (assuming the update isn't+   * skipped) the remaining update lifecycle methods are called and the DOM+   * representation is updated.+   *+   * By default, this implements React's rendering and reconciliation algorithm.+   * Sophisticated clients may wish to override this.+   *+   * @param {ReactReconcileTransaction} transaction+   * @param {ReactElement} prevParentElement+   * @param {ReactElement} nextParentElement+   * @internal+   * @overridable+   */+  updateComponent: function(+    transaction,+    prevParentElement,+    nextParentElement,+    prevUnmaskedContext,+    nextUnmaskedContext+  ) {+    var inst = this._instance;++    var nextContext = inst.context;+    var nextProps = inst.props;++    // Distinguish between a props update versus a simple state update+    if (prevParentElement !== nextParentElement) {+      nextContext = this._processContext(nextParentElement._context);+      nextProps = this._processProps(nextParentElement.props);++      if ("production" !== "development") {+        if (nextUnmaskedContext != null) {+          this._warnIfContextsDiffer(+            nextParentElement._context,+            nextUnmaskedContext+          );+        }+      }++      // An update here will schedule an update but immediately set+      // _pendingStateQueue which will ensure that any state updates gets+      // immediately reconciled instead of waiting for the next batch.++      if (inst.componentWillReceiveProps) {+        inst.componentWillReceiveProps(nextProps, nextContext);+      }+    }++    var nextState = this._processPendingState(nextProps, nextContext);++    var shouldUpdate =+      this._pendingForceUpdate ||+      !inst.shouldComponentUpdate ||+      inst.shouldComponentUpdate(nextProps, nextState, nextContext);++    if ("production" !== "development") {+      ("production" !== "development" ? warning(+        typeof shouldUpdate !== 'undefined',+        '%s.shouldComponentUpdate(): Returned undefined instead of a ' ++        'boolean value. Make sure to return true or false.',+        this.getName() || 'ReactCompositeComponent'+      ) : null);+    }++    if (shouldUpdate) {+      this._pendingForceUpdate = false;+      // Will set `this.props`, `this.state` and `this.context`.+      this._performComponentUpdate(+        nextParentElement,+        nextProps,+        nextState,+        nextContext,+        transaction,+        nextUnmaskedContext+      );+    } else {+      // If it's determined that a component should not update, we still want+      // to set props and state but we shortcut the rest of the update.+      this._currentElement = nextParentElement;+      this._context = nextUnmaskedContext;+      inst.props = nextProps;+      inst.state = nextState;+      inst.context = nextContext;+    }+  },++  _processPendingState: function(props, context) {+    var inst = this._instance;+    var queue = this._pendingStateQueue;+    var replace = this._pendingReplaceState;+    this._pendingReplaceState = false;+    this._pendingStateQueue = null;++    if (!queue) {+      return inst.state;+    }++    if (replace && queue.length === 1) {+      return queue[0];+    }++    var nextState = assign({}, replace ? queue[0] : inst.state);+    for (var i = replace ? 1 : 0; i < queue.length; i++) {+      var partial = queue[i];+      assign(+        nextState,+        typeof partial === 'function' ?+          partial.call(inst, nextState, props, context) :+          partial+      );+    }++    return nextState;+  },++  /**+   * Merges new props and state, notifies delegate methods of update and+   * performs update.+   *+   * @param {ReactElement} nextElement Next element+   * @param {object} nextProps Next public object to set as properties.+   * @param {?object} nextState Next object to set as state.+   * @param {?object} nextContext Next public object to set as context.+   * @param {ReactReconcileTransaction} transaction+   * @param {?object} unmaskedContext+   * @private+   */+  _performComponentUpdate: function(+    nextElement,+    nextProps,+    nextState,+    nextContext,+    transaction,+    unmaskedContext+  ) {+    var inst = this._instance;++    var prevProps = inst.props;+    var prevState = inst.state;+    var prevContext = inst.context;++    if (inst.componentWillUpdate) {+      inst.componentWillUpdate(nextProps, nextState, nextContext);+    }++    this._currentElement = nextElement;+    this._context = unmaskedContext;+    inst.props = nextProps;+    inst.state = nextState;+    inst.context = nextContext;++    this._updateRenderedComponent(transaction, unmaskedContext);++    if (inst.componentDidUpdate) {+      transaction.getReactMountReady().enqueue(+        inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext),+        inst+      );+    }+  },++  /**+   * Call the component's `render` method and update the DOM accordingly.+   *+   * @param {ReactReconcileTransaction} transaction+   * @internal+   */+  _updateRenderedComponent: function(transaction, context) {+    var prevComponentInstance = this._renderedComponent;+    var prevRenderedElement = prevComponentInstance._currentElement;+    var childContext = this._getValidatedChildContext();+    var nextRenderedElement = this._renderValidatedComponent(childContext);+    if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) {+      ReactReconciler.receiveComponent(+        prevComponentInstance,+        nextRenderedElement,+        transaction,+        this._mergeChildContext(context, childContext)+      );+    } else {+      // These two IDs are actually the same! But nothing should rely on that.+      var thisID = this._rootNodeID;+      var prevComponentID = prevComponentInstance._rootNodeID;+      ReactReconciler.unmountComponent(prevComponentInstance);++      this._renderedComponent = this._instantiateReactComponent(+        nextRenderedElement,+        this._currentElement.type+      );+      var nextMarkup = ReactReconciler.mountComponent(+        this._renderedComponent,+        thisID,+        transaction,+        this._mergeChildContext(context, childContext)+      );+      this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup);+    }+  },++  /**+   * @protected+   */+  _replaceNodeWithMarkupByID: function(prevComponentID, nextMarkup) {+    ReactComponentEnvironment.replaceNodeWithMarkupByID(+      prevComponentID,+      nextMarkup+    );+  },++  /**+   * @protected+   */+  _renderValidatedComponentWithoutOwnerOrContext: function() {+    var inst = this._instance;+    var renderedComponent = inst.render();+    if ("production" !== "development") {+      // We allow auto-mocks to proceed as if they're returning null.+      if (typeof renderedComponent === 'undefined' &&+          inst.render._isMockFunction) {+        // This is probably bad practice. Consider warning here and+        // deprecating this convenience.+        renderedComponent = null;+      }+    }++    return renderedComponent;+  },++  /**+   * @private+   */+  _renderValidatedComponent: function(childContext) {+    var renderedComponent;+    var previousContext = ReactContext.current;+    ReactContext.current = this._mergeChildContext(+      this._currentElement._context,+      childContext+    );+    ReactCurrentOwner.current = this;+    try {+      renderedComponent =+        this._renderValidatedComponentWithoutOwnerOrContext();+    } finally {+      ReactContext.current = previousContext;+      ReactCurrentOwner.current = null;+    }+    ("production" !== "development" ? invariant(+      // TODO: An `isValidNode` function would probably be more appropriate+      renderedComponent === null || renderedComponent === false ||+      ReactElement.isValidElement(renderedComponent),+      '%s.render(): A valid ReactComponent must be returned. You may have ' ++        'returned undefined, an array or some other invalid object.',+      this.getName() || 'ReactCompositeComponent'+    ) : invariant(// TODO: An `isValidNode` function would probably be more appropriate+    renderedComponent === null || renderedComponent === false ||+    ReactElement.isValidElement(renderedComponent)));+    return renderedComponent;+  },++  /**+   * Lazily allocates the refs object and stores `component` as `ref`.+   *+   * @param {string} ref Reference name.+   * @param {component} component Component to store as `ref`.+   * @final+   * @private+   */+  attachRef: function(ref, component) {+    var inst = this.getPublicInstance();+    var refs = inst.refs === emptyObject ? (inst.refs = {}) : inst.refs;+    refs[ref] = component.getPublicInstance();+  },++  /**+   * Detaches a reference name.+   *+   * @param {string} ref Name to dereference.+   * @final+   * @private+   */+  detachRef: function(ref) {+    var refs = this.getPublicInstance().refs;+    delete refs[ref];+  },++  /**+   * Get a text description of the component that can be used to identify it+   * in error messages.+   * @return {string} The name or null.+   * @internal+   */+  getName: function() {+    var type = this._currentElement.type;+    var constructor = this._instance && this._instance.constructor;+    return (+      type.displayName || (constructor && constructor.displayName) ||+      type.name || (constructor && constructor.name) ||+      null+    );+  },++  /**+   * Get the publicly accessible representation of this component - i.e. what+   * is exposed by refs and returned by React.render. Can be null for stateless+   * components.+   *+   * @return {ReactComponent} the public component instance.+   * @internal+   */+  getPublicInstance: function() {+    return this._instance;+  },++  // Stub+  _instantiateReactComponent: null++};++ReactPerf.measureMethods(+  ReactCompositeComponentMixin,+  'ReactCompositeComponent',+  {+    mountComponent: 'mountComponent',+    updateComponent: 'updateComponent',+    _renderValidatedComponent: '_renderValidatedComponent'+  }+);++var ReactCompositeComponent = {++  Mixin: ReactCompositeComponentMixin++};++module.exports = ReactCompositeComponent;++},{"115":115,"135":135,"151":151,"154":154,"27":27,"36":36,"38":38,"39":39,"57":57,"58":58,"67":67,"68":68,"73":73,"75":75,"76":76,"77":77,"81":81,"87":87}],38:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactContext+ */++'use strict';++var assign = _dereq_(27);+var emptyObject = _dereq_(115);+var warning = _dereq_(154);++var didWarn = false;++/**+ * Keeps track of the current context.+ *+ * The context is automatically passed down the component ownership hierarchy+ * and is accessible via `this.context` on ReactCompositeComponents.+ */+var ReactContext = {++  /**+   * @internal+   * @type {object}+   */+  current: emptyObject,++  /**+   * Temporarily extends the current context while executing scopedCallback.+   *+   * A typical use case might look like+   *+   *  render: function() {+   *    var children = ReactContext.withContext({foo: 'foo'}, () => (+   *+   *    ));+   *    return <div>{children}</div>;+   *  }+   *+   * @param {object} newContext New context to merge into the existing context+   * @param {function} scopedCallback Callback to run with the new context+   * @return {ReactComponent|array<ReactComponent>}+   */+  withContext: function(newContext, scopedCallback) {+    if ("production" !== "development") {+      ("production" !== "development" ? warning(+        didWarn,+        'withContext is deprecated and will be removed in a future version. ' ++        'Use a wrapper component with getChildContext instead.'+      ) : null);++      didWarn = true;+    }++    var result;+    var previousContext = ReactContext.current;+    ReactContext.current = assign({}, previousContext, newContext);+    try {+      result = scopedCallback();+    } finally {+      ReactContext.current = previousContext;+    }+    return result;+  }++};++module.exports = ReactContext;++},{"115":115,"154":154,"27":27}],39:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactCurrentOwner+ */++'use strict';++/**+ * Keeps track of the current owner.+ *+ * The current owner is the component who should own any components that are+ * currently being constructed.+ *+ * The depth indicate how many composite components are above this render level.+ */+var ReactCurrentOwner = {++  /**+   * @internal+   * @type {ReactComponent}+   */+  current: null++};++module.exports = ReactCurrentOwner;++},{}],40:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOM+ * @typechecks static-only+ */++'use strict';++var ReactElement = _dereq_(57);+var ReactElementValidator = _dereq_(58);++var mapObject = _dereq_(142);++/**+ * Create a factory that creates HTML tag elements.+ *+ * @param {string} tag Tag name (e.g. `div`).+ * @private+ */+function createDOMFactory(tag) {+  if ("production" !== "development") {+    return ReactElementValidator.createFactory(tag);+  }+  return ReactElement.createFactory(tag);+}++/**+ * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.+ * This is also accessible via `React.DOM`.+ *+ * @public+ */+var ReactDOM = mapObject({+  a: 'a',+  abbr: 'abbr',+  address: 'address',+  area: 'area',+  article: 'article',+  aside: 'aside',+  audio: 'audio',+  b: 'b',+  base: 'base',+  bdi: 'bdi',+  bdo: 'bdo',+  big: 'big',+  blockquote: 'blockquote',+  body: 'body',+  br: 'br',+  button: 'button',+  canvas: 'canvas',+  caption: 'caption',+  cite: 'cite',+  code: 'code',+  col: 'col',+  colgroup: 'colgroup',+  data: 'data',+  datalist: 'datalist',+  dd: 'dd',+  del: 'del',+  details: 'details',+  dfn: 'dfn',+  dialog: 'dialog',+  div: 'div',+  dl: 'dl',+  dt: 'dt',+  em: 'em',+  embed: 'embed',+  fieldset: 'fieldset',+  figcaption: 'figcaption',+  figure: 'figure',+  footer: 'footer',+  form: 'form',+  h1: 'h1',+  h2: 'h2',+  h3: 'h3',+  h4: 'h4',+  h5: 'h5',+  h6: 'h6',+  head: 'head',+  header: 'header',+  hr: 'hr',+  html: 'html',+  i: 'i',+  iframe: 'iframe',+  img: 'img',+  input: 'input',+  ins: 'ins',+  kbd: 'kbd',+  keygen: 'keygen',+  label: 'label',+  legend: 'legend',+  li: 'li',+  link: 'link',+  main: 'main',+  map: 'map',+  mark: 'mark',+  menu: 'menu',+  menuitem: 'menuitem',+  meta: 'meta',+  meter: 'meter',+  nav: 'nav',+  noscript: 'noscript',+  object: 'object',+  ol: 'ol',+  optgroup: 'optgroup',+  option: 'option',+  output: 'output',+  p: 'p',+  param: 'param',+  picture: 'picture',+  pre: 'pre',+  progress: 'progress',+  q: 'q',+  rp: 'rp',+  rt: 'rt',+  ruby: 'ruby',+  s: 's',+  samp: 'samp',+  script: 'script',+  section: 'section',+  select: 'select',+  small: 'small',+  source: 'source',+  span: 'span',+  strong: 'strong',+  style: 'style',+  sub: 'sub',+  summary: 'summary',+  sup: 'sup',+  table: 'table',+  tbody: 'tbody',+  td: 'td',+  textarea: 'textarea',+  tfoot: 'tfoot',+  th: 'th',+  thead: 'thead',+  time: 'time',+  title: 'title',+  tr: 'tr',+  track: 'track',+  u: 'u',+  ul: 'ul',+  'var': 'var',+  video: 'video',+  wbr: 'wbr',++  // SVG+  circle: 'circle',+  clipPath: 'clipPath',+  defs: 'defs',+  ellipse: 'ellipse',+  g: 'g',+  line: 'line',+  linearGradient: 'linearGradient',+  mask: 'mask',+  path: 'path',+  pattern: 'pattern',+  polygon: 'polygon',+  polyline: 'polyline',+  radialGradient: 'radialGradient',+  rect: 'rect',+  stop: 'stop',+  svg: 'svg',+  text: 'text',+  tspan: 'tspan'++}, createDOMFactory);++module.exports = ReactDOM;++},{"142":142,"57":57,"58":58}],41:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMButton+ */++'use strict';++var AutoFocusMixin = _dereq_(2);+var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);++var keyMirror = _dereq_(140);++var button = ReactElement.createFactory('button');++var mouseListenerNames = keyMirror({+  onClick: true,+  onDoubleClick: true,+  onMouseDown: true,+  onMouseMove: true,+  onMouseUp: true,+  onClickCapture: true,+  onDoubleClickCapture: true,+  onMouseDownCapture: true,+  onMouseMoveCapture: true,+  onMouseUpCapture: true+});++/**+ * Implements a <button> native component that does not receive mouse events+ * when `disabled` is set.+ */+var ReactDOMButton = ReactClass.createClass({+  displayName: 'ReactDOMButton',+  tagName: 'BUTTON',++  mixins: [AutoFocusMixin, ReactBrowserComponentMixin],++  render: function() {+    var props = {};++    // Copy the props; except the mouse listeners if we're disabled+    for (var key in this.props) {+      if (this.props.hasOwnProperty(key) &&+          (!this.props.disabled || !mouseListenerNames[key])) {+        props[key] = this.props[key];+      }+    }++    return button(props, this.props.children);+  }++});++module.exports = ReactDOMButton;++},{"140":140,"2":2,"29":29,"33":33,"57":57}],42:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMComponent+ * @typechecks static-only+ */++/* global hasOwnProperty:true */++'use strict';++var CSSPropertyOperations = _dereq_(5);+var DOMProperty = _dereq_(10);+var DOMPropertyOperations = _dereq_(11);+var ReactBrowserEventEmitter = _dereq_(30);+var ReactComponentBrowserEnvironment =+  _dereq_(35);+var ReactMount = _dereq_(70);+var ReactMultiChild = _dereq_(71);+var ReactPerf = _dereq_(75);++var assign = _dereq_(27);+var escapeTextContentForBrowser = _dereq_(116);+var invariant = _dereq_(135);+var isEventSupported = _dereq_(136);+var keyOf = _dereq_(141);+var warning = _dereq_(154);++var deleteListener = ReactBrowserEventEmitter.deleteListener;+var listenTo = ReactBrowserEventEmitter.listenTo;+var registrationNameModules = ReactBrowserEventEmitter.registrationNameModules;++// For quickly matching children type, to test if can be treated as content.+var CONTENT_TYPES = {'string': true, 'number': true};++var STYLE = keyOf({style: null});++var ELEMENT_NODE_TYPE = 1;++/**+ * Optionally injectable operations for mutating the DOM+ */+var BackendIDOperations = null;++/**+ * @param {?object} props+ */+function assertValidProps(props) {+  if (!props) {+    return;+  }+  // Note the use of `==` which checks for null or undefined.+  if (props.dangerouslySetInnerHTML != null) {+    ("production" !== "development" ? invariant(+      props.children == null,+      'Can only set one of `children` or `props.dangerouslySetInnerHTML`.'+    ) : invariant(props.children == null));+    ("production" !== "development" ? invariant(+      typeof props.dangerouslySetInnerHTML === 'object' &&+      '__html' in props.dangerouslySetInnerHTML,+      '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' ++      'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' ++      'for more information.'+    ) : invariant(typeof props.dangerouslySetInnerHTML === 'object' &&+    '__html' in props.dangerouslySetInnerHTML));+  }+  if ("production" !== "development") {+    ("production" !== "development" ? warning(+      props.innerHTML == null,+      'Directly setting property `innerHTML` is not permitted. ' ++      'For more information, lookup documentation on `dangerouslySetInnerHTML`.'+    ) : null);+    ("production" !== "development" ? warning(+      !props.contentEditable || props.children == null,+      'A component is `contentEditable` and contains `children` managed by ' ++      'React. It is now your responsibility to guarantee that none of ' ++      'those nodes are unexpectedly modified or duplicated. This is ' ++      'probably not intentional.'+    ) : null);+  }+  ("production" !== "development" ? invariant(+    props.style == null || typeof props.style === 'object',+    'The `style` prop expects a mapping from style properties to values, ' ++    'not a string. For example, style={{marginRight: spacing + \'em\'}} when ' ++    'using JSX.'+  ) : invariant(props.style == null || typeof props.style === 'object'));+}++function putListener(id, registrationName, listener, transaction) {+  if ("production" !== "development") {+    // IE8 has no API for event capturing and the `onScroll` event doesn't+    // bubble.+    ("production" !== "development" ? warning(+      registrationName !== 'onScroll' || isEventSupported('scroll', true),+      'This browser doesn\'t support the `onScroll` event'+    ) : null);+  }+  var container = ReactMount.findReactContainerForID(id);+  if (container) {+    var doc = container.nodeType === ELEMENT_NODE_TYPE ?+      container.ownerDocument :+      container;+    listenTo(registrationName, doc);+  }+  transaction.getPutListenerQueue().enqueuePutListener(+    id,+    registrationName,+    listener+  );+}++// For HTML, certain tags should omit their close tag. We keep a whitelist for+// those special cased tags.++var omittedCloseTags = {+  'area': true,+  'base': true,+  'br': true,+  'col': true,+  'embed': true,+  'hr': true,+  'img': true,+  'input': true,+  'keygen': true,+  'link': true,+  'meta': true,+  'param': true,+  'source': true,+  'track': true,+  'wbr': true+  // NOTE: menuitem's close tag should be omitted, but that causes problems.+};++// We accept any tag to be rendered but since this gets injected into abitrary+// HTML, we want to make sure that it's a safe tag.+// http://www.w3.org/TR/REC-xml/#NT-Name++var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset+var validatedTagCache = {};+var hasOwnProperty = {}.hasOwnProperty;++function validateDangerousTag(tag) {+  if (!hasOwnProperty.call(validatedTagCache, tag)) {+    ("production" !== "development" ? invariant(VALID_TAG_REGEX.test(tag), 'Invalid tag: %s', tag) : invariant(VALID_TAG_REGEX.test(tag)));+    validatedTagCache[tag] = true;+  }+}++/**+ * Creates a new React class that is idempotent and capable of containing other+ * React components. It accepts event listeners and DOM properties that are+ * valid according to `DOMProperty`.+ *+ *  - Event listeners: `onClick`, `onMouseDown`, etc.+ *  - DOM properties: `className`, `name`, `title`, etc.+ *+ * The `style` property functions differently from the DOM API. It accepts an+ * object mapping of style properties to values.+ *+ * @constructor ReactDOMComponent+ * @extends ReactMultiChild+ */+function ReactDOMComponent(tag) {+  validateDangerousTag(tag);+  this._tag = tag;+  this._renderedChildren = null;+  this._previousStyleCopy = null;+  this._rootNodeID = null;+}++ReactDOMComponent.displayName = 'ReactDOMComponent';++ReactDOMComponent.Mixin = {++  construct: function(element) {+    this._currentElement = element;+  },++  /**+   * Generates root tag markup then recurses. This method has side effects and+   * is not idempotent.+   *+   * @internal+   * @param {string} rootID The root DOM ID for this node.+   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction+   * @return {string} The computed markup.+   */+  mountComponent: function(rootID, transaction, context) {+    this._rootNodeID = rootID;+    assertValidProps(this._currentElement.props);+    var closeTag = omittedCloseTags[this._tag] ? '' : '</' + this._tag + '>';+    return (+      this._createOpenTagMarkupAndPutListeners(transaction) ++      this._createContentMarkup(transaction, context) ++      closeTag+    );+  },++  /**+   * Creates markup for the open tag and all attributes.+   *+   * This method has side effects because events get registered.+   *+   * Iterating over object properties is faster than iterating over arrays.+   * @see http://jsperf.com/obj-vs-arr-iteration+   *+   * @private+   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction+   * @return {string} Markup of opening tag.+   */+  _createOpenTagMarkupAndPutListeners: function(transaction) {+    var props = this._currentElement.props;+    var ret = '<' + this._tag;++    for (var propKey in props) {+      if (!props.hasOwnProperty(propKey)) {+        continue;+      }+      var propValue = props[propKey];+      if (propValue == null) {+        continue;+      }+      if (registrationNameModules.hasOwnProperty(propKey)) {+        putListener(this._rootNodeID, propKey, propValue, transaction);+      } else {+        if (propKey === STYLE) {+          if (propValue) {+            propValue = this._previousStyleCopy = assign({}, props.style);+          }+          propValue = CSSPropertyOperations.createMarkupForStyles(propValue);+        }+        var markup =+          DOMPropertyOperations.createMarkupForProperty(propKey, propValue);+        if (markup) {+          ret += ' ' + markup;+        }+      }+    }++    // For static pages, no need to put React ID and checksum. Saves lots of+    // bytes.+    if (transaction.renderToStaticMarkup) {+      return ret + '>';+    }++    var markupForID = DOMPropertyOperations.createMarkupForID(this._rootNodeID);+    return ret + ' ' + markupForID + '>';+  },++  /**+   * Creates markup for the content between the tags.+   *+   * @private+   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction+   * @param {object} context+   * @return {string} Content markup.+   */+  _createContentMarkup: function(transaction, context) {+    var prefix = '';+    if (this._tag === 'listing' ||+        this._tag === 'pre' ||+        this._tag === 'textarea') {+      // Add an initial newline because browsers ignore the first newline in+      // a <listing>, <pre>, or <textarea> as an "authoring convenience" -- see+      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody.+      prefix = '\n';+    }++    var props = this._currentElement.props;++    // Intentional use of != to avoid catching zero/false.+    var innerHTML = props.dangerouslySetInnerHTML;+    if (innerHTML != null) {+      if (innerHTML.__html != null) {+        return prefix + innerHTML.__html;+      }+    } else {+      var contentToUse =+        CONTENT_TYPES[typeof props.children] ? props.children : null;+      var childrenToUse = contentToUse != null ? null : props.children;+      if (contentToUse != null) {+        return prefix + escapeTextContentForBrowser(contentToUse);+      } else if (childrenToUse != null) {+        var mountImages = this.mountChildren(+          childrenToUse,+          transaction,+          context+        );+        return prefix + mountImages.join('');+      }+    }+    return prefix;+  },++  receiveComponent: function(nextElement, transaction, context) {+    var prevElement = this._currentElement;+    this._currentElement = nextElement;+    this.updateComponent(transaction, prevElement, nextElement, context);+  },++  /**+   * Updates a native DOM component after it has already been allocated and+   * attached to the DOM. Reconciles the root DOM node, then recurses.+   *+   * @param {ReactReconcileTransaction} transaction+   * @param {ReactElement} prevElement+   * @param {ReactElement} nextElement+   * @internal+   * @overridable+   */+  updateComponent: function(transaction, prevElement, nextElement, context) {+    assertValidProps(this._currentElement.props);+    this._updateDOMProperties(prevElement.props, transaction);+    this._updateDOMChildren(prevElement.props, transaction, context);+  },++  /**+   * Reconciles the properties by detecting differences in property values and+   * updating the DOM as necessary. This function is probably the single most+   * critical path for performance optimization.+   *+   * TODO: Benchmark whether checking for changed values in memory actually+   *       improves performance (especially statically positioned elements).+   * TODO: Benchmark the effects of putting this at the top since 99% of props+   *       do not change for a given reconciliation.+   * TODO: Benchmark areas that can be improved with caching.+   *+   * @private+   * @param {object} lastProps+   * @param {ReactReconcileTransaction} transaction+   */+  _updateDOMProperties: function(lastProps, transaction) {+    var nextProps = this._currentElement.props;+    var propKey;+    var styleName;+    var styleUpdates;+    for (propKey in lastProps) {+      if (nextProps.hasOwnProperty(propKey) ||+         !lastProps.hasOwnProperty(propKey)) {+        continue;+      }+      if (propKey === STYLE) {+        var lastStyle = this._previousStyleCopy;+        for (styleName in lastStyle) {+          if (lastStyle.hasOwnProperty(styleName)) {+            styleUpdates = styleUpdates || {};+            styleUpdates[styleName] = '';+          }+        }+        this._previousStyleCopy = null;+      } else if (registrationNameModules.hasOwnProperty(propKey)) {+        deleteListener(this._rootNodeID, propKey);+      } else if (+          DOMProperty.isStandardName[propKey] ||+          DOMProperty.isCustomAttribute(propKey)) {+        BackendIDOperations.deletePropertyByID(+          this._rootNodeID,+          propKey+        );+      }+    }+    for (propKey in nextProps) {+      var nextProp = nextProps[propKey];+      var lastProp = propKey === STYLE ?+        this._previousStyleCopy :+        lastProps[propKey];+      if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) {+        continue;+      }+      if (propKey === STYLE) {+        if (nextProp) {+          nextProp = this._previousStyleCopy = assign({}, nextProp);+        } else {+          this._previousStyleCopy = null;+        }+        if (lastProp) {+          // Unset styles on `lastProp` but not on `nextProp`.+          for (styleName in lastProp) {+            if (lastProp.hasOwnProperty(styleName) &&+                (!nextProp || !nextProp.hasOwnProperty(styleName))) {+              styleUpdates = styleUpdates || {};+              styleUpdates[styleName] = '';+            }+          }+          // Update styles that changed since `lastProp`.+          for (styleName in nextProp) {+            if (nextProp.hasOwnProperty(styleName) &&+                lastProp[styleName] !== nextProp[styleName]) {+              styleUpdates = styleUpdates || {};+              styleUpdates[styleName] = nextProp[styleName];+            }+          }+        } else {+          // Relies on `updateStylesByID` not mutating `styleUpdates`.+          styleUpdates = nextProp;+        }+      } else if (registrationNameModules.hasOwnProperty(propKey)) {+        putListener(this._rootNodeID, propKey, nextProp, transaction);+      } else if (+          DOMProperty.isStandardName[propKey] ||+          DOMProperty.isCustomAttribute(propKey)) {+        BackendIDOperations.updatePropertyByID(+          this._rootNodeID,+          propKey,+          nextProp+        );+      }+    }+    if (styleUpdates) {+      BackendIDOperations.updateStylesByID(+        this._rootNodeID,+        styleUpdates+      );+    }+  },++  /**+   * Reconciles the children with the various properties that affect the+   * children content.+   *+   * @param {object} lastProps+   * @param {ReactReconcileTransaction} transaction+   */+  _updateDOMChildren: function(lastProps, transaction, context) {+    var nextProps = this._currentElement.props;++    var lastContent =+      CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null;+    var nextContent =+      CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null;++    var lastHtml =+      lastProps.dangerouslySetInnerHTML &&+      lastProps.dangerouslySetInnerHTML.__html;+    var nextHtml =+      nextProps.dangerouslySetInnerHTML &&+      nextProps.dangerouslySetInnerHTML.__html;++    // Note the use of `!=` which checks for null or undefined.+    var lastChildren = lastContent != null ? null : lastProps.children;+    var nextChildren = nextContent != null ? null : nextProps.children;++    // If we're switching from children to content/html or vice versa, remove+    // the old content+    var lastHasContentOrHtml = lastContent != null || lastHtml != null;+    var nextHasContentOrHtml = nextContent != null || nextHtml != null;+    if (lastChildren != null && nextChildren == null) {+      this.updateChildren(null, transaction, context);+    } else if (lastHasContentOrHtml && !nextHasContentOrHtml) {+      this.updateTextContent('');+    }++    if (nextContent != null) {+      if (lastContent !== nextContent) {+        this.updateTextContent('' + nextContent);+      }+    } else if (nextHtml != null) {+      if (lastHtml !== nextHtml) {+        BackendIDOperations.updateInnerHTMLByID(+          this._rootNodeID,+          nextHtml+        );+      }+    } else if (nextChildren != null) {+      this.updateChildren(nextChildren, transaction, context);+    }+  },++  /**+   * Destroys all event registrations for this instance. Does not remove from+   * the DOM. That must be done by the parent.+   *+   * @internal+   */+  unmountComponent: function() {+    this.unmountChildren();+    ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID);+    ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);+    this._rootNodeID = null;+  }++};++ReactPerf.measureMethods(ReactDOMComponent, 'ReactDOMComponent', {+  mountComponent: 'mountComponent',+  updateComponent: 'updateComponent'+});++assign(+  ReactDOMComponent.prototype,+  ReactDOMComponent.Mixin,+  ReactMultiChild.Mixin+);++ReactDOMComponent.injection = {+  injectIDOperations: function(IDOperations) {+    ReactDOMComponent.BackendIDOperations = BackendIDOperations = IDOperations;+  }+};++module.exports = ReactDOMComponent;++},{"10":10,"11":11,"116":116,"135":135,"136":136,"141":141,"154":154,"27":27,"30":30,"35":35,"5":5,"70":70,"71":71,"75":75}],43:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMForm+ */++'use strict';++var EventConstants = _dereq_(15);+var LocalEventTrapMixin = _dereq_(25);+var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);++var form = ReactElement.createFactory('form');++/**+ * Since onSubmit doesn't bubble OR capture on the top level in IE8, we need+ * to capture it on the <form> element itself. There are lots of hacks we could+ * do to accomplish this, but the most reliable is to make <form> a+ * composite component and use `componentDidMount` to attach the event handlers.+ */+var ReactDOMForm = ReactClass.createClass({+  displayName: 'ReactDOMForm',+  tagName: 'FORM',++  mixins: [ReactBrowserComponentMixin, LocalEventTrapMixin],++  render: function() {+    // TODO: Instead of using `ReactDOM` directly, we should use JSX. However,+    // `jshint` fails to parse JSX so in order for linting to work in the open+    // source repo, we need to just use `ReactDOM.form`.+    return form(this.props);+  },++  componentDidMount: function() {+    this.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset');+    this.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit');+  }+});++module.exports = ReactDOMForm;++},{"15":15,"25":25,"29":29,"33":33,"57":57}],44:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMIDOperations+ * @typechecks static-only+ */++/*jslint evil: true */++'use strict';++var CSSPropertyOperations = _dereq_(5);+var DOMChildrenOperations = _dereq_(9);+var DOMPropertyOperations = _dereq_(11);+var ReactMount = _dereq_(70);+var ReactPerf = _dereq_(75);++var invariant = _dereq_(135);+var setInnerHTML = _dereq_(148);++/**+ * Errors for properties that should not be updated with `updatePropertyById()`.+ *+ * @type {object}+ * @private+ */+var INVALID_PROPERTY_ERRORS = {+  dangerouslySetInnerHTML:+    '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.',+  style: '`style` must be set using `updateStylesByID()`.'+};++/**+ * Operations used to process updates to DOM nodes. This is made injectable via+ * `ReactDOMComponent.BackendIDOperations`.+ */+var ReactDOMIDOperations = {++  /**+   * Updates a DOM node with new property values. This should only be used to+   * update DOM properties in `DOMProperty`.+   *+   * @param {string} id ID of the node to update.+   * @param {string} name A valid property name, see `DOMProperty`.+   * @param {*} value New value of the property.+   * @internal+   */+  updatePropertyByID: function(id, name, value) {+    var node = ReactMount.getNode(id);+    ("production" !== "development" ? invariant(+      !INVALID_PROPERTY_ERRORS.hasOwnProperty(name),+      'updatePropertyByID(...): %s',+      INVALID_PROPERTY_ERRORS[name]+    ) : invariant(!INVALID_PROPERTY_ERRORS.hasOwnProperty(name)));++    // If we're updating to null or undefined, we should remove the property+    // from the DOM node instead of inadvertantly setting to a string. This+    // brings us in line with the same behavior we have on initial render.+    if (value != null) {+      DOMPropertyOperations.setValueForProperty(node, name, value);+    } else {+      DOMPropertyOperations.deleteValueForProperty(node, name);+    }+  },++  /**+   * Updates a DOM node to remove a property. This should only be used to remove+   * DOM properties in `DOMProperty`.+   *+   * @param {string} id ID of the node to update.+   * @param {string} name A property name to remove, see `DOMProperty`.+   * @internal+   */+  deletePropertyByID: function(id, name, value) {+    var node = ReactMount.getNode(id);+    ("production" !== "development" ? invariant(+      !INVALID_PROPERTY_ERRORS.hasOwnProperty(name),+      'updatePropertyByID(...): %s',+      INVALID_PROPERTY_ERRORS[name]+    ) : invariant(!INVALID_PROPERTY_ERRORS.hasOwnProperty(name)));+    DOMPropertyOperations.deleteValueForProperty(node, name, value);+  },++  /**+   * Updates a DOM node with new style values. If a value is specified as '',+   * the corresponding style property will be unset.+   *+   * @param {string} id ID of the node to update.+   * @param {object} styles Mapping from styles to values.+   * @internal+   */+  updateStylesByID: function(id, styles) {+    var node = ReactMount.getNode(id);+    CSSPropertyOperations.setValueForStyles(node, styles);+  },++  /**+   * Updates a DOM node's innerHTML.+   *+   * @param {string} id ID of the node to update.+   * @param {string} html An HTML string.+   * @internal+   */+  updateInnerHTMLByID: function(id, html) {+    var node = ReactMount.getNode(id);+    setInnerHTML(node, html);+  },++  /**+   * Updates a DOM node's text content set by `props.content`.+   *+   * @param {string} id ID of the node to update.+   * @param {string} content Text content.+   * @internal+   */+  updateTextContentByID: function(id, content) {+    var node = ReactMount.getNode(id);+    DOMChildrenOperations.updateTextContent(node, content);+  },++  /**+   * Replaces a DOM node that exists in the document with markup.+   *+   * @param {string} id ID of child to be replaced.+   * @param {string} markup Dangerous markup to inject in place of child.+   * @internal+   * @see {Danger.dangerouslyReplaceNodeWithMarkup}+   */+  dangerouslyReplaceNodeWithMarkupByID: function(id, markup) {+    var node = ReactMount.getNode(id);+    DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup);+  },++  /**+   * Updates a component's children by processing a series of updates.+   *+   * @param {array<object>} updates List of update configurations.+   * @param {array<string>} markup List of markup strings.+   * @internal+   */+  dangerouslyProcessChildrenUpdates: function(updates, markup) {+    for (var i = 0; i < updates.length; i++) {+      updates[i].parentNode = ReactMount.getNode(updates[i].parentID);+    }+    DOMChildrenOperations.processUpdates(updates, markup);+  }+};++ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', {+  updatePropertyByID: 'updatePropertyByID',+  deletePropertyByID: 'deletePropertyByID',+  updateStylesByID: 'updateStylesByID',+  updateInnerHTMLByID: 'updateInnerHTMLByID',+  updateTextContentByID: 'updateTextContentByID',+  dangerouslyReplaceNodeWithMarkupByID: 'dangerouslyReplaceNodeWithMarkupByID',+  dangerouslyProcessChildrenUpdates: 'dangerouslyProcessChildrenUpdates'+});++module.exports = ReactDOMIDOperations;++},{"11":11,"135":135,"148":148,"5":5,"70":70,"75":75,"9":9}],45:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMIframe+ */++'use strict';++var EventConstants = _dereq_(15);+var LocalEventTrapMixin = _dereq_(25);+var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);++var iframe = ReactElement.createFactory('iframe');++/**+ * Since onLoad doesn't bubble OR capture on the top level in IE8, we need to+ * capture it on the <iframe> element itself. There are lots of hacks we could+ * do to accomplish this, but the most reliable is to make <iframe> a composite+ * component and use `componentDidMount` to attach the event handlers.+ */+var ReactDOMIframe = ReactClass.createClass({+  displayName: 'ReactDOMIframe',+  tagName: 'IFRAME',++  mixins: [ReactBrowserComponentMixin, LocalEventTrapMixin],++  render: function() {+    return iframe(this.props);+  },++  componentDidMount: function() {+    this.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load');+  }+});++module.exports = ReactDOMIframe;++},{"15":15,"25":25,"29":29,"33":33,"57":57}],46:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMImg+ */++'use strict';++var EventConstants = _dereq_(15);+var LocalEventTrapMixin = _dereq_(25);+var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);++var img = ReactElement.createFactory('img');++/**+ * Since onLoad doesn't bubble OR capture on the top level in IE8, we need to+ * capture it on the <img> element itself. There are lots of hacks we could do+ * to accomplish this, but the most reliable is to make <img> a composite+ * component and use `componentDidMount` to attach the event handlers.+ */+var ReactDOMImg = ReactClass.createClass({+  displayName: 'ReactDOMImg',+  tagName: 'IMG',++  mixins: [ReactBrowserComponentMixin, LocalEventTrapMixin],++  render: function() {+    return img(this.props);+  },++  componentDidMount: function() {+    this.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load');+    this.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error');+  }+});++module.exports = ReactDOMImg;++},{"15":15,"25":25,"29":29,"33":33,"57":57}],47:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMInput+ */++'use strict';++var AutoFocusMixin = _dereq_(2);+var DOMPropertyOperations = _dereq_(11);+var LinkedValueUtils = _dereq_(24);+var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);+var ReactMount = _dereq_(70);+var ReactUpdates = _dereq_(87);++var assign = _dereq_(27);+var invariant = _dereq_(135);++var input = ReactElement.createFactory('input');++var instancesByReactID = {};++function forceUpdateIfMounted() {+  /*jshint validthis:true */+  if (this.isMounted()) {+    this.forceUpdate();+  }+}++/**+ * Implements an <input> native component that allows setting these optional+ * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.+ *+ * If `checked` or `value` are not supplied (or null/undefined), user actions+ * that affect the checked state or value will trigger updates to the element.+ *+ * If they are supplied (and not null/undefined), the rendered element will not+ * trigger updates to the element. Instead, the props must change in order for+ * the rendered element to be updated.+ *+ * The rendered element will be initialized as unchecked (or `defaultChecked`)+ * with an empty value (or `defaultValue`).+ *+ * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html+ */+var ReactDOMInput = ReactClass.createClass({+  displayName: 'ReactDOMInput',+  tagName: 'INPUT',++  mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],++  getInitialState: function() {+    var defaultValue = this.props.defaultValue;+    return {+      initialChecked: this.props.defaultChecked || false,+      initialValue: defaultValue != null ? defaultValue : null+    };+  },++  render: function() {+    // Clone `this.props` so we don't mutate the input.+    var props = assign({}, this.props);++    props.defaultChecked = null;+    props.defaultValue = null;++    var value = LinkedValueUtils.getValue(this);+    props.value = value != null ? value : this.state.initialValue;++    var checked = LinkedValueUtils.getChecked(this);+    props.checked = checked != null ? checked : this.state.initialChecked;++    props.onChange = this._handleChange;++    return input(props, this.props.children);+  },++  componentDidMount: function() {+    var id = ReactMount.getID(this.getDOMNode());+    instancesByReactID[id] = this;+  },++  componentWillUnmount: function() {+    var rootNode = this.getDOMNode();+    var id = ReactMount.getID(rootNode);+    delete instancesByReactID[id];+  },++  componentDidUpdate: function(prevProps, prevState, prevContext) {+    var rootNode = this.getDOMNode();+    if (this.props.checked != null) {+      DOMPropertyOperations.setValueForProperty(+        rootNode,+        'checked',+        this.props.checked || false+      );+    }++    var value = LinkedValueUtils.getValue(this);+    if (value != null) {+      // Cast `value` to a string to ensure the value is set correctly. While+      // browsers typically do this as necessary, jsdom doesn't.+      DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);+    }+  },++  _handleChange: function(event) {+    var returnValue;+    var onChange = LinkedValueUtils.getOnChange(this);+    if (onChange) {+      returnValue = onChange.call(this, event);+    }+    // Here we use asap to wait until all updates have propagated, which+    // is important when using controlled components within layers:+    // https://github.com/facebook/react/issues/1698+    ReactUpdates.asap(forceUpdateIfMounted, this);++    var name = this.props.name;+    if (this.props.type === 'radio' && name != null) {+      var rootNode = this.getDOMNode();+      var queryRoot = rootNode;++      while (queryRoot.parentNode) {+        queryRoot = queryRoot.parentNode;+      }++      // If `rootNode.form` was non-null, then we could try `form.elements`,+      // but that sometimes behaves strangely in IE8. We could also try using+      // `form.getElementsByName`, but that will only return direct children+      // and won't include inputs that use the HTML5 `form=` attribute. Since+      // the input might not even be in a form, let's just use the global+      // `querySelectorAll` to ensure we don't miss anything.+      var group = queryRoot.querySelectorAll(+        'input[name=' + JSON.stringify('' + name) + '][type="radio"]');++      for (var i = 0, groupLen = group.length; i < groupLen; i++) {+        var otherNode = group[i];+        if (otherNode === rootNode ||+            otherNode.form !== rootNode.form) {+          continue;+        }+        var otherID = ReactMount.getID(otherNode);+        ("production" !== "development" ? invariant(+          otherID,+          'ReactDOMInput: Mixing React and non-React radio inputs with the ' ++          'same `name` is not supported.'+        ) : invariant(otherID));+        var otherInstance = instancesByReactID[otherID];+        ("production" !== "development" ? invariant(+          otherInstance,+          'ReactDOMInput: Unknown radio button ID %s.',+          otherID+        ) : invariant(otherInstance));+        // If this is a controlled radio button group, forcing the input that+        // was previously checked to update will cause it to be come re-checked+        // as appropriate.+        ReactUpdates.asap(forceUpdateIfMounted, otherInstance);+      }+    }++    return returnValue;+  }++});++module.exports = ReactDOMInput;++},{"11":11,"135":135,"2":2,"24":24,"27":27,"29":29,"33":33,"57":57,"70":70,"87":87}],48:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMOption+ */++'use strict';++var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);++var warning = _dereq_(154);++var option = ReactElement.createFactory('option');++/**+ * Implements an <option> native component that warns when `selected` is set.+ */+var ReactDOMOption = ReactClass.createClass({+  displayName: 'ReactDOMOption',+  tagName: 'OPTION',++  mixins: [ReactBrowserComponentMixin],++  componentWillMount: function() {+    // TODO (yungsters): Remove support for `selected` in <option>.+    if ("production" !== "development") {+      ("production" !== "development" ? warning(+        this.props.selected == null,+        'Use the `defaultValue` or `value` props on <select> instead of ' ++        'setting `selected` on <option>.'+      ) : null);+    }+  },++  render: function() {+    return option(this.props, this.props.children);+  }++});++module.exports = ReactDOMOption;++},{"154":154,"29":29,"33":33,"57":57}],49:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMSelect+ */++'use strict';++var AutoFocusMixin = _dereq_(2);+var LinkedValueUtils = _dereq_(24);+var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);+var ReactUpdates = _dereq_(87);++var assign = _dereq_(27);++var select = ReactElement.createFactory('select');++function updateOptionsIfPendingUpdateAndMounted() {+  /*jshint validthis:true */+  if (this._pendingUpdate) {+    this._pendingUpdate = false;+    var value = LinkedValueUtils.getValue(this);+    if (value != null && this.isMounted()) {+      updateOptions(this, value);+    }+  }+}++/**+ * Validation function for `value` and `defaultValue`.+ * @private+ */+function selectValueType(props, propName, componentName) {+  if (props[propName] == null) {+    return null;+  }+  if (props.multiple) {+    if (!Array.isArray(props[propName])) {+      return new Error(+        ("The `" + propName + "` prop supplied to <select> must be an array if ") ++        ("`multiple` is true.")+      );+    }+  } else {+    if (Array.isArray(props[propName])) {+      return new Error(+        ("The `" + propName + "` prop supplied to <select> must be a scalar ") ++        ("value if `multiple` is false.")+      );+    }+  }+}++/**+ * @param {ReactComponent} component Instance of ReactDOMSelect+ * @param {*} propValue A stringable (with `multiple`, a list of stringables).+ * @private+ */+function updateOptions(component, propValue) {+  var selectedValue, i, l;+  var options = component.getDOMNode().options;++  if (component.props.multiple) {+    selectedValue = {};+    for (i = 0, l = propValue.length; i < l; i++) {+      selectedValue['' + propValue[i]] = true;+    }+    for (i = 0, l = options.length; i < l; i++) {+      var selected = selectedValue.hasOwnProperty(options[i].value);+      if (options[i].selected !== selected) {+        options[i].selected = selected;+      }+    }+  } else {+    // Do not set `select.value` as exact behavior isn't consistent across all+    // browsers for all cases.+    selectedValue = '' + propValue;+    for (i = 0, l = options.length; i < l; i++) {+      if (options[i].value === selectedValue) {+        options[i].selected = true;+        return;+      }+    }+    if (options.length) {+      options[0].selected = true;+    }+  }+}++/**+ * Implements a <select> native component that allows optionally setting the+ * props `value` and `defaultValue`. If `multiple` is false, the prop must be a+ * stringable. If `multiple` is true, the prop must be an array of stringables.+ *+ * If `value` is not supplied (or null/undefined), user actions that change the+ * selected option will trigger updates to the rendered options.+ *+ * If it is supplied (and not null/undefined), the rendered options will not+ * update in response to user actions. Instead, the `value` prop must change in+ * order for the rendered options to update.+ *+ * If `defaultValue` is provided, any options with the supplied values will be+ * selected.+ */+var ReactDOMSelect = ReactClass.createClass({+  displayName: 'ReactDOMSelect',+  tagName: 'SELECT',++  mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],++  propTypes: {+    defaultValue: selectValueType,+    value: selectValueType+  },++  render: function() {+    // Clone `this.props` so we don't mutate the input.+    var props = assign({}, this.props);++    props.onChange = this._handleChange;+    props.value = null;++    return select(props, this.props.children);+  },++  componentWillMount: function() {+    this._pendingUpdate = false;+  },++  componentDidMount: function() {+    var value = LinkedValueUtils.getValue(this);+    if (value != null) {+      updateOptions(this, value);+    } else if (this.props.defaultValue != null) {+      updateOptions(this, this.props.defaultValue);+    }+  },++  componentDidUpdate: function(prevProps) {+    var value = LinkedValueUtils.getValue(this);+    if (value != null) {+      this._pendingUpdate = false;+      updateOptions(this, value);+    } else if (!prevProps.multiple !== !this.props.multiple) {+      // For simplicity, reapply `defaultValue` if `multiple` is toggled.+      if (this.props.defaultValue != null) {+        updateOptions(this, this.props.defaultValue);+      } else {+        // Revert the select back to its default unselected state.+        updateOptions(this, this.props.multiple ? [] : '');+      }+    }+  },++  _handleChange: function(event) {+    var returnValue;+    var onChange = LinkedValueUtils.getOnChange(this);+    if (onChange) {+      returnValue = onChange.call(this, event);+    }++    this._pendingUpdate = true;+    ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this);+    return returnValue;+  }++});++module.exports = ReactDOMSelect;++},{"2":2,"24":24,"27":27,"29":29,"33":33,"57":57,"87":87}],50:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMSelection+ */++'use strict';++var ExecutionEnvironment = _dereq_(21);++var getNodeForCharacterOffset = _dereq_(128);+var getTextContentAccessor = _dereq_(130);++/**+ * While `isCollapsed` is available on the Selection object and `collapsed`+ * is available on the Range object, IE11 sometimes gets them wrong.+ * If the anchor/focus nodes and offsets are the same, the range is collapsed.+ */+function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {+  return anchorNode === focusNode && anchorOffset === focusOffset;+}++/**+ * Get the appropriate anchor and focus node/offset pairs for IE.+ *+ * The catch here is that IE's selection API doesn't provide information+ * about whether the selection is forward or backward, so we have to+ * behave as though it's always forward.+ *+ * IE text differs from modern selection in that it behaves as though+ * block elements end with a new line. This means character offsets will+ * differ between the two APIs.+ *+ * @param {DOMElement} node+ * @return {object}+ */+function getIEOffsets(node) {+  var selection = document.selection;+  var selectedRange = selection.createRange();+  var selectedLength = selectedRange.text.length;++  // Duplicate selection so we can move range without breaking user selection.+  var fromStart = selectedRange.duplicate();+  fromStart.moveToElementText(node);+  fromStart.setEndPoint('EndToStart', selectedRange);++  var startOffset = fromStart.text.length;+  var endOffset = startOffset + selectedLength;++  return {+    start: startOffset,+    end: endOffset+  };+}++/**+ * @param {DOMElement} node+ * @return {?object}+ */+function getModernOffsets(node) {+  var selection = window.getSelection && window.getSelection();++  if (!selection || selection.rangeCount === 0) {+    return null;+  }++  var anchorNode = selection.anchorNode;+  var anchorOffset = selection.anchorOffset;+  var focusNode = selection.focusNode;+  var focusOffset = selection.focusOffset;++  var currentRange = selection.getRangeAt(0);++  // If the node and offset values are the same, the selection is collapsed.+  // `Selection.isCollapsed` is available natively, but IE sometimes gets+  // this value wrong.+  var isSelectionCollapsed = isCollapsed(+    selection.anchorNode,+    selection.anchorOffset,+    selection.focusNode,+    selection.focusOffset+  );++  var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;++  var tempRange = currentRange.cloneRange();+  tempRange.selectNodeContents(node);+  tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);++  var isTempRangeCollapsed = isCollapsed(+    tempRange.startContainer,+    tempRange.startOffset,+    tempRange.endContainer,+    tempRange.endOffset+  );++  var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;+  var end = start + rangeLength;++  // Detect whether the selection is backward.+  var detectionRange = document.createRange();+  detectionRange.setStart(anchorNode, anchorOffset);+  detectionRange.setEnd(focusNode, focusOffset);+  var isBackward = detectionRange.collapsed;++  return {+    start: isBackward ? end : start,+    end: isBackward ? start : end+  };+}++/**+ * @param {DOMElement|DOMTextNode} node+ * @param {object} offsets+ */+function setIEOffsets(node, offsets) {+  var range = document.selection.createRange().duplicate();+  var start, end;++  if (typeof offsets.end === 'undefined') {+    start = offsets.start;+    end = start;+  } else if (offsets.start > offsets.end) {+    start = offsets.end;+    end = offsets.start;+  } else {+    start = offsets.start;+    end = offsets.end;+  }++  range.moveToElementText(node);+  range.moveStart('character', start);+  range.setEndPoint('EndToStart', range);+  range.moveEnd('character', end - start);+  range.select();+}++/**+ * In modern non-IE browsers, we can support both forward and backward+ * selections.+ *+ * Note: IE10+ supports the Selection object, but it does not support+ * the `extend` method, which means that even in modern IE, it's not possible+ * to programatically create a backward selection. Thus, for all IE+ * versions, we use the old IE API to create our selections.+ *+ * @param {DOMElement|DOMTextNode} node+ * @param {object} offsets+ */+function setModernOffsets(node, offsets) {+  if (!window.getSelection) {+    return;+  }++  var selection = window.getSelection();+  var length = node[getTextContentAccessor()].length;+  var start = Math.min(offsets.start, length);+  var end = typeof offsets.end === 'undefined' ?+            start : Math.min(offsets.end, length);++  // IE 11 uses modern selection, but doesn't support the extend method.+  // Flip backward selections, so we can set with a single range.+  if (!selection.extend && start > end) {+    var temp = end;+    end = start;+    start = temp;+  }++  var startMarker = getNodeForCharacterOffset(node, start);+  var endMarker = getNodeForCharacterOffset(node, end);++  if (startMarker && endMarker) {+    var range = document.createRange();+    range.setStart(startMarker.node, startMarker.offset);+    selection.removeAllRanges();++    if (start > end) {+      selection.addRange(range);+      selection.extend(endMarker.node, endMarker.offset);+    } else {+      range.setEnd(endMarker.node, endMarker.offset);+      selection.addRange(range);+    }+  }+}++var useIEOffsets = (+  ExecutionEnvironment.canUseDOM &&+  'selection' in document &&+  !('getSelection' in window)+);++var ReactDOMSelection = {+  /**+   * @param {DOMElement} node+   */+  getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets,++  /**+   * @param {DOMElement|DOMTextNode} node+   * @param {object} offsets+   */+  setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets+};++module.exports = ReactDOMSelection;++},{"128":128,"130":130,"21":21}],51:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMTextComponent+ * @typechecks static-only+ */++'use strict';++var DOMPropertyOperations = _dereq_(11);+var ReactComponentBrowserEnvironment =+  _dereq_(35);+var ReactDOMComponent = _dereq_(42);++var assign = _dereq_(27);+var escapeTextContentForBrowser = _dereq_(116);++/**+ * Text nodes violate a couple assumptions that React makes about components:+ *+ *  - When mounting text into the DOM, adjacent text nodes are merged.+ *  - Text nodes cannot be assigned a React root ID.+ *+ * This component is used to wrap strings in elements so that they can undergo+ * the same reconciliation that is applied to elements.+ *+ * TODO: Investigate representing React components in the DOM with text nodes.+ *+ * @class ReactDOMTextComponent+ * @extends ReactComponent+ * @internal+ */+var ReactDOMTextComponent = function(props) {+  // This constructor and its argument is currently used by mocks.+};++assign(ReactDOMTextComponent.prototype, {++  /**+   * @param {ReactText} text+   * @internal+   */+  construct: function(text) {+    // TODO: This is really a ReactText (ReactNode), not a ReactElement+    this._currentElement = text;+    this._stringText = '' + text;++    // Properties+    this._rootNodeID = null;+    this._mountIndex = 0;+  },++  /**+   * Creates the markup for this text node. This node is not intended to have+   * any features besides containing text content.+   *+   * @param {string} rootID DOM ID of the root node.+   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction+   * @return {string} Markup for this text node.+   * @internal+   */+  mountComponent: function(rootID, transaction, context) {+    this._rootNodeID = rootID;+    var escapedText = escapeTextContentForBrowser(this._stringText);++    if (transaction.renderToStaticMarkup) {+      // Normally we'd wrap this in a `span` for the reasons stated above, but+      // since this is a situation where React won't take over (static pages),+      // we can simply return the text as it is.+      return escapedText;+    }++    return (+      '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' ++        escapedText ++      '</span>'+    );+  },++  /**+   * Updates this component by updating the text content.+   *+   * @param {ReactText} nextText The next text content+   * @param {ReactReconcileTransaction} transaction+   * @internal+   */+  receiveComponent: function(nextText, transaction) {+    if (nextText !== this._currentElement) {+      this._currentElement = nextText;+      var nextStringText = '' + nextText;+      if (nextStringText !== this._stringText) {+        // TODO: Save this as pending props and use performUpdateIfNecessary+        // and/or updateComponent to do the actual update for consistency with+        // other component types?+        this._stringText = nextStringText;+        ReactDOMComponent.BackendIDOperations.updateTextContentByID(+          this._rootNodeID,+          nextStringText+        );+      }+    }+  },++  unmountComponent: function() {+    ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);+  }++});++module.exports = ReactDOMTextComponent;++},{"11":11,"116":116,"27":27,"35":35,"42":42}],52:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDOMTextarea+ */++'use strict';++var AutoFocusMixin = _dereq_(2);+var DOMPropertyOperations = _dereq_(11);+var LinkedValueUtils = _dereq_(24);+var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);+var ReactUpdates = _dereq_(87);++var assign = _dereq_(27);+var invariant = _dereq_(135);++var warning = _dereq_(154);++var textarea = ReactElement.createFactory('textarea');++function forceUpdateIfMounted() {+  /*jshint validthis:true */+  if (this.isMounted()) {+    this.forceUpdate();+  }+}++/**+ * Implements a <textarea> native component that allows setting `value`, and+ * `defaultValue`. This differs from the traditional DOM API because value is+ * usually set as PCDATA children.+ *+ * If `value` is not supplied (or null/undefined), user actions that affect the+ * value will trigger updates to the element.+ *+ * If `value` is supplied (and not null/undefined), the rendered element will+ * not trigger updates to the element. Instead, the `value` prop must change in+ * order for the rendered element to be updated.+ *+ * The rendered element will be initialized with an empty value, the prop+ * `defaultValue` if specified, or the children content (deprecated).+ */+var ReactDOMTextarea = ReactClass.createClass({+  displayName: 'ReactDOMTextarea',+  tagName: 'TEXTAREA',++  mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],++  getInitialState: function() {+    var defaultValue = this.props.defaultValue;+    // TODO (yungsters): Remove support for children content in <textarea>.+    var children = this.props.children;+    if (children != null) {+      if ("production" !== "development") {+        ("production" !== "development" ? warning(+          false,+          'Use the `defaultValue` or `value` props instead of setting ' ++          'children on <textarea>.'+        ) : null);+      }+      ("production" !== "development" ? invariant(+        defaultValue == null,+        'If you supply `defaultValue` on a <textarea>, do not pass children.'+      ) : invariant(defaultValue == null));+      if (Array.isArray(children)) {+        ("production" !== "development" ? invariant(+          children.length <= 1,+          '<textarea> can only have at most one child.'+        ) : invariant(children.length <= 1));+        children = children[0];+      }++      defaultValue = '' + children;+    }+    if (defaultValue == null) {+      defaultValue = '';+    }+    var value = LinkedValueUtils.getValue(this);+    return {+      // We save the initial value so that `ReactDOMComponent` doesn't update+      // `textContent` (unnecessary since we update value).+      // The initial value can be a boolean or object so that's why it's+      // forced to be a string.+      initialValue: '' + (value != null ? value : defaultValue)+    };+  },++  render: function() {+    // Clone `this.props` so we don't mutate the input.+    var props = assign({}, this.props);++    ("production" !== "development" ? invariant(+      props.dangerouslySetInnerHTML == null,+      '`dangerouslySetInnerHTML` does not make sense on <textarea>.'+    ) : invariant(props.dangerouslySetInnerHTML == null));++    props.defaultValue = null;+    props.value = null;+    props.onChange = this._handleChange;++    // Always set children to the same thing. In IE9, the selection range will+    // get reset if `textContent` is mutated.+    return textarea(props, this.state.initialValue);+  },++  componentDidUpdate: function(prevProps, prevState, prevContext) {+    var value = LinkedValueUtils.getValue(this);+    if (value != null) {+      var rootNode = this.getDOMNode();+      // Cast `value` to a string to ensure the value is set correctly. While+      // browsers typically do this as necessary, jsdom doesn't.+      DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);+    }+  },++  _handleChange: function(event) {+    var returnValue;+    var onChange = LinkedValueUtils.getOnChange(this);+    if (onChange) {+      returnValue = onChange.call(this, event);+    }+    ReactUpdates.asap(forceUpdateIfMounted, this);+    return returnValue;+  }++});++module.exports = ReactDOMTextarea;++},{"11":11,"135":135,"154":154,"2":2,"24":24,"27":27,"29":29,"33":33,"57":57,"87":87}],53:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDefaultBatchingStrategy+ */++'use strict';++var ReactUpdates = _dereq_(87);+var Transaction = _dereq_(103);++var assign = _dereq_(27);+var emptyFunction = _dereq_(114);++var RESET_BATCHED_UPDATES = {+  initialize: emptyFunction,+  close: function() {+    ReactDefaultBatchingStrategy.isBatchingUpdates = false;+  }+};++var FLUSH_BATCHED_UPDATES = {+  initialize: emptyFunction,+  close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)+};++var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];++function ReactDefaultBatchingStrategyTransaction() {+  this.reinitializeTransaction();+}++assign(+  ReactDefaultBatchingStrategyTransaction.prototype,+  Transaction.Mixin,+  {+    getTransactionWrappers: function() {+      return TRANSACTION_WRAPPERS;+    }+  }+);++var transaction = new ReactDefaultBatchingStrategyTransaction();++var ReactDefaultBatchingStrategy = {+  isBatchingUpdates: false,++  /**+   * Call the provided function in a context within which calls to `setState`+   * and friends are batched such that components aren't updated unnecessarily.+   */+  batchedUpdates: function(callback, a, b, c, d) {+    var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;++    ReactDefaultBatchingStrategy.isBatchingUpdates = true;++    // The code is written this way to avoid extra allocations+    if (alreadyBatchingUpdates) {+      callback(a, b, c, d);+    } else {+      transaction.perform(callback, null, a, b, c, d);+    }+  }+};++module.exports = ReactDefaultBatchingStrategy;++},{"103":103,"114":114,"27":27,"87":87}],54:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDefaultInjection+ */++'use strict';++var BeforeInputEventPlugin = _dereq_(3);+var ChangeEventPlugin = _dereq_(7);+var ClientReactRootIndex = _dereq_(8);+var DefaultEventPluginOrder = _dereq_(13);+var EnterLeaveEventPlugin = _dereq_(14);+var ExecutionEnvironment = _dereq_(21);+var HTMLDOMPropertyConfig = _dereq_(23);+var MobileSafariClickEventPlugin = _dereq_(26);+var ReactBrowserComponentMixin = _dereq_(29);+var ReactClass = _dereq_(33);+var ReactComponentBrowserEnvironment =+  _dereq_(35);+var ReactDefaultBatchingStrategy = _dereq_(53);+var ReactDOMComponent = _dereq_(42);+var ReactDOMButton = _dereq_(41);+var ReactDOMForm = _dereq_(43);+var ReactDOMImg = _dereq_(46);+var ReactDOMIDOperations = _dereq_(44);+var ReactDOMIframe = _dereq_(45);+var ReactDOMInput = _dereq_(47);+var ReactDOMOption = _dereq_(48);+var ReactDOMSelect = _dereq_(49);+var ReactDOMTextarea = _dereq_(52);+var ReactDOMTextComponent = _dereq_(51);+var ReactElement = _dereq_(57);+var ReactEventListener = _dereq_(62);+var ReactInjection = _dereq_(64);+var ReactInstanceHandles = _dereq_(66);+var ReactMount = _dereq_(70);+var ReactReconcileTransaction = _dereq_(80);+var SelectEventPlugin = _dereq_(89);+var ServerReactRootIndex = _dereq_(90);+var SimpleEventPlugin = _dereq_(91);+var SVGDOMPropertyConfig = _dereq_(88);++var createFullPageComponent = _dereq_(111);++function autoGenerateWrapperClass(type) {+  return ReactClass.createClass({+    tagName: type.toUpperCase(),+    render: function() {+      return new ReactElement(+        type,+        null,+        null,+        null,+        null,+        this.props+      );+    }+  });+}++function inject() {+  ReactInjection.EventEmitter.injectReactEventListener(+    ReactEventListener+  );++  /**+   * Inject modules for resolving DOM hierarchy and plugin ordering.+   */+  ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder);+  ReactInjection.EventPluginHub.injectInstanceHandle(ReactInstanceHandles);+  ReactInjection.EventPluginHub.injectMount(ReactMount);++  /**+   * Some important event plugins included by default (without having to require+   * them).+   */+  ReactInjection.EventPluginHub.injectEventPluginsByName({+    SimpleEventPlugin: SimpleEventPlugin,+    EnterLeaveEventPlugin: EnterLeaveEventPlugin,+    ChangeEventPlugin: ChangeEventPlugin,+    MobileSafariClickEventPlugin: MobileSafariClickEventPlugin,+    SelectEventPlugin: SelectEventPlugin,+    BeforeInputEventPlugin: BeforeInputEventPlugin+  });++  ReactInjection.NativeComponent.injectGenericComponentClass(+    ReactDOMComponent+  );++  ReactInjection.NativeComponent.injectTextComponentClass(+    ReactDOMTextComponent+  );++  ReactInjection.NativeComponent.injectAutoWrapper(+    autoGenerateWrapperClass+  );++  // This needs to happen before createFullPageComponent() otherwise the mixin+  // won't be included.+  ReactInjection.Class.injectMixin(ReactBrowserComponentMixin);++  ReactInjection.NativeComponent.injectComponentClasses({+    'button': ReactDOMButton,+    'form': ReactDOMForm,+    'iframe': ReactDOMIframe,+    'img': ReactDOMImg,+    'input': ReactDOMInput,+    'option': ReactDOMOption,+    'select': ReactDOMSelect,+    'textarea': ReactDOMTextarea,++    'html': createFullPageComponent('html'),+    'head': createFullPageComponent('head'),+    'body': createFullPageComponent('body')+  });++  ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig);+  ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig);++  ReactInjection.EmptyComponent.injectEmptyComponent('noscript');++  ReactInjection.Updates.injectReconcileTransaction(+    ReactReconcileTransaction+  );+  ReactInjection.Updates.injectBatchingStrategy(+    ReactDefaultBatchingStrategy+  );++  ReactInjection.RootIndex.injectCreateReactRootIndex(+    ExecutionEnvironment.canUseDOM ?+      ClientReactRootIndex.createReactRootIndex :+      ServerReactRootIndex.createReactRootIndex+  );++  ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);+  ReactInjection.DOMComponent.injectIDOperations(ReactDOMIDOperations);++  if ("production" !== "development") {+    var url = (ExecutionEnvironment.canUseDOM && window.location.href) || '';+    if ((/[?&]react_perf\b/).test(url)) {+      var ReactDefaultPerf = _dereq_(55);+      ReactDefaultPerf.start();+    }+  }+}++module.exports = {+  inject: inject+};++},{"111":111,"13":13,"14":14,"21":21,"23":23,"26":26,"29":29,"3":3,"33":33,"35":35,"41":41,"42":42,"43":43,"44":44,"45":45,"46":46,"47":47,"48":48,"49":49,"51":51,"52":52,"53":53,"55":55,"57":57,"62":62,"64":64,"66":66,"7":7,"70":70,"8":8,"80":80,"88":88,"89":89,"90":90,"91":91}],55:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDefaultPerf+ * @typechecks static-only+ */++'use strict';++var DOMProperty = _dereq_(10);+var ReactDefaultPerfAnalysis = _dereq_(56);+var ReactMount = _dereq_(70);+var ReactPerf = _dereq_(75);++var performanceNow = _dereq_(146);++function roundFloat(val) {+  return Math.floor(val * 100) / 100;+}++function addValue(obj, key, val) {+  obj[key] = (obj[key] || 0) + val;+}++var ReactDefaultPerf = {+  _allMeasurements: [], // last item in the list is the current one+  _mountStack: [0],+  _injected: false,++  start: function() {+    if (!ReactDefaultPerf._injected) {+      ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure);+    }++    ReactDefaultPerf._allMeasurements.length = 0;+    ReactPerf.enableMeasure = true;+  },++  stop: function() {+    ReactPerf.enableMeasure = false;+  },++  getLastMeasurements: function() {+    return ReactDefaultPerf._allMeasurements;+  },++  printExclusive: function(measurements) {+    measurements = measurements || ReactDefaultPerf._allMeasurements;+    var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements);+    console.table(summary.map(function(item) {+      return {+        'Component class name': item.componentName,+        'Total inclusive time (ms)': roundFloat(item.inclusive),+        'Exclusive mount time (ms)': roundFloat(item.exclusive),+        'Exclusive render time (ms)': roundFloat(item.render),+        'Mount time per instance (ms)': roundFloat(item.exclusive / item.count),+        'Render time per instance (ms)': roundFloat(item.render / item.count),+        'Instances': item.count+      };+    }));+    // TODO: ReactDefaultPerfAnalysis.getTotalTime() does not return the correct+    // number.+  },++  printInclusive: function(measurements) {+    measurements = measurements || ReactDefaultPerf._allMeasurements;+    var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements);+    console.table(summary.map(function(item) {+      return {+        'Owner > component': item.componentName,+        'Inclusive time (ms)': roundFloat(item.time),+        'Instances': item.count+      };+    }));+    console.log(+      'Total time:',+      ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'+    );+  },++  getMeasurementsSummaryMap: function(measurements) {+    var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(+      measurements,+      true+    );+    return summary.map(function(item) {+      return {+        'Owner > component': item.componentName,+        'Wasted time (ms)': item.time,+        'Instances': item.count+      };+    });+  },++  printWasted: function(measurements) {+    measurements = measurements || ReactDefaultPerf._allMeasurements;+    console.table(ReactDefaultPerf.getMeasurementsSummaryMap(measurements));+    console.log(+      'Total time:',+      ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'+    );+  },++  printDOM: function(measurements) {+    measurements = measurements || ReactDefaultPerf._allMeasurements;+    var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements);+    console.table(summary.map(function(item) {+      var result = {};+      result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id;+      result['type'] = item.type;+      result['args'] = JSON.stringify(item.args);+      return result;+    }));+    console.log(+      'Total time:',+      ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'+    );+  },++  _recordWrite: function(id, fnName, totalTime, args) {+    // TODO: totalTime isn't that useful since it doesn't count paints/reflows+    var writes =+      ReactDefaultPerf+        ._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1]+        .writes;+    writes[id] = writes[id] || [];+    writes[id].push({+      type: fnName,+      time: totalTime,+      args: args+    });+  },++  measure: function(moduleName, fnName, func) {+    return function() {for (var args=[],$__0=0,$__1=arguments.length;$__0<$__1;$__0++) args.push(arguments[$__0]);+      var totalTime;+      var rv;+      var start;++      if (fnName === '_renderNewRootComponent' ||+          fnName === 'flushBatchedUpdates') {+        // A "measurement" is a set of metrics recorded for each flush. We want+        // to group the metrics for a given flush together so we can look at the+        // components that rendered and the DOM operations that actually+        // happened to determine the amount of "wasted work" performed.+        ReactDefaultPerf._allMeasurements.push({+          exclusive: {},+          inclusive: {},+          render: {},+          counts: {},+          writes: {},+          displayNames: {},+          totalTime: 0+        });+        start = performanceNow();+        rv = func.apply(this, args);+        ReactDefaultPerf._allMeasurements[+          ReactDefaultPerf._allMeasurements.length - 1+        ].totalTime = performanceNow() - start;+        return rv;+      } else if (fnName === '_mountImageIntoNode' ||+          moduleName === 'ReactDOMIDOperations') {+        start = performanceNow();+        rv = func.apply(this, args);+        totalTime = performanceNow() - start;++        if (fnName === '_mountImageIntoNode') {+          var mountID = ReactMount.getID(args[1]);+          ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]);+        } else if (fnName === 'dangerouslyProcessChildrenUpdates') {+          // special format+          args[0].forEach(function(update) {+            var writeArgs = {};+            if (update.fromIndex !== null) {+              writeArgs.fromIndex = update.fromIndex;+            }+            if (update.toIndex !== null) {+              writeArgs.toIndex = update.toIndex;+            }+            if (update.textContent !== null) {+              writeArgs.textContent = update.textContent;+            }+            if (update.markupIndex !== null) {+              writeArgs.markup = args[1][update.markupIndex];+            }+            ReactDefaultPerf._recordWrite(+              update.parentID,+              update.type,+              totalTime,+              writeArgs+            );+          });+        } else {+          // basic format+          ReactDefaultPerf._recordWrite(+            args[0],+            fnName,+            totalTime,+            Array.prototype.slice.call(args, 1)+          );+        }+        return rv;+      } else if (moduleName === 'ReactCompositeComponent' && (+        (// TODO: receiveComponent()?+        (fnName === 'mountComponent' ||+        fnName === 'updateComponent' || fnName === '_renderValidatedComponent')))) {++        if (typeof this._currentElement.type === 'string') {+          return func.apply(this, args);+        }++        var rootNodeID = fnName === 'mountComponent' ?+          args[0] :+          this._rootNodeID;+        var isRender = fnName === '_renderValidatedComponent';+        var isMount = fnName === 'mountComponent';++        var mountStack = ReactDefaultPerf._mountStack;+        var entry = ReactDefaultPerf._allMeasurements[+          ReactDefaultPerf._allMeasurements.length - 1+        ];++        if (isRender) {+          addValue(entry.counts, rootNodeID, 1);+        } else if (isMount) {+          mountStack.push(0);+        }++        start = performanceNow();+        rv = func.apply(this, args);+        totalTime = performanceNow() - start;++        if (isRender) {+          addValue(entry.render, rootNodeID, totalTime);+        } else if (isMount) {+          var subMountTime = mountStack.pop();+          mountStack[mountStack.length - 1] += totalTime;+          addValue(entry.exclusive, rootNodeID, totalTime - subMountTime);+          addValue(entry.inclusive, rootNodeID, totalTime);+        } else {+          addValue(entry.inclusive, rootNodeID, totalTime);+        }++        entry.displayNames[rootNodeID] = {+          current: this.getName(),+          owner: this._currentElement._owner ?+            this._currentElement._owner.getName() :+            '<root>'+        };++        return rv;+      } else {+        return func.apply(this, args);+      }+    };+  }+};++module.exports = ReactDefaultPerf;++},{"10":10,"146":146,"56":56,"70":70,"75":75}],56:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactDefaultPerfAnalysis+ */++var assign = _dereq_(27);++// Don't try to save users less than 1.2ms (a number I made up)+var DONT_CARE_THRESHOLD = 1.2;+var DOM_OPERATION_TYPES = {+  '_mountImageIntoNode': 'set innerHTML',+  INSERT_MARKUP: 'set innerHTML',+  MOVE_EXISTING: 'move',+  REMOVE_NODE: 'remove',+  TEXT_CONTENT: 'set textContent',+  'updatePropertyByID': 'update attribute',+  'deletePropertyByID': 'delete attribute',+  'updateStylesByID': 'update styles',+  'updateInnerHTMLByID': 'set innerHTML',+  'dangerouslyReplaceNodeWithMarkupByID': 'replace'+};++function getTotalTime(measurements) {+  // TODO: return number of DOM ops? could be misleading.+  // TODO: measure dropped frames after reconcile?+  // TODO: log total time of each reconcile and the top-level component+  // class that triggered it.+  var totalTime = 0;+  for (var i = 0; i < measurements.length; i++) {+    var measurement = measurements[i];+    totalTime += measurement.totalTime;+  }+  return totalTime;+}++function getDOMSummary(measurements) {+  var items = [];+  for (var i = 0; i < measurements.length; i++) {+    var measurement = measurements[i];+    var id;++    for (id in measurement.writes) {+      measurement.writes[id].forEach(function(write) {+        items.push({+          id: id,+          type: DOM_OPERATION_TYPES[write.type] || write.type,+          args: write.args+        });+      });+    }+  }+  return items;+}++function getExclusiveSummary(measurements) {+  var candidates = {};+  var displayName;++  for (var i = 0; i < measurements.length; i++) {+    var measurement = measurements[i];+    var allIDs = assign(+      {},+      measurement.exclusive,+      measurement.inclusive+    );++    for (var id in allIDs) {+      displayName = measurement.displayNames[id].current;++      candidates[displayName] = candidates[displayName] || {+        componentName: displayName,+        inclusive: 0,+        exclusive: 0,+        render: 0,+        count: 0+      };+      if (measurement.render[id]) {+        candidates[displayName].render += measurement.render[id];+      }+      if (measurement.exclusive[id]) {+        candidates[displayName].exclusive += measurement.exclusive[id];+      }+      if (measurement.inclusive[id]) {+        candidates[displayName].inclusive += measurement.inclusive[id];+      }+      if (measurement.counts[id]) {+        candidates[displayName].count += measurement.counts[id];+      }+    }+  }++  // Now make a sorted array with the results.+  var arr = [];+  for (displayName in candidates) {+    if (candidates[displayName].exclusive >= DONT_CARE_THRESHOLD) {+      arr.push(candidates[displayName]);+    }+  }++  arr.sort(function(a, b) {+    return b.exclusive - a.exclusive;+  });++  return arr;+}++function getInclusiveSummary(measurements, onlyClean) {+  var candidates = {};+  var inclusiveKey;++  for (var i = 0; i < measurements.length; i++) {+    var measurement = measurements[i];+    var allIDs = assign(+      {},+      measurement.exclusive,+      measurement.inclusive+    );+    var cleanComponents;++    if (onlyClean) {+      cleanComponents = getUnchangedComponents(measurement);+    }++    for (var id in allIDs) {+      if (onlyClean && !cleanComponents[id]) {+        continue;+      }++      var displayName = measurement.displayNames[id];++      // Inclusive time is not useful for many components without knowing where+      // they are instantiated. So we aggregate inclusive time with both the+      // owner and current displayName as the key.+      inclusiveKey = displayName.owner + ' > ' + displayName.current;++      candidates[inclusiveKey] = candidates[inclusiveKey] || {+        componentName: inclusiveKey,+        time: 0,+        count: 0+      };++      if (measurement.inclusive[id]) {+        candidates[inclusiveKey].time += measurement.inclusive[id];+      }+      if (measurement.counts[id]) {+        candidates[inclusiveKey].count += measurement.counts[id];+      }+    }+  }++  // Now make a sorted array with the results.+  var arr = [];+  for (inclusiveKey in candidates) {+    if (candidates[inclusiveKey].time >= DONT_CARE_THRESHOLD) {+      arr.push(candidates[inclusiveKey]);+    }+  }++  arr.sort(function(a, b) {+    return b.time - a.time;+  });++  return arr;+}++function getUnchangedComponents(measurement) {+  // For a given reconcile, look at which components did not actually+  // render anything to the DOM and return a mapping of their ID to+  // the amount of time it took to render the entire subtree.+  var cleanComponents = {};+  var dirtyLeafIDs = Object.keys(measurement.writes);+  var allIDs = assign({}, measurement.exclusive, measurement.inclusive);++  for (var id in allIDs) {+    var isDirty = false;+    // For each component that rendered, see if a component that triggered+    // a DOM op is in its subtree.+    for (var i = 0; i < dirtyLeafIDs.length; i++) {+      if (dirtyLeafIDs[i].indexOf(id) === 0) {+        isDirty = true;+        break;+      }+    }+    if (!isDirty && measurement.counts[id] > 0) {+      cleanComponents[id] = true;+    }+  }+  return cleanComponents;+}++var ReactDefaultPerfAnalysis = {+  getExclusiveSummary: getExclusiveSummary,+  getInclusiveSummary: getInclusiveSummary,+  getDOMSummary: getDOMSummary,+  getTotalTime: getTotalTime+};++module.exports = ReactDefaultPerfAnalysis;++},{"27":27}],57:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactElement+ */++'use strict';++var ReactContext = _dereq_(38);+var ReactCurrentOwner = _dereq_(39);++var assign = _dereq_(27);+var warning = _dereq_(154);++var RESERVED_PROPS = {+  key: true,+  ref: true+};++/**+ * Warn for mutations.+ *+ * @internal+ * @param {object} object+ * @param {string} key+ */+function defineWarningProperty(object, key) {+  Object.defineProperty(object, key, {++    configurable: false,+    enumerable: true,++    get: function() {+      if (!this._store) {+        return null;+      }+      return this._store[key];+    },++    set: function(value) {+      ("production" !== "development" ? warning(+        false,+        'Don\'t set the %s property of the React element. Instead, ' ++        'specify the correct value when initially creating the element.',+        key+      ) : null);+      this._store[key] = value;+    }++  });+}++/**+ * This is updated to true if the membrane is successfully created.+ */+var useMutationMembrane = false;++/**+ * Warn for mutations.+ *+ * @internal+ * @param {object} element+ */+function defineMutationMembrane(prototype) {+  try {+    var pseudoFrozenProperties = {+      props: true+    };+    for (var key in pseudoFrozenProperties) {+      defineWarningProperty(prototype, key);+    }+    useMutationMembrane = true;+  } catch (x) {+    // IE will fail on defineProperty+  }+}++/**+ * Base constructor for all React elements. This is only used to make this+ * work with a dynamic instanceof check. Nothing should live on this prototype.+ *+ * @param {*} type+ * @param {string|object} ref+ * @param {*} key+ * @param {*} props+ * @internal+ */+var ReactElement = function(type, key, ref, owner, context, props) {+  // Built-in properties that belong on the element+  this.type = type;+  this.key = key;+  this.ref = ref;++  // Record the component responsible for creating this element.+  this._owner = owner;++  // TODO: Deprecate withContext, and then the context becomes accessible+  // through the owner.+  this._context = context;++  if ("production" !== "development") {+    // The validation flag and props are currently mutative. We put them on+    // an external backing store so that we can freeze the whole object.+    // This can be replaced with a WeakMap once they are implemented in+    // commonly used development environments.+    this._store = {props: props, originalProps: assign({}, props)};++    // To make comparing ReactElements easier for testing purposes, we make+    // the validation flag non-enumerable (where possible, which should+    // include every environment we run tests in), so the test framework+    // ignores it.+    try {+      Object.defineProperty(this._store, 'validated', {+        configurable: false,+        enumerable: false,+        writable: true+      });+    } catch (x) {+    }+    this._store.validated = false;++    // We're not allowed to set props directly on the object so we early+    // return and rely on the prototype membrane to forward to the backing+    // store.+    if (useMutationMembrane) {+      Object.freeze(this);+      return;+    }+  }++  this.props = props;+};++// We intentionally don't expose the function on the constructor property.+// ReactElement should be indistinguishable from a plain object.+ReactElement.prototype = {+  _isReactElement: true+};++if ("production" !== "development") {+  defineMutationMembrane(ReactElement.prototype);+}++ReactElement.createElement = function(type, config, children) {+  var propName;++  // Reserved names are extracted+  var props = {};++  var key = null;+  var ref = null;++  if (config != null) {+    ref = config.ref === undefined ? null : config.ref;+    key = config.key === undefined ? null : '' + config.key;+    // Remaining properties are added to a new props object+    for (propName in config) {+      if (config.hasOwnProperty(propName) &&+          !RESERVED_PROPS.hasOwnProperty(propName)) {+        props[propName] = config[propName];+      }+    }+  }++  // Children can be more than one argument, and those are transferred onto+  // the newly allocated props object.+  var childrenLength = arguments.length - 2;+  if (childrenLength === 1) {+    props.children = children;+  } else if (childrenLength > 1) {+    var childArray = Array(childrenLength);+    for (var i = 0; i < childrenLength; i++) {+      childArray[i] = arguments[i + 2];+    }+    props.children = childArray;+  }++  // Resolve default props+  if (type && type.defaultProps) {+    var defaultProps = type.defaultProps;+    for (propName in defaultProps) {+      if (typeof props[propName] === 'undefined') {+        props[propName] = defaultProps[propName];+      }+    }+  }++  return new ReactElement(+    type,+    key,+    ref,+    ReactCurrentOwner.current,+    ReactContext.current,+    props+  );+};++ReactElement.createFactory = function(type) {+  var factory = ReactElement.createElement.bind(null, type);+  // Expose the type on the factory and the prototype so that it can be+  // easily accessed on elements. E.g. <Foo />.type === Foo.type.+  // This should not be named `constructor` since this may not be the function+  // that created the element, and it may not even be a constructor.+  // Legacy hook TODO: Warn if this is accessed+  factory.type = type;+  return factory;+};++ReactElement.cloneAndReplaceProps = function(oldElement, newProps) {+  var newElement = new ReactElement(+    oldElement.type,+    oldElement.key,+    oldElement.ref,+    oldElement._owner,+    oldElement._context,+    newProps+  );++  if ("production" !== "development") {+    // If the key on the original is valid, then the clone is valid+    newElement._store.validated = oldElement._store.validated;+  }+  return newElement;+};++ReactElement.cloneElement = function(element, config, children) {+  var propName;++  // Original props are copied+  var props = assign({}, element.props);++  // Reserved names are extracted+  var key = element.key;+  var ref = element.ref;++  // Owner will be preserved, unless ref is overridden+  var owner = element._owner;++  if (config != null) {+    if (config.ref !== undefined) {+      // Silently steal the ref from the parent.+      ref = config.ref;+      owner = ReactCurrentOwner.current;+    }+    if (config.key !== undefined) {+      key = '' + config.key;+    }+    // Remaining properties override existing props+    for (propName in config) {+      if (config.hasOwnProperty(propName) &&+          !RESERVED_PROPS.hasOwnProperty(propName)) {+        props[propName] = config[propName];+      }+    }+  }++  // Children can be more than one argument, and those are transferred onto+  // the newly allocated props object.+  var childrenLength = arguments.length - 2;+  if (childrenLength === 1) {+    props.children = children;+  } else if (childrenLength > 1) {+    var childArray = Array(childrenLength);+    for (var i = 0; i < childrenLength; i++) {+      childArray[i] = arguments[i + 2];+    }+    props.children = childArray;+  }++  return new ReactElement(+    element.type,+    key,+    ref,+    owner,+    element._context,+    props+  );+};++/**+ * @param {?object} object+ * @return {boolean} True if `object` is a valid component.+ * @final+ */+ReactElement.isValidElement = function(object) {+  // ReactTestUtils is often used outside of beforeEach where as React is+  // within it. This leads to two different instances of React on the same+  // page. To identify a element from a different React instance we use+  // a flag instead of an instanceof check.+  var isElement = !!(object && object._isReactElement);+  // if (isElement && !(object instanceof ReactElement)) {+  // This is an indicator that you're using multiple versions of React at the+  // same time. This will screw with ownership and stuff. Fix it, please.+  // TODO: We could possibly warn here.+  // }+  return isElement;+};++module.exports = ReactElement;++},{"154":154,"27":27,"38":38,"39":39}],58:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactElementValidator+ */++/**+ * ReactElementValidator provides a wrapper around a element factory+ * which validates the props passed to the element. This is intended to be+ * used only in DEV and could be replaced by a static type checker for languages+ * that support it.+ */++'use strict';++var ReactElement = _dereq_(57);+var ReactFragment = _dereq_(63);+var ReactPropTypeLocations = _dereq_(77);+var ReactPropTypeLocationNames = _dereq_(76);+var ReactCurrentOwner = _dereq_(39);+var ReactNativeComponent = _dereq_(73);++var getIteratorFn = _dereq_(126);+var invariant = _dereq_(135);+var warning = _dereq_(154);++function getDeclarationErrorAddendum() {+  if (ReactCurrentOwner.current) {+    var name = ReactCurrentOwner.current.getName();+    if (name) {+      return ' Check the render method of `' + name + '`.';+    }+  }+  return '';+}++/**+ * Warn if there's no key explicitly set on dynamic arrays of children or+ * object keys are not valid. This allows us to keep track of children between+ * updates.+ */+var ownerHasKeyUseWarning = {};++var loggedTypeFailures = {};++var NUMERIC_PROPERTY_REGEX = /^\d+$/;++/**+ * Gets the instance's name for use in warnings.+ *+ * @internal+ * @return {?string} Display name or undefined+ */+function getName(instance) {+  var publicInstance = instance && instance.getPublicInstance();+  if (!publicInstance) {+    return undefined;+  }+  var constructor = publicInstance.constructor;+  if (!constructor) {+    return undefined;+  }+  return constructor.displayName || constructor.name || undefined;+}++/**+ * Gets the current owner's displayName for use in warnings.+ *+ * @internal+ * @return {?string} Display name or undefined+ */+function getCurrentOwnerDisplayName() {+  var current = ReactCurrentOwner.current;+  return (+    current && getName(current) || undefined+  );+}++/**+ * Warn if the element doesn't have an explicit key assigned to it.+ * This element is in an array. The array could grow and shrink or be+ * reordered. All children that haven't already been validated are required to+ * have a "key" property assigned to it.+ *+ * @internal+ * @param {ReactElement} element Element that requires a key.+ * @param {*} parentType element's parent's type.+ */+function validateExplicitKey(element, parentType) {+  if (element._store.validated || element.key != null) {+    return;+  }+  element._store.validated = true;++  warnAndMonitorForKeyUse(+    'Each child in an array or iterator should have a unique "key" prop.',+    element,+    parentType+  );+}++/**+ * Warn if the key is being defined as an object property but has an incorrect+ * value.+ *+ * @internal+ * @param {string} name Property name of the key.+ * @param {ReactElement} element Component that requires a key.+ * @param {*} parentType element's parent's type.+ */+function validatePropertyKey(name, element, parentType) {+  if (!NUMERIC_PROPERTY_REGEX.test(name)) {+    return;+  }+  warnAndMonitorForKeyUse(+    'Child objects should have non-numeric keys so ordering is preserved.',+    element,+    parentType+  );+}++/**+ * Shared warning and monitoring code for the key warnings.+ *+ * @internal+ * @param {string} message The base warning that gets output.+ * @param {ReactElement} element Component that requires a key.+ * @param {*} parentType element's parent's type.+ */+function warnAndMonitorForKeyUse(message, element, parentType) {+  var ownerName = getCurrentOwnerDisplayName();+  var parentName = typeof parentType === 'string' ?+    parentType : parentType.displayName || parentType.name;++  var useName = ownerName || parentName;+  var memoizer = ownerHasKeyUseWarning[message] || (+    (ownerHasKeyUseWarning[message] = {})+  );+  if (memoizer.hasOwnProperty(useName)) {+    return;+  }+  memoizer[useName] = true;++  var parentOrOwnerAddendum =+    ownerName ? (" Check the render method of " + ownerName + ".") :+    parentName ? (" Check the React.render call using <" + parentName + ">.") :+    '';++  // Usually the current owner is the offender, but if it accepts children as a+  // property, it may be the creator of the child that's responsible for+  // assigning it a key.+  var childOwnerAddendum = '';+  if (element &&+      element._owner &&+      element._owner !== ReactCurrentOwner.current) {+    // Name of the component that originally created this child.+    var childOwnerName = getName(element._owner);++    childOwnerAddendum = (" It was passed a child from " + childOwnerName + ".");+  }++  ("production" !== "development" ? warning(+    false,+    message + '%s%s See https://fb.me/react-warning-keys for more information.',+    parentOrOwnerAddendum,+    childOwnerAddendum+  ) : null);+}++/**+ * Ensure that every element either is passed in a static location, in an+ * array with an explicit keys property defined, or in an object literal+ * with valid key property.+ *+ * @internal+ * @param {ReactNode} node Statically passed child of any type.+ * @param {*} parentType node's parent's type.+ */+function validateChildKeys(node, parentType) {+  if (Array.isArray(node)) {+    for (var i = 0; i < node.length; i++) {+      var child = node[i];+      if (ReactElement.isValidElement(child)) {+        validateExplicitKey(child, parentType);+      }+    }+  } else if (ReactElement.isValidElement(node)) {+    // This element was passed in a valid location.+    node._store.validated = true;+  } else if (node) {+    var iteratorFn = getIteratorFn(node);+    // Entry iterators provide implicit keys.+    if (iteratorFn) {+      if (iteratorFn !== node.entries) {+        var iterator = iteratorFn.call(node);+        var step;+        while (!(step = iterator.next()).done) {+          if (ReactElement.isValidElement(step.value)) {+            validateExplicitKey(step.value, parentType);+          }+        }+      }+    } else if (typeof node === 'object') {+      var fragment = ReactFragment.extractIfFragment(node);+      for (var key in fragment) {+        if (fragment.hasOwnProperty(key)) {+          validatePropertyKey(key, fragment[key], parentType);+        }+      }+    }+  }+}++/**+ * Assert that the props are valid+ *+ * @param {string} componentName Name of the component for error messages.+ * @param {object} propTypes Map of prop name to a ReactPropType+ * @param {object} props+ * @param {string} location e.g. "prop", "context", "child context"+ * @private+ */+function checkPropTypes(componentName, propTypes, props, location) {+  for (var propName in propTypes) {+    if (propTypes.hasOwnProperty(propName)) {+      var error;+      // Prop type validation may throw. In case they do, we don't want to+      // fail the render phase where it didn't fail before. So we log it.+      // After these have been cleaned up, we'll let them throw.+      try {+        // This is intentionally an invariant that gets caught. It's the same+        // behavior as without this statement except with a better message.+        ("production" !== "development" ? invariant(+          typeof propTypes[propName] === 'function',+          '%s: %s type `%s` is invalid; it must be a function, usually from ' ++          'React.PropTypes.',+          componentName || 'React class',+          ReactPropTypeLocationNames[location],+          propName+        ) : invariant(typeof propTypes[propName] === 'function'));+        error = propTypes[propName](props, propName, componentName, location);+      } catch (ex) {+        error = ex;+      }+      if (error instanceof Error && !(error.message in loggedTypeFailures)) {+        // Only monitor this failure once because there tends to be a lot of the+        // same error.+        loggedTypeFailures[error.message] = true;++        var addendum = getDeclarationErrorAddendum(this);+        ("production" !== "development" ? warning(false, 'Failed propType: %s%s', error.message, addendum) : null);+      }+    }+  }+}++var warnedPropsMutations = {};++/**+ * Warn about mutating props when setting `propName` on `element`.+ *+ * @param {string} propName The string key within props that was set+ * @param {ReactElement} element+ */+function warnForPropsMutation(propName, element) {+  var type = element.type;+  var elementName = typeof type === 'string' ? type : type.displayName;+  var ownerName = element._owner ?+    element._owner.getPublicInstance().constructor.displayName : null;++  var warningKey = propName + '|' + elementName + '|' + ownerName;+  if (warnedPropsMutations.hasOwnProperty(warningKey)) {+    return;+  }+  warnedPropsMutations[warningKey] = true;++  var elementInfo = '';+  if (elementName) {+    elementInfo = ' <' + elementName + ' />';+  }+  var ownerInfo = '';+  if (ownerName) {+    ownerInfo = ' The element was created by ' + ownerName + '.';+  }++  ("production" !== "development" ? warning(+    false,+    'Don\'t set .props.%s of the React component%s. Instead, specify the ' ++    'correct value when initially creating the element or use ' ++    'React.cloneElement to make a new element with updated props.%s',+    propName,+    elementInfo,+    ownerInfo+  ) : null);+}++// Inline Object.is polyfill+function is(a, b) {+  if (a !== a) {+    // NaN+    return b !== b;+  }+  if (a === 0 && b === 0) {+    // +-0+    return 1 / a === 1 / b;+  }+  return a === b;+}++/**+ * Given an element, check if its props have been mutated since element+ * creation (or the last call to this function). In particular, check if any+ * new props have been added, which we can't directly catch by defining warning+ * properties on the props object.+ *+ * @param {ReactElement} element+ */+function checkAndWarnForMutatedProps(element) {+  if (!element._store) {+    // Element was created using `new ReactElement` directly or with+    // `ReactElement.createElement`; skip mutation checking+    return;+  }++  var originalProps = element._store.originalProps;+  var props = element.props;++  for (var propName in props) {+    if (props.hasOwnProperty(propName)) {+      if (!originalProps.hasOwnProperty(propName) ||+          !is(originalProps[propName], props[propName])) {+        warnForPropsMutation(propName, element);++        // Copy over the new value so that the two props objects match again+        originalProps[propName] = props[propName];+      }+    }+  }+}++/**+ * Given an element, validate that its props follow the propTypes definition,+ * provided by the type.+ *+ * @param {ReactElement} element+ */+function validatePropTypes(element) {+  if (element.type == null) {+    // This has already warned. Don't throw.+    return;+  }+  // Extract the component class from the element. Converts string types+  // to a composite class which may have propTypes.+  // TODO: Validating a string's propTypes is not decoupled from the+  // rendering target which is problematic.+  var componentClass = ReactNativeComponent.getComponentClassForElement(+    element+  );+  var name = componentClass.displayName || componentClass.name;+  if (componentClass.propTypes) {+    checkPropTypes(+      name,+      componentClass.propTypes,+      element.props,+      ReactPropTypeLocations.prop+    );+  }+  if (typeof componentClass.getDefaultProps === 'function') {+    ("production" !== "development" ? warning(+      componentClass.getDefaultProps.isReactClassApproved,+      'getDefaultProps is only used on classic React.createClass ' ++      'definitions. Use a static property named `defaultProps` instead.'+    ) : null);+  }+}++var ReactElementValidator = {++  checkAndWarnForMutatedProps: checkAndWarnForMutatedProps,++  createElement: function(type, props, children) {+    // We warn in this case but don't throw. We expect the element creation to+    // succeed and there will likely be errors in render.+    ("production" !== "development" ? warning(+      type != null,+      'React.createElement: type should not be null or undefined. It should ' ++        'be a string (for DOM elements) or a ReactClass (for composite ' ++        'components).'+    ) : null);++    var element = ReactElement.createElement.apply(this, arguments);++    // The result can be nullish if a mock or a custom function is used.+    // TODO: Drop this when these are no longer allowed as the type argument.+    if (element == null) {+      return element;+    }++    for (var i = 2; i < arguments.length; i++) {+      validateChildKeys(arguments[i], type);+    }++    validatePropTypes(element);++    return element;+  },++  createFactory: function(type) {+    var validatedFactory = ReactElementValidator.createElement.bind(+      null,+      type+    );+    // Legacy hook TODO: Warn if this is accessed+    validatedFactory.type = type;++    if ("production" !== "development") {+      try {+        Object.defineProperty(+          validatedFactory,+          'type',+          {+            enumerable: false,+            get: function() {+              ("production" !== "development" ? warning(+                false,+                'Factory.type is deprecated. Access the class directly ' ++                'before passing it to createFactory.'+              ) : null);+              Object.defineProperty(this, 'type', {+                value: type+              });+              return type;+            }+          }+        );+      } catch (x) {+        // IE will fail on defineProperty (es5-shim/sham too)+      }+    }+++    return validatedFactory;+  },++  cloneElement: function(element, props, children) {+    var newElement = ReactElement.cloneElement.apply(this, arguments);+    for (var i = 2; i < arguments.length; i++) {+      validateChildKeys(arguments[i], newElement.type);+    }+    validatePropTypes(newElement);+    return newElement;+  }++};++module.exports = ReactElementValidator;++},{"126":126,"135":135,"154":154,"39":39,"57":57,"63":63,"73":73,"76":76,"77":77}],59:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactEmptyComponent+ */++'use strict';++var ReactElement = _dereq_(57);+var ReactInstanceMap = _dereq_(67);++var invariant = _dereq_(135);++var component;+// This registry keeps track of the React IDs of the components that rendered to+// `null` (in reality a placeholder such as `noscript`)+var nullComponentIDsRegistry = {};++var ReactEmptyComponentInjection = {+  injectEmptyComponent: function(emptyComponent) {+    component = ReactElement.createFactory(emptyComponent);+  }+};++var ReactEmptyComponentType = function() {};+ReactEmptyComponentType.prototype.componentDidMount = function() {+  var internalInstance = ReactInstanceMap.get(this);+  // TODO: Make sure we run these methods in the correct order, we shouldn't+  // need this check. We're going to assume if we're here it means we ran+  // componentWillUnmount already so there is no internal instance (it gets+  // removed as part of the unmounting process).+  if (!internalInstance) {+    return;+  }+  registerNullComponentID(internalInstance._rootNodeID);+};+ReactEmptyComponentType.prototype.componentWillUnmount = function() {+  var internalInstance = ReactInstanceMap.get(this);+  // TODO: Get rid of this check. See TODO in componentDidMount.+  if (!internalInstance) {+    return;+  }+  deregisterNullComponentID(internalInstance._rootNodeID);+};+ReactEmptyComponentType.prototype.render = function() {+  ("production" !== "development" ? invariant(+    component,+    'Trying to return null from a render, but no null placeholder component ' ++    'was injected.'+  ) : invariant(component));+  return component();+};++var emptyElement = ReactElement.createElement(ReactEmptyComponentType);++/**+ * Mark the component as having rendered to null.+ * @param {string} id Component's `_rootNodeID`.+ */+function registerNullComponentID(id) {+  nullComponentIDsRegistry[id] = true;+}++/**+ * Unmark the component as having rendered to null: it renders to something now.+ * @param {string} id Component's `_rootNodeID`.+ */+function deregisterNullComponentID(id) {+  delete nullComponentIDsRegistry[id];+}++/**+ * @param {string} id Component's `_rootNodeID`.+ * @return {boolean} True if the component is rendered to null.+ */+function isNullComponentID(id) {+  return !!nullComponentIDsRegistry[id];+}++var ReactEmptyComponent = {+  emptyElement: emptyElement,+  injection: ReactEmptyComponentInjection,+  isNullComponentID: isNullComponentID+};++module.exports = ReactEmptyComponent;++},{"135":135,"57":57,"67":67}],60:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactErrorUtils+ * @typechecks+ */++"use strict";++var ReactErrorUtils = {+  /**+   * Creates a guarded version of a function. This is supposed to make debugging+   * of event handlers easier. To aid debugging with the browser's debugger,+   * this currently simply returns the original function.+   *+   * @param {function} func Function to be executed+   * @param {string} name The name of the guard+   * @return {function}+   */+  guard: function(func, name) {+    return func;+  }+};++module.exports = ReactErrorUtils;++},{}],61:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactEventEmitterMixin+ */++'use strict';++var EventPluginHub = _dereq_(17);++function runEventQueueInBatch(events) {+  EventPluginHub.enqueueEvents(events);+  EventPluginHub.processEventQueue();+}++var ReactEventEmitterMixin = {++  /**+   * Streams a fired top-level event to `EventPluginHub` where plugins have the+   * opportunity to create `ReactEvent`s to be dispatched.+   *+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {object} topLevelTarget The listening component root node.+   * @param {string} topLevelTargetID ID of `topLevelTarget`.+   * @param {object} nativeEvent Native environment event.+   */+  handleTopLevel: function(+      topLevelType,+      topLevelTarget,+      topLevelTargetID,+      nativeEvent) {+    var events = EventPluginHub.extractEvents(+      topLevelType,+      topLevelTarget,+      topLevelTargetID,+      nativeEvent+    );++    runEventQueueInBatch(events);+  }+};++module.exports = ReactEventEmitterMixin;++},{"17":17}],62:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactEventListener+ * @typechecks static-only+ */++'use strict';++var EventListener = _dereq_(16);+var ExecutionEnvironment = _dereq_(21);+var PooledClass = _dereq_(28);+var ReactInstanceHandles = _dereq_(66);+var ReactMount = _dereq_(70);+var ReactUpdates = _dereq_(87);++var assign = _dereq_(27);+var getEventTarget = _dereq_(125);+var getUnboundedScrollPosition = _dereq_(131);++/**+ * Finds the parent React component of `node`.+ *+ * @param {*} node+ * @return {?DOMEventTarget} Parent container, or `null` if the specified node+ *                           is not nested.+ */+function findParent(node) {+  // TODO: It may be a good idea to cache this to prevent unnecessary DOM+  // traversal, but caching is difficult to do correctly without using a+  // mutation observer to listen for all DOM changes.+  var nodeID = ReactMount.getID(node);+  var rootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID);+  var container = ReactMount.findReactContainerForID(rootID);+  var parent = ReactMount.getFirstReactDOM(container);+  return parent;+}++// Used to store ancestor hierarchy in top level callback+function TopLevelCallbackBookKeeping(topLevelType, nativeEvent) {+  this.topLevelType = topLevelType;+  this.nativeEvent = nativeEvent;+  this.ancestors = [];+}+assign(TopLevelCallbackBookKeeping.prototype, {+  destructor: function() {+    this.topLevelType = null;+    this.nativeEvent = null;+    this.ancestors.length = 0;+  }+});+PooledClass.addPoolingTo(+  TopLevelCallbackBookKeeping,+  PooledClass.twoArgumentPooler+);++function handleTopLevelImpl(bookKeeping) {+  var topLevelTarget = ReactMount.getFirstReactDOM(+    getEventTarget(bookKeeping.nativeEvent)+  ) || window;++  // Loop through the hierarchy, in case there's any nested components.+  // It's important that we build the array of ancestors before calling any+  // event handlers, because event handlers can modify the DOM, leading to+  // inconsistencies with ReactMount's node cache. See #1105.+  var ancestor = topLevelTarget;+  while (ancestor) {+    bookKeeping.ancestors.push(ancestor);+    ancestor = findParent(ancestor);+  }++  for (var i = 0, l = bookKeeping.ancestors.length; i < l; i++) {+    topLevelTarget = bookKeeping.ancestors[i];+    var topLevelTargetID = ReactMount.getID(topLevelTarget) || '';+    ReactEventListener._handleTopLevel(+      bookKeeping.topLevelType,+      topLevelTarget,+      topLevelTargetID,+      bookKeeping.nativeEvent+    );+  }+}++function scrollValueMonitor(cb) {+  var scrollPosition = getUnboundedScrollPosition(window);+  cb(scrollPosition);+}++var ReactEventListener = {+  _enabled: true,+  _handleTopLevel: null,++  WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null,++  setHandleTopLevel: function(handleTopLevel) {+    ReactEventListener._handleTopLevel = handleTopLevel;+  },++  setEnabled: function(enabled) {+    ReactEventListener._enabled = !!enabled;+  },++  isEnabled: function() {+    return ReactEventListener._enabled;+  },+++  /**+   * Traps top-level events by using event bubbling.+   *+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {string} handlerBaseName Event name (e.g. "click").+   * @param {object} handle Element on which to attach listener.+   * @return {object} An object with a remove function which will forcefully+   *                  remove the listener.+   * @internal+   */+  trapBubbledEvent: function(topLevelType, handlerBaseName, handle) {+    var element = handle;+    if (!element) {+      return null;+    }+    return EventListener.listen(+      element,+      handlerBaseName,+      ReactEventListener.dispatchEvent.bind(null, topLevelType)+    );+  },++  /**+   * Traps a top-level event by using event capturing.+   *+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {string} handlerBaseName Event name (e.g. "click").+   * @param {object} handle Element on which to attach listener.+   * @return {object} An object with a remove function which will forcefully+   *                  remove the listener.+   * @internal+   */+  trapCapturedEvent: function(topLevelType, handlerBaseName, handle) {+    var element = handle;+    if (!element) {+      return null;+    }+    return EventListener.capture(+      element,+      handlerBaseName,+      ReactEventListener.dispatchEvent.bind(null, topLevelType)+    );+  },++  monitorScrollValue: function(refresh) {+    var callback = scrollValueMonitor.bind(null, refresh);+    EventListener.listen(window, 'scroll', callback);+  },++  dispatchEvent: function(topLevelType, nativeEvent) {+    if (!ReactEventListener._enabled) {+      return;+    }++    var bookKeeping = TopLevelCallbackBookKeeping.getPooled(+      topLevelType,+      nativeEvent+    );+    try {+      // Event queue being processed in the same cycle allows+      // `preventDefault`.+      ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping);+    } finally {+      TopLevelCallbackBookKeeping.release(bookKeeping);+    }+  }+};++module.exports = ReactEventListener;++},{"125":125,"131":131,"16":16,"21":21,"27":27,"28":28,"66":66,"70":70,"87":87}],63:[function(_dereq_,module,exports){+/**+ * Copyright 2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+* @providesModule ReactFragment+*/++'use strict';++var ReactElement = _dereq_(57);++var warning = _dereq_(154);++/**+ * We used to allow keyed objects to serve as a collection of ReactElements,+ * or nested sets. This allowed us a way to explicitly key a set a fragment of+ * components. This is now being replaced with an opaque data structure.+ * The upgrade path is to call React.addons.createFragment({ key: value }) to+ * create a keyed fragment. The resulting data structure is opaque, for now.+ */++if ("production" !== "development") {+  var fragmentKey = '_reactFragment';+  var didWarnKey = '_reactDidWarn';+  var canWarnForReactFragment = false;++  try {+    // Feature test. Don't even try to issue this warning if we can't use+    // enumerable: false.++    var dummy = function() {+      return 1;+    };++    Object.defineProperty(+      {},+      fragmentKey,+      {enumerable: false, value: true}+    );++    Object.defineProperty(+      {},+      'key',+      {enumerable: true, get: dummy}+    );++    canWarnForReactFragment = true;+  } catch (x) { }++  var proxyPropertyAccessWithWarning = function(obj, key) {+    Object.defineProperty(obj, key, {+      enumerable: true,+      get: function() {+        ("production" !== "development" ? warning(+          this[didWarnKey],+          'A ReactFragment is an opaque type. Accessing any of its ' ++          'properties is deprecated. Pass it to one of the React.Children ' ++          'helpers.'+        ) : null);+        this[didWarnKey] = true;+        return this[fragmentKey][key];+      },+      set: function(value) {+        ("production" !== "development" ? warning(+          this[didWarnKey],+          'A ReactFragment is an immutable opaque type. Mutating its ' ++          'properties is deprecated.'+        ) : null);+        this[didWarnKey] = true;+        this[fragmentKey][key] = value;+      }+    });+  };++  var issuedWarnings = {};++  var didWarnForFragment = function(fragment) {+    // We use the keys and the type of the value as a heuristic to dedupe the+    // warning to avoid spamming too much.+    var fragmentCacheKey = '';+    for (var key in fragment) {+      fragmentCacheKey += key + ':' + (typeof fragment[key]) + ',';+    }+    var alreadyWarnedOnce = !!issuedWarnings[fragmentCacheKey];+    issuedWarnings[fragmentCacheKey] = true;+    return alreadyWarnedOnce;+  };+}++var ReactFragment = {+  // Wrap a keyed object in an opaque proxy that warns you if you access any+  // of its properties.+  create: function(object) {+    if ("production" !== "development") {+      if (typeof object !== 'object' || !object || Array.isArray(object)) {+        ("production" !== "development" ? warning(+          false,+          'React.addons.createFragment only accepts a single object.',+          object+        ) : null);+        return object;+      }+      if (ReactElement.isValidElement(object)) {+        ("production" !== "development" ? warning(+          false,+          'React.addons.createFragment does not accept a ReactElement ' ++          'without a wrapper object.'+        ) : null);+        return object;+      }+      if (canWarnForReactFragment) {+        var proxy = {};+        Object.defineProperty(proxy, fragmentKey, {+          enumerable: false,+          value: object+        });+        Object.defineProperty(proxy, didWarnKey, {+          writable: true,+          enumerable: false,+          value: false+        });+        for (var key in object) {+          proxyPropertyAccessWithWarning(proxy, key);+        }+        Object.preventExtensions(proxy);+        return proxy;+      }+    }+    return object;+  },+  // Extract the original keyed object from the fragment opaque type. Warn if+  // a plain object is passed here.+  extract: function(fragment) {+    if ("production" !== "development") {+      if (canWarnForReactFragment) {+        if (!fragment[fragmentKey]) {+          ("production" !== "development" ? warning(+            didWarnForFragment(fragment),+            'Any use of a keyed object should be wrapped in ' ++            'React.addons.createFragment(object) before being passed as a ' ++            'child.'+          ) : null);+          return fragment;+        }+        return fragment[fragmentKey];+      }+    }+    return fragment;+  },+  // Check if this is a fragment and if so, extract the keyed object. If it+  // is a fragment-like object, warn that it should be wrapped. Ignore if we+  // can't determine what kind of object this is.+  extractIfFragment: function(fragment) {+    if ("production" !== "development") {+      if (canWarnForReactFragment) {+        // If it is the opaque type, return the keyed object.+        if (fragment[fragmentKey]) {+          return fragment[fragmentKey];+        }+        // Otherwise, check each property if it has an element, if it does+        // it is probably meant as a fragment, so we can warn early. Defer,+        // the warning to extract.+        for (var key in fragment) {+          if (fragment.hasOwnProperty(key) &&+              ReactElement.isValidElement(fragment[key])) {+            // This looks like a fragment object, we should provide an+            // early warning.+            return ReactFragment.extract(fragment);+          }+        }+      }+    }+    return fragment;+  }+};++module.exports = ReactFragment;++},{"154":154,"57":57}],64:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactInjection+ */++'use strict';++var DOMProperty = _dereq_(10);+var EventPluginHub = _dereq_(17);+var ReactComponentEnvironment = _dereq_(36);+var ReactClass = _dereq_(33);+var ReactEmptyComponent = _dereq_(59);+var ReactBrowserEventEmitter = _dereq_(30);+var ReactNativeComponent = _dereq_(73);+var ReactDOMComponent = _dereq_(42);+var ReactPerf = _dereq_(75);+var ReactRootIndex = _dereq_(83);+var ReactUpdates = _dereq_(87);++var ReactInjection = {+  Component: ReactComponentEnvironment.injection,+  Class: ReactClass.injection,+  DOMComponent: ReactDOMComponent.injection,+  DOMProperty: DOMProperty.injection,+  EmptyComponent: ReactEmptyComponent.injection,+  EventPluginHub: EventPluginHub.injection,+  EventEmitter: ReactBrowserEventEmitter.injection,+  NativeComponent: ReactNativeComponent.injection,+  Perf: ReactPerf.injection,+  RootIndex: ReactRootIndex.injection,+  Updates: ReactUpdates.injection+};++module.exports = ReactInjection;++},{"10":10,"17":17,"30":30,"33":33,"36":36,"42":42,"59":59,"73":73,"75":75,"83":83,"87":87}],65:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactInputSelection+ */++'use strict';++var ReactDOMSelection = _dereq_(50);++var containsNode = _dereq_(109);+var focusNode = _dereq_(119);+var getActiveElement = _dereq_(121);++function isInDocument(node) {+  return containsNode(document.documentElement, node);+}++/**+ * @ReactInputSelection: React input selection module. Based on Selection.js,+ * but modified to be suitable for react and has a couple of bug fixes (doesn't+ * assume buttons have range selections allowed).+ * Input selection module for React.+ */+var ReactInputSelection = {++  hasSelectionCapabilities: function(elem) {+    return elem && (+      ((elem.nodeName === 'INPUT' && elem.type === 'text') ||+      elem.nodeName === 'TEXTAREA' || elem.contentEditable === 'true')+    );+  },++  getSelectionInformation: function() {+    var focusedElem = getActiveElement();+    return {+      focusedElem: focusedElem,+      selectionRange:+          ReactInputSelection.hasSelectionCapabilities(focusedElem) ?+          ReactInputSelection.getSelection(focusedElem) :+          null+    };+  },++  /**+   * @restoreSelection: If any selection information was potentially lost,+   * restore it. This is useful when performing operations that could remove dom+   * nodes and place them back in, resulting in focus being lost.+   */+  restoreSelection: function(priorSelectionInformation) {+    var curFocusedElem = getActiveElement();+    var priorFocusedElem = priorSelectionInformation.focusedElem;+    var priorSelectionRange = priorSelectionInformation.selectionRange;+    if (curFocusedElem !== priorFocusedElem &&+        isInDocument(priorFocusedElem)) {+      if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {+        ReactInputSelection.setSelection(+          priorFocusedElem,+          priorSelectionRange+        );+      }+      focusNode(priorFocusedElem);+    }+  },++  /**+   * @getSelection: Gets the selection bounds of a focused textarea, input or+   * contentEditable node.+   * -@input: Look up selection bounds of this input+   * -@return {start: selectionStart, end: selectionEnd}+   */+  getSelection: function(input) {+    var selection;++    if ('selectionStart' in input) {+      // Modern browser with input or textarea.+      selection = {+        start: input.selectionStart,+        end: input.selectionEnd+      };+    } else if (document.selection && input.nodeName === 'INPUT') {+      // IE8 input.+      var range = document.selection.createRange();+      // There can only be one selection per document in IE, so it must+      // be in our element.+      if (range.parentElement() === input) {+        selection = {+          start: -range.moveStart('character', -input.value.length),+          end: -range.moveEnd('character', -input.value.length)+        };+      }+    } else {+      // Content editable or old IE textarea.+      selection = ReactDOMSelection.getOffsets(input);+    }++    return selection || {start: 0, end: 0};+  },++  /**+   * @setSelection: Sets the selection bounds of a textarea or input and focuses+   * the input.+   * -@input     Set selection bounds of this input or textarea+   * -@offsets   Object of same form that is returned from get*+   */+  setSelection: function(input, offsets) {+    var start = offsets.start;+    var end = offsets.end;+    if (typeof end === 'undefined') {+      end = start;+    }++    if ('selectionStart' in input) {+      input.selectionStart = start;+      input.selectionEnd = Math.min(end, input.value.length);+    } else if (document.selection && input.nodeName === 'INPUT') {+      var range = input.createTextRange();+      range.collapse(true);+      range.moveStart('character', start);+      range.moveEnd('character', end - start);+      range.select();+    } else {+      ReactDOMSelection.setOffsets(input, offsets);+    }+  }+};++module.exports = ReactInputSelection;++},{"109":109,"119":119,"121":121,"50":50}],66:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactInstanceHandles+ * @typechecks static-only+ */++'use strict';++var ReactRootIndex = _dereq_(83);++var invariant = _dereq_(135);++var SEPARATOR = '.';+var SEPARATOR_LENGTH = SEPARATOR.length;++/**+ * Maximum depth of traversals before we consider the possibility of a bad ID.+ */+var MAX_TREE_DEPTH = 100;++/**+ * Creates a DOM ID prefix to use when mounting React components.+ *+ * @param {number} index A unique integer+ * @return {string} React root ID.+ * @internal+ */+function getReactRootIDString(index) {+  return SEPARATOR + index.toString(36);+}++/**+ * Checks if a character in the supplied ID is a separator or the end.+ *+ * @param {string} id A React DOM ID.+ * @param {number} index Index of the character to check.+ * @return {boolean} True if the character is a separator or end of the ID.+ * @private+ */+function isBoundary(id, index) {+  return id.charAt(index) === SEPARATOR || index === id.length;+}++/**+ * Checks if the supplied string is a valid React DOM ID.+ *+ * @param {string} id A React DOM ID, maybe.+ * @return {boolean} True if the string is a valid React DOM ID.+ * @private+ */+function isValidID(id) {+  return id === '' || (+    id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR+  );+}++/**+ * Checks if the first ID is an ancestor of or equal to the second ID.+ *+ * @param {string} ancestorID+ * @param {string} descendantID+ * @return {boolean} True if `ancestorID` is an ancestor of `descendantID`.+ * @internal+ */+function isAncestorIDOf(ancestorID, descendantID) {+  return (+    descendantID.indexOf(ancestorID) === 0 &&+    isBoundary(descendantID, ancestorID.length)+  );+}++/**+ * Gets the parent ID of the supplied React DOM ID, `id`.+ *+ * @param {string} id ID of a component.+ * @return {string} ID of the parent, or an empty string.+ * @private+ */+function getParentID(id) {+  return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : '';+}++/**+ * Gets the next DOM ID on the tree path from the supplied `ancestorID` to the+ * supplied `destinationID`. If they are equal, the ID is returned.+ *+ * @param {string} ancestorID ID of an ancestor node of `destinationID`.+ * @param {string} destinationID ID of the destination node.+ * @return {string} Next ID on the path from `ancestorID` to `destinationID`.+ * @private+ */+function getNextDescendantID(ancestorID, destinationID) {+  ("production" !== "development" ? invariant(+    isValidID(ancestorID) && isValidID(destinationID),+    'getNextDescendantID(%s, %s): Received an invalid React DOM ID.',+    ancestorID,+    destinationID+  ) : invariant(isValidID(ancestorID) && isValidID(destinationID)));+  ("production" !== "development" ? invariant(+    isAncestorIDOf(ancestorID, destinationID),+    'getNextDescendantID(...): React has made an invalid assumption about ' ++    'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.',+    ancestorID,+    destinationID+  ) : invariant(isAncestorIDOf(ancestorID, destinationID)));+  if (ancestorID === destinationID) {+    return ancestorID;+  }+  // Skip over the ancestor and the immediate separator. Traverse until we hit+  // another separator or we reach the end of `destinationID`.+  var start = ancestorID.length + SEPARATOR_LENGTH;+  var i;+  for (i = start; i < destinationID.length; i++) {+    if (isBoundary(destinationID, i)) {+      break;+    }+  }+  return destinationID.substr(0, i);+}++/**+ * Gets the nearest common ancestor ID of two IDs.+ *+ * Using this ID scheme, the nearest common ancestor ID is the longest common+ * prefix of the two IDs that immediately preceded a "marker" in both strings.+ *+ * @param {string} oneID+ * @param {string} twoID+ * @return {string} Nearest common ancestor ID, or the empty string if none.+ * @private+ */+function getFirstCommonAncestorID(oneID, twoID) {+  var minLength = Math.min(oneID.length, twoID.length);+  if (minLength === 0) {+    return '';+  }+  var lastCommonMarkerIndex = 0;+  // Use `<=` to traverse until the "EOL" of the shorter string.+  for (var i = 0; i <= minLength; i++) {+    if (isBoundary(oneID, i) && isBoundary(twoID, i)) {+      lastCommonMarkerIndex = i;+    } else if (oneID.charAt(i) !== twoID.charAt(i)) {+      break;+    }+  }+  var longestCommonID = oneID.substr(0, lastCommonMarkerIndex);+  ("production" !== "development" ? invariant(+    isValidID(longestCommonID),+    'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s',+    oneID,+    twoID,+    longestCommonID+  ) : invariant(isValidID(longestCommonID)));+  return longestCommonID;+}++/**+ * Traverses the parent path between two IDs (either up or down). The IDs must+ * not be the same, and there must exist a parent path between them. If the+ * callback returns `false`, traversal is stopped.+ *+ * @param {?string} start ID at which to start traversal.+ * @param {?string} stop ID at which to end traversal.+ * @param {function} cb Callback to invoke each ID with.+ * @param {?boolean} skipFirst Whether or not to skip the first node.+ * @param {?boolean} skipLast Whether or not to skip the last node.+ * @private+ */+function traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) {+  start = start || '';+  stop = stop || '';+  ("production" !== "development" ? invariant(+    start !== stop,+    'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.',+    start+  ) : invariant(start !== stop));+  var traverseUp = isAncestorIDOf(stop, start);+  ("production" !== "development" ? invariant(+    traverseUp || isAncestorIDOf(start, stop),+    'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' ++    'not have a parent path.',+    start,+    stop+  ) : invariant(traverseUp || isAncestorIDOf(start, stop)));+  // Traverse from `start` to `stop` one depth at a time.+  var depth = 0;+  var traverse = traverseUp ? getParentID : getNextDescendantID;+  for (var id = start; /* until break */; id = traverse(id, stop)) {+    var ret;+    if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) {+      ret = cb(id, traverseUp, arg);+    }+    if (ret === false || id === stop) {+      // Only break //after// visiting `stop`.+      break;+    }+    ("production" !== "development" ? invariant(+      depth++ < MAX_TREE_DEPTH,+      'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' ++      'traversing the React DOM ID tree. This may be due to malformed IDs: %s',+      start, stop+    ) : invariant(depth++ < MAX_TREE_DEPTH));+  }+}++/**+ * Manages the IDs assigned to DOM representations of React components. This+ * uses a specific scheme in order to traverse the DOM efficiently (e.g. in+ * order to simulate events).+ *+ * @internal+ */+var ReactInstanceHandles = {++  /**+   * Constructs a React root ID+   * @return {string} A React root ID.+   */+  createReactRootID: function() {+    return getReactRootIDString(ReactRootIndex.createReactRootIndex());+  },++  /**+   * Constructs a React ID by joining a root ID with a name.+   *+   * @param {string} rootID Root ID of a parent component.+   * @param {string} name A component's name (as flattened children).+   * @return {string} A React ID.+   * @internal+   */+  createReactID: function(rootID, name) {+    return rootID + name;+  },++  /**+   * Gets the DOM ID of the React component that is the root of the tree that+   * contains the React component with the supplied DOM ID.+   *+   * @param {string} id DOM ID of a React component.+   * @return {?string} DOM ID of the React component that is the root.+   * @internal+   */+  getReactRootIDFromNodeID: function(id) {+    if (id && id.charAt(0) === SEPARATOR && id.length > 1) {+      var index = id.indexOf(SEPARATOR, 1);+      return index > -1 ? id.substr(0, index) : id;+    }+    return null;+  },++  /**+   * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that+   * should would receive a `mouseEnter` or `mouseLeave` event.+   *+   * NOTE: Does not invoke the callback on the nearest common ancestor because+   * nothing "entered" or "left" that element.+   *+   * @param {string} leaveID ID being left.+   * @param {string} enterID ID being entered.+   * @param {function} cb Callback to invoke on each entered/left ID.+   * @param {*} upArg Argument to invoke the callback with on left IDs.+   * @param {*} downArg Argument to invoke the callback with on entered IDs.+   * @internal+   */+  traverseEnterLeave: function(leaveID, enterID, cb, upArg, downArg) {+    var ancestorID = getFirstCommonAncestorID(leaveID, enterID);+    if (ancestorID !== leaveID) {+      traverseParentPath(leaveID, ancestorID, cb, upArg, false, true);+    }+    if (ancestorID !== enterID) {+      traverseParentPath(ancestorID, enterID, cb, downArg, true, false);+    }+  },++  /**+   * Simulates the traversal of a two-phase, capture/bubble event dispatch.+   *+   * NOTE: This traversal happens on IDs without touching the DOM.+   *+   * @param {string} targetID ID of the target node.+   * @param {function} cb Callback to invoke.+   * @param {*} arg Argument to invoke the callback with.+   * @internal+   */+  traverseTwoPhase: function(targetID, cb, arg) {+    if (targetID) {+      traverseParentPath('', targetID, cb, arg, true, false);+      traverseParentPath(targetID, '', cb, arg, false, true);+    }+  },++  /**+   * Traverse a node ID, calling the supplied `cb` for each ancestor ID. For+   * example, passing `.0.$row-0.1` would result in `cb` getting called+   * with `.0`, `.0.$row-0`, and `.0.$row-0.1`.+   *+   * NOTE: This traversal happens on IDs without touching the DOM.+   *+   * @param {string} targetID ID of the target node.+   * @param {function} cb Callback to invoke.+   * @param {*} arg Argument to invoke the callback with.+   * @internal+   */+  traverseAncestors: function(targetID, cb, arg) {+    traverseParentPath('', targetID, cb, arg, true, false);+  },++  /**+   * Exposed for unit testing.+   * @private+   */+  _getFirstCommonAncestorID: getFirstCommonAncestorID,++  /**+   * Exposed for unit testing.+   * @private+   */+  _getNextDescendantID: getNextDescendantID,++  isAncestorIDOf: isAncestorIDOf,++  SEPARATOR: SEPARATOR++};++module.exports = ReactInstanceHandles;++},{"135":135,"83":83}],67:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactInstanceMap+ */++'use strict';++/**+ * `ReactInstanceMap` maintains a mapping from a public facing stateful+ * instance (key) and the internal representation (value). This allows public+ * methods to accept the user facing instance as an argument and map them back+ * to internal methods.+ */++// TODO: Replace this with ES6: var ReactInstanceMap = new Map();+var ReactInstanceMap = {++  /**+   * This API should be called `delete` but we'd have to make sure to always+   * transform these to strings for IE support. When this transform is fully+   * supported we can rename it.+   */+  remove: function(key) {+    key._reactInternalInstance = undefined;+  },++  get: function(key) {+    return key._reactInternalInstance;+  },++  has: function(key) {+    return key._reactInternalInstance !== undefined;+  },++  set: function(key, value) {+    key._reactInternalInstance = value;+  }++};++module.exports = ReactInstanceMap;++},{}],68:[function(_dereq_,module,exports){+/**+ * Copyright 2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactLifeCycle+ */++'use strict';++/**+ * This module manages the bookkeeping when a component is in the process+ * of being mounted or being unmounted. This is used as a way to enforce+ * invariants (or warnings) when it is not recommended to call+ * setState/forceUpdate.+ *+ * currentlyMountingInstance: During the construction phase, it is not possible+ * to trigger an update since the instance is not fully mounted yet. However, we+ * currently allow this as a convenience for mutating the initial state.+ *+ * currentlyUnmountingInstance: During the unmounting phase, the instance is+ * still mounted and can therefore schedule an update. However, this is not+ * recommended and probably an error since it's about to be unmounted.+ * Therefore we still want to trigger in an error for that case.+ */++var ReactLifeCycle = {+  currentlyMountingInstance: null,+  currentlyUnmountingInstance: null+};++module.exports = ReactLifeCycle;++},{}],69:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactMarkupChecksum+ */++'use strict';++var adler32 = _dereq_(106);++var ReactMarkupChecksum = {+  CHECKSUM_ATTR_NAME: 'data-react-checksum',++  /**+   * @param {string} markup Markup string+   * @return {string} Markup string with checksum attribute attached+   */+  addChecksumToMarkup: function(markup) {+    var checksum = adler32(markup);+    return markup.replace(+      '>',+      ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '">'+    );+  },++  /**+   * @param {string} markup to use+   * @param {DOMElement} element root React element+   * @returns {boolean} whether or not the markup is the same+   */+  canReuseMarkup: function(markup, element) {+    var existingChecksum = element.getAttribute(+      ReactMarkupChecksum.CHECKSUM_ATTR_NAME+    );+    existingChecksum = existingChecksum && parseInt(existingChecksum, 10);+    var markupChecksum = adler32(markup);+    return markupChecksum === existingChecksum;+  }+};++module.exports = ReactMarkupChecksum;++},{"106":106}],70:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactMount+ */++'use strict';++var DOMProperty = _dereq_(10);+var ReactBrowserEventEmitter = _dereq_(30);+var ReactCurrentOwner = _dereq_(39);+var ReactElement = _dereq_(57);+var ReactElementValidator = _dereq_(58);+var ReactEmptyComponent = _dereq_(59);+var ReactInstanceHandles = _dereq_(66);+var ReactInstanceMap = _dereq_(67);+var ReactMarkupChecksum = _dereq_(69);+var ReactPerf = _dereq_(75);+var ReactReconciler = _dereq_(81);+var ReactUpdateQueue = _dereq_(86);+var ReactUpdates = _dereq_(87);++var emptyObject = _dereq_(115);+var containsNode = _dereq_(109);+var getReactRootElementInContainer = _dereq_(129);+var instantiateReactComponent = _dereq_(134);+var invariant = _dereq_(135);+var setInnerHTML = _dereq_(148);+var shouldUpdateReactComponent = _dereq_(151);+var warning = _dereq_(154);++var SEPARATOR = ReactInstanceHandles.SEPARATOR;++var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;+var nodeCache = {};++var ELEMENT_NODE_TYPE = 1;+var DOC_NODE_TYPE = 9;++/** Mapping from reactRootID to React component instance. */+var instancesByReactRootID = {};++/** Mapping from reactRootID to `container` nodes. */+var containersByReactRootID = {};++if ("production" !== "development") {+  /** __DEV__-only mapping from reactRootID to root elements. */+  var rootElementsByReactRootID = {};+}++// Used to store breadth-first search state in findComponentRoot.+var findComponentRootReusableArray = [];++/**+ * Finds the index of the first character+ * that's not common between the two given strings.+ *+ * @return {number} the index of the character where the strings diverge+ */+function firstDifferenceIndex(string1, string2) {+  var minLen = Math.min(string1.length, string2.length);+  for (var i = 0; i < minLen; i++) {+    if (string1.charAt(i) !== string2.charAt(i)) {+      return i;+    }+  }+  return string1.length === string2.length ? -1 : minLen;+}++/**+ * @param {DOMElement} container DOM element that may contain a React component.+ * @return {?string} A "reactRoot" ID, if a React component is rendered.+ */+function getReactRootID(container) {+  var rootElement = getReactRootElementInContainer(container);+  return rootElement && ReactMount.getID(rootElement);+}++/**+ * Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form+ * element can return its control whose name or ID equals ATTR_NAME. All+ * DOM nodes support `getAttributeNode` but this can also get called on+ * other objects so just return '' if we're given something other than a+ * DOM node (such as window).+ *+ * @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node.+ * @return {string} ID of the supplied `domNode`.+ */+function getID(node) {+  var id = internalGetID(node);+  if (id) {+    if (nodeCache.hasOwnProperty(id)) {+      var cached = nodeCache[id];+      if (cached !== node) {+        ("production" !== "development" ? invariant(+          !isValid(cached, id),+          'ReactMount: Two valid but unequal nodes with the same `%s`: %s',+          ATTR_NAME, id+        ) : invariant(!isValid(cached, id)));++        nodeCache[id] = node;+      }+    } else {+      nodeCache[id] = node;+    }+  }++  return id;+}++function internalGetID(node) {+  // If node is something like a window, document, or text node, none of+  // which support attributes or a .getAttribute method, gracefully return+  // the empty string, as if the attribute were missing.+  return node && node.getAttribute && node.getAttribute(ATTR_NAME) || '';+}++/**+ * Sets the React-specific ID of the given node.+ *+ * @param {DOMElement} node The DOM node whose ID will be set.+ * @param {string} id The value of the ID attribute.+ */+function setID(node, id) {+  var oldID = internalGetID(node);+  if (oldID !== id) {+    delete nodeCache[oldID];+  }+  node.setAttribute(ATTR_NAME, id);+  nodeCache[id] = node;+}++/**+ * Finds the node with the supplied React-generated DOM ID.+ *+ * @param {string} id A React-generated DOM ID.+ * @return {DOMElement} DOM node with the suppled `id`.+ * @internal+ */+function getNode(id) {+  if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {+    nodeCache[id] = ReactMount.findReactNodeByID(id);+  }+  return nodeCache[id];+}++/**+ * Finds the node with the supplied public React instance.+ *+ * @param {*} instance A public React instance.+ * @return {?DOMElement} DOM node with the suppled `id`.+ * @internal+ */+function getNodeFromInstance(instance) {+  var id = ReactInstanceMap.get(instance)._rootNodeID;+  if (ReactEmptyComponent.isNullComponentID(id)) {+    return null;+  }+  if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {+    nodeCache[id] = ReactMount.findReactNodeByID(id);+  }+  return nodeCache[id];+}++/**+ * A node is "valid" if it is contained by a currently mounted container.+ *+ * This means that the node does not have to be contained by a document in+ * order to be considered valid.+ *+ * @param {?DOMElement} node The candidate DOM node.+ * @param {string} id The expected ID of the node.+ * @return {boolean} Whether the node is contained by a mounted container.+ */+function isValid(node, id) {+  if (node) {+    ("production" !== "development" ? invariant(+      internalGetID(node) === id,+      'ReactMount: Unexpected modification of `%s`',+      ATTR_NAME+    ) : invariant(internalGetID(node) === id));++    var container = ReactMount.findReactContainerForID(id);+    if (container && containsNode(container, node)) {+      return true;+    }+  }++  return false;+}++/**+ * Causes the cache to forget about one React-specific ID.+ *+ * @param {string} id The ID to forget.+ */+function purgeID(id) {+  delete nodeCache[id];+}++var deepestNodeSoFar = null;+function findDeepestCachedAncestorImpl(ancestorID) {+  var ancestor = nodeCache[ancestorID];+  if (ancestor && isValid(ancestor, ancestorID)) {+    deepestNodeSoFar = ancestor;+  } else {+    // This node isn't populated in the cache, so presumably none of its+    // descendants are. Break out of the loop.+    return false;+  }+}++/**+ * Return the deepest cached node whose ID is a prefix of `targetID`.+ */+function findDeepestCachedAncestor(targetID) {+  deepestNodeSoFar = null;+  ReactInstanceHandles.traverseAncestors(+    targetID,+    findDeepestCachedAncestorImpl+  );++  var foundNode = deepestNodeSoFar;+  deepestNodeSoFar = null;+  return foundNode;+}++/**+ * Mounts this component and inserts it into the DOM.+ *+ * @param {ReactComponent} componentInstance The instance to mount.+ * @param {string} rootID DOM ID of the root node.+ * @param {DOMElement} container DOM element to mount into.+ * @param {ReactReconcileTransaction} transaction+ * @param {boolean} shouldReuseMarkup If true, do not insert markup+ */+function mountComponentIntoNode(+    componentInstance,+    rootID,+    container,+    transaction,+    shouldReuseMarkup) {+  var markup = ReactReconciler.mountComponent(+    componentInstance, rootID, transaction, emptyObject+  );+  componentInstance._isTopLevel = true;+  ReactMount._mountImageIntoNode(markup, container, shouldReuseMarkup);+}++/**+ * Batched mount.+ *+ * @param {ReactComponent} componentInstance The instance to mount.+ * @param {string} rootID DOM ID of the root node.+ * @param {DOMElement} container DOM element to mount into.+ * @param {boolean} shouldReuseMarkup If true, do not insert markup+ */+function batchedMountComponentIntoNode(+    componentInstance,+    rootID,+    container,+    shouldReuseMarkup) {+  var transaction = ReactUpdates.ReactReconcileTransaction.getPooled();+  transaction.perform(+    mountComponentIntoNode,+    null,+    componentInstance,+    rootID,+    container,+    transaction,+    shouldReuseMarkup+  );+  ReactUpdates.ReactReconcileTransaction.release(transaction);+}++/**+ * Mounting is the process of initializing a React component by creating its+ * representative DOM elements and inserting them into a supplied `container`.+ * Any prior content inside `container` is destroyed in the process.+ *+ *   ReactMount.render(+ *     component,+ *     document.getElementById('container')+ *   );+ *+ *   <div id="container">                   <-- Supplied `container`.+ *     <div data-reactid=".3">              <-- Rendered reactRoot of React+ *       // ...                                 component.+ *     </div>+ *   </div>+ *+ * Inside of `container`, the first element rendered is the "reactRoot".+ */+var ReactMount = {+  /** Exposed for debugging purposes **/+  _instancesByReactRootID: instancesByReactRootID,++  /**+   * This is a hook provided to support rendering React components while+   * ensuring that the apparent scroll position of its `container` does not+   * change.+   *+   * @param {DOMElement} container The `container` being rendered into.+   * @param {function} renderCallback This must be called once to do the render.+   */+  scrollMonitor: function(container, renderCallback) {+    renderCallback();+  },++  /**+   * Take a component that's already mounted into the DOM and replace its props+   * @param {ReactComponent} prevComponent component instance already in the DOM+   * @param {ReactElement} nextElement component instance to render+   * @param {DOMElement} container container to render into+   * @param {?function} callback function triggered on completion+   */+  _updateRootComponent: function(+      prevComponent,+      nextElement,+      container,+      callback) {+    if ("production" !== "development") {+      ReactElementValidator.checkAndWarnForMutatedProps(nextElement);+    }++    ReactMount.scrollMonitor(container, function() {+      ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement);+      if (callback) {+        ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback);+      }+    });++    if ("production" !== "development") {+      // Record the root element in case it later gets transplanted.+      rootElementsByReactRootID[getReactRootID(container)] =+        getReactRootElementInContainer(container);+    }++    return prevComponent;+  },++  /**+   * Register a component into the instance map and starts scroll value+   * monitoring+   * @param {ReactComponent} nextComponent component instance to render+   * @param {DOMElement} container container to render into+   * @return {string} reactRoot ID prefix+   */+  _registerComponent: function(nextComponent, container) {+    ("production" !== "development" ? invariant(+      container && (+        (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)+      ),+      '_registerComponent(...): Target container is not a DOM element.'+    ) : invariant(container && (+      (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)+    )));++    ReactBrowserEventEmitter.ensureScrollValueMonitoring();++    var reactRootID = ReactMount.registerContainer(container);+    instancesByReactRootID[reactRootID] = nextComponent;+    return reactRootID;+  },++  /**+   * Render a new component into the DOM.+   * @param {ReactElement} nextElement element to render+   * @param {DOMElement} container container to render into+   * @param {boolean} shouldReuseMarkup if we should skip the markup insertion+   * @return {ReactComponent} nextComponent+   */+  _renderNewRootComponent: function(+    nextElement,+    container,+    shouldReuseMarkup+  ) {+    // Various parts of our code (such as ReactCompositeComponent's+    // _renderValidatedComponent) assume that calls to render aren't nested;+    // verify that that's the case.+    ("production" !== "development" ? warning(+      ReactCurrentOwner.current == null,+      '_renderNewRootComponent(): Render methods should be a pure function ' ++      'of props and state; triggering nested component updates from ' ++      'render is not allowed. If necessary, trigger nested updates in ' ++      'componentDidUpdate.'+    ) : null);++    var componentInstance = instantiateReactComponent(nextElement, null);+    var reactRootID = ReactMount._registerComponent(+      componentInstance,+      container+    );++    // The initial render is synchronous but any updates that happen during+    // rendering, in componentWillMount or componentDidMount, will be batched+    // according to the current batching strategy.++    ReactUpdates.batchedUpdates(+      batchedMountComponentIntoNode,+      componentInstance,+      reactRootID,+      container,+      shouldReuseMarkup+    );++    if ("production" !== "development") {+      // Record the root element in case it later gets transplanted.+      rootElementsByReactRootID[reactRootID] =+        getReactRootElementInContainer(container);+    }++    return componentInstance;+  },++  /**+   * Renders a React component into the DOM in the supplied `container`.+   *+   * If the React component was previously rendered into `container`, this will+   * perform an update on it and only mutate the DOM as necessary to reflect the+   * latest React component.+   *+   * @param {ReactElement} nextElement Component element to render.+   * @param {DOMElement} container DOM element to render into.+   * @param {?function} callback function triggered on completion+   * @return {ReactComponent} Component instance rendered in `container`.+   */+  render: function(nextElement, container, callback) {+    ("production" !== "development" ? invariant(+      ReactElement.isValidElement(nextElement),+      'React.render(): Invalid component element.%s',+      (+        typeof nextElement === 'string' ?+          ' Instead of passing an element string, make sure to instantiate ' ++          'it by passing it to React.createElement.' :+        typeof nextElement === 'function' ?+          ' Instead of passing a component class, make sure to instantiate ' ++          'it by passing it to React.createElement.' :+        // Check if it quacks like an element+        nextElement != null && nextElement.props !== undefined ?+          ' This may be caused by unintentionally loading two independent ' ++          'copies of React.' :+          ''+      )+    ) : invariant(ReactElement.isValidElement(nextElement)));++    var prevComponent = instancesByReactRootID[getReactRootID(container)];++    if (prevComponent) {+      var prevElement = prevComponent._currentElement;+      if (shouldUpdateReactComponent(prevElement, nextElement)) {+        return ReactMount._updateRootComponent(+          prevComponent,+          nextElement,+          container,+          callback+        ).getPublicInstance();+      } else {+        ReactMount.unmountComponentAtNode(container);+      }+    }++    var reactRootElement = getReactRootElementInContainer(container);+    var containerHasReactMarkup =+      reactRootElement && ReactMount.isRenderedByReact(reactRootElement);++    if ("production" !== "development") {+      if (!containerHasReactMarkup || reactRootElement.nextSibling) {+        var rootElementSibling = reactRootElement;+        while (rootElementSibling) {+          if (ReactMount.isRenderedByReact(rootElementSibling)) {+            ("production" !== "development" ? warning(+              false,+              'render(): Target node has markup rendered by React, but there ' ++              'are unrelated nodes as well. This is most commonly caused by ' ++              'white-space inserted around server-rendered markup.'+            ) : null);+            break;+          }++          rootElementSibling = rootElementSibling.nextSibling;+        }+      }+    }++    var shouldReuseMarkup = containerHasReactMarkup && !prevComponent;++    var component = ReactMount._renderNewRootComponent(+      nextElement,+      container,+      shouldReuseMarkup+    ).getPublicInstance();+    if (callback) {+      callback.call(component);+    }+    return component;+  },++  /**+   * Constructs a component instance of `constructor` with `initialProps` and+   * renders it into the supplied `container`.+   *+   * @param {function} constructor React component constructor.+   * @param {?object} props Initial props of the component instance.+   * @param {DOMElement} container DOM element to render into.+   * @return {ReactComponent} Component instance rendered in `container`.+   */+  constructAndRenderComponent: function(constructor, props, container) {+    var element = ReactElement.createElement(constructor, props);+    return ReactMount.render(element, container);+  },++  /**+   * Constructs a component instance of `constructor` with `initialProps` and+   * renders it into a container node identified by supplied `id`.+   *+   * @param {function} componentConstructor React component constructor+   * @param {?object} props Initial props of the component instance.+   * @param {string} id ID of the DOM element to render into.+   * @return {ReactComponent} Component instance rendered in the container node.+   */+  constructAndRenderComponentByID: function(constructor, props, id) {+    var domNode = document.getElementById(id);+    ("production" !== "development" ? invariant(+      domNode,+      'Tried to get element with id of "%s" but it is not present on the page.',+      id+    ) : invariant(domNode));+    return ReactMount.constructAndRenderComponent(constructor, props, domNode);+  },++  /**+   * Registers a container node into which React components will be rendered.+   * This also creates the "reactRoot" ID that will be assigned to the element+   * rendered within.+   *+   * @param {DOMElement} container DOM element to register as a container.+   * @return {string} The "reactRoot" ID of elements rendered within.+   */+  registerContainer: function(container) {+    var reactRootID = getReactRootID(container);+    if (reactRootID) {+      // If one exists, make sure it is a valid "reactRoot" ID.+      reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID);+    }+    if (!reactRootID) {+      // No valid "reactRoot" ID found, create one.+      reactRootID = ReactInstanceHandles.createReactRootID();+    }+    containersByReactRootID[reactRootID] = container;+    return reactRootID;+  },++  /**+   * Unmounts and destroys the React component rendered in the `container`.+   *+   * @param {DOMElement} container DOM element containing a React component.+   * @return {boolean} True if a component was found in and unmounted from+   *                   `container`+   */+  unmountComponentAtNode: function(container) {+    // Various parts of our code (such as ReactCompositeComponent's+    // _renderValidatedComponent) assume that calls to render aren't nested;+    // verify that that's the case. (Strictly speaking, unmounting won't cause a+    // render but we still don't expect to be in a render call here.)+    ("production" !== "development" ? warning(+      ReactCurrentOwner.current == null,+      'unmountComponentAtNode(): Render methods should be a pure function of ' ++      'props and state; triggering nested component updates from render is ' ++      'not allowed. If necessary, trigger nested updates in ' ++      'componentDidUpdate.'+    ) : null);++    ("production" !== "development" ? invariant(+      container && (+        (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)+      ),+      'unmountComponentAtNode(...): Target container is not a DOM element.'+    ) : invariant(container && (+      (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)+    )));++    var reactRootID = getReactRootID(container);+    var component = instancesByReactRootID[reactRootID];+    if (!component) {+      return false;+    }+    ReactMount.unmountComponentFromNode(component, container);+    delete instancesByReactRootID[reactRootID];+    delete containersByReactRootID[reactRootID];+    if ("production" !== "development") {+      delete rootElementsByReactRootID[reactRootID];+    }+    return true;+  },++  /**+   * Unmounts a component and removes it from the DOM.+   *+   * @param {ReactComponent} instance React component instance.+   * @param {DOMElement} container DOM element to unmount from.+   * @final+   * @internal+   * @see {ReactMount.unmountComponentAtNode}+   */+  unmountComponentFromNode: function(instance, container) {+    ReactReconciler.unmountComponent(instance);++    if (container.nodeType === DOC_NODE_TYPE) {+      container = container.documentElement;+    }++    // http://jsperf.com/emptying-a-node+    while (container.lastChild) {+      container.removeChild(container.lastChild);+    }+  },++  /**+   * Finds the container DOM element that contains React component to which the+   * supplied DOM `id` belongs.+   *+   * @param {string} id The ID of an element rendered by a React component.+   * @return {?DOMElement} DOM element that contains the `id`.+   */+  findReactContainerForID: function(id) {+    var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id);+    var container = containersByReactRootID[reactRootID];++    if ("production" !== "development") {+      var rootElement = rootElementsByReactRootID[reactRootID];+      if (rootElement && rootElement.parentNode !== container) {+        ("production" !== "development" ? invariant(+          // Call internalGetID here because getID calls isValid which calls+          // findReactContainerForID (this function).+          internalGetID(rootElement) === reactRootID,+          'ReactMount: Root element ID differed from reactRootID.'+        ) : invariant(// Call internalGetID here because getID calls isValid which calls+        // findReactContainerForID (this function).+        internalGetID(rootElement) === reactRootID));++        var containerChild = container.firstChild;+        if (containerChild &&+            reactRootID === internalGetID(containerChild)) {+          // If the container has a new child with the same ID as the old+          // root element, then rootElementsByReactRootID[reactRootID] is+          // just stale and needs to be updated. The case that deserves a+          // warning is when the container is empty.+          rootElementsByReactRootID[reactRootID] = containerChild;+        } else {+          ("production" !== "development" ? warning(+            false,+            'ReactMount: Root element has been removed from its original ' ++            'container. New container:', rootElement.parentNode+          ) : null);+        }+      }+    }++    return container;+  },++  /**+   * Finds an element rendered by React with the supplied ID.+   *+   * @param {string} id ID of a DOM node in the React component.+   * @return {DOMElement} Root DOM node of the React component.+   */+  findReactNodeByID: function(id) {+    var reactRoot = ReactMount.findReactContainerForID(id);+    return ReactMount.findComponentRoot(reactRoot, id);+  },++  /**+   * True if the supplied `node` is rendered by React.+   *+   * @param {*} node DOM Element to check.+   * @return {boolean} True if the DOM Element appears to be rendered by React.+   * @internal+   */+  isRenderedByReact: function(node) {+    if (node.nodeType !== 1) {+      // Not a DOMElement, therefore not a React component+      return false;+    }+    var id = ReactMount.getID(node);+    return id ? id.charAt(0) === SEPARATOR : false;+  },++  /**+   * Traverses up the ancestors of the supplied node to find a node that is a+   * DOM representation of a React component.+   *+   * @param {*} node+   * @return {?DOMEventTarget}+   * @internal+   */+  getFirstReactDOM: function(node) {+    var current = node;+    while (current && current.parentNode !== current) {+      if (ReactMount.isRenderedByReact(current)) {+        return current;+      }+      current = current.parentNode;+    }+    return null;+  },++  /**+   * Finds a node with the supplied `targetID` inside of the supplied+   * `ancestorNode`.  Exploits the ID naming scheme to perform the search+   * quickly.+   *+   * @param {DOMEventTarget} ancestorNode Search from this root.+   * @pararm {string} targetID ID of the DOM representation of the component.+   * @return {DOMEventTarget} DOM node with the supplied `targetID`.+   * @internal+   */+  findComponentRoot: function(ancestorNode, targetID) {+    var firstChildren = findComponentRootReusableArray;+    var childIndex = 0;++    var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode;++    firstChildren[0] = deepestAncestor.firstChild;+    firstChildren.length = 1;++    while (childIndex < firstChildren.length) {+      var child = firstChildren[childIndex++];+      var targetChild;++      while (child) {+        var childID = ReactMount.getID(child);+        if (childID) {+          // Even if we find the node we're looking for, we finish looping+          // through its siblings to ensure they're cached so that we don't have+          // to revisit this node again. Otherwise, we make n^2 calls to getID+          // when visiting the many children of a single node in order.++          if (targetID === childID) {+            targetChild = child;+          } else if (ReactInstanceHandles.isAncestorIDOf(childID, targetID)) {+            // If we find a child whose ID is an ancestor of the given ID,+            // then we can be sure that we only want to search the subtree+            // rooted at this child, so we can throw out the rest of the+            // search state.+            firstChildren.length = childIndex = 0;+            firstChildren.push(child.firstChild);+          }++        } else {+          // If this child had no ID, then there's a chance that it was+          // injected automatically by the browser, as when a `<table>`+          // element sprouts an extra `<tbody>` child as a side effect of+          // `.innerHTML` parsing. Optimistically continue down this+          // branch, but not before examining the other siblings.+          firstChildren.push(child.firstChild);+        }++        child = child.nextSibling;+      }++      if (targetChild) {+        // Emptying firstChildren/findComponentRootReusableArray is+        // not necessary for correctness, but it helps the GC reclaim+        // any nodes that were left at the end of the search.+        firstChildren.length = 0;++        return targetChild;+      }+    }++    firstChildren.length = 0;++    ("production" !== "development" ? invariant(+      false,+      'findComponentRoot(..., %s): Unable to find element. This probably ' ++      'means the DOM was unexpectedly mutated (e.g., by the browser), ' ++      'usually due to forgetting a <tbody> when using tables, nesting tags ' ++      'like <form>, <p>, or <a>, or using non-SVG elements in an <svg> ' ++      'parent. ' ++      'Try inspecting the child nodes of the element with React ID `%s`.',+      targetID,+      ReactMount.getID(ancestorNode)+    ) : invariant(false));+  },++  _mountImageIntoNode: function(markup, container, shouldReuseMarkup) {+    ("production" !== "development" ? invariant(+      container && (+        (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)+      ),+      'mountComponentIntoNode(...): Target container is not valid.'+    ) : invariant(container && (+      (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)+    )));++    if (shouldReuseMarkup) {+      var rootElement = getReactRootElementInContainer(container);+      if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) {+        return;+      } else {+        var checksum = rootElement.getAttribute(+          ReactMarkupChecksum.CHECKSUM_ATTR_NAME+        );+        rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);++        var rootMarkup = rootElement.outerHTML;+        rootElement.setAttribute(+          ReactMarkupChecksum.CHECKSUM_ATTR_NAME,+          checksum+        );++        var diffIndex = firstDifferenceIndex(markup, rootMarkup);+        var difference = ' (client) ' ++          markup.substring(diffIndex - 20, diffIndex + 20) ++          '\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20);++        ("production" !== "development" ? invariant(+          container.nodeType !== DOC_NODE_TYPE,+          'You\'re trying to render a component to the document using ' ++          'server rendering but the checksum was invalid. This usually ' ++          'means you rendered a different component type or props on ' ++          'the client from the one on the server, or your render() ' ++          'methods are impure. React cannot handle this case due to ' ++          'cross-browser quirks by rendering at the document root. You ' ++          'should look for environment dependent code in your components ' ++          'and ensure the props are the same client and server side:\n%s',+          difference+        ) : invariant(container.nodeType !== DOC_NODE_TYPE));++        if ("production" !== "development") {+          ("production" !== "development" ? warning(+            false,+            'React attempted to reuse markup in a container but the ' ++            'checksum was invalid. This generally means that you are ' ++            'using server rendering and the markup generated on the ' ++            'server was not what the client was expecting. React injected ' ++            'new markup to compensate which works but you have lost many ' ++            'of the benefits of server rendering. Instead, figure out ' ++            'why the markup being generated is different on the client ' ++            'or server:\n%s',+            difference+          ) : null);+        }+      }+    }++    ("production" !== "development" ? invariant(+      container.nodeType !== DOC_NODE_TYPE,+      'You\'re trying to render a component to the document but ' ++        'you didn\'t use server rendering. We can\'t do this ' ++        'without using server rendering due to cross-browser quirks. ' ++        'See React.renderToString() for server rendering.'+    ) : invariant(container.nodeType !== DOC_NODE_TYPE));++    setInnerHTML(container, markup);+  },++  /**+   * React ID utilities.+   */++  getReactRootID: getReactRootID,++  getID: getID,++  setID: setID,++  getNode: getNode,++  getNodeFromInstance: getNodeFromInstance,++  purgeID: purgeID+};++ReactPerf.measureMethods(ReactMount, 'ReactMount', {+  _renderNewRootComponent: '_renderNewRootComponent',+  _mountImageIntoNode: '_mountImageIntoNode'+});++module.exports = ReactMount;++},{"10":10,"109":109,"115":115,"129":129,"134":134,"135":135,"148":148,"151":151,"154":154,"30":30,"39":39,"57":57,"58":58,"59":59,"66":66,"67":67,"69":69,"75":75,"81":81,"86":86,"87":87}],71:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactMultiChild+ * @typechecks static-only+ */++'use strict';++var ReactComponentEnvironment = _dereq_(36);+var ReactMultiChildUpdateTypes = _dereq_(72);++var ReactReconciler = _dereq_(81);+var ReactChildReconciler = _dereq_(31);++/**+ * Updating children of a component may trigger recursive updates. The depth is+ * used to batch recursive updates to render markup more efficiently.+ *+ * @type {number}+ * @private+ */+var updateDepth = 0;++/**+ * Queue of update configuration objects.+ *+ * Each object has a `type` property that is in `ReactMultiChildUpdateTypes`.+ *+ * @type {array<object>}+ * @private+ */+var updateQueue = [];++/**+ * Queue of markup to be rendered.+ *+ * @type {array<string>}+ * @private+ */+var markupQueue = [];++/**+ * Enqueues markup to be rendered and inserted at a supplied index.+ *+ * @param {string} parentID ID of the parent component.+ * @param {string} markup Markup that renders into an element.+ * @param {number} toIndex Destination index.+ * @private+ */+function enqueueMarkup(parentID, markup, toIndex) {+  // NOTE: Null values reduce hidden classes.+  updateQueue.push({+    parentID: parentID,+    parentNode: null,+    type: ReactMultiChildUpdateTypes.INSERT_MARKUP,+    markupIndex: markupQueue.push(markup) - 1,+    textContent: null,+    fromIndex: null,+    toIndex: toIndex+  });+}++/**+ * Enqueues moving an existing element to another index.+ *+ * @param {string} parentID ID of the parent component.+ * @param {number} fromIndex Source index of the existing element.+ * @param {number} toIndex Destination index of the element.+ * @private+ */+function enqueueMove(parentID, fromIndex, toIndex) {+  // NOTE: Null values reduce hidden classes.+  updateQueue.push({+    parentID: parentID,+    parentNode: null,+    type: ReactMultiChildUpdateTypes.MOVE_EXISTING,+    markupIndex: null,+    textContent: null,+    fromIndex: fromIndex,+    toIndex: toIndex+  });+}++/**+ * Enqueues removing an element at an index.+ *+ * @param {string} parentID ID of the parent component.+ * @param {number} fromIndex Index of the element to remove.+ * @private+ */+function enqueueRemove(parentID, fromIndex) {+  // NOTE: Null values reduce hidden classes.+  updateQueue.push({+    parentID: parentID,+    parentNode: null,+    type: ReactMultiChildUpdateTypes.REMOVE_NODE,+    markupIndex: null,+    textContent: null,+    fromIndex: fromIndex,+    toIndex: null+  });+}++/**+ * Enqueues setting the text content.+ *+ * @param {string} parentID ID of the parent component.+ * @param {string} textContent Text content to set.+ * @private+ */+function enqueueTextContent(parentID, textContent) {+  // NOTE: Null values reduce hidden classes.+  updateQueue.push({+    parentID: parentID,+    parentNode: null,+    type: ReactMultiChildUpdateTypes.TEXT_CONTENT,+    markupIndex: null,+    textContent: textContent,+    fromIndex: null,+    toIndex: null+  });+}++/**+ * Processes any enqueued updates.+ *+ * @private+ */+function processQueue() {+  if (updateQueue.length) {+    ReactComponentEnvironment.processChildrenUpdates(+      updateQueue,+      markupQueue+    );+    clearQueue();+  }+}++/**+ * Clears any enqueued updates.+ *+ * @private+ */+function clearQueue() {+  updateQueue.length = 0;+  markupQueue.length = 0;+}++/**+ * ReactMultiChild are capable of reconciling multiple children.+ *+ * @class ReactMultiChild+ * @internal+ */+var ReactMultiChild = {++  /**+   * Provides common functionality for components that must reconcile multiple+   * children. This is used by `ReactDOMComponent` to mount, update, and+   * unmount child components.+   *+   * @lends {ReactMultiChild.prototype}+   */+  Mixin: {++    /**+     * Generates a "mount image" for each of the supplied children. In the case+     * of `ReactDOMComponent`, a mount image is a string of markup.+     *+     * @param {?object} nestedChildren Nested child maps.+     * @return {array} An array of mounted representations.+     * @internal+     */+    mountChildren: function(nestedChildren, transaction, context) {+      var children = ReactChildReconciler.instantiateChildren(+        nestedChildren, transaction, context+      );+      this._renderedChildren = children;+      var mountImages = [];+      var index = 0;+      for (var name in children) {+        if (children.hasOwnProperty(name)) {+          var child = children[name];+          // Inlined for performance, see `ReactInstanceHandles.createReactID`.+          var rootID = this._rootNodeID + name;+          var mountImage = ReactReconciler.mountComponent(+            child,+            rootID,+            transaction,+            context+          );+          child._mountIndex = index;+          mountImages.push(mountImage);+          index++;+        }+      }+      return mountImages;+    },++    /**+     * Replaces any rendered children with a text content string.+     *+     * @param {string} nextContent String of content.+     * @internal+     */+    updateTextContent: function(nextContent) {+      updateDepth++;+      var errorThrown = true;+      try {+        var prevChildren = this._renderedChildren;+        // Remove any rendered children.+        ReactChildReconciler.unmountChildren(prevChildren);+        // TODO: The setTextContent operation should be enough+        for (var name in prevChildren) {+          if (prevChildren.hasOwnProperty(name)) {+            this._unmountChildByName(prevChildren[name], name);+          }+        }+        // Set new text content.+        this.setTextContent(nextContent);+        errorThrown = false;+      } finally {+        updateDepth--;+        if (!updateDepth) {+          if (errorThrown) {+            clearQueue();+          } else {+            processQueue();+          }+        }+      }+    },++    /**+     * Updates the rendered children with new children.+     *+     * @param {?object} nextNestedChildren Nested child maps.+     * @param {ReactReconcileTransaction} transaction+     * @internal+     */+    updateChildren: function(nextNestedChildren, transaction, context) {+      updateDepth++;+      var errorThrown = true;+      try {+        this._updateChildren(nextNestedChildren, transaction, context);+        errorThrown = false;+      } finally {+        updateDepth--;+        if (!updateDepth) {+          if (errorThrown) {+            clearQueue();+          } else {+            processQueue();+          }+        }++      }+    },++    /**+     * Improve performance by isolating this hot code path from the try/catch+     * block in `updateChildren`.+     *+     * @param {?object} nextNestedChildren Nested child maps.+     * @param {ReactReconcileTransaction} transaction+     * @final+     * @protected+     */+    _updateChildren: function(nextNestedChildren, transaction, context) {+      var prevChildren = this._renderedChildren;+      var nextChildren = ReactChildReconciler.updateChildren(+        prevChildren, nextNestedChildren, transaction, context+      );+      this._renderedChildren = nextChildren;+      if (!nextChildren && !prevChildren) {+        return;+      }+      var name;+      // `nextIndex` will increment for each child in `nextChildren`, but+      // `lastIndex` will be the last index visited in `prevChildren`.+      var lastIndex = 0;+      var nextIndex = 0;+      for (name in nextChildren) {+        if (!nextChildren.hasOwnProperty(name)) {+          continue;+        }+        var prevChild = prevChildren && prevChildren[name];+        var nextChild = nextChildren[name];+        if (prevChild === nextChild) {+          this.moveChild(prevChild, nextIndex, lastIndex);+          lastIndex = Math.max(prevChild._mountIndex, lastIndex);+          prevChild._mountIndex = nextIndex;+        } else {+          if (prevChild) {+            // Update `lastIndex` before `_mountIndex` gets unset by unmounting.+            lastIndex = Math.max(prevChild._mountIndex, lastIndex);+            this._unmountChildByName(prevChild, name);+          }+          // The child must be instantiated before it's mounted.+          this._mountChildByNameAtIndex(+            nextChild, name, nextIndex, transaction, context+          );+        }+        nextIndex++;+      }+      // Remove children that are no longer present.+      for (name in prevChildren) {+        if (prevChildren.hasOwnProperty(name) &&+            !(nextChildren && nextChildren.hasOwnProperty(name))) {+          this._unmountChildByName(prevChildren[name], name);+        }+      }+    },++    /**+     * Unmounts all rendered children. This should be used to clean up children+     * when this component is unmounted.+     *+     * @internal+     */+    unmountChildren: function() {+      var renderedChildren = this._renderedChildren;+      ReactChildReconciler.unmountChildren(renderedChildren);+      this._renderedChildren = null;+    },++    /**+     * Moves a child component to the supplied index.+     *+     * @param {ReactComponent} child Component to move.+     * @param {number} toIndex Destination index of the element.+     * @param {number} lastIndex Last index visited of the siblings of `child`.+     * @protected+     */+    moveChild: function(child, toIndex, lastIndex) {+      // If the index of `child` is less than `lastIndex`, then it needs to+      // be moved. Otherwise, we do not need to move it because a child will be+      // inserted or moved before `child`.+      if (child._mountIndex < lastIndex) {+        enqueueMove(this._rootNodeID, child._mountIndex, toIndex);+      }+    },++    /**+     * Creates a child component.+     *+     * @param {ReactComponent} child Component to create.+     * @param {string} mountImage Markup to insert.+     * @protected+     */+    createChild: function(child, mountImage) {+      enqueueMarkup(this._rootNodeID, mountImage, child._mountIndex);+    },++    /**+     * Removes a child component.+     *+     * @param {ReactComponent} child Child to remove.+     * @protected+     */+    removeChild: function(child) {+      enqueueRemove(this._rootNodeID, child._mountIndex);+    },++    /**+     * Sets this text content string.+     *+     * @param {string} textContent Text content to set.+     * @protected+     */+    setTextContent: function(textContent) {+      enqueueTextContent(this._rootNodeID, textContent);+    },++    /**+     * Mounts a child with the supplied name.+     *+     * NOTE: This is part of `updateChildren` and is here for readability.+     *+     * @param {ReactComponent} child Component to mount.+     * @param {string} name Name of the child.+     * @param {number} index Index at which to insert the child.+     * @param {ReactReconcileTransaction} transaction+     * @private+     */+    _mountChildByNameAtIndex: function(+      child,+      name,+      index,+      transaction,+      context) {+      // Inlined for performance, see `ReactInstanceHandles.createReactID`.+      var rootID = this._rootNodeID + name;+      var mountImage = ReactReconciler.mountComponent(+        child,+        rootID,+        transaction,+        context+      );+      child._mountIndex = index;+      this.createChild(child, mountImage);+    },++    /**+     * Unmounts a rendered child by name.+     *+     * NOTE: This is part of `updateChildren` and is here for readability.+     *+     * @param {ReactComponent} child Component to unmount.+     * @param {string} name Name of the child in `this._renderedChildren`.+     * @private+     */+    _unmountChildByName: function(child, name) {+      this.removeChild(child);+      child._mountIndex = null;+    }++  }++};++module.exports = ReactMultiChild;++},{"31":31,"36":36,"72":72,"81":81}],72:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactMultiChildUpdateTypes+ */++'use strict';++var keyMirror = _dereq_(140);++/**+ * When a component's children are updated, a series of update configuration+ * objects are created in order to batch and serialize the required changes.+ *+ * Enumerates all the possible types of update configurations.+ *+ * @internal+ */+var ReactMultiChildUpdateTypes = keyMirror({+  INSERT_MARKUP: null,+  MOVE_EXISTING: null,+  REMOVE_NODE: null,+  TEXT_CONTENT: null+});++module.exports = ReactMultiChildUpdateTypes;++},{"140":140}],73:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactNativeComponent+ */++'use strict';++var assign = _dereq_(27);+var invariant = _dereq_(135);++var autoGenerateWrapperClass = null;+var genericComponentClass = null;+// This registry keeps track of wrapper classes around native tags+var tagToComponentClass = {};+var textComponentClass = null;++var ReactNativeComponentInjection = {+  // This accepts a class that receives the tag string. This is a catch all+  // that can render any kind of tag.+  injectGenericComponentClass: function(componentClass) {+    genericComponentClass = componentClass;+  },+  // This accepts a text component class that takes the text string to be+  // rendered as props.+  injectTextComponentClass: function(componentClass) {+    textComponentClass = componentClass;+  },+  // This accepts a keyed object with classes as values. Each key represents a+  // tag. That particular tag will use this class instead of the generic one.+  injectComponentClasses: function(componentClasses) {+    assign(tagToComponentClass, componentClasses);+  },+  // Temporary hack since we expect DOM refs to behave like composites,+  // for this release.+  injectAutoWrapper: function(wrapperFactory) {+    autoGenerateWrapperClass = wrapperFactory;+  }+};++/**+ * Get a composite component wrapper class for a specific tag.+ *+ * @param {ReactElement} element The tag for which to get the class.+ * @return {function} The React class constructor function.+ */+function getComponentClassForElement(element) {+  if (typeof element.type === 'function') {+    return element.type;+  }+  var tag = element.type;+  var componentClass = tagToComponentClass[tag];+  if (componentClass == null) {+    tagToComponentClass[tag] = componentClass = autoGenerateWrapperClass(tag);+  }+  return componentClass;+}++/**+ * Get a native internal component class for a specific tag.+ *+ * @param {ReactElement} element The element to create.+ * @return {function} The internal class constructor function.+ */+function createInternalComponent(element) {+  ("production" !== "development" ? invariant(+    genericComponentClass,+    'There is no registered component for the tag %s',+    element.type+  ) : invariant(genericComponentClass));+  return new genericComponentClass(element.type, element.props);+}++/**+ * @param {ReactText} text+ * @return {ReactComponent}+ */+function createInstanceForText(text) {+  return new textComponentClass(text);+}++/**+ * @param {ReactComponent} component+ * @return {boolean}+ */+function isTextComponent(component) {+  return component instanceof textComponentClass;+}++var ReactNativeComponent = {+  getComponentClassForElement: getComponentClassForElement,+  createInternalComponent: createInternalComponent,+  createInstanceForText: createInstanceForText,+  isTextComponent: isTextComponent,+  injection: ReactNativeComponentInjection+};++module.exports = ReactNativeComponent;++},{"135":135,"27":27}],74:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactOwner+ */++'use strict';++var invariant = _dereq_(135);++/**+ * ReactOwners are capable of storing references to owned components.+ *+ * All components are capable of //being// referenced by owner components, but+ * only ReactOwner components are capable of //referencing// owned components.+ * The named reference is known as a "ref".+ *+ * Refs are available when mounted and updated during reconciliation.+ *+ *   var MyComponent = React.createClass({+ *     render: function() {+ *       return (+ *         <div onClick={this.handleClick}>+ *           <CustomComponent ref="custom" />+ *         </div>+ *       );+ *     },+ *     handleClick: function() {+ *       this.refs.custom.handleClick();+ *     },+ *     componentDidMount: function() {+ *       this.refs.custom.initialize();+ *     }+ *   });+ *+ * Refs should rarely be used. When refs are used, they should only be done to+ * control data that is not handled by React's data flow.+ *+ * @class ReactOwner+ */+var ReactOwner = {++  /**+   * @param {?object} object+   * @return {boolean} True if `object` is a valid owner.+   * @final+   */+  isValidOwner: function(object) {+    return !!(+      (object &&+      typeof object.attachRef === 'function' && typeof object.detachRef === 'function')+    );+  },++  /**+   * Adds a component by ref to an owner component.+   *+   * @param {ReactComponent} component Component to reference.+   * @param {string} ref Name by which to refer to the component.+   * @param {ReactOwner} owner Component on which to record the ref.+   * @final+   * @internal+   */+  addComponentAsRefTo: function(component, ref, owner) {+    ("production" !== "development" ? invariant(+      ReactOwner.isValidOwner(owner),+      'addComponentAsRefTo(...): Only a ReactOwner can have refs. This ' ++      'usually means that you\'re trying to add a ref to a component that ' ++      'doesn\'t have an owner (that is, was not created inside of another ' ++      'component\'s `render` method). Try rendering this component inside of ' ++      'a new top-level component which will hold the ref.'+    ) : invariant(ReactOwner.isValidOwner(owner)));+    owner.attachRef(ref, component);+  },++  /**+   * Removes a component by ref from an owner component.+   *+   * @param {ReactComponent} component Component to dereference.+   * @param {string} ref Name of the ref to remove.+   * @param {ReactOwner} owner Component on which the ref is recorded.+   * @final+   * @internal+   */+  removeComponentAsRefFrom: function(component, ref, owner) {+    ("production" !== "development" ? invariant(+      ReactOwner.isValidOwner(owner),+      'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This ' ++      'usually means that you\'re trying to remove a ref to a component that ' ++      'doesn\'t have an owner (that is, was not created inside of another ' ++      'component\'s `render` method). Try rendering this component inside of ' ++      'a new top-level component which will hold the ref.'+    ) : invariant(ReactOwner.isValidOwner(owner)));+    // Check that `component` is still the current ref because we do not want to+    // detach the ref if another component stole it.+    if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) {+      owner.detachRef(ref);+    }+  }++};++module.exports = ReactOwner;++},{"135":135}],75:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactPerf+ * @typechecks static-only+ */++'use strict';++/**+ * ReactPerf is a general AOP system designed to measure performance. This+ * module only has the hooks: see ReactDefaultPerf for the analysis tool.+ */+var ReactPerf = {+  /**+   * Boolean to enable/disable measurement. Set to false by default to prevent+   * accidental logging and perf loss.+   */+  enableMeasure: false,++  /**+   * Holds onto the measure function in use. By default, don't measure+   * anything, but we'll override this if we inject a measure function.+   */+  storedMeasure: _noMeasure,++  /**+   * @param {object} object+   * @param {string} objectName+   * @param {object<string>} methodNames+   */+  measureMethods: function(object, objectName, methodNames) {+    if ("production" !== "development") {+      for (var key in methodNames) {+        if (!methodNames.hasOwnProperty(key)) {+          continue;+        }+        object[key] = ReactPerf.measure(+          objectName,+          methodNames[key],+          object[key]+        );+      }+    }+  },++  /**+   * Use this to wrap methods you want to measure. Zero overhead in production.+   *+   * @param {string} objName+   * @param {string} fnName+   * @param {function} func+   * @return {function}+   */+  measure: function(objName, fnName, func) {+    if ("production" !== "development") {+      var measuredFunc = null;+      var wrapper = function() {+        if (ReactPerf.enableMeasure) {+          if (!measuredFunc) {+            measuredFunc = ReactPerf.storedMeasure(objName, fnName, func);+          }+          return measuredFunc.apply(this, arguments);+        }+        return func.apply(this, arguments);+      };+      wrapper.displayName = objName + '_' + fnName;+      return wrapper;+    }+    return func;+  },++  injection: {+    /**+     * @param {function} measure+     */+    injectMeasure: function(measure) {+      ReactPerf.storedMeasure = measure;+    }+  }+};++/**+ * Simply passes through the measured function, without measuring it.+ *+ * @param {string} objName+ * @param {string} fnName+ * @param {function} func+ * @return {function}+ */+function _noMeasure(objName, fnName, func) {+  return func;+}++module.exports = ReactPerf;++},{}],76:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactPropTypeLocationNames+ */++'use strict';++var ReactPropTypeLocationNames = {};++if ("production" !== "development") {+  ReactPropTypeLocationNames = {+    prop: 'prop',+    context: 'context',+    childContext: 'child context'+  };+}++module.exports = ReactPropTypeLocationNames;++},{}],77:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactPropTypeLocations+ */++'use strict';++var keyMirror = _dereq_(140);++var ReactPropTypeLocations = keyMirror({+  prop: null,+  context: null,+  childContext: null+});++module.exports = ReactPropTypeLocations;++},{"140":140}],78:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactPropTypes+ */++'use strict';++var ReactElement = _dereq_(57);+var ReactFragment = _dereq_(63);+var ReactPropTypeLocationNames = _dereq_(76);++var emptyFunction = _dereq_(114);++/**+ * Collection of methods that allow declaration and validation of props that are+ * supplied to React components. Example usage:+ *+ *   var Props = require('ReactPropTypes');+ *   var MyArticle = React.createClass({+ *     propTypes: {+ *       // An optional string prop named "description".+ *       description: Props.string,+ *+ *       // A required enum prop named "category".+ *       category: Props.oneOf(['News','Photos']).isRequired,+ *+ *       // A prop named "dialog" that requires an instance of Dialog.+ *       dialog: Props.instanceOf(Dialog).isRequired+ *     },+ *     render: function() { ... }+ *   });+ *+ * A more formal specification of how these methods are used:+ *+ *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)+ *   decl := ReactPropTypes.{type}(.isRequired)?+ *+ * Each and every declaration produces a function with the same signature. This+ * allows the creation of custom validation functions. For example:+ *+ *  var MyLink = React.createClass({+ *    propTypes: {+ *      // An optional string or URI prop named "href".+ *      href: function(props, propName, componentName) {+ *        var propValue = props[propName];+ *        if (propValue != null && typeof propValue !== 'string' &&+ *            !(propValue instanceof URI)) {+ *          return new Error(+ *            'Expected a string or an URI for ' + propName + ' in ' ++ *            componentName+ *          );+ *        }+ *      }+ *    },+ *    render: function() {...}+ *  });+ *+ * @internal+ */++var ANONYMOUS = '<<anonymous>>';++var elementTypeChecker = createElementTypeChecker();+var nodeTypeChecker = createNodeChecker();++var ReactPropTypes = {+  array: createPrimitiveTypeChecker('array'),+  bool: createPrimitiveTypeChecker('boolean'),+  func: createPrimitiveTypeChecker('function'),+  number: createPrimitiveTypeChecker('number'),+  object: createPrimitiveTypeChecker('object'),+  string: createPrimitiveTypeChecker('string'),++  any: createAnyTypeChecker(),+  arrayOf: createArrayOfTypeChecker,+  element: elementTypeChecker,+  instanceOf: createInstanceTypeChecker,+  node: nodeTypeChecker,+  objectOf: createObjectOfTypeChecker,+  oneOf: createEnumTypeChecker,+  oneOfType: createUnionTypeChecker,+  shape: createShapeTypeChecker+};++function createChainableTypeChecker(validate) {+  function checkType(isRequired, props, propName, componentName, location) {+    componentName = componentName || ANONYMOUS;+    if (props[propName] == null) {+      var locationName = ReactPropTypeLocationNames[location];+      if (isRequired) {+        return new Error(+          ("Required " + locationName + " `" + propName + "` was not specified in ") ++          ("`" + componentName + "`.")+        );+      }+      return null;+    } else {+      return validate(props, propName, componentName, location);+    }+  }++  var chainedCheckType = checkType.bind(null, false);+  chainedCheckType.isRequired = checkType.bind(null, true);++  return chainedCheckType;+}++function createPrimitiveTypeChecker(expectedType) {+  function validate(props, propName, componentName, location) {+    var propValue = props[propName];+    var propType = getPropType(propValue);+    if (propType !== expectedType) {+      var locationName = ReactPropTypeLocationNames[location];+      // `propValue` being instance of, say, date/regexp, pass the 'object'+      // check, but we can offer a more precise error message here rather than+      // 'of type `object`'.+      var preciseType = getPreciseType(propValue);++      return new Error(+        ("Invalid " + locationName + " `" + propName + "` of type `" + preciseType + "` ") ++        ("supplied to `" + componentName + "`, expected `" + expectedType + "`.")+      );+    }+    return null;+  }+  return createChainableTypeChecker(validate);+}++function createAnyTypeChecker() {+  return createChainableTypeChecker(emptyFunction.thatReturns(null));+}++function createArrayOfTypeChecker(typeChecker) {+  function validate(props, propName, componentName, location) {+    var propValue = props[propName];+    if (!Array.isArray(propValue)) {+      var locationName = ReactPropTypeLocationNames[location];+      var propType = getPropType(propValue);+      return new Error(+        ("Invalid " + locationName + " `" + propName + "` of type ") ++        ("`" + propType + "` supplied to `" + componentName + "`, expected an array.")+      );+    }+    for (var i = 0; i < propValue.length; i++) {+      var error = typeChecker(propValue, i, componentName, location);+      if (error instanceof Error) {+        return error;+      }+    }+    return null;+  }+  return createChainableTypeChecker(validate);+}++function createElementTypeChecker() {+  function validate(props, propName, componentName, location) {+    if (!ReactElement.isValidElement(props[propName])) {+      var locationName = ReactPropTypeLocationNames[location];+      return new Error(+        ("Invalid " + locationName + " `" + propName + "` supplied to ") ++        ("`" + componentName + "`, expected a ReactElement.")+      );+    }+    return null;+  }+  return createChainableTypeChecker(validate);+}++function createInstanceTypeChecker(expectedClass) {+  function validate(props, propName, componentName, location) {+    if (!(props[propName] instanceof expectedClass)) {+      var locationName = ReactPropTypeLocationNames[location];+      var expectedClassName = expectedClass.name || ANONYMOUS;+      return new Error(+        ("Invalid " + locationName + " `" + propName + "` supplied to ") ++        ("`" + componentName + "`, expected instance of `" + expectedClassName + "`.")+      );+    }+    return null;+  }+  return createChainableTypeChecker(validate);+}++function createEnumTypeChecker(expectedValues) {+  function validate(props, propName, componentName, location) {+    var propValue = props[propName];+    for (var i = 0; i < expectedValues.length; i++) {+      if (propValue === expectedValues[i]) {+        return null;+      }+    }++    var locationName = ReactPropTypeLocationNames[location];+    var valuesString = JSON.stringify(expectedValues);+    return new Error(+      ("Invalid " + locationName + " `" + propName + "` of value `" + propValue + "` ") ++      ("supplied to `" + componentName + "`, expected one of " + valuesString + ".")+    );+  }+  return createChainableTypeChecker(validate);+}++function createObjectOfTypeChecker(typeChecker) {+  function validate(props, propName, componentName, location) {+    var propValue = props[propName];+    var propType = getPropType(propValue);+    if (propType !== 'object') {+      var locationName = ReactPropTypeLocationNames[location];+      return new Error(+        ("Invalid " + locationName + " `" + propName + "` of type ") ++        ("`" + propType + "` supplied to `" + componentName + "`, expected an object.")+      );+    }+    for (var key in propValue) {+      if (propValue.hasOwnProperty(key)) {+        var error = typeChecker(propValue, key, componentName, location);+        if (error instanceof Error) {+          return error;+        }+      }+    }+    return null;+  }+  return createChainableTypeChecker(validate);+}++function createUnionTypeChecker(arrayOfTypeCheckers) {+  function validate(props, propName, componentName, location) {+    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {+      var checker = arrayOfTypeCheckers[i];+      if (checker(props, propName, componentName, location) == null) {+        return null;+      }+    }++    var locationName = ReactPropTypeLocationNames[location];+    return new Error(+      ("Invalid " + locationName + " `" + propName + "` supplied to ") ++      ("`" + componentName + "`.")+    );+  }+  return createChainableTypeChecker(validate);+}++function createNodeChecker() {+  function validate(props, propName, componentName, location) {+    if (!isNode(props[propName])) {+      var locationName = ReactPropTypeLocationNames[location];+      return new Error(+        ("Invalid " + locationName + " `" + propName + "` supplied to ") ++        ("`" + componentName + "`, expected a ReactNode.")+      );+    }+    return null;+  }+  return createChainableTypeChecker(validate);+}++function createShapeTypeChecker(shapeTypes) {+  function validate(props, propName, componentName, location) {+    var propValue = props[propName];+    var propType = getPropType(propValue);+    if (propType !== 'object') {+      var locationName = ReactPropTypeLocationNames[location];+      return new Error(+        ("Invalid " + locationName + " `" + propName + "` of type `" + propType + "` ") ++        ("supplied to `" + componentName + "`, expected `object`.")+      );+    }+    for (var key in shapeTypes) {+      var checker = shapeTypes[key];+      if (!checker) {+        continue;+      }+      var error = checker(propValue, key, componentName, location);+      if (error) {+        return error;+      }+    }+    return null;+  }+  return createChainableTypeChecker(validate);+}++function isNode(propValue) {+  switch (typeof propValue) {+    case 'number':+    case 'string':+    case 'undefined':+      return true;+    case 'boolean':+      return !propValue;+    case 'object':+      if (Array.isArray(propValue)) {+        return propValue.every(isNode);+      }+      if (propValue === null || ReactElement.isValidElement(propValue)) {+        return true;+      }+      propValue = ReactFragment.extractIfFragment(propValue);+      for (var k in propValue) {+        if (!isNode(propValue[k])) {+          return false;+        }+      }+      return true;+    default:+      return false;+  }+}++// Equivalent of `typeof` but with special handling for array and regexp.+function getPropType(propValue) {+  var propType = typeof propValue;+  if (Array.isArray(propValue)) {+    return 'array';+  }+  if (propValue instanceof RegExp) {+    // Old webkits (at least until Android 4.0) return 'function' rather than+    // 'object' for typeof a RegExp. We'll normalize this here so that /bla/+    // passes PropTypes.object.+    return 'object';+  }+  return propType;+}++// This handles more types than `getPropType`. Only used for error messages.+// See `createPrimitiveTypeChecker`.+function getPreciseType(propValue) {+  var propType = getPropType(propValue);+  if (propType === 'object') {+    if (propValue instanceof Date) {+      return 'date';+    } else if (propValue instanceof RegExp) {+      return 'regexp';+    }+  }+  return propType;+}++module.exports = ReactPropTypes;++},{"114":114,"57":57,"63":63,"76":76}],79:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactPutListenerQueue+ */++'use strict';++var PooledClass = _dereq_(28);+var ReactBrowserEventEmitter = _dereq_(30);++var assign = _dereq_(27);++function ReactPutListenerQueue() {+  this.listenersToPut = [];+}++assign(ReactPutListenerQueue.prototype, {+  enqueuePutListener: function(rootNodeID, propKey, propValue) {+    this.listenersToPut.push({+      rootNodeID: rootNodeID,+      propKey: propKey,+      propValue: propValue+    });+  },++  putListeners: function() {+    for (var i = 0; i < this.listenersToPut.length; i++) {+      var listenerToPut = this.listenersToPut[i];+      ReactBrowserEventEmitter.putListener(+        listenerToPut.rootNodeID,+        listenerToPut.propKey,+        listenerToPut.propValue+      );+    }+  },++  reset: function() {+    this.listenersToPut.length = 0;+  },++  destructor: function() {+    this.reset();+  }+});++PooledClass.addPoolingTo(ReactPutListenerQueue);++module.exports = ReactPutListenerQueue;++},{"27":27,"28":28,"30":30}],80:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactReconcileTransaction+ * @typechecks static-only+ */++'use strict';++var CallbackQueue = _dereq_(6);+var PooledClass = _dereq_(28);+var ReactBrowserEventEmitter = _dereq_(30);+var ReactInputSelection = _dereq_(65);+var ReactPutListenerQueue = _dereq_(79);+var Transaction = _dereq_(103);++var assign = _dereq_(27);++/**+ * Ensures that, when possible, the selection range (currently selected text+ * input) is not disturbed by performing the transaction.+ */+var SELECTION_RESTORATION = {+  /**+   * @return {Selection} Selection information.+   */+  initialize: ReactInputSelection.getSelectionInformation,+  /**+   * @param {Selection} sel Selection information returned from `initialize`.+   */+  close: ReactInputSelection.restoreSelection+};++/**+ * Suppresses events (blur/focus) that could be inadvertently dispatched due to+ * high level DOM manipulations (like temporarily removing a text input from the+ * DOM).+ */+var EVENT_SUPPRESSION = {+  /**+   * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before+   * the reconciliation.+   */+  initialize: function() {+    var currentlyEnabled = ReactBrowserEventEmitter.isEnabled();+    ReactBrowserEventEmitter.setEnabled(false);+    return currentlyEnabled;+  },++  /**+   * @param {boolean} previouslyEnabled Enabled status of+   *   `ReactBrowserEventEmitter` before the reconciliation occured. `close`+   *   restores the previous value.+   */+  close: function(previouslyEnabled) {+    ReactBrowserEventEmitter.setEnabled(previouslyEnabled);+  }+};++/**+ * Provides a queue for collecting `componentDidMount` and+ * `componentDidUpdate` callbacks during the the transaction.+ */+var ON_DOM_READY_QUEUEING = {+  /**+   * Initializes the internal `onDOMReady` queue.+   */+  initialize: function() {+    this.reactMountReady.reset();+  },++  /**+   * After DOM is flushed, invoke all registered `onDOMReady` callbacks.+   */+  close: function() {+    this.reactMountReady.notifyAll();+  }+};++var PUT_LISTENER_QUEUEING = {+  initialize: function() {+    this.putListenerQueue.reset();+  },++  close: function() {+    this.putListenerQueue.putListeners();+  }+};++/**+ * Executed within the scope of the `Transaction` instance. Consider these as+ * being member methods, but with an implied ordering while being isolated from+ * each other.+ */+var TRANSACTION_WRAPPERS = [+  PUT_LISTENER_QUEUEING,+  SELECTION_RESTORATION,+  EVENT_SUPPRESSION,+  ON_DOM_READY_QUEUEING+];++/**+ * Currently:+ * - The order that these are listed in the transaction is critical:+ * - Suppresses events.+ * - Restores selection range.+ *+ * Future:+ * - Restore document/overflow scroll positions that were unintentionally+ *   modified via DOM insertions above the top viewport boundary.+ * - Implement/integrate with customized constraint based layout system and keep+ *   track of which dimensions must be remeasured.+ *+ * @class ReactReconcileTransaction+ */+function ReactReconcileTransaction() {+  this.reinitializeTransaction();+  // Only server-side rendering really needs this option (see+  // `ReactServerRendering`), but server-side uses+  // `ReactServerRenderingTransaction` instead. This option is here so that it's+  // accessible and defaults to false when `ReactDOMComponent` and+  // `ReactTextComponent` checks it in `mountComponent`.`+  this.renderToStaticMarkup = false;+  this.reactMountReady = CallbackQueue.getPooled(null);+  this.putListenerQueue = ReactPutListenerQueue.getPooled();+}++var Mixin = {+  /**+   * @see Transaction+   * @abstract+   * @final+   * @return {array<object>} List of operation wrap proceedures.+   *   TODO: convert to array<TransactionWrapper>+   */+  getTransactionWrappers: function() {+    return TRANSACTION_WRAPPERS;+  },++  /**+   * @return {object} The queue to collect `onDOMReady` callbacks with.+   */+  getReactMountReady: function() {+    return this.reactMountReady;+  },++  getPutListenerQueue: function() {+    return this.putListenerQueue;+  },++  /**+   * `PooledClass` looks for this, and will invoke this before allowing this+   * instance to be resused.+   */+  destructor: function() {+    CallbackQueue.release(this.reactMountReady);+    this.reactMountReady = null;++    ReactPutListenerQueue.release(this.putListenerQueue);+    this.putListenerQueue = null;+  }+};+++assign(ReactReconcileTransaction.prototype, Transaction.Mixin, Mixin);++PooledClass.addPoolingTo(ReactReconcileTransaction);++module.exports = ReactReconcileTransaction;++},{"103":103,"27":27,"28":28,"30":30,"6":6,"65":65,"79":79}],81:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactReconciler+ */++'use strict';++var ReactRef = _dereq_(82);+var ReactElementValidator = _dereq_(58);++/**+ * Helper to call ReactRef.attachRefs with this composite component, split out+ * to avoid allocations in the transaction mount-ready queue.+ */+function attachRefs() {+  ReactRef.attachRefs(this, this._currentElement);+}++var ReactReconciler = {++  /**+   * Initializes the component, renders markup, and registers event listeners.+   *+   * @param {ReactComponent} internalInstance+   * @param {string} rootID DOM ID of the root node.+   * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction+   * @return {?string} Rendered markup to be inserted into the DOM.+   * @final+   * @internal+   */+  mountComponent: function(internalInstance, rootID, transaction, context) {+    var markup = internalInstance.mountComponent(rootID, transaction, context);+    if ("production" !== "development") {+      ReactElementValidator.checkAndWarnForMutatedProps(+        internalInstance._currentElement+      );+    }+    transaction.getReactMountReady().enqueue(attachRefs, internalInstance);+    return markup;+  },++  /**+   * Releases any resources allocated by `mountComponent`.+   *+   * @final+   * @internal+   */+  unmountComponent: function(internalInstance) {+    ReactRef.detachRefs(internalInstance, internalInstance._currentElement);+    internalInstance.unmountComponent();+  },++  /**+   * Update a component using a new element.+   *+   * @param {ReactComponent} internalInstance+   * @param {ReactElement} nextElement+   * @param {ReactReconcileTransaction} transaction+   * @param {object} context+   * @internal+   */+  receiveComponent: function(+    internalInstance, nextElement, transaction, context+  ) {+    var prevElement = internalInstance._currentElement;++    if (nextElement === prevElement && nextElement._owner != null) {+      // Since elements are immutable after the owner is rendered,+      // we can do a cheap identity compare here to determine if this is a+      // superfluous reconcile. It's possible for state to be mutable but such+      // change should trigger an update of the owner which would recreate+      // the element. We explicitly check for the existence of an owner since+      // it's possible for an element created outside a composite to be+      // deeply mutated and reused.+      return;+    }++    if ("production" !== "development") {+      ReactElementValidator.checkAndWarnForMutatedProps(nextElement);+    }++    var refsChanged = ReactRef.shouldUpdateRefs(+      prevElement,+      nextElement+    );++    if (refsChanged) {+      ReactRef.detachRefs(internalInstance, prevElement);+    }++    internalInstance.receiveComponent(nextElement, transaction, context);++    if (refsChanged) {+      transaction.getReactMountReady().enqueue(attachRefs, internalInstance);+    }+  },++  /**+   * Flush any dirty changes in a component.+   *+   * @param {ReactComponent} internalInstance+   * @param {ReactReconcileTransaction} transaction+   * @internal+   */+  performUpdateIfNecessary: function(+    internalInstance,+    transaction+  ) {+    internalInstance.performUpdateIfNecessary(transaction);+  }++};++module.exports = ReactReconciler;++},{"58":58,"82":82}],82:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactRef+ */++'use strict';++var ReactOwner = _dereq_(74);++var ReactRef = {};++function attachRef(ref, component, owner) {+  if (typeof ref === 'function') {+    ref(component.getPublicInstance());+  } else {+    // Legacy ref+    ReactOwner.addComponentAsRefTo(component, ref, owner);+  }+}++function detachRef(ref, component, owner) {+  if (typeof ref === 'function') {+    ref(null);+  } else {+    // Legacy ref+    ReactOwner.removeComponentAsRefFrom(component, ref, owner);+  }+}++ReactRef.attachRefs = function(instance, element) {+  var ref = element.ref;+  if (ref != null) {+    attachRef(ref, instance, element._owner);+  }+};++ReactRef.shouldUpdateRefs = function(prevElement, nextElement) {+  // If either the owner or a `ref` has changed, make sure the newest owner+  // has stored a reference to `this`, and the previous owner (if different)+  // has forgotten the reference to `this`. We use the element instead+  // of the public this.props because the post processing cannot determine+  // a ref. The ref conceptually lives on the element.++  // TODO: Should this even be possible? The owner cannot change because+  // it's forbidden by shouldUpdateReactComponent. The ref can change+  // if you swap the keys of but not the refs. Reconsider where this check+  // is made. It probably belongs where the key checking and+  // instantiateReactComponent is done.++  return (+    nextElement._owner !== prevElement._owner ||+    nextElement.ref !== prevElement.ref+  );+};++ReactRef.detachRefs = function(instance, element) {+  var ref = element.ref;+  if (ref != null) {+    detachRef(ref, instance, element._owner);+  }+};++module.exports = ReactRef;++},{"74":74}],83:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactRootIndex+ * @typechecks+ */++'use strict';++var ReactRootIndexInjection = {+  /**+   * @param {function} _createReactRootIndex+   */+  injectCreateReactRootIndex: function(_createReactRootIndex) {+    ReactRootIndex.createReactRootIndex = _createReactRootIndex;+  }+};++var ReactRootIndex = {+  createReactRootIndex: null,+  injection: ReactRootIndexInjection+};++module.exports = ReactRootIndex;++},{}],84:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @typechecks static-only+ * @providesModule ReactServerRendering+ */+'use strict';++var ReactElement = _dereq_(57);+var ReactInstanceHandles = _dereq_(66);+var ReactMarkupChecksum = _dereq_(69);+var ReactServerRenderingTransaction =+  _dereq_(85);++var emptyObject = _dereq_(115);+var instantiateReactComponent = _dereq_(134);+var invariant = _dereq_(135);++/**+ * @param {ReactElement} element+ * @return {string} the HTML markup+ */+function renderToString(element) {+  ("production" !== "development" ? invariant(+    ReactElement.isValidElement(element),+    'renderToString(): You must pass a valid ReactElement.'+  ) : invariant(ReactElement.isValidElement(element)));++  var transaction;+  try {+    var id = ReactInstanceHandles.createReactRootID();+    transaction = ReactServerRenderingTransaction.getPooled(false);++    return transaction.perform(function() {+      var componentInstance = instantiateReactComponent(element, null);+      var markup =+        componentInstance.mountComponent(id, transaction, emptyObject);+      return ReactMarkupChecksum.addChecksumToMarkup(markup);+    }, null);+  } finally {+    ReactServerRenderingTransaction.release(transaction);+  }+}++/**+ * @param {ReactElement} element+ * @return {string} the HTML markup, without the extra React ID and checksum+ * (for generating static pages)+ */+function renderToStaticMarkup(element) {+  ("production" !== "development" ? invariant(+    ReactElement.isValidElement(element),+    'renderToStaticMarkup(): You must pass a valid ReactElement.'+  ) : invariant(ReactElement.isValidElement(element)));++  var transaction;+  try {+    var id = ReactInstanceHandles.createReactRootID();+    transaction = ReactServerRenderingTransaction.getPooled(true);++    return transaction.perform(function() {+      var componentInstance = instantiateReactComponent(element, null);+      return componentInstance.mountComponent(id, transaction, emptyObject);+    }, null);+  } finally {+    ReactServerRenderingTransaction.release(transaction);+  }+}++module.exports = {+  renderToString: renderToString,+  renderToStaticMarkup: renderToStaticMarkup+};++},{"115":115,"134":134,"135":135,"57":57,"66":66,"69":69,"85":85}],85:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactServerRenderingTransaction+ * @typechecks+ */++'use strict';++var PooledClass = _dereq_(28);+var CallbackQueue = _dereq_(6);+var ReactPutListenerQueue = _dereq_(79);+var Transaction = _dereq_(103);++var assign = _dereq_(27);+var emptyFunction = _dereq_(114);++/**+ * Provides a `CallbackQueue` queue for collecting `onDOMReady` callbacks+ * during the performing of the transaction.+ */+var ON_DOM_READY_QUEUEING = {+  /**+   * Initializes the internal `onDOMReady` queue.+   */+  initialize: function() {+    this.reactMountReady.reset();+  },++  close: emptyFunction+};++var PUT_LISTENER_QUEUEING = {+  initialize: function() {+    this.putListenerQueue.reset();+  },++  close: emptyFunction+};++/**+ * Executed within the scope of the `Transaction` instance. Consider these as+ * being member methods, but with an implied ordering while being isolated from+ * each other.+ */+var TRANSACTION_WRAPPERS = [+  PUT_LISTENER_QUEUEING,+  ON_DOM_READY_QUEUEING+];++/**+ * @class ReactServerRenderingTransaction+ * @param {boolean} renderToStaticMarkup+ */+function ReactServerRenderingTransaction(renderToStaticMarkup) {+  this.reinitializeTransaction();+  this.renderToStaticMarkup = renderToStaticMarkup;+  this.reactMountReady = CallbackQueue.getPooled(null);+  this.putListenerQueue = ReactPutListenerQueue.getPooled();+}++var Mixin = {+  /**+   * @see Transaction+   * @abstract+   * @final+   * @return {array} Empty list of operation wrap proceedures.+   */+  getTransactionWrappers: function() {+    return TRANSACTION_WRAPPERS;+  },++  /**+   * @return {object} The queue to collect `onDOMReady` callbacks with.+   */+  getReactMountReady: function() {+    return this.reactMountReady;+  },++  getPutListenerQueue: function() {+    return this.putListenerQueue;+  },++  /**+   * `PooledClass` looks for this, and will invoke this before allowing this+   * instance to be resused.+   */+  destructor: function() {+    CallbackQueue.release(this.reactMountReady);+    this.reactMountReady = null;++    ReactPutListenerQueue.release(this.putListenerQueue);+    this.putListenerQueue = null;+  }+};+++assign(+  ReactServerRenderingTransaction.prototype,+  Transaction.Mixin,+  Mixin+);++PooledClass.addPoolingTo(ReactServerRenderingTransaction);++module.exports = ReactServerRenderingTransaction;++},{"103":103,"114":114,"27":27,"28":28,"6":6,"79":79}],86:[function(_dereq_,module,exports){+/**+ * Copyright 2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactUpdateQueue+ */++'use strict';++var ReactLifeCycle = _dereq_(68);+var ReactCurrentOwner = _dereq_(39);+var ReactElement = _dereq_(57);+var ReactInstanceMap = _dereq_(67);+var ReactUpdates = _dereq_(87);++var assign = _dereq_(27);+var invariant = _dereq_(135);+var warning = _dereq_(154);++function enqueueUpdate(internalInstance) {+  if (internalInstance !== ReactLifeCycle.currentlyMountingInstance) {+    // If we're in a componentWillMount handler, don't enqueue a rerender+    // because ReactUpdates assumes we're in a browser context (which is+    // wrong for server rendering) and we're about to do a render anyway.+    // See bug in #1740.+    ReactUpdates.enqueueUpdate(internalInstance);+  }+}++function getInternalInstanceReadyForUpdate(publicInstance, callerName) {+  ("production" !== "development" ? invariant(+    ReactCurrentOwner.current == null,+    '%s(...): Cannot update during an existing state transition ' ++    '(such as within `render`). Render methods should be a pure function ' ++    'of props and state.',+    callerName+  ) : invariant(ReactCurrentOwner.current == null));++  var internalInstance = ReactInstanceMap.get(publicInstance);+  if (!internalInstance) {+    if ("production" !== "development") {+      // Only warn when we have a callerName. Otherwise we should be silent.+      // We're probably calling from enqueueCallback. We don't want to warn+      // there because we already warned for the corresponding lifecycle method.+      ("production" !== "development" ? warning(+        !callerName,+        '%s(...): Can only update a mounted or mounting component. ' ++        'This usually means you called %s() on an unmounted ' ++        'component. This is a no-op.',+        callerName,+        callerName+      ) : null);+    }+    return null;+  }++  if (internalInstance === ReactLifeCycle.currentlyUnmountingInstance) {+    return null;+  }++  return internalInstance;+}++/**+ * ReactUpdateQueue allows for state updates to be scheduled into a later+ * reconciliation step.+ */+var ReactUpdateQueue = {++  /**+   * Enqueue a callback that will be executed after all the pending updates+   * have processed.+   *+   * @param {ReactClass} publicInstance The instance to use as `this` context.+   * @param {?function} callback Called after state is updated.+   * @internal+   */+  enqueueCallback: function(publicInstance, callback) {+    ("production" !== "development" ? invariant(+      typeof callback === 'function',+      'enqueueCallback(...): You called `setProps`, `replaceProps`, ' ++      '`setState`, `replaceState`, or `forceUpdate` with a callback that ' ++      'isn\'t callable.'+    ) : invariant(typeof callback === 'function'));+    var internalInstance = getInternalInstanceReadyForUpdate(publicInstance);++    // Previously we would throw an error if we didn't have an internal+    // instance. Since we want to make it a no-op instead, we mirror the same+    // behavior we have in other enqueue* methods.+    // We also need to ignore callbacks in componentWillMount. See+    // enqueueUpdates.+    if (!internalInstance ||+        internalInstance === ReactLifeCycle.currentlyMountingInstance) {+      return null;+    }++    if (internalInstance._pendingCallbacks) {+      internalInstance._pendingCallbacks.push(callback);+    } else {+      internalInstance._pendingCallbacks = [callback];+    }+    // TODO: The callback here is ignored when setState is called from+    // componentWillMount. Either fix it or disallow doing so completely in+    // favor of getInitialState. Alternatively, we can disallow+    // componentWillMount during server-side rendering.+    enqueueUpdate(internalInstance);+  },++  enqueueCallbackInternal: function(internalInstance, callback) {+    ("production" !== "development" ? invariant(+      typeof callback === 'function',+      'enqueueCallback(...): You called `setProps`, `replaceProps`, ' ++      '`setState`, `replaceState`, or `forceUpdate` with a callback that ' ++      'isn\'t callable.'+    ) : invariant(typeof callback === 'function'));+    if (internalInstance._pendingCallbacks) {+      internalInstance._pendingCallbacks.push(callback);+    } else {+      internalInstance._pendingCallbacks = [callback];+    }+    enqueueUpdate(internalInstance);+  },++  /**+   * Forces an update. This should only be invoked when it is known with+   * certainty that we are **not** in a DOM transaction.+   *+   * You may want to call this when you know that some deeper aspect of the+   * component's state has changed but `setState` was not called.+   *+   * This will not invoke `shouldUpdateComponent`, but it will invoke+   * `componentWillUpdate` and `componentDidUpdate`.+   *+   * @param {ReactClass} publicInstance The instance that should rerender.+   * @internal+   */+  enqueueForceUpdate: function(publicInstance) {+    var internalInstance = getInternalInstanceReadyForUpdate(+      publicInstance,+      'forceUpdate'+    );++    if (!internalInstance) {+      return;+    }++    internalInstance._pendingForceUpdate = true;++    enqueueUpdate(internalInstance);+  },++  /**+   * Replaces all of the state. Always use this or `setState` to mutate state.+   * You should treat `this.state` as immutable.+   *+   * There is no guarantee that `this.state` will be immediately updated, so+   * accessing `this.state` after calling this method may return the old value.+   *+   * @param {ReactClass} publicInstance The instance that should rerender.+   * @param {object} completeState Next state.+   * @internal+   */+  enqueueReplaceState: function(publicInstance, completeState) {+    var internalInstance = getInternalInstanceReadyForUpdate(+      publicInstance,+      'replaceState'+    );++    if (!internalInstance) {+      return;+    }++    internalInstance._pendingStateQueue = [completeState];+    internalInstance._pendingReplaceState = true;++    enqueueUpdate(internalInstance);+  },++  /**+   * Sets a subset of the state. This only exists because _pendingState is+   * internal. This provides a merging strategy that is not available to deep+   * properties which is confusing. TODO: Expose pendingState or don't use it+   * during the merge.+   *+   * @param {ReactClass} publicInstance The instance that should rerender.+   * @param {object} partialState Next partial state to be merged with state.+   * @internal+   */+  enqueueSetState: function(publicInstance, partialState) {+    var internalInstance = getInternalInstanceReadyForUpdate(+      publicInstance,+      'setState'+    );++    if (!internalInstance) {+      return;+    }++    var queue =+      internalInstance._pendingStateQueue ||+      (internalInstance._pendingStateQueue = []);+    queue.push(partialState);++    enqueueUpdate(internalInstance);+  },++  /**+   * Sets a subset of the props.+   *+   * @param {ReactClass} publicInstance The instance that should rerender.+   * @param {object} partialProps Subset of the next props.+   * @internal+   */+  enqueueSetProps: function(publicInstance, partialProps) {+    var internalInstance = getInternalInstanceReadyForUpdate(+      publicInstance,+      'setProps'+    );++    if (!internalInstance) {+      return;+    }++    ("production" !== "development" ? invariant(+      internalInstance._isTopLevel,+      'setProps(...): You called `setProps` on a ' ++      'component with a parent. This is an anti-pattern since props will ' ++      'get reactively updated when rendered. Instead, change the owner\'s ' ++      '`render` method to pass the correct value as props to the component ' ++      'where it is created.'+    ) : invariant(internalInstance._isTopLevel));++    // Merge with the pending element if it exists, otherwise with existing+    // element props.+    var element = internalInstance._pendingElement ||+                  internalInstance._currentElement;+    var props = assign({}, element.props, partialProps);+    internalInstance._pendingElement = ReactElement.cloneAndReplaceProps(+      element,+      props+    );++    enqueueUpdate(internalInstance);+  },++  /**+   * Replaces all of the props.+   *+   * @param {ReactClass} publicInstance The instance that should rerender.+   * @param {object} props New props.+   * @internal+   */+  enqueueReplaceProps: function(publicInstance, props) {+    var internalInstance = getInternalInstanceReadyForUpdate(+      publicInstance,+      'replaceProps'+    );++    if (!internalInstance) {+      return;+    }++    ("production" !== "development" ? invariant(+      internalInstance._isTopLevel,+      'replaceProps(...): You called `replaceProps` on a ' ++      'component with a parent. This is an anti-pattern since props will ' ++      'get reactively updated when rendered. Instead, change the owner\'s ' ++      '`render` method to pass the correct value as props to the component ' ++      'where it is created.'+    ) : invariant(internalInstance._isTopLevel));++    // Merge with the pending element if it exists, otherwise with existing+    // element props.+    var element = internalInstance._pendingElement ||+                  internalInstance._currentElement;+    internalInstance._pendingElement = ReactElement.cloneAndReplaceProps(+      element,+      props+    );++    enqueueUpdate(internalInstance);+  },++  enqueueElementInternal: function(internalInstance, newElement) {+    internalInstance._pendingElement = newElement;+    enqueueUpdate(internalInstance);+  }++};++module.exports = ReactUpdateQueue;++},{"135":135,"154":154,"27":27,"39":39,"57":57,"67":67,"68":68,"87":87}],87:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ReactUpdates+ */++'use strict';++var CallbackQueue = _dereq_(6);+var PooledClass = _dereq_(28);+var ReactCurrentOwner = _dereq_(39);+var ReactPerf = _dereq_(75);+var ReactReconciler = _dereq_(81);+var Transaction = _dereq_(103);++var assign = _dereq_(27);+var invariant = _dereq_(135);+var warning = _dereq_(154);++var dirtyComponents = [];+var asapCallbackQueue = CallbackQueue.getPooled();+var asapEnqueued = false;++var batchingStrategy = null;++function ensureInjected() {+  ("production" !== "development" ? invariant(+    ReactUpdates.ReactReconcileTransaction && batchingStrategy,+    'ReactUpdates: must inject a reconcile transaction class and batching ' ++    'strategy'+  ) : invariant(ReactUpdates.ReactReconcileTransaction && batchingStrategy));+}++var NESTED_UPDATES = {+  initialize: function() {+    this.dirtyComponentsLength = dirtyComponents.length;+  },+  close: function() {+    if (this.dirtyComponentsLength !== dirtyComponents.length) {+      // Additional updates were enqueued by componentDidUpdate handlers or+      // similar; before our own UPDATE_QUEUEING wrapper closes, we want to run+      // these new updates so that if A's componentDidUpdate calls setState on+      // B, B will update before the callback A's updater provided when calling+      // setState.+      dirtyComponents.splice(0, this.dirtyComponentsLength);+      flushBatchedUpdates();+    } else {+      dirtyComponents.length = 0;+    }+  }+};++var UPDATE_QUEUEING = {+  initialize: function() {+    this.callbackQueue.reset();+  },+  close: function() {+    this.callbackQueue.notifyAll();+  }+};++var TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING];++function ReactUpdatesFlushTransaction() {+  this.reinitializeTransaction();+  this.dirtyComponentsLength = null;+  this.callbackQueue = CallbackQueue.getPooled();+  this.reconcileTransaction =+    ReactUpdates.ReactReconcileTransaction.getPooled();+}++assign(+  ReactUpdatesFlushTransaction.prototype,+  Transaction.Mixin, {+  getTransactionWrappers: function() {+    return TRANSACTION_WRAPPERS;+  },++  destructor: function() {+    this.dirtyComponentsLength = null;+    CallbackQueue.release(this.callbackQueue);+    this.callbackQueue = null;+    ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction);+    this.reconcileTransaction = null;+  },++  perform: function(method, scope, a) {+    // Essentially calls `this.reconcileTransaction.perform(method, scope, a)`+    // with this transaction's wrappers around it.+    return Transaction.Mixin.perform.call(+      this,+      this.reconcileTransaction.perform,+      this.reconcileTransaction,+      method,+      scope,+      a+    );+  }+});++PooledClass.addPoolingTo(ReactUpdatesFlushTransaction);++function batchedUpdates(callback, a, b, c, d) {+  ensureInjected();+  batchingStrategy.batchedUpdates(callback, a, b, c, d);+}++/**+ * Array comparator for ReactComponents by mount ordering.+ *+ * @param {ReactComponent} c1 first component you're comparing+ * @param {ReactComponent} c2 second component you're comparing+ * @return {number} Return value usable by Array.prototype.sort().+ */+function mountOrderComparator(c1, c2) {+  return c1._mountOrder - c2._mountOrder;+}++function runBatchedUpdates(transaction) {+  var len = transaction.dirtyComponentsLength;+  ("production" !== "development" ? invariant(+    len === dirtyComponents.length,+    'Expected flush transaction\'s stored dirty-components length (%s) to ' ++    'match dirty-components array length (%s).',+    len,+    dirtyComponents.length+  ) : invariant(len === dirtyComponents.length));++  // Since reconciling a component higher in the owner hierarchy usually (not+  // always -- see shouldComponentUpdate()) will reconcile children, reconcile+  // them before their children by sorting the array.+  dirtyComponents.sort(mountOrderComparator);++  for (var i = 0; i < len; i++) {+    // If a component is unmounted before pending changes apply, it will still+    // be here, but we assume that it has cleared its _pendingCallbacks and+    // that performUpdateIfNecessary is a noop.+    var component = dirtyComponents[i];++    // If performUpdateIfNecessary happens to enqueue any new updates, we+    // shouldn't execute the callbacks until the next render happens, so+    // stash the callbacks first+    var callbacks = component._pendingCallbacks;+    component._pendingCallbacks = null;++    ReactReconciler.performUpdateIfNecessary(+      component,+      transaction.reconcileTransaction+    );++    if (callbacks) {+      for (var j = 0; j < callbacks.length; j++) {+        transaction.callbackQueue.enqueue(+          callbacks[j],+          component.getPublicInstance()+        );+      }+    }+  }+}++var flushBatchedUpdates = function() {+  // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents+  // array and perform any updates enqueued by mount-ready handlers (i.e.,+  // componentDidUpdate) but we need to check here too in order to catch+  // updates enqueued by setState callbacks and asap calls.+  while (dirtyComponents.length || asapEnqueued) {+    if (dirtyComponents.length) {+      var transaction = ReactUpdatesFlushTransaction.getPooled();+      transaction.perform(runBatchedUpdates, null, transaction);+      ReactUpdatesFlushTransaction.release(transaction);+    }++    if (asapEnqueued) {+      asapEnqueued = false;+      var queue = asapCallbackQueue;+      asapCallbackQueue = CallbackQueue.getPooled();+      queue.notifyAll();+      CallbackQueue.release(queue);+    }+  }+};+flushBatchedUpdates = ReactPerf.measure(+  'ReactUpdates',+  'flushBatchedUpdates',+  flushBatchedUpdates+);++/**+ * Mark a component as needing a rerender, adding an optional callback to a+ * list of functions which will be executed once the rerender occurs.+ */+function enqueueUpdate(component) {+  ensureInjected();++  // Various parts of our code (such as ReactCompositeComponent's+  // _renderValidatedComponent) assume that calls to render aren't nested;+  // verify that that's the case. (This is called by each top-level update+  // function, like setProps, setState, forceUpdate, etc.; creation and+  // destruction of top-level components is guarded in ReactMount.)+  ("production" !== "development" ? warning(+    ReactCurrentOwner.current == null,+    'enqueueUpdate(): Render methods should be a pure function of props ' ++    'and state; triggering nested component updates from render is not ' ++    'allowed. If necessary, trigger nested updates in ' ++    'componentDidUpdate.'+  ) : null);++  if (!batchingStrategy.isBatchingUpdates) {+    batchingStrategy.batchedUpdates(enqueueUpdate, component);+    return;+  }++  dirtyComponents.push(component);+}++/**+ * Enqueue a callback to be run at the end of the current batching cycle. Throws+ * if no updates are currently being performed.+ */+function asap(callback, context) {+  ("production" !== "development" ? invariant(+    batchingStrategy.isBatchingUpdates,+    'ReactUpdates.asap: Can\'t enqueue an asap callback in a context where' ++    'updates are not being batched.'+  ) : invariant(batchingStrategy.isBatchingUpdates));+  asapCallbackQueue.enqueue(callback, context);+  asapEnqueued = true;+}++var ReactUpdatesInjection = {+  injectReconcileTransaction: function(ReconcileTransaction) {+    ("production" !== "development" ? invariant(+      ReconcileTransaction,+      'ReactUpdates: must provide a reconcile transaction class'+    ) : invariant(ReconcileTransaction));+    ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;+  },++  injectBatchingStrategy: function(_batchingStrategy) {+    ("production" !== "development" ? invariant(+      _batchingStrategy,+      'ReactUpdates: must provide a batching strategy'+    ) : invariant(_batchingStrategy));+    ("production" !== "development" ? invariant(+      typeof _batchingStrategy.batchedUpdates === 'function',+      'ReactUpdates: must provide a batchedUpdates() function'+    ) : invariant(typeof _batchingStrategy.batchedUpdates === 'function'));+    ("production" !== "development" ? invariant(+      typeof _batchingStrategy.isBatchingUpdates === 'boolean',+      'ReactUpdates: must provide an isBatchingUpdates boolean attribute'+    ) : invariant(typeof _batchingStrategy.isBatchingUpdates === 'boolean'));+    batchingStrategy = _batchingStrategy;+  }+};++var ReactUpdates = {+  /**+   * React references `ReactReconcileTransaction` using this property in order+   * to allow dependency injection.+   *+   * @internal+   */+  ReactReconcileTransaction: null,++  batchedUpdates: batchedUpdates,+  enqueueUpdate: enqueueUpdate,+  flushBatchedUpdates: flushBatchedUpdates,+  injection: ReactUpdatesInjection,+  asap: asap+};++module.exports = ReactUpdates;++},{"103":103,"135":135,"154":154,"27":27,"28":28,"39":39,"6":6,"75":75,"81":81}],88:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SVGDOMPropertyConfig+ */++/*jslint bitwise: true*/++'use strict';++var DOMProperty = _dereq_(10);++var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;++var SVGDOMPropertyConfig = {+  Properties: {+    clipPath: MUST_USE_ATTRIBUTE,+    cx: MUST_USE_ATTRIBUTE,+    cy: MUST_USE_ATTRIBUTE,+    d: MUST_USE_ATTRIBUTE,+    dx: MUST_USE_ATTRIBUTE,+    dy: MUST_USE_ATTRIBUTE,+    fill: MUST_USE_ATTRIBUTE,+    fillOpacity: MUST_USE_ATTRIBUTE,+    fontFamily: MUST_USE_ATTRIBUTE,+    fontSize: MUST_USE_ATTRIBUTE,+    fx: MUST_USE_ATTRIBUTE,+    fy: MUST_USE_ATTRIBUTE,+    gradientTransform: MUST_USE_ATTRIBUTE,+    gradientUnits: MUST_USE_ATTRIBUTE,+    markerEnd: MUST_USE_ATTRIBUTE,+    markerMid: MUST_USE_ATTRIBUTE,+    markerStart: MUST_USE_ATTRIBUTE,+    offset: MUST_USE_ATTRIBUTE,+    opacity: MUST_USE_ATTRIBUTE,+    patternContentUnits: MUST_USE_ATTRIBUTE,+    patternUnits: MUST_USE_ATTRIBUTE,+    points: MUST_USE_ATTRIBUTE,+    preserveAspectRatio: MUST_USE_ATTRIBUTE,+    r: MUST_USE_ATTRIBUTE,+    rx: MUST_USE_ATTRIBUTE,+    ry: MUST_USE_ATTRIBUTE,+    spreadMethod: MUST_USE_ATTRIBUTE,+    stopColor: MUST_USE_ATTRIBUTE,+    stopOpacity: MUST_USE_ATTRIBUTE,+    stroke: MUST_USE_ATTRIBUTE,+    strokeDasharray: MUST_USE_ATTRIBUTE,+    strokeLinecap: MUST_USE_ATTRIBUTE,+    strokeOpacity: MUST_USE_ATTRIBUTE,+    strokeWidth: MUST_USE_ATTRIBUTE,+    textAnchor: MUST_USE_ATTRIBUTE,+    transform: MUST_USE_ATTRIBUTE,+    version: MUST_USE_ATTRIBUTE,+    viewBox: MUST_USE_ATTRIBUTE,+    x1: MUST_USE_ATTRIBUTE,+    x2: MUST_USE_ATTRIBUTE,+    x: MUST_USE_ATTRIBUTE,+    y1: MUST_USE_ATTRIBUTE,+    y2: MUST_USE_ATTRIBUTE,+    y: MUST_USE_ATTRIBUTE+  },+  DOMAttributeNames: {+    clipPath: 'clip-path',+    fillOpacity: 'fill-opacity',+    fontFamily: 'font-family',+    fontSize: 'font-size',+    gradientTransform: 'gradientTransform',+    gradientUnits: 'gradientUnits',+    markerEnd: 'marker-end',+    markerMid: 'marker-mid',+    markerStart: 'marker-start',+    patternContentUnits: 'patternContentUnits',+    patternUnits: 'patternUnits',+    preserveAspectRatio: 'preserveAspectRatio',+    spreadMethod: 'spreadMethod',+    stopColor: 'stop-color',+    stopOpacity: 'stop-opacity',+    strokeDasharray: 'stroke-dasharray',+    strokeLinecap: 'stroke-linecap',+    strokeOpacity: 'stroke-opacity',+    strokeWidth: 'stroke-width',+    textAnchor: 'text-anchor',+    viewBox: 'viewBox'+  }+};++module.exports = SVGDOMPropertyConfig;++},{"10":10}],89:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SelectEventPlugin+ */++'use strict';++var EventConstants = _dereq_(15);+var EventPropagators = _dereq_(20);+var ReactInputSelection = _dereq_(65);+var SyntheticEvent = _dereq_(95);++var getActiveElement = _dereq_(121);+var isTextInputElement = _dereq_(138);+var keyOf = _dereq_(141);+var shallowEqual = _dereq_(150);++var topLevelTypes = EventConstants.topLevelTypes;++var eventTypes = {+  select: {+    phasedRegistrationNames: {+      bubbled: keyOf({onSelect: null}),+      captured: keyOf({onSelectCapture: null})+    },+    dependencies: [+      topLevelTypes.topBlur,+      topLevelTypes.topContextMenu,+      topLevelTypes.topFocus,+      topLevelTypes.topKeyDown,+      topLevelTypes.topMouseDown,+      topLevelTypes.topMouseUp,+      topLevelTypes.topSelectionChange+    ]+  }+};++var activeElement = null;+var activeElementID = null;+var lastSelection = null;+var mouseDown = false;++/**+ * Get an object which is a unique representation of the current selection.+ *+ * The return value will not be consistent across nodes or browsers, but+ * two identical selections on the same node will return identical objects.+ *+ * @param {DOMElement} node+ * @param {object}+ */+function getSelection(node) {+  if ('selectionStart' in node &&+      ReactInputSelection.hasSelectionCapabilities(node)) {+    return {+      start: node.selectionStart,+      end: node.selectionEnd+    };+  } else if (window.getSelection) {+    var selection = window.getSelection();+    return {+      anchorNode: selection.anchorNode,+      anchorOffset: selection.anchorOffset,+      focusNode: selection.focusNode,+      focusOffset: selection.focusOffset+    };+  } else if (document.selection) {+    var range = document.selection.createRange();+    return {+      parentElement: range.parentElement(),+      text: range.text,+      top: range.boundingTop,+      left: range.boundingLeft+    };+  }+}++/**+ * Poll selection to see whether it's changed.+ *+ * @param {object} nativeEvent+ * @return {?SyntheticEvent}+ */+function constructSelectEvent(nativeEvent) {+  // Ensure we have the right element, and that the user is not dragging a+  // selection (this matches native `select` event behavior). In HTML5, select+  // fires only on input and textarea thus if there's no focused element we+  // won't dispatch.+  if (mouseDown ||+      activeElement == null ||+      activeElement !== getActiveElement()) {+    return null;+  }++  // Only fire when selection has actually changed.+  var currentSelection = getSelection(activeElement);+  if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {+    lastSelection = currentSelection;++    var syntheticEvent = SyntheticEvent.getPooled(+      eventTypes.select,+      activeElementID,+      nativeEvent+    );++    syntheticEvent.type = 'select';+    syntheticEvent.target = activeElement;++    EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent);++    return syntheticEvent;+  }+}++/**+ * This plugin creates an `onSelect` event that normalizes select events+ * across form elements.+ *+ * Supported elements are:+ * - input (see `isTextInputElement`)+ * - textarea+ * - contentEditable+ *+ * This differs from native browser implementations in the following ways:+ * - Fires on contentEditable fields as well as inputs.+ * - Fires for collapsed selection.+ * - Fires after user input.+ */+var SelectEventPlugin = {++  eventTypes: eventTypes,++  /**+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {DOMEventTarget} topLevelTarget The listening component root node.+   * @param {string} topLevelTargetID ID of `topLevelTarget`.+   * @param {object} nativeEvent Native browser event.+   * @return {*} An accumulation of synthetic events.+   * @see {EventPluginHub.extractEvents}+   */+  extractEvents: function(+      topLevelType,+      topLevelTarget,+      topLevelTargetID,+      nativeEvent) {++    switch (topLevelType) {+      // Track the input node that has focus.+      case topLevelTypes.topFocus:+        if (isTextInputElement(topLevelTarget) ||+            topLevelTarget.contentEditable === 'true') {+          activeElement = topLevelTarget;+          activeElementID = topLevelTargetID;+          lastSelection = null;+        }+        break;+      case topLevelTypes.topBlur:+        activeElement = null;+        activeElementID = null;+        lastSelection = null;+        break;++      // Don't fire the event while the user is dragging. This matches the+      // semantics of the native select event.+      case topLevelTypes.topMouseDown:+        mouseDown = true;+        break;+      case topLevelTypes.topContextMenu:+      case topLevelTypes.topMouseUp:+        mouseDown = false;+        return constructSelectEvent(nativeEvent);++      // Chrome and IE fire non-standard event when selection is changed (and+      // sometimes when it hasn't).+      // Firefox doesn't support selectionchange, so check selection status+      // after each key entry. The selection changes after keydown and before+      // keyup, but we check on keydown as well in the case of holding down a+      // key, when multiple keydown events are fired but only one keyup is.+      case topLevelTypes.topSelectionChange:+      case topLevelTypes.topKeyDown:+      case topLevelTypes.topKeyUp:+        return constructSelectEvent(nativeEvent);+    }+  }+};++module.exports = SelectEventPlugin;++},{"121":121,"138":138,"141":141,"15":15,"150":150,"20":20,"65":65,"95":95}],90:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ServerReactRootIndex+ * @typechecks+ */++'use strict';++/**+ * Size of the reactRoot ID space. We generate random numbers for React root+ * IDs and if there's a collision the events and DOM update system will+ * get confused. In the future we need a way to generate GUIDs but for+ * now this will work on a smaller scale.+ */+var GLOBAL_MOUNT_POINT_MAX = Math.pow(2, 53);++var ServerReactRootIndex = {+  createReactRootIndex: function() {+    return Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX);+  }+};++module.exports = ServerReactRootIndex;++},{}],91:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SimpleEventPlugin+ */++'use strict';++var EventConstants = _dereq_(15);+var EventPluginUtils = _dereq_(19);+var EventPropagators = _dereq_(20);+var SyntheticClipboardEvent = _dereq_(92);+var SyntheticEvent = _dereq_(95);+var SyntheticFocusEvent = _dereq_(96);+var SyntheticKeyboardEvent = _dereq_(98);+var SyntheticMouseEvent = _dereq_(99);+var SyntheticDragEvent = _dereq_(94);+var SyntheticTouchEvent = _dereq_(100);+var SyntheticUIEvent = _dereq_(101);+var SyntheticWheelEvent = _dereq_(102);++var getEventCharCode = _dereq_(122);++var invariant = _dereq_(135);+var keyOf = _dereq_(141);+var warning = _dereq_(154);++var topLevelTypes = EventConstants.topLevelTypes;++var eventTypes = {+  blur: {+    phasedRegistrationNames: {+      bubbled: keyOf({onBlur: true}),+      captured: keyOf({onBlurCapture: true})+    }+  },+  click: {+    phasedRegistrationNames: {+      bubbled: keyOf({onClick: true}),+      captured: keyOf({onClickCapture: true})+    }+  },+  contextMenu: {+    phasedRegistrationNames: {+      bubbled: keyOf({onContextMenu: true}),+      captured: keyOf({onContextMenuCapture: true})+    }+  },+  copy: {+    phasedRegistrationNames: {+      bubbled: keyOf({onCopy: true}),+      captured: keyOf({onCopyCapture: true})+    }+  },+  cut: {+    phasedRegistrationNames: {+      bubbled: keyOf({onCut: true}),+      captured: keyOf({onCutCapture: true})+    }+  },+  doubleClick: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDoubleClick: true}),+      captured: keyOf({onDoubleClickCapture: true})+    }+  },+  drag: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDrag: true}),+      captured: keyOf({onDragCapture: true})+    }+  },+  dragEnd: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDragEnd: true}),+      captured: keyOf({onDragEndCapture: true})+    }+  },+  dragEnter: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDragEnter: true}),+      captured: keyOf({onDragEnterCapture: true})+    }+  },+  dragExit: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDragExit: true}),+      captured: keyOf({onDragExitCapture: true})+    }+  },+  dragLeave: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDragLeave: true}),+      captured: keyOf({onDragLeaveCapture: true})+    }+  },+  dragOver: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDragOver: true}),+      captured: keyOf({onDragOverCapture: true})+    }+  },+  dragStart: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDragStart: true}),+      captured: keyOf({onDragStartCapture: true})+    }+  },+  drop: {+    phasedRegistrationNames: {+      bubbled: keyOf({onDrop: true}),+      captured: keyOf({onDropCapture: true})+    }+  },+  focus: {+    phasedRegistrationNames: {+      bubbled: keyOf({onFocus: true}),+      captured: keyOf({onFocusCapture: true})+    }+  },+  input: {+    phasedRegistrationNames: {+      bubbled: keyOf({onInput: true}),+      captured: keyOf({onInputCapture: true})+    }+  },+  keyDown: {+    phasedRegistrationNames: {+      bubbled: keyOf({onKeyDown: true}),+      captured: keyOf({onKeyDownCapture: true})+    }+  },+  keyPress: {+    phasedRegistrationNames: {+      bubbled: keyOf({onKeyPress: true}),+      captured: keyOf({onKeyPressCapture: true})+    }+  },+  keyUp: {+    phasedRegistrationNames: {+      bubbled: keyOf({onKeyUp: true}),+      captured: keyOf({onKeyUpCapture: true})+    }+  },+  load: {+    phasedRegistrationNames: {+      bubbled: keyOf({onLoad: true}),+      captured: keyOf({onLoadCapture: true})+    }+  },+  error: {+    phasedRegistrationNames: {+      bubbled: keyOf({onError: true}),+      captured: keyOf({onErrorCapture: true})+    }+  },+  // Note: We do not allow listening to mouseOver events. Instead, use the+  // onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`.+  mouseDown: {+    phasedRegistrationNames: {+      bubbled: keyOf({onMouseDown: true}),+      captured: keyOf({onMouseDownCapture: true})+    }+  },+  mouseMove: {+    phasedRegistrationNames: {+      bubbled: keyOf({onMouseMove: true}),+      captured: keyOf({onMouseMoveCapture: true})+    }+  },+  mouseOut: {+    phasedRegistrationNames: {+      bubbled: keyOf({onMouseOut: true}),+      captured: keyOf({onMouseOutCapture: true})+    }+  },+  mouseOver: {+    phasedRegistrationNames: {+      bubbled: keyOf({onMouseOver: true}),+      captured: keyOf({onMouseOverCapture: true})+    }+  },+  mouseUp: {+    phasedRegistrationNames: {+      bubbled: keyOf({onMouseUp: true}),+      captured: keyOf({onMouseUpCapture: true})+    }+  },+  paste: {+    phasedRegistrationNames: {+      bubbled: keyOf({onPaste: true}),+      captured: keyOf({onPasteCapture: true})+    }+  },+  reset: {+    phasedRegistrationNames: {+      bubbled: keyOf({onReset: true}),+      captured: keyOf({onResetCapture: true})+    }+  },+  scroll: {+    phasedRegistrationNames: {+      bubbled: keyOf({onScroll: true}),+      captured: keyOf({onScrollCapture: true})+    }+  },+  submit: {+    phasedRegistrationNames: {+      bubbled: keyOf({onSubmit: true}),+      captured: keyOf({onSubmitCapture: true})+    }+  },+  touchCancel: {+    phasedRegistrationNames: {+      bubbled: keyOf({onTouchCancel: true}),+      captured: keyOf({onTouchCancelCapture: true})+    }+  },+  touchEnd: {+    phasedRegistrationNames: {+      bubbled: keyOf({onTouchEnd: true}),+      captured: keyOf({onTouchEndCapture: true})+    }+  },+  touchMove: {+    phasedRegistrationNames: {+      bubbled: keyOf({onTouchMove: true}),+      captured: keyOf({onTouchMoveCapture: true})+    }+  },+  touchStart: {+    phasedRegistrationNames: {+      bubbled: keyOf({onTouchStart: true}),+      captured: keyOf({onTouchStartCapture: true})+    }+  },+  wheel: {+    phasedRegistrationNames: {+      bubbled: keyOf({onWheel: true}),+      captured: keyOf({onWheelCapture: true})+    }+  }+};++var topLevelEventsToDispatchConfig = {+  topBlur:        eventTypes.blur,+  topClick:       eventTypes.click,+  topContextMenu: eventTypes.contextMenu,+  topCopy:        eventTypes.copy,+  topCut:         eventTypes.cut,+  topDoubleClick: eventTypes.doubleClick,+  topDrag:        eventTypes.drag,+  topDragEnd:     eventTypes.dragEnd,+  topDragEnter:   eventTypes.dragEnter,+  topDragExit:    eventTypes.dragExit,+  topDragLeave:   eventTypes.dragLeave,+  topDragOver:    eventTypes.dragOver,+  topDragStart:   eventTypes.dragStart,+  topDrop:        eventTypes.drop,+  topError:       eventTypes.error,+  topFocus:       eventTypes.focus,+  topInput:       eventTypes.input,+  topKeyDown:     eventTypes.keyDown,+  topKeyPress:    eventTypes.keyPress,+  topKeyUp:       eventTypes.keyUp,+  topLoad:        eventTypes.load,+  topMouseDown:   eventTypes.mouseDown,+  topMouseMove:   eventTypes.mouseMove,+  topMouseOut:    eventTypes.mouseOut,+  topMouseOver:   eventTypes.mouseOver,+  topMouseUp:     eventTypes.mouseUp,+  topPaste:       eventTypes.paste,+  topReset:       eventTypes.reset,+  topScroll:      eventTypes.scroll,+  topSubmit:      eventTypes.submit,+  topTouchCancel: eventTypes.touchCancel,+  topTouchEnd:    eventTypes.touchEnd,+  topTouchMove:   eventTypes.touchMove,+  topTouchStart:  eventTypes.touchStart,+  topWheel:       eventTypes.wheel+};++for (var type in topLevelEventsToDispatchConfig) {+  topLevelEventsToDispatchConfig[type].dependencies = [type];+}++var SimpleEventPlugin = {++  eventTypes: eventTypes,++  /**+   * Same as the default implementation, except cancels the event when return+   * value is false. This behavior will be disabled in a future release.+   *+   * @param {object} Event to be dispatched.+   * @param {function} Application-level callback.+   * @param {string} domID DOM ID to pass to the callback.+   */+  executeDispatch: function(event, listener, domID) {+    var returnValue = EventPluginUtils.executeDispatch(event, listener, domID);++    ("production" !== "development" ? warning(+      typeof returnValue !== 'boolean',+      'Returning `false` from an event handler is deprecated and will be ' ++      'ignored in a future release. Instead, manually call ' ++      'e.stopPropagation() or e.preventDefault(), as appropriate.'+    ) : null);++    if (returnValue === false) {+      event.stopPropagation();+      event.preventDefault();+    }+  },++  /**+   * @param {string} topLevelType Record from `EventConstants`.+   * @param {DOMEventTarget} topLevelTarget The listening component root node.+   * @param {string} topLevelTargetID ID of `topLevelTarget`.+   * @param {object} nativeEvent Native browser event.+   * @return {*} An accumulation of synthetic events.+   * @see {EventPluginHub.extractEvents}+   */+  extractEvents: function(+      topLevelType,+      topLevelTarget,+      topLevelTargetID,+      nativeEvent) {+    var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];+    if (!dispatchConfig) {+      return null;+    }+    var EventConstructor;+    switch (topLevelType) {+      case topLevelTypes.topInput:+      case topLevelTypes.topLoad:+      case topLevelTypes.topError:+      case topLevelTypes.topReset:+      case topLevelTypes.topSubmit:+        // HTML Events+        // @see http://www.w3.org/TR/html5/index.html#events-0+        EventConstructor = SyntheticEvent;+        break;+      case topLevelTypes.topKeyPress:+        // FireFox creates a keypress event for function keys too. This removes+        // the unwanted keypress events. Enter is however both printable and+        // non-printable. One would expect Tab to be as well (but it isn't).+        if (getEventCharCode(nativeEvent) === 0) {+          return null;+        }+        /* falls through */+      case topLevelTypes.topKeyDown:+      case topLevelTypes.topKeyUp:+        EventConstructor = SyntheticKeyboardEvent;+        break;+      case topLevelTypes.topBlur:+      case topLevelTypes.topFocus:+        EventConstructor = SyntheticFocusEvent;+        break;+      case topLevelTypes.topClick:+        // Firefox creates a click event on right mouse clicks. This removes the+        // unwanted click events.+        if (nativeEvent.button === 2) {+          return null;+        }+        /* falls through */+      case topLevelTypes.topContextMenu:+      case topLevelTypes.topDoubleClick:+      case topLevelTypes.topMouseDown:+      case topLevelTypes.topMouseMove:+      case topLevelTypes.topMouseOut:+      case topLevelTypes.topMouseOver:+      case topLevelTypes.topMouseUp:+        EventConstructor = SyntheticMouseEvent;+        break;+      case topLevelTypes.topDrag:+      case topLevelTypes.topDragEnd:+      case topLevelTypes.topDragEnter:+      case topLevelTypes.topDragExit:+      case topLevelTypes.topDragLeave:+      case topLevelTypes.topDragOver:+      case topLevelTypes.topDragStart:+      case topLevelTypes.topDrop:+        EventConstructor = SyntheticDragEvent;+        break;+      case topLevelTypes.topTouchCancel:+      case topLevelTypes.topTouchEnd:+      case topLevelTypes.topTouchMove:+      case topLevelTypes.topTouchStart:+        EventConstructor = SyntheticTouchEvent;+        break;+      case topLevelTypes.topScroll:+        EventConstructor = SyntheticUIEvent;+        break;+      case topLevelTypes.topWheel:+        EventConstructor = SyntheticWheelEvent;+        break;+      case topLevelTypes.topCopy:+      case topLevelTypes.topCut:+      case topLevelTypes.topPaste:+        EventConstructor = SyntheticClipboardEvent;+        break;+    }+    ("production" !== "development" ? invariant(+      EventConstructor,+      'SimpleEventPlugin: Unhandled event type, `%s`.',+      topLevelType+    ) : invariant(EventConstructor));+    var event = EventConstructor.getPooled(+      dispatchConfig,+      topLevelTargetID,+      nativeEvent+    );+    EventPropagators.accumulateTwoPhaseDispatches(event);+    return event;+  }++};++module.exports = SimpleEventPlugin;++},{"100":100,"101":101,"102":102,"122":122,"135":135,"141":141,"15":15,"154":154,"19":19,"20":20,"92":92,"94":94,"95":95,"96":96,"98":98,"99":99}],92:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticClipboardEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticEvent = _dereq_(95);++/**+ * @interface Event+ * @see http://www.w3.org/TR/clipboard-apis/+ */+var ClipboardEventInterface = {+  clipboardData: function(event) {+    return (+      'clipboardData' in event ?+        event.clipboardData :+        window.clipboardData+    );+  }+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticUIEvent}+ */+function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);++module.exports = SyntheticClipboardEvent;++},{"95":95}],93:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticCompositionEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticEvent = _dereq_(95);++/**+ * @interface Event+ * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents+ */+var CompositionEventInterface = {+  data: null+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticUIEvent}+ */+function SyntheticCompositionEvent(+  dispatchConfig,+  dispatchMarker,+  nativeEvent) {+  SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticEvent.augmentClass(+  SyntheticCompositionEvent,+  CompositionEventInterface+);++module.exports = SyntheticCompositionEvent;++},{"95":95}],94:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticDragEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticMouseEvent = _dereq_(99);++/**+ * @interface DragEvent+ * @see http://www.w3.org/TR/DOM-Level-3-Events/+ */+var DragEventInterface = {+  dataTransfer: null+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticUIEvent}+ */+function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);++module.exports = SyntheticDragEvent;++},{"99":99}],95:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticEvent+ * @typechecks static-only+ */++'use strict';++var PooledClass = _dereq_(28);++var assign = _dereq_(27);+var emptyFunction = _dereq_(114);+var getEventTarget = _dereq_(125);++/**+ * @interface Event+ * @see http://www.w3.org/TR/DOM-Level-3-Events/+ */+var EventInterface = {+  type: null,+  target: getEventTarget,+  // currentTarget is set when dispatching; no use in copying it here+  currentTarget: emptyFunction.thatReturnsNull,+  eventPhase: null,+  bubbles: null,+  cancelable: null,+  timeStamp: function(event) {+    return event.timeStamp || Date.now();+  },+  defaultPrevented: null,+  isTrusted: null+};++/**+ * Synthetic events are dispatched by event plugins, typically in response to a+ * top-level event delegation handler.+ *+ * These systems should generally use pooling to reduce the frequency of garbage+ * collection. The system should check `isPersistent` to determine whether the+ * event should be released into the pool after being dispatched. Users that+ * need a persisted event should invoke `persist`.+ *+ * Synthetic events (and subclasses) implement the DOM Level 3 Events API by+ * normalizing browser quirks. Subclasses do not necessarily have to implement a+ * DOM interface; custom application-specific events can also subclass this.+ *+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ */+function SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  this.dispatchConfig = dispatchConfig;+  this.dispatchMarker = dispatchMarker;+  this.nativeEvent = nativeEvent;++  var Interface = this.constructor.Interface;+  for (var propName in Interface) {+    if (!Interface.hasOwnProperty(propName)) {+      continue;+    }+    var normalize = Interface[propName];+    if (normalize) {+      this[propName] = normalize(nativeEvent);+    } else {+      this[propName] = nativeEvent[propName];+    }+  }++  var defaultPrevented = nativeEvent.defaultPrevented != null ?+    nativeEvent.defaultPrevented :+    nativeEvent.returnValue === false;+  if (defaultPrevented) {+    this.isDefaultPrevented = emptyFunction.thatReturnsTrue;+  } else {+    this.isDefaultPrevented = emptyFunction.thatReturnsFalse;+  }+  this.isPropagationStopped = emptyFunction.thatReturnsFalse;+}++assign(SyntheticEvent.prototype, {++  preventDefault: function() {+    this.defaultPrevented = true;+    var event = this.nativeEvent;+    if (event.preventDefault) {+      event.preventDefault();+    } else {+      event.returnValue = false;+    }+    this.isDefaultPrevented = emptyFunction.thatReturnsTrue;+  },++  stopPropagation: function() {+    var event = this.nativeEvent;+    if (event.stopPropagation) {+      event.stopPropagation();+    } else {+      event.cancelBubble = true;+    }+    this.isPropagationStopped = emptyFunction.thatReturnsTrue;+  },++  /**+   * We release all dispatched `SyntheticEvent`s after each event loop, adding+   * them back into the pool. This allows a way to hold onto a reference that+   * won't be added back into the pool.+   */+  persist: function() {+    this.isPersistent = emptyFunction.thatReturnsTrue;+  },++  /**+   * Checks if this event should be released back into the pool.+   *+   * @return {boolean} True if this should not be released, false otherwise.+   */+  isPersistent: emptyFunction.thatReturnsFalse,++  /**+   * `PooledClass` looks for `destructor` on each instance it releases.+   */+  destructor: function() {+    var Interface = this.constructor.Interface;+    for (var propName in Interface) {+      this[propName] = null;+    }+    this.dispatchConfig = null;+    this.dispatchMarker = null;+    this.nativeEvent = null;+  }++});++SyntheticEvent.Interface = EventInterface;++/**+ * Helper to reduce boilerplate when creating subclasses.+ *+ * @param {function} Class+ * @param {?object} Interface+ */+SyntheticEvent.augmentClass = function(Class, Interface) {+  var Super = this;++  var prototype = Object.create(Super.prototype);+  assign(prototype, Class.prototype);+  Class.prototype = prototype;+  Class.prototype.constructor = Class;++  Class.Interface = assign({}, Super.Interface, Interface);+  Class.augmentClass = Super.augmentClass;++  PooledClass.addPoolingTo(Class, PooledClass.threeArgumentPooler);+};++PooledClass.addPoolingTo(SyntheticEvent, PooledClass.threeArgumentPooler);++module.exports = SyntheticEvent;++},{"114":114,"125":125,"27":27,"28":28}],96:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticFocusEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticUIEvent = _dereq_(101);++/**+ * @interface FocusEvent+ * @see http://www.w3.org/TR/DOM-Level-3-Events/+ */+var FocusEventInterface = {+  relatedTarget: null+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticUIEvent}+ */+function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);++module.exports = SyntheticFocusEvent;++},{"101":101}],97:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticInputEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticEvent = _dereq_(95);++/**+ * @interface Event+ * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105+ *      /#events-inputevents+ */+var InputEventInterface = {+  data: null+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticUIEvent}+ */+function SyntheticInputEvent(+  dispatchConfig,+  dispatchMarker,+  nativeEvent) {+  SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticEvent.augmentClass(+  SyntheticInputEvent,+  InputEventInterface+);++module.exports = SyntheticInputEvent;++},{"95":95}],98:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticKeyboardEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticUIEvent = _dereq_(101);++var getEventCharCode = _dereq_(122);+var getEventKey = _dereq_(123);+var getEventModifierState = _dereq_(124);++/**+ * @interface KeyboardEvent+ * @see http://www.w3.org/TR/DOM-Level-3-Events/+ */+var KeyboardEventInterface = {+  key: getEventKey,+  location: null,+  ctrlKey: null,+  shiftKey: null,+  altKey: null,+  metaKey: null,+  repeat: null,+  locale: null,+  getModifierState: getEventModifierState,+  // Legacy Interface+  charCode: function(event) {+    // `charCode` is the result of a KeyPress event and represents the value of+    // the actual printable character.++    // KeyPress is deprecated, but its replacement is not yet final and not+    // implemented in any major browser. Only KeyPress has charCode.+    if (event.type === 'keypress') {+      return getEventCharCode(event);+    }+    return 0;+  },+  keyCode: function(event) {+    // `keyCode` is the result of a KeyDown/Up event and represents the value of+    // physical keyboard key.++    // The actual meaning of the value depends on the users' keyboard layout+    // which cannot be detected. Assuming that it is a US keyboard layout+    // provides a surprisingly accurate mapping for US and European users.+    // Due to this, it is left to the user to implement at this time.+    if (event.type === 'keydown' || event.type === 'keyup') {+      return event.keyCode;+    }+    return 0;+  },+  which: function(event) {+    // `which` is an alias for either `keyCode` or `charCode` depending on the+    // type of the event.+    if (event.type === 'keypress') {+      return getEventCharCode(event);+    }+    if (event.type === 'keydown' || event.type === 'keyup') {+      return event.keyCode;+    }+    return 0;+  }+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticUIEvent}+ */+function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);++module.exports = SyntheticKeyboardEvent;++},{"101":101,"122":122,"123":123,"124":124}],99:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticMouseEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticUIEvent = _dereq_(101);+var ViewportMetrics = _dereq_(104);++var getEventModifierState = _dereq_(124);++/**+ * @interface MouseEvent+ * @see http://www.w3.org/TR/DOM-Level-3-Events/+ */+var MouseEventInterface = {+  screenX: null,+  screenY: null,+  clientX: null,+  clientY: null,+  ctrlKey: null,+  shiftKey: null,+  altKey: null,+  metaKey: null,+  getModifierState: getEventModifierState,+  button: function(event) {+    // Webkit, Firefox, IE9++    // which:  1 2 3+    // button: 0 1 2 (standard)+    var button = event.button;+    if ('which' in event) {+      return button;+    }+    // IE<9+    // which:  undefined+    // button: 0 0 0+    // button: 1 4 2 (onmouseup)+    return button === 2 ? 2 : button === 4 ? 1 : 0;+  },+  buttons: null,+  relatedTarget: function(event) {+    return event.relatedTarget || (+      ((event.fromElement === event.srcElement ? event.toElement : event.fromElement))+    );+  },+  // "Proprietary" Interface.+  pageX: function(event) {+    return 'pageX' in event ?+      event.pageX :+      event.clientX + ViewportMetrics.currentScrollLeft;+  },+  pageY: function(event) {+    return 'pageY' in event ?+      event.pageY :+      event.clientY + ViewportMetrics.currentScrollTop;+  }+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticUIEvent}+ */+function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);++module.exports = SyntheticMouseEvent;++},{"101":101,"104":104,"124":124}],100:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticTouchEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticUIEvent = _dereq_(101);++var getEventModifierState = _dereq_(124);++/**+ * @interface TouchEvent+ * @see http://www.w3.org/TR/touch-events/+ */+var TouchEventInterface = {+  touches: null,+  targetTouches: null,+  changedTouches: null,+  altKey: null,+  metaKey: null,+  ctrlKey: null,+  shiftKey: null,+  getModifierState: getEventModifierState+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticUIEvent}+ */+function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);++module.exports = SyntheticTouchEvent;++},{"101":101,"124":124}],101:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticUIEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticEvent = _dereq_(95);++var getEventTarget = _dereq_(125);++/**+ * @interface UIEvent+ * @see http://www.w3.org/TR/DOM-Level-3-Events/+ */+var UIEventInterface = {+  view: function(event) {+    if (event.view) {+      return event.view;+    }++    var target = getEventTarget(event);+    if (target != null && target.window === target) {+      // target is a window object+      return target;+    }++    var doc = target.ownerDocument;+    // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.+    if (doc) {+      return doc.defaultView || doc.parentWindow;+    } else {+      return window;+    }+  },+  detail: function(event) {+    return event.detail || 0;+  }+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticEvent}+ */+function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);++module.exports = SyntheticUIEvent;++},{"125":125,"95":95}],102:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule SyntheticWheelEvent+ * @typechecks static-only+ */++'use strict';++var SyntheticMouseEvent = _dereq_(99);++/**+ * @interface WheelEvent+ * @see http://www.w3.org/TR/DOM-Level-3-Events/+ */+var WheelEventInterface = {+  deltaX: function(event) {+    return (+      'deltaX' in event ? event.deltaX :+      // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).+      'wheelDeltaX' in event ? -event.wheelDeltaX : 0+    );+  },+  deltaY: function(event) {+    return (+      'deltaY' in event ? event.deltaY :+      // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).+      'wheelDeltaY' in event ? -event.wheelDeltaY :+      // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).+      'wheelDelta' in event ? -event.wheelDelta : 0+    );+  },+  deltaZ: null,++  // Browsers without "deltaMode" is reporting in raw wheel delta where one+  // notch on the scroll is always +/- 120, roughly equivalent to pixels.+  // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or+  // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.+  deltaMode: null+};++/**+ * @param {object} dispatchConfig Configuration used to dispatch this event.+ * @param {string} dispatchMarker Marker identifying the event target.+ * @param {object} nativeEvent Native browser event.+ * @extends {SyntheticMouseEvent}+ */+function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent) {+  SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);+}++SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);++module.exports = SyntheticWheelEvent;++},{"99":99}],103:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule Transaction+ */++'use strict';++var invariant = _dereq_(135);++/**+ * `Transaction` creates a black box that is able to wrap any method such that+ * certain invariants are maintained before and after the method is invoked+ * (Even if an exception is thrown while invoking the wrapped method). Whoever+ * instantiates a transaction can provide enforcers of the invariants at+ * creation time. The `Transaction` class itself will supply one additional+ * automatic invariant for you - the invariant that any transaction instance+ * should not be run while it is already being run. You would typically create a+ * single instance of a `Transaction` for reuse multiple times, that potentially+ * is used to wrap several different methods. Wrappers are extremely simple -+ * they only require implementing two methods.+ *+ * <pre>+ *                       wrappers (injected at creation time)+ *                                      +        ++ *                                      |        |+ *                    +-----------------|--------|--------------++ *                    |                 v        |              |+ *                    |      +---------------+   |              |+ *                    |   +--|    wrapper1   |---|----+         |+ *                    |   |  +---------------+   v    |         |+ *                    |   |          +-------------+  |         |+ *                    |   |     +----|   wrapper2  |--------+   |+ *                    |   |     |    +-------------+  |     |   |+ *                    |   |     |                     |     |   |+ *                    |   v     v                     v     v   | wrapper+ *                    | +---+ +---+   +---------+   +---+ +---+ | invariants+ * perform(anyMethod) | |   | |   |   |         |   |   | |   | | maintained+ * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->+ *                    | |   | |   |   |         |   |   | |   | |+ *                    | |   | |   |   |         |   |   | |   | |+ *                    | |   | |   |   |         |   |   | |   | |+ *                    | +---+ +---+   +---------+   +---+ +---+ |+ *                    |  initialize                    close    |+ *                    +-----------------------------------------++ * </pre>+ *+ * Use cases:+ * - Preserving the input selection ranges before/after reconciliation.+ *   Restoring selection even in the event of an unexpected error.+ * - Deactivating events while rearranging the DOM, preventing blurs/focuses,+ *   while guaranteeing that afterwards, the event system is reactivated.+ * - Flushing a queue of collected DOM mutations to the main UI thread after a+ *   reconciliation takes place in a worker thread.+ * - Invoking any collected `componentDidUpdate` callbacks after rendering new+ *   content.+ * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue+ *   to preserve the `scrollTop` (an automatic scroll aware DOM).+ * - (Future use case): Layout calculations before and after DOM updates.+ *+ * Transactional plugin API:+ * - A module that has an `initialize` method that returns any precomputation.+ * - and a `close` method that accepts the precomputation. `close` is invoked+ *   when the wrapped process is completed, or has failed.+ *+ * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules+ * that implement `initialize` and `close`.+ * @return {Transaction} Single transaction for reuse in thread.+ *+ * @class Transaction+ */+var Mixin = {+  /**+   * Sets up this instance so that it is prepared for collecting metrics. Does+   * so such that this setup method may be used on an instance that is already+   * initialized, in a way that does not consume additional memory upon reuse.+   * That can be useful if you decide to make your subclass of this mixin a+   * "PooledClass".+   */+  reinitializeTransaction: function() {+    this.transactionWrappers = this.getTransactionWrappers();+    if (!this.wrapperInitData) {+      this.wrapperInitData = [];+    } else {+      this.wrapperInitData.length = 0;+    }+    this._isInTransaction = false;+  },++  _isInTransaction: false,++  /**+   * @abstract+   * @return {Array<TransactionWrapper>} Array of transaction wrappers.+   */+  getTransactionWrappers: null,++  isInTransaction: function() {+    return !!this._isInTransaction;+  },++  /**+   * Executes the function within a safety window. Use this for the top level+   * methods that result in large amounts of computation/mutations that would+   * need to be safety checked.+   *+   * @param {function} method Member of scope to call.+   * @param {Object} scope Scope to invoke from.+   * @param {Object?=} args... Arguments to pass to the method (optional).+   *                           Helps prevent need to bind in many cases.+   * @return Return value from `method`.+   */+  perform: function(method, scope, a, b, c, d, e, f) {+    ("production" !== "development" ? invariant(+      !this.isInTransaction(),+      'Transaction.perform(...): Cannot initialize a transaction when there ' ++      'is already an outstanding transaction.'+    ) : invariant(!this.isInTransaction()));+    var errorThrown;+    var ret;+    try {+      this._isInTransaction = true;+      // Catching errors makes debugging more difficult, so we start with+      // errorThrown set to true before setting it to false after calling+      // close -- if it's still set to true in the finally block, it means+      // one of these calls threw.+      errorThrown = true;+      this.initializeAll(0);+      ret = method.call(scope, a, b, c, d, e, f);+      errorThrown = false;+    } finally {+      try {+        if (errorThrown) {+          // If `method` throws, prefer to show that stack trace over any thrown+          // by invoking `closeAll`.+          try {+            this.closeAll(0);+          } catch (err) {+          }+        } else {+          // Since `method` didn't throw, we don't want to silence the exception+          // here.+          this.closeAll(0);+        }+      } finally {+        this._isInTransaction = false;+      }+    }+    return ret;+  },++  initializeAll: function(startIndex) {+    var transactionWrappers = this.transactionWrappers;+    for (var i = startIndex; i < transactionWrappers.length; i++) {+      var wrapper = transactionWrappers[i];+      try {+        // Catching errors makes debugging more difficult, so we start with the+        // OBSERVED_ERROR state before overwriting it with the real return value+        // of initialize -- if it's still set to OBSERVED_ERROR in the finally+        // block, it means wrapper.initialize threw.+        this.wrapperInitData[i] = Transaction.OBSERVED_ERROR;+        this.wrapperInitData[i] = wrapper.initialize ?+          wrapper.initialize.call(this) :+          null;+      } finally {+        if (this.wrapperInitData[i] === Transaction.OBSERVED_ERROR) {+          // The initializer for wrapper i threw an error; initialize the+          // remaining wrappers but silence any exceptions from them to ensure+          // that the first error is the one to bubble up.+          try {+            this.initializeAll(i + 1);+          } catch (err) {+          }+        }+      }+    }+  },++  /**+   * Invokes each of `this.transactionWrappers.close[i]` functions, passing into+   * them the respective return values of `this.transactionWrappers.init[i]`+   * (`close`rs that correspond to initializers that failed will not be+   * invoked).+   */+  closeAll: function(startIndex) {+    ("production" !== "development" ? invariant(+      this.isInTransaction(),+      'Transaction.closeAll(): Cannot close transaction when none are open.'+    ) : invariant(this.isInTransaction()));+    var transactionWrappers = this.transactionWrappers;+    for (var i = startIndex; i < transactionWrappers.length; i++) {+      var wrapper = transactionWrappers[i];+      var initData = this.wrapperInitData[i];+      var errorThrown;+      try {+        // Catching errors makes debugging more difficult, so we start with+        // errorThrown set to true before setting it to false after calling+        // close -- if it's still set to true in the finally block, it means+        // wrapper.close threw.+        errorThrown = true;+        if (initData !== Transaction.OBSERVED_ERROR && wrapper.close) {+          wrapper.close.call(this, initData);+        }+        errorThrown = false;+      } finally {+        if (errorThrown) {+          // The closer for wrapper i threw an error; close the remaining+          // wrappers but silence any exceptions from them to ensure that the+          // first error is the one to bubble up.+          try {+            this.closeAll(i + 1);+          } catch (e) {+          }+        }+      }+    }+    this.wrapperInitData.length = 0;+  }+};++var Transaction = {++  Mixin: Mixin,++  /**+   * Token to look for to determine if an error occured.+   */+  OBSERVED_ERROR: {}++};++module.exports = Transaction;++},{"135":135}],104:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule ViewportMetrics+ */++'use strict';++var ViewportMetrics = {++  currentScrollLeft: 0,++  currentScrollTop: 0,++  refreshScrollValues: function(scrollPosition) {+    ViewportMetrics.currentScrollLeft = scrollPosition.x;+    ViewportMetrics.currentScrollTop = scrollPosition.y;+  }++};++module.exports = ViewportMetrics;++},{}],105:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule accumulateInto+ */++'use strict';++var invariant = _dereq_(135);++/**+ *+ * Accumulates items that must not be null or undefined into the first one. This+ * is used to conserve memory by avoiding array allocations, and thus sacrifices+ * API cleanness. Since `current` can be null before being passed in and not+ * null after this function, make sure to assign it back to `current`:+ *+ * `a = accumulateInto(a, b);`+ *+ * This API should be sparingly used. Try `accumulate` for something cleaner.+ *+ * @return {*|array<*>} An accumulation of items.+ */++function accumulateInto(current, next) {+  ("production" !== "development" ? invariant(+    next != null,+    'accumulateInto(...): Accumulated items must not be null or undefined.'+  ) : invariant(next != null));+  if (current == null) {+    return next;+  }++  // Both are not empty. Warning: Never call x.concat(y) when you are not+  // certain that x is an Array (x could be a string with concat method).+  var currentIsArray = Array.isArray(current);+  var nextIsArray = Array.isArray(next);++  if (currentIsArray && nextIsArray) {+    current.push.apply(current, next);+    return current;+  }++  if (currentIsArray) {+    current.push(next);+    return current;+  }++  if (nextIsArray) {+    // A bit too dangerous to mutate `next`.+    return [current].concat(next);+  }++  return [current, next];+}++module.exports = accumulateInto;++},{"135":135}],106:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule adler32+ */++/* jslint bitwise:true */++'use strict';++var MOD = 65521;++// This is a clean-room implementation of adler32 designed for detecting+// if markup is not what we expect it to be. It does not need to be+// cryptographically strong, only reasonably good at detecting if markup+// generated on the server is different than that on the client.+function adler32(data) {+  var a = 1;+  var b = 0;+  for (var i = 0; i < data.length; i++) {+    a = (a + data.charCodeAt(i)) % MOD;+    b = (b + a) % MOD;+  }+  return a | (b << 16);+}++module.exports = adler32;++},{}],107:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule camelize+ * @typechecks+ */++var _hyphenPattern = /-(.)/g;++/**+ * Camelcases a hyphenated string, for example:+ *+ *   > camelize('background-color')+ *   < "backgroundColor"+ *+ * @param {string} string+ * @return {string}+ */+function camelize(string) {+  return string.replace(_hyphenPattern, function(_, character) {+    return character.toUpperCase();+  });+}++module.exports = camelize;++},{}],108:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule camelizeStyleName+ * @typechecks+ */++"use strict";++var camelize = _dereq_(107);++var msPattern = /^-ms-/;++/**+ * Camelcases a hyphenated CSS property name, for example:+ *+ *   > camelizeStyleName('background-color')+ *   < "backgroundColor"+ *   > camelizeStyleName('-moz-transition')+ *   < "MozTransition"+ *   > camelizeStyleName('-ms-transition')+ *   < "msTransition"+ *+ * As Andi Smith suggests+ * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix+ * is converted to lowercase `ms`.+ *+ * @param {string} string+ * @return {string}+ */+function camelizeStyleName(string) {+  return camelize(string.replace(msPattern, 'ms-'));+}++module.exports = camelizeStyleName;++},{"107":107}],109:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule containsNode+ * @typechecks+ */++var isTextNode = _dereq_(139);++/*jslint bitwise:true */++/**+ * Checks if a given DOM node contains or is another DOM node.+ *+ * @param {?DOMNode} outerNode Outer DOM node.+ * @param {?DOMNode} innerNode Inner DOM node.+ * @return {boolean} True if `outerNode` contains or is `innerNode`.+ */+function containsNode(outerNode, innerNode) {+  if (!outerNode || !innerNode) {+    return false;+  } else if (outerNode === innerNode) {+    return true;+  } else if (isTextNode(outerNode)) {+    return false;+  } else if (isTextNode(innerNode)) {+    return containsNode(outerNode, innerNode.parentNode);+  } else if (outerNode.contains) {+    return outerNode.contains(innerNode);+  } else if (outerNode.compareDocumentPosition) {+    return !!(outerNode.compareDocumentPosition(innerNode) & 16);+  } else {+    return false;+  }+}++module.exports = containsNode;++},{"139":139}],110:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule createArrayFromMixed+ * @typechecks+ */++var toArray = _dereq_(152);++/**+ * Perform a heuristic test to determine if an object is "array-like".+ *+ *   A monk asked Joshu, a Zen master, "Has a dog Buddha nature?"+ *   Joshu replied: "Mu."+ *+ * This function determines if its argument has "array nature": it returns+ * true if the argument is an actual array, an `arguments' object, or an+ * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()).+ *+ * It will return false for other array-like objects like Filelist.+ *+ * @param {*} obj+ * @return {boolean}+ */+function hasArrayNature(obj) {+  return (+    // not null/false+    !!obj &&+    // arrays are objects, NodeLists are functions in Safari+    (typeof obj == 'object' || typeof obj == 'function') &&+    // quacks like an array+    ('length' in obj) &&+    // not window+    !('setInterval' in obj) &&+    // no DOM node should be considered an array-like+    // a 'select' element has 'length' and 'item' properties on IE8+    (typeof obj.nodeType != 'number') &&+    (+      // a real array+      (// HTMLCollection/NodeList+      (Array.isArray(obj) ||+      // arguments+      ('callee' in obj) || 'item' in obj))+    )+  );+}++/**+ * Ensure that the argument is an array by wrapping it in an array if it is not.+ * Creates a copy of the argument if it is already an array.+ *+ * This is mostly useful idiomatically:+ *+ *   var createArrayFromMixed = require('createArrayFromMixed');+ *+ *   function takesOneOrMoreThings(things) {+ *     things = createArrayFromMixed(things);+ *     ...+ *   }+ *+ * This allows you to treat `things' as an array, but accept scalars in the API.+ *+ * If you need to convert an array-like object, like `arguments`, into an array+ * use toArray instead.+ *+ * @param {*} obj+ * @return {array}+ */+function createArrayFromMixed(obj) {+  if (!hasArrayNature(obj)) {+    return [obj];+  } else if (Array.isArray(obj)) {+    return obj.slice();+  } else {+    return toArray(obj);+  }+}++module.exports = createArrayFromMixed;++},{"152":152}],111:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule createFullPageComponent+ * @typechecks+ */++'use strict';++// Defeat circular references by requiring this directly.+var ReactClass = _dereq_(33);+var ReactElement = _dereq_(57);++var invariant = _dereq_(135);++/**+ * Create a component that will throw an exception when unmounted.+ *+ * Components like <html> <head> and <body> can't be removed or added+ * easily in a cross-browser way, however it's valuable to be able to+ * take advantage of React's reconciliation for styling and <title>+ * management. So we just document it and throw in dangerous cases.+ *+ * @param {string} tag The tag to wrap+ * @return {function} convenience constructor of new component+ */+function createFullPageComponent(tag) {+  var elementFactory = ReactElement.createFactory(tag);++  var FullPageComponent = ReactClass.createClass({+    tagName: tag.toUpperCase(),+    displayName: 'ReactFullPageComponent' + tag,++    componentWillUnmount: function() {+      ("production" !== "development" ? invariant(+        false,+        '%s tried to unmount. Because of cross-browser quirks it is ' ++        'impossible to unmount some top-level components (eg <html>, <head>, ' ++        'and <body>) reliably and efficiently. To fix this, have a single ' ++        'top-level component that never unmounts render these elements.',+        this.constructor.displayName+      ) : invariant(false));+    },++    render: function() {+      return elementFactory(this.props);+    }+  });++  return FullPageComponent;+}++module.exports = createFullPageComponent;++},{"135":135,"33":33,"57":57}],112:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule createNodesFromMarkup+ * @typechecks+ */++/*jslint evil: true, sub: true */++var ExecutionEnvironment = _dereq_(21);++var createArrayFromMixed = _dereq_(110);+var getMarkupWrap = _dereq_(127);+var invariant = _dereq_(135);++/**+ * Dummy container used to render all markup.+ */+var dummyNode =+  ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;++/**+ * Pattern used by `getNodeName`.+ */+var nodeNamePattern = /^\s*<(\w+)/;++/**+ * Extracts the `nodeName` of the first element in a string of markup.+ *+ * @param {string} markup String of markup.+ * @return {?string} Node name of the supplied markup.+ */+function getNodeName(markup) {+  var nodeNameMatch = markup.match(nodeNamePattern);+  return nodeNameMatch && nodeNameMatch[1].toLowerCase();+}++/**+ * Creates an array containing the nodes rendered from the supplied markup. The+ * optionally supplied `handleScript` function will be invoked once for each+ * <script> element that is rendered. If no `handleScript` function is supplied,+ * an exception is thrown if any <script> elements are rendered.+ *+ * @param {string} markup A string of valid HTML markup.+ * @param {?function} handleScript Invoked once for each rendered <script>.+ * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes.+ */+function createNodesFromMarkup(markup, handleScript) {+  var node = dummyNode;+  ("production" !== "development" ? invariant(!!dummyNode, 'createNodesFromMarkup dummy not initialized') : invariant(!!dummyNode));+  var nodeName = getNodeName(markup);++  var wrap = nodeName && getMarkupWrap(nodeName);+  if (wrap) {+    node.innerHTML = wrap[1] + markup + wrap[2];++    var wrapDepth = wrap[0];+    while (wrapDepth--) {+      node = node.lastChild;+    }+  } else {+    node.innerHTML = markup;+  }++  var scripts = node.getElementsByTagName('script');+  if (scripts.length) {+    ("production" !== "development" ? invariant(+      handleScript,+      'createNodesFromMarkup(...): Unexpected <script> element rendered.'+    ) : invariant(handleScript));+    createArrayFromMixed(scripts).forEach(handleScript);+  }++  var nodes = createArrayFromMixed(node.childNodes);+  while (node.lastChild) {+    node.removeChild(node.lastChild);+  }+  return nodes;+}++module.exports = createNodesFromMarkup;++},{"110":110,"127":127,"135":135,"21":21}],113:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule dangerousStyleValue+ * @typechecks static-only+ */++'use strict';++var CSSProperty = _dereq_(4);++var isUnitlessNumber = CSSProperty.isUnitlessNumber;++/**+ * Convert a value into the proper css writable value. The style name `name`+ * should be logical (no hyphens), as specified+ * in `CSSProperty.isUnitlessNumber`.+ *+ * @param {string} name CSS property name such as `topMargin`.+ * @param {*} value CSS property value such as `10px`.+ * @return {string} Normalized style value with dimensions applied.+ */+function dangerousStyleValue(name, value) {+  // Note that we've removed escapeTextForBrowser() calls here since the+  // whole string will be escaped when the attribute is injected into+  // the markup. If you provide unsafe user data here they can inject+  // arbitrary CSS which may be problematic (I couldn't repro this):+  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet+  // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/+  // This is not an XSS hole but instead a potential CSS injection issue+  // which has lead to a greater discussion about how we're going to+  // trust URLs moving forward. See #2115901++  var isEmpty = value == null || typeof value === 'boolean' || value === '';+  if (isEmpty) {+    return '';+  }++  var isNonNumeric = isNaN(value);+  if (isNonNumeric || value === 0 ||+      isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) {+    return '' + value; // cast to string+  }++  if (typeof value === 'string') {+    value = value.trim();+  }+  return value + 'px';+}++module.exports = dangerousStyleValue;++},{"4":4}],114:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule emptyFunction+ */++function makeEmptyFunction(arg) {+  return function() {+    return arg;+  };+}++/**+ * This function accepts and discards inputs; it has no side effects. This is+ * primarily useful idiomatically for overridable function endpoints which+ * always need to be callable, since JS lacks a null-call idiom ala Cocoa.+ */+function emptyFunction() {}++emptyFunction.thatReturns = makeEmptyFunction;+emptyFunction.thatReturnsFalse = makeEmptyFunction(false);+emptyFunction.thatReturnsTrue = makeEmptyFunction(true);+emptyFunction.thatReturnsNull = makeEmptyFunction(null);+emptyFunction.thatReturnsThis = function() { return this; };+emptyFunction.thatReturnsArgument = function(arg) { return arg; };++module.exports = emptyFunction;++},{}],115:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule emptyObject+ */++"use strict";++var emptyObject = {};++if ("production" !== "development") {+  Object.freeze(emptyObject);+}++module.exports = emptyObject;++},{}],116:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule escapeTextContentForBrowser+ */++'use strict';++var ESCAPE_LOOKUP = {+  '&': '&amp;',+  '>': '&gt;',+  '<': '&lt;',+  '"': '&quot;',+  '\'': '&#x27;'+};++var ESCAPE_REGEX = /[&><"']/g;++function escaper(match) {+  return ESCAPE_LOOKUP[match];+}++/**+ * Escapes text to prevent scripting attacks.+ *+ * @param {*} text Text value to escape.+ * @return {string} An escaped string.+ */+function escapeTextContentForBrowser(text) {+  return ('' + text).replace(ESCAPE_REGEX, escaper);+}++module.exports = escapeTextContentForBrowser;++},{}],117:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule findDOMNode+ * @typechecks static-only+ */++'use strict';++var ReactCurrentOwner = _dereq_(39);+var ReactInstanceMap = _dereq_(67);+var ReactMount = _dereq_(70);++var invariant = _dereq_(135);+var isNode = _dereq_(137);+var warning = _dereq_(154);++/**+ * Returns the DOM node rendered by this element.+ *+ * @param {ReactComponent|DOMElement} componentOrElement+ * @return {DOMElement} The root node of this element.+ */+function findDOMNode(componentOrElement) {+  if ("production" !== "development") {+    var owner = ReactCurrentOwner.current;+    if (owner !== null) {+      ("production" !== "development" ? warning(+        owner._warnedAboutRefsInRender,+        '%s is accessing getDOMNode or findDOMNode inside its render(). ' ++        'render() should be a pure function of props and state. It should ' ++        'never access something that requires stale data from the previous ' ++        'render, such as refs. Move this logic to componentDidMount and ' ++        'componentDidUpdate instead.',+        owner.getName() || 'A component'+      ) : null);+      owner._warnedAboutRefsInRender = true;+    }+  }+  if (componentOrElement == null) {+    return null;+  }+  if (isNode(componentOrElement)) {+    return componentOrElement;+  }+  if (ReactInstanceMap.has(componentOrElement)) {+    return ReactMount.getNodeFromInstance(componentOrElement);+  }+  ("production" !== "development" ? invariant(+    componentOrElement.render == null ||+    typeof componentOrElement.render !== 'function',+    'Component (with keys: %s) contains `render` method ' ++    'but is not mounted in the DOM',+    Object.keys(componentOrElement)+  ) : invariant(componentOrElement.render == null ||+  typeof componentOrElement.render !== 'function'));+  ("production" !== "development" ? invariant(+    false,+    'Element appears to be neither ReactComponent nor DOMNode (keys: %s)',+    Object.keys(componentOrElement)+  ) : invariant(false));+}++module.exports = findDOMNode;++},{"135":135,"137":137,"154":154,"39":39,"67":67,"70":70}],118:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule flattenChildren+ */++'use strict';++var traverseAllChildren = _dereq_(153);+var warning = _dereq_(154);++/**+ * @param {function} traverseContext Context passed through traversal.+ * @param {?ReactComponent} child React child component.+ * @param {!string} name String name of key path to child.+ */+function flattenSingleChildIntoContext(traverseContext, child, name) {+  // We found a component instance.+  var result = traverseContext;+  var keyUnique = !result.hasOwnProperty(name);+  if ("production" !== "development") {+    ("production" !== "development" ? warning(+      keyUnique,+      'flattenChildren(...): Encountered two children with the same key, ' ++      '`%s`. Child keys must be unique; when two children share a key, only ' ++      'the first child will be used.',+      name+    ) : null);+  }+  if (keyUnique && child != null) {+    result[name] = child;+  }+}++/**+ * Flattens children that are typically specified as `props.children`. Any null+ * children will not be included in the resulting object.+ * @return {!object} flattened children keyed by name.+ */+function flattenChildren(children) {+  if (children == null) {+    return children;+  }+  var result = {};+  traverseAllChildren(children, flattenSingleChildIntoContext, result);+  return result;+}++module.exports = flattenChildren;++},{"153":153,"154":154}],119:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule focusNode+ */++"use strict";++/**+ * @param {DOMElement} node input/textarea to focus+ */+function focusNode(node) {+  // IE8 can throw "Can't move focus to the control because it is invisible,+  // not enabled, or of a type that does not accept the focus." for all kinds of+  // reasons that are too expensive and fragile to test.+  try {+    node.focus();+  } catch(e) {+  }+}++module.exports = focusNode;++},{}],120:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule forEachAccumulated+ */++'use strict';++/**+ * @param {array} an "accumulation" of items which is either an Array or+ * a single item. Useful when paired with the `accumulate` module. This is a+ * simple utility that allows us to reason about a collection of items, but+ * handling the case when there is exactly one item (and we do not need to+ * allocate an array).+ */+var forEachAccumulated = function(arr, cb, scope) {+  if (Array.isArray(arr)) {+    arr.forEach(cb, scope);+  } else if (arr) {+    cb.call(scope, arr);+  }+};++module.exports = forEachAccumulated;++},{}],121:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getActiveElement+ * @typechecks+ */++/**+ * Same as document.activeElement but wraps in a try-catch block. In IE it is+ * not safe to call document.activeElement if there is nothing focused.+ *+ * The activeElement will be null only if the document body is not yet defined.+ */+function getActiveElement() /*?DOMElement*/ {+  try {+    return document.activeElement || document.body;+  } catch (e) {+    return document.body;+  }+}++module.exports = getActiveElement;++},{}],122:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getEventCharCode+ * @typechecks static-only+ */++'use strict';++/**+ * `charCode` represents the actual "character code" and is safe to use with+ * `String.fromCharCode`. As such, only keys that correspond to printable+ * characters produce a valid `charCode`, the only exception to this is Enter.+ * The Tab-key is considered non-printable and does not have a `charCode`,+ * presumably because it does not produce a tab-character in browsers.+ *+ * @param {object} nativeEvent Native browser event.+ * @return {string} Normalized `charCode` property.+ */+function getEventCharCode(nativeEvent) {+  var charCode;+  var keyCode = nativeEvent.keyCode;++  if ('charCode' in nativeEvent) {+    charCode = nativeEvent.charCode;++    // FF does not set `charCode` for the Enter-key, check against `keyCode`.+    if (charCode === 0 && keyCode === 13) {+      charCode = 13;+    }+  } else {+    // IE8 does not implement `charCode`, but `keyCode` has the correct value.+    charCode = keyCode;+  }++  // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.+  // Must not discard the (non-)printable Enter-key.+  if (charCode >= 32 || charCode === 13) {+    return charCode;+  }++  return 0;+}++module.exports = getEventCharCode;++},{}],123:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getEventKey+ * @typechecks static-only+ */++'use strict';++var getEventCharCode = _dereq_(122);++/**+ * Normalization of deprecated HTML5 `key` values+ * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names+ */+var normalizeKey = {+  'Esc': 'Escape',+  'Spacebar': ' ',+  'Left': 'ArrowLeft',+  'Up': 'ArrowUp',+  'Right': 'ArrowRight',+  'Down': 'ArrowDown',+  'Del': 'Delete',+  'Win': 'OS',+  'Menu': 'ContextMenu',+  'Apps': 'ContextMenu',+  'Scroll': 'ScrollLock',+  'MozPrintableKey': 'Unidentified'+};++/**+ * Translation from legacy `keyCode` to HTML5 `key`+ * Only special keys supported, all others depend on keyboard layout or browser+ * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names+ */+var translateToKey = {+  8: 'Backspace',+  9: 'Tab',+  12: 'Clear',+  13: 'Enter',+  16: 'Shift',+  17: 'Control',+  18: 'Alt',+  19: 'Pause',+  20: 'CapsLock',+  27: 'Escape',+  32: ' ',+  33: 'PageUp',+  34: 'PageDown',+  35: 'End',+  36: 'Home',+  37: 'ArrowLeft',+  38: 'ArrowUp',+  39: 'ArrowRight',+  40: 'ArrowDown',+  45: 'Insert',+  46: 'Delete',+  112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6',+  118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12',+  144: 'NumLock',+  145: 'ScrollLock',+  224: 'Meta'+};++/**+ * @param {object} nativeEvent Native browser event.+ * @return {string} Normalized `key` property.+ */+function getEventKey(nativeEvent) {+  if (nativeEvent.key) {+    // Normalize inconsistent values reported by browsers due to+    // implementations of a working draft specification.++    // FireFox implements `key` but returns `MozPrintableKey` for all+    // printable characters (normalized to `Unidentified`), ignore it.+    var key = normalizeKey[nativeEvent.key] || nativeEvent.key;+    if (key !== 'Unidentified') {+      return key;+    }+  }++  // Browser does not implement `key`, polyfill as much of it as we can.+  if (nativeEvent.type === 'keypress') {+    var charCode = getEventCharCode(nativeEvent);++    // The enter-key is technically both printable and non-printable and can+    // thus be captured by `keypress`, no other non-printable key should.+    return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);+  }+  if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {+    // While user keyboard layout determines the actual meaning of each+    // `keyCode` value, almost all function keys have a universal value.+    return translateToKey[nativeEvent.keyCode] || 'Unidentified';+  }+  return '';+}++module.exports = getEventKey;++},{"122":122}],124:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getEventModifierState+ * @typechecks static-only+ */++'use strict';++/**+ * Translation from modifier key to the associated property in the event.+ * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers+ */++var modifierKeyToProp = {+  'Alt': 'altKey',+  'Control': 'ctrlKey',+  'Meta': 'metaKey',+  'Shift': 'shiftKey'+};++// IE8 does not implement getModifierState so we simply map it to the only+// modifier keys exposed by the event itself, does not support Lock-keys.+// Currently, all major browsers except Chrome seems to support Lock-keys.+function modifierStateGetter(keyArg) {+  /*jshint validthis:true */+  var syntheticEvent = this;+  var nativeEvent = syntheticEvent.nativeEvent;+  if (nativeEvent.getModifierState) {+    return nativeEvent.getModifierState(keyArg);+  }+  var keyProp = modifierKeyToProp[keyArg];+  return keyProp ? !!nativeEvent[keyProp] : false;+}++function getEventModifierState(nativeEvent) {+  return modifierStateGetter;+}++module.exports = getEventModifierState;++},{}],125:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getEventTarget+ * @typechecks static-only+ */++'use strict';++/**+ * Gets the target node from a native browser event by accounting for+ * inconsistencies in browser DOM APIs.+ *+ * @param {object} nativeEvent Native browser event.+ * @return {DOMEventTarget} Target node.+ */+function getEventTarget(nativeEvent) {+  var target = nativeEvent.target || nativeEvent.srcElement || window;+  // Safari may fire events on text nodes (Node.TEXT_NODE is 3).+  // @see http://www.quirksmode.org/js/events_properties.html+  return target.nodeType === 3 ? target.parentNode : target;+}++module.exports = getEventTarget;++},{}],126:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getIteratorFn+ * @typechecks static-only+ */++'use strict';++/* global Symbol */+var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;+var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.++/**+ * Returns the iterator method function contained on the iterable object.+ *+ * Be sure to invoke the function with the iterable as context:+ *+ *     var iteratorFn = getIteratorFn(myIterable);+ *     if (iteratorFn) {+ *       var iterator = iteratorFn.call(myIterable);+ *       ...+ *     }+ *+ * @param {?object} maybeIterable+ * @return {?function}+ */+function getIteratorFn(maybeIterable) {+  var iteratorFn = maybeIterable && (+    (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL])+  );+  if (typeof iteratorFn === 'function') {+    return iteratorFn;+  }+}++module.exports = getIteratorFn;++},{}],127:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getMarkupWrap+ */++var ExecutionEnvironment = _dereq_(21);++var invariant = _dereq_(135);++/**+ * Dummy container used to detect which wraps are necessary.+ */+var dummyNode =+  ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;++/**+ * Some browsers cannot use `innerHTML` to render certain elements standalone,+ * so we wrap them, render the wrapped nodes, then extract the desired node.+ *+ * In IE8, certain elements cannot render alone, so wrap all elements ('*').+ */+var shouldWrap = {+  // Force wrapping for SVG elements because if they get created inside a <div>,+  // they will be initialized in the wrong namespace (and will not display).+  'circle': true,+  'clipPath': true,+  'defs': true,+  'ellipse': true,+  'g': true,+  'line': true,+  'linearGradient': true,+  'path': true,+  'polygon': true,+  'polyline': true,+  'radialGradient': true,+  'rect': true,+  'stop': true,+  'text': true+};++var selectWrap = [1, '<select multiple="true">', '</select>'];+var tableWrap = [1, '<table>', '</table>'];+var trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>'];++var svgWrap = [1, '<svg>', '</svg>'];++var markupWrap = {+  '*': [1, '?<div>', '</div>'],++  'area': [1, '<map>', '</map>'],+  'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],+  'legend': [1, '<fieldset>', '</fieldset>'],+  'param': [1, '<object>', '</object>'],+  'tr': [2, '<table><tbody>', '</tbody></table>'],++  'optgroup': selectWrap,+  'option': selectWrap,++  'caption': tableWrap,+  'colgroup': tableWrap,+  'tbody': tableWrap,+  'tfoot': tableWrap,+  'thead': tableWrap,++  'td': trWrap,+  'th': trWrap,++  'circle': svgWrap,+  'clipPath': svgWrap,+  'defs': svgWrap,+  'ellipse': svgWrap,+  'g': svgWrap,+  'line': svgWrap,+  'linearGradient': svgWrap,+  'path': svgWrap,+  'polygon': svgWrap,+  'polyline': svgWrap,+  'radialGradient': svgWrap,+  'rect': svgWrap,+  'stop': svgWrap,+  'text': svgWrap+};++/**+ * Gets the markup wrap configuration for the supplied `nodeName`.+ *+ * NOTE: This lazily detects which wraps are necessary for the current browser.+ *+ * @param {string} nodeName Lowercase `nodeName`.+ * @return {?array} Markup wrap configuration, if applicable.+ */+function getMarkupWrap(nodeName) {+  ("production" !== "development" ? invariant(!!dummyNode, 'Markup wrapping node not initialized') : invariant(!!dummyNode));+  if (!markupWrap.hasOwnProperty(nodeName)) {+    nodeName = '*';+  }+  if (!shouldWrap.hasOwnProperty(nodeName)) {+    if (nodeName === '*') {+      dummyNode.innerHTML = '<link />';+    } else {+      dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>';+    }+    shouldWrap[nodeName] = !dummyNode.firstChild;+  }+  return shouldWrap[nodeName] ? markupWrap[nodeName] : null;+}+++module.exports = getMarkupWrap;++},{"135":135,"21":21}],128:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getNodeForCharacterOffset+ */++'use strict';++/**+ * Given any node return the first leaf node without children.+ *+ * @param {DOMElement|DOMTextNode} node+ * @return {DOMElement|DOMTextNode}+ */+function getLeafNode(node) {+  while (node && node.firstChild) {+    node = node.firstChild;+  }+  return node;+}++/**+ * Get the next sibling within a container. This will walk up the+ * DOM if a node's siblings have been exhausted.+ *+ * @param {DOMElement|DOMTextNode} node+ * @return {?DOMElement|DOMTextNode}+ */+function getSiblingNode(node) {+  while (node) {+    if (node.nextSibling) {+      return node.nextSibling;+    }+    node = node.parentNode;+  }+}++/**+ * Get object describing the nodes which contain characters at offset.+ *+ * @param {DOMElement|DOMTextNode} root+ * @param {number} offset+ * @return {?object}+ */+function getNodeForCharacterOffset(root, offset) {+  var node = getLeafNode(root);+  var nodeStart = 0;+  var nodeEnd = 0;++  while (node) {+    if (node.nodeType === 3) {+      nodeEnd = nodeStart + node.textContent.length;++      if (nodeStart <= offset && nodeEnd >= offset) {+        return {+          node: node,+          offset: offset - nodeStart+        };+      }++      nodeStart = nodeEnd;+    }++    node = getLeafNode(getSiblingNode(node));+  }+}++module.exports = getNodeForCharacterOffset;++},{}],129:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getReactRootElementInContainer+ */++'use strict';++var DOC_NODE_TYPE = 9;++/**+ * @param {DOMElement|DOMDocument} container DOM element that may contain+ *                                           a React component+ * @return {?*} DOM element that may have the reactRoot ID, or null.+ */+function getReactRootElementInContainer(container) {+  if (!container) {+    return null;+  }++  if (container.nodeType === DOC_NODE_TYPE) {+    return container.documentElement;+  } else {+    return container.firstChild;+  }+}++module.exports = getReactRootElementInContainer;++},{}],130:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getTextContentAccessor+ */++'use strict';++var ExecutionEnvironment = _dereq_(21);++var contentKey = null;++/**+ * Gets the key used to access text content on a DOM node.+ *+ * @return {?string} Key used to access text content.+ * @internal+ */+function getTextContentAccessor() {+  if (!contentKey && ExecutionEnvironment.canUseDOM) {+    // Prefer textContent to innerText because many browsers support both but+    // SVG <text> elements don't support innerText even when <div> does.+    contentKey = 'textContent' in document.documentElement ?+      'textContent' :+      'innerText';+  }+  return contentKey;+}++module.exports = getTextContentAccessor;++},{"21":21}],131:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule getUnboundedScrollPosition+ * @typechecks+ */++"use strict";++/**+ * Gets the scroll position of the supplied element or window.+ *+ * The return values are unbounded, unlike `getScrollPosition`. This means they+ * may be negative or exceed the element boundaries (which is possible using+ * inertial scrolling).+ *+ * @param {DOMWindow|DOMElement} scrollable+ * @return {object} Map with `x` and `y` keys.+ */+function getUnboundedScrollPosition(scrollable) {+  if (scrollable === window) {+    return {+      x: window.pageXOffset || document.documentElement.scrollLeft,+      y: window.pageYOffset || document.documentElement.scrollTop+    };+  }+  return {+    x: scrollable.scrollLeft,+    y: scrollable.scrollTop+  };+}++module.exports = getUnboundedScrollPosition;++},{}],132:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule hyphenate+ * @typechecks+ */++var _uppercasePattern = /([A-Z])/g;++/**+ * Hyphenates a camelcased string, for example:+ *+ *   > hyphenate('backgroundColor')+ *   < "background-color"+ *+ * For CSS style names, use `hyphenateStyleName` instead which works properly+ * with all vendor prefixes, including `ms`.+ *+ * @param {string} string+ * @return {string}+ */+function hyphenate(string) {+  return string.replace(_uppercasePattern, '-$1').toLowerCase();+}++module.exports = hyphenate;++},{}],133:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule hyphenateStyleName+ * @typechecks+ */++"use strict";++var hyphenate = _dereq_(132);++var msPattern = /^ms-/;++/**+ * Hyphenates a camelcased CSS property name, for example:+ *+ *   > hyphenateStyleName('backgroundColor')+ *   < "background-color"+ *   > hyphenateStyleName('MozTransition')+ *   < "-moz-transition"+ *   > hyphenateStyleName('msTransition')+ *   < "-ms-transition"+ *+ * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix+ * is converted to `-ms-`.+ *+ * @param {string} string+ * @return {string}+ */+function hyphenateStyleName(string) {+  return hyphenate(string).replace(msPattern, '-ms-');+}++module.exports = hyphenateStyleName;++},{"132":132}],134:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule instantiateReactComponent+ * @typechecks static-only+ */++'use strict';++var ReactCompositeComponent = _dereq_(37);+var ReactEmptyComponent = _dereq_(59);+var ReactNativeComponent = _dereq_(73);++var assign = _dereq_(27);+var invariant = _dereq_(135);+var warning = _dereq_(154);++// To avoid a cyclic dependency, we create the final class in this module+var ReactCompositeComponentWrapper = function() { };+assign(+  ReactCompositeComponentWrapper.prototype,+  ReactCompositeComponent.Mixin,+  {+    _instantiateReactComponent: instantiateReactComponent+  }+);++/**+ * Check if the type reference is a known internal type. I.e. not a user+ * provided composite type.+ *+ * @param {function} type+ * @return {boolean} Returns true if this is a valid internal type.+ */+function isInternalComponentType(type) {+  return (+    typeof type === 'function' &&+    typeof type.prototype !== 'undefined' &&+    typeof type.prototype.mountComponent === 'function' &&+    typeof type.prototype.receiveComponent === 'function'+  );+}++/**+ * Given a ReactNode, create an instance that will actually be mounted.+ *+ * @param {ReactNode} node+ * @param {*} parentCompositeType The composite type that resolved this.+ * @return {object} A new instance of the element's constructor.+ * @protected+ */+function instantiateReactComponent(node, parentCompositeType) {+  var instance;++  if (node === null || node === false) {+    node = ReactEmptyComponent.emptyElement;+  }++  if (typeof node === 'object') {+    var element = node;+    if ("production" !== "development") {+      ("production" !== "development" ? warning(+        element && (typeof element.type === 'function' ||+                    typeof element.type === 'string'),+        'Only functions or strings can be mounted as React components.'+      ) : null);+    }++    // Special case string values+    if (parentCompositeType === element.type &&+        typeof element.type === 'string') {+      // Avoid recursion if the wrapper renders itself.+      instance = ReactNativeComponent.createInternalComponent(element);+      // All native components are currently wrapped in a composite so we're+      // safe to assume that this is what we should instantiate.+    } else if (isInternalComponentType(element.type)) {+      // This is temporarily available for custom components that are not string+      // represenations. I.e. ART. Once those are updated to use the string+      // representation, we can drop this code path.+      instance = new element.type(element);+    } else {+      instance = new ReactCompositeComponentWrapper();+    }+  } else if (typeof node === 'string' || typeof node === 'number') {+    instance = ReactNativeComponent.createInstanceForText(node);+  } else {+    ("production" !== "development" ? invariant(+      false,+      'Encountered invalid React node of type %s',+      typeof node+    ) : invariant(false));+  }++  if ("production" !== "development") {+    ("production" !== "development" ? warning(+      typeof instance.construct === 'function' &&+      typeof instance.mountComponent === 'function' &&+      typeof instance.receiveComponent === 'function' &&+      typeof instance.unmountComponent === 'function',+      'Only React Components can be mounted.'+    ) : null);+  }++  // Sets up the instance. This can probably just move into the constructor now.+  instance.construct(node);++  // These two fields are used by the DOM and ART diffing algorithms+  // respectively. Instead of using expandos on components, we should be+  // storing the state needed by the diffing algorithms elsewhere.+  instance._mountIndex = 0;+  instance._mountImage = null;++  if ("production" !== "development") {+    instance._isOwnerNecessary = false;+    instance._warnedAboutRefsInRender = false;+  }++  // Internal instances should fully constructed at this point, so they should+  // not get any new fields added to them at this point.+  if ("production" !== "development") {+    if (Object.preventExtensions) {+      Object.preventExtensions(instance);+    }+  }++  return instance;+}++module.exports = instantiateReactComponent;++},{"135":135,"154":154,"27":27,"37":37,"59":59,"73":73}],135:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule invariant+ */++"use strict";++/**+ * Use invariant() to assert state which your program assumes to be true.+ *+ * Provide sprintf-style format (only %s is supported) and arguments+ * to provide information about what broke and what you were+ * expecting.+ *+ * The invariant message will be stripped in production, but the invariant+ * will remain to ensure logic does not differ in production.+ */++var invariant = function(condition, format, a, b, c, d, e, f) {+  if ("production" !== "development") {+    if (format === undefined) {+      throw new Error('invariant requires an error message argument');+    }+  }++  if (!condition) {+    var error;+    if (format === undefined) {+      error = new Error(+        'Minified exception occurred; use the non-minified dev environment ' ++        'for the full error message and additional helpful warnings.'+      );+    } else {+      var args = [a, b, c, d, e, f];+      var argIndex = 0;+      error = new Error(+        'Invariant Violation: ' ++        format.replace(/%s/g, function() { return args[argIndex++]; })+      );+    }++    error.framesToPop = 1; // we don't care about invariant's own frame+    throw error;+  }+};++module.exports = invariant;++},{}],136:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule isEventSupported+ */++'use strict';++var ExecutionEnvironment = _dereq_(21);++var useHasFeature;+if (ExecutionEnvironment.canUseDOM) {+  useHasFeature =+    document.implementation &&+    document.implementation.hasFeature &&+    // always returns true in newer browsers as per the standard.+    // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature+    document.implementation.hasFeature('', '') !== true;+}++/**+ * Checks if an event is supported in the current execution environment.+ *+ * NOTE: This will not work correctly for non-generic events such as `change`,+ * `reset`, `load`, `error`, and `select`.+ *+ * Borrows from Modernizr.+ *+ * @param {string} eventNameSuffix Event name, e.g. "click".+ * @param {?boolean} capture Check if the capture phase is supported.+ * @return {boolean} True if the event is supported.+ * @internal+ * @license Modernizr 3.0.0pre (Custom Build) | MIT+ */+function isEventSupported(eventNameSuffix, capture) {+  if (!ExecutionEnvironment.canUseDOM ||+      capture && !('addEventListener' in document)) {+    return false;+  }++  var eventName = 'on' + eventNameSuffix;+  var isSupported = eventName in document;++  if (!isSupported) {+    var element = document.createElement('div');+    element.setAttribute(eventName, 'return;');+    isSupported = typeof element[eventName] === 'function';+  }++  if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {+    // This is the only way to test support for the `wheel` event in IE9+.+    isSupported = document.implementation.hasFeature('Events.wheel', '3.0');+  }++  return isSupported;+}++module.exports = isEventSupported;++},{"21":21}],137:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule isNode+ * @typechecks+ */++/**+ * @param {*} object The object to check.+ * @return {boolean} Whether or not the object is a DOM node.+ */+function isNode(object) {+  return !!(object && (+    ((typeof Node === 'function' ? object instanceof Node : typeof object === 'object' &&+    typeof object.nodeType === 'number' &&+    typeof object.nodeName === 'string'))+  ));+}++module.exports = isNode;++},{}],138:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule isTextInputElement+ */++'use strict';++/**+ * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary+ */+var supportedInputTypes = {+  'color': true,+  'date': true,+  'datetime': true,+  'datetime-local': true,+  'email': true,+  'month': true,+  'number': true,+  'password': true,+  'range': true,+  'search': true,+  'tel': true,+  'text': true,+  'time': true,+  'url': true,+  'week': true+};++function isTextInputElement(elem) {+  return elem && (+    (elem.nodeName === 'INPUT' && supportedInputTypes[elem.type] || elem.nodeName === 'TEXTAREA')+  );+}++module.exports = isTextInputElement;++},{}],139:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule isTextNode+ * @typechecks+ */++var isNode = _dereq_(137);++/**+ * @param {*} object The object to check.+ * @return {boolean} Whether or not the object is a DOM text node.+ */+function isTextNode(object) {+  return isNode(object) && object.nodeType == 3;+}++module.exports = isTextNode;++},{"137":137}],140:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule keyMirror+ * @typechecks static-only+ */++'use strict';++var invariant = _dereq_(135);++/**+ * Constructs an enumeration with keys equal to their value.+ *+ * For example:+ *+ *   var COLORS = keyMirror({blue: null, red: null});+ *   var myColor = COLORS.blue;+ *   var isColorValid = !!COLORS[myColor];+ *+ * The last line could not be performed if the values of the generated enum were+ * not equal to their keys.+ *+ *   Input:  {key1: val1, key2: val2}+ *   Output: {key1: key1, key2: key2}+ *+ * @param {object} obj+ * @return {object}+ */+var keyMirror = function(obj) {+  var ret = {};+  var key;+  ("production" !== "development" ? invariant(+    obj instanceof Object && !Array.isArray(obj),+    'keyMirror(...): Argument must be an object.'+  ) : invariant(obj instanceof Object && !Array.isArray(obj)));+  for (key in obj) {+    if (!obj.hasOwnProperty(key)) {+      continue;+    }+    ret[key] = key;+  }+  return ret;+};++module.exports = keyMirror;++},{"135":135}],141:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule keyOf+ */++/**+ * Allows extraction of a minified key. Let's the build system minify keys+ * without loosing the ability to dynamically use key strings as values+ * themselves. Pass in an object with a single key/val pair and it will return+ * you the string key of that single record. Suppose you want to grab the+ * value for a key 'className' inside of an object. Key/val minification may+ * have aliased that key to be 'xa12'. keyOf({className: null}) will return+ * 'xa12' in that case. Resolve keys you want to use once at startup time, then+ * reuse those resolutions.+ */+var keyOf = function(oneKeyObj) {+  var key;+  for (key in oneKeyObj) {+    if (!oneKeyObj.hasOwnProperty(key)) {+      continue;+    }+    return key;+  }+  return null;+};+++module.exports = keyOf;++},{}],142:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule mapObject+ */++'use strict';++var hasOwnProperty = Object.prototype.hasOwnProperty;++/**+ * Executes the provided `callback` once for each enumerable own property in the+ * object and constructs a new object from the results. The `callback` is+ * invoked with three arguments:+ *+ *  - the property value+ *  - the property name+ *  - the object being traversed+ *+ * Properties that are added after the call to `mapObject` will not be visited+ * by `callback`. If the values of existing properties are changed, the value+ * passed to `callback` will be the value at the time `mapObject` visits them.+ * Properties that are deleted before being visited are not visited.+ *+ * @grep function objectMap()+ * @grep function objMap()+ *+ * @param {?object} object+ * @param {function} callback+ * @param {*} context+ * @return {?object}+ */+function mapObject(object, callback, context) {+  if (!object) {+    return null;+  }+  var result = {};+  for (var name in object) {+    if (hasOwnProperty.call(object, name)) {+      result[name] = callback.call(context, object[name], name, object);+    }+  }+  return result;+}++module.exports = mapObject;++},{}],143:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule memoizeStringOnly+ * @typechecks static-only+ */++'use strict';++/**+ * Memoizes the return value of a function that accepts one string argument.+ *+ * @param {function} callback+ * @return {function}+ */+function memoizeStringOnly(callback) {+  var cache = {};+  return function(string) {+    if (!cache.hasOwnProperty(string)) {+      cache[string] = callback.call(this, string);+    }+    return cache[string];+  };+}++module.exports = memoizeStringOnly;++},{}],144:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule onlyChild+ */+'use strict';++var ReactElement = _dereq_(57);++var invariant = _dereq_(135);++/**+ * Returns the first child in a collection of children and verifies that there+ * is only one child in the collection. The current implementation of this+ * function assumes that a single child gets passed without a wrapper, but the+ * purpose of this helper function is to abstract away the particular structure+ * of children.+ *+ * @param {?object} children Child collection structure.+ * @return {ReactComponent} The first and only `ReactComponent` contained in the+ * structure.+ */+function onlyChild(children) {+  ("production" !== "development" ? invariant(+    ReactElement.isValidElement(children),+    'onlyChild must be passed a children with exactly one child.'+  ) : invariant(ReactElement.isValidElement(children)));+  return children;+}++module.exports = onlyChild;++},{"135":135,"57":57}],145:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule performance+ * @typechecks+ */++"use strict";++var ExecutionEnvironment = _dereq_(21);++var performance;++if (ExecutionEnvironment.canUseDOM) {+  performance =+    window.performance ||+    window.msPerformance ||+    window.webkitPerformance;+}++module.exports = performance || {};++},{"21":21}],146:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule performanceNow+ * @typechecks+ */++var performance = _dereq_(145);++/**+ * Detect if we can use `window.performance.now()` and gracefully fallback to+ * `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now+ * because of Facebook's testing infrastructure.+ */+if (!performance || !performance.now) {+  performance = Date;+}++var performanceNow = performance.now.bind(performance);++module.exports = performanceNow;++},{"145":145}],147:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule quoteAttributeValueForBrowser+ */++'use strict';++var escapeTextContentForBrowser = _dereq_(116);++/**+ * Escapes attribute value to prevent scripting attacks.+ *+ * @param {*} value Value to escape.+ * @return {string} An escaped string.+ */+function quoteAttributeValueForBrowser(value) {+  return '"' + escapeTextContentForBrowser(value) + '"';+}++module.exports = quoteAttributeValueForBrowser;++},{"116":116}],148:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule setInnerHTML+ */++/* globals MSApp */++'use strict';++var ExecutionEnvironment = _dereq_(21);++var WHITESPACE_TEST = /^[ \r\n\t\f]/;+var NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/;++/**+ * Set the innerHTML property of a node, ensuring that whitespace is preserved+ * even in IE8.+ *+ * @param {DOMElement} node+ * @param {string} html+ * @internal+ */+var setInnerHTML = function(node, html) {+  node.innerHTML = html;+};++// Win8 apps: Allow all html to be inserted+if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {+  setInnerHTML = function(node, html) {+    MSApp.execUnsafeLocalFunction(function() {+      node.innerHTML = html;+    });+  };+}++if (ExecutionEnvironment.canUseDOM) {+  // IE8: When updating a just created node with innerHTML only leading+  // whitespace is removed. When updating an existing node with innerHTML+  // whitespace in root TextNodes is also collapsed.+  // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html++  // Feature detection; only IE8 is known to behave improperly like this.+  var testElement = document.createElement('div');+  testElement.innerHTML = ' ';+  if (testElement.innerHTML === '') {+    setInnerHTML = function(node, html) {+      // Magic theory: IE8 supposedly differentiates between added and updated+      // nodes when processing innerHTML, innerHTML on updated nodes suffers+      // from worse whitespace behavior. Re-adding a node like this triggers+      // the initial and more favorable whitespace behavior.+      // TODO: What to do on a detached node?+      if (node.parentNode) {+        node.parentNode.replaceChild(node, node);+      }++      // We also implement a workaround for non-visible tags disappearing into+      // thin air on IE8, this only happens if there is no visible text+      // in-front of the non-visible tags. Piggyback on the whitespace fix+      // and simply check if any non-visible tags appear in the source.+      if (WHITESPACE_TEST.test(html) ||+          html[0] === '<' && NONVISIBLE_TEST.test(html)) {+        // Recover leading whitespace by temporarily prepending any character.+        // \uFEFF has the potential advantage of being zero-width/invisible.+        node.innerHTML = '\uFEFF' + html;++        // deleteData leaves an empty `TextNode` which offsets the index of all+        // children. Definitely want to avoid this.+        var textNode = node.firstChild;+        if (textNode.data.length === 1) {+          node.removeChild(textNode);+        } else {+          textNode.deleteData(0, 1);+        }+      } else {+        node.innerHTML = html;+      }+    };+  }+}++module.exports = setInnerHTML;++},{"21":21}],149:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule setTextContent+ */++'use strict';++var ExecutionEnvironment = _dereq_(21);+var escapeTextContentForBrowser = _dereq_(116);+var setInnerHTML = _dereq_(148);++/**+ * Set the textContent property of a node, ensuring that whitespace is preserved+ * even in IE8. innerText is a poor substitute for textContent and, among many+ * issues, inserts <br> instead of the literal newline chars. innerHTML behaves+ * as it should.+ *+ * @param {DOMElement} node+ * @param {string} text+ * @internal+ */+var setTextContent = function(node, text) {+  node.textContent = text;+};++if (ExecutionEnvironment.canUseDOM) {+  if (!('textContent' in document.documentElement)) {+    setTextContent = function(node, text) {+      setInnerHTML(node, escapeTextContentForBrowser(text));+    };+  }+}++module.exports = setTextContent;++},{"116":116,"148":148,"21":21}],150:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule shallowEqual+ */++'use strict';++/**+ * Performs equality by iterating through keys on an object and returning+ * false when any key has values which are not strictly equal between+ * objA and objB. Returns true when the values of all keys are strictly equal.+ *+ * @return {boolean}+ */+function shallowEqual(objA, objB) {+  if (objA === objB) {+    return true;+  }+  var key;+  // Test for A's keys different from B.+  for (key in objA) {+    if (objA.hasOwnProperty(key) &&+        (!objB.hasOwnProperty(key) || objA[key] !== objB[key])) {+      return false;+    }+  }+  // Test for B's keys missing from A.+  for (key in objB) {+    if (objB.hasOwnProperty(key) && !objA.hasOwnProperty(key)) {+      return false;+    }+  }+  return true;+}++module.exports = shallowEqual;++},{}],151:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule shouldUpdateReactComponent+ * @typechecks static-only+ */++'use strict';++var warning = _dereq_(154);++/**+ * Given a `prevElement` and `nextElement`, determines if the existing+ * instance should be updated as opposed to being destroyed or replaced by a new+ * instance. Both arguments are elements. This ensures that this logic can+ * operate on stateless trees without any backing instance.+ *+ * @param {?object} prevElement+ * @param {?object} nextElement+ * @return {boolean} True if the existing instance should be updated.+ * @protected+ */+function shouldUpdateReactComponent(prevElement, nextElement) {+  if (prevElement != null && nextElement != null) {+    var prevType = typeof prevElement;+    var nextType = typeof nextElement;+    if (prevType === 'string' || prevType === 'number') {+      return (nextType === 'string' || nextType === 'number');+    } else {+      if (nextType === 'object' &&+          prevElement.type === nextElement.type &&+          prevElement.key === nextElement.key) {+        var ownersMatch = prevElement._owner === nextElement._owner;+        var prevName = null;+        var nextName = null;+        var nextDisplayName = null;+        if ("production" !== "development") {+          if (!ownersMatch) {+            if (prevElement._owner != null &&+                prevElement._owner.getPublicInstance() != null &&+                prevElement._owner.getPublicInstance().constructor != null) {+              prevName =+                prevElement._owner.getPublicInstance().constructor.displayName;+            }+            if (nextElement._owner != null &&+                nextElement._owner.getPublicInstance() != null &&+                nextElement._owner.getPublicInstance().constructor != null) {+              nextName =+                nextElement._owner.getPublicInstance().constructor.displayName;+            }+            if (nextElement.type != null &&+                nextElement.type.displayName != null) {+              nextDisplayName = nextElement.type.displayName;+            }+            if (nextElement.type != null && typeof nextElement.type === 'string') {+              nextDisplayName = nextElement.type;+            }+            if (typeof nextElement.type !== 'string' ||+                nextElement.type === 'input' ||+                nextElement.type === 'textarea') {+              if ((prevElement._owner != null &&+                  prevElement._owner._isOwnerNecessary === false) ||+                  (nextElement._owner != null &&+                  nextElement._owner._isOwnerNecessary === false)) {+                if (prevElement._owner != null) {+                  prevElement._owner._isOwnerNecessary = true;+                }+                if (nextElement._owner != null) {+                  nextElement._owner._isOwnerNecessary = true;+                }+                ("production" !== "development" ? warning(+                  false,+                  '<%s /> is being rendered by both %s and %s using the same ' ++                  'key (%s) in the same place. Currently, this means that ' ++                  'they don\'t preserve state. This behavior should be very ' ++                  'rare so we\'re considering deprecating it. Please contact ' ++                  'the React team and explain your use case so that we can ' ++                  'take that into consideration.',+                  nextDisplayName || 'Unknown Component',+                  prevName || '[Unknown]',+                  nextName || '[Unknown]',+                  prevElement.key+                ) : null);+              }+            }+          }+        }+        return ownersMatch;+      }+    }+  }+  return false;+}++module.exports = shouldUpdateReactComponent;++},{"154":154}],152:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule toArray+ * @typechecks+ */++var invariant = _dereq_(135);++/**+ * Convert array-like objects to arrays.+ *+ * This API assumes the caller knows the contents of the data type. For less+ * well defined inputs use createArrayFromMixed.+ *+ * @param {object|function|filelist} obj+ * @return {array}+ */+function toArray(obj) {+  var length = obj.length;++  // Some browse builtin objects can report typeof 'function' (e.g. NodeList in+  // old versions of Safari).+  ("production" !== "development" ? invariant(+    !Array.isArray(obj) &&+    (typeof obj === 'object' || typeof obj === 'function'),+    'toArray: Array-like object expected'+  ) : invariant(!Array.isArray(obj) &&+  (typeof obj === 'object' || typeof obj === 'function')));++  ("production" !== "development" ? invariant(+    typeof length === 'number',+    'toArray: Object needs a length property'+  ) : invariant(typeof length === 'number'));++  ("production" !== "development" ? invariant(+    length === 0 ||+    (length - 1) in obj,+    'toArray: Object should have keys for indices'+  ) : invariant(length === 0 ||+  (length - 1) in obj));++  // Old IE doesn't give collections access to hasOwnProperty. Assume inputs+  // without method will throw during the slice call and skip straight to the+  // fallback.+  if (obj.hasOwnProperty) {+    try {+      return Array.prototype.slice.call(obj);+    } catch (e) {+      // IE < 9 does not support Array#slice on collections objects+    }+  }++  // Fall back to copying key by key. This assumes all keys have a value,+  // so will not preserve sparsely populated inputs.+  var ret = Array(length);+  for (var ii = 0; ii < length; ii++) {+    ret[ii] = obj[ii];+  }+  return ret;+}++module.exports = toArray;++},{"135":135}],153:[function(_dereq_,module,exports){+/**+ * Copyright 2013-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule traverseAllChildren+ */++'use strict';++var ReactElement = _dereq_(57);+var ReactFragment = _dereq_(63);+var ReactInstanceHandles = _dereq_(66);++var getIteratorFn = _dereq_(126);+var invariant = _dereq_(135);+var warning = _dereq_(154);++var SEPARATOR = ReactInstanceHandles.SEPARATOR;+var SUBSEPARATOR = ':';++/**+ * TODO: Test that a single child and an array with one item have the same key+ * pattern.+ */++var userProvidedKeyEscaperLookup = {+  '=': '=0',+  '.': '=1',+  ':': '=2'+};++var userProvidedKeyEscapeRegex = /[=.:]/g;++var didWarnAboutMaps = false;++function userProvidedKeyEscaper(match) {+  return userProvidedKeyEscaperLookup[match];+}++/**+ * Generate a key string that identifies a component within a set.+ *+ * @param {*} component A component that could contain a manual key.+ * @param {number} index Index that is used if a manual key is not provided.+ * @return {string}+ */+function getComponentKey(component, index) {+  if (component && component.key != null) {+    // Explicit key+    return wrapUserProvidedKey(component.key);+  }+  // Implicit key determined by the index in the set+  return index.toString(36);+}++/**+ * Escape a component key so that it is safe to use in a reactid.+ *+ * @param {*} key Component key to be escaped.+ * @return {string} An escaped string.+ */+function escapeUserProvidedKey(text) {+  return ('' + text).replace(+    userProvidedKeyEscapeRegex,+    userProvidedKeyEscaper+  );+}++/**+ * Wrap a `key` value explicitly provided by the user to distinguish it from+ * implicitly-generated keys generated by a component's index in its parent.+ *+ * @param {string} key Value of a user-provided `key` attribute+ * @return {string}+ */+function wrapUserProvidedKey(key) {+  return '$' + escapeUserProvidedKey(key);+}++/**+ * @param {?*} children Children tree container.+ * @param {!string} nameSoFar Name of the key path so far.+ * @param {!number} indexSoFar Number of children encountered until this point.+ * @param {!function} callback Callback to invoke with each child found.+ * @param {?*} traverseContext Used to pass information throughout the traversal+ * process.+ * @return {!number} The number of children in this subtree.+ */+function traverseAllChildrenImpl(+  children,+  nameSoFar,+  indexSoFar,+  callback,+  traverseContext+) {+  var type = typeof children;++  if (type === 'undefined' || type === 'boolean') {+    // All of the above are perceived as null.+    children = null;+  }++  if (children === null ||+      type === 'string' ||+      type === 'number' ||+      ReactElement.isValidElement(children)) {+    callback(+      traverseContext,+      children,+      // If it's the only child, treat the name as if it was wrapped in an array+      // so that it's consistent if the number of children grows.+      nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar,+      indexSoFar+    );+    return 1;+  }++  var child, nextName, nextIndex;+  var subtreeCount = 0; // Count of children found in the current subtree.++  if (Array.isArray(children)) {+    for (var i = 0; i < children.length; i++) {+      child = children[i];+      nextName = (+        (nameSoFar !== '' ? nameSoFar + SUBSEPARATOR : SEPARATOR) ++        getComponentKey(child, i)+      );+      nextIndex = indexSoFar + subtreeCount;+      subtreeCount += traverseAllChildrenImpl(+        child,+        nextName,+        nextIndex,+        callback,+        traverseContext+      );+    }+  } else {+    var iteratorFn = getIteratorFn(children);+    if (iteratorFn) {+      var iterator = iteratorFn.call(children);+      var step;+      if (iteratorFn !== children.entries) {+        var ii = 0;+        while (!(step = iterator.next()).done) {+          child = step.value;+          nextName = (+            (nameSoFar !== '' ? nameSoFar + SUBSEPARATOR : SEPARATOR) ++            getComponentKey(child, ii++)+          );+          nextIndex = indexSoFar + subtreeCount;+          subtreeCount += traverseAllChildrenImpl(+            child,+            nextName,+            nextIndex,+            callback,+            traverseContext+          );+        }+      } else {+        if ("production" !== "development") {+          ("production" !== "development" ? warning(+            didWarnAboutMaps,+            'Using Maps as children is not yet fully supported. It is an ' ++            'experimental feature that might be removed. Convert it to a ' ++            'sequence / iterable of keyed ReactElements instead.'+          ) : null);+          didWarnAboutMaps = true;+        }+        // Iterator will provide entry [k,v] tuples rather than values.+        while (!(step = iterator.next()).done) {+          var entry = step.value;+          if (entry) {+            child = entry[1];+            nextName = (+              (nameSoFar !== '' ? nameSoFar + SUBSEPARATOR : SEPARATOR) ++              wrapUserProvidedKey(entry[0]) + SUBSEPARATOR ++              getComponentKey(child, 0)+            );+            nextIndex = indexSoFar + subtreeCount;+            subtreeCount += traverseAllChildrenImpl(+              child,+              nextName,+              nextIndex,+              callback,+              traverseContext+            );+          }+        }+      }+    } else if (type === 'object') {+      ("production" !== "development" ? invariant(+        children.nodeType !== 1,+        'traverseAllChildren(...): Encountered an invalid child; DOM ' ++        'elements are not valid children of React components.'+      ) : invariant(children.nodeType !== 1));+      var fragment = ReactFragment.extract(children);+      for (var key in fragment) {+        if (fragment.hasOwnProperty(key)) {+          child = fragment[key];+          nextName = (+            (nameSoFar !== '' ? nameSoFar + SUBSEPARATOR : SEPARATOR) ++            wrapUserProvidedKey(key) + SUBSEPARATOR ++            getComponentKey(child, 0)+          );+          nextIndex = indexSoFar + subtreeCount;+          subtreeCount += traverseAllChildrenImpl(+            child,+            nextName,+            nextIndex,+            callback,+            traverseContext+          );+        }+      }+    }+  }++  return subtreeCount;+}++/**+ * Traverses children that are typically specified as `props.children`, but+ * might also be specified through attributes:+ *+ * - `traverseAllChildren(this.props.children, ...)`+ * - `traverseAllChildren(this.props.leftPanelChildren, ...)`+ *+ * The `traverseContext` is an optional argument that is passed through the+ * entire traversal. It can be used to store accumulations or anything else that+ * the callback might find relevant.+ *+ * @param {?*} children Children tree object.+ * @param {!function} callback To invoke upon traversing each child.+ * @param {?*} traverseContext Context for traversal.+ * @return {!number} The number of children in this subtree.+ */+function traverseAllChildren(children, callback, traverseContext) {+  if (children == null) {+    return 0;+  }++  return traverseAllChildrenImpl(children, '', 0, callback, traverseContext);+}++module.exports = traverseAllChildren;++},{"126":126,"135":135,"154":154,"57":57,"63":63,"66":66}],154:[function(_dereq_,module,exports){+/**+ * Copyright 2014-2015, Facebook, Inc.+ * All rights reserved.+ *+ * This source code is licensed under the BSD-style license found in the+ * LICENSE file in the root directory of this source tree. An additional grant+ * of patent rights can be found in the PATENTS file in the same directory.+ *+ * @providesModule warning+ */++"use strict";++var emptyFunction = _dereq_(114);++/**+ * Similar to invariant but only logs a warning if the condition is not met.+ * This can be used to log issues in development environments in critical+ * paths. Removing the logging code for production environments will keep the+ * same logic and follow the same code paths.+ */++var warning = emptyFunction;++if ("production" !== "development") {+  warning = function(condition, format ) {for (var args=[],$__0=2,$__1=arguments.length;$__0<$__1;$__0++) args.push(arguments[$__0]);+    if (format === undefined) {+      throw new Error(+        '`warning(condition, format, ...args)` requires a warning ' ++        'message argument'+      );+    }++    if (format.length < 10 || /^[s\W]*$/.test(format)) {+      throw new Error(+        'The warning format should be able to uniquely identify this ' ++        'warning. Please, use a more descriptive format than: ' + format+      );+    }++    if (format.indexOf('Failed Composite propType: ') === 0) {+      return; // Ignore CompositeComponent proptype check.+    }++    if (!condition) {+      var argIndex = 0;+      var message = 'Warning: ' + format.replace(/%s/g, function()  {return args[argIndex++];});+      console.warn(message);+      try {+        // --- Welcome to debugging React ---+        // This error was thrown as a convenience so that you can use this stack+        // to find the callsite that caused this warning to fire.+        throw new Error(message);+      } catch(x) {}+    }+  };+}++module.exports = warning;++},{"114":114}]},{},[1])(1)+});
lib/stubs.js view
@@ -1,338 +1,51 @@-// EventProperties-function js_bubbles(obj) {return obj.bubbles;}-function js_cancelable(obj) {return obj.cancelable;}-function js_currentTarget(obj) {return obj.currentTarget;}-function js_defaultPrevented(obj) {return obj.defaultPrevented;}-function js_eventPhase(obj) {return obj.eventPhase;}-function js_isTrusted(obj) {return obj.isTrusted;}-//                  -- ,  nativeEvent :: DOMEvent-//                  -- , preventDefault :: IO ()-//                  -- ,  stopPropagation :: IO ()-function js_evtTarget(obj) {return obj.evtTarget;}-//                  --, timeStamp :: DateTime--//ModifierKeys-function js_type(obj) {return obj.type;}-function js_altKey(obj) {return obj.altKey;}-function js_ctrlKey(obj) {return obj.ctrlKey;}-function js_metaKey(obj) {return obj.metaKey;}-function js_shiftKey(obj) {return obj.shiftKey;}--//MouseEvent-function js_button(obj) {return obj.button;}-function js_buttons(obj) {return obj.buttons;}-function js_clientX(obj) {return obj.clientX;}-function js_clientY(obj) {return obj.clientY;}-function js_pageX(obj) {return obj.pageX;}-function js_pageY(obj) {return obj.pageY;}-//--                             , relatedTarget :: Unpacked-function js_screenX(obj) {return obj.screenX;}-function js_screenY(obj) {return obj.screenY;}--// KeyboardEvent-function js_charCode(obj) {return obj.charCode;}-function js_key(obj) {return obj.key;}-function js_keyCode(obj) {return obj.keyCode;}-function js_locale(obj) {return obj.locale;}-function js_location(obj) {return obj.location;}-function js_repeat(obj) {return obj.repeat;}-function js_which(obj) {return obj.which;}--//ChangeEvent-function js_targetValue(obj) {return obj.target.value;}--//FocusEvent-function js_focusEventProperties(obj) {return obj.focusEventProperties;}-function js_domEventTarget(obj) {return obj.domEventTarget;}-function js_relatedTarget(obj) {return obj.relatedTarget;}--function js_empty_object() {return {};}-function js_set_field(obj, field, value) {obj[field] = value;}-function js_set_field_True(obj, field, value) {obj[field] = true;}-function js_set_field_False(obj, field, value) {obj[field] = false;}--function js_set_onClick(cb, attrs) {-    attrs.onClick = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}-function js_set_onDoubleClick(cb, attrs) {-    attrs.onDoubleClick = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}-function js_set_onChange(cb, attrs) {-    attrs.onChange = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}-function js_set_onKeyUp(cb, attrs) {-    attrs.onKeyUp = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}-function js_set_onKeyPress(cb, attrs) {-    attrs.onKeyPress = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}-function js_set_onKeyDown(cb, attrs) {-    attrs.onKeyDown = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}-function js_set_onBlur(cb, attrs) {-    attrs.onBlur = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}-function js_set_onMouseEnter(cb, attrs) {-    attrs.onMouseEnter = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}-function js_set_onMouseLeave(cb, attrs) {-    attrs.onMouseLeave = function(e) {-        e.persist();-        B(A(cb,[[0,e],0]));-    };-}--function js_React_DOM(tagName, attrs) {return React.DOM[tagName](attrs);}--function js_empty() {return [];}-function js_push(a,v) {a.push(v);}--// Ptr (Maybe React)-function js_React_getDomNode(r) {-  try {-    var ret = [1, [0, r.getDOMNode()]];-  } catch(e) {-    return [0];-  }-  return ret;+function js_set_handler(cid, name, cb, obj) {+  obj[name] = function(e) {+    // TODO(joel) either persist or force, not both?+    e.persist();+    cb(e);+  }; } -// Normal elements-function js_React_DOM_a(a,c) {return React.DOM.a(a,c);}-function js_React_DOM_abbr(a,c) {return React.DOM.abbr(a,c);}-function js_React_DOM_address(a,c) {return React.DOM.address(a,c);}-function js_React_DOM_article(a,c) {return React.DOM.article(a,c);}-function js_React_DOM_aside(a,c) {return React.DOM.aside(a,c);}-function js_React_DOM_audio(a,c) {return React.DOM.audio(a,c);}-function js_React_DOM_b(a,c) {return React.DOM.b(a,c);}-function js_React_DOM_bdi(a,c) {return React.DOM.bdi(a,c);}-function js_React_DOM_bdo(a,c) {return React.DOM.bdo(a,c);}-function js_React_DOM_big(a,c) {return React.DOM.big(a,c);}-function js_React_DOM_blockquote(a,c) {return React.DOM.blockquote(a,c);}-function js_React_DOM_body(a,c) {return React.DOM.body(a,c);}-function js_React_DOM_button(a,c) {return React.DOM.button(a,c);}-function js_React_DOM_canvas(a,c) {return React.DOM.canvas(a,c);}-function js_React_DOM_caption(a,c) {return React.DOM.caption(a,c);}-function js_React_DOM_cite(a,c) {return React.DOM.cite(a,c);}-function js_React_DOM_code(a,c) {return React.DOM.code(a,c);}-function js_React_DOM_colgroup(a,c) {return React.DOM.colgroup(a,c);}-function js_React_DOM_data(a,c) {return React.DOM.data(a,c);}-function js_React_DOM_datalist(a,c) {return React.DOM.datalist(a,c);}-function js_React_DOM_dd(a,c) {return React.DOM.dd(a,c);}-function js_React_DOM_del(a,c) {return React.DOM.del(a,c);}-function js_React_DOM_details(a,c) {return React.DOM.details(a,c);}-function js_React_DOM_dfn(a,c) {return React.DOM.dfn(a,c);}-function js_React_DOM_div(a,c) {return React.DOM.div(a,c);}-function js_React_DOM_dl(a,c) {return React.DOM.dl(a,c);}-function js_React_DOM_dt(a,c) {return React.DOM.dt(a,c);}-function js_React_DOM_em(a,c) {return React.DOM.em(a,c);}-function js_React_DOM_fieldset(a,c) {return React.DOM.fieldset(a,c);}-function js_React_DOM_figcaption(a,c) {return React.DOM.figcaption(a,c);}-function js_React_DOM_figure(a,c) {return React.DOM.figure(a,c);}-function js_React_DOM_footer(a,c) {return React.DOM.footer(a,c);}-function js_React_DOM_form(a,c) {return React.DOM.form(a,c);}-function js_React_DOM_h1(a,c) {return React.DOM.h1(a,c);}-function js_React_DOM_h2(a,c) {return React.DOM.h2(a,c);}-function js_React_DOM_h3(a,c) {return React.DOM.h3(a,c);}-function js_React_DOM_h4(a,c) {return React.DOM.h4(a,c);}-function js_React_DOM_h5(a,c) {return React.DOM.h5(a,c);}-function js_React_DOM_h6(a,c) {return React.DOM.h6(a,c);}-function js_React_DOM_head(a,c) {return React.DOM.head(a,c);}-function js_React_DOM_header(a,c) {return React.DOM.header(a,c);}-function js_React_DOM_html(a,c) {return React.DOM.html(a,c);}-function js_React_DOM_i(a,c) {return React.DOM.i(a,c);}-function js_React_DOM_iframe(a,c) {return React.DOM.iframe(a,c);}-function js_React_DOM_ins(a,c) {return React.DOM.ins(a,c);}-function js_React_DOM_kbd(a,c) {return React.DOM.kbd(a,c);}-function js_React_DOM_label(a,c) {return React.DOM.label(a,c);}-function js_React_DOM_legend(a,c) {return React.DOM.legend(a,c);}-function js_React_DOM_li(a,c) {return React.DOM.li(a,c);}-function js_React_DOM_main(a,c) {return React.DOM.main(a,c);}-function js_React_DOM_map(a,c) {return React.DOM.map(a,c);}-function js_React_DOM_mark(a,c) {return React.DOM.mark(a,c);}-function js_React_DOM_menu(a,c) {return React.DOM.menu(a,c);}-function js_React_DOM_menuitem(a,c) {return React.DOM.menuitem(a,c);}-function js_React_DOM_meter(a,c) {return React.DOM.meter(a,c);}-function js_React_DOM_nav(a,c) {return React.DOM.nav(a,c);}-function js_React_DOM_noscript(a,c) {return React.DOM.noscript(a,c);}-function js_React_DOM_object(a,c) {return React.DOM.object(a,c);}-function js_React_DOM_ol(a,c) {return React.DOM.ol(a,c);}-function js_React_DOM_optgroup(a,c) {return React.DOM.optgroup(a,c);}-function js_React_DOM_option(a,c) {return React.DOM.option(a,c);}-function js_React_DOM_output(a,c) {return React.DOM.output(a,c);}-function js_React_DOM_p(a,c) {return React.DOM.p(a,c);}-function js_React_DOM_pre(a,c) {return React.DOM.pre(a,c);}-function js_React_DOM_progress(a,c) {return React.DOM.progress(a,c);}-function js_React_DOM_q(a,c) {return React.DOM.q(a,c);}-function js_React_DOM_rp(a,c) {return React.DOM.rp(a,c);}-function js_React_DOM_rt(a,c) {return React.DOM.rt(a,c);}-function js_React_DOM_ruby(a,c) {return React.DOM.ruby(a,c);}-function js_React_DOM_s(a,c) {return React.DOM.s(a,c);}-function js_React_DOM_samp(a,c) {return React.DOM.samp(a,c);}-function js_React_DOM_section(a,c) {return React.DOM.section(a,c);}-function js_React_DOM_select(a,c) {return React.DOM.select(a,c);}-function js_React_DOM_small(a,c) {return React.DOM.small(a,c);}-function js_React_DOM_span(a,c) {return React.DOM.span(a,c);}-function js_React_DOM_strong(a,c) {return React.DOM.strong(a,c);}-function js_React_DOM_sub(a,c) {return React.DOM.sub(a,c);}-function js_React_DOM_summary(a,c) {return React.DOM.summary(a,c);}-function js_React_DOM_sup(a,c) {return React.DOM.sup(a,c);}-function js_React_DOM_table(a,c) {return React.DOM.table(a,c);}-function js_React_DOM_tbody(a,c) {return React.DOM.tbody(a,c);}-function js_React_DOM_td(a,c) {return React.DOM.td(a,c);}-function js_React_DOM_tfoot(a,c) {return React.DOM.tfoot(a,c);}-function js_React_DOM_th(a,c) {return React.DOM.th(a,c);}-function js_React_DOM_thead(a,c) {return React.DOM.thead(a,c);}-function js_React_DOM_time(a,c) {return React.DOM.time(a,c);}-function js_React_DOM_tr(a,c) {return React.DOM.tr(a,c);}-function js_React_DOM_u(a,c) {return React.DOM.u(a,c);}-function js_React_DOM_ul(a,c) {return React.DOM.ul(a,c);}-function js_React_DOM_var(a,c) {return React.DOM.var(a,c);}-function js_React_DOM_video(a,c) {return React.DOM.video(a,c);}--// No-child-function js_React_DOM_area(a) {return React.DOM.area(a);}-function js_React_DOM_base(a) {return React.DOM.base(a);}-function js_React_DOM_br(a) {return React.DOM.br(a);}-function js_React_DOM_col(a) {return React.DOM.col(a);}-function js_React_DOM_embed(a) {return React.DOM.embed(a);}-function js_React_DOM_hr(a) {return React.DOM.hr(a);}-function js_React_DOM_img(a) {return React.DOM.img(a);}-function js_React_DOM_input(a) {return React.DOM.input(a);}-function js_React_DOM_keygen(a) {return React.DOM.keygen(a);}-function js_React_DOM_link(a) {return React.DOM.link(a);}-function js_React_DOM_meta(a) {return React.DOM.meta(a);}-function js_React_DOM_param(a) {return React.DOM.param(a);}-function js_React_DOM_source(a) {return React.DOM.source(a);}-function js_React_DOM_track(a) {return React.DOM.track(a);}-function js_React_DOM_wbr(a) {return React.DOM.wbr(a);}--// text-only-function js_React_DOM_script(a,t) {return React.DOM.script(a,t);}-function js_React_DOM_style(a,t) {return React.DOM.style(a,t);}-function js_React_DOM_textarea(a,t) {return React.DOM.textarea(a,t);}-function js_React_DOM_title(a,t) {return React.DOM.title(a,t);}-function js_id(a) {return a;}--// custom-function js_React_DOM_leaf(name, a) { return React.DOM[name](a); }-function js_React_DOM_parent(name, a, c) { return React.DOM[name](a, c); }--function js_parseChangeEvent(raw) {-    // wrap the string in two constructors - Ptr and JSString-    return [0, raw.target.value];-}+function js_createClass(obj) {+  // Constructor passes through to React+  var cls = function() {+    React.Component.apply(this, arguments); // (super(props))+    // TODO(joel) necessary?+    this.dispatch = this.dispatch.bind(this);+  }; -function js_parseKeyboardEvent(raw) {-    return [-        0,-        [-            0,-            raw.altKey,-            raw.ctrlKey,-            raw.metaKey,-            raw.shiftKey,-        ],-        raw.charCode,-        raw.key,-        raw.keyCode,-        raw.locale,-        raw.location,-        raw.repeat,-        raw.which,-    ];-}+  // Copy parent prototype+  cls.prototype = Object.create(React.Component.prototype); -function js_parseMouseEvent(raw) {-    return [-        0,-        [-            0,-            raw.altKey,-            raw.ctrlKey,-            raw.metaKey,-            raw.shiftKey,-        ],-        raw.button,-        raw.clientX,-        raw.clientY,-        raw.pageX,-        raw.pageY,-        raw.screenX,-        raw.screenY,-    ];-}+  cls.prototype.render = function() {+    var gimmeResult = {};+    obj.render([this.props.componentId, this], gimmeResult);+    return gimmeResult.value;+  }; -// polyfill from http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/-(function() {-    var lastTime = 0;-    var vendors = ['webkit', 'moz'];-    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {-        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];-        window.cancelAnimationFrame =-          window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];-    }+  cls.prototype.dispatch = function(e, name) {+    cls[name].call(this, e)+  }; -    if (!window.requestAnimationFrame)-        window.requestAnimationFrame = function(callback, element) {-            var currTime = new Date().getTime();-            var timeToCall = Math.max(0, 16 - (currTime - lastTime));-            var id = window.setTimeout(function() { callback(currTime + timeToCall); },-              timeToCall);-            lastTime = currTime + timeToCall;-            return id;-        };+  cls.displayName = obj.displayName; -    if (!window.cancelAnimationFrame)-        window.cancelAnimationFrame = function(id) {-            clearTimeout(id);-        };-}());+  // Point constructor to the right place+  cls.prototype.constructor = cls; -function js_raf(cb) {-    return window.requestAnimationFrame(function(time) {-        B(A(cb,[[0,time],0]));-    });-}+  cls.prototype.componentWillMount = function() {+    obj.componentWillMount(this.props.componentId);+  }; -function js_createClass(render, setState) {-    return React.createClass({-        render: render,-    });-}+  cls.prototype.componentWillUnmount = function() {+    obj.componentWillUnmount(this.props.componentId);+  }; -function js_bezier(x0, y0, x1, y1, x) {-    return BezierEasing(x0, y0, x1, y1)(x);-}+  cls.prototype.getChildContext = function() {+    return obj.childContext+  }; -function js_render(e, r){-    React.render(e, r);-}+  // TODO this is weird - why is it not on the prototype?+  cls.childContextTypes = obj.childContextTypes; -function js_cancelRaf(id) {-    window.cancelAnimationFrame(id);+  return cls; }
react-haskell.cabal view
@@ -1,8 +1,8 @@ name:                react-haskell-version:             1.3.0.0+version:             2.0.0 synopsis:            Haskell React bindings description:-  This package provides high level bindings to Facebook's <http://facebook.github.io/react/ React> library, meant for use with <http://haste-lang.org Haste>.+  This package provides high level bindings to Facebook's <http://facebook.github.io/react/ React> library, meant for use with GHCJS.   .   React is a JavaScript library for building user interfaces. React (and React-Haskell) is focused on just UI - it's not a framework.   .@@ -23,7 +23,7 @@   >   > view :: JSString -> React Example ()   > view str = div_ [ class_ "container" ] $ do-  >     input_ [ value_ str, onChange (Just . targetValue) ]+  >     input_ [ value_ str, onChange (Just . value . target) ]   >   > main :: IO ()   > main = withElem "id" $ \elem ->@@ -40,20 +40,23 @@ bug-reports: https://github.com/joelburget/react-haskell/issues  data-dir: lib-data-files: stubs.js, bezier.js--flag haste-inst-  description: Built with haste-inst/hastec-  default: False+data-files: stubs.js, react.js  source-repository head   type: git   location: https://github.com/joelburget/react-haskell.git +flag ghcjs+    description: tell cabal we're using ghcjs+    default: True+ library-  exposed-modules: React+  exposed-modules:+    React,+    React.DOM,+    React.GHCJS,+    React.Rebindable   other-modules:-    React.Anim,     React.Attrs,     React.Class,     React.Elements,@@ -61,6 +64,8 @@     React.Imports,     React.Interpret,     React.Local,+    React.PropTypes,+    React.Registry,     React.Render,     React.Types   other-extensions:@@ -80,12 +85,14 @@     monads-tf,     deepseq,     lens-family,-    void == 0.7-  if flag(haste-inst)-    build-depends:-      haste-lib >= 0.4 && <0.6-  else+    void == 0.7,+    aeson,+    text,+    unordered-containers+  if flag(ghcjs)     build-depends:-      haste-compiler+      ghcjs-base >= 0.1,+      ghcjs-prim >= 0.1.0.0,+      ghcjs-dom >= 0.1   hs-source-dirs:      src   default-language:    Haskell2010
src/React.hs view
@@ -1,4 +1,4 @@--- |+ -- Module      :  React -- Copyright   :  (C) 2014-15 Joel Burget -- License     :  MIT@@ -6,38 +6,38 @@ -- Stability   :  experimental -- Portability :  non-portable module React-    ( module X+    (+    -- * Classes+      ReactClass()+    , ClassConfig(..)+    , smartClass+    , dumbClass -    -- React.Anim-    , Color(..)-    , getAnimationState-    , Animatable(..) -- XXX+    -- * Rendering+    , render+    , debugRender -    -- React.Class-    , ReactClass()-    , createClass+    -- * React Nodes+    , ReactNode -    -- React.Local-    , locally-    , Narrowing(..)+    -- * Events+    , module React.Events -    -- React.Render-    , cancelRender-    , render+    -- * Local+    , module React.Local -    -- React.Types-    , ReactT(..)-    , React-    , ReactKey(AnimationState, ClassState, Signal)-    , RenderHandle(..)-    , AnimConfig(..)-    , Easing(..)-    , EventProperties(..)-    , ModifierKeys(..)-    , MouseEvent(..)-    , KeyboardEvent(..)-    , ChangeEvent(..)-    , FocusEvent(..)+    -- XXX(joel)+    , AttrOrHandler()++    -- TODO - create React.Internal module for these?+    -- * Attributes+    , module React.Attrs++    -- * Creating Elements+    , module React.Elements++    -- * JS Interop+    , ImportedClass     ) where  -- TODO@@ -45,14 +45,13 @@ -- store elem in monad -- escaping / dangerouslySetInnerHTML -import React.Anim import React.Class--- import React.Imports--- import React.Interpret+import React.Imports import React.Local import React.Render import React.Types -import React.Attrs as X-import React.Elements as X-import React.Events as X+import React.Attrs+import React.Elements+import React.Events+import React.Rebindable
− src/React/Anim.hs
@@ -1,180 +0,0 @@-{-# LANGUAGE OverloadedStrings, FlexibleInstances, MultiWayIf,-  FlexibleContexts #-}-module React.Anim where--import Control.Applicative-import Data.IORef-import Data.Monoid--import Haste-import Lens.Family2--import React.Imports-import React.Types----- TODO support delays---- TODO look at velocity---- TODO also `Floating (Scalar v)` ?---      Double ~ Scalar v?--- TODO common pattern:---      from .+^ (?? *^ (to .-. from))-{--easingFunc :: (AffineSpace p, v ~ Diff p, VectorSpace v)-           => Easing -> a -> a -> Double -> a-easingFunc Linear from to t = from .+^ (t *^ (to .-. from))--- easingFunc Linear from to t = alerp from to t-easingFunc EaseInQuad from to t = from .+^ ((t*t) *^ (to .-. from))-easingFunc _ _ _ _ = error "that easing function has not been defined yet"--}--instance Animatable Double where-    interpolate ease from to t =-        if | t <= 0 -> from-           | t >= 1 -> to-           | otherwise -> from + easeDouble ease t * (to - from)-    animAdd = (+)-    animSub = (-)-    animZero = 0---- I think this could become Functor if we limit `to` to `animZero`--- instance (Applicative f, Animatable a) => Animatable (f a) where---     interpolate ease from to t = interpolate ease <$> from <*> to <*> pure t---     animAdd = liftA2 animAdd---     animZero = pure animZero---- TODO use generics for all tuple instances-instance Animatable () where-    interpolate _ _ _ _ = ()-    animAdd _ _ = ()-    animSub _ _ = ()-    animZero = ()--instance (Animatable a, Animatable b) => Animatable (a, b) where-    interpolate ease (x0, y0) (x1, y1) t =-        (interpolate ease x0 x1 t, interpolate ease y0 y1 t)-    animAdd (x0, y0) (x1, y1) = (x0 `animAdd` x1, y0 `animAdd` y1)-    animSub (x0, y0) (x1, y1) = (x0 `animSub` x1, y0 `animSub` y1)-    animZero = (animZero, animZero)--instance (Animatable a, Animatable b, Animatable c) => Animatable (a, b, c) where-    interpolate ease (x0, y0, z0) (x1, y1, z1) t =-        (interpolate ease x0 x1 t,-         interpolate ease y0 y1 t,-         interpolate ease z0 z1 t)-    animAdd (x0, y0, z0) (x1, y1, z1) =-        (x0 `animAdd` x1,-         y0 `animAdd` y1,-         z0 `animAdd` z1)-    animSub (x0, y0, z0) (x1, y1, z1) =-        (x0 `animSub` x1,-         y0 `animSub` y1,-         z0 `animSub` z1)-    animZero = (animZero, animZero, animZero)---- TODO use color package--- | 24-bit colors which can be interpolated.-data Color = Color Int Int Int--instance Animatable Color where-    interpolate ease c1@(Color r0 g0 b0) c2@(Color r1 g1 b1) t =-        let t' = interpolate ease 0 1 t-        in Color (intLerp r0 r1 t') (intLerp g0 g1 t') (intLerp b0 b1 t')-    animAdd (Color r0 g0 b0) (Color r1 g1 b1) =-        Color (r0 + r1) (g0 + g1) (b0 + b1)-    animSub (Color r0 g0 b0) (Color r1 g1 b1) =-        Color (r0 - r1) (g0 - g1) (b0 - b1)-    animZero = (Color 0 0 0)--instance Show Color where-    show (Color r g b) = "rgb" ++ show (r, g, b)--easeInPow :: Int -> Double -> Double-easeInPow pow t = t ^^ pow--easeOutPow :: Int -> Double -> Double-easeOutPow pow t = 1 - easeInPow pow (1 - t)--easeInOutPow :: Int -> Double -> Double-easeInOutPow pow t = if t < 0.5-   then easeInPow pow (t * 2) / 2-   else 1 - easeInPow pow ((1 - t) * 2) / 2--elastic :: Double -> Double-elastic t =-    let p = 0.3-        powFactor = 2 ** (-10 * t)-        sinFactor = sin $ (t - p / 4) * (2 * pi / p)-    in powFactor * sinFactor + 1--easeDouble :: Easing -> Double -> Double-easeDouble Linear t = t--easeDouble EaseInQuad t    = easeInPow 2 t-easeDouble EaseOutQuad t   = easeOutPow 2 t-easeDouble EaseInOutQuad t = easeInOutPow 2 t--easeDouble EaseInCubic t    = easeInPow 3 t-easeDouble EaseOutCubic t   = easeOutPow 3 t-easeDouble EaseInOutCubic t = easeInOutPow 3 t--easeDouble EaseInQuart t    = easeInPow 4 t-easeDouble EaseOutQuart t   = easeOutPow 4 t-easeDouble EaseInOutQuart t = easeInOutPow 4 t--easeDouble EaseInQuint t    = easeInPow 5 t-easeDouble EaseOutQuint t   = easeOutPow 5 t-easeDouble EaseInOutQuint t = easeInOutPow 5 t--easeDouble EaseInBounce t = easeDouble EaseOutBounce (1 - t)-easeDouble EaseOutBounce t = let c = 7.5625 in-    if | t < (1 / 2.75) -> c * t * t-       | t < (2 / 2.75) -> let t' = t - (1.5 / 2.75) in c * t' * t' + 0.75-       | t < (2.5 / 2.75) -> let t' = t - (2.25 / 2.75) in c * t' * t' + 0.9375-       | otherwise -> let t' = t - (2.625 / 2.75) in c * t' * t' + 0.984375---- TODO fix-easeDouble EaseInOutBounce t =-    if t < 0.5-        then easeDouble EaseInBounce (t * 2) / 2-        else 1 - easeDouble EaseOutBounce ((1 - t) * 2) / 2--easeDouble EaseInElastic t = 1 - elastic (1 - t)-easeDouble EaseOutElastic t = elastic t---- TODO fix-easeDouble EaseInOutElastic t =-    if t < 0.5-       then elastic (t * 2) / 2-       else 1 - elastic ((1 - t) * 2) / 2--easeDouble (EaseBezier x0 y0 x1 y1) t = js_bezier x0 y0 x1 y1 t---- some magic numbers i found on the internet-easeDouble EaseInSine t = js_bezier 0.47 0 0.745 0.715 t-easeDouble EaseOutSine t = js_bezier 0.39 0.575 0.565 1 t--getAnimationState :: Monad m => ReactT ty m (AnimationState ty)-getAnimationState = ReactT $ \anim -> return ([], anim)--stepRunningAnims :: AnimationState ty -> [(RunningAnim ty, Double)] -> AnimationState ty-stepRunningAnims anim running =-    let start = foldr-            ( \(RunningAnim AnimConfig{lens=lens} _, _) anim' ->-                anim' & lens .~ animZero-            )-            anim running-    in foldr-        ( \(RunningAnim (AnimConfig _ (from, to) lens easing _) _, progress)-           anim' ->-            anim' & lens %~ (`animAdd` interpolate easing from to progress)-        ) start running--lerp :: Double -> RunningAnim ty -> Double-lerp time (RunningAnim (AnimConfig duration _ _ _ _) begin) =-    (time - begin) / duration--intLerp :: Int -> Int -> Double -> Int-intLerp a b t = floor $ (fromIntegral a) + (fromIntegral $ b - a) * t
src/React/Attrs.hs view
@@ -1,87 +1,113 @@ {-# LANGUAGE OverloadedStrings #-} module React.Attrs where +import qualified Data.Aeson as Aeson+import Data.Text (Text)++import React.GHCJS import React.Types -import Haste.JSON-import Haste.Prim -class_ :: JSString -> AttrOrHandler signal-class_ = mkStaticAttr "className" Str+-- | When importing a foreign class you must specify the props it takes. In the+-- common case where it takes no props, only handles layout, it's convenient to+-- specify the type of props as 'NoProps'.+--+-- Example:+--+--     pageLayout_ :: ReactNode () -> ReactNode ()+--     pageLayout_ = importParentClass pageLayout noProps+newtype NoProps = NoProps () -href_ :: JSString -> AttrOrHandler signal-href_ = mkStaticAttr "href" Str -id_ :: JSString -> AttrOrHandler signal-id_ = mkStaticAttr "id" Str+-- | Used when importing a foreign class taking no props. See above example.+noProps :: NoProps+noProps = NoProps () -src_ :: JSString -> AttrOrHandler signal-src_ = mkStaticAttr "src" Str -style_ :: JSON -> AttrOrHandler signal-style_ = mkStaticAttr "style" id+instance ToJSRef NoProps where+    toJSRef _ = newObj -value_ :: JSString -> AttrOrHandler signal-value_ = mkStaticAttr "value" Str -placeholder_ :: JSString -> AttrOrHandler signal-placeholder_ = mkStaticAttr "placeholder" Str+mkStaticAttr :: Aeson.ToJSON a => Text -> a -> AttrOrHandler sig+mkStaticAttr name = StaticAttr name . Aeson.toJSON -for_ :: JSString -> AttrOrHandler signal-for_ = mkStaticAttr "htmlFor" Str -type_ :: JSString -> AttrOrHandler signal-type_ = mkStaticAttr "type" Str+key_ :: Text -> AttrOrHandler sig+key_ = mkStaticAttr "key" -checked_ :: Bool -> AttrOrHandler signal-checked_ = mkStaticAttr "checked" Bool+class_ :: Text -> AttrOrHandler sig+class_ = mkStaticAttr "className" -autofocus_ :: Bool -> AttrOrHandler signal-autofocus_ = mkStaticAttr "autoFocus" Bool+href_ :: Text -> AttrOrHandler sig+href_ = mkStaticAttr "href" -width_ :: Double -> AttrOrHandler signal-width_ = mkStaticAttr "width" Num+id_ :: Text -> AttrOrHandler sig+id_ = mkStaticAttr "id" -height_ :: Double -> AttrOrHandler signal-height_ = mkStaticAttr "height" Num+src_ :: Text -> AttrOrHandler sig+src_ = mkStaticAttr "src" +value_ :: Text -> AttrOrHandler sig+value_ = mkStaticAttr "value"++placeholder_ :: Text -> AttrOrHandler sig+placeholder_ = mkStaticAttr "placeholder"++for_ :: Text -> AttrOrHandler sig+for_ = mkStaticAttr "htmlFor"++type_ :: Text -> AttrOrHandler sig+type_ = mkStaticAttr "type"++checked_ :: Bool -> AttrOrHandler sig+checked_ = mkStaticAttr "checked"++autofocus_ :: Bool -> AttrOrHandler sig+autofocus_ = mkStaticAttr "autoFocus"++width_ :: Double -> AttrOrHandler sig+width_ = mkStaticAttr "width"++height_ :: Double -> AttrOrHandler sig+height_ = mkStaticAttr "height"+ -- svg! -cx_ :: Double -> AttrOrHandler signal-cx_ = mkStaticAttr "cx" Num+cx_ :: Double -> AttrOrHandler sig+cx_ = mkStaticAttr "cx" -cy_ :: Double -> AttrOrHandler signal-cy_ = mkStaticAttr "cy" Num+cy_ :: Double -> AttrOrHandler sig+cy_ = mkStaticAttr "cy" -d_ :: Double -> AttrOrHandler signal-d_ = mkStaticAttr "d" Num+d_ :: Double -> AttrOrHandler sig+d_ = mkStaticAttr "d" -dx_ :: Double -> AttrOrHandler signal-dx_ = mkStaticAttr "dx" Num+dx_ :: Double -> AttrOrHandler sig+dx_ = mkStaticAttr "dx" -dy_ :: Double -> AttrOrHandler signal-dy_ = mkStaticAttr "dy" Num+dy_ :: Double -> AttrOrHandler sig+dy_ = mkStaticAttr "dy" -x_ :: Double -> AttrOrHandler signal-x_ = mkStaticAttr "x" Num+x_ :: Double -> AttrOrHandler sig+x_ = mkStaticAttr "x" -y_ :: Double -> AttrOrHandler signal-y_ = mkStaticAttr "y" Num+y_ :: Double -> AttrOrHandler sig+y_ = mkStaticAttr "y" -r_ :: Double -> AttrOrHandler signal-r_ = mkStaticAttr "r" Num+r_ :: Double -> AttrOrHandler sig+r_ = mkStaticAttr "r" -fill_ :: JSString -> AttrOrHandler signal-fill_ = mkStaticAttr "fill" Str+fill_ :: Text -> AttrOrHandler sig+fill_ = mkStaticAttr "fill" -viewBox_ :: JSString -> AttrOrHandler signal-viewBox_ = mkStaticAttr "viewBox" Str+viewBox_ :: Text -> AttrOrHandler sig+viewBox_ = mkStaticAttr "viewBox" -points_ :: JSString -> AttrOrHandler signal-points_ = mkStaticAttr "points" Str+points_ :: Text -> AttrOrHandler sig+points_ = mkStaticAttr "points" -transform_ :: JSString -> AttrOrHandler signal-transform_ = mkStaticAttr "transform" Str+transform_ :: Text -> AttrOrHandler sig+transform_ = mkStaticAttr "transform"  -- fillOpacity fontFamily fontSize fx fy gradientTransform -- gradientUnits markerEnd markerMid markerStart offset opacity
src/React/Class.hs view
@@ -1,61 +1,175 @@-{-# LANGUAGE NamedFieldPuns, OverloadedStrings #-}+{-# LANGUAGE NamedFieldPuns, OverloadedStrings, DataKinds,+    ExistentialQuantification, ConstraintKinds #-} module React.Class     ( ReactClass(..)+    , ClassConfig(..)+    , ClassCtx+    , PropRequired(..)+    , PropType(..)     , createClass+    , smartClass+    , dumbClass     ) where ++import Control.Applicative+import Control.Monad+import qualified Data.Aeson as Aeson+import qualified Data.HashMap.Strict as H import Data.IORef+import Data.Maybe+import Data.Text (Text)+import System.IO.Unsafe -import React.Anim+import React.GHCJS import React.Imports+import React.Interpret+import React.PropTypes+import React.Registry import React.Types -import Haste-import Haste.JSON-import Haste.Prim +-- TODO think about whether this could be a monoid or something+data ClassConfig props state insig exsig ctx = ClassConfig+    { renderFn :: props -> state -> ReactNode insig+    , initialState :: state+    , name :: JSString+    , transition :: (state, insig) -> (state, Maybe exsig)+    , startupSignals :: [insig] --- | A 'ReactClass' is a standalone component of a user interface which--- contains the state necessary to render and animate itself. Classes are--- a tool for scoping.------ Use 'createClass' to construct.-data ReactClass ty = ReactClass-    { classRender :: ClassState ty -> React ty ()-    , classTransition :: ClassState ty-                      -> Signal ty-                      -> (ClassState ty, [AnimConfig ty])+    -- lifecycle methods!+    -- TODO(joel) - Lifcycle monad! -    , foreignClass :: ForeignClass+--     , componentWillMount :: props -> state -> IO state+--     , componentDidMount+--     , componentWillReceiveProps+--     , shouldComponentUpdate+--     , componentWillUpdate+--     , componentDidUpdate+--     , componentWillUnmount -    , stateRef :: IORef (ClassState ty)-    , animRef :: IORef (AnimationState ty)-    , runningAnimRef :: IORef [RunningAnim ty]-    , transitionRef :: IORef [Signal ty]+    -- TODO(joel) - this is static for now - should it be dynamic? and what+    -- does that dynamic implementation have access to?+    , childContext :: Maybe (H.HashMap Text ctx)     }  --- | 'ReactClass' smart contstructor.-createClass :: (ClassState ty -> React ty ()) -- ^ render function-            -> (ClassState ty -> Signal ty -> (ClassState ty, [AnimConfig ty]))-            -- ^ transition function-            -> ClassState ty -- ^ initial state-            -> AnimationState ty -- ^ initial animation state-            -> [Signal ty] -- signals to send on startup-            -> IO (ReactClass ty)-createClass render transition initialState initialAnim initialTrans = do-    foreignClass <- js_createClass $ toPtr render+dumbClass :: ClassConfig props () sig sig JSString+dumbClass = ClassConfig+    { name = "Anonymous Stateless Class"+    , renderFn = \_ _ -> "give this class a `render`!"+    , initialState = ()+    , transition = \(state, sig) -> (state, Just sig)+    , startupSignals = []+    , childContext = Nothing+    } -    stateRef <- newIORef initialState-    animRef <- newIORef initialAnim-    runningAnimRef <- newIORef []-    transitionRef <- newIORef initialTrans -    return $ ReactClass-        render-        transition-        foreignClass-        stateRef-        animRef-        runningAnimRef-        transitionRef+smartClass :: ClassConfig props state insig exsig JSString+smartClass = ClassConfig+    { name = "Anonymous Stateful Class"+    , renderFn = \_ _ -> "give this class a `render`!"+    , initialState = error "must define `initialState`!"+    , transition = error "must define `transition`!"+    , startupSignals = []+    , childContext = Nothing+    }+++willMount :: ClassRegistry props state insig exsig -> state -> JSRef Int -> IO ()+willMount registry state idRef = do+    -- initialize state in registry+    Just componentId <- fromJSRef idRef+    setState registry state componentId+++willUnmount :: ClassRegistry props state insig exsig -> JSRef Int -> IO ()+willUnmount registry idRef = do+    -- remove state from registry+    Just componentId <- fromJSRef idRef+    deallocRegistry registry componentId+++type ClassCtx a = (ToJSRef a, PropTypable a)+++-- TODO(joel) why not just pass in the class config?+render :: ClassRegistry props state insig exsig+       -> (props -> state -> ReactNode insig)+       -> JSRef (Int, JSAny)+       -> JSAny+       -> IO ()+render registry renderFn inRefs returnObj = do+    -- The fundamental tension here is that this render function is+    -- defined for the class, but each invocation needs access to a+    -- specific instance. How do we get a handle to that specific+    -- instance? This will give us the props and state (and+    -- handler?)++    Just (componentId, thisObj) <- fromJSRef inRefs+    RegistryStuff thisProps thisState thisHandler <-+        lookupRegistry registry componentId++    let rendered = renderFn thisProps thisState++        -- We need to forceUpdate here because we have access to `this`. But+        -- the registered handler does most of the work.+        handler sig = do+            js_forceUpdate thisObj+            thisHandler sig+    ret <- reactNodeToJSAny handler componentId rendered+    setProp ("value" :: JSString) ret returnObj+++createClass :: ClassCtx ctx+            => ClassConfig props state insig exsig ctx+            -> ReactClass props state insig exsig ctx+createClass ClassConfig{renderFn,+                        initialState,+                        name,+                        transition,+                        startupSignals,+                        childContext} =++    -- TODO(joel) - verify this use of unsafePerformIO is, well, safe+    let classRegistry = unsafePerformIO $ ClassRegistry+            <$> newIORef H.empty+            <*> newIORef 0++        foreignObj = do+            obj <- newObj++            setProp ("displayName" :: JSString) name obj++            renderCb <- syncCallback2 NeverRetain True+                (render classRegistry renderFn)+            setProp ("render" :: JSString) renderCb obj++            when (isJust childContext) $ do+                let childContext' = fromJust childContext++                ctxObj <- newObj+                ctxTypeObj <- newObj+                forM_ (H.toList childContext') $ \(k, v) -> do+                    ref <- toJSRef v+                    setProp k ref ctxObj++                    let ty = toJsPropType (propType v)+                    setProp k ty ctxTypeObj++                setProp' "childContext" ctxObj obj+                setProp' "childContextTypes" ctxTypeObj obj++            willMountCb <- syncCallback1 NeverRetain True+                (willMount classRegistry initialState)+            setProp ("componentWillMount" :: JSString) willMountCb obj++            willUnmountCb <- syncCallback1 NeverRetain True+                (willUnmount classRegistry)+            setProp ("componentWillUnmount" :: JSString) willUnmountCb obj++            return obj++        foreignClass = unsafePerformIO $ js_createClass <$> foreignObj++    in ReactClass foreignClass transition classRegistry
+ src/React/DOM.hs view
@@ -0,0 +1,415 @@+{-# LANGUAGE OverloadedStrings #-}+module React.DOM where++import Data.Monoid+import Data.Text (Text)++import React.Elements+import React.GHCJS+import React.Imports+import React.Types+++-- | Parent nodes always take a list of arguments and children.+-- @+-- span_ [class_ "example"] $ ... children ...+-- @+domParent :: JSString+          -> [AttrOrHandler sig]+          -> ReactNode sig+          -> ReactNode sig+domParent name attrs children =+    DomElement (ReactDOMElement name attrs children Nothing Nothing)+++domLeaf :: JSString+        -> [AttrOrHandler sig]+        -> ReactNode sig+domLeaf name attrs =+    DomElement (ReactDOMElement name attrs mempty Nothing Nothing)+++-- -- TODO ToJSString a => ?+-- -- Would this just be annoyingly ambiguous?+text_ :: Text -> ReactNode sig+text_ = NodeText++textarea_ :: [AttrOrHandler sig] -> Text -> ReactNode sig+textarea_ attrs str = domParent "textarea" attrs (text_ str)++-- TODO generate these automatically+a_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+a_ = domParent "a"++abbr_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+abbr_ = domParent "abbr"++address_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+address_ = domParent "address"++article_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+article_ = domParent "article"++aside_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+aside_ = domParent "aside"++audio_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+audio_ = domParent "audio"++b_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+b_ = domParent "b"++bdi_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+bdi_ = domParent "bdi"++bdo_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+bdo_ = domParent "bdo"++big_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+big_ = domParent "big"++blockquote_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+blockquote_ = domParent "blockquote"++body_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+body_ = domParent "body"++button_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+button_ = domParent "button"++canvas_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+canvas_ = domParent "canvas"++caption_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+caption_ = domParent "caption"++cite_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+cite_ = domParent "cite"++code_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+code_ = domParent "code"++colgroup_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+colgroup_ = domParent "colgroup"++data_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+data_ = domParent "data"++datalist_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+datalist_ = domParent "datalist"++dd_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+dd_ = domParent "dd"++del_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+del_ = domParent "del"++details_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+details_ = domParent "details"++dfn_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+dfn_ = domParent "dfn"++div_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+div_ = domParent "div"++dl_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+dl_ = domParent "dl"++dt_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+dt_ = domParent "dt"++em_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+em_ = domParent "em"++fieldset_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+fieldset_ = domParent "fieldset"++figcaption_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+figcaption_ = domParent "figcaption"++figure_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+figure_ = domParent "figure"++footer_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+footer_ = domParent "footer"++form_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+form_ = domParent "form"++h1_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+h1_ = domParent "h1"++h2_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+h2_ = domParent "h2"++h3_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+h3_ = domParent "h3"++h4_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+h4_ = domParent "h4"++h5_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+h5_ = domParent "h5"++h6_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+h6_ = domParent "h6"++head_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+head_ = domParent "head"++header_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+header_ = domParent "header"++html_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+html_ = domParent "html"++i_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+i_ = domParent "i"++iframe_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+iframe_ = domParent "iframe"++ins_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+ins_ = domParent "ins"++kbd_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+kbd_ = domParent "kbd"++label_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+label_ = domParent "label"++legend_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+legend_ = domParent "legend"++li_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+li_ = domParent "li"++main_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+main_ = domParent "main"++map_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+map_ = domParent "map"++mark_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+mark_ = domParent "mark"++menu_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+menu_ = domParent "menu"++menuitem_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+menuitem_ = domParent "menuitem"++meter_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+meter_ = domParent "meter"++nav_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+nav_ = domParent "nav"++noscript_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+noscript_ = domParent "noscript"++object_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+object_ = domParent "object"++ol_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+ol_ = domParent "ol"++optgroup_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+optgroup_ = domParent "optgroup"++option_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+option_ = domParent "option"++output_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+output_ = domParent "output"++p_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+p_ = domParent "p"++pre_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+pre_ = domParent "pre"++progress_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+progress_ = domParent "progress"++q_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+q_ = domParent "q"++rp_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+rp_ = domParent "rp"++rt_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+rt_ = domParent "rt"++ruby_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+ruby_ = domParent "ruby"++s_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+s_ = domParent "signal"++samp_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+samp_ = domParent "samp"++section_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+section_ = domParent "section"++select_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+select_ = domParent "select"++small_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+small_ = domParent "small"++span_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+span_ = domParent "span"++strong_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+strong_ = domParent "strong"++sub_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+sub_ = domParent "sub"++summary_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+summary_ = domParent "summary"++sup_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+sup_ = domParent "sup"++table_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+table_ = domParent "table"++tbody_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+tbody_ = domParent "tbody"++td_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+td_ = domParent "td"++tfoot_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+tfoot_ = domParent "tfoot"++th_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+th_ = domParent "th"++thead_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+thead_ = domParent "thead"++time_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+time_ = domParent "time"++tr_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+tr_ = domParent "tr"++u_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+u_ = domParent "u"++ul_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+ul_ = domParent "ul"++var_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+var_ = domParent "var"++video_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+video_ = domParent "video"+++area_ :: [AttrOrHandler sig] -> ReactNode sig+area_ = domLeaf "area"++base_ :: [AttrOrHandler sig] -> ReactNode sig+base_ = domLeaf "base"++br_ :: [AttrOrHandler sig] -> ReactNode sig+br_ = domLeaf "br"++col_ :: [AttrOrHandler sig] -> ReactNode sig+col_ = domLeaf "col"++embed_ :: [AttrOrHandler sig] -> ReactNode sig+embed_ = domLeaf "embed"++hr_ :: [AttrOrHandler sig] -> ReactNode sig+hr_ = domLeaf "hr"++img_ :: [AttrOrHandler sig] -> ReactNode sig+img_ = domLeaf "img"++input_ :: [AttrOrHandler sig] -> ReactNode sig+input_ = domLeaf "input"++keygen_ :: [AttrOrHandler sig] -> ReactNode sig+keygen_ = domLeaf "keygen"++link_ :: [AttrOrHandler sig] -> ReactNode sig+link_ = domLeaf "link"++meta_ :: [AttrOrHandler sig] -> ReactNode sig+meta_ = domLeaf "meta"++param_ :: [AttrOrHandler sig] -> ReactNode sig+param_ = domLeaf "param"++source_ :: [AttrOrHandler sig] -> ReactNode sig+source_ = domLeaf "source"++track_ :: [AttrOrHandler sig] -> ReactNode sig+track_ = domLeaf "track"++wbr_ :: [AttrOrHandler sig] -> ReactNode sig+wbr_ = domLeaf "wbr"++-- script :: RawAttrs -> JSString -> IO ForeignNode+-- style :: RawAttrs -> JSString -> IO ForeignNode+-- title :: RawAttrs -> JSString -> IO ForeignNode++-- svg!++svg_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+svg_ = domParent "svg"++defs_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+defs_ = domParent "defs"++g_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+g_ = domParent "g"++linearGradient_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+linearGradient_ = domParent "linearGradient"++mask_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+mask_ = domParent "mask"++pattern_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+pattern_ = domParent "pattern"++radialGradient_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+radialGradient_ = domParent "radialGradient"++stop_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+stop_ = domParent "stop"++-- text_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+-- text_ = domParent "text"++tspan_ :: [AttrOrHandler sig] -> ReactNode sig -> ReactNode sig+tspan_ = domParent "tspan"++circle_ :: [AttrOrHandler sig] -> ReactNode sig+circle_ = domLeaf "circle"++ellipse_ :: [AttrOrHandler sig] -> ReactNode sig+ellipse_ = domLeaf "ellipse"++line_ :: [AttrOrHandler sig] -> ReactNode sig+line_ = domLeaf "line"++path_ :: [AttrOrHandler sig] -> ReactNode sig+path_ = domLeaf "path"++polygon_ :: [AttrOrHandler sig] -> ReactNode sig+polygon_ = domLeaf "polygon"++polyline_ :: [AttrOrHandler sig] -> ReactNode sig+polyline_ = domLeaf "polyline"++rect_ :: [AttrOrHandler sig] -> ReactNode sig+rect_ = domLeaf "rect"
src/React/Elements.hs view
@@ -1,283 +1,112 @@-{-# LANGUAGE OverloadedStrings, TypeFamilies #-}-module React.Elements where+{-# LANGUAGE OverloadedStrings, FlexibleInstances, DataKinds,+    ConstraintKinds #-}+-- TODO(joel) rename to React.DOM?+module React.Elements+    (+    -- * Class creation+      classParent+    , classLeaf -import Haste.Prim+    -- * JS Interop+    , exportClassLeaf+    -- , exportNode+    , importLeafClass+    , importParentClass +    , ExportedNode+    , ExportedClass+    ) where++import Control.Applicative+import Data.Aeson as Aeson+import qualified Data.HashMap.Strict as H+import Data.IORef+import Data.Monoid+import Data.String+import Data.Void+import System.IO.Unsafe++import React.Class+import React.GHCJS+import React.Imports+import React.Interpret+import React.Registry import React.Types -import Prelude hiding (div, span) -text_ :: JSString -> React ty ()-text_ str = ReactT $ \_ -> return ([Text (fromJSStr str)], ())+classParent' :: ReactClass props state insig exsig ctx+             -> ReactNode insig+             -> props+             -> ReactNode exsig+classParent' cls children props = ComponentElement+    (ReactComponentElement cls children Nothing Nothing props) -a_ :: TermParent t => TermParentArg t -> t-a_ = termParent "a"-abbr_ :: TermParent t => TermParentArg t -> t-abbr_ = termParent "abbr"-address_ :: TermParent t => TermParentArg t -> t-address_ = termParent "address"-article_ :: TermParent t => TermParentArg t -> t-article_ = termParent "article"-aside_ :: TermParent t => TermParentArg t -> t-aside_ = termParent "aside"-audio_ :: TermParent t => TermParentArg t -> t-audio_ = termParent "audio"-b_ :: TermParent t => TermParentArg t -> t-b_ = termParent "b"-bdi_ :: TermParent t => TermParentArg t -> t-bdi_ = termParent "bdi"-bdo_ :: TermParent t => TermParentArg t -> t-bdo_ = termParent "bdo"-big_ :: TermParent t => TermParentArg t -> t-big_ = termParent "big"-blockquote_ :: TermParent t => TermParentArg t -> t-blockquote_ = termParent "blockquote"-body_ :: TermParent t => TermParentArg t -> t-body_ = termParent "body"-button_ :: TermParent t => TermParentArg t -> t-button_ = termParent "button"-canvas_ :: TermParent t => TermParentArg t -> t-canvas_ = termParent "canvas"-caption_ :: TermParent t => TermParentArg t -> t-caption_ = termParent "caption"-cite_ :: TermParent t => TermParentArg t -> t-cite_ = termParent "cite"-code_ :: TermParent t => TermParentArg t -> t-code_ = termParent "code"-colgroup_ :: TermParent t => TermParentArg t -> t-colgroup_ = termParent "colgroup"-data_ :: TermParent t => TermParentArg t -> t-data_ = termParent "data"-datalist_ :: TermParent t => TermParentArg t -> t-datalist_ = termParent "datalist"-dd_ :: TermParent t => TermParentArg t -> t-dd_ = termParent "dd"-del_ :: TermParent t => TermParentArg t -> t-del_ = termParent "del"-details_ :: TermParent t => TermParentArg t -> t-details_ = termParent "details"-dfn_ :: TermParent t => TermParentArg t -> t-dfn_ = termParent "dfn"-div_ :: TermParent t => TermParentArg t -> t-div_ = termParent "div"-dl_ :: TermParent t => TermParentArg t -> t-dl_ = termParent "dl"-dt_ :: TermParent t => TermParentArg t -> t-dt_ = termParent "dt"-em_ :: TermParent t => TermParentArg t -> t-em_ = termParent "em"-fieldset_ :: TermParent t => TermParentArg t -> t-fieldset_ = termParent "fieldset"-figcaption_ :: TermParent t => TermParentArg t -> t-figcaption_ = termParent "figcaption"-figure_ :: TermParent t => TermParentArg t -> t-figure_ = termParent "figure"-footer_ :: TermParent t => TermParentArg t -> t-footer_ = termParent "footer"-form_ :: TermParent t => TermParentArg t -> t-form_ = termParent "form"-h1_ :: TermParent t => TermParentArg t -> t-h1_ = termParent "h1"-h2_ :: TermParent t => TermParentArg t -> t-h2_ = termParent "h2"-h3_ :: TermParent t => TermParentArg t -> t-h3_ = termParent "h3"-h4_ :: TermParent t => TermParentArg t -> t-h4_ = termParent "h4"-h5_ :: TermParent t => TermParentArg t -> t-h5_ = termParent "h5"-h6_ :: TermParent t => TermParentArg t -> t-h6_ = termParent "h6"-head_ :: TermParent t => TermParentArg t -> t-head_ = termParent "head"-header_ :: TermParent t => TermParentArg t -> t-header_ = termParent "header"-html_ :: TermParent t => TermParentArg t -> t-html_ = termParent "html"-i_ :: TermParent t => TermParentArg t -> t-i_ = termParent "i"-iframe_ :: TermParent t => TermParentArg t -> t-iframe_ = termParent "iframe"-ins_ :: TermParent t => TermParentArg t -> t-ins_ = termParent "ins"-kbd_ :: TermParent t => TermParentArg t -> t-kbd_ = termParent "kbd"-label_ :: TermParent t => TermParentArg t -> t-label_ = termParent "label"-legend_ :: TermParent t => TermParentArg t -> t-legend_ = termParent "legend"-li_ :: TermParent t => TermParentArg t -> t-li_ = termParent "li"-main_ :: TermParent t => TermParentArg t -> t-main_ = termParent "main"-map_ :: TermParent t => TermParentArg t -> t-map_ = termParent "map"-mark_ :: TermParent t => TermParentArg t -> t-mark_ = termParent "mark"-menu_ :: TermParent t => TermParentArg t -> t-menu_ = termParent "menu"-menuitem_ :: TermParent t => TermParentArg t -> t-menuitem_ = termParent "menuitem"-meter_ :: TermParent t => TermParentArg t -> t-meter_ = termParent "meter"-nav_ :: TermParent t => TermParentArg t -> t-nav_ = termParent "nav"-noscript_ :: TermParent t => TermParentArg t -> t-noscript_ = termParent "noscript"-object_ :: TermParent t => TermParentArg t -> t-object_ = termParent "object"-ol_ :: TermParent t => TermParentArg t -> t-ol_ = termParent "ol"-optgroup_ :: TermParent t => TermParentArg t -> t-optgroup_ = termParent "optgroup"-option_ :: TermParent t => TermParentArg t -> t-option_ = termParent "option"-output_ :: TermParent t => TermParentArg t -> t-output_ = termParent "output"-p_ :: TermParent t => TermParentArg t -> t-p_ = termParent "p"-pre_ :: TermParent t => TermParentArg t -> t-pre_ = termParent "pre"-progress_ :: TermParent t => TermParentArg t -> t-progress_ = termParent "progress"-q_ :: TermParent t => TermParentArg t -> t-q_ = termParent "q"-rp_ :: TermParent t => TermParentArg t -> t-rp_ = termParent "rp"-rt_ :: TermParent t => TermParentArg t -> t-rt_ = termParent "rt"-ruby_ :: TermParent t => TermParentArg t -> t-ruby_ = termParent "ruby"-s_ :: TermParent t => TermParentArg t -> t-s_ = termParent "signal"-samp_ :: TermParent t => TermParentArg t -> t-samp_ = termParent "samp"-section_ :: TermParent t => TermParentArg t -> t-section_ = termParent "section"-select_ :: TermParent t => TermParentArg t -> t-select_ = termParent "select"-small_ :: TermParent t => TermParentArg t -> t-small_ = termParent "small"-span_ :: TermParent t => TermParentArg t -> t-span_ = termParent "span"-strong_ :: TermParent t => TermParentArg t -> t-strong_ = termParent "strong"-sub_ :: TermParent t => TermParentArg t -> t-sub_ = termParent "sub"-summary_ :: TermParent t => TermParentArg t -> t-summary_ = termParent "summary"-sup_ :: TermParent t => TermParentArg t -> t-sup_ = termParent "sup"-table_ :: TermParent t => TermParentArg t -> t-table_ = termParent "table"-tbody_ :: TermParent t => TermParentArg t -> t-tbody_ = termParent "tbody"-td_ :: TermParent t => TermParentArg t -> t-td_ = termParent "td"-tfoot_ :: TermParent t => TermParentArg t -> t-tfoot_ = termParent "tfoot"-th_ :: TermParent t => TermParentArg t -> t-th_ = termParent "th"-thead_ :: TermParent t => TermParentArg t -> t-thead_ = termParent "thead"-time_ :: TermParent t => TermParentArg t -> t-time_ = termParent "time"-tr_ :: TermParent t => TermParentArg t -> t-tr_ = termParent "tr"-u_ :: TermParent t => TermParentArg t -> t-u_ = termParent "u"-ul_ :: TermParent t => TermParentArg t -> t-ul_ = termParent "ul"-var_ :: TermParent t => TermParentArg t -> t-var_ = termParent "var"-video_ :: TermParent t => TermParentArg t -> t-video_ = termParent "video" -area_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-area_ = termLeaf "area"-base_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-base_ = termLeaf "base"-br_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-br_ = termLeaf "br"-col_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-col_ = termLeaf "col"-embed_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-embed_ = termLeaf "embed"-hr_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-hr_ = termLeaf "hr"-img_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-img_ = termLeaf "img"-input_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-input_ = termLeaf "input"-keygen_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-keygen_ = termLeaf "keygen"-link_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-link_ = termLeaf "link"-meta_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-meta_ = termLeaf "meta"-param_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-param_ = termLeaf "param"-source_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-source_ = termLeaf "source"-track_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-track_ = termLeaf "track"-wbr_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-wbr_ = termLeaf "wbr"+classLeaf' :: ReactClass props state insig exsig ctx+           -> props+           -> ReactNode exsig+classLeaf' cls props = ComponentElement+    (ReactComponentElement cls mempty Nothing Nothing props) --- script :: RawAttrs -> JSString -> IO ForeignNode--- style :: RawAttrs -> JSString -> IO ForeignNode--- textarea :: RawAttrs -> JSString -> IO ForeignNode--- title :: RawAttrs -> JSString -> IO ForeignNode --- svg!+classParent :: ClassCtx ctx+            => ClassConfig props state insig exsig ctx+            -> ReactNode insig+            -> props+            -> ReactNode exsig+classParent = classParent' . createClass -svg_ :: TermParent t => TermParentArg t -> t-svg_ = termParent "svg" -defs_ :: TermParent t => TermParentArg t -> t-defs_ = termParent "defs"+-- TODO refine this type to reflect that it can send back signals+classLeaf :: ClassCtx ctx+          => ClassConfig props state insig exsig ctx+          -> props+          -> ReactNode exsig+classLeaf = classLeaf' . createClass -g_ :: TermParent t => TermParentArg t -> t-g_ = termParent "g" -linearGradient_ :: TermParent t => TermParentArg t -> t-linearGradient_ = termParent "linearGradient"+data ExportedClass_+type ExportedClass = JSRef ExportedClass_ -mask_ :: TermParent t => TermParentArg t -> t-mask_ = termParent "mask"+newtype ExportedNode sig = ExportedNode (IO JSAny) -pattern_ :: TermParent t => TermParentArg t -> t-pattern_ = termParent "pattern"+instance ToJSRef (ExportedNode sig) where+    toJSRef (ExportedNode n) = castRef <$> n -radialGradient_ :: TermParent t => TermParentArg t -> t-radialGradient_ = termParent "radialGradient" -stop_ :: TermParent t => TermParentArg t -> t-stop_ = termParent "stop"+-- XXX+-- Must make sure to get componentId to this class! Currently it's in props,+-- but maybe should move...+exportClassLeaf :: ClassCtx ctx+                => ClassConfig props state insig exsig ctx+                -> ExportedClass+exportClassLeaf conf =+    castRef $ classForeign $ createClass conf --- text_ :: TermParent t => TermParentArg t -> t--- text_ = termParent "text" -tspan_ :: TermParent t => TermParentArg t -> t-tspan_ = termParent "tspan"+-- XXX+-- Must make sure to update state in JS when it changes in HS!+-- exportNode :: (sig -> IO ()) -> ReactNode sig -> ExportedNode sig+-- exportNode handler = ExportedNode . reactNodeToJSAny handler undefined -circle_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-circle_ = termLeaf "circle" -ellipse_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-ellipse_ = termLeaf "ellipse" -line_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-line_ = termLeaf "line"+-- Note: state here reflects the state managed by react-haskell, not the state+-- of the component.+-- TODO - figure out how to handle callbacks (change Void -> a) -path_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-path_ = termLeaf "path" -polygon_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-polygon_ = termLeaf "polygon"+importLeafClass :: ToJSRef props+                => ImportedClass props sig+                -> props+                -> ReactNode sig+importLeafClass elem props = ForeignClass elem props mempty -polyline_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-polyline_ = termLeaf "polyline" -rect_ :: (Monad m, sig ~ Signal ty) => [AttrOrHandler sig] -> ReactT ty m ()-rect_ = termLeaf "rect"++importParentClass :: ToJSRef props+                  => ImportedClass props sig+                  -> props+                  -> ReactNode sig+                  -> ReactNode sig+importParentClass elem props children = ForeignClass elem props children
src/React/Events.hs view
@@ -1,85 +1,201 @@-{-# LANGUAGE OverloadedStrings #-}-module React.Events where+{-# LANGUAGE OverloadedStrings, TypeSynonymInstances, DeriveGeneric,+    FlexibleInstances #-}+module React.Events+    ( EventProperties(..)+    , Target(..)+    , ModifierKeys(..)+    , MouseEvent(..)+    , KeyboardEvent(..)+    , ChangeEvent(..)+    , FocusEvent(..)+    , BlurEvent(..) +    -- * Native Events+    , onBlur+    , onFocus+    , onChange+    , onKeyDown+    , onKeyPress+    , onKeyUp+    , onMouseEnter+    , onMouseLeave+    , onDoubleClick+    , onClick++    -- * Synthetic Events+    , onEnter+    ) where+ import Control.Applicative import Control.DeepSeq--import Haste-import Haste.Prim+import Control.Monad+import Data.Maybe+import GHC.Generics+import System.IO.Unsafe +import React.GHCJS import React.Imports import React.Types --- TODO: handle (a -> Maybe b) or (a -> b) -handlerToJs :: (RawEvent -> Maybe (IO ())) -> Ptr (RawEvent -> IO ())-handlerToJs handle =-    let go :: Maybe (IO ()) -> IO ()-        go = maybe (return ()) id-    in toPtr (go . handle)+mkEventHandler :: (FromJSRef evt, NFData evt)+               => EvtType+               -> (evt -> Maybe signal)+               -> AttrOrHandler signal+mkEventHandler ty handle =+    let handle' raw = handle $!! fromJust $ unsafePerformIO $ fromJSRef $ castRef raw+    in Handler (EventHandler handle' ty) -makeHandler :: RawAttrs -> (RawEvent -> Maybe (IO ()), EvtType) -> IO ()-makeHandler obj (handle, ChangeEvt) =-    js_set_onChange (handlerToJs handle) obj-makeHandler obj (handle, KeyDownEvt) =-    js_set_onKeyDown (handlerToJs handle) obj-makeHandler obj (handle, KeyPressEvt) =-    js_set_onKeyPress (handlerToJs handle) obj-makeHandler obj (handle, KeyUpEvt) =-    js_set_onKeyUp (handlerToJs handle) obj-makeHandler obj (handle, ClickEvt) =-    js_set_onClick (handlerToJs handle) obj-makeHandler obj (handle, DoubleClickEvt) =-    js_set_onDoubleClick (handlerToJs handle) obj-makeHandler obj (handle, MouseEnterEvt) =-    js_set_onMouseEnter (handlerToJs handle) obj-makeHandler obj (handle, MouseLeaveEvt) = return ()-    -- js_set_onMouseLeave (handlerToJs handle) obj -unHandler :: (s -> IO ())-          -> EventHandler s-          -> (RawEvent -> Maybe (IO ()), EvtType)-unHandler act (EventHandler handle ty) = (\e -> act <$> handle e, ty)+-- | Low level properties common to all events+data EventProperties e =+  EventProperties { bubbles :: !Bool+                  , cancelable :: !Bool+                  , currentTarget :: !e -- NativeElem+                  , defaultPrevented :: !Bool+                  , eventPhase :: !Int+                  , isTrusted :: !Bool+                    -- ,  nativeEvent :: DOMEvent+                    -- , preventDefault :: IO ()+                    -- ,  stopPropagation :: IO ()+                  , evtTarget :: !e -- NativeElem+                    --, timeStamp :: Date+                  , eventType :: !JSString -- type+                  } +instance NFData e => NFData (EventProperties e) where+    rnf (EventProperties a b c d e f g h) =+        a `seq` b `seq` c `seq` d `seq` e `seq` f `seq` g `seq` h `seq` ()++data ModifierKeys =+  ModifierKeys { altKey :: !Bool+               , ctrlKey :: !Bool+               , metaKey :: !Bool+               , shiftKey :: !Bool+               } deriving (Eq, Show, Generic)++instance FromJSRef ModifierKeys where++instance NFData ModifierKeys where+    rnf (ModifierKeys a b c d) = a `seq` b `seq` c `seq` d `seq` ()++data MouseEvent =+  MouseEvent { -- mouseEventProperties :: !(EventProperties e)+               -- mouseModifierKeys :: !ModifierKeys+             -- , buttonNum :: !Int -- "button"+               -- , buttons :: Int+               clientX :: !Double+             , clientY :: !Double+             , pageX :: !Double+             , pageY :: !Double+               -- , relatedTarget :: Unpacked+             , screenX :: !Double+             , screenY :: !Double+             } deriving (Show, Generic)++instance FromJSRef MouseEvent where++instance NFData MouseEvent where+    -- rnf (MouseEvent a b c d e f g h) =+    --     a `seq` b `seq` c `seq` d `seq` e `seq` f `seq` g `seq` h `seq` ()+    rnf (MouseEvent a b c d e f) =+        a `seq` b `seq` c `seq` d `seq` e `seq` f  `seq` ()++data KeyboardEvent =+  KeyboardEvent { -- keyboardEventProperties :: ! (EventProperties e)+                -- keyboardModifierKeys :: !ModifierKeys+                  charCode :: !Int+                , key :: !JSString+                , keyCode :: !Int+                -- , locale :: !JSString+                , location :: !Int+                , repeat :: !Bool+                , which :: !Int+                } deriving (Show, Generic)++instance FromJSRef KeyboardEvent where++instance NFData KeyboardEvent where+    rnf (KeyboardEvent a b c d e f) =+        a `seq` b `seq` c `seq` d `seq` e `seq` f `seq` ()++data Target = Target+    { value :: !JSString+    , tagName :: !JSString+    -- XXX(joel) This is gross. Added a second field so that the generic+    -- FromJSRef instance does the right thing. Without a second field it+    -- uses the FromJSRef instance for `value`.+    } deriving (Show, Generic)++instance FromJSRef Target where++data ChangeEvent = ChangeEvent+    { target :: !Target+    , timeStamp :: !Int+    } deriving (Show, Generic)++instance FromJSRef ChangeEvent where++instance NFData ChangeEvent where+    rnf e@(ChangeEvent str stamp) = str `seq` stamp `seq` ()++-- data FocusEvent e =+--   FocusEvent { -- focusEventProperties :: ! (EventProperties e)+--                domEventTarget :: !e -- NativeElem+--              , relatedTarget :: !e -- NativeElem+--              }++-- instance NFData e => NFData (FocusEvent e) where+--     rnf (FocusEvent a b) = a `seq` b `seq` ()++data FocusEvent = FocusEvent deriving Generic++instance NFData FocusEvent++instance FromJSRef FocusEvent where++data BlurEvent = BlurEvent deriving (Show, Generic)++instance FromJSRef BlurEvent where++instance NFData BlurEvent+++-- XXX isn't this in GHCJS.Prim?+instance Eq JSString where+    (==) = eqRef++-- TODO: handle (a -> Maybe b) or (a -> b)++onBlur :: (BlurEvent -> Maybe s) -> AttrOrHandler s+onBlur = mkEventHandler BlurEvt++onFocus :: (FocusEvent -> Maybe s) -> AttrOrHandler s+onFocus = mkEventHandler FocusEvt+ onChange :: (ChangeEvent -> Maybe s) -> AttrOrHandler s-onChange = mkEventHandler-    (fromPtr . js_parseChangeEvent)-    ChangeEvt+onChange = mkEventHandler ChangeEvt  onKeyDown :: (KeyboardEvent -> Maybe s) -> AttrOrHandler s-onKeyDown = mkEventHandler-    (fromPtr . js_parseKeyboardEvent)-    KeyDownEvt+onKeyDown = mkEventHandler KeyDownEvt  onKeyPress :: (KeyboardEvent -> Maybe s) -> AttrOrHandler s-onKeyPress = mkEventHandler-    (fromPtr . js_parseKeyboardEvent)-    KeyPressEvt+onKeyPress = mkEventHandler KeyPressEvt  onKeyUp :: (KeyboardEvent -> Maybe s) -> AttrOrHandler s-onKeyUp = mkEventHandler-    (fromPtr . js_parseKeyboardEvent)-    KeyUpEvt+onKeyUp = mkEventHandler KeyUpEvt  onMouseEnter :: (MouseEvent -> Maybe s) -> AttrOrHandler s-onMouseEnter = mkEventHandler-    (fromPtr . js_parseMouseEvent)-    MouseEnterEvt+onMouseEnter = mkEventHandler MouseEnterEvt  onMouseLeave :: (MouseEvent -> Maybe s) -> AttrOrHandler s-onMouseLeave = mkEventHandler-    (fromPtr . js_parseMouseEvent)-    MouseLeaveEvt+onMouseLeave = mkEventHandler MouseLeaveEvt  onDoubleClick :: (MouseEvent -> Maybe s) -> AttrOrHandler s-onDoubleClick = mkEventHandler-    (fromPtr . js_parseMouseEvent)-    DoubleClickEvt+onDoubleClick = mkEventHandler DoubleClickEvt  onClick :: (MouseEvent -> Maybe s) -> AttrOrHandler s-onClick = mkEventHandler-    (fromPtr . js_parseMouseEvent)-    ClickEvt+onClick = mkEventHandler ClickEvt  onEnter :: s -> AttrOrHandler s onEnter s = onKeyPress handler where
+ src/React/GHCJS.hs view
@@ -0,0 +1,134 @@+{-# LANGUAGE CPP #-}++#ifndef __GHCJS__+{-# LANGUAGE RankNTypes, TypeSynonymInstances, FlexibleInstances #-}+{-# OPTIONS_GHC -fno-warn-missing-methods #-}+#endif++module React.GHCJS+    ( currentDocument+    , Document+    , Element+    , JSAny+    , documentGetElementById++    -- * GHCJS stubs+#ifdef __GHCJS__+    , module X+#else+    , ForeignRetention(..)+    , JSRef(..)+    , JSFun+    , JSArray+    , JSString+    , FromJSString(..)+    , ToJSString(..)+    , FromJSRef(..)+    , ToJSRef(..)+    , castRef+    , newObj+    , setProp+    , eqRef+    , toArray+    , setProp+    , syncCallback1+    , syncCallback2+#endif+    ) where++-- Export useful things from GHCJS, or mocks of them if we're running in GHC++import qualified Data.Aeson as Aeson+import Data.String+import Data.Text (Text)++#ifdef __GHCJS__++import GHCJS.Foreign as X+import GHCJS.Marshal as X+import GHCJS.Types as X+import GHCJS.DOM (currentDocument)+import GHCJS.DOM.Types (Document, Element)+import GHCJS.DOM.Document (documentGetElementById)++#else++data Document+data Element+data JSRef a = JSRef+data JSString_+type JSFun = JSRef+type JSArray = JSRef+type JSString = JSRef JSString_++class ToJSString a where+    toJSString :: a -> JSString++class FromJSString a where+    fromJSString :: JSString -> a++class FromJSRef a where+    fromJSRef :: JSRef a -> IO (Maybe a)++class ToJSRef a where+    toJSRef :: a -> IO (JSRef a)++instance FromJSRef Aeson.Value+instance FromJSRef Int+instance (FromJSRef a, FromJSRef b) => FromJSRef (a, b)+instance FromJSRef (JSRef ())+instance ToJSRef Int+instance ToJSRef Aeson.Value+instance ToJSRef a => ToJSRef (Maybe a)+instance ToJSRef (JSRef a)+instance FromJSString String+instance FromJSString Text+instance FromJSString JSString+instance ToJSString String+instance ToJSString Text+instance ToJSString JSString+instance IsString JSString++currentDocument :: IO (Maybe Document)+currentDocument = undefined++documentGetElementById ::+    -- (IsDocument self, ToJSString elementId) =>+    self -> elementId -> IO (Maybe Element)+documentGetElementById = undefined++castRef :: JSRef a -> JSRef b+castRef _ = JSRef++newObj :: IO (JSRef a)+newObj = undefined++data ForeignRetention+    = NeverRetain+    | AlwaysRetain+    | DomRetain (forall a. JSRef a)++eqRef :: JSRef a -> JSRef a -> Bool+eqRef = undefined++toArray :: [JSRef a] -> IO (JSArray a)+toArray = undefined++setProp :: ToJSString a => a -> JSRef b -> JSRef c -> IO ()+setProp = undefined++syncCallback1 :: ForeignRetention+              -> Bool+              -> (JSRef a -> IO b)+              -> IO (JSFun (JSRef a -> IO b))+syncCallback1 = undefined++syncCallback2 :: ForeignRetention+              -> Bool+              -> (JSRef a -> JSRef b -> IO c)+              -> IO (JSFun (JSRef a -> JSRef b -> IO c))+syncCallback2 = undefined++#endif++type JSAny = JSRef ()
src/React/Imports.hs view
@@ -1,232 +1,75 @@-{-# LANGUAGE ForeignFunctionInterface, CPP #-}---- TODO send GHC bug report-{- ANN module "HLint: ignore Use camelCase" -}--module React.Imports where--import React.Types--import Haste-import Haste.Foreign-import Haste.JSON-import Haste.Prim+{-# LANGUAGE CPP #-} -#ifdef __HASTE__-foreign import ccall js_render :: ForeignNode -> Elem -> IO ()+#ifdef __GHCJS__+{-# LANGUAGE JavaScriptFFI #-} #else-js_render :: ForeignNode -> Elem -> IO ()-js_render = error "cannot evaluate js_render in ghc"+{-# LANGUAGE RankNTypes, TypeSynonymInstances, FlexibleInstances #-}+{-# OPTIONS_GHC -fno-warn-missing-methods #-} #endif -#ifdef __HASTE__-foreign import ccall js_bezier :: Double -> Double -> Double -> Double -> Double -> Double-#else-js_bezier :: Double -> Double -> Double -> Double -> Double -> Double-js_bezier = error "cannot evaluate js_bezier in ghc"-#endif+module React.Imports+    ( RawEvent+    , ImportedClass -#ifdef __HASTE__-foreign import ccall js_createClass :: Ptr (state -> React ty ())-                                    -> IO ForeignClass-#else-js_createClass :: Ptr (state -> React ty ())-               -> IO ForeignClass-js_createClass = error "cannot evaluate js_createClass in ghc"-#endif+    -- * Foreign imports+    , js_render+    , js_createClass+    , js_react_createElement_DOM+    , js_react_createElement_Class+    , js_set_handler+    , js_forceUpdate+    , js_foreignParent+    ) where -#ifdef __HASTE__-foreign import ccall js_raf :: Ptr (Double -> IO ()) -> IO RenderHandle-#else-js_raf :: Ptr (Double -> IO ()) -> IO RenderHandle-js_raf = error "cannot evaluate js_raf in ghc"-#endif+import React.GHCJS -#ifdef __HASTE__-foreign import ccall js_cancelRaf :: RenderHandle -> IO ()-#else-js_cancelRaf :: RenderHandle -> IO ()-js_cancelRaf = error "cannot evaluate js_cancelRaf in ghc"-#endif+data RawEvent_+type RawEvent = JSRef RawEvent_ -#ifdef __HASTE__-foreign import ccall js_React_DOM_leaf :: JSString -> RawAttrs -> IO ForeignNode-#else-js_React_DOM_leaf :: JSString -> RawAttrs -> IO ForeignNode-js_React_DOM_leaf = error "cannot evaluate js_React_DOM_leaf in ghc"-#endif+data ImportedClass_ props sig+type ImportedClass props sig = JSRef (ImportedClass_ props sig) -#ifdef __HASTE__-foreign import ccall js_React_DOM_parent :: JSString -> RawAttrs -> ReactArray -> IO ForeignNode-#else-js_React_DOM_parent :: JSString -> RawAttrs -> ReactArray -> IO ForeignNode-js_React_DOM_parent = error "cannot evaluate js_React_DOM_parent in ghc"-#endif+#ifdef __GHCJS__ -#ifdef __HASTE__-foreign import ccall js_empty_object :: IO RawAttrs-#else-js_empty_object :: IO RawAttrs-js_empty_object = error "cannot evaluate js_empty_object in ghc"-#endif+foreign import javascript unsafe "React.render($1, $2)"+    js_render :: JSRef () -> Element -> IO ()+foreign import javascript unsafe "js_createClass"+    js_createClass :: JSAny -> JSAny+foreign import javascript unsafe "React.createElement.apply(null, [$1, $2].concat($3))"+    js_react_createElement_DOM :: JSString -> JSAny -> JSAny -> IO JSAny+foreign import javascript unsafe "React.createElement.apply(null, [$1, $2].concat($3))"+-- foreign import javascript unsafe "function(x, y, z) { console.log(x, y, z, [x,y].concat(z)); return React.createElement.apply(null, [x, y].concat(z)); }($1, $2, $3)"+    js_react_createElement_Class :: JSAny -> JSAny -> JSAny -> IO JSAny+foreign import javascript unsafe "js_set_handler"+    js_set_handler :: Int -> JSString -> (JSFun (RawEvent -> IO ())) -> JSAny -> IO ()+foreign import javascript unsafe "$1.forceUpdate()"+    js_forceUpdate :: JSAny -> IO ()+foreign import javascript unsafe "React.createElement($1, $2, $3)"+    js_foreignParent :: ImportedClass props sig -> JSRef props -> JSAny -> IO JSAny -#ifdef __HASTE__-foreign import ccall "js_set_field" js_set_field_String :: RawAttrs -> JSString -> JSString -> IO () #else-js_set_field_String :: RawAttrs -> JSString -> JSString -> IO ()-js_set_field_String = error "cannot evaluate js_set_field_String in ghc"-#endif -#ifdef __HASTE__-foreign import ccall "js_set_field" js_set_field_Double :: RawAttrs -> JSString -> Double -> IO ()-#else-js_set_field_Double :: RawAttrs -> JSString -> Double -> IO ()-js_set_field_Double = error "cannot evaluate js_set_field_Double in ghc"-#endif--#ifdef __HASTE__-foreign import ccall "js_set_field" js_set_field_Int :: RawAttrs -> JSString -> Int -> IO ()-#else-js_set_field_Int :: RawAttrs -> JSString -> Int -> IO ()-js_set_field_Int = error "cannot evaluate js_set_field_Int in ghc"-#endif--#ifdef __HASTE__-foreign import ccall "js_set_field" js_set_field_Obj :: RawAttrs -> JSString -> RawAttrs -> IO ()-#else-js_set_field_Obj :: RawAttrs -> JSString -> RawAttrs -> IO ()-js_set_field_Obj = error "cannot evaluate js_set_field_Obj in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_field_True :: RawAttrs -> JSString -> IO ()-#else-js_set_field_True :: RawAttrs -> JSString -> IO ()-js_set_field_True = error "cannot evaluate js_set_field_True in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_field_False :: RawAttrs -> JSString -> IO ()-#else-js_set_field_False :: RawAttrs -> JSString -> IO ()-js_set_field_False = error "cannot evaluate js_set_field_False in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_targetValue :: RawEvent -> JSString-#else-js_targetValue :: RawEvent -> JSString-js_targetValue = error "cannot evaluate js_targetValue in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_onClick       :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onClick       :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onClick       = error "cannot evaluate js_set_onClick in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_onDoubleClick :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onDoubleClick :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onDoubleClick = error "cannot evaluate js_set_onDoubleClick in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_onChange      :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onChange      :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onChange      = error "cannot evaluate js_set_onChangein ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_onKeyUp       :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onKeyUp       :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onKeyUp       = error "cannot evaluate js_set_onKeyUp in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_onKeyPress    :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onKeyPress    :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onKeyPress    = error "cannot evaluate js_set_onKeyPress in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_onKeyDown     :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onKeyDown     :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onKeyDown     = error "cannot evaluate js_set_onKeyDown in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_onBlur        :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onBlur        :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onBlur        = error "cannot evaluate js_set_onBlur in ghc"-#endif--#ifdef __HASTE__-foreign import ccall js_set_onMouseEnter :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onMouseEnter :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onMouseEnter = error "cannot evaluate js_set_onMouseEnter in ghc"-#endif+-- mock the foreign imports -#ifdef __HASTE__-foreign import ccall js_set_onMouseLeave :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-#else-js_set_onMouseLeave :: Ptr (RawEvent -> IO ()) -> RawAttrs -> IO ()-js_set_onMouseLeave = error "cannot evaluate js_set_onMouseLeave in ghc"-#endif+js_render :: JSRef () -> Element -> IO ()+js_render = error "cannot evaluate js_render in ghc" -#ifdef __HASTE__-foreign import ccall js_React_getDomNode :: ForeignNode -> IO (Ptr (Maybe Elem))-#else-js_React_getDomNode :: ForeignNode -> IO (Ptr (Maybe Elem))-js_React_getDomNode = error "cannot evaluate js_React_getDomNode in ghc"-#endif+js_createClass :: JSAny -> JSAny+js_createClass = error "cannot evaluate js_createClass in ghc" -#ifdef __HASTE__-foreign import ccall "js_empty" js_ReactArray_empty :: IO ReactArray-#else-js_ReactArray_empty :: IO ReactArray-js_ReactArray_empty = error "cannot evaluate js_ReactArray_empty in ghc"-#endif+js_react_createElement_DOM :: JSString -> JSAny -> JSAny -> IO JSAny+js_react_createElement_DOM = error "cannot evaluate js_react_createElement_DOM in ghc" -#ifdef __HASTE__-foreign import ccall "js_push" js_ReactArray_push :: ReactArray -> ForeignNode -> IO ()-#else-js_ReactArray_push :: ReactArray -> ForeignNode -> IO ()-js_ReactArray_push = error "cannot evaluate js_ReactArray_push in ghc"-#endif+js_react_createElement_Class :: JSAny -> JSAny -> JSAny -> IO JSAny+js_react_createElement_Class = error "cannot evaluate js_react_createElement_Class in ghc" -#ifdef __HASTE__-foreign import ccall "js_id" js_React_DOM_text :: JSString -> IO ForeignNode-#else-js_React_DOM_text :: JSString -> IO ForeignNode-js_React_DOM_text = error "cannot evaluate js_React_DOM_text in ghc"-#endif+js_set_handler :: Int -> JSString -> JSFun (RawEvent -> IO ()) -> JSAny -> IO ()+js_set_handler = error "cannot evaluate js_set_handler in ghc" -#ifdef __HASTE__-foreign import ccall js_parseChangeEvent :: RawEvent -> Ptr ChangeEvent-#else-js_parseChangeEvent :: RawEvent -> Ptr ChangeEvent-js_parseChangeEvent = error "cannot evaluate js_parseChangeEvent in ghc"-#endif+js_forceUpdate :: JSAny -> IO ()+js_forceUpdate = error "cannot evaluate js_forceUpdate in ghc" -#ifdef __HASTE__-foreign import ccall js_parseKeyboardEvent :: RawEvent -> Ptr KeyboardEvent-#else-js_parseKeyboardEvent :: RawEvent -> Ptr KeyboardEvent-js_parseKeyboardEvent = error "cannot evaluate js_parseKeyboardEvent in ghc"-#endif+js_foreignParent :: ImportedClass props sig -> JSRef props -> JSAny -> IO JSAny+js_foreignParent = error "cannot evaluate js_foreignParent in ghc" -#ifdef __HASTE__-foreign import ccall js_parseMouseEvent :: RawEvent -> Ptr MouseEvent-#else-js_parseMouseEvent :: RawEvent -> Ptr MouseEvent-js_parseMouseEvent = error "cannot evaluate js_parseMouseEvent in ghc" #endif
src/React/Interpret.hs view
@@ -1,80 +1,196 @@-{-# LANGUAGE OverloadedStrings, LambdaCase #-}-module React.Interpret where+{-# LANGUAGE OverloadedStrings #-}+module React.Interpret (reactNodeToJSAny, setProp') where +import Control.Applicative import Control.Monad--import Haste.DOM-import Haste.Foreign-import Haste.JSON-import Haste.Prim+import qualified Data.Aeson as Aeson+import qualified Data.HashMap.Strict as H+import Data.List+import Data.Maybe+import Data.Text (Text) -import React.Events+import React.GHCJS import React.Imports+import React.Registry import React.Types +-- This module handles the translation of 'ReactNode's into javascript. The+-- difficulty is in handling the complexity that arises from keeping state in+-- Haskell rather than in JS. This means we can't just blindly call ToJSRef+-- (which would be very convenient).+--+-- The raison d'etre of this module is 'reactNodeToJSAny', which delegates to+-- helpers for each type of react node.+--+-- Most interesting code is in 'componentToJSAny'.+-- * It deals with the current event handler, which is passed down through+--   'reactNodeToJSAny' and all of its special cases.+-- * It also sets the props and handler in the component registry. -element :: (JSString -> RawAttrs -> ReactArray -> IO ForeignNode)-        -> JSString-        -> Attrs-        -> [(RawEvent -> Maybe (IO ()), EvtType)]-        -> [ForeignNode]-        -> IO ForeignNode-element constructor name attrs handlers content = do-    attr <- js_empty_object-    mapM_ (setField attr) attrs-    mapM_ (makeHandler attr) handlers -    children <- js_ReactArray_empty-    mapM_ (js_ReactArray_push children) content-    constructor name attr children+data Attr = Attr Text JSON  -voidElement :: (JSString -> RawAttrs -> IO ForeignNode)-            -> JSString-            -> Attrs-            -> [(RawEvent -> Maybe (IO ()), EvtType)]-            -> IO ForeignNode-voidElement constructor name attrs handlers =-    element (\n a c -> constructor n a) name attrs handlers []+reactNodeToJSAny :: (sig -> IO ()) -> Int -> ReactNode sig -> IO JSAny+reactNodeToJSAny sigHandler componentId (ComponentElement elem) =+    componentToJSAny sigHandler elem+reactNodeToJSAny sigHandler componentId (DomElement elem)       =+    domToJSAny sigHandler componentId elem +-- This isn't entirely fair to foreign (exported) classes. We've set them up+-- with our createClass machinery, so they expect to have a componentId, but we+-- give them none...+-- reactNodeToJSAny _ _ (ForeignElement elem)                   =+--     return $ castRef elem -setField :: RawAttrs -> (JSString, JSON) -> IO ()-setField attr (fld, Str v) = js_set_field_String attr fld v-setField attr (fld, Dict vs) = do-    subObj <- js_empty_object-    mapM_ (setField subObj) vs-    js_set_field_Obj attr fld subObj-setField attr (fld, Num v) = js_set_field_Double attr fld v-setField attr (fld, Bool True) = js_set_field_True attr fld-setField attr (fld, Bool False) = js_set_field_False attr fld+reactNodeToJSAny sigHandler componentId (ForeignClass cls props children) = do+    -- pass the handler and component id on to the children - their events will+    -- just be handled by the parent class.+    children' <- reactNodeToJSAny sigHandler componentId children+    props' <- toJSRef props+    js_foreignParent cls props' children' --- TODO this seems wrong-setField attr (fld, Null) = return ()+reactNodeToJSAny sigHandler _           (NodeText str)          =+    castRef <$> toJSRef (toJSString str)+reactNodeToJSAny sigHandler componentId (NodeSequence seq)      = do+    jsNodes <- mapM (reactNodeToJSAny sigHandler componentId) seq+    castRef <$> toArray jsNodes+reactNodeToJSAny sigHandler componentId (LocalNode f node)      =+    -- Convert from 'sig -> IO ()' to 'insig -> IO ()'+    let sigHandler' = sigHandler . f+    in reactNodeToJSAny sigHandler' componentId node  --- TODO figure out what to do with this--- getDomNode :: ForeignNode -> IO (Maybe Elem)--- getDomNode r = fmap fromPtr (js_React_getDomNode r)+jsName :: EvtType -> JSString+jsName BlurEvt = "onBlur"+jsName FocusEvt = "onFocus"+jsName ChangeEvt = "onChange"+jsName KeyDownEvt = "onKeyDown"+jsName KeyPressEvt = "onKeyPress"+jsName KeyUpEvt = "onKeyUp"+jsName ClickEvt = "onClick"+jsName DoubleClickEvt = "onDoubleClick"+jsName MouseEnterEvt = "onMouseEnter"+jsName MouseLeaveEvt = "onMouseLeave" -interpret :: Monad m-          => ReactT ty m ()-          -> AnimationState ty-          -> (Signal ty -> IO ())-          -> m (IO ForeignNode)-interpret react anim cb = do-    ~(child:_, ()) <- runReactT react anim-    return $ interpret' cb child +unHandler :: (s -> IO ())+          -> EventHandler s+          -> (RawEvent -> Maybe (IO ()), EvtType)+unHandler act (EventHandler handle ty) = (\e -> act <$> handle e, ty) -interpret' :: (signal -> IO ())-           -> ReactNode signal-           -> IO ForeignNode-interpret' cb = \case-    Parent name as hs children -> do-        children' <- forM children (interpret' cb)-        let hs' = map (unHandler cb) hs-        element js_React_DOM_parent name as hs' children'-    Leaf name as hs -> do-        let hs' = map (unHandler cb) hs-        voidElement js_React_DOM_leaf name as hs'-    Text str -> js_React_DOM_text (toJSStr str)++makeHandler :: Int+            -- ^ component id+            -> JSAny+            -- ^ object to set this attribute on+            -> (RawEvent -> Maybe (IO ()), EvtType)+            -- ^ handler+            -> IO ()+makeHandler componentId obj (handle, evtTy) = do+    handle' <- handlerToJs handle+    js_set_handler componentId (jsName evtTy) handle' obj+++-- | Make a javascript callback to synchronously execute the handler+handlerToJs :: (RawEvent -> Maybe (IO ()))+            -> IO (JSFun (RawEvent -> IO ()))+handlerToJs handle = syncCallback1 AlwaysRetain True $+    fromMaybe (return ()) . handle+++attrsToJson :: [Attr] -> JSON+attrsToJson = Aeson.toJSON . H.fromList . map unAttr where+    unAttr (Attr name json) = (name, json)+++separateAttrs :: [AttrOrHandler sig] -> ([Attr], [EventHandler sig])+separateAttrs attrHandlers = (map makeA as, map makeH hs) where+    (as, hs) = partition isAttr attrHandlers++    isAttr :: AttrOrHandler sig -> Bool+    isAttr (StaticAttr _ _) = True+    isAttr _ = False++    makeA :: AttrOrHandler sig -> Attr+    makeA (StaticAttr t j) = Attr t j++    makeH :: AttrOrHandler sig -> EventHandler sig+    makeH (Handler h) = h+++attrHandlerToJSAny :: (sig -> IO ()) -> Int -> [AttrOrHandler sig] -> IO JSAny+attrHandlerToJSAny sigHandler componentId attrHandlers = do+    let (attrs, handlers) = separateAttrs attrHandlers+    starter <- castRef <$> toJSRef (attrsToJson attrs)++    forM_ handlers $ makeHandler componentId starter . unHandler sigHandler+    return starter+++-- Helper for componentToJSAny and domToJSAny+setMaybeKey :: Maybe JSString -> JSAny -> IO ()+setMaybeKey maybeKey attrsObj = when (isJust maybeKey) $ do+    let Just key = maybeKey+    setProp' "key" key attrsObj+++setProp' :: ToJSRef a => String -> a -> JSAny -> IO ()+setProp' key prop obj = do+    propRef <- toJSRef prop+    setProp key propRef obj+++-- foreignElementToJSAny :: Int -> IO JSAny -> IO JSAny+-- foreignElementToJSAny componentId++-- foreignClassToJSAny :: Int -> ExportedClass -> IO JSAny+-- foreignClassToJSAny componentId cls = do+++componentToJSAny :: (sig -> IO ()) -> ReactComponentElement sig -> IO JSAny+componentToJSAny+    sigHandler+    (ReactComponentElement ty children maybeKey ref props) = do++        let registry = classStateRegistry ty+        componentId <- allocProps registry props++        -- handle internal signals, maybe call external signal handler++        -- Register a handler! This transitions the class to its new state and+        -- outputs a signal if appropriate.+        let sigHandler' insig = do+                RegistryStuff _ state _ <-+                    lookupRegistry registry componentId+                let (state', maybeExSig) = classTransition ty (state, insig)+                setState registry state' componentId++                case maybeExSig of+                    Just exSig -> sigHandler exSig+                    Nothing -> return ()++        setHandler registry sigHandler' componentId++        attrsObj <- newObj++        setMaybeKey maybeKey attrsObj+        setProp' "ref" ref attrsObj+        setProp' "componentId" componentId attrsObj++        let ty' = classForeign ty+        children' <- reactNodeToJSAny sigHandler' componentId children++        castRef <$> js_react_createElement_Class ty' attrsObj children'+++domToJSAny :: (sig -> IO ()) -> Int -> ReactDOMElement sig -> IO JSAny+domToJSAny sigHandler componentId (ReactDOMElement ty props children maybeKey ref) = do+    attrsObj <- attrHandlerToJSAny sigHandler componentId props++    setMaybeKey maybeKey attrsObj+    setProp' "ref" ref attrsObj++    children' <- reactNodeToJSAny sigHandler componentId children++    castRef <$> js_react_createElement_DOM ty attrsObj children'
src/React/Local.hs view
@@ -1,39 +1,68 @@-{-# LANGUAGE FlexibleInstances, GADTs, MultiParamTypeClasses #-}-module React.Local (locally, Narrowing(..)) where+{-# LANGUAGE FlexibleInstances, GADTs, MultiParamTypeClasses,+  FlexibleContexts, IncoherentInstances, LambdaCase, DataKinds #-}+-- Note on IncoherentInstances: the two instances below will both work fine+-- for `GeneralizeSignal Void Void`. They should never be called.+module React.Local (GeneralizeSignal(..), locally) where  import Control.Applicative import Data.Void  import React.Types --- TODO--- * make work with react classes -data Narrowing general local = Narrowing-    { localizeAnimationState :: AnimationState general -> AnimationState local-    , generalizeSignal :: Signal local -> Signal general-    }+-- |+-- Implement when a local signal can be generalized to a higher level one. Used+-- by 'locally'+class GeneralizeSignal sigloc siggen where+    generalizeSignal :: sigloc -> siggen -locally :: Monad m-        => Narrowing general local-        -> ReactT local m x-        -> ReactT general m x-locally narrowing nested = ReactT $ \anim -> do-    (nodes, x) <- runReactT nested (localizeAnimationState narrowing anim)-    return (map (nodeConvert (generalizeSignal narrowing)) nodes, x) -handlerConvert :: (localSig -> generalSig)-               -> EventHandler localSig-               -> EventHandler generalSig-handlerConvert generalize (EventHandler handle ty) =-    EventHandler (\raw -> generalize <$> handle raw) ty+instance GeneralizeSignal a a where+    generalizeSignal = id -nodeConvert :: (localSig -> generalSig)-             -> ReactNode localSig-             -> ReactNode generalSig-nodeConvert generalize (Parent name attrs handlers children) =-    Parent name attrs (map (handlerConvert generalize) handlers)-        (map (nodeConvert generalize) children)-nodeConvert generalize (Leaf name attrs handlers) =-    Leaf name attrs (map (handlerConvert generalize) handlers)-nodeConvert _ (Text str) = Text str++instance GeneralizeSignal Void a where+    generalizeSignal = absurd+++-- |+-- 'locally' exists to make it simple to embed classes with local concerns. An+-- example will be helpful:+--+-- We have some page which can respond to many different events.+--+-- @+-- data Transition+--     = UserTyping JSString+--     | Toggle+--     ...+--+-- globalPage_ :: [AttrOrHandler Transition] -> ReactNode Transition+-- @+--+-- And we want to be able to embed some components that don't care about all+-- that. 'inputBox_' can only output 'JSString' and 'pageHeader_' can't send+-- any signals at all.+--+-- @+-- inputBox_ :: ReactNode JSString+-- pageHeader_ :: ReactNode Void+-- @+--+-- With locally we can easily embed them in 'globalPage_':+--+-- @+-- instance GeneralizeSignal JSString Transition where+--     generalizeSignal = UserTyping+--+-- -- (globalPage_)+-- renderFn = \props state -> div_ [ class_ "global-page" ] $ do+--     locally pageHeader_+--     ...+--     locally inputBox_+--     ...+-- @+locally :: GeneralizeSignal sigloc siggen+        => ReactNode sigloc+        -> ReactNode siggen+locally = LocalNode generalizeSignal
+ src/React/PropTypes.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE CPP, FlexibleInstances #-}++#ifdef __GHCJS__+{-# LANGUAGE JavaScriptFFI #-}+#else+{-# OPTIONS_GHC -fno-warn-missing-methods #-}+#endif++module React.PropTypes where++import Data.Monoid+import Data.Text (Text)++import React.GHCJS+import React.Imports+++data FPropType_+type FPropType = JSRef FPropType_++#ifdef __GHCJS__+foreign import javascript unsafe "React.PropTypes.bool"+    fPropBool :: FPropType+foreign import javascript unsafe "React.PropTypes.func"+    fPropFunc :: FPropType+foreign import javascript unsafe "React.PropTypes.number"+    fPropNumber :: FPropType+foreign import javascript unsafe "React.PropTypes.string"+    fPropString :: FPropType+foreign import javascript unsafe "React.PropTypes.object"+    fPropObject :: FPropType+foreign import javascript unsafe "$1.isRequired"+    fIsRequired :: FPropType -> FPropType+#else+fPropBool :: FPropType+fPropBool = undefined+fPropFunc :: FPropType+fPropFunc = undefined+fPropNumber :: FPropType+fPropNumber = undefined+fPropString :: FPropType+fPropString = undefined+fPropObject :: FPropType+fPropObject = undefined+fIsRequired :: FPropType -> FPropType+fIsRequired = undefined+#endif+++data PropRequired = IsRequired | IsntRequired+++data PropType+    -- = PropArrayOf PropType+    = PropBool PropRequired+    | PropFunc PropRequired+    | PropNumber PropRequired+    | PropString PropRequired+    | PropObject PropRequired+    -- PropArray+    -- PropShape (H.HashMap Text PropType)+    -- PropEnum [Text]+    -- PropUnion [PropType]+++toJsPropType :: PropType -> FPropType+toJsPropType (PropBool req)   = ptReq req fPropBool+toJsPropType (PropFunc req)   = ptReq req fPropFunc+toJsPropType (PropNumber req) = ptReq req fPropNumber+toJsPropType (PropString req) = ptReq req fPropString+toJsPropType (PropObject req) = ptReq req fPropObject++ptReq :: PropRequired -> FPropType -> FPropType+ptReq IsRequired = fIsRequired+ptReq IsntRequired = id++class PropTypable a where+    propType :: a -> PropType+++instance PropTypable (JSRef ()) where+    -- TOOD(joel) instanceOf this+    propType _ = PropObject IsRequired++instance PropTypable JSString where+    propType _ = PropString IsRequired+
+ src/React/Rebindable.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE DataKinds, FlexibleInstances, OverloadedStrings,+    MultiParamTypeClasses #-}+module React.Rebindable where++import Data.Monoid++import React.Types+++(>>) :: ReactNode sig -> ReactNode sig -> ReactNode sig+(>>) = (<>)++return :: ReactNode sig -> ReactNode sig+return = id++ifThenElse b x y | b = x+                 | otherwise = y++when :: Bool -> ReactNode sig -> ReactNode sig+when False _  = mempty+when True seq = seq++unless :: Bool -> ReactNode sig -> ReactNode sig+unless bool = when (not bool)
+ src/React/Registry.hs view
@@ -0,0 +1,71 @@+module React.Registry where++import qualified Data.HashMap.Strict as H+import Data.IORef++import React.Imports+++data RegistryStuff props state insig exsig = RegistryStuff+    { registryProps :: props+    , registryState :: state+    , registryHandler :: insig -> IO ()+    }+++data ClassRegistry props state insig exsig = ClassRegistry+    { registryStuff :: IORef (H.HashMap Int (RegistryStuff props state insig exsig))+    , registryGen :: IORef Int+    }+++generateKey :: ClassRegistry props state insig exsig -> IO Int+generateKey (ClassRegistry _ gen) = do+    k <- readIORef gen+    writeIORef gen (k + 1)+    return k+++allocProps :: ClassRegistry props state insig exsig+           -> props+           -> IO Int+allocProps registry props = do+    k <- generateKey registry++    modifyIORef (registryStuff registry) $+        H.insert k (RegistryStuff props undefined undefined)+    return k+++setHandler :: ClassRegistry props state insig exsig+           -> (insig -> IO ())+           -> Int+           -> IO ()+setHandler registry handler k =+    modifyIORef (registryStuff registry) $+        H.adjust (\(RegistryStuff p s _) -> RegistryStuff p s handler) k+++setState :: ClassRegistry props state insig exsig -> state -> Int -> IO ()+setState registry state k =+    modifyIORef (registryStuff registry) $+        H.adjust (\(RegistryStuff p _ h) -> RegistryStuff p state h) k+++deallocRegistry :: ClassRegistry props state insig exsig -> Int -> IO ()+deallocRegistry (ClassRegistry stuff _) k = modifyIORef stuff (H.delete k)+++-- TODO(joel) - think about pushing around the IO boundary+lookupRegistry :: ClassRegistry props state insig exsig+               -> Int+               -> IO (RegistryStuff props state insig exsig)+lookupRegistry (ClassRegistry stuff _) k = do+    stuff' <- readIORef stuff+    return $ H.lookupDefault+        (error $ "class registry didn't contain an entry!\n" +++                 "componentId: " ++ show k ++ "\n" +++                 "keys: " ++ show (H.keys stuff') ++ "\n"+        )+        k+        stuff'
src/React/Render.hs view
@@ -1,102 +1,29 @@-{-# LANGUAGE OverloadedStrings, FlexibleContexts, NamedFieldPuns #-}+{-# LANGUAGE OverloadedStrings, FlexibleContexts, NamedFieldPuns, GADTs #-}  module React.Render     ( render-    , cancelRender+    , debugRender     ) where -import Control.Applicative-import Control.Monad-import Control.Monad.IO.Class-import Data.Functor.Identity-import Data.IORef-import Data.List-import Data.Maybe-import Data.Monoid-import Data.String--import Haste hiding (fromString)-import Haste.Foreign-import Haste.JSON-import Haste.Prim+import Data.Void -import React.Anim-import React.Attrs-import React.Class-import React.Elements-import React.Events+import React.GHCJS import React.Imports import React.Interpret-import React.Local import React.Types  -doRender :: Elem -> Double -> ReactClass ty -> IO ()-doRender elem time ReactClass{ classRender,-                               classTransition,-                               transitionRef,-                               runningAnimRef,-                               animRef,-                               stateRef } = do--    transitions <- readIORef transitionRef-    runningAnims <- readIORef runningAnimRef-    prevState <- readIORef stateRef-    prevAnim <- readIORef animRef--    let (newState, newAnims) =-            mapAccumL classTransition prevState transitions--        newAnims' = concat newAnims-        newRunningAnims = map (\conf -> RunningAnim conf time) newAnims'--        (runningAnims', endingAnims) = partition-            (\(RunningAnim AnimConfig{duration} beganAt) ->-                beganAt + duration > time)-            (runningAnims <> newRunningAnims)--        endingAnims' = zip endingAnims [1..]-        runningAnims'' = zip runningAnims' (map (lerp time) runningAnims')-        newAnim = stepRunningAnims prevAnim (endingAnims' ++ runningAnims'')--        -- TODO should this run before or after rendering?-        -- TODO expose a way to cancel / pass False in that case-        endAnimTrans = mapMaybe-            (\anim -> onComplete (config anim) True)-            endingAnims--    foreignNode <- runIdentity $-        interpret (classRender newState) newAnim (updateCb transitionRef)-    js_render foreignNode elem--    writeIORef stateRef newState-    writeIORef animRef newAnim-    writeIORef runningAnimRef runningAnims'-    writeIORef transitionRef endAnimTrans---updateCb :: IORef [signal] -> signal -> IO ()-updateCb ref update = modifyIORef ref (update:)---render :: Elem-       -> ReactClass ty-       -> IO RenderHandle-render elem cls@ReactClass{transitionRef, runningAnimRef} = do-    let renderCb time = do-            transitions <- readIORef transitionRef-            runningAnims <- readIORef runningAnimRef--            -- only rerender when dirty-            when (length transitions + length runningAnims > 0) $-                doRender elem time cls--            js_raf $ toPtr renderCb-            return ()--    doRender elem 0 cls-    js_raf $ toPtr renderCb+-- `Void` forces our top-level class `transition` to always choose `Nothing`+-- over outputting a signal.+render :: ReactNode Void -> Element -> IO ()+render node elem = do+    -- XXX+    node' <- reactNodeToJSAny undefined 0 node+    js_render node' elem  -cancelRender :: RenderHandle -> IO ()-cancelRender = js_cancelRaf+debugRender :: Show sig => ReactNode sig -> Element -> IO ()+debugRender node elem = do+    -- XXX+    node' <- reactNodeToJSAny print 0 node+    js_render node' elem
src/React/Types.hs view
@@ -1,392 +1,120 @@-{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses,-    FlexibleInstances, FlexibleContexts, TypeFamilies,-    ExistentialQuantification, ImpredicativeTypes #-}+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,+    FlexibleContexts, TypeFamilies, ExistentialQuantification,+    ImpredicativeTypes, LiberalTypeSynonyms, DataKinds, GADTs,+    OverloadedStrings, CPP #-}+ module React.Types where  import Control.Applicative import Control.DeepSeq import Control.Monad-import Data.Functor.Identity+import qualified Data.Aeson as Aeson+import Data.List (partition)+import Data.Maybe import Data.Monoid import Data.String+import Data.Text (Text) -import Data.Void-import Haste-import Haste.Foreign-import Haste.JSON-import Haste.Prim-import Lens.Family2+import React.GHCJS+import React.Imports+import React.Registry  -newtype ForeignNode = ForeignNode JSAny deriving (Pack, Unpack)-newtype RawAttrs = RawAttrs JSAny  deriving (Pack, Unpack)-newtype ReactArray = ReactArray JSAny deriving (Pack, Unpack)-newtype ForeignClass = ForeignClass JSAny deriving (Pack, Unpack)+instance Show JSString where+    show = fromJSString -newtype RenderHandle = RenderHandle Int-    deriving (Pack, Unpack)+type JSON = Aeson.Value  data EvtType-    = ChangeEvt-    | KeyDownEvt-    | KeyPressEvt-    | KeyUpEvt-    | ClickEvt-    | DoubleClickEvt-    | MouseEnterEvt-    | MouseLeaveEvt+   = ChangeEvt+   | BlurEvt+   | FocusEvt+   | KeyDownEvt+   | KeyPressEvt+   | KeyUpEvt+   | ClickEvt+   | DoubleClickEvt+   | MouseEnterEvt+   | MouseLeaveEvt + data EventHandler signal = EventHandler     { handler :: RawEvent -> Maybe signal     , evtType :: EvtType     } -newtype RawEvent = RawEvent JSAny deriving (Pack, Unpack) -type Attrs = [(JSString, JSON)]---- it'd be super cool to restrict `Pre` to a string somehow (restrict the--- underlying monad so it can only set attrs and string?)--data ReactNode signal-    = Parent JSString Attrs [EventHandler signal] [ReactNode signal]-    | Leaf JSString Attrs [EventHandler signal]-    -- | Pre Attrs Handlers [ReactNode]-    | Text String -- TODO(joel) JSString?----- | Standard easing functions. These are used to 'interpolate' smoothly.------ See <http://joelburget.com/react-haskell/ here> for visualizations.-data Easing-    = Linear--    | EaseInQuad-    | EaseOutQuad-    | EaseInOutQuad--    | EaseInCubic-    | EaseOutCubic-    | EaseInOutCubic--    | EaseInQuart-    | EaseOutQuart-    | EaseInOutQuart--    | EaseInQuint-    | EaseOutQuint-    | EaseInOutQuint--    | EaseInElastic-    | EaseOutElastic-    | EaseInOutElastic--    | EaseInBounce-    | EaseOutBounce-    | EaseInOutBounce--    | EaseBezier Double Double Double Double-    | EaseInSine-    | EaseOutSine-    deriving (Show, Eq, Ord)---- | Properties that can animate.------ Numeric values like 'width' and 'height', as well as colors.-class Animatable a where-    -- TODO is `to` always `animZero`?-    -- | Use an easing function to interpolate between two values-    interpolate :: Easing -- ^ easing function-                -> a -- ^ from-                -> a -- ^ to-                -> Double -- ^ [0..1] ratio of /time/ elapsed-                -> a--    -- | Add two animations-    animAdd :: a -> a -> a--    -- | Subtract two animations-    animSub :: a -> a -> a-    animZero :: a----- | A 'ReactKey' is a type, which conventionally has no constructors,--- mapping to the type of state, animation state, and signals associated--- with a page fragment or class.------ Example:------ @--- data Slider -- note the key has no constructors--- data SliderState = Open | Closed--- data SliderSignal = SlideOpen | SlideClosed------ instance ReactKey Slider where---     type ClassState Slider = SliderState---     type AnimationState Slider = Double---     type Signal Slider = SliderSignal------ -- this page fragment has access to the animation state 'Double' and can--- -- emit 'SliderSignal's.--- pageFragment :: React Slider ()--- pageFragment = div_ ...+-- | A 'ReactClass' is a standalone component of a user interface which+-- contains the state necessary to render itself. Classes are a tool for+-- scoping. ----- -- this class stores the class state and animation state. its internals--- -- can emit `SliderSignal`s.--- sliderClass :: ReactClass Slider ()--- sliderClass = ...--- @-class ReactKey ty where-    -- | The state needed to render a class (ignoring animation)-    type ClassState ty :: *--    -- | The state needed to animate a class-    type AnimationState ty :: *--    -- | The type of signals a class can send-    type Signal ty :: *----- Unit's ClassState and AnimationState are uninteresting. Its Signal is--- entirely uninhabited.-instance ReactKey () where-    type ClassState     () = ()-    type AnimationState () = ()-    type Signal         () = Void----- things you might want to control about an animation:--- * duration--- * from--- * to--- * lens--- * easing--- * oncomplete--- * chaining--- * delay---- possible configurations:--- * set new state, animate from old to new at same time---   - need to connect ClassState and AnimationState somehow--- * animate manually from -> to--data AnimConfig ty = forall a. (Animatable a) => AnimConfig {-      -- | How long this animation lasts in milliseconds-      duration :: Double-      -- | Where does this animation start and end?-    , endpoints :: (a, a)-    -- , lens :: Lens' anim a XXX-      -- | Pointer to this field within 'AnimationState'-    , lens :: Traversal' (AnimationState ty) a-      -- | How is the animation eased?-    , easing :: Easing-      -- | Do something when it's finished?-    , onComplete :: Bool -> Maybe (Signal ty)-    }---data RunningAnim ty = RunningAnim-    { config :: AnimConfig ty-    , beganAt :: Double+-- Use 'createClass' to construct.+data ReactClass props state insig exsig ctx = ReactClass+    { classForeign :: JSAny+    , classTransition :: (state, insig) -> (state, Maybe exsig)+    , classStateRegistry :: ClassRegistry props state insig exsig     }  -newtype ReactT ty m a = ReactT-    { runReactT :: AnimationState ty -> m ([ReactNode (Signal ty)], a) }+-- keyed :: [ (Int, ReactNode sig) ] -> ReactNode sig+-- keyed  -type React ty = ReactT ty Identity-+-- assignKey :: ReactNode sig -> Int -> ReactNode sig+-- assignKey (ComponentElement ( -instance (Monad m, Monoid a) => Monoid (ReactT ty m a) where-    mempty = ReactT $ \_ -> return ([], mempty)-    mappend f1 f2 = ReactT $ \anim -> do-        ~(c1, a) <- runReactT f1 anim-        ~(c2, b) <- runReactT f2 anim-        return (c1 <> c2, a <> b)+-- TODO use phantom type to indicate renderability? Only sequence is not.+data ReactNode sig+    = ComponentElement (ReactComponentElement sig)+    | DomElement (ReactDOMElement sig) +    | forall props. ToJSRef props =>+        ForeignClass (ImportedClass props sig) props (ReactNode sig) -instance Monad m => Functor (ReactT ty m) where-    fmap = liftM+    | NodeText Text+    | NodeSequence [ReactNode sig]+    | forall insig. LocalNode (insig -> sig) (ReactNode insig)  -instance Monad m => Applicative (ReactT ty m) where-    pure = return-    (<*>) = ap-+instance Monoid (ReactNode sig) where+    mempty = NodeSequence [] -instance (Monad m, a ~ ()) => IsString (ReactT ty m a) where-    fromString str = ReactT $ \_ -> return ([Text str], ())+    (NodeSequence xs) `mappend` (NodeSequence ys) = NodeSequence (xs <> ys)+    (NodeSequence xs) `mappend` y = NodeSequence (xs <> [y])+    x `mappend` (NodeSequence ys) = NodeSequence (x : ys)+    x `mappend` y = NodeSequence [x, y]  -instance Monad m => Monad (ReactT ty m) where-    return a = ReactT $ \_ -> return ([], a)-    m >>= f = ReactT $ \anim -> do-        ~(c1, a) <- runReactT m anim-        ~(c2, b) <- runReactT (f a) anim-        return (c1 <> c2, b)+instance IsString (ReactNode sig) where+    fromString str = NodeText (fromString str)  --- attributes- data AttrOrHandler signal-    = StaticAttr JSString JSON+    = StaticAttr Text JSON     | Handler (EventHandler signal)  -mkStaticAttr :: JSString -> (a -> JSON) -> a -> AttrOrHandler signal-mkStaticAttr name f a = StaticAttr name (f a)---mkEventHandler :: (NFData signal)-               => (RawEvent -> signal)-               -> EvtType-               -> (signal -> Maybe signal')-               -> AttrOrHandler signal'-mkEventHandler unNative ty handle =-    -- important - you must deepseq the event immediately - otherwise-    -- react's pooling will collect and destroy it.-    let handle' raw = handle $!! unNative raw-    in Handler (EventHandler handle' ty)---separateAttrs :: [AttrOrHandler signal] -> ([EventHandler signal], Attrs)-separateAttrs [] = ([], [])-separateAttrs ((StaticAttr k v):xs) =-    let (hs, as) = separateAttrs xs in (hs, (k, v):as)-separateAttrs ((Handler h):xs) =-    let (hs, as) = separateAttrs xs in (h:hs, as)----- terms---- | Parent nodes always take children, but can also optionally take a list--- of arguments.------ Example of the first case, which exercises the simpler instance:------ @--- div_ $ ... children ...--- @------ Example of the second, which exercises the more complicated instance:------ @--- span_ [class_ "example"] $ ... children ...--- @-class TermParent result where-    -- | The argument to a parent term is either:-    ---    -- * a list of attributes (@[AttrOrHandler (Signal ty)]@), which leads-    --   to a result type of @ReactT ty m a -> ReactT ty m a@.-    ---    -- * or children (@ReactT ty m a@), which leads to a result type of-    --   @ReactT ty m a@.-    type TermParentArg result :: *--    termParent :: JSString -> TermParentArg result -> result---instance (Monad m, f ~ ReactT ty m a) => TermParent (f -> ReactT ty m a) where-    type TermParentArg (f -> ReactT ty m a) = [AttrOrHandler (Signal ty)]--    termParent name attrs children = ReactT $ \anim -> do-        ~(childNodes, a) <- runReactT children anim-        let (hs, as) = separateAttrs attrs-        return ([Parent name as hs childNodes], a)---instance Monad m => TermParent (ReactT ty m a) where-    type TermParentArg (ReactT ty m a) = ReactT ty m a--    termParent name children = ReactT $ \anim -> do-        ~(childNodes, a) <- runReactT children anim-        return ([Parent name [] [] childNodes], a)+data ReactComponentElement exsig = forall props state insig ctx.+    ReactComponentElement+    { reComType :: ReactClass props state insig exsig ctx+    , reComChildren :: ReactNode insig+    , reComKey :: Maybe JSString+    , reComRef :: Maybe JSString +    -- Props are stored here, not used until `render`, because we need both the+    -- props and state at the same time.+    , reComProps :: props -termLeaf :: (Monad m, sig ~ Signal ty)-         => JSString-         -> [AttrOrHandler sig]-         -> ReactT ty m ()-termLeaf name attrs = ReactT $ \_ -> do-    let (hs, as) = separateAttrs attrs-    return ([Leaf name as hs], ())+    -- We can't store the class id here because we don't know it until *after*+    -- render has run! It's not allocated until componentWillMount.+    -- , reComClassId :: Int+    }  --- | Low level properties common to all events-data EventProperties e =-  EventProperties { bubbles :: !Bool-                  , cancelable :: !Bool-                  , currentTarget :: !e -- NativeElem-                  , defaultPrevented :: !Bool-                  , eventPhase :: !Int-                  , isTrusted :: !Bool-                    -- ,  nativeEvent :: DOMEvent-                    -- , preventDefault :: IO ()-                    -- ,  stopPropagation :: IO ()-                  , evtTarget :: !e -- NativeElem-                    --, timeStamp :: Date-                  , eventType :: !JSString -- type-                  }--instance NFData e => NFData (EventProperties e) where-    rnf (EventProperties a b c d e f g h) =-        a `seq` b `seq` c `seq` d `seq` e `seq` f `seq` g `seq` h `seq` ()--data ModifierKeys =-  ModifierKeys { altKey :: !Bool-               , ctrlKey :: !Bool-               , metaKey :: !Bool-               , shiftKey :: !Bool-               } deriving (Eq, Show)--instance NFData ModifierKeys where-    rnf (ModifierKeys a b c d) = a `seq` b `seq` c `seq` d `seq` ()--data MouseEvent =-  MouseEvent { -- mouseEventProperties :: !(EventProperties e)-               mouseModifierKeys :: !ModifierKeys-             , buttonNum :: !Int -- "button"-               -- , buttons :: Int-             , clientX :: !Double-             , clientY :: !Double-             , pageX :: !Double-             , pageY :: !Double-               -- , relatedTarget :: Unpacked-             , screenX :: !Double-             , screenY :: !Double-             } deriving Show--instance NFData MouseEvent where-    rnf (MouseEvent a b c d e f g h) =-        a `seq` b `seq` c `seq` d `seq` e `seq` f `seq` g `seq` h `seq` ()--data KeyboardEvent =-  KeyboardEvent { -- keyboardEventProperties :: ! (EventProperties e)-                  keyboardModifierKeys :: !ModifierKeys-                , charCode :: !Int-                , key :: !JSString-                , keyCode :: !Int-                , locale :: !JSString-                , location :: !Int-                , repeat :: !Bool-                , which :: !Int-                } deriving Show--instance NFData KeyboardEvent where-    rnf (KeyboardEvent a b c d e f g h) =-        a `seq` b `seq` c `seq` d `seq` e `seq` f `seq` g `seq` h `seq` ()--newtype ChangeEvent = ChangeEvent { targetValue :: JSString } deriving Show--instance NFData ChangeEvent where-    rnf e@(ChangeEvent str) = str `seq` ()--data FocusEvent e =-  FocusEvent { -- focusEventProperties :: ! (EventProperties e)-               domEventTarget :: !e -- NativeElem-             , relatedTarget :: !e -- NativeElem-             }--instance NFData e => NFData (FocusEvent e) where-    rnf (FocusEvent a b) = a `seq` b `seq` ()+data ReactDOMElement sig = ReactDOMElement+    { reDomType :: JSString+    , reDomProps :: [AttrOrHandler sig]+    , reDomChildren :: ReactNode sig+    , reDomKey :: Maybe JSString+    , reDomRef :: Maybe JSString+    }