master 58850495f448 cached
11 files
1.3 MB
338.1k tokens
681 symbols
1 requests
Download .txt
Showing preview only (1,408K chars total). Download the full file or copy to clipboard to get everything.
Repository: claudiopro/react-fiber-vs-stack-demo
Branch: master
Commit: 58850495f448
Files: 11
Total size: 1.3 MB

Directory structure:
gitextract_5yj4vl_y/

├── LICENSE
├── LICENSE-react
├── LICENSE-react-examples
├── README.md
├── css/
│   └── base.css
├── fiber.html
├── index.html
├── js/
│   ├── react-dom-fiber.js
│   ├── react-dom.js
│   └── react.js
└── stack.html

================================================
FILE CONTENTS
================================================

================================================
FILE: LICENSE
================================================
Copyright (c) 2017 Claudio Procida

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

================================================
FILE: LICENSE-react
================================================
BSD License

For React software

Copyright (c) 2013-present, Facebook, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.

 * Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

 * Neither the name Facebook nor the names of its contributors may be used to
   endorse or promote products derived from this software without specific
   prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: LICENSE-react-examples
================================================
The examples provided by Facebook are for non-commercial testing and evaluation
purposes only. Facebook reserves all rights not expressly granted.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.



================================================
FILE: README.md
================================================
# React Fiber vs Stack Demo

This demo shows the differences between Stack and Fiber by rendering a Sierpinski triangle that constantly shrinks and grows, and whose nodes have a value that increments by one every second.

Used as a demo during the ReactJS Dublin Lightning Talks meetup of February 22nd 2017.

## License

[MIT](https://opensource.org/licenses/MIT)

Copyright (c) 2017 Claudio Procida

React and Fiber example Copyright (c) 2013-present, Facebook, Inc.
All rights reserved.


================================================
FILE: css/base.css
================================================
body {
  background: #fff;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 15px;
  line-height: 1.7;
  margin: 0;
  padding: 30px;
}

a {
  color: #4183c4;
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

code {
  background-color: #f8f8f8;
  border: 1px solid #ddd;
  border-radius: 3px;
  font-family: "Bitstream Vera Sans Mono", Consolas, Courier, monospace;
  font-size: 12px;
  margin: 0 2px;
  padding: 0px 5px;
}

h1, h2, h3, h4 {
  font-weight: bold;
  margin: 0 0 15px;
  padding: 0;
}

h1 {
  border-bottom: 1px solid #ddd;
  font-size: 2.5em;
  font-weight: bold;
  margin: 0 0 15px;
  padding: 0;
}

h2 {
  border-bottom: 1px solid #eee;
  font-size: 2em;
}

h3 {
  font-size: 1.5em;
}

h4 {
  font-size: 1.2em;
}

p, ul {
  margin: 15px 0;
}

ul {
  padding-left: 30px;
}


================================================
FILE: fiber.html
================================================
<!DOCTYPE html>
<html style="width: 100%; height: 100%; overflow: hidden">
  <head>
    <meta charset="utf-8">
    <title>Fiber Example</title>
    <link rel="stylesheet" href="css/base.css" />
  </head>
  <body>
    <h1>Fiber Example</h1>
    <div id="container">
      <p>
        To install React, follow the instructions on
        <a href="https://github.com/facebook/react/">GitHub</a>.
      </p>
      <p>
        If you can see this, React is <strong>not</strong> working right.
        If you checked out the source from GitHub make sure to run <code>grunt</code>.
      </p>
    </div>
    <script src="js/react.js"></script>
    <script src="js/react-dom-fiber.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js"></script>
    <script type="text/babel">
      var dotStyle = {
        position: 'absolute',
        background: '#61dafb',
        font: 'normal 15px sans-serif',
        textAlign: 'center',
        cursor: 'pointer',
      };

      var containerStyle = {
        position: 'absolute',
        transformOrigin: '0 0',
        left: '50%',
        top: '50%',
        width: '10px',
        height: '10px',
        background: '#eee',
      };

      var targetSize = 25;

      class Dot extends React.Component {
        constructor() {
          super();
          this.state = { hover: false };
        }
        enter() {
          this.setState({
            hover: true
          });
        }
        leave() {
          this.setState({
            hover: false
          });
        }
        render() {
          var props = this.props;
          var s = props.size * 1.3;
          var style = {
            ...dotStyle,
            width: s + 'px',
            height: s + 'px',
            left: (props.x) + 'px',
            top: (props.y) + 'px',
            borderRadius: (s / 2) + 'px',
            lineHeight: (s) + 'px',
            background: this.state.hover ? '#ff0' : dotStyle.background
          };
          return (
            <div style={style} onMouseEnter={() => this.enter()} onMouseLeave={() => this.leave()}>
              {this.state.hover ? '*' + props.text + '*' : props.text}
            </div>
          );
        }
      }

      function SierpinskiTriangle({ x, y, s, children }) {
        if (s <= targetSize) {
          return (
            <Dot
              x={x - (targetSize / 2)}
              y={y - (targetSize / 2)}
              size={targetSize}
              text={children}
            />
          );
          return r;
        }
        var newSize = s / 2;
        var slowDown = true;
        if (slowDown) {
          var e = performance.now() + 0.8;
          while (performance.now() < e) {
            // Artificially long execution time.
          }
        }

        s /= 2;

        return [
          <SierpinskiTriangle x={x} y={y - (s / 2)} s={s}>
            {children}
          </SierpinskiTriangle>,
          <SierpinskiTriangle x={x - s} y={y + (s / 2)} s={s}>
            {children}
          </SierpinskiTriangle>,
          <SierpinskiTriangle x={x + s} y={y + (s / 2)} s={s}>
            {children}
          </SierpinskiTriangle>,
        ];
      }
      SierpinskiTriangle.shouldComponentUpdate = function(oldProps, newProps) {
        var o = oldProps;
        var n = newProps;
        return !(
          o.x === n.x &&
          o.y === n.y &&
          o.s === n.s &&
          o.children === n.children
        );
      };

      class ExampleApplication extends React.Component {
        constructor() {
          super();
          this.state = { seconds: 0 };
          this.tick = this.tick.bind(this);
        }
        componentDidMount() {
          this.intervalID = setInterval(this.tick, 1000);
        }
        tick() {
          ReactDOMFiber.unstable_deferredUpdates(() =>
            this.setState(state => ({ seconds: (state.seconds % 10) + 1 }))
          );
        }
        componentWillUnmount() {
          clearInterval(this.intervalID);
        }
        render() {
          const seconds = this.state.seconds;
          const elapsed = this.props.elapsed;
          const t = (elapsed / 1000) % 10;
          const scale = 1 + (t > 5 ? 10 - t : t) / 10;
          const transform = 'scaleX(' + (scale / 2.1) + ') scaleY(0.7) translateZ(0.1px)';
          return (
            <div style={{ ...containerStyle, transform }}>
              <div>
                <SierpinskiTriangle x={0} y={0} s={1000}>
                  {this.state.seconds}
                </SierpinskiTriangle>
              </div>
            </div>
          );
        }
      }

      var start = new Date().getTime();
      function update() {
        ReactDOMFiber.render(
          <ExampleApplication elapsed={new Date().getTime() - start} />,
          document.getElementById('container')
        );
        requestAnimationFrame(update);
      }
      requestAnimationFrame(update);
    </script>
  </body>
</html>


================================================
FILE: index.html
================================================
<!DOCTYPE html>
<html style="width: 100%; height: 100%; overflow: hidden">
  <head>
    <meta charset="utf-8">
    <title>Fiber vs Stack Demo</title>
    <link rel="stylesheet" href="css/base.css" />
  </head>
  <body>
    <h1>Fiber vs Stack Demo</h1>
    <div id="container">
      <p>
        This demo shows the differences between Stack and Fiber by rendering a Sierpinski triangle
        that constantly shrinks and grows, and whose nodes have a value that increments by one every second.
      </p>
      <ul>
        <li><a href="fiber.html">Fiber Example</a></li>
        <li><a href="stack.html">Stack Example</a></li>
      </ul>
  </body>
</html>


================================================
FILE: js/react-dom-fiber.js
================================================
 /**
  * ReactDOMFiber v16.0.0-alpha.2
  */

;(function(f) {
  // CommonJS
  if (typeof exports === "object" && typeof module !== "undefined") {
    module.exports = f(require('react'));

  // RequireJS
  } else if (typeof define === "function" && define.amd) {
    define(['react'], f);

  // <script>
  } else {
    var g;
    if (typeof window !== "undefined") {
      g = window;
    } else if (typeof global !== "undefined") {
      g = global;
    } else if (typeof self !== "undefined") {
      g = self;
    } else {
      // works providing we're not in "use strict";
      // needed for Java 8 Nashorn
      // see https://github.com/facebook/react/issues/3037
      g = this;
    }
    g.ReactDOMFiber = f(g.React);
  }
})(function(React) {
  return (function(f){return 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-present, 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.
 *
 */

'use strict';

var ARIADOMPropertyConfig = {
  Properties: {
    // Global States and Properties
    'aria-current': 0, // state
    'aria-details': 0,
    'aria-disabled': 0, // state
    'aria-hidden': 0, // state
    'aria-invalid': 0, // state
    'aria-keyshortcuts': 0,
    'aria-label': 0,
    'aria-roledescription': 0,
    // Widget Attributes
    'aria-autocomplete': 0,
    'aria-checked': 0,
    'aria-expanded': 0,
    'aria-haspopup': 0,
    'aria-level': 0,
    'aria-modal': 0,
    'aria-multiline': 0,
    'aria-multiselectable': 0,
    'aria-orientation': 0,
    'aria-placeholder': 0,
    'aria-pressed': 0,
    'aria-readonly': 0,
    'aria-required': 0,
    'aria-selected': 0,
    'aria-sort': 0,
    'aria-valuemax': 0,
    'aria-valuemin': 0,
    'aria-valuenow': 0,
    'aria-valuetext': 0,
    // Live Region Attributes
    'aria-atomic': 0,
    'aria-busy': 0,
    'aria-live': 0,
    'aria-relevant': 0,
    // Drag-and-Drop Attributes
    'aria-dropeffect': 0,
    'aria-grabbed': 0,
    // Relationship Attributes
    'aria-activedescendant': 0,
    'aria-colcount': 0,
    'aria-colindex': 0,
    'aria-colspan': 0,
    'aria-controls': 0,
    'aria-describedby': 0,
    'aria-errormessage': 0,
    'aria-flowto': 0,
    'aria-labelledby': 0,
    'aria-owns': 0,
    'aria-posinset': 0,
    'aria-rowcount': 0,
    'aria-rowindex': 0,
    'aria-rowspan': 0,
    'aria-setsize': 0
  },
  DOMAttributeNames: {},
  DOMPropertyNames: {}
};

module.exports = ARIADOMPropertyConfig;
},{}],2:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present 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.
 *
 */

'use strict';

var EventPropagators = _dereq_(14);
var ExecutionEnvironment = _dereq_(120);
var FallbackCompositionState = _dereq_(15);
var SyntheticCompositionEvent = _dereq_(79);
var SyntheticInputEvent = _dereq_(83);

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);

// Events and their corresponding property names.
var eventTypes = {
  beforeInput: {
    phasedRegistrationNames: {
      bubbled: 'onBeforeInput',
      captured: 'onBeforeInputCapture'
    },
    dependencies: ['topCompositionEnd', 'topKeyPress', 'topTextInput', 'topPaste']
  },
  compositionEnd: {
    phasedRegistrationNames: {
      bubbled: 'onCompositionEnd',
      captured: 'onCompositionEndCapture'
    },
    dependencies: ['topBlur', 'topCompositionEnd', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']
  },
  compositionStart: {
    phasedRegistrationNames: {
      bubbled: 'onCompositionStart',
      captured: 'onCompositionStartCapture'
    },
    dependencies: ['topBlur', 'topCompositionStart', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']
  },
  compositionUpdate: {
    phasedRegistrationNames: {
      bubbled: 'onCompositionUpdate',
      captured: 'onCompositionUpdateCapture'
    },
    dependencies: ['topBlur', 'topCompositionUpdate', 'topKeyDown', 'topKeyPress', 'topKeyUp', '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 'topCompositionStart':
      return eventTypes.compositionStart;
    case 'topCompositionEnd':
      return eventTypes.compositionEnd;
    case '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 === '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 'topKeyUp':
      // Command keys insert or clear IME input.
      return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
    case 'topKeyDown':
      // Expect IME keyCode on each keydown. If we get any other
      // code we must have exited earlier.
      return nativeEvent.keyCode !== START_KEYCODE;
    case 'topKeyPress':
    case 'topMouseDown':
    case '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;

/**
 * @return {?object} A SyntheticCompositionEvent.
 */
function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
  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(nativeEventTarget);
    } else if (eventType === eventTypes.compositionEnd) {
      if (currentComposition) {
        fallbackData = currentComposition.getData();
      }
    }
  }

  var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);

  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 'topCompositionEnd':
      return getDataFromCustomEvent(nativeEvent);
    case '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 '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 composition event is available, we extract a string only at
  // compositionevent, otherwise extract it at fallback events.
  if (currentComposition) {
    if (topLevelType === 'topCompositionEnd' || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {
      var chars = currentComposition.getData();
      FallbackCompositionState.release(currentComposition);
      currentComposition = null;
      return chars;
    }
    return null;
  }

  switch (topLevelType) {
    case '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 '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 'topCompositionEnd':
      return useFallbackCompositionData ? null : nativeEvent.data;
    default:
      return null;
  }
}

/**
 * Extract a SyntheticInputEvent for `beforeInput`, based on either native
 * `textInput` or fallback behavior.
 *
 * @return {?object} A SyntheticInputEvent.
 */
function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
  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, targetInst, nativeEvent, nativeEventTarget);

  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,

  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
    return [extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget)];
  }
};

module.exports = BeforeInputEventPlugin;
},{"120":120,"14":14,"15":15,"79":79,"83":83}],3:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

/**
 * CSS properties which accept numbers but are not in units of "px".
 */

var isUnitlessNumber = {
  animationIterationCount: true,
  borderImageOutset: true,
  borderImageSlice: true,
  borderImageWidth: true,
  boxFlex: true,
  boxFlexGroup: true,
  boxOrdinalGroup: true,
  columnCount: true,
  flex: true,
  flexGrow: true,
  flexPositive: true,
  flexShrink: true,
  flexNegative: true,
  flexOrder: true,
  gridRow: true,
  gridColumn: true,
  fontWeight: true,
  lineClamp: true,
  lineHeight: true,
  opacity: true,
  order: true,
  orphans: true,
  tabSize: true,
  widows: true,
  zIndex: true,
  zoom: true,

  // SVG-related properties
  fillOpacity: true,
  floodOpacity: true,
  stopOpacity: true,
  strokeDasharray: true,
  strokeDashoffset: true,
  strokeMiterlimit: 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: {
    backgroundAttachment: true,
    backgroundColor: true,
    backgroundImage: true,
    backgroundPositionX: true,
    backgroundPositionY: true,
    backgroundRepeat: true
  },
  backgroundPosition: {
    backgroundPositionX: true,
    backgroundPositionY: 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
  },
  outline: {
    outlineWidth: true,
    outlineStyle: true,
    outlineColor: true
  }
};

var CSSProperty = {
  isUnitlessNumber: isUnitlessNumber,
  shorthandPropertyExpansions: shorthandPropertyExpansions
};

module.exports = CSSProperty;
},{}],4:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var CSSProperty = _dereq_(3);
var ExecutionEnvironment = _dereq_(120);

var camelizeStyleName = _dereq_(122);
var dangerousStyleValue = _dereq_(94);
var getComponentName = _dereq_(98);
var hyphenateStyleName = _dereq_(130);
var memoizeStringOnly = _dereq_(134);
var warning = _dereq_(138);

if ("development" !== 'production') {
  var _require = _dereq_(38),
      getCurrentFiberOwnerName = _require.getCurrentFiberOwnerName;
}

var processStyleName = memoizeStringOnly(function (styleName) {
  return hyphenateStyleName(styleName);
});

var hasShorthandPropertyBug = false;
var styleFloatAccessor = 'cssFloat';
if (ExecutionEnvironment.canUseDOM) {
  var tempStyle = document.createElement('div').style;
  try {
    // IE8 throws "Invalid argument." if resetting shorthand style properties.
    tempStyle.font = '';
  } catch (e) {
    hasShorthandPropertyBug = true;
  }
  // IE8 only supports accessing cssFloat (standard) as styleFloat
  if (document.documentElement.style.cssFloat === undefined) {
    styleFloatAccessor = 'styleFloat';
  }
}

if ("development" !== 'production') {
  // '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 warnedForNaNValue = false;

  var warnHyphenatedStyleName = function (name, owner) {
    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
      return;
    }

    warnedStyleNames[name] = true;
    "development" !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?%s', name, camelizeStyleName(name), checkRenderMessage(owner)) : void 0;
  };

  var warnBadVendoredStyleName = function (name, owner) {
    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
      return;
    }

    warnedStyleNames[name] = true;
    "development" !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?%s', name, name.charAt(0).toUpperCase() + name.slice(1), checkRenderMessage(owner)) : void 0;
  };

  var warnStyleValueWithSemicolon = function (name, value, owner) {
    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
      return;
    }

    warnedStyleValues[value] = true;
    "development" !== 'production' ? warning(false, 'Style property values shouldn\'t contain a semicolon.%s ' + 'Try "%s: %s" instead.', checkRenderMessage(owner), name, value.replace(badStyleValueWithSemicolonPattern, '')) : void 0;
  };

  var warnStyleValueIsNaN = function (name, value, owner) {
    if (warnedForNaNValue) {
      return;
    }

    warnedForNaNValue = true;
    "development" !== 'production' ? warning(false, '`NaN` is an invalid value for the `%s` css style property.%s', name, checkRenderMessage(owner)) : void 0;
  };

  var checkRenderMessage = function (owner) {
    var ownerName;
    if (owner != null) {
      // Stack passes the owner manually all the way to CSSPropertyOperations.
      ownerName = getComponentName(owner);
    } else {
      // Fiber doesn't pass it but uses ReactDebugCurrentFiber to track it.
      // It is only enabled in development and tracks host components too.
      ownerName = getCurrentFiberOwnerName();
      // TODO: also report the stack.
    }
    if (ownerName) {
      return '\n\nCheck the render method of `' + ownerName + '`.';
    }
    return '';
  };

  /**
   * @param {string} name
   * @param {*} value
   * @param {ReactDOMComponent} component
   */
  var warnValidStyle = function (name, value, component) {
    var owner;
    if (component) {
      owner = component._currentElement._owner;
    }
    if (name.indexOf('-') > -1) {
      warnHyphenatedStyleName(name, owner);
    } else if (badVendoredStyleNamePattern.test(name)) {
      warnBadVendoredStyleName(name, owner);
    } else if (badStyleValueWithSemicolonPattern.test(value)) {
      warnStyleValueWithSemicolon(name, value, owner);
    }

    if (typeof value === 'number' && isNaN(value)) {
      warnStyleValueIsNaN(name, value, owner);
    }
  };
}

/**
 * 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
   * @param {ReactDOMComponent} component
   * @return {?string}
   */
  createMarkupForStyles: function (styles, component) {
    var serialized = '';
    for (var styleName in styles) {
      if (!styles.hasOwnProperty(styleName)) {
        continue;
      }
      var styleValue = styles[styleName];
      if ("development" !== 'production') {
        warnValidStyle(styleName, styleValue, component);
      }
      if (styleValue != null) {
        serialized += processStyleName(styleName) + ':';
        serialized += dangerousStyleValue(styleName, styleValue, component) + ';';
      }
    }
    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
   * @param {ReactDOMComponent} component
   */
  setValueForStyles: function (node, styles, component) {
    var style = node.style;
    for (var styleName in styles) {
      if (!styles.hasOwnProperty(styleName)) {
        continue;
      }
      if ("development" !== 'production') {
        warnValidStyle(styleName, styles[styleName], component);
      }
      var styleValue = dangerousStyleValue(styleName, styles[styleName], component);
      if (styleName === 'float' || styleName === 'cssFloat') {
        styleName = styleFloatAccessor;
      }
      if (styleValue) {
        style[styleName] = styleValue;
      } else {
        var expansion = hasShorthandPropertyBug && 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;
},{"120":120,"122":122,"130":130,"134":134,"138":138,"3":3,"38":38,"94":94,"98":98}],5:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var EventPluginHub = _dereq_(11);
var EventPropagators = _dereq_(14);
var ExecutionEnvironment = _dereq_(120);
var ReactControlledComponent = _dereq_(20);
var ReactDOMComponentTree = _dereq_(24);
var ReactGenericBatching = _dereq_(61);
var SyntheticEvent = _dereq_(81);

var inputValueTracking = _dereq_(108);
var getEventTarget = _dereq_(103);
var isEventSupported = _dereq_(109);
var isTextInputElement = _dereq_(110);

var eventTypes = {
  change: {
    phasedRegistrationNames: {
      bubbled: 'onChange',
      captured: 'onChangeCapture'
    },
    dependencies: ['topBlur', 'topChange', 'topClick', 'topFocus', 'topInput', 'topKeyDown', 'topKeyUp', 'topSelectionChange']
  }
};

function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
  var event = SyntheticEvent.getPooled(eventTypes.change, inst, nativeEvent, target);
  event.type = 'change';
  // Flag this event loop as needing state restore.
  ReactControlledComponent.enqueueStateRestore(target);
  EventPropagators.accumulateTwoPhaseDispatches(event);
  return event;
}
/**
 * For IE shims
 */
var activeElement = null;
var activeElementInst = null;

/**
 * SECTION: handle `change` event
 */
function shouldUseChangeEvent(elem) {
  var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
  return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
}

var doesChangeEventBubble = false;
if (ExecutionEnvironment.canUseDOM) {
  // See `handleChange` comment below
  doesChangeEventBubble = isEventSupported('change') && (!document.documentMode || document.documentMode > 8);
}

function manualDispatchChangeEvent(nativeEvent) {
  var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent));

  // 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.
  ReactGenericBatching.batchedUpdates(runEventInBatch, event);
}

function runEventInBatch(event) {
  EventPluginHub.enqueueEvents(event);
  EventPluginHub.processEventQueue(false);
}

function startWatchingForChangeEventIE8(target, targetInst) {
  activeElement = target;
  activeElementInst = targetInst;
  activeElement.attachEvent('onchange', manualDispatchChangeEvent);
}

function stopWatchingForChangeEventIE8() {
  if (!activeElement) {
    return;
  }
  activeElement.detachEvent('onchange', manualDispatchChangeEvent);
  activeElement = null;
  activeElementInst = null;
}

function getInstIfValueChanged(targetInst) {
  if (inputValueTracking.updateValueIfChanged(targetInst)) {
    return targetInst;
  }
}

function getTargetInstForChangeEvent(topLevelType, targetInst) {
  if (topLevelType === 'topChange') {
    return targetInst;
  }
}

function handleEventsForChangeEventIE8(topLevelType, target, targetInst) {
  if (topLevelType === 'topFocus') {
    // stopWatching() should be a noop here but we call it just in case we
    // missed a blur event somehow.
    stopWatchingForChangeEventIE8();
    startWatchingForChangeEventIE8(target, targetInst);
  } else if (topLevelType === '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') && (!document.documentMode || document.documentMode > 9);
}

/**
 * (For IE <=9) 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, targetInst) {
  activeElement = target;
  activeElementInst = targetInst;
  activeElement.attachEvent('onpropertychange', handlePropertyChange);
}

/**
 * (For IE <=9) Removes the event listeners from the currently-tracked element,
 * if any exists.
 */
function stopWatchingForValueChange() {
  if (!activeElement) {
    return;
  }
  activeElement.detachEvent('onpropertychange', handlePropertyChange);
  activeElement = null;
  activeElementInst = null;
}

/**
 * (For IE <=9) 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;
  }
  if (getInstIfValueChanged(activeElementInst)) {
    manualDispatchChangeEvent(nativeEvent);
  }
}

function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {
  if (topLevelType === '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(target, targetInst);
  } else if (topLevelType === 'topBlur') {
    stopWatchingForValueChange();
  }
}

// For IE8 and IE9.
function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {
  if (topLevelType === 'topSelectionChange' || topLevelType === 'topKeyUp' || topLevelType === '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.
    return getInstIfValueChanged(activeElementInst);
  }
}

/**
 * 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.
  var nodeName = elem.nodeName;
  return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
}

function getTargetInstForClickEvent(topLevelType, targetInst) {
  if (topLevelType === 'topClick') {
    return getInstIfValueChanged(targetInst);
  }
}

function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {
  if (topLevelType === 'topInput' || topLevelType === 'topChange') {
    return getInstIfValueChanged(targetInst);
  }
}

/**
 * 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,

  _isInputEventSupported: isInputEventSupported,

  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
    var targetNode = targetInst ? ReactDOMComponentTree.getNodeFromInstance(targetInst) : window;

    var getTargetInstFunc, handleEventFunc;
    if (shouldUseChangeEvent(targetNode)) {
      if (doesChangeEventBubble) {
        getTargetInstFunc = getTargetInstForChangeEvent;
      } else {
        handleEventFunc = handleEventsForChangeEventIE8;
      }
    } else if (isTextInputElement(targetNode)) {
      if (isInputEventSupported) {
        getTargetInstFunc = getTargetInstForInputOrChangeEvent;
      } else {
        getTargetInstFunc = getTargetInstForInputEventPolyfill;
        handleEventFunc = handleEventsForInputEventPolyfill;
      }
    } else if (shouldUseClickEvent(targetNode)) {
      getTargetInstFunc = getTargetInstForClickEvent;
    }

    if (getTargetInstFunc) {
      var inst = getTargetInstFunc(topLevelType, targetInst);
      if (inst) {
        var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);
        return event;
      }
    }

    if (handleEventFunc) {
      handleEventFunc(topLevelType, targetNode, targetInst);
    }
  }

};

module.exports = ChangeEventPlugin;
},{"103":103,"108":108,"109":109,"11":11,"110":110,"120":120,"14":14,"20":20,"24":24,"61":61,"81":81}],6:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

/**
 * 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 DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];

module.exports = DOMEventPluginOrder;
},{}],7:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var DOMNamespaces = {
  html: 'http://www.w3.org/1999/xhtml',
  mathml: 'http://www.w3.org/1998/Math/MathML',
  svg: 'http://www.w3.org/2000/svg'
};

module.exports = DOMNamespaces;
},{}],8:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var _prodInvariant = _dereq_(112);

var invariant = _dereq_(131);

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_PROPERTY: 0x1,
  HAS_BOOLEAN_VALUE: 0x4,
  HAS_NUMERIC_VALUE: 0x8,
  HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8,
  HAS_OVERLOADED_BOOLEAN_VALUE: 0x20,

  /**
   * 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.
   *
   * DOMAttributeNamespaces: object mapping React attribute name to the DOM
   * attribute namespace URL. (Attribute names not specified use no namespace.)
   *
   * 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 Injection = DOMPropertyInjection;
    var Properties = domPropertyConfig.Properties || {};
    var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};
    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) {
      !!DOMProperty.properties.hasOwnProperty(propName) ? "development" !== 'production' ? invariant(false, '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) : _prodInvariant('48', propName) : void 0;

      var lowerCased = propName.toLowerCase();
      var propConfig = Properties[propName];

      var propertyInfo = {
        attributeName: lowerCased,
        attributeNamespace: null,
        propertyName: propName,
        mutationMethod: null,

        mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),
        hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),
        hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),
        hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),
        hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE)
      };
      !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? "development" !== 'production' ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s', propName) : _prodInvariant('50', propName) : void 0;

      if ("development" !== 'production') {
        DOMProperty.getPossibleStandardName[lowerCased] = propName;
      }

      if (DOMAttributeNames.hasOwnProperty(propName)) {
        var attributeName = DOMAttributeNames[propName];
        propertyInfo.attributeName = attributeName;
        if ("development" !== 'production') {
          DOMProperty.getPossibleStandardName[attributeName] = propName;
        }
      }

      if (DOMAttributeNamespaces.hasOwnProperty(propName)) {
        propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];
      }

      if (DOMPropertyNames.hasOwnProperty(propName)) {
        propertyInfo.propertyName = DOMPropertyNames[propName];
      }

      if (DOMMutationMethods.hasOwnProperty(propName)) {
        propertyInfo.mutationMethod = DOMMutationMethods[propName];
      }

      DOMProperty.properties[propName] = propertyInfo;
    }
  }
};

/* eslint-disable max-len */
var ATTRIBUTE_NAME_START_CHAR = ':A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD';
/* eslint-enable max-len */

/**
 * 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',
  ROOT_ATTRIBUTE_NAME: 'data-reactroot',

  ATTRIBUTE_NAME_START_CHAR: ATTRIBUTE_NAME_START_CHAR,
  ATTRIBUTE_NAME_CHAR: ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040',

  /**
   * Map from property "standard name" to an object with info about how to set
   * the property in the DOM. Each object contains:
   *
   * attributeName:
   *   Used when rendering markup or with `*Attribute()`.
   * attributeNamespace
   * propertyName:
   *   Used on DOM node instances. (This includes properties that mutate due to
   *   external factors.)
   * mutationMethod:
   *   If non-null, used instead of the property or `setAttribute()` after
   *   initial render.
   * mustUseProperty:
   *   Whether the property must be accessed and mutated as an object property.
   * hasBooleanValue:
   *   Whether the property should be removed when set to a falsey value.
   * hasNumericValue:
   *   Whether the property must be numeric or parse as a numeric and should be
   *   removed when set to a falsey value.
   * hasPositiveNumericValue:
   *   Whether the property must be positive numeric or parse as a positive
   *   numeric and should be removed when set to a falsey value.
   * hasOverloadedBooleanValue:
   *   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.
   */
  properties: {},

  /**
   * Mapping from lowercase property names to the properly cased version, used
   * to warn in the case of missing properties. Available only in __DEV__.
   *
   * autofocus is predefined, because adding it to the property whitelist
   * causes unintended side effects.
   *
   * @type {Object}
   */
  getPossibleStandardName: "development" !== 'production' ? { autofocus: 'autoFocus' } : null,

  /**
   * 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;
  },

  injection: DOMPropertyInjection
};

module.exports = DOMProperty;
},{"112":112,"131":131}],9:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var DOMProperty = _dereq_(8);
var ReactDOMComponentTree = _dereq_(24);
var ReactInstrumentation = _dereq_(65);

var quoteAttributeValueForBrowser = _dereq_(111);
var warning = _dereq_(138);

var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + DOMProperty.ATTRIBUTE_NAME_START_CHAR + '][' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$');
var illegalAttributeNameCache = {};
var validatedAttributeNameCache = {};

function isAttributeNameSafe(attributeName) {
  if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {
    return true;
  }
  if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {
    return false;
  }
  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
    validatedAttributeNameCache[attributeName] = true;
    return true;
  }
  illegalAttributeNameCache[attributeName] = true;
  "development" !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : void 0;
  return false;
}

function shouldIgnoreValue(propertyInfo, value) {
  return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;
}

/**
 * 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);
  },

  setAttributeForID: function (node, id) {
    node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id);
  },

  createMarkupForRoot: function () {
    return DOMProperty.ROOT_ATTRIBUTE_NAME + '=""';
  },

  setAttributeForRoot: function (node) {
    node.setAttribute(DOMProperty.ROOT_ATTRIBUTE_NAME, '');
  },

  /**
   * 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) {
    var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
    if (propertyInfo) {
      if (shouldIgnoreValue(propertyInfo, value)) {
        return '';
      }
      var attributeName = propertyInfo.attributeName;
      if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
        return attributeName + '=""';
      }
      return attributeName + '=' + quoteAttributeValueForBrowser(value);
    } else if (DOMProperty.isCustomAttribute(name)) {
      if (value == null) {
        return '';
      }
      return name + '=' + quoteAttributeValueForBrowser(value);
    }
    return null;
  },

  /**
   * Creates markup for a custom property.
   *
   * @param {string} name
   * @param {*} value
   * @return {string} Markup string, or empty string if the property was invalid.
   */
  createMarkupForCustomAttribute: function (name, value) {
    if (!isAttributeNameSafe(name) || value == null) {
      return '';
    }
    return name + '=' + quoteAttributeValueForBrowser(value);
  },

  /**
   * Sets the value for a property on a node.
   *
   * @param {DOMElement} node
   * @param {string} name
   * @param {*} value
   */
  setValueForProperty: function (node, name, value) {
    var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
    if (propertyInfo) {
      var mutationMethod = propertyInfo.mutationMethod;
      if (mutationMethod) {
        mutationMethod(node, value);
      } else if (shouldIgnoreValue(propertyInfo, value)) {
        DOMPropertyOperations.deleteValueForProperty(node, name);
        return;
      } else if (propertyInfo.mustUseProperty) {
        // Contrary to `setAttribute`, object properties are properly
        // `toString`ed by IE8/9.
        node[propertyInfo.propertyName] = value;
      } else {
        var attributeName = propertyInfo.attributeName;
        var namespace = propertyInfo.attributeNamespace;
        // `setAttribute` with objects becomes only `[object]` in IE8/9,
        // ('' + value) makes it output the correct toString()-value.
        if (namespace) {
          node.setAttributeNS(namespace, attributeName, '' + value);
        } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
          node.setAttribute(attributeName, '');
        } else {
          node.setAttribute(attributeName, '' + value);
        }
      }
    } else if (DOMProperty.isCustomAttribute(name)) {
      DOMPropertyOperations.setValueForAttribute(node, name, value);
      return;
    }

    if ("development" !== 'production') {
      var payload = {};
      payload[name] = value;
      ReactInstrumentation.debugTool.onHostOperation({
        instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,
        type: 'update attribute',
        payload: payload
      });
    }
  },

  setValueForAttribute: function (node, name, value) {
    if (!isAttributeNameSafe(name)) {
      return;
    }
    if (value == null) {
      node.removeAttribute(name);
    } else {
      node.setAttribute(name, '' + value);
    }

    if ("development" !== 'production') {
      var payload = {};
      payload[name] = value;
      ReactInstrumentation.debugTool.onHostOperation({
        instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,
        type: 'update attribute',
        payload: payload
      });
    }
  },

  /**
   * Deletes an attributes from a node.
   *
   * @param {DOMElement} node
   * @param {string} name
   */
  deleteValueForAttribute: function (node, name) {
    node.removeAttribute(name);
    if ("development" !== 'production') {
      ReactInstrumentation.debugTool.onHostOperation({
        instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,
        type: 'remove attribute',
        payload: name
      });
    }
  },

  /**
   * Deletes the value for a property on a node.
   *
   * @param {DOMElement} node
   * @param {string} name
   */
  deleteValueForProperty: function (node, name) {
    var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
    if (propertyInfo) {
      var mutationMethod = propertyInfo.mutationMethod;
      if (mutationMethod) {
        mutationMethod(node, undefined);
      } else if (propertyInfo.mustUseProperty) {
        var propName = propertyInfo.propertyName;
        if (propertyInfo.hasBooleanValue) {
          node[propName] = false;
        } else {
          node[propName] = '';
        }
      } else {
        node.removeAttribute(propertyInfo.attributeName);
      }
    } else if (DOMProperty.isCustomAttribute(name)) {
      node.removeAttribute(name);
    }

    if ("development" !== 'production') {
      ReactInstrumentation.debugTool.onHostOperation({
        instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID,
        type: 'remove attribute',
        payload: name
      });
    }
  }

};

module.exports = DOMPropertyOperations;
},{"111":111,"138":138,"24":24,"65":65,"8":8}],10:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var EventPropagators = _dereq_(14);
var ReactDOMComponentTree = _dereq_(24);
var SyntheticMouseEvent = _dereq_(85);

var eventTypes = {
  mouseEnter: {
    registrationName: 'onMouseEnter',
    dependencies: ['topMouseOut', 'topMouseOver']
  },
  mouseLeave: {
    registrationName: 'onMouseLeave',
    dependencies: ['topMouseOut', 'topMouseOver']
  }
};

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.
   */
  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
    if (topLevelType === 'topMouseOver' && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
      return null;
    }
    if (topLevelType !== 'topMouseOut' && topLevelType !== 'topMouseOver') {
      // Must not be a mouse in or mouse out - ignoring.
      return null;
    }

    var win;
    if (nativeEventTarget.window === nativeEventTarget) {
      // `nativeEventTarget` is probably a window object.
      win = nativeEventTarget;
    } else {
      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
      var doc = nativeEventTarget.ownerDocument;
      if (doc) {
        win = doc.defaultView || doc.parentWindow;
      } else {
        win = window;
      }
    }

    var from;
    var to;
    if (topLevelType === 'topMouseOut') {
      from = targetInst;
      var related = nativeEvent.relatedTarget || nativeEvent.toElement;
      to = related ? ReactDOMComponentTree.getClosestInstanceFromNode(related) : null;
    } else {
      // Moving to a node from outside the window.
      from = null;
      to = targetInst;
    }

    if (from === to) {
      // Nothing pertains to our managed components.
      return null;
    }

    var fromNode = from == null ? win : ReactDOMComponentTree.getNodeFromInstance(from);
    var toNode = to == null ? win : ReactDOMComponentTree.getNodeFromInstance(to);

    var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, from, nativeEvent, nativeEventTarget);
    leave.type = 'mouseleave';
    leave.target = fromNode;
    leave.relatedTarget = toNode;

    var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, to, nativeEvent, nativeEventTarget);
    enter.type = 'mouseenter';
    enter.target = toNode;
    enter.relatedTarget = fromNode;

    EventPropagators.accumulateEnterLeaveDispatches(leave, enter, from, to);

    return [leave, enter];
  }

};

module.exports = EnterLeaveEventPlugin;
},{"14":14,"24":24,"85":85}],11:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var _prodInvariant = _dereq_(112);

var EventPluginRegistry = _dereq_(12);
var EventPluginUtils = _dereq_(13);
var ReactErrorUtils = _dereq_(41);

var accumulateInto = _dereq_(91);
var forEachAccumulated = _dereq_(97);
var invariant = _dereq_(131);

/**
 * 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.
 * @param {boolean} simulated If the event is simulated (changes exn behavior)
 * @private
 */
var executeDispatchesAndRelease = function (event, simulated) {
  if (event) {
    EventPluginUtils.executeDispatchesInOrder(event, simulated);

    if (!event.isPersistent()) {
      event.constructor.release(event);
    }
  }
};
var executeDispatchesAndReleaseSimulated = function (e) {
  return executeDispatchesAndRelease(e, true);
};
var executeDispatchesAndReleaseTopLevel = function (e) {
  return executeDispatchesAndRelease(e, false);
};

function isInteractive(tag) {
  return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
}

function shouldPreventMouseEvent(name, type, props) {
  switch (name) {
    case 'onClick':
    case 'onClickCapture':
    case 'onDoubleClick':
    case 'onDoubleClickCapture':
    case 'onMouseDown':
    case 'onMouseDownCapture':
    case 'onMouseMove':
    case 'onMouseMoveCapture':
    case 'onMouseUp':
    case 'onMouseUpCapture':
      return !!(props.disabled && isInteractive(type));
    default:
      return false;
  }
}

/**
 * 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 {array} InjectedEventPluginOrder
     * @public
     */
    injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,

    /**
     * @param {object} injectedNamesToPlugins Map from names to plugin modules.
     */
    injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName

  },

  /**
   * @param {object} inst The instance, which is the source of events.
   * @param {string} registrationName Name of listener (e.g. `onClick`).
   * @return {?function} The stored callback.
   */
  getListener: function (inst, registrationName) {
    var listener;

    // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
    // live here; needs to be moved to a better place soon
    if (typeof inst.tag === 'number') {
      var props = EventPluginUtils.getFiberCurrentPropsFromNode(inst.stateNode);
      if (!props) {
        // Work in progress.
        return null;
      }
      listener = props[registrationName];
      if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
        return null;
      }
    } else {
      if (typeof inst._currentElement === 'string') {
        // Text node, let it bubble through.
        return null;
      }
      var _props = inst._currentElement.props;
      listener = _props[registrationName];
      if (shouldPreventMouseEvent(registrationName, inst._currentElement.type, _props)) {
        return null;
      }
    }

    !(!listener || typeof listener === 'function') ? "development" !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : _prodInvariant('94', registrationName, typeof listener) : void 0;
    return listener;
  },

  /**
   * Allows registered plugins an opportunity to extract events from top-level
   * native browser events.
   *
   * @return {*} An accumulation of synthetic events.
   * @internal
   */
  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
    var events;
    var plugins = EventPluginRegistry.plugins;
    for (var i = 0; i < plugins.length; i++) {
      // Not every plugin in the ordering may be loaded at runtime.
      var possiblePlugin = plugins[i];
      if (possiblePlugin) {
        var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
        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 (simulated) {
    // Set `eventQueue` to null before processing it so that we can tell if more
    // events get enqueued while processing.
    var processingEventQueue = eventQueue;
    eventQueue = null;
    if (simulated) {
      forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated);
    } else {
      forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);
    }
    !!eventQueue ? "development" !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.') : _prodInvariant('95') : void 0;
    // This would be a good time to rethrow if any of the event handlers threw.
    ReactErrorUtils.rethrowCaughtError();
  }

};

module.exports = EventPluginHub;
},{"112":112,"12":12,"13":13,"131":131,"41":41,"91":91,"97":97}],12:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 * 
 */

'use strict';

var _prodInvariant = _dereq_(112);

var invariant = _dereq_(131);

/**
 * 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);
    !(pluginIndex > -1) ? "development" !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : _prodInvariant('96', pluginName) : void 0;
    if (EventPluginRegistry.plugins[pluginIndex]) {
      continue;
    }
    !pluginModule.extractEvents ? "development" !== 'production' ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : _prodInvariant('97', pluginName) : void 0;
    EventPluginRegistry.plugins[pluginIndex] = pluginModule;
    var publishedEvents = pluginModule.eventTypes;
    for (var eventName in publishedEvents) {
      !publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? "development" !== 'production' ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : _prodInvariant('98', eventName, pluginName) : void 0;
    }
  }
}

/**
 * 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) {
  !!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? "development" !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : _prodInvariant('99', eventName) : void 0;
  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.
 *
 * @param {string} registrationName Registration name to add.
 * @param {object} PluginModule Plugin publishing the event.
 * @private
 */
function publishRegistrationName(registrationName, pluginModule, eventName) {
  !!EventPluginRegistry.registrationNameModules[registrationName] ? "development" !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.', registrationName) : _prodInvariant('100', registrationName) : void 0;
  EventPluginRegistry.registrationNameModules[registrationName] = pluginModule;
  EventPluginRegistry.registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;

  if ("development" !== 'production') {
    var lowerCasedName = registrationName.toLowerCase();
    EventPluginRegistry.possibleRegistrationNames[lowerCasedName] = registrationName;

    if (registrationName === 'onDoubleClick') {
      EventPluginRegistry.possibleRegistrationNames.ondblclick = registrationName;
    }
  }
}

/**
 * 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: {},

  /**
   * Mapping from lowercase registration names to the properly cased version,
   * used to warn in the case of missing event handlers. Available
   * only in __DEV__.
   * @type {Object}
   */
  possibleRegistrationNames: "development" !== 'production' ? {} : null,
  // Trust the developer to only use possibleRegistrationNames in __DEV__

  /**
   * 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) {
    !!eventPluginOrder ? "development" !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.') : _prodInvariant('101') : void 0;
    // 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) {
        !!namesToPlugins[pluginName] ? "development" !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : _prodInvariant('102', pluginName) : void 0;
        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;
    }
    if (dispatchConfig.phasedRegistrationNames !== undefined) {
      // pulling phasedRegistrationNames out of dispatchConfig helps Flow see
      // that it is not undefined.
      var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;

      for (var phase in phasedRegistrationNames) {
        if (!phasedRegistrationNames.hasOwnProperty(phase)) {
          continue;
        }
        var pluginModule = EventPluginRegistry.registrationNameModules[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];
      }
    }

    if ("development" !== 'production') {
      var possibleRegistrationNames = EventPluginRegistry.possibleRegistrationNames;
      for (var lowerCasedName in possibleRegistrationNames) {
        if (possibleRegistrationNames.hasOwnProperty(lowerCasedName)) {
          delete possibleRegistrationNames[lowerCasedName];
        }
      }
    }
  }

};

module.exports = EventPluginRegistry;
},{"112":112,"131":131}],13:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var _prodInvariant = _dereq_(112);

var ReactErrorUtils = _dereq_(41);

var invariant = _dereq_(131);
var warning = _dereq_(138);

/**
 * Injected dependencies:
 */

/**
 * - `ComponentTree`: [required] Module that can convert between React instances
 *   and actual node references.
 */
var ComponentTree;
var injection = {
  injectComponentTree: function (Injected) {
    ComponentTree = Injected;
    if ("development" !== 'production') {
      "development" !== 'production' ? warning(Injected && Injected.getNodeFromInstance && Injected.getInstanceFromNode, 'EventPluginUtils.injection.injectComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0;
    }
  }
};

function isEndish(topLevelType) {
  return topLevelType === 'topMouseUp' || topLevelType === 'topTouchEnd' || topLevelType === 'topTouchCancel';
}

function isMoveish(topLevelType) {
  return topLevelType === 'topMouseMove' || topLevelType === 'topTouchMove';
}
function isStartish(topLevelType) {
  return topLevelType === 'topMouseDown' || topLevelType === 'topTouchStart';
}

var validateEventDispatches;
if ("development" !== 'production') {
  validateEventDispatches = function (event) {
    var dispatchListeners = event._dispatchListeners;
    var dispatchInstances = event._dispatchInstances;

    var listenersIsArr = Array.isArray(dispatchListeners);
    var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;

    var instancesIsArr = Array.isArray(dispatchInstances);
    var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;

    "development" !== 'production' ? warning(instancesIsArr === listenersIsArr && instancesLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : void 0;
  };
}

/**
 * Dispatch the event to the listener.
 * @param {SyntheticEvent} event SyntheticEvent to handle
 * @param {boolean} simulated If the event is simulated (changes exn behavior)
 * @param {function} listener Application-level callback
 * @param {*} inst Internal component instance
 */
function executeDispatch(event, simulated, listener, inst) {
  var type = event.type || 'unknown-event';
  event.currentTarget = EventPluginUtils.getNodeFromInstance(inst);
  if (simulated) {
    ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event);
  } else {
    ReactErrorUtils.invokeGuardedCallback(type, listener, event);
  }
  event.currentTarget = null;
}

/**
 * Standard/simple iteration through an event's collected dispatches.
 */
function executeDispatchesInOrder(event, simulated) {
  var dispatchListeners = event._dispatchListeners;
  var dispatchInstances = event._dispatchInstances;
  if ("development" !== 'production') {
    validateEventDispatches(event);
  }
  if (Array.isArray(dispatchListeners)) {
    for (var i = 0; i < dispatchListeners.length; i++) {
      if (event.isPropagationStopped()) {
        break;
      }
      // Listeners and Instances are two parallel arrays that are always in sync.
      executeDispatch(event, simulated, dispatchListeners[i], dispatchInstances[i]);
    }
  } else if (dispatchListeners) {
    executeDispatch(event, simulated, dispatchListeners, dispatchInstances);
  }
  event._dispatchListeners = null;
  event._dispatchInstances = null;
}

/**
 * Standard/simple iteration through an event's collected dispatches, but stops
 * at the first dispatch execution returning true, and returns that id.
 *
 * @return {?string} 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 dispatchInstances = event._dispatchInstances;
  if ("development" !== 'production') {
    validateEventDispatches(event);
  }
  if (Array.isArray(dispatchListeners)) {
    for (var i = 0; i < dispatchListeners.length; i++) {
      if (event.isPropagationStopped()) {
        break;
      }
      // Listeners and Instances are two parallel arrays that are always in sync.
      if (dispatchListeners[i](event, dispatchInstances[i])) {
        return dispatchInstances[i];
      }
    }
  } else if (dispatchListeners) {
    if (dispatchListeners(event, dispatchInstances)) {
      return dispatchInstances;
    }
  }
  return null;
}

/**
 * @see executeDispatchesInOrderStopAtTrueImpl
 */
function executeDispatchesInOrderStopAtTrue(event) {
  var ret = executeDispatchesInOrderStopAtTrueImpl(event);
  event._dispatchInstances = 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 ("development" !== 'production') {
    validateEventDispatches(event);
  }
  var dispatchListener = event._dispatchListeners;
  var dispatchInstance = event._dispatchInstances;
  !!Array.isArray(dispatchListener) ? "development" !== 'production' ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : _prodInvariant('103') : void 0;
  event.currentTarget = dispatchListener ? EventPluginUtils.getNodeFromInstance(dispatchInstance) : null;
  var res = dispatchListener ? dispatchListener(event) : null;
  event.currentTarget = null;
  event._dispatchListeners = null;
  event._dispatchInstances = null;
  return res;
}

/**
 * @param {SyntheticEvent} event
 * @return {boolean} 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,
  executeDispatchesInOrder: executeDispatchesInOrder,
  executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,
  hasDispatches: hasDispatches,

  getFiberCurrentPropsFromNode: function (node) {
    return ComponentTree.getFiberCurrentPropsFromNode(node);
  },
  getInstanceFromNode: function (node) {
    return ComponentTree.getInstanceFromNode(node);
  },
  getNodeFromInstance: function (node) {
    return ComponentTree.getNodeFromInstance(node);
  },

  injection: injection
};

module.exports = EventPluginUtils;
},{"112":112,"131":131,"138":138,"41":41}],14:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var EventPluginHub = _dereq_(11);
var ReactTreeTraversal = _dereq_(71);

var accumulateInto = _dereq_(91);
var forEachAccumulated = _dereq_(97);
var warning = _dereq_(138);

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(inst, event, propagationPhase) {
  var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];
  return getListener(inst, 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(inst, phase, event) {
  if ("development" !== 'production') {
    "development" !== 'production' ? warning(inst, 'Dispatching inst must not be null') : void 0;
  }
  var listener = listenerAtPhase(inst, event, phase);
  if (listener) {
    event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
    event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
  }
}

/**
 * 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 cannot 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) {
    ReactTreeTraversal.traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);
  }
}

/**
 * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.
 */
function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
  if (event && event.dispatchConfig.phasedRegistrationNames) {
    var targetInst = event._targetInst;
    var parentInst = targetInst ? ReactTreeTraversal.getParentInstance(targetInst) : null;
    ReactTreeTraversal.traverseTwoPhase(parentInst, 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(inst, ignoredDirection, event) {
  if (event && event.dispatchConfig.registrationName) {
    var registrationName = event.dispatchConfig.registrationName;
    var listener = getListener(inst, registrationName);
    if (listener) {
      event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
      event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
    }
  }
}

/**
 * Accumulates dispatches on an `SyntheticEvent`, but only for the
 * `dispatchMarker`.
 * @param {SyntheticEvent} event
 */
function accumulateDirectDispatchesSingle(event) {
  if (event && event.dispatchConfig.registrationName) {
    accumulateDispatches(event._targetInst, null, event);
  }
}

function accumulateTwoPhaseDispatches(events) {
  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
}

function accumulateTwoPhaseDispatchesSkipTarget(events) {
  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);
}

function accumulateEnterLeaveDispatches(leave, enter, from, to) {
  ReactTreeTraversal.traverseEnterLeave(from, to, 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 even a
 * single one.
 *
 * @constructor EventPropagators
 */
var EventPropagators = {
  accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,
  accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,
  accumulateDirectDispatches: accumulateDirectDispatches,
  accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches
};

module.exports = EventPropagators;
},{"11":11,"138":138,"71":71,"91":91,"97":97}],15:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var _assign = _dereq_(139);

var PooledClass = _dereq_(17);

var getTextContentAccessor = _dereq_(106);

/**
 * 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, {
  destructor: function () {
    this._root = null;
    this._startText = null;
    this._fallbackText = null;
  },

  /**
   * 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;
},{"106":106,"139":139,"17":17}],16:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var DOMProperty = _dereq_(8);

var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;
var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;
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 HTMLDOMPropertyConfig = {
  isCustomAttribute: RegExp.prototype.test.bind(new RegExp('^(data|aria)-[' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$')),
  Properties: {
    /**
     * Standard Properties
     */
    accept: 0,
    acceptCharset: 0,
    accessKey: 0,
    action: 0,
    allowFullScreen: HAS_BOOLEAN_VALUE,
    allowTransparency: 0,
    alt: 0,
    // specifies target context for links with `preload` type
    as: 0,
    async: HAS_BOOLEAN_VALUE,
    autoComplete: 0,
    // autoFocus is polyfilled/normalized by AutoFocusUtils
    // autoFocus: HAS_BOOLEAN_VALUE,
    autoPlay: HAS_BOOLEAN_VALUE,
    capture: HAS_BOOLEAN_VALUE,
    cellPadding: 0,
    cellSpacing: 0,
    charSet: 0,
    challenge: 0,
    checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
    cite: 0,
    classID: 0,
    className: 0,
    cols: HAS_POSITIVE_NUMERIC_VALUE,
    colSpan: 0,
    content: 0,
    contentEditable: 0,
    contextMenu: 0,
    controls: HAS_BOOLEAN_VALUE,
    coords: 0,
    crossOrigin: 0,
    data: 0, // For `<object />` acts as `src`.
    dateTime: 0,
    'default': HAS_BOOLEAN_VALUE,
    defer: HAS_BOOLEAN_VALUE,
    dir: 0,
    disabled: HAS_BOOLEAN_VALUE,
    download: HAS_OVERLOADED_BOOLEAN_VALUE,
    draggable: 0,
    encType: 0,
    form: 0,
    formAction: 0,
    formEncType: 0,
    formMethod: 0,
    formNoValidate: HAS_BOOLEAN_VALUE,
    formTarget: 0,
    frameBorder: 0,
    headers: 0,
    height: 0,
    hidden: HAS_BOOLEAN_VALUE,
    high: 0,
    href: 0,
    hrefLang: 0,
    htmlFor: 0,
    httpEquiv: 0,
    id: 0,
    inputMode: 0,
    integrity: 0,
    is: 0,
    keyParams: 0,
    keyType: 0,
    kind: 0,
    label: 0,
    lang: 0,
    list: 0,
    loop: HAS_BOOLEAN_VALUE,
    low: 0,
    manifest: 0,
    marginHeight: 0,
    marginWidth: 0,
    max: 0,
    maxLength: 0,
    media: 0,
    mediaGroup: 0,
    method: 0,
    min: 0,
    minLength: 0,
    // Caution; `option.selected` is not updated if `select.multiple` is
    // disabled with `removeAttribute`.
    multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
    muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
    name: 0,
    nonce: 0,
    noValidate: HAS_BOOLEAN_VALUE,
    open: HAS_BOOLEAN_VALUE,
    optimum: 0,
    pattern: 0,
    placeholder: 0,
    playsInline: HAS_BOOLEAN_VALUE,
    poster: 0,
    preload: 0,
    profile: 0,
    radioGroup: 0,
    readOnly: HAS_BOOLEAN_VALUE,
    referrerPolicy: 0,
    rel: 0,
    required: HAS_BOOLEAN_VALUE,
    reversed: HAS_BOOLEAN_VALUE,
    role: 0,
    rows: HAS_POSITIVE_NUMERIC_VALUE,
    rowSpan: HAS_NUMERIC_VALUE,
    sandbox: 0,
    scope: 0,
    scoped: HAS_BOOLEAN_VALUE,
    scrolling: 0,
    seamless: HAS_BOOLEAN_VALUE,
    selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
    shape: 0,
    size: HAS_POSITIVE_NUMERIC_VALUE,
    sizes: 0,
    // support for projecting regular DOM Elements via V1 named slots ( shadow dom )
    slot: 0,
    span: HAS_POSITIVE_NUMERIC_VALUE,
    spellCheck: 0,
    src: 0,
    srcDoc: 0,
    srcLang: 0,
    srcSet: 0,
    start: HAS_NUMERIC_VALUE,
    step: 0,
    style: 0,
    summary: 0,
    tabIndex: 0,
    target: 0,
    title: 0,
    // Setting .type throws on non-<input> tags
    type: 0,
    useMap: 0,
    value: 0,
    width: 0,
    wmode: 0,
    wrap: 0,

    /**
     * RDFa Properties
     */
    about: 0,
    datatype: 0,
    inlist: 0,
    prefix: 0,
    // property is also supported for OpenGraph in meta tags.
    property: 0,
    resource: 0,
    'typeof': 0,
    vocab: 0,

    /**
     * Non-standard Properties
     */
    // autoCapitalize and autoCorrect are supported in Mobile Safari for
    // keyboard hints.
    autoCapitalize: 0,
    autoCorrect: 0,
    // autoSave allows WebKit/Blink to persist values of input fields on page reloads
    autoSave: 0,
    // color is for Safari mask-icon link
    color: 0,
    // itemProp, itemScope, itemType are for
    // Microdata support. See http://schema.org/docs/gs.html
    itemProp: 0,
    itemScope: HAS_BOOLEAN_VALUE,
    itemType: 0,
    // itemID and itemRef are for Microdata support as well but
    // only specified in the WHATWG spec document. See
    // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api
    itemID: 0,
    itemRef: 0,
    // results show looking glass icon and recent searches on input
    // search fields in WebKit/Blink
    results: 0,
    // IE-only attribute that specifies security restrictions on an iframe
    // as an alternative to the sandbox attribute on IE<10
    security: 0,
    // IE-only attribute that controls focus behavior
    unselectable: 0
  },
  DOMAttributeNames: {
    acceptCharset: 'accept-charset',
    className: 'class',
    htmlFor: 'for',
    httpEquiv: 'http-equiv'
  },
  DOMPropertyNames: {}
};

module.exports = HTMLDOMPropertyConfig;
},{"8":8}],17:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 * 
 */

'use strict';

var _prodInvariant = _dereq_(112);

var invariant = _dereq_(131);

/**
 * 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 fourArgumentPooler = function (a1, a2, a3, a4) {
  var Klass = this;
  if (Klass.instancePool.length) {
    var instance = Klass.instancePool.pop();
    Klass.call(instance, a1, a2, a3, a4);
    return instance;
  } else {
    return new Klass(a1, a2, a3, a4);
  }
};

var standardReleaser = function (instance) {
  var Klass = this;
  !(instance instanceof Klass) ? "development" !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0;
  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.
 *
 * @param {Function} CopyConstructor Constructor that can be used to reset.
 * @param {Function} pooler Customizable pooler.
 */
var addPoolingTo = function (CopyConstructor, pooler) {
  // Casting as any so that flow ignores the actual implementation and trusts
  // it to match the type we declared
  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,
  fourArgumentPooler: fourArgumentPooler
};

module.exports = PooledClass;
},{"112":112,"131":131}],18:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var _assign = _dereq_(139);

var EventPluginRegistry = _dereq_(12);
var ReactEventEmitterMixin = _dereq_(42);
var ViewportMetrics = _dereq_(90);

var getVendorPrefixedEventName = _dereq_(107);
var isEventSupported = _dereq_(109);

/**
 * 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 hasEventPageXY;
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 = {
  topAbort: 'abort',
  topAnimationEnd: getVendorPrefixedEventName('animationend') || 'animationend',
  topAnimationIteration: getVendorPrefixedEventName('animationiteration') || 'animationiteration',
  topAnimationStart: getVendorPrefixedEventName('animationstart') || 'animationstart',
  topBlur: 'blur',
  topCancel: 'cancel',
  topCanPlay: 'canplay',
  topCanPlayThrough: 'canplaythrough',
  topChange: 'change',
  topClick: 'click',
  topClose: 'close',
  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',
  topDurationChange: 'durationchange',
  topEmptied: 'emptied',
  topEncrypted: 'encrypted',
  topEnded: 'ended',
  topError: 'error',
  topFocus: 'focus',
  topInput: 'input',
  topKeyDown: 'keydown',
  topKeyPress: 'keypress',
  topKeyUp: 'keyup',
  topLoadedData: 'loadeddata',
  topLoadedMetadata: 'loadedmetadata',
  topLoadStart: 'loadstart',
  topMouseDown: 'mousedown',
  topMouseMove: 'mousemove',
  topMouseOut: 'mouseout',
  topMouseOver: 'mouseover',
  topMouseUp: 'mouseup',
  topPaste: 'paste',
  topPause: 'pause',
  topPlay: 'play',
  topPlaying: 'playing',
  topProgress: 'progress',
  topRateChange: 'ratechange',
  topScroll: 'scroll',
  topSeeked: 'seeked',
  topSeeking: 'seeking',
  topSelectionChange: 'selectionchange',
  topStalled: 'stalled',
  topSuspend: 'suspend',
  topTextInput: 'textInput',
  topTimeUpdate: 'timeupdate',
  topToggle: 'toggle',
  topTouchCancel: 'touchcancel',
  topTouchEnd: 'touchend',
  topTouchMove: 'touchmove',
  topTouchStart: 'touchstart',
  topTransitionEnd: getVendorPrefixedEventName('transitionend') || 'transitionend',
  topVolumeChange: 'volumechange',
  topWaiting: 'waiting',
  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]];
}

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];

    for (var i = 0; i < dependencies.length; i++) {
      var dependency = dependencies[i];
      if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {
        if (dependency === 'topWheel') {
          if (isEventSupported('wheel')) {
            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'wheel', mountAt);
          } else if (isEventSupported('mousewheel')) {
            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('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('topWheel', 'DOMMouseScroll', mountAt);
          }
        } else if (dependency === 'topScroll') {

          if (isEventSupported('scroll', true)) {
            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topScroll', 'scroll', mountAt);
          } else {
            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topScroll', 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE);
          }
        } else if (dependency === 'topFocus' || dependency === 'topBlur') {

          if (isEventSupported('focus', true)) {
            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topFocus', 'focus', mountAt);
            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('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('topFocus', 'focusin', mountAt);
            ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topBlur', 'focusout', mountAt);
          }

          // to make sure blur and focus event listeners are only attached once
          isListening.topBlur = true;
          isListening.topFocus = true;
        } else if (dependency === 'topCancel') {
          if (isEventSupported('cancel', true)) {
            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topCancel', 'cancel', mountAt);
          }
          isListening.topCancel = true;
        } else if (dependency === 'topClose') {
          if (isEventSupported('close', true)) {
            ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topClose', 'close', mountAt);
          }
          isListening.topClose = true;
        } else if (topEventMapping.hasOwnProperty(dependency)) {
          ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt);
        }

        isListening[dependency] = true;
      }
    }
  },

  isListeningToAllDependencies: function (registrationName, mountAt) {
    var isListening = getListeningForDocument(mountAt);
    var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName];
    for (var i = 0; i < dependencies.length; i++) {
      var dependency = dependencies[i];
      if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {
        return false;
      }
    }
    return 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);
  },

  /**
   * Protect against document.createEvent() returning null
   * Some popup blocker extensions appear to do this:
   * https://github.com/facebook/react/issues/6887
   */
  supportsEventPageXY: function () {
    if (!document.createEvent) {
      return false;
    }
    var ev = document.createEvent('MouseEvent');
    return ev != null && 'pageX' in ev;
  },

  /**
   * Listens to window scroll and resize events. We cache scroll values so that
   * application code can access them without triggering reflows.
   *
   * ViewportMetrics is only used by SyntheticMouse/TouchEvent and only when
   * pageX/pageY isn't supported (legacy browsers).
   *
   * NOTE: Scroll events do not bubble.
   *
   * @see http://www.quirksmode.org/dom/events/scroll.html
   */
  ensureScrollValueMonitoring: function () {
    if (hasEventPageXY === undefined) {
      hasEventPageXY = ReactBrowserEventEmitter.supportsEventPageXY();
    }
    if (!hasEventPageXY && !isMonitoringScrollValue) {
      var refresh = ViewportMetrics.refreshScrollValues;
      ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);
      isMonitoringScrollValue = true;
    }
  }

});

module.exports = ReactBrowserEventEmitter;
},{"107":107,"109":109,"12":12,"139":139,"42":42,"90":90}],19:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 * 
 */

'use strict';

var _prodInvariant = _dereq_(112);

var REACT_ELEMENT_TYPE = _dereq_(40);

var _require = _dereq_(22),
    REACT_COROUTINE_TYPE = _require.REACT_COROUTINE_TYPE,
    REACT_YIELD_TYPE = _require.REACT_YIELD_TYPE;

var _require2 = _dereq_(67),
    REACT_PORTAL_TYPE = _require2.REACT_PORTAL_TYPE;

var ReactFiber = _dereq_(45);
var ReactTypeOfSideEffect = _dereq_(72);
var ReactTypeOfWork = _dereq_(73);

var emptyObject = _dereq_(125);
var getIteratorFn = _dereq_(104);
var invariant = _dereq_(131);
var ReactFeatureFlags = _dereq_(44);
var ReactCurrentOwner = _dereq_(117);

if ("development" !== 'production') {
  var _require3 = _dereq_(38),
      getCurrentFiberStackAddendum = _require3.getCurrentFiberStackAddendum;

  var _require4 = _dereq_(59),
      getComponentName = _require4.getComponentName;

  var warning = _dereq_(138);
  var didWarnAboutMaps = false;
}

var cloneFiber = ReactFiber.cloneFiber,
    createFiberFromElement = ReactFiber.createFiberFromElement,
    createFiberFromFragment = ReactFiber.createFiberFromFragment,
    createFiberFromText = ReactFiber.createFiberFromText,
    createFiberFromCoroutine = ReactFiber.createFiberFromCoroutine,
    createFiberFromYield = ReactFiber.createFiberFromYield,
    createFiberFromPortal = ReactFiber.createFiberFromPortal;


var isArray = Array.isArray;

var FunctionalComponent = ReactTypeOfWork.FunctionalComponent,
    ClassComponent = ReactTypeOfWork.ClassComponent,
    HostText = ReactTypeOfWork.HostText,
    HostPortal = ReactTypeOfWork.HostPortal,
    CoroutineComponent = ReactTypeOfWork.CoroutineComponent,
    YieldComponent = ReactTypeOfWork.YieldComponent,
    Fragment = ReactTypeOfWork.Fragment;
var NoEffect = ReactTypeOfSideEffect.NoEffect,
    Placement = ReactTypeOfSideEffect.Placement,
    Deletion = ReactTypeOfSideEffect.Deletion;


function coerceRef(current, element) {
  var mixedRef = element.ref;
  if (mixedRef !== null && typeof mixedRef !== 'function') {
    if (element._owner) {
      var owner = element._owner;
      var inst = void 0;
      if (owner) {
        if (typeof owner.tag === 'number') {
          var ownerFiber = owner;
          !(ownerFiber.tag === ClassComponent) ? "development" !== 'production' ? invariant(false, 'Stateless function components cannot have refs.') : _prodInvariant('110') : void 0;
          inst = ownerFiber.stateNode;
        } else {
          // Stack
          inst = owner.getPublicInstance();
        }
      }
      !inst ? "development" !== 'production' ? invariant(false, 'Missing owner for string ref %s. This error is likely caused by a bug in React. Please file an issue.', mixedRef) : _prodInvariant('155', mixedRef) : void 0;
      var stringRef = String(mixedRef);
      // Check if previous string ref matches new string ref
      if (current !== null && current.ref !== null && current.ref._stringRef === stringRef) {
        return current.ref;
      }
      var ref = function (value) {
        var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;
        if (value === null) {
          delete refs[stringRef];
        } else {
          refs[stringRef] = value;
        }
      };
      ref._stringRef = stringRef;
      return ref;
    }
  }
  return mixedRef;
}

function throwOnInvalidObjectType(returnFiber, newChild) {
  if (returnFiber.type !== 'textarea') {
    var childrenString = String(newChild);
    var addendum = '';
    if ("development" !== 'production') {
      addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';
      var owner = ReactCurrentOwner.owner || returnFiber._debugOwner;
      if (owner && typeof owner.tag === 'number') {
        var name = getComponentName(owner);
        if (name) {
          addendum += '\n\nCheck the render method of `' + name + '`.';
        }
      }
    }
    !false ? "development" !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : childrenString, addendum) : void 0;
  }
}

// This wrapper function exists because I expect to clone the code in each path
// to be able to optimize each path individually by branching early. This needs
// a compiler or we can do it manually. Helpers that don't need this branching
// live outside of this function.
function ChildReconciler(shouldClone, shouldTrackSideEffects) {

  function deleteChild(returnFiber, childToDelete) {
    if (!shouldTrackSideEffects) {
      // Noop.
      return;
    }
    if (!shouldClone) {
      // When we're reconciling in place we have a work in progress copy. We
      // actually want the current copy. If there is no current copy, then we
      // don't need to track deletion side-effects.
      if (childToDelete.alternate === null) {
        return;
      }
      childToDelete = childToDelete.alternate;
    }
    // Deletions are added in reversed order so we add it to the front.
    var last = returnFiber.progressedLastDeletion;
    if (last !== null) {
      last.nextEffect = childToDelete;
      returnFiber.progressedLastDeletion = childToDelete;
    } else {
      returnFiber.progressedFirstDeletion = returnFiber.progressedLastDeletion = childToDelete;
    }
    childToDelete.nextEffect = null;
    childToDelete.effectTag = Deletion;
  }

  function deleteRemainingChildren(returnFiber, currentFirstChild) {
    if (!shouldTrackSideEffects) {
      // Noop.
      return null;
    }

    // TODO: For the shouldClone case, this could be micro-optimized a bit by
    // assuming that after the first child we've already added everything.
    var childToDelete = currentFirstChild;
    while (childToDelete !== null) {
      deleteChild(returnFiber, childToDelete);
      childToDelete = childToDelete.sibling;
    }
    return null;
  }

  function mapRemainingChildren(returnFiber, currentFirstChild) {
    // Add the remaining children to a temporary map so that we can find them by
    // keys quickly. Implicit (null) keys get added to this set with their index
    var existingChildren = new Map();

    var existingChild = currentFirstChild;
    while (existingChild !== null) {
      if (existingChild.key !== null) {
        existingChildren.set(existingChild.key, existingChild);
      } else {
        existingChildren.set(existingChild.index, existingChild);
      }
      existingChild = existingChild.sibling;
    }
    return existingChildren;
  }

  function useFiber(fiber, priority) {
    // We currently set sibling to null and index to 0 here because it is easy
    // to forget to do before returning it. E.g. for the single child case.
    if (shouldClone) {
      var clone = cloneFiber(fiber, priority);
      clone.index = 0;
      clone.sibling = null;
      return clone;
    } else {
      // We override the pending priority even if it is higher, because if
      // we're reconciling at a lower priority that means that this was
      // down-prioritized.
      fiber.pendingWorkPriority = priority;
      fiber.effectTag = NoEffect;
      fiber.index = 0;
      fiber.sibling = null;
      return fiber;
    }
  }

  function placeChild(newFiber, lastPlacedIndex, newIndex) {
    newFiber.index = newIndex;
    if (!shouldTrackSideEffects) {
      // Noop.
      return lastPlacedIndex;
    }
    var current = newFiber.alternate;
    if (current !== null) {
      var oldIndex = current.index;
      if (oldIndex < lastPlacedIndex) {
        // This is a move.
        newFiber.effectTag = Placement;
        return lastPlacedIndex;
      } else {
        // This item can stay in place.
        return oldIndex;
      }
    } else {
      // This is an insertion.
      newFiber.effectTag = Placement;
      return lastPlacedIndex;
    }
  }

  function placeSingleChild(newFiber) {
    // This is simpler for the single child case. We only need to do a
    // placement for inserting new children.
    if (shouldTrackSideEffects && newFiber.alternate === null) {
      newFiber.effectTag = Placement;
    }
    return newFiber;
  }

  function updateTextNode(returnFiber, current, textContent, priority) {
    if (current === null || current.tag !== HostText) {
      // Insert
      var created = createFiberFromText(textContent, priority);
      created['return'] = returnFiber;
      return created;
    } else {
      // Update
      var existing = useFiber(current, priority);
      existing.pendingProps = textContent;
      existing['return'] = returnFiber;
      return existing;
    }
  }

  function updateElement(returnFiber, current, element, priority) {
    if (current === null || current.type !== element.type) {
      // Insert
      var created = createFiberFromElement(element, priority);
      created.ref = coerceRef(current, element);
      created['return'] = returnFiber;
      return created;
    } else {
      // Move based on index
      var existing = useFiber(current, priority);
      existing.ref = coerceRef(current, element);
      existing.pendingProps = element.props;
      existing['return'] = returnFiber;
      if ("development" !== 'production') {
        existing._debugSource = element._source;
        existing._debugOwner = element._owner;
      }
      return existing;
    }
  }

  function updateCoroutine(returnFiber, current, coroutine, priority) {
    // TODO: Should this also compare handler to determine whether to reuse?
    if (current === null || current.tag !== CoroutineComponent) {
      // Insert
      var created = createFiberFromCoroutine(coroutine, priority);
      created['return'] = returnFiber;
      return created;
    } else {
      // Move based on index
      var existing = useFiber(current, priority);
      existing.pendingProps = coroutine;
      existing['return'] = returnFiber;
      return existing;
    }
  }

  function updateYield(returnFiber, current, yieldNode, priority) {
    if (current === null || current.tag !== YieldComponent) {
      // Insert
      var created = createFiberFromYield(yieldNode, priority);
      created.type = yieldNode.value;
      created['return'] = returnFiber;
      return created;
    } else {
      // Move based on index
      var existing = useFiber(current, priority);
      existing.type = yieldNode.value;
      existing['return'] = returnFiber;
      return existing;
    }
  }

  function updatePortal(returnFiber, current, portal, priority) {
    if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {
      // Insert
      var created = createFiberFromPortal(portal, priority);
      created['return'] = returnFiber;
      return created;
    } else {
      // Update
      var existing = useFiber(current, priority);
      existing.pendingProps = portal.children || [];
      existing['return'] = returnFiber;
      return existing;
    }
  }

  function updateFragment(returnFiber, current, fragment, priority) {
    if (current === null || current.tag !== Fragment) {
      // Insert
      var created = createFiberFromFragment(fragment, priority);
      created['return'] = returnFiber;
      return created;
    } else {
      // Update
      var existing = useFiber(current, priority);
      existing.pendingProps = fragment;
      existing['return'] = returnFiber;
      return existing;
    }
  }

  function createChild(returnFiber, newChild, priority) {
    if (typeof newChild === 'string' || typeof newChild === 'number') {
      // Text nodes doesn't have keys. If the previous node is implicitly keyed
      // we can continue to replace it without aborting even if it is not a text
      // node.
      var created = createFiberFromText('' + newChild, priority);
      created['return'] = returnFiber;
      return created;
    }

    if (typeof newChild === 'object' && newChild !== null) {
      switch (newChild.$$typeof) {
        case REACT_ELEMENT_TYPE:
          {
            var _created = createFiberFromElement(newChild, priority);
            _created.ref = coerceRef(null, newChild);
            _created['return'] = returnFiber;
            return _created;
          }

        case REACT_COROUTINE_TYPE:
          {
            var _created2 = createFiberFromCoroutine(newChild, priority);
            _created2['return'] = returnFiber;
            return _created2;
          }

        case REACT_YIELD_TYPE:
          {
            var _created3 = createFiberFromYield(newChild, priority);
            _created3.type = newChild.value;
            _created3['return'] = returnFiber;
            return _created3;
          }

        case REACT_PORTAL_TYPE:
          {
            var _created4 = createFiberFromPortal(newChild, priority);
            _created4['return'] = returnFiber;
            return _created4;
          }
      }

      if (isArray(newChild) || getIteratorFn(newChild)) {
        var _created5 = createFiberFromFragment(newChild, priority);
        _created5['return'] = returnFiber;
        return _created5;
      }

      throwOnInvalidObjectType(returnFiber, newChild);
    }

    return null;
  }

  function updateSlot(returnFiber, oldFiber, newChild, priority) {
    // Update the fiber if the keys match, otherwise return null.

    var key = oldFiber !== null ? oldFiber.key : null;

    if (typeof newChild === 'string' || typeof newChild === 'number') {
      // Text nodes doesn't have keys. If the previous node is implicitly keyed
      // we can continue to replace it without aborting even if it is not a text
      // node.
      if (key !== null) {
        return null;
      }
      return updateTextNode(returnFiber, oldFiber, '' + newChild, priority);
    }

    if (typeof newChild === 'object' && newChild !== null) {
      switch (newChild.$$typeof) {
        case REACT_ELEMENT_TYPE:
          {
            if (newChild.key === key) {
              return updateElement(returnFiber, oldFiber, newChild, priority);
            } else {
              return null;
            }
          }

        case REACT_COROUTINE_TYPE:
          {
            if (newChild.key === key) {
              return updateCoroutine(returnFiber, oldFiber, newChild, priority);
            } else {
              return null;
            }
          }

        case REACT_YIELD_TYPE:
          {
            // Yields doesn't have keys. If the previous node is implicitly keyed
            // we can continue to replace it without aborting even if it is not a
            // yield.
            if (key === null) {
              return updateYield(returnFiber, oldFiber, newChild, priority);
            } else {
              return null;
            }
          }

        case REACT_PORTAL_TYPE:
          {
            if (newChild.key === key) {
              return updatePortal(returnFiber, oldFiber, newChild, priority);
            } else {
              return null;
            }
          }
      }

      if (isArray(newChild) || getIteratorFn(newChild)) {
        // Fragments doesn't have keys so if the previous key is implicit we can
        // update it.
        if (key !== null) {
          return null;
        }
        return updateFragment(returnFiber, oldFiber, newChild, priority);
      }

      throwOnInvalidObjectType(returnFiber, newChild);
    }

    return null;
  }

  function updateFromMap(existingChildren, returnFiber, newIdx, newChild, priority) {

    if (typeof newChild === 'string' || typeof newChild === 'number') {
      // Text nodes doesn't have keys, so we neither have to check the old nor
      // new node for the key. If both are text nodes, they match.
      var matchedFiber = existingChildren.get(newIdx) || null;
      return updateTextNode(returnFiber, matchedFiber, '' + newChild, priority);
    }

    if (typeof newChild === 'object' && newChild !== null) {
      switch (newChild.$$typeof) {
        case REACT_ELEMENT_TYPE:
          {
            var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
            return updateElement(returnFiber, _matchedFiber, newChild, priority);
          }

        case REACT_COROUTINE_TYPE:
          {
            var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
            return updateCoroutine(returnFiber, _matchedFiber2, newChild, priority);
          }

        case REACT_YIELD_TYPE:
          {
            // Yields doesn't have keys, so we neither have to check the old nor
            // new node for the key. If both are yields, they match.
            var _matchedFiber3 = existingChildren.get(newIdx) || null;
            return updateYield(returnFiber, _matchedFiber3, newChild, priority);
          }

        case REACT_PORTAL_TYPE:
          {
            var _matchedFiber4 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
            return updatePortal(returnFiber, _matchedFiber4, newChild, priority);
          }
      }

      if (isArray(newChild) || getIteratorFn(newChild)) {
        var _matchedFiber5 = existingChildren.get(newIdx) || null;
        return updateFragment(returnFiber, _matchedFiber5, newChild, priority);
      }

      throwOnInvalidObjectType(returnFiber, newChild);
    }

    return null;
  }

  function warnOnDuplicateKey(child, knownKeys) {
    if ("development" !== 'production') {
      if (typeof child !== 'object' || child === null) {
        return knownKeys;
      }
      switch (child.$$typeof) {
        case REACT_ELEMENT_TYPE:
        case REACT_COROUTINE_TYPE:
        case REACT_PORTAL_TYPE:
          var key = child.key;
          if (typeof key !== 'string') {
            break;
          }
          if (knownKeys === null) {
            knownKeys = new Set();
            knownKeys.add(key);
            break;
          }
          if (!knownKeys.has(key)) {
            knownKeys.add(key);
            break;
          }
          "development" !== 'production' ? warning(false, '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.%s', key, getCurrentFiberStackAddendum()) : void 0;
          break;
        default:
          break;
      }
    }
    return knownKeys;
  }

  function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, priority) {

    // This algorithm can't optimize by searching from boths ends since we
    // don't have backpointers on fibers. I'm trying to see how far we can get
    // with that model. If it ends up not being worth the tradeoffs, we can
    // add it later.

    // Even with a two ended optimization, we'd want to optimize for the case
    // where there are few changes and brute force the comparison instead of
    // going for the Map. It'd like to explore hitting that path first in
    // forward-only mode and only go for the Map once we notice that we need
    // lots of look ahead. This doesn't handle reversal as well as two ended
    // search but that's unusual. Besides, for the two ended optimization to
    // work on Iterables, we'd need to copy the whole set.

    // In this first iteration, we'll just live with hitting the bad case
    // (adding everything to a Map) in for every insert/move.

    // If you change this code, also update reconcileChildrenIterator() which
    // uses the same algorithm.

    if ("development" !== 'production') {
      // First, validate keys.
      var knownKeys = null;
      for (var i = 0; i < newChildren.length; i++) {
        var child = newChildren[i];
        knownKeys = warnOnDuplicateKey(child, knownKeys);
      }
    }

    var resultingFirstChild = null;
    var previousNewFiber = null;

    var oldFiber = currentFirstChild;
    var lastPlacedIndex = 0;
    var newIdx = 0;
    var nextOldFiber = null;
    for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
      if (oldFiber.index > newIdx) {
        nextOldFiber = oldFiber;
        oldFiber = null;
      } else {
        nextOldFiber = oldFiber.sibling;
      }
      var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], priority);
      if (newFiber === null) {
        // TODO: This breaks on empty slots like null children. That's
        // unfortunate because it triggers the slow path all the time. We need
        // a better way to communicate whether this was a miss or null,
        // boolean, undefined, etc.
        if (oldFiber === null) {
          oldFiber = nextOldFiber;
        }
        break;
      }
      if (shouldTrackSideEffects) {
        if (oldFiber && newFiber.alternate === null) {
          // We matched the slot, but we didn't reuse the existing fiber, so we
          // need to delete the existing child.
          deleteChild(returnFiber, oldFiber);
        }
      }
      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
      if (previousNewFiber === null) {
        // TODO: Move out of the loop. This only happens for the first run.
        resultingFirstChild = newFiber;
      } else {
        // TODO: Defer siblings if we're not at the right index for this slot.
        // I.e. if we had null values before, then we want to defer this
        // for each null value. However, we also don't want to call updateSlot
        // with the previous one.
        previousNewFiber.sibling = newFiber;
      }
      previousNewFiber = newFiber;
      oldFiber = nextOldFiber;
    }

    if (newIdx === newChildren.length) {
      // We've reached the end of the new children. We can delete the rest.
      deleteRemainingChildren(returnFiber, oldFiber);
      return resultingFirstChild;
    }

    if (oldFiber === null) {
      // If we don't have any more existing children we can choose a fast path
      // since the rest will all be insertions.
      for (; newIdx < newChildren.length; newIdx++) {
        var _newFiber = createChild(returnFiber, newChildren[newIdx], priority);
        if (!_newFiber) {
          continue;
        }
        lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
        if (previousNewFiber === null) {
          // TODO: Move out of the loop. This only happens for the first run.
          resultingFirstChild = _newFiber;
        } else {
          previousNewFiber.sibling = _newFiber;
        }
        previousNewFiber = _newFiber;
      }
      return resultingFirstChild;
    }

    // Add all children to a key map for quick lookups.
    var existingChildren = mapRemainingChildren(returnFiber, oldFiber);

    // Keep scanning and use the map to restore deleted items as moves.
    for (; newIdx < newChildren.length; newIdx++) {
      var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], priority);
      if (_newFiber2) {
        if (shouldTrackSideEffects) {
          if (_newFiber2.alternate !== null) {
            // The new fiber is a work in progress, but if there exists a
            // current, that means that we reused the fiber. We need to delete
            // it from the child list so that we don't add it to the deletion
            // list.
            existingChildren['delete'](_newFiber2.key === null ? newIdx : _newFiber2.key);
          }
        }
        lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
        if (previousNewFiber === null) {
          resultingFirstChild = _newFiber2;
        } else {
          previousNewFiber.sibling = _newFiber2;
        }
        previousNewFiber = _newFiber2;
      }
    }

    if (shouldTrackSideEffects) {
      // Any existing children that weren't consumed above were deleted. We need
      // to add them to the deletion list.
      existingChildren.forEach(function (child) {
        return deleteChild(returnFiber, child);
      });
    }

    return resultingFirstChild;
  }

  function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, priority) {

    // This is the same implementation as reconcileChildrenArray(),
    // but using the iterator instead.

    var iteratorFn = getIteratorFn(newChildrenIterable);
    !(typeof iteratorFn === 'function') ? "development" !== 'production' ? invariant(false, 'An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.') : _prodInvariant('156') : void 0;

    if ("development" !== 'production') {
      // Warn about using Maps as children
      if (typeof newChildrenIterable.entries === 'function') {
        var possibleMap = newChildrenIterable;
        if (possibleMap.entries === iteratorFn) {
          var mapsAsChildrenAddendum = '';
          var owner = ReactCurrentOwner.owner || returnFiber._debugOwner;
          if (owner && typeof owner.tag === 'number') {
            var mapsAsChildrenOwnerName = getComponentName(owner);
            if (mapsAsChildrenOwnerName) {
              mapsAsChildrenAddendum = '\n\nCheck the render method of `' + mapsAsChildrenOwnerName + '`.';
            }
          }
          "development" !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.%s', mapsAsChildrenAddendum) : void 0;
          didWarnAboutMaps = true;
        }
      }

      // First, validate keys.
      // We'll get a different iterator later for the main pass.
      var _newChildren = iteratorFn.call(newChildrenIterable);
      if (_newChildren) {
        var knownKeys = null;
        var _step = _newChildren.next();
        for (; !_step.done; _step = _newChildren.next()) {
          var child = _step.value;
          knownKeys = warnOnDuplicateKey(child, knownKeys);
        }
      }
    }

    var newChildren = iteratorFn.call(newChildrenIterable);
    !(newChildren != null) ? "development" !== 'production' ? invariant(false, 'An iterable object provided no iterator.') : _prodInvariant('157') : void 0;

    var resultingFirstChild = null;
    var previousNewFiber = null;

    var oldFiber = currentFirstChild;
    var lastPlacedIndex = 0;
    var newIdx = 0;
    var nextOldFiber = null;

    var step = newChildren.next();
    for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
      if (oldFiber.index > newIdx) {
        nextOldFiber = oldFiber;
        oldFiber = null;
      } else {
        nextOldFiber = oldFiber.sibling;
      }
      var newFiber = updateSlot(returnFiber, oldFiber, step.value, priority);
      if (newFiber === null) {
        // TODO: This breaks on empty slots like null children. That's
        // unfortunate because it triggers the slow path all the time. We need
        // a better way to communicate whether this was a miss or null,
        // boolean, undefined, etc.
        if (!oldFiber) {
          oldFiber = nextOldFiber;
        }
        break;
      }
      if (shouldTrackSideEffects) {
        if (oldFiber && newFiber.alternate === null) {
          // We matched the slot, but we didn't reuse the existing fiber, so we
          // need to delete the existing child.
          deleteChild(returnFiber, oldFiber);
        }
      }
      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
      if (previousNewFiber === null) {
        // TODO: Move out of the loop. This only happens for the first run.
        resultingFirstChild = newFiber;
      } else {
        // TODO: Defer siblings if we're not at the right index for this slot.
        // I.e. if we had null values before, then we want to defer this
        // for each null value. However, we also don't want to call updateSlot
        // with the previous one.
        previousNewFiber.sibling = newFiber;
      }
      previousNewFiber = newFiber;
      oldFiber = nextOldFiber;
    }

    if (step.done) {
      // We've reached the end of the new children. We can delete the rest.
      deleteRemainingChildren(returnFiber, oldFiber);
      return resultingFirstChild;
    }

    if (oldFiber === null) {
      // If we don't have any more existing children we can choose a fast path
      // since the rest will all be insertions.
      for (; !step.done; newIdx++, step = newChildren.next()) {
        var _newFiber3 = createChild(returnFiber, step.value, priority);
        if (_newFiber3 === null) {
          continue;
        }
        lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
        if (previousNewFiber === null) {
          // TODO: Move out of the loop. This only happens for the first run.
          resultingFirstChild = _newFiber3;
        } else {
          previousNewFiber.sibling = _newFiber3;
        }
        previousNewFiber = _newFiber3;
      }
      return resultingFirstChild;
    }

    // Add all children to a key map for quick lookups.
    var existingChildren = mapRemainingChildren(returnFiber, oldFiber);

    // Keep scanning and use the map to restore deleted items as moves.
    for (; !step.done; newIdx++, step = newChildren.next()) {
      var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, priority);
      if (_newFiber4 !== null) {
        if (shouldTrackSideEffects) {
          if (_newFiber4.alternate !== null) {
            // The new fiber is a work in progress, but if there exists a
            // current, that means that we reused the fiber. We need to delete
            // it from the child list so that we don't add it to the deletion
            // list.
            existingChildren['delete'](_newFiber4.key === null ? newIdx : _newFiber4.key);
          }
        }
        lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
        if (previousNewFiber === null) {
          resultingFirstChild = _newFiber4;
        } else {
          previousNewFiber.sibling = _newFiber4;
        }
        previousNewFiber = _newFiber4;
      }
    }

    if (shouldTrackSideEffects) {
      // Any existing children that weren't consumed above were deleted. We need
      // to add them to the deletion list.
      existingChildren.forEach(function (child) {
        return deleteChild(returnFiber, child);
      });
    }

    return resultingFirstChild;
  }

  function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, priority) {
    // There's no need to check for keys on text nodes since we don't have a
    // way to define them.
    if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
      // We already have an existing node so let's just update it and delete
      // the rest.
      deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
      var existing = useFiber(currentFirstChild, priority);
      existing.pendingProps = textContent;
      existing['return'] = returnFiber;
      return existing;
    }
    // The existing first child is not a text node so we need to create one
    // and delete the existing ones.
    deleteRemainingChildren(returnFiber, currentFirstChild);
    var created = createFiberFromText(textContent, priority);
    created['return'] = returnFiber;
    return created;
  }

  function reconcileSingleElement(returnFiber, currentFirstChild, element, priority) {
    var key = element.key;
    var child = currentFirstChild;
    while (child !== null) {
      // TODO: If key === null and child.key === null, then this only applies to
      // the first item in the list.
      if (child.key === key) {
        if (child.type === element.type) {
          deleteRemainingChildren(returnFiber, child.sibling);
          var existing = useFiber(child, priority);
          existing.ref = coerceRef(child, element);
          existing.pendingProps = element.props;
          existing['return'] = returnFiber;
          if ("development" !== 'production') {
            existing._debugSource = element._source;
            existing._debugOwner = element._owner;
          }
          return existing;
        } else {
          deleteRemainingChildren(returnFiber, child);
          break;
        }
      } else {
        deleteChild(returnFiber, child);
      }
      child = child.sibling;
    }

    var created = createFiberFromElement(element, priority);
    created.ref = coerceRef(currentFirstChild, element);
    created['return'] = returnFiber;
    return created;
  }

  function reconcileSingleCoroutine(returnFiber, currentFirstChild, coroutine, priority) {
    var key = coroutine.key;
    var child = currentFirstChild;
    while (child !== null) {
      // TODO: If key === null and child.key === null, then this only applies to
      // the first item in the list.
      if (child.key === key) {
        if (child.tag === CoroutineComponent) {
          deleteRemainingChildren(returnFiber, child.sibling);
          var existing = useFiber(child, priority);
          existing.pendingProps = coroutine;
          existing['return'] = returnFiber;
          return existing;
        } else {
          deleteRemainingChildren(returnFiber, child);
          break;
        }
      } else {
        deleteChild(returnFiber, child);
      }
      child = child.sibling;
    }

    var created = createFiberFromCoroutine(coroutine, priority);
    created['return'] = returnFiber;
    return created;
  }

  function reconcileSingleYield(returnFiber, currentFirstChild, yieldNode, priority) {
    // There's no need to check for keys on yields since they're stateless.
    var child = currentFirstChild;
    if (child !== null) {
      if (child.tag === YieldComponent) {
        deleteRemainingChildren(returnFiber, child.sibling);
        var existing = useFiber(child, priority);
        existing.type = yieldNode.value;
        existing['return'] = returnFiber;
        return existing;
      } else {
        deleteRemainingChildren(returnFiber, child);
      }
    }

    var created = createFiberFromYield(yieldNode, priority);
    created.type = yieldNode.value;
    created['return'] = returnFiber;
    return created;
  }

  function reconcileSinglePortal(returnFiber, currentFirstChild, portal, priority) {
    var key = portal.key;
    var child = currentFirstChild;
    while (child !== null) {
      // TODO: If key === null and child.key === null, then this only applies to
      // the first item in the list.
      if (child.key === key) {
        if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
          deleteRemainingChildren(returnFiber, child.sibling);
          var existing = useFiber(child, priority);
          existing.pendingProps = portal.children || [];
          existing['return'] = returnFiber;
          return existing;
        } else {
          deleteRemainingChildren(returnFiber, child);
          break;
        }
      } else {
        deleteChild(returnFiber, child);
      }
      child = child.sibling;
    }

    var created = createFiberFromPortal(portal, priority);
    created['return'] = returnFiber;
    return created;
  }

  // This API will tag the children with the side-effect of the reconciliation
  // itself. They will be added to the side-effect list as we pass through the
  // children and the parent.
  function reconcileChildFibers(returnFiber, currentFirstChild, newChild, priority) {
    // This function is not recursive.
    // If the top level item is an array, we treat it as a set of children,
    // not as a fragment. Nested arrays on the other hand will be treated as
    // fragment nodes. Recursion happens at the normal flow.

    var disableNewFiberFeatures = ReactFeatureFlags.disableNewFiberFeatures;

    // Handle object types
    var isObject = typeof newChild === 'object' && newChild !== null;
    if (isObject) {
      // Support only the subset of return types that Stack supports. Treat
      // everything else as empty, but log a warning.
      if (disableNewFiberFeatures) {
        switch (newChild.$$typeof) {
          case REACT_ELEMENT_TYPE:
            return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, priority));

          case REACT_PORTAL_TYPE:
            return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, priority));
        }
      } else {
        switch (newChild.$$typeof) {
          case REACT_ELEMENT_TYPE:
            return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, priority));

          case REACT_COROUTINE_TYPE:
            return placeSingleChild(reconcileSingleCoroutine(returnFiber, currentFirstChild, newChild, priority));

          case REACT_YIELD_TYPE:
            return placeSingleChild(reconcileSingleYield(returnFiber, currentFirstChild, newChild, priority));

          case REACT_PORTAL_TYPE:
            return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, priority));
        }
      }
    }

    if (disableNewFiberFeatures) {
      // The new child is not an element. If it's not null or false,
      // and the return fiber is a composite component, throw an error.
      switch (returnFiber.tag) {
        case ClassComponent:
          {
            if ("development" !== 'production') {
              var instance = returnFiber.stateNode;
              if (instance.render._isMockFunction && typeof newChild === 'undefined') {
                // We allow auto-mocks to proceed as if they're
                // returning null.
                break;
              }
            }
            var Component = returnFiber.type;
            !(newChild === null || newChild === false) ? "development" !== 'production' ? invariant(false, '%s.render(): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.', Component.displayName || Component.name || 'Component') : _prodInvariant('109', Component.displayName || Component.name || 'Component') : void 0;
            break;
          }
        case FunctionalComponent:
          {
            // Composites accept elements, portals, null, or false
            var _Component = returnFiber.type;
            !(newChild === null || newChild === false) ? "development" !== 'production' ? invariant(false, '%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.', _Component.displayName || _Component.name || 'Component') : _prodInvariant('105', _Component.displayName || _Component.name || 'Component') : void 0;
            break;
          }
      }
    }

    if (typeof newChild === 'string' || typeof newChild === 'number') {
      return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, priority));
    }

    if (isArray(newChild)) {
      return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, priority);
    }

    if (getIteratorFn(newChild)) {
      return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, priority);
    }

    if (isObject) {
      throwOnInvalidObjectType(returnFiber, newChild);
    }

    if (!disableNewFiberFeatures && typeof newChild === 'undefined') {
      // If the new child is undefined, and the return fiber is a composite
      // component, throw an error. If Fiber return types are disabled,
      // we already threw above.
      switch (returnFiber.tag) {
        case ClassComponent:
          {
            if ("development" !== 'production') {
              var _instance = returnFiber.stateNode;
              if (_instance.render._isMockFunction) {
                // We allow auto-mocks to proceed as if they're returning null.
                break;
              }
            }
          }
        // Intentionally fall through to the next case, which handles both
        // functions and classes
        // eslint-disable-next-lined no-fallthrough
        case FunctionalComponent:
          {
            var _Component2 = returnFiber.type;
            !false ? "development" !== 'production' ? invariant(false, '%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.', _Component2.displayName || _Component2.name || 'Component') : _prodInvariant('158', _Component2.displayName || _Component2.name || 'Component') : void 0;
          }
      }
    }

    // Remaining cases are all treated as empty.
    return deleteRemainingChildren(returnFiber, currentFirstChild);
  }

  return reconcileChildFibers;
}

exports.reconcileChildFibers = ChildReconciler(true, true);

exports.reconcileChildFibersInPlace = ChildReconciler(false, true);

exports.mountChildFibersInPlace = ChildReconciler(false, false);

exports.cloneChildFibers = function (current, workInProgress) {
  if (!workInProgress.child) {
    return;
  }
  if (current !== null && workInProgress.child === current.child) {
    // We use workInProgress.child since that lets Flow know that it can't be
    // null since we validated that already. However, as the line above suggests
    // they're actually the same thing.
    var currentChild = workInProgress.child;
    // TODO: This used to reset the pending priority. Not sure if that is needed.
    // workInProgress.pendingWorkPriority = current.pendingWorkPriority;
    // TODO: The below priority used to be set to NoWork which would've
    // dropped work. This is currently unobservable but will become
    // observable when the first sibling has lower priority work remaining
    // than the next sibling. At that point we should add tests that catches
    // this.
    var newChild = cloneFiber(currentChild, currentChild.pendingWorkPriority);
    workInProgress.child = newChild;

    newChild['return'] = workInProgress;
    while (currentChild.sibling !== null) {
      currentChild = currentChild.sibling;
      newChild = newChild.sibling = cloneFiber(currentChild, currentChild.pendingWorkPriority);
      newChild['return'] = workInProgress;
    }
    newChild.sibling = null;
  }

  // If there is no alternate, then we don't need to clone the children.
  // If the children of the alternate fiber is a different set, then we don't
  // need to clone. We need to reset the return fiber though since we'll
  // traverse down into them.
  var child = workInProgress.child;
  while (child !== null) {
    child['return'] = workInProgress;
    child = child.sibling;
  }
};
},{"104":104,"112":112,"117":117,"125":125,"131":131,"138":138,"22":22,"38":38,"40":40,"44":44,"45":45,"59":59,"67":67,"72":72,"73":73}],20:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var _prodInvariant = _dereq_(112);

var EventPluginUtils = _dereq_(13);

var invariant = _dereq_(131);

// Use to restore controlled state after a change event has fired.

var fiberHostComponent = null;

var ReactControlledComponentInjection = {
  injectFiberControlledHostComponent: function (hostComponentImpl) {
    // The fiber implementation doesn't use dynamic dispatch so we need to
    // inject the implementation.
    fiberHostComponent = hostComponentImpl;
  }
};

var restoreTarget = null;
var restoreQueue = null;

function restoreStateOfTarget(target) {
  // We perform this translation at the end of the event loop so that we
  // always receive the correct fiber here
  var internalInstance = EventPluginUtils.getInstanceFromNode(target);
  if (!internalInstance) {
    // Unmounted
    return;
  }
  if (typeof internalInstance.tag === 'number') {
    !(fiberHostComponent && typeof fiberHostComponent.restoreControlledState === 'function') ? "development" !== 'production' ? invariant(false, 'Fiber needs to be injected to handle a fiber target for controlled events.') : _prodInvariant('189') : void 0;
    var props = EventPluginUtils.getFiberCurrentPropsFromNode(internalInstance.stateNode);
    fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props);
    return;
  }
  !(typeof internalInstance.restoreControlledState === 'function') ? "development" !== 'production' ? invariant(false, 'The internal instance must be a React host component.') : _prodInvariant('190') : void 0;
  // If it is not a Fiber, we can just use dynamic dispatch.
  internalInstance.restoreControlledState();
}

var ReactControlledComponent = {
  injection: ReactControlledComponentInjection,

  enqueueStateRestore: function (target) {
    if (restoreTarget) {
      if (restoreQueue) {
        restoreQueue.push(target);
      } else {
        restoreQueue = [target];
      }
    } else {
      restoreTarget = target;
    }
  },
  restoreStateIfNeeded: function () {
    if (!restoreTarget) {
      return;
    }
    var target = restoreTarget;
    var queuedTargets = restoreQueue;
    restoreTarget = null;
    restoreQueue = null;

    restoreStateOfTarget(target);
    if (queuedTargets) {
      for (var i = 0; i < queuedTargets.length; i++) {
        restoreStateOfTarget(queuedTargets[i]);
      }
    }
  }
};

module.exports = ReactControlledComponent;
},{"112":112,"13":13,"131":131}],21:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var React = _dereq_(118);
var ReactPropTypesSecret = _dereq_(70);

var warning = _dereq_(138);

var hasReadOnlyValue = {
  'button': true,
  'checkbox': true,
  'image': true,
  'hidden': true,
  'radio': true,
  'reset': true,
  'submit': true
};

var 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: React.PropTypes.func
};

var loggedTypeFailures = {};
function getDeclarationErrorAddendum(ownerName) {
  if (ownerName) {
    return '\n\nCheck the render method of `' + ownerName + '`.';
  }
  return '';
}

/**
 * Provide a linked `value` attribute for controlled forms. You should not use
 * this outside of the ReactDOM controlled form components.
 */
var ReactControlledValuePropTypes = {
  checkPropTypes: function (tagName, props, ownerName) {
    for (var propName in propTypes) {
      if (propTypes.hasOwnProperty(propName)) {
        var error = propTypes[propName](props, propName, tagName, 'prop', null, ReactPropTypesSecret);
      }
      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(ownerName);
        "development" !== 'production' ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : void 0;
      }
    }
  }
};

module.exports = ReactControlledValuePropTypes;
},{"118":118,"138":138,"70":70}],22:[function(_dereq_,module,exports){
/**
 * Copyright 2014-present, 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.
 *
 * 
 */

'use strict';

// The Symbol used to tag the special React types. If there is no native Symbol
// nor polyfill, then a plain number is used for performance.
var REACT_COROUTINE_TYPE;
var REACT_YIELD_TYPE;
if (typeof Symbol === 'function' && Symbol['for']) {
  REACT_COROUTINE_TYPE = Symbol['for']('react.coroutine');
  REACT_YIELD_TYPE = Symbol['for']('react.yield');
} else {
  REACT_COROUTINE_TYPE = 0xeac8;
  REACT_YIELD_TYPE = 0xeac9;
}

exports.createCoroutine = function (children, handler, props) {
  var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;

  var coroutine = {
    // This tag allow us to uniquely identify this as a React Coroutine
    $$typeof: REACT_COROUTINE_TYPE,
    key: key == null ? null : '' + key,
    children: children,
    handler: handler,
    props: props
  };

  if ("development" !== 'production') {
    // TODO: Add _store property for marking this as validated.
    if (Object.freeze) {
      Object.freeze(coroutine.props);
      Object.freeze(coroutine);
    }
  }

  return coroutine;
};

exports.createYield = function (value) {
  var yieldNode = {
    // This tag allow us to uniquely identify this as a React Yield
    $$typeof: REACT_YIELD_TYPE,
    value: value
  };

  if ("development" !== 'production') {
    // TODO: Add _store property for marking this as validated.
    if (Object.freeze) {
      Object.freeze(yieldNode);
    }
  }

  return yieldNode;
};

/**
 * Verifies the object is a coroutine object.
 */
exports.isCoroutine = function (object) {
  return typeof object === 'object' && object !== null && object.$$typeof === REACT_COROUTINE_TYPE;
};

/**
 * Verifies the object is a yield object.
 */
exports.isYield = function (object) {
  return typeof object === 'object' && object !== null && object.$$typeof === REACT_YIELD_TYPE;
};

exports.REACT_YIELD_TYPE = REACT_YIELD_TYPE;
exports.REACT_COROUTINE_TYPE = REACT_COROUTINE_TYPE;
},{}],23:[function(_dereq_,module,exports){
/**
 * Copyright 2015-present, 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.
 *
 */

'use strict';

var ReactDOMComponentFlags = {
  hasCachedChildNodes: 1 << 0
};

module.exports = ReactDOMComponentFlags;
},{}],24:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var _prodInvariant = _dereq_(112);

var DOMProperty = _dereq_(8);
var ReactDOMComponentFlags = _dereq_(23);

var _require = _dereq_(73),
    HostComponent = _require.HostComponent,
    HostText = _require.HostText;

var invariant = _dereq_(131);

var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;
var Flags = ReactDOMComponentFlags;

var randomKey = Math.random().toString(36).slice(2);

var internalInstanceKey = '__reactInternalInstance$' + randomKey;

var internalEventHandlersKey = '__reactEventHandlers$' + randomKey;

/**
 * Check if a given node should be cached.
 */
function shouldPrecacheNode(node, nodeID) {
  return node.nodeType === 1 && node.getAttribute(ATTR_NAME) === String(nodeID) || node.nodeType === 8 && node.nodeValue === ' react-text: ' + nodeID + ' ' || node.nodeType === 8 && node.nodeValue === ' react-empty: ' + nodeID + ' ';
}

/**
 * Drill down (through composites and empty components) until we get a host or
 * host text component.
 *
 * This is pretty polymorphic but unavoidable with the current structure we have
 * for `_renderedChildren`.
 */
function getRenderedHostOrTextFromComponent(component) {
  var rendered;
  while (rendered = component._renderedComponent) {
    component = rendered;
  }
  return component;
}

/**
 * Populate `_hostNode` on the rendered host/text component with the given
 * DOM node. The passed `inst` can be a composite.
 */
function precacheNode(inst, node) {
  var hostInst = getRenderedHostOrTextFromComponent(inst);
  hostInst._hostNode = node;
  node[internalInstanceKey] = hostInst;
}

function precacheFiberNode(hostInst, node) {
  node[internalInstanceKey] = hostInst;
}

function uncacheNode(inst) {
  var node = inst._hostNode;
  if (node) {
    delete node[internalInstanceKey];
    inst._hostNode = null;
  }
}

/**
 * Populate `_hostNode` on each child of `inst`, assuming that the children
 * match up with the DOM (element) children of `node`.
 *
 * We cache entire levels at once to avoid an n^2 problem where we access the
 * children of a node sequentially and have to walk from the start to our target
 * node every time.
 *
 * Since we update `_renderedChildren` and the actual DOM at (slightly)
 * different times, we could race here and see a newer `_renderedChildren` than
 * the DOM nodes we see. To avoid this, ReactMultiChild calls
 * `prepareToManageChildren` before we change `_renderedChildren`, at which
 * time the container's child nodes are always cached (until it unmounts).
 */
function precacheChildNodes(inst, node) {
  if (inst._flags & Flags.hasCachedChildNodes) {
    return;
  }
  var children = inst._renderedChildren;
  var childNode = node.firstChild;
  outer: for (var name in children) {
    if (!children.hasOwnProperty(name)) {
      continue;
    }
    var childInst = children[name];
    var childID = getRenderedHostOrTextFromComponent(childInst)._domID;
    if (childID === 0) {
      // We're currently unmounting this child in ReactMultiChild; skip it.
      continue;
    }
    // We assume the child nodes are in the same order as the child instances.
    for (; childNode !== null; childNode = childNode.nextSibling) {
      if (shouldPrecacheNode(childNode, childID)) {
        precacheNode(childInst, childNode);
        continue outer;
      }
    }
    // We reached the end of the DOM children without finding an ID match.
    !false ? "development" !== 'production' ? invariant(false, 'Unable to find element with ID %s.', childID) : _prodInvariant('32', childID) : void 0;
  }
  inst._flags |= Flags.hasCachedChildNodes;
}

/**
 * Given a DOM node, return the closest ReactDOMComponent or
 * ReactDOMTextComponent instance ancestor.
 */
function getClosestInstanceFromNode(node) {
  if (node[internalInstanceKey]) {
    return node[internalInstanceKey];
  }

  // Walk up the tree until we find an ancestor whose instance we have cached.
  var parents = [];
  while (!node[internalInstanceKey]) {
    parents.push(node);
    if (node.parentNode) {
      node = node.parentNode;
    } else {
      // Top of the tree. This node must not be part of a React tree (or is
      // unmounted, potentially).
      return null;
    }
  }

  var closest;
  var inst = node[internalInstanceKey];
  if (inst.tag === HostComponent || inst.tag === HostText) {
    // In Fiber, this will always be the deepest root.
    return inst;
  }
  for (; node && (inst = node[internalInstanceKey]); node = parents.pop()) {
    closest = inst;
    if (parents.length) {
      precacheChildNodes(inst, node);
    }
  }

  return closest;
}

/**
 * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
 * instance, or null if the node was not rendered by this React.
 */
function getInstanceFromNode(node) {
  var inst = node[internalInstanceKey];
  if (inst) {
    if (inst.tag === HostComponent || inst.tag === HostText) {
      return inst;
    } else if (inst._hostNode === node) {
      return inst;
    } else {
      return null;
    }
  }
  inst = getClosestInstanceFromNode(node);
  if (inst != null && inst._hostNode === node) {
    return inst;
  } else {
    return null;
  }
}

/**
 * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
 * DOM node.
 */
function getNodeFromInstance(inst) {
  if (inst.tag === HostComponent || inst.tag === HostText) {
    // In Fiber this, is just the state node right now. We assume it will be
    // a host component or host text.
    return inst.stateNode;
  }

  // Without this first invariant, passing a non-DOM-component triggers the next
  // invariant for a missing parent, which is super confusing.
  !(inst._hostNode !== undefined) ? "development" !== 'production' ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0;

  if (inst._hostNode) {
    return inst._hostNode;
  }

  // Walk up the tree until we find an ancestor whose DOM node we have cached.
  var parents = [];
  while (!inst._hostNode) {
    parents.push(inst);
    !inst._hostParent ? "development" !== 'production' ? invariant(false, 'React DOM tree root should always have a node reference.') : _prodInvariant('34') : void 0;
    inst = inst._hostParent;
  }

  // Now parents contains each ancestor that does *not* have a cached native
  // node, and `inst` is the deepest ancestor that does.
  for (; parents.length; inst = parents.pop()) {
    precacheChildNodes(inst, inst._hostNode);
  }

  return inst._hostNode;
}

function getFiberCurrentPropsFromNode(node) {
  return node[internalEventHandlersKey] || null;
}

function updateFiberProps(node, props) {
  node[internalEventHandlersKey] = props;
}

var ReactDOMComponentTree = {
  getClosestInstanceFromNode: getClosestInstanceFromNode,
  getInstanceFromNode: getInstanceFromNode,
  getNodeFromInstance: getNodeFromInstance,
  precacheChildNodes: precacheChildNodes,
  precacheNode: precacheNode,
  uncacheNode: uncacheNode,
  precacheFiberNode: precacheFiberNode,
  getFiberCurrentPropsFromNode: getFiberCurrentPropsFromNode,
  updateFiberProps: updateFiberProps
};

module.exports = ReactDOMComponentTree;
},{"112":112,"131":131,"23":23,"73":73,"8":8}],25:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 */

'use strict';

var ReactDOMFeatureFlags = {
  useCreateElement: true,
  useFiber: false
};

module.exports = ReactDOMFeatureFlags;
},{}],26:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 * 
 */

'use strict';

var _prodInvariant = _dereq_(112);

var ReactBrowserEventEmitter = _dereq_(18);
var ReactControlledComponent = _dereq_(20);
var ReactDOMComponentTree = _dereq_(24);
var ReactFeatureFlags = _dereq_(44);
var ReactDOMFeatureFlags = _dereq_(25);
var ReactDOMFiberComponent = _dereq_(27);
var ReactDOMFrameScheduling = _dereq_(32);
var ReactDOMInjection = _dereq_(33);
var ReactGenericBatching = _dereq_(61);
var ReactFiberReconciler = _dereq_(55);
var ReactInputSelection = _dereq_(63);
var ReactInstanceMap = _dereq_(64);
var ReactPortal = _dereq_(67);

var _require = _dereq_(118),
    isValidElement = _require.isValidElement;

var _require2 = _dereq_(51),
    injectInternals = _require2.injectInternals;

var findDOMNode = _dereq_(96);
var invariant = _dereq_(131);
var warning = _dereq_(138);

var createElement = ReactDOMFiberComponent.createElement,
    getChildNamespace = ReactDOMFiberComponent.getChildNamespace,
    setInitialProperties = ReactDOMFiberComponent.setInitialProperties,
    diffProperties = ReactDOMFiberComponent.diffProperties,
    updateProperties = ReactDOMFiberComponent.updateProperties;
var precacheFiberNode = ReactDOMComponentTree.precacheFiberNode,
    updateFiberProps = ReactDOMComponentTree.updateFiberProps;


if ("development" !== 'production') {
  var validateDOMNesting = _dereq_(115);
  var updatedAncestorInfo = validateDOMNesting.updatedAncestorInfo;
}

var DOCUMENT_NODE = 9;

ReactDOMInjection.inject();
ReactControlledComponent.injection.injectFiberControlledHostComponent(ReactDOMFiberComponent);
findDOMNode._injectFiber(function (fiber) {
  return DOMRenderer.findHostInstance(fiber);
});

var eventsEnabled = null;
var selectionInformation = null;

var ELEMENT_NODE_TYPE = 1;
var DOC_NODE_TYPE = 9;
var DOCUMENT_FRAGMENT_NODE_TYPE = 11;

/**
 * True if the supplied DOM node is a valid node element.
 *
 * @param {?DOMElement} node The candidate DOM node.
 * @return {boolean} True if the DOM is a valid DOM node.
 * @internal
 */
function isValidContainer(node) {
  return !!(node && (node.nodeType === ELEMENT_NODE_TYPE || node.nodeType === DOC_NODE_TYPE || node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE));
}

function validateContainer(container) {
  if (!isValidContainer(container)) {
    throw new Error('Target container is not a DOM element.');
  }
}

function getReactRootElementInContainer(container) {
  if (!container) {
    return null;
  }

  if (container.nodeType === DOC_NODE_TYPE) {
    return container.documentElement;
  } else {
    return container.firstChild;
  }
}

function shouldAutoFocusHostComponent(type, props) {
  switch (type) {
    case 'button':
    case 'input':
    case 'select':
    case 'textarea':
      return !!props.autoFocus;
  }
  return false;
}

var DOMRenderer = ReactFiberReconciler({
  getRootHostContext: function (rootContainerInstance) {
    var ownNamespace = rootContainerInstance.namespaceURI || null;
    var type = rootContainerInstance.tagName;
    var namespace = getChildNamespace(ownNamespace, type);
    if ("development" !== 'production') {
      var isMountingIntoDocument = rootContainerInstance.ownerDocument.documentElement === rootContainerInstance;
      var validatedTag = isMountingIntoDocument ? '#document' : type.toLowerCase();
      var _ancestorInfo = updatedAncestorInfo(null, validatedTag, null);
      return { namespace: namespace, ancestorInfo: _ancestorInfo };
    }
    return namespace;
  },
  getChildHostContext: function (parentHostContext, type) {
    if ("development" !== 'production') {
      var parentHostContextDev = parentHostContext;
      var _namespace = getChildNamespace(parentHostContextDev.namespace, type);
      var _ancestorInfo2 = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type, null);
      return { namespace: _namespace, ancestorInfo: _ancestorInfo2 };
    }
    var parentNamespace = parentHostContext;
    return getChildNamespace(parentNamespace, type);
  },
  getPublicInstance: function (instance) {
    return instance;
  },
  prepareForCommit: function () {
    eventsEnabled = ReactBrowserEventEmitter.isEnabled();
    selectionInformation = ReactInputSelection.getSelectionInformation();
    ReactBrowserEventEmitter.setEnabled(false);
  },
  resetAfterCommit: function () {
    ReactInputSelection.restoreSelection(selectionInformation);
    selectionInformation = null;
    ReactBrowserEventEmitter.setEnabled(eventsEnabled);
    eventsEnabled = null;
  },
  createInstance: function (type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
    var parentNamespace = void 0;
    if ("development" !== 'production') {
      // TODO: take namespace into account when validating.
      var hostContextDev = hostContext;
      validateDOMNesting(type, null, null, hostContextDev.ancestorInfo);
      if (typeof props.children === 'string' || typeof props.children === 'number') {
        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type, null);
        validateDOMNesting(null, String(props.children), null, ownAncestorInfo);
      }
      parentNamespace = hostContextDev.namespace;
    } else {
      parentNamespace = hostContext;
    }
    var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
    precacheFiberNode(internalInstanceHandle, domElement);
    updateFiberProps(domElement, props);
    return domElement;
  },
  appendInitialChild: function (parentInstance, child) {
    parentInstance.appendChild(child);
  },
  finalizeInitialChildren: function (domElement, type, props, rootContainerInstance) {
    setInitialProperties(domElement, type, props, rootContainerInstance);
    return shouldAutoFocusHostComponent(type, props);
  },
  prepareUpdate: function (domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
    if ("development" !== 'production') {
      var hostContextDev = hostContext;
      if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type, null);
        validateDOMNesting(null, String(newProps.children), null, ownAncestorInfo);
      }
    }
    return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);
  },
  commitMount: function (domElement, type, newProps, internalInstanceHandle) {
    domElement.focus();
  },
  commitUpdate: function (domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
    // Update the props handle so that we know which props are the ones with
    // with current event handlers.
    updateFiberProps(domElement, newProps);
    // Apply the diff to the DOM node.
    updateProperties(domElement, updatePayload, type, oldProps, newProps);
  },
  shouldSetTextContent: function (props) {
    return typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && typeof props.dangerouslySetInnerHTML.__html === 'string';
  },
  resetTextContent: function (domElement) {
    domElement.textContent = '';
  },
  createTextInstance: function (text, rootContainerInstance, hostContext, internalInstanceHandle) {
    if ("development" !== 'production') {
      var hostContextDev = hostContext;
      validateDOMNesting(null, text, null, hostContextDev.ancestorInfo);
    }
    var textNode = document.createTextNode(text);
    precacheFiberNode(internalInstanceHandle, textNode);
    return textNode;
  },
  commitTextUpdate: function (textInstance, oldText, newText) {
    textInstance.nodeValue = newText;
  },
  appendChild: function (parentInstance, child) {
    parentInstance.appendChild(child);
  },
  insertBefore: function (parentInstance, child, beforeChild) {
    parentInstance.insertBefore(child, beforeChild);
  },
  removeChild: function (parentInstance, child) {
    parentInstance.removeChild(child);
  },


  scheduleAnimationCallback: ReactDOMFrameScheduling.rAF,

  scheduleDeferredCallback: ReactDOMFrameScheduling.rIC,

  useSyncScheduling: true

});

ReactGenericBatching.injection.injectFiberBatchedUpdates(DOMRenderer.batchedUpdates);

var warned = false;

function warnAboutUnstableUse() {
  // Ignore this warning is the feature flag is turned on. E.g. for tests.
  "development" !== 'production' ? warning(warned || ReactDOMFeatureFlags.useFiber, 'You are using React DOM Fiber which is an experimental renderer. ' + 'It is likely to have bugs, breaking changes and is unsupported.') : void 0;
  warned = true;
}

function renderSubtreeIntoContainer(parentComponent, children, containerNode, callback) {
  validateContainer(containerNode);

  var container = containerNode.nodeType === DOCUMENT_NODE ? containerNode.documentElement : containerNode;
  var root = container._reactRootContainer;
  if (!root) {
    // First clear any existing content.
    while (container.lastChild) {
      container.removeChild(container.lastChild);
    }
    var newRoot = DOMRenderer.createContainer(container);
    root = container._reactRootContainer = newRoot;
    // Initial mount should not be batched.
    DOMRenderer.unbatchedUpdates(function () {
      DOMRenderer.updateContainer(children, newRoot, parentComponent, callback);
    });
  } else {
    DOMRenderer.updateContainer(children, root, parentComponent, callback);
  }
  return DOMRenderer.getPublicRootInstance(root);
}

var ReactDOM = {
  render: function (element, container, callback) {
    validateContainer(container);

    if (ReactFeatureFlags.disableNewFiberFeatures) {
      // Top-level check occurs here instead of inside child reconciler because
      // because requirements vary between renderers. E.g. React Art
      // allows arrays.
      if (!isValidElement(element)) {
        if (typeof element === 'string') {
          !false ? "development" !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element. Instead of passing a string like \'div\', pass React.createElement(\'div\') or <div />.') : _prodInvariant('146') : void 0;
        } else if (typeof element === 'function') {
          !false ? "development" !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element. Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.') : _prodInvariant('147') : void 0;
        } else if (element != null && typeof element.props !== 'undefined') {
          // Check if it quacks like an element
          !false ? "development" !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element. This may be caused by unintentionally loading two independent copies of React.') : _prodInvariant('148') : void 0;
        } else {
          !false ? "development" !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element.') : _prodInvariant('149') : void 0;
        }
      }
    }

    if ("development" !== 'production') {
      var isRootRenderedBySomeReact = Boolean(container._reactRootContainer);
      var rootEl = getReactRootElementInContainer(container);
      var hasNonRootReactChild = Boolean(rootEl && ReactDOMComponentTree.getInstanceFromNode(rootEl));

      "development" !== 'production' ? warning(!hasNonRootReactChild || isRootRenderedBySomeReact, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : void 0;

      "development" !== 'production' ? warning(!container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : void 0;
    }

    return renderSubtreeIntoContainer(null, element, container, callback);
  },
  unstable_renderSubtreeIntoContainer: function (parentComponent, element, containerNode, callback) {
    !(parentComponent != null && ReactInstanceMap.has(parentComponent)) ? "development" !== 'production' ? invariant(false, 'parentComponent must be a valid React Component') : _prodInvariant('38') : void 0;
    return renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);
  },
  unmountComponentAtNode: function (container) {
    !isValidContainer(container) ? "development" !== 'production' ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : _prodInvariant('40') : void 0;
    warnAboutUnstableUse();

    if (container._reactRootContainer) {
      if ("development" !== 'production') {
        var rootEl = getReactRootElementInContainer(container);
        var renderedByDifferentReact = rootEl && !ReactDOMComponentTree.getInstanceFromNode(rootEl);
        "development" !== 'production' ? warning(!renderedByDifferentReact, 'unmountComponentAtNode(): The node you\'re attempting to unmount ' + 'was rendered by another copy of React.') : void 0;
      }

      // Unmount should not be batched.
      return DOMRenderer.unbatchedUpdates(function () {
        return renderSubtreeIntoContainer(null, null, container, function () {
          container._reactRootContainer = null;
        });
      });
    }
  },


  findDOMNode: findDOMNode,

  unstable_createPortal: function (children, container) {
    var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;

    // TODO: pass ReactDOM portal implementation as third argument
    return ReactPortal.createPortal(children, container, null, key);
  },


  unstable_batchedUpdates: ReactGenericBatching.batchedUpdates,

  unstable_deferredUpdates: DOMRenderer.deferredUpdates

};

if (typeof injectInternals === 'function') {
  injectInternals({
    findFiberByHostInstance: ReactDOMComponentTree.getClosestInstanceFromNode,
    findHostInstanceByFiber: DOMRenderer.findHostInstance
  });
}

module.exports = ReactDOM;
},{"112":112,"115":115,"118":118,"131":131,"138":138,"18":18,"20":20,"24":24,"25":25,"27":27,"32":32,"33":33,"44":44,"51":51,"55":55,"61":61,"63":63,"64":64,"67":67,"96":96}],27:[function(_dereq_,module,exports){
/**
 * Copyright 2013-present, 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.
 *
 * 
 */

/* global hasOwnProperty:true */

'use strict';

var _extends = _assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _prodInvariant = _dereq_(112),
    _assign = _dereq_(139);

var CSSPropertyOperations = _dereq_(4);
var DOMNamespaces = _dereq_(7);
var DOMProperty = _dereq_(8);
var DOMPropertyOperations = _dereq_(9);
var EventPluginRegistry = _dereq_(12);
var ReactBrowserEventEmitter = _dereq_(18);
var ReactDOMFiberInput = _dereq_(28);
var ReactDOMFiberOption = _dereq_(29);
var ReactDOMFiberSelect = _dereq_(30);
var ReactDOMFiberTextarea = _dereq_(31);

var _require = _dereq_(38),
    getCurrentFiberOwnerName = _require.getCurrentFiberOwnerName;

var emptyFunction = _dereq_(124);
var invariant = _dereq_(131);
var isEventSupported = _dereq_(109);
var setInnerHTML = _dereq_(113);
var setTextContent = _dereq_(114);
var inputValueTracking = _dereq_(108);
var warning = _dereq_(138);

if ("development" !== 'production') {
  var ReactDOMInvalidARIAHook = _dereq_(34);
  var ReactDOMNullInputValuePropHook = _dereq_(35);
  var ReactDOMUnknownPropertyHook = _dereq_(37);
  var validateARIAProperties = ReactDOMInvalidARIAHook.validateProperties;
  var validateInputPropertes = ReactDOMNullInputValuePropHook.validateProperties;
  var validateUnknownPropertes = ReactDOMUnknownPropertyHook.validateProperties;
}

var didWarnShadyDOM = false;

var listenTo = ReactBrowserEventEmitter.listenTo;
var registrationNameModules = EventPluginRegistry.registrationNameModules;

var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';
var CHILDREN = 'children';
var STYLE = 'style';
var HTML = '__html';

var HTML_NAMESPACE = DOMNamespaces.html,
    SVG_NAMESPACE = DOMNamespaces.svg,
    MATH_NAMESPACE = DOMNamespaces.mathml;

// Node type for document fragments (Node.DOCUMENT_FRAGMENT_NODE).

var DOC_FRAGMENT_TYPE = 11;

function getDeclarationErrorAddendum() {
  var ownerName = getCurrentFiberOwnerName();
  if (ownerName) {
    // TODO: also report the stack.
    return '\n\nThis DOM node was rendered by `' + ownerName + '`.';
  }
  return '';
}

function assertValidProps(tag, props) {
  if (!props) {
    return;
  }
  // Note the use of `==` which checks for null or undefined.
  if (voidElementTags[tag]) {
    !(props.children == null && props.dangerouslySetInnerHTML == null) ? "development" !== 'production' ? invariant(false, '%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s', tag, getDeclarationErrorAddendum()) : _prodInvariant('137', tag, getDeclarationErrorAddendum()) : void 0;
  }
  if (props.dangerouslySetInnerHTML != null) {
    !(props.children == null) ? "development" !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : _prodInvariant('60') : void 0;
    !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? "development" !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-in
Download .txt
gitextract_5yj4vl_y/

├── LICENSE
├── LICENSE-react
├── LICENSE-react-examples
├── README.md
├── css/
│   └── base.css
├── fiber.html
├── index.html
├── js/
│   ├── react-dom-fiber.js
│   ├── react-dom.js
│   └── react.js
└── stack.html
Download .txt
SYMBOL INDEX (681 symbols across 3 files)

FILE: js/react-dom-fiber.js
  function s (line 32) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function isPresto (line 149) | function isPresto() {
  function isKeypressCommand (line 197) | function isKeypressCommand(nativeEvent) {
  function getCompositionEventType (line 209) | function getCompositionEventType(topLevelType) {
  function isFallbackCompositionStart (line 228) | function isFallbackCompositionStart(topLevelType, nativeEvent) {
  function isFallbackCompositionEnd (line 239) | function isFallbackCompositionEnd(topLevelType, nativeEvent) {
  function getDataFromCustomEvent (line 267) | function getDataFromCustomEvent(nativeEvent) {
  function extractCompositionEvent (line 281) | function extractCompositionEvent(topLevelType, targetInst, nativeEvent, ...
  function getNativeBeforeInputChars (line 333) | function getNativeBeforeInputChars(topLevelType, nativeEvent) {
  function getFallbackBeforeInputChars (line 387) | function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
  function extractBeforeInputEvent (line 441) | function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, ...
  function prefixKey (line 553) | function prefixKey(prefix, key) {
  function createAndAccumulateChangeEvent (line 888) | function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
  function shouldUseChangeEvent (line 905) | function shouldUseChangeEvent(elem) {
  function manualDispatchChangeEvent (line 916) | function manualDispatchChangeEvent(nativeEvent) {
  function runEventInBatch (line 933) | function runEventInBatch(event) {
  function startWatchingForChangeEventIE8 (line 938) | function startWatchingForChangeEventIE8(target, targetInst) {
  function stopWatchingForChangeEventIE8 (line 944) | function stopWatchingForChangeEventIE8() {
  function getInstIfValueChanged (line 953) | function getInstIfValueChanged(targetInst) {
  function getTargetInstForChangeEvent (line 959) | function getTargetInstForChangeEvent(topLevelType, targetInst) {
  function handleEventsForChangeEventIE8 (line 965) | function handleEventsForChangeEventIE8(topLevelType, target, targetInst) {
  function startWatchingForValueChange (line 991) | function startWatchingForValueChange(target, targetInst) {
  function stopWatchingForValueChange (line 1001) | function stopWatchingForValueChange() {
  function handlePropertyChange (line 1014) | function handlePropertyChange(nativeEvent) {
  function handleEventsForInputEventPolyfill (line 1023) | function handleEventsForInputEventPolyfill(topLevelType, target, targetI...
  function getTargetInstForInputEventPolyfill (line 1046) | function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {
  function shouldUseClickEvent (line 1065) | function shouldUseClickEvent(elem) {
  function getTargetInstForClickEvent (line 1073) | function getTargetInstForClickEvent(topLevelType, targetInst) {
  function getTargetInstForInputOrChangeEvent (line 1079) | function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {
  function checkMask (line 1201) | function checkMask(value, bitmask) {
  function isAttributeNameSafe (line 1418) | function isAttributeNameSafe(attributeName) {
  function shouldIgnoreValue (line 1434) | function shouldIgnoreValue(propertyInfo, value) {
  function isInteractive (line 1783) | function isInteractive(tag) {
  function shouldPreventMouseEvent (line 1787) | function shouldPreventMouseEvent(name, type, props) {
  function recomputePluginOrdering (line 1975) | function recomputePluginOrdering() {
  function publishEventForPlugin (line 2004) | function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
  function publishRegistrationName (line 2031) | function publishRegistrationName(registrationName, pluginModule, eventNa...
  function isEndish (line 2234) | function isEndish(topLevelType) {
  function isMoveish (line 2238) | function isMoveish(topLevelType) {
  function isStartish (line 2241) | function isStartish(topLevelType) {
  function executeDispatch (line 2268) | function executeDispatch(event, simulated, listener, inst) {
  function executeDispatchesInOrder (line 2282) | function executeDispatchesInOrder(event, simulated) {
  function executeDispatchesInOrderStopAtTrueImpl (line 2310) | function executeDispatchesInOrderStopAtTrueImpl(event) {
  function executeDispatchesInOrderStopAtTrue (line 2337) | function executeDispatchesInOrderStopAtTrue(event) {
  function executeDirectDispatch (line 2353) | function executeDirectDispatch(event) {
  function hasDispatches (line 2372) | function hasDispatches(event) {
  function listenerAtPhase (line 2429) | function listenerAtPhase(inst, event, propagationPhase) {
  function accumulateDirectionalDispatches (line 2440) | function accumulateDirectionalDispatches(inst, phase, event) {
  function accumulateTwoPhaseDispatchesSingle (line 2458) | function accumulateTwoPhaseDispatchesSingle(event) {
  function accumulateTwoPhaseDispatchesSingleSkipTarget (line 2467) | function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
  function accumulateDispatches (line 2480) | function accumulateDispatches(inst, ignoredDirection, event) {
  function accumulateDirectDispatchesSingle (line 2496) | function accumulateDirectDispatchesSingle(event) {
  function accumulateTwoPhaseDispatches (line 2502) | function accumulateTwoPhaseDispatches(events) {
  function accumulateTwoPhaseDispatchesSkipTarget (line 2506) | function accumulateTwoPhaseDispatchesSkipTarget(events) {
  function accumulateEnterLeaveDispatches (line 2510) | function accumulateEnterLeaveDispatches(leave, enter, from, to) {
  function accumulateDirectDispatches (line 2514) | function accumulateDirectDispatches(events) {
  function FallbackCompositionState (line 2567) | function FallbackCompositionState(root) {
  function getListeningForDocument (line 3117) | function getListeningForDocument(mountAt) {
  function coerceRef (line 3369) | function coerceRef(current, element) {
  function throwOnInvalidObjectType (line 3406) | function throwOnInvalidObjectType(returnFiber, newChild) {
  function ChildReconciler (line 3428) | function ChildReconciler(shouldClone, shouldTrackSideEffects) {
  function restoreStateOfTarget (line 4468) | function restoreStateOfTarget(target) {
  function getDeclarationErrorAddendum (line 4565) | function getDeclarationErrorAddendum(ownerName) {
  function shouldPrecacheNode (line 4731) | function shouldPrecacheNode(node, nodeID) {
  function getRenderedHostOrTextFromComponent (line 4742) | function getRenderedHostOrTextFromComponent(component) {
  function precacheNode (line 4754) | function precacheNode(inst, node) {
  function precacheFiberNode (line 4760) | function precacheFiberNode(hostInst, node) {
  function uncacheNode (line 4764) | function uncacheNode(inst) {
  function precacheChildNodes (line 4786) | function precacheChildNodes(inst, node) {
  function getClosestInstanceFromNode (line 4819) | function getClosestInstanceFromNode(node) {
  function getInstanceFromNode (line 4857) | function getInstanceFromNode(node) {
  function getNodeFromInstance (line 4880) | function getNodeFromInstance(inst) {
  function getFiberCurrentPropsFromNode (line 4912) | function getFiberCurrentPropsFromNode(node) {
  function updateFiberProps (line 4916) | function updateFiberProps(node, props) {
  function isValidContainer (line 5028) | function isValidContainer(node) {
  function validateContainer (line 5032) | function validateContainer(container) {
  function getReactRootElementInContainer (line 5038) | function getReactRootElementInContainer(container) {
  function shouldAutoFocusHostComponent (line 5050) | function shouldAutoFocusHostComponent(type, props) {
  function warnAboutUnstableUse (line 5185) | function warnAboutUnstableUse() {
  function renderSubtreeIntoContainer (line 5191) | function renderSubtreeIntoContainer(parentComponent, children, container...
  function getDeclarationErrorAddendum (line 5367) | function getDeclarationErrorAddendum() {
  function assertValidProps (line 5376) | function assertValidProps(tag, props) {
  function ensureListeningTo (line 5404) | function ensureListeningTo(rootContainerElement, registrationName) {
  function trapClickOnNonInteractiveElement (line 5443) | function trapClickOnNonInteractiveElement(node) {
  function trapBubbledEventsLocal (line 5456) | function trapBubbledEventsLocal(node, tag) {
  function isCustomComponent (line 5527) | function isCustomComponent(tagName, props) {
  function setInitialDOMProperties (line 5531) | function setInitialDOMProperties(domElement, rootContainerElement, nextP...
  function updateDOMProperties (line 5578) | function updateDOMProperties(domElement, updatePayload, wasCustomCompone...
  function getIntrinsicNamespace (line 5610) | function getIntrinsicNamespace(type) {
  function isControlled (line 5992) | function isControlled(props) {
  function updateNamedCousins (line 6170) | function updateNamedCousins(rootNode, props) {
  function flattenChildren (line 6228) | function flattenChildren(children) {
  function getDeclarationErrorAddendum (line 6305) | function getDeclarationErrorAddendum() {
  function checkSelectPropTypes (line 6318) | function checkSelectPropTypes(props) {
  function updateOptions (line 6335) | function updateOptions(node, multiple, propValue) {
  function inject (line 6764) | function inject() {
  function getStackAddendum (line 6823) | function getStackAddendum(debugID) {
  function validateProperty (line 6833) | function validateProperty(tagName, name, debugID) {
  function warnInvalidARIAProps (line 6859) | function warnInvalidARIAProps(type, props, debugID) {
  function validateProperties (line 6880) | function validateProperties(type, props, debugID /* Stack only */) {
  function getStackAddendum (line 6924) | function getStackAddendum(debugID) {
  function validateProperties (line 6934) | function validateProperties(type, props, debugID /* Stack only */) {
  function isCollapsed (line 6985) | function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {
  function getIEOffsets (line 7003) | function getIEOffsets(node) {
  function getModernOffsets (line 7026) | function getModernOffsets(node) {
  function setIEOffsets (line 7088) | function setIEOffsets(node, offsets) {
  function setModernOffsets (line 7122) | function setModernOffsets(node, offsets) {
  function getStackAddendum (line 7194) | function getStackAddendum(debugID) {
  function validateProperties (line 7275) | function validateProperties(type, props, debugID /* Stack only */) {
  function getCurrentFiberOwnerName (line 7320) | function getCurrentFiberOwnerName() {
  function getCurrentFiberStackAddendum (line 7333) | function getCurrentFiberStackAddendum() {
  function invokeGuardedCallback (line 7756) | function invokeGuardedCallback(name, func, a) {
  function runEventQueueInBatch (line 7825) | function runEventQueueInBatch(events) {
  function findRootContainerNode (line 7876) | function findRootContainerNode(inst) {
  function TopLevelCallbackBookKeeping (line 7899) | function TopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetIn...
  function handleTopLevelImpl (line 7915) | function handleTopLevelImpl(bookKeeping) {
  function scrollValueMonitor (line 7942) | function scrollValueMonitor(cb) {
  function shouldConstruct (line 8164) | function shouldConstruct(Component) {
  function createFiberFromElementType (line 8267) | function createFiberFromElementType(type, key, debugOwner) {
  function markChildAsProgressed (line 8404) | function markChildAsProgressed(current, workInProgress, priorityLevel) {
  function clearDeletions (line 8416) | function clearDeletions(workInProgress) {
  function transferDeletions (line 8420) | function transferDeletions(workInProgress) {
  function reconcileChildren (line 8426) | function reconcileChildren(current, workInProgress, nextChildren) {
  function reconcileChildrenAtPriority (line 8431) | function reconcileChildrenAtPriority(current, workInProgress, nextChildr...
  function updateFragment (line 8464) | function updateFragment(current, workInProgress) {
  function markRef (line 8480) | function markRef(current, workInProgress) {
  function updateFunctionalComponent (line 8488) | function updateFunctionalComponent(current, workInProgress) {
  function updateClassComponent (line 8528) | function updateClassComponent(current, workInProgress, priorityLevel) {
  function finishClassComponent (line 8551) | function finishClassComponent(current, workInProgress, shouldUpdate, has...
  function updateHostRoot (line 8577) | function updateHostRoot(current, workInProgress, priorityLevel) {
  function updateHostComponent (line 8606) | function updateHostComponent(current, workInProgress) {
  function updateHostText (line 8699) | function updateHostText(current, workInProgress) {
  function mountIndeterminateComponent (line 8710) | function mountIndeterminateComponent(current, workInProgress, priorityLe...
  function updateCoroutineComponent (line 8765) | function updateCoroutineComponent(current, workInProgress) {
  function updatePortalComponent (line 8810) | function updatePortalComponent(current, workInProgress) {
  function bailoutOnAlreadyFinishedWork (line 8860) | function bailoutOnAlreadyFinishedWork(current, workInProgress) {
  function bailoutOnLowPriority (line 8887) | function bailoutOnLowPriority(current, workInProgress) {
  function memoizeProps (line 8903) | function memoizeProps(workInProgress, nextProps) {
  function memoizeState (line 8909) | function memoizeState(workInProgress, nextState) {
  function beginWork (line 8915) | function beginWork(current, workInProgress, priorityLevel) {
  function beginFailedWork (line 8967) | function beginFailedWork(current, workInProgress, priorityLevel) {
  function checkShouldComponentUpdate (line 9090) | function checkShouldComponentUpdate(workInProgress, oldProps, newProps, ...
  function checkClassInstance (line 9115) | function checkClassInstance(workInProgress) {
  function markUpdate (line 9148) | function markUpdate(workInProgress) {
  function markUpdateIfAlreadyInProgress (line 9152) | function markUpdateIfAlreadyInProgress(current, workInProgress) {
  function resetInputPointers (line 9162) | function resetInputPointers(workInProgress, instance) {
  function adoptClassInstance (line 9167) | function adoptClassInstance(workInProgress, instance) {
  function constructClassInstance (line 9174) | function constructClassInstance(workInProgress) {
  function mountClassInstance (line 9194) | function mountClassInstance(workInProgress, priorityLevel) {
  function resumeMountClassInstance (line 9221) | function resumeMountClassInstance(workInProgress, priorityLevel) {
  function updateClassInstance (line 9271) | function updateClassInstance(current, workInProgress, priorityLevel) {
  function safelyCallComponentWillUnmount (line 9396) | function safelyCallComponentWillUnmount(current, instance) {
  function safelyDetachRef (line 9405) | function safelyDetachRef(current) {
  function detachRefIfNeeded (line 9417) | function detachRefIfNeeded(current, finishedWork) {
  function getHostParent (line 9426) | function getHostParent(fiber) {
  function getHostParentFiber (line 9442) | function getHostParentFiber(fiber) {
  function isHostParent (line 9453) | function isHostParent(fiber) {
  function getHostSibling (line 9457) | function getHostSibling(fiber) {
  function commitPlacement (line 9498) | function commitPlacement(finishedWork) {
  function commitNestedUnmounts (line 9556) | function commitNestedUnmounts(root) {
  function unmountHostComponents (line 9585) | function unmountHostComponents(parent, current) {
  function commitDeletion (line 9633) | function commitDeletion(current) {
  function commitUnmount (line 9655) | function commitUnmount(current) {
  function commitWork (line 9692) | function commitWork(current, finishedWork) {
  function commitLifeCycles (line 9741) | function commitLifeCycles(current, finishedWork) {
  function commitRef (line 9806) | function commitRef(finishedWork) {
  function markChildAsProgressed (line 9882) | function markChildAsProgressed(current, workInProgress, priorityLevel) {
  function markUpdate (line 9894) | function markUpdate(workInProgress) {
  function appendAllYields (line 9900) | function appendAllYields(yields, workInProgress) {
  function moveCoroutineToHandlerPhase (line 9926) | function moveCoroutineToHandlerPhase(current, workInProgress) {
  function appendAllChildren (line 9955) | function appendAllChildren(parent, workInProgress) {
  function completeWork (line 9983) | function completeWork(current, workInProgress) {
  function getUnmaskedContext (line 10166) | function getUnmaskedContext(workInProgress) {
  function cacheContext (line 10179) | function cacheContext(workInProgress, unmaskedContext, maskedContext) {
  function isContextConsumer (line 10224) | function isContextConsumer(fiber) {
  function isContextProvider (line 10229) | function isContextProvider(fiber) {
  function popContextProvider (line 10234) | function popContextProvider(fiber) {
  function processChildContext (line 10251) | function processChildContext(fiber, parentContext, isReconciling) {
  function logCapturedError (line 10422) | function logCapturedError(capturedError) {
  function getRootHostContainer (line 10506) | function getRootHostContainer() {
  function pushHostContainer (line 10512) | function pushHostContainer(fiber, nextRootInstance) {
  function popHostContainer (line 10525) | function popHostContainer(fiber) {
  function getHostContext (line 10531) | function getHostContext() {
  function pushHostContext (line 10537) | function pushHostContext(fiber) {
  function popHostContext (line 10555) | function popHostContext(fiber) {
  function resetHostContainer (line 10566) | function resetHostContainer() {
  function scheduleTopLevelUpdate (line 10657) | function scheduleTopLevelUpdate(current, element, callback) {
  function scheduleAnimationCallback (line 10914) | function scheduleAnimationCallback(callback) {
  function scheduleDeferredCallback (line 10921) | function scheduleDeferredCallback(callback) {
  function resetContextStack (line 10928) | function resetContextStack() {
  function findNextUnitOfWork (line 10939) | function findNextUnitOfWork() {
  function commitAllHostEffects (line 10989) | function commitAllHostEffects() {
  function commitAllLifeCycles (line 11051) | function commitAllLifeCycles() {
  function commitAllWork (line 11079) | function commitAllWork(finishedWork) {
  function resetWorkPriority (line 11173) | function resetWorkPriority(workInProgress) {
  function completeUnitOfWork (line 11199) | function completeUnitOfWork(workInProgress) {
  function performUnitOfWork (line 11279) | function performUnitOfWork(workInProgress) {
  function performFailedUnitOfWork (line 11305) | function performFailedUnitOfWork(workInProgress) {
  function performDeferredWork (line 11332) | function performDeferredWork(deadline) {
  function performAnimationWork (line 11339) | function performAnimationWork() {
  function clearErrors (line 11344) | function clearErrors() {
  function workLoop (line 11366) | function workLoop(priorityLevel, deadline, deadlineHasExpired) {
  function performWork (line 11431) | function performWork(priorityLevel, deadline) {
  function captureError (line 11550) | function captureError(failedWork, error) {
  function hasCapturedError (line 11675) | function hasCapturedError(fiber) {
  function isFailedBoundary (line 11681) | function isFailedBoundary(fiber) {
  function commitErrorHandling (line 11687) | function commitErrorHandling(effectfulFiber) {
  function unwindContexts (line 11732) | function unwindContexts(from, to) {
  function scheduleRoot (line 11753) | function scheduleRoot(root, priorityLevel) {
  function scheduleUpdate (line 11772) | function scheduleUpdate(fiber, priorityLevel) {
  function getPriorityContext (line 11831) | function getPriorityContext() {
  function scheduleErrorRecovery (line 11840) | function scheduleErrorRecovery(fiber) {
  function performWithPriority (line 11844) | function performWithPriority(priorityLevel, fn) {
  function batchedUpdates (line 11854) | function batchedUpdates(fn, a) {
  function unbatchedUpdates (line 11869) | function unbatchedUpdates(fn) {
  function syncUpdates (line 11879) | function syncUpdates(fn) {
  function deferredUpdates (line 11889) | function deferredUpdates(fn) {
  function isFiberMountedImpl (line 12024) | function isFiberMountedImpl(fiber) {
  function assertIsMounted (line 12064) | function assertIsMounted(fiber) {
  function findCurrentFiberUsingSlowPath (line 12068) | function findCurrentFiberUsingSlowPath(fiber) {
  function comparePriority (line 12267) | function comparePriority(a, b) {
  function ensureUpdateQueue (line 12285) | function ensureUpdateQueue(fiber) {
  function cloneUpdateQueue (line 12314) | function cloneUpdateQueue(current, workInProgress) {
  function cloneUpdate (line 12337) | function cloneUpdate(update) {
  function insertUpdateIntoQueue (line 12349) | function insertUpdateIntoQueue(queue, update, insertAfter, insertBefore) {
  function findInsertionPosition (line 12368) | function findInsertionPosition(queue, update) {
  function insertUpdate (line 12415) | function insertUpdate(fiber, update) {
  function addUpdate (line 12466) | function addUpdate(fiber, partialState, callback, priorityLevel) {
  function addReplaceUpdate (line 12480) | function addReplaceUpdate(fiber, state, callback, priorityLevel) {
  function addForceUpdate (line 12494) | function addForceUpdate(fiber, callback, priorityLevel) {
  function getPendingPriority (line 12508) | function getPendingPriority(queue) {
  function addTopLevelUpdate (line 12513) | function addTopLevelUpdate(fiber, partialState, callback, priorityLevel) {
  function getStateFromUpdate (line 12545) | function getStateFromUpdate(update, instance, prevState, props) {
  function beginUpdateQueue (line 12555) | function beginUpdateQueue(workInProgress, queue, instance, prevState, pr...
  function commitCallbacks (line 12622) | function commitCallbacks(finishedWork, queue, context) {
  function performFiberBatchedUpdates (line 12663) | function performFiberBatchedUpdates(fn, bookkeeping) {
  function batchedUpdates (line 12668) | function batchedUpdates(fn, bookkeeping) {
  function batchedUpdatesWithControlledComponents (line 12675) | function batchedUpdatesWithControlledComponents(fn, bookkeeping) {
  function isInDocument (line 12768) | function isInDocument(node) {
  function getParent (line 13125) | function getParent(inst) {
  function getLowestCommonAncestor (line 13149) | function getLowestCommonAncestor(instA, instB) {
  function isAncestor (line 13186) | function isAncestor(instA, instB) {
  function getParentInstance (line 13199) | function getParentInstance(inst) {
  function traverseTwoPhase (line 13206) | function traverseTwoPhase(inst, fn, arg) {
  function traverseEnterLeave (line 13228) | function traverseEnterLeave(from, to, fn, argFrom, argTo) {
  function getSelection (line 13663) | function getSelection(node) {
  function constructSelectEvent (line 13694) | function constructSelectEvent(nativeEvent, nativeEventTarget) {
  function SyntheticAnimationEvent (line 14022) | function SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeE...
  function SyntheticClipboardEvent (line 14060) | function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeE...
  function SyntheticCompositionEvent (line 14096) | function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativ...
  function SyntheticDragEvent (line 14132) | function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent,...
  function SyntheticEvent (line 14201) | function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeE...
  function getPooledWarningPropertyDefinition (line 14381) | function getPooledWarningPropertyDefinition(propName, getVal) {
  function SyntheticFocusEvent (line 14436) | function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticInputEvent (line 14473) | function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticKeyboardEvent (line 14557) | function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEv...
  function SyntheticMouseEvent (line 14629) | function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticTouchEvent (line 14674) | function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticTransitionEvent (line 14713) | function SyntheticTransitionEvent(dispatchConfig, dispatchMarker, native...
  function SyntheticUIEvent (line 14772) | function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, n...
  function SyntheticWheelEvent (line 14826) | function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function accumulateInto (line 14891) | function accumulateInto(current, next) {
  function checkReactTypeSpec (line 14965) | function checkReactTypeSpec(typeSpecs, values, location, componentName, ...
  function dangerousStyleValue (line 15078) | function dangerousStyleValue(name, value, component) {
  function escapeHtml (line 15156) | function escapeHtml(string) {
  function escapeTextContentForBrowser (line 15214) | function escapeTextContentForBrowser(text) {
  function forEachAccumulated (line 15318) | function forEachAccumulated(arr, cb, scope) {
  function getComponentName (line 15341) | function getComponentName(instanceOrFiber) {
  function getContextForSubtree (line 15388) | function getContextForSubtree(parentComponent) {
  function getEventCharCode (line 15430) | function getEventCharCode(nativeEvent) {
  function getEventKey (line 15528) | function getEventKey(nativeEvent) {
  function modifierStateGetter (line 15586) | function modifierStateGetter(keyArg) {
  function getEventModifierState (line 15596) | function getEventModifierState(nativeEvent) {
  function getEventTarget (line 15622) | function getEventTarget(nativeEvent) {
  function getIteratorFn (line 15669) | function getIteratorFn(maybeIterable) {
  function getLeafNode (line 15697) | function getLeafNode(node) {
  function getSiblingNode (line 15711) | function getSiblingNode(node) {
  function getNodeForCharacterOffset (line 15727) | function getNodeForCharacterOffset(root, offset) {
  function getTextContentAccessor (line 15774) | function getTextContentAccessor() {
  function makePrefixMap (line 15806) | function makePrefixMap(styleProp, eventName) {
  function getVendorPrefixedEventName (line 15866) | function getVendorPrefixedEventName(eventName) {
  function isCheckable (line 15901) | function isCheckable(elem) {
  function getTracker (line 15907) | function getTracker(inst) {
  function attachTracker (line 15914) | function attachTracker(inst, tracker) {
  function detachTracker (line 15918) | function detachTracker(inst) {
  function getValueFromNode (line 15922) | function getValueFromNode(node) {
  function trackValueOnNode (line 15930) | function trackValueOnNode(node, inst) {
  function isEventSupported (line 16064) | function isEventSupported(eventNameSuffix, capture) {
  function isTextInputElement (line 16123) | function isTextInputElement(elem) {
  function quoteAttributeValueForBrowser (line 16159) | function quoteAttributeValueForBrowser(value) {
  function reactProdInvariant (line 16184) | function reactProdInvariant(code) {
  function camelize (line 16945) | function camelize(string) {
  function camelizeStyleName (line 16987) | function camelizeStyleName(string) {
  function containsNode (line 17013) | function containsNode(outerNode, innerNode) {
  function makeEmptyFunction (line 17046) | function makeEmptyFunction(arg) {
  function focusNode (line 17108) | function focusNode(node) {
  function getActiveElement (line 17141) | function getActiveElement() /*?DOMElement*/{
  function getUnboundedScrollPosition (line 17178) | function getUnboundedScrollPosition(scrollable) {
  function hyphenate (line 17220) | function hyphenate(string) {
  function hyphenateStyleName (line 17259) | function hyphenateStyleName(string) {
  function invariant (line 17298) | function invariant(condition, format, a, b, c, d, e, f) {
  function isNode (line 17338) | function isNode(object) {
  function isTextNode (line 17363) | function isTextNode(object) {
  function memoizeStringOnly (line 17387) | function memoizeStringOnly(callback) {
  function is (line 17478) | function is(x, y) {
  function shallowEqual (line 17496) | function shallowEqual(objA, objB) {
  function toObject (line 17603) | function toObject(val) {
  function shouldUseNative (line 17611) | function shouldUseNative() {

FILE: js/react-dom.js
  function s (line 32) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function isPresto (line 173) | function isPresto() {
  function isKeypressCommand (line 221) | function isKeypressCommand(nativeEvent) {
  function getCompositionEventType (line 233) | function getCompositionEventType(topLevelType) {
  function isFallbackCompositionStart (line 252) | function isFallbackCompositionStart(topLevelType, nativeEvent) {
  function isFallbackCompositionEnd (line 263) | function isFallbackCompositionEnd(topLevelType, nativeEvent) {
  function getDataFromCustomEvent (line 291) | function getDataFromCustomEvent(nativeEvent) {
  function extractCompositionEvent (line 305) | function extractCompositionEvent(topLevelType, targetInst, nativeEvent, ...
  function getNativeBeforeInputChars (line 357) | function getNativeBeforeInputChars(topLevelType, nativeEvent) {
  function getFallbackBeforeInputChars (line 411) | function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
  function extractBeforeInputEvent (line 465) | function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, ...
  function prefixKey (line 577) | function prefixKey(prefix, key) {
  function _classCallCheck (line 892) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function CallbackQueue (line 912) | function CallbackQueue(arg) {
  function createAndAccumulateChangeEvent (line 1033) | function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
  function shouldUseChangeEvent (line 1050) | function shouldUseChangeEvent(elem) {
  function manualDispatchChangeEvent (line 1061) | function manualDispatchChangeEvent(nativeEvent) {
  function runEventInBatch (line 1078) | function runEventInBatch(event) {
  function startWatchingForChangeEventIE8 (line 1083) | function startWatchingForChangeEventIE8(target, targetInst) {
  function stopWatchingForChangeEventIE8 (line 1089) | function stopWatchingForChangeEventIE8() {
  function getInstIfValueChanged (line 1098) | function getInstIfValueChanged(targetInst) {
  function getTargetInstForChangeEvent (line 1104) | function getTargetInstForChangeEvent(topLevelType, targetInst) {
  function handleEventsForChangeEventIE8 (line 1110) | function handleEventsForChangeEventIE8(topLevelType, target, targetInst) {
  function startWatchingForValueChange (line 1136) | function startWatchingForValueChange(target, targetInst) {
  function stopWatchingForValueChange (line 1146) | function stopWatchingForValueChange() {
  function handlePropertyChange (line 1159) | function handlePropertyChange(nativeEvent) {
  function handleEventsForInputEventPolyfill (line 1168) | function handleEventsForInputEventPolyfill(topLevelType, target, targetI...
  function getTargetInstForInputEventPolyfill (line 1191) | function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {
  function shouldUseClickEvent (line 1210) | function shouldUseClickEvent(elem) {
  function getTargetInstForClickEvent (line 1218) | function getTargetInstForClickEvent(topLevelType, targetInst) {
  function getTargetInstForInputOrChangeEvent (line 1224) | function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {
  function getNodeAfter (line 1305) | function getNodeAfter(parentNode, node) {
  function insertLazyTreeChildAt (line 1329) | function insertLazyTreeChildAt(parentNode, childTree, referenceNode) {
  function moveChild (line 1333) | function moveChild(parentNode, childNode, referenceNode) {
  function removeChild (line 1341) | function removeChild(parentNode, childNode) {
  function moveDelimitedText (line 1351) | function moveDelimitedText(parentNode, openingComment, closingComment, r...
  function removeDelimitedText (line 1363) | function removeDelimitedText(parentNode, startNode, closingComment) {
  function replaceDelimitedText (line 1375) | function replaceDelimitedText(openingComment, closingComment, stringText) {
  function insertTreeChildren (line 1569) | function insertTreeChildren(tree) {
  function replaceChildWithTree (line 1602) | function replaceChildWithTree(oldNode, newTree) {
  function queueChild (line 1607) | function queueChild(parentTree, childTree) {
  function queueHTML (line 1615) | function queueHTML(tree, html) {
  function queueText (line 1623) | function queueText(tree, text) {
  function toString (line 1631) | function toString() {
  function DOMLazyTree (line 1635) | function DOMLazyTree(node) {
  function checkMask (line 1689) | function checkMask(value, bitmask) {
  function isAttributeNameSafe (line 1906) | function isAttributeNameSafe(attributeName) {
  function shouldIgnoreValue (line 1922) | function shouldIgnoreValue(propertyInfo, value) {
  function isInteractive (line 2414) | function isInteractive(tag) {
  function shouldPreventMouseEvent (line 2418) | function shouldPreventMouseEvent(name, type, props) {
  function recomputePluginOrdering (line 2606) | function recomputePluginOrdering() {
  function publishEventForPlugin (line 2635) | function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
  function publishRegistrationName (line 2662) | function publishRegistrationName(registrationName, pluginModule, eventNa...
  function isEndish (line 2865) | function isEndish(topLevelType) {
  function isMoveish (line 2869) | function isMoveish(topLevelType) {
  function isStartish (line 2872) | function isStartish(topLevelType) {
  function executeDispatch (line 2899) | function executeDispatch(event, simulated, listener, inst) {
  function executeDispatchesInOrder (line 2913) | function executeDispatchesInOrder(event, simulated) {
  function executeDispatchesInOrderStopAtTrueImpl (line 2941) | function executeDispatchesInOrderStopAtTrueImpl(event) {
  function executeDispatchesInOrderStopAtTrue (line 2968) | function executeDispatchesInOrderStopAtTrue(event) {
  function executeDirectDispatch (line 2984) | function executeDirectDispatch(event) {
  function hasDispatches (line 3003) | function hasDispatches(event) {
  function listenerAtPhase (line 3060) | function listenerAtPhase(inst, event, propagationPhase) {
  function accumulateDirectionalDispatches (line 3071) | function accumulateDirectionalDispatches(inst, phase, event) {
  function accumulateTwoPhaseDispatchesSingle (line 3089) | function accumulateTwoPhaseDispatchesSingle(event) {
  function accumulateTwoPhaseDispatchesSingleSkipTarget (line 3098) | function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
  function accumulateDispatches (line 3111) | function accumulateDispatches(inst, ignoredDirection, event) {
  function accumulateDirectDispatchesSingle (line 3127) | function accumulateDirectDispatchesSingle(event) {
  function accumulateTwoPhaseDispatches (line 3133) | function accumulateTwoPhaseDispatches(events) {
  function accumulateTwoPhaseDispatchesSkipTarget (line 3137) | function accumulateTwoPhaseDispatchesSkipTarget(events) {
  function accumulateEnterLeaveDispatches (line 3141) | function accumulateEnterLeaveDispatches(leave, enter, from, to) {
  function accumulateDirectDispatches (line 3145) | function accumulateDirectDispatches(events) {
  function FallbackCompositionState (line 3198) | function FallbackCompositionState(root) {
  function escape (line 3497) | function escape(key) {
  function unescape (line 3516) | function unescape(key) {
  function getListeningForDocument (line 3807) | function getListeningForDocument(mountAt) {
  function instantiateChild (line 4024) | function instantiateChild(childInstances, child, name, selfDebugID) {
  function StatelessComponent (line 4271) | function StatelessComponent(Component) {}
  function shouldConstruct (line 4278) | function shouldConstruct(Component) {
  function isPureComponent (line 4282) | function isPureComponent(Component) {
  function measureLifeCyclePerf (line 4287) | function measureLifeCyclePerf(fn, debugID, timerType) {
  function restoreStateOfTarget (line 5274) | function restoreStateOfTarget(target) {
  function getDeclarationErrorAddendum (line 5371) | function getDeclarationErrorAddendum(ownerName) {
  function getDeclarationErrorAddendum (line 5577) | function getDeclarationErrorAddendum(internalInstance) {
  function assertValidProps (line 5594) | function assertValidProps(component, props) {
  function ensureListeningTo (line 5614) | function ensureListeningTo(inst, registrationName, transaction) {
  function inputPostMount (line 5629) | function inputPostMount() {
  function textareaPostMount (line 5634) | function textareaPostMount() {
  function optionPostMount (line 5639) | function optionPostMount() {
  function trackInputValue (line 5701) | function trackInputValue() {
  function trapClickOnNonInteractiveElement (line 5705) | function trapClickOnNonInteractiveElement() {
  function trapBubbledEventsLocal (line 5719) | function trapBubbledEventsLocal() {
  function postUpdateSelectWrapper (line 5763) | function postUpdateSelectWrapper() {
  function validateDangerousTag (line 5809) | function validateDangerousTag(tag) {
  function isCustomComponent (line 5816) | function isCustomComponent(tagName, props) {
  function ReactDOMComponent (line 5836) | function ReactDOMComponent(element) {
  function shouldPrecacheNode (line 6568) | function shouldPrecacheNode(node, nodeID) {
  function getRenderedHostOrTextFromComponent (line 6579) | function getRenderedHostOrTextFromComponent(component) {
  function precacheNode (line 6591) | function precacheNode(inst, node) {
  function precacheFiberNode (line 6597) | function precacheFiberNode(hostInst, node) {
  function uncacheNode (line 6601) | function uncacheNode(inst) {
  function precacheChildNodes (line 6623) | function precacheChildNodes(inst, node) {
  function getClosestInstanceFromNode (line 6656) | function getClosestInstanceFromNode(node) {
  function getInstanceFromNode (line 6694) | function getInstanceFromNode(node) {
  function getNodeFromInstance (line 6717) | function getNodeFromInstance(inst) {
  function getFiberCurrentPropsFromNode (line 6749) | function getFiberCurrentPropsFromNode(node) {
  function updateFiberProps (line 6753) | function updateFiberProps(node, props) {
  function ReactDOMContainerInfo (line 6787) | function ReactDOMContainerInfo(topLevelWrapper, node) {
  function inject (line 6947) | function inject() {
  function isControlled (line 7012) | function isControlled(props) {
  function updateNamedCousins (line 7200) | function updateNamedCousins(thisInstance, props) {
  function getStackAddendum (line 7263) | function getStackAddendum(debugID) {
  function validateProperty (line 7273) | function validateProperty(tagName, name, debugID) {
  function warnInvalidARIAProps (line 7299) | function warnInvalidARIAProps(type, props, debugID) {
  function validateProperties (line 7320) | function validateProperties(type, props, debugID /* Stack only */) {
  function getStackAddendum (line 7364) | function getStackAddendum(debugID) {
  function validateProperties (line 7374) | function validateProperties(type, props, debugID /* Stack only */) {
  function flattenChildren (line 7424) | function flattenChildren(children) {
  function getDeclarationErrorAddendum (line 7547) | function getDeclarationErrorAddendum(owner) {
  function checkSelectPropTypes (line 7563) | function checkSelectPropTypes(inst, props) {
  function updateOptions (line 7587) | function updateOptions(inst, multiple, propValue) {
  function isCollapsed (line 7723) | function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {
  function getIEOffsets (line 7741) | function getIEOffsets(node) {
  function getModernOffsets (line 7764) | function getModernOffsets(node) {
  function setIEOffsets (line 7826) | function setIEOffsets(node, offsets) {
  function setModernOffsets (line 7860) | function setModernOffsets(node, offsets) {
  function inject (line 7943) | function inject() {
  function getStackAddendum (line 8341) | function getStackAddendum(debugID) {
  function validateProperties (line 8422) | function validateProperties(type, props, debugID /* Stack only */) {
  function getCurrentFiberOwnerName (line 8467) | function getCurrentFiberOwnerName() {
  function getCurrentFiberStackAddendum (line 8480) | function getCurrentFiberStackAddendum() {
  function ReactDefaultBatchingStrategyTransaction (line 8894) | function ReactDefaultBatchingStrategyTransaction() {
  function invokeGuardedCallback (line 9001) | function invokeGuardedCallback(name, func, a) {
  function runEventQueueInBatch (line 9070) | function runEventQueueInBatch(events) {
  function findRootContainerNode (line 9121) | function findRootContainerNode(inst) {
  function TopLevelCallbackBookKeeping (line 9144) | function TopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetIn...
  function handleTopLevelImpl (line 9160) | function handleTopLevelImpl(bookKeeping) {
  function scrollValueMonitor (line 9187) | function scrollValueMonitor(cb) {
  function isFiberMountedImpl (line 9327) | function isFiberMountedImpl(fiber) {
  function assertIsMounted (line 9367) | function assertIsMounted(fiber) {
  function findCurrentFiberUsingSlowPath (line 9371) | function findCurrentFiberUsingSlowPath(fiber) {
  function performFiberBatchedUpdates (line 9553) | function performFiberBatchedUpdates(fn, bookkeeping) {
  function batchedUpdates (line 9558) | function batchedUpdates(fn, bookkeeping) {
  function batchedUpdatesWithControlledComponents (line 9565) | function batchedUpdatesWithControlledComponents(fn, bookkeeping) {
  function createInternalComponent (line 9639) | function createInternalComponent(element) {
  function createInstanceForText (line 9648) | function createInstanceForText(text) {
  function isTextComponent (line 9656) | function isTextComponent(component) {
  function isInDocument (line 9726) | function isInDocument(node) {
  function firstDifferenceIndex (line 10066) | function firstDifferenceIndex(string1, string2) {
  function getReactRootElementInContainer (line 10081) | function getReactRootElementInContainer(container) {
  function internalGetID (line 10093) | function internalGetID(node) {
  function mountComponentIntoNode (line 10108) | function mountComponentIntoNode(wrapperInstance, container, transaction,...
  function batchedMountComponentIntoNode (line 10135) | function batchedMountComponentIntoNode(componentInstance, container, sho...
  function unmountComponentFromNode (line 10152) | function unmountComponentFromNode(instance, container) {
  function hasNonRootReactChild (line 10183) | function hasNonRootReactChild(container) {
  function nodeIsRenderedByOtherInstance (line 10199) | function nodeIsRenderedByOtherInstance(container) {
  function isValidContainer (line 10211) | function isValidContainer(node) {
  function isReactNode (line 10222) | function isReactNode(node) {
  function getHostRootInstanceInContainer (line 10226) | function getHostRootInstanceInContainer(container) {
  function getTopLevelWrapperInContainer (line 10232) | function getTopLevelWrapperInContainer(container) {
  function makeInsertMarkup (line 10597) | function makeInsertMarkup(markup, afterNode, toIndex) {
  function makeMove (line 10616) | function makeMove(child, afterNode, toIndex) {
  function makeRemove (line 10634) | function makeRemove(child, node) {
  function makeSetMarkup (line 10652) | function makeSetMarkup(markup) {
  function makeTextContent (line 10670) | function makeTextContent(textContent) {
  function enqueue (line 10686) | function enqueue(queue, update) {
  function processQueue (line 10699) | function processQueue(inst, updateQueue) {
  function isValidOwner (line 11070) | function isValidOwner(object) {
  function roundFloat (line 11176) | function roundFloat(val) {
  function consoleTable (line 11185) | function consoleTable(table) {
  function warnInProduction (line 11189) | function warnInProduction() {
  function getLastMeasurements (line 11199) | function getLastMeasurements() {
  function getExclusive (line 11208) | function getExclusive() {
  function getInclusive (line 11270) | function getInclusive() {
  function getWasted (line 11355) | function getWasted() {
  function getOperations (line 11465) | function getOperations() {
  function printExclusive (line 11502) | function printExclusive(flushHistory) {
  function printInclusive (line 11529) | function printInclusive(flushHistory) {
  function printWasted (line 11552) | function printWasted(flushHistory) {
  function printOperations (line 11575) | function printOperations(flushHistory) {
  function printDOM (line 11596) | function printDOM(measurements) {
  function getMeasurementsSummaryMap (line 11603) | function getMeasurementsSummaryMap(measurements) {
  function start (line 11609) | function start() {
  function stop (line 11618) | function stop() {
  function isRunning (line 11627) | function isRunning() {
  function ReactReconcileTransaction (line 11809) | function ReactReconcileTransaction(useCreateElement) {
  function attachRefs (line 11897) | function attachRefs() {
  function attachRef (line 12069) | function attachRef(ref, component, owner) {
  function detachRef (line 12103) | function detachRef(ref, component, owner) {
  function ReactServerRenderingTransaction (line 12207) | function ReactServerRenderingTransaction(renderToStaticMarkup) {
  function _classCallCheck (line 12269) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function warnNoop (line 12275) | function warnNoop(publicInstance, callerName) {
  function ReactServerUpdateQueue (line 12291) | function ReactServerUpdateQueue(transaction) {
  function _classCallCheck (line 12399) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function NoopInternalComponent (line 12413) | function NoopInternalComponent(element) {
  function _batchedRender (line 12461) | function _batchedRender(renderer, element, context) {
  function ReactShallowRenderer (line 12468) | function ReactShallowRenderer() {
  function Event (line 12564) | function Event(suffix) {}
  function findAllInRenderedStackTreeInternal (line 12570) | function findAllInRenderedStackTreeInternal(inst, test) {
  function findAllInRenderedFiberTreeInternal (line 12592) | function findAllInRenderedFiberTreeInternal(fiber, test) {
  function makeSimulator (line 12883) | function makeSimulator(eventType) {
  function buildSimulators (line 12926) | function buildSimulators() {
  function makeNativeSimulator (line 12969) | function makeNativeSimulator(eventType) {
  function getParent (line 13009) | function getParent(inst) {
  function getLowestCommonAncestor (line 13033) | function getLowestCommonAncestor(instA, instB) {
  function isAncestor (line 13070) | function isAncestor(instA, instB) {
  function getParentInstance (line 13083) | function getParentInstance(inst) {
  function traverseTwoPhase (line 13090) | function traverseTwoPhase(inst, fn, arg) {
  function traverseEnterLeave (line 13112) | function traverseEnterLeave(from, to, fn, argFrom, argTo) {
  function enqueueUpdate (line 13216) | function enqueueUpdate(internalInstance) {
  function getInternalInstanceReadyForUpdate (line 13220) | function getInternalInstanceReadyForUpdate(publicInstance, callerName) {
  function ensureInjected (line 13438) | function ensureInjected() {
  function ReactUpdatesFlushTransaction (line 13463) | function ReactUpdatesFlushTransaction() {
  function batchedUpdates (line 13490) | function batchedUpdates(callback, a, b, c, d, e) {
  function mountOrderComparator (line 13502) | function mountOrderComparator(c1, c2) {
  function runBatchedUpdates (line 13506) | function runBatchedUpdates(transaction) {
  function enqueueUpdate (line 13563) | function enqueueUpdate(component) {
  function getSelection (line 13987) | function getSelection(node) {
  function constructSelectEvent (line 14018) | function constructSelectEvent(nativeEvent, nativeEventTarget) {
  function SyntheticAnimationEvent (line 14346) | function SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeE...
  function SyntheticClipboardEvent (line 14384) | function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeE...
  function SyntheticCompositionEvent (line 14420) | function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativ...
  function SyntheticDragEvent (line 14456) | function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent,...
  function SyntheticEvent (line 14525) | function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeE...
  function getPooledWarningPropertyDefinition (line 14705) | function getPooledWarningPropertyDefinition(propName, getVal) {
  function SyntheticFocusEvent (line 14760) | function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticInputEvent (line 14797) | function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticKeyboardEvent (line 14881) | function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEv...
  function SyntheticMouseEvent (line 14953) | function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticTouchEvent (line 14998) | function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticTransitionEvent (line 15037) | function SyntheticTransitionEvent(dispatchConfig, dispatchMarker, native...
  function SyntheticUIEvent (line 15096) | function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, n...
  function SyntheticWheelEvent (line 15150) | function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent...
  function accumulateInto (line 15440) | function accumulateInto(current, next) {
  function adler32 (line 15488) | function adler32(data) {
  function checkReactTypeSpec (line 15558) | function checkReactTypeSpec(typeSpecs, values, location, componentName, ...
  function dangerousStyleValue (line 15671) | function dangerousStyleValue(name, value, component) {
  function escapeHtml (line 15749) | function escapeHtml(string) {
  function escapeTextContentForBrowser (line 15807) | function escapeTextContentForBrowser(text) {
  function flattenSingleChildIntoContext (line 15923) | function flattenSingleChildIntoContext(traverseContext, child, name, sel...
  function flattenChildren (line 15947) | function flattenChildren(children, selfDebugID) {
  function forEachAccumulated (line 15989) | function forEachAccumulated(arr, cb, scope) {
  function getComponentName (line 16012) | function getComponentName(instanceOrFiber) {
  function getContextForSubtree (line 16059) | function getContextForSubtree(parentComponent) {
  function getEventCharCode (line 16101) | function getEventCharCode(nativeEvent) {
  function getEventKey (line 16199) | function getEventKey(nativeEvent) {
  function modifierStateGetter (line 16257) | function modifierStateGetter(keyArg) {
  function getEventModifierState (line 16267) | function getEventModifierState(nativeEvent) {
  function getEventTarget (line 16293) | function getEventTarget(nativeEvent) {
  function getHostComponentFromComposite (line 16322) | function getHostComponentFromComposite(inst) {
  function getIteratorFn (line 16370) | function getIteratorFn(maybeIterable) {
  function getNextDebugID (line 16394) | function getNextDebugID() {
  function getLeafNode (line 16419) | function getLeafNode(node) {
  function getSiblingNode (line 16433) | function getSiblingNode(node) {
  function getNodeForCharacterOffset (line 16449) | function getNodeForCharacterOffset(root, offset) {
  function getTextContentAccessor (line 16496) | function getTextContentAccessor() {
  function makePrefixMap (line 16528) | function makePrefixMap(styleProp, eventName) {
  function getVendorPrefixedEventName (line 16588) | function getVendorPrefixedEventName(eventName) {
  function isCheckable (line 16623) | function isCheckable(elem) {
  function getTracker (line 16629) | function getTracker(inst) {
  function attachTracker (line 16636) | function attachTracker(inst, tracker) {
  function detachTracker (line 16640) | function detachTracker(inst) {
  function getValueFromNode (line 16644) | function getValueFromNode(node) {
  function trackValueOnNode (line 16652) | function trackValueOnNode(node, inst) {
  function getDeclarationErrorAddendum (line 16778) | function getDeclarationErrorAddendum(owner) {
  function isInternalComponentType (line 16795) | function isInternalComponentType(type) {
  function instantiateReactComponent (line 16807) | function instantiateReactComponent(node, shouldHaveDebugID) {
  function isEventSupported (line 16915) | function isEventSupported(eventNameSuffix, capture) {
  function isTextInputElement (line 16974) | function isTextInputElement(elem) {
  function quoteAttributeValueForBrowser (line 17010) | function quoteAttributeValueForBrowser(value) {
  function reactProdInvariant (line 17035) | function reactProdInvariant(code) {
  function shouldUpdateReactComponent (line 17229) | function shouldUpdateReactComponent(prevElement, nextElement) {
  function getComponentKey (line 17292) | function getComponentKey(component, index) {
  function traverseAllChildrenImpl (line 17311) | function traverseAllChildrenImpl(children, nameSoFar, callback, traverse...
  function traverseAllChildren (line 17402) | function traverseAllChildren(children, callback, traverseContext) {
  function validateCallback (line 17429) | function validateCallback(callback) {
  function camelize (line 18026) | function camelize(string) {
  function camelizeStyleName (line 18068) | function camelizeStyleName(string) {
  function containsNode (line 18094) | function containsNode(outerNode, innerNode) {
  function toArray (line 18138) | function toArray(obj) {
  function hasArrayNature (line 18186) | function hasArrayNature(obj) {
  function createArrayFromMixed (line 18229) | function createArrayFromMixed(obj) {
  function getNodeName (line 18278) | function getNodeName(markup) {
  function createNodesFromMarkup (line 18293) | function createNodesFromMarkup(markup, handleScript) {
  function makeEmptyFunction (line 18338) | function makeEmptyFunction(arg) {
  function focusNode (line 18400) | function focusNode(node) {
  function getActiveElement (line 18433) | function getActiveElement() /*?DOMElement*/{
  function getMarkupWrap (line 18523) | function getMarkupWrap(nodeName) {
  function getUnboundedScrollPosition (line 18565) | function getUnboundedScrollPosition(scrollable) {
  function hyphenate (line 18607) | function hyphenate(string) {
  function hyphenateStyleName (line 18646) | function hyphenateStyleName(string) {
  function invariant (line 18685) | function invariant(condition, format, a, b, c, d, e, f) {
  function isNode (line 18725) | function isNode(object) {
  function isTextNode (line 18750) | function isTextNode(object) {
  function memoizeStringOnly (line 18774) | function memoizeStringOnly(callback) {
  function is (line 18865) | function is(x, y) {
  function shallowEqual (line 18883) | function shallowEqual(objA, objB) {
  function toObject (line 18990) | function toObject(val) {
  function shouldUseNative (line 18998) | function shouldUseNative() {

FILE: js/react.js
  function s (line 4) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function escape (line 25) | function escape(key) {
  function unescape (line 44) | function unescape(key) {
  function ReactComponent (line 285) | function ReactComponent(props, context, updater) {
  function ReactPureComponent (line 374) | function ReactPureComponent(props, context, updater) {
  function ComponentDummy (line 384) | function ComponentDummy() {}
  function escapeUserProvidedKey (line 419) | function escapeUserProvidedKey(text) {
  function ForEachBookKeeping (line 431) | function ForEachBookKeeping(forEachFunction, forEachContext) {
  function forEachSingleChild (line 443) | function forEachSingleChild(bookKeeping, child, name) {
  function forEachChildren (line 462) | function forEachChildren(children, forEachFunc, forEachContext) {
  function MapBookKeeping (line 480) | function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {
  function mapSingleChildIntoContext (line 496) | function mapSingleChildIntoContext(bookKeeping, child, childKey) {
  function mapIntoWithKeyPrefixInternal (line 517) | function mapIntoWithKeyPrefixInternal(children, array, prefix, func, con...
  function mapChildren (line 540) | function mapChildren(children, func, context) {
  function forEachSingleChildDummy (line 549) | function forEachSingleChildDummy(traverseContext, child, name) {
  function countChildren (line 562) | function countChildren(children, context) {
  function toArray (line 572) | function toArray(children) {
  function identity (line 618) | function identity(fn) {
  function validateTypeDef (line 925) | function validateTypeDef(Constructor, typeDef, location) {
  function validateMethodOverride (line 935) | function validateMethodOverride(isAlreadyDefined, name) {
  function mixSpecIntoComponent (line 953) | function mixSpecIntoComponent(Constructor, spec) {
  function mixStaticSpecIntoComponent (line 1035) | function mixStaticSpecIntoComponent(Constructor, statics) {
  function mergeIntoWithNoDuplicateKeys (line 1061) | function mergeIntoWithNoDuplicateKeys(one, two) {
  function createMergedResultFunction (line 1081) | function createMergedResultFunction(one, two) {
  function createChainedFunction (line 1105) | function createChainedFunction(one, two) {
  function bindAutoBindMethod (line 1119) | function bindAutoBindMethod(component, method) {
  function bindAutoBindMethods (line 1156) | function bindAutoBindMethods(component) {
  function isNative (line 1320) | function isNative(fn) {
  function purgeDeep (line 1429) | function purgeDeep(id) {
  function describeComponentFrame (line 1439) | function describeComponentFrame(name, source, ownerName) {
  function getDisplayName (line 1443) | function getDisplayName(element) {
  function describeID (line 1455) | function describeID(id) {
  function describeFiber (line 1467) | function describeFiber(fiber) {
  function hasValidRef (line 1907) | function hasValidRef(config) {
  function hasValidKey (line 1919) | function hasValidKey(config) {
  function defineKeyPropWarningGetter (line 1931) | function defineKeyPropWarningGetter(props, displayName) {
  function defineRefPropWarningGetter (line 1945) | function defineRefPropWarningGetter(props, displayName) {
  function getDeclarationErrorAddendum (line 2267) | function getDeclarationErrorAddendum() {
  function getSourceInfoErrorAddendum (line 2277) | function getSourceInfoErrorAddendum(elementProps) {
  function getCurrentComponentErrorInfo (line 2294) | function getCurrentComponentErrorInfo(parentType) {
  function validateExplicitKey (line 2317) | function validateExplicitKey(element, parentType) {
  function validateChildKeys (line 2352) | function validateChildKeys(node, parentType) {
  function validatePropTypes (line 2391) | function validatePropTypes(element) {
  function warnNoop (line 2505) | function warnNoop(publicInstance, callerName) {
  function is (line 2738) | function is(x, y) {
  function PropTypeError (line 2758) | function PropTypeError(message) {
  function createChainableTypeChecker (line 2765) | function createChainableTypeChecker(validate) {
  function createPrimitiveTypeChecker (line 2801) | function createPrimitiveTypeChecker(expectedType) {
  function createAnyTypeChecker (line 2819) | function createAnyTypeChecker() {
  function createArrayOfTypeChecker (line 2823) | function createArrayOfTypeChecker(typeChecker) {
  function createElementTypeChecker (line 2845) | function createElementTypeChecker() {
  function createInstanceTypeChecker (line 2858) | function createInstanceTypeChecker(expectedClass) {
  function createEnumTypeChecker (line 2871) | function createEnumTypeChecker(expectedValues) {
  function createObjectOfTypeChecker (line 2892) | function createObjectOfTypeChecker(typeChecker) {
  function createUnionTypeChecker (line 2916) | function createUnionTypeChecker(arrayOfTypeCheckers) {
  function createNodeChecker (line 2936) | function createNodeChecker() {
  function createShapeTypeChecker (line 2947) | function createShapeTypeChecker(shapeTypes) {
  function isNode (line 2970) | function isNode(propValue) {
  function isSymbol (line 3017) | function isSymbol(propType, propValue) {
  function getPropType (line 3037) | function getPropType(propValue) {
  function getPreciseType (line 3056) | function getPreciseType(propValue) {
  function getClassName (line 3069) | function getClassName(propValue) {
  function checkReactTypeSpec (line 3240) | function checkReactTypeSpec(typeSpecs, values, location, componentName, ...
  function getComponentName (line 3308) | function getComponentName(instanceOrFiber) {
  function getIteratorFn (line 3363) | function getIteratorFn(maybeIterable) {
  function onlyChild (line 3403) | function onlyChild(children) {
  function reactProdInvariant (line 3429) | function reactProdInvariant(code) {
  function getComponentKey (line 3494) | function getComponentKey(component, index) {
  function traverseAllChildrenImpl (line 3513) | function traverseAllChildrenImpl(children, nameSoFar, callback, traverse...
  function traverseAllChildren (line 3604) | function traverseAllChildren(children, callback, traverseContext) {
  function makeEmptyFunction (line 3627) | function makeEmptyFunction(arg) {
  function invariant (line 3706) | function invariant(condition, format, a, b, c, d, e, f) {
  function toObject (line 3808) | function toObject(val) {
  function shouldUseNative (line 3816) | function shouldUseNative() {
Condensed preview — 11 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,452K chars).
[
  {
    "path": "LICENSE",
    "chars": 1058,
    "preview": "Copyright (c) 2017 Claudio Procida\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this"
  },
  {
    "path": "LICENSE-react",
    "chars": 1526,
    "preview": "BSD License\n\nFor React software\n\nCopyright (c) 2013-present, Facebook, Inc.\nAll rights reserved.\n\nRedistribution and use"
  },
  {
    "path": "LICENSE-react-examples",
    "chars": 586,
    "preview": "The examples provided by Facebook are for non-commercial testing and evaluation\npurposes only. Facebook reserves all rig"
  },
  {
    "path": "README.md",
    "chars": 490,
    "preview": "# React Fiber vs Stack Demo\n\nThis demo shows the differences between Stack and Fiber by rendering a Sierpinski triangle "
  },
  {
    "path": "css/base.css",
    "chars": 835,
    "preview": "body {\n  background: #fff;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 15px;\n  line-heig"
  },
  {
    "path": "fiber.html",
    "chars": 4992,
    "preview": "<!DOCTYPE html>\n<html style=\"width: 100%; height: 100%; overflow: hidden\">\n  <head>\n    <meta charset=\"utf-8\">\n    <titl"
  },
  {
    "path": "index.html",
    "chars": 659,
    "preview": "<!DOCTYPE html>\n<html style=\"width: 100%; height: 100%; overflow: hidden\">\n  <head>\n    <meta charset=\"utf-8\">\n    <titl"
  },
  {
    "path": "js/react-dom-fiber.js",
    "chars": 613367,
    "preview": " /**\n  * ReactDOMFiber v16.0.0-alpha.2\n  */\n\n;(function(f) {\n  // CommonJS\n  if (typeof exports === \"object\" && typeof m"
  },
  {
    "path": "js/react-dom.js",
    "chars": 645207,
    "preview": " /**\n  * ReactDOM v16.0.0-alpha.2\n  */\n\n;(function(f) {\n  // CommonJS\n  if (typeof exports === \"object\" && typeof module"
  },
  {
    "path": "js/react.js",
    "chars": 132103,
    "preview": " /**\n  * React v16.0.0-alpha.2\n  */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.expor"
  },
  {
    "path": "stack.html",
    "chars": 4959,
    "preview": "<!DOCTYPE html>\n<html style=\"width: 100%; height: 100%; overflow: hidden\">\n  <head>\n    <meta charset=\"utf-8\">\n    <titl"
  }
]

About this extraction

This page contains the full source code of the claudiopro/react-fiber-vs-stack-demo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 11 files (1.3 MB), approximately 338.1k tokens, and a symbol index with 681 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!