From 89a2ba529e84490ecfa1b9966aff4dcddb0844c7 Mon Sep 17 00:00:00 2001 From: vzaidman Date: Sat, 18 Apr 2020 18:08:08 +0300 Subject: [PATCH] v4.1.0-alpha.0 --- dist/cjs/whyDidYouRender.js | 199 ++++++++++++++---- dist/cjs/whyDidYouRender.min.js | 6 +- dist/cjs/whyDidYouRender.min.js.map | 2 +- dist/esm/whyDidYouRender.js | 199 ++++++++++++++---- dist/esm/whyDidYouRender.min.js | 6 +- dist/esm/whyDidYouRender.min.js.map | 2 +- .../cjs/whyDidYouRender.js | 199 ++++++++++++++---- .../cjs/whyDidYouRender.min.js | 6 +- .../cjs/whyDidYouRender.min.js.map | 2 +- .../esm/whyDidYouRender.js | 199 ++++++++++++++---- .../esm/whyDidYouRender.min.js | 6 +- .../esm/whyDidYouRender.min.js.map | 2 +- .../umd/whyDidYouRender.js | 199 ++++++++++++++---- .../umd/whyDidYouRender.min.js | 6 +- .../umd/whyDidYouRender.min.js.map | 2 +- dist/umd/whyDidYouRender.js | 199 ++++++++++++++---- dist/umd/whyDidYouRender.min.js | 6 +- dist/umd/whyDidYouRender.min.js.map | 2 +- package.json | 2 +- 19 files changed, 991 insertions(+), 253 deletions(-) diff --git a/dist/cjs/whyDidYouRender.js b/dist/cjs/whyDidYouRender.js index 8b13943..201827b 100644 --- a/dist/cjs/whyDidYouRender.js +++ b/dist/cjs/whyDidYouRender.js @@ -1,8 +1,8 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ 'use strict'; @@ -352,7 +352,8 @@ function defaultNotifier(updateInfo) { nextState = updateInfo.nextState, nextHook = updateInfo.nextHook, reason = updateInfo.reason, - options = updateInfo.options; + options = updateInfo.options, + ownerDataMap = updateInfo.ownerDataMap; if (!shouldLog(reason, Component, options)) { return; @@ -408,6 +409,66 @@ function defaultNotifier(updateInfo) { }); } + if (reason.propsDifferences && reason.ownerDifferences) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); + options.consoleGroup("Rendered by ".concat(nextOwnerData.displayName)); + var _prefixMessage = 'Re-rendered because'; + + if (reason.ownerDifferences.propsDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'props', + differences: reason.ownerDifferences.propsDifferences, + values: { + prev: prevOwnerData.props, + next: nextOwnerData.props + }, + options: options + }); + _prefixMessage = 'And because'; + } + + if (reason.ownerDifferences.stateDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'state', + differences: reason.ownerDifferences.stateDifferences, + values: { + prev: prevOwnerData.state, + next: nextOwnerData.state + }, + options: options + }); + } + + if (reason.ownerDifferences.hookDifferences) { + reason.ownerDifferences.hookDifferences.forEach(function (_ref3, i) { + var hookName = _ref3.hookName, + differences = _ref3.differences; + return logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'hook', + differences: differences, + values: { + prev: prevOwnerData.hooks[i].result, + next: nextOwnerData.hooks[i].result + }, + hookName: hookName, + options: options + }); + }); + } + + options.consoleGroupEnd(); + } + if (!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences) { options.consoleLog(_defineProperty({}, displayName, Component), 'Re-rendered although props and state objects are the same.', 'This usually means there was a call to this.forceUpdate() inside the component.', "more info at ".concat(moreInfoUrl)); } @@ -455,6 +516,7 @@ function normalizeOptions() { consoleGroup: consoleGroup, consoleGroupEnd: consoleGroupEnd, logOnDifferentValues: false, + logOwnerReasons: false, trackHooks: true, titleColor: '#058', diffNameColor: 'blue', @@ -622,27 +684,44 @@ function findObjectsDifferences(userPrevObj, userNextObj) { }, []); } -function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) { +function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); return { propsDifferences: findObjectsDifferences(prevProps, nextProps), stateDifferences: findObjectsDifferences(prevState, nextState), hookDifferences: findObjectsDifferences(prevHook, nextHook, { shallow: false - }) + }), + ownerDifferences: prevOwnerData != null && nextOwnerData != null ? { + propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props), + stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state), + hookDifferences: prevOwnerData.hooks.map(function (_ref, i) { + var hookName = _ref.hookName, + result = _ref.result; + return { + hookName: hookName, + differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, { + shallow: false + }) + }; + }) + } : false }; } -function getUpdateInfo(_ref) { - var Component = _ref.Component, - displayName = _ref.displayName, - hookName = _ref.hookName, - prevProps = _ref.prevProps, - prevState = _ref.prevState, - prevHook = _ref.prevHook, - nextProps = _ref.nextProps, - nextState = _ref.nextState, - nextHook = _ref.nextHook, - options = _ref.options; +function getUpdateInfo(_ref2) { + var Component = _ref2.Component, + displayName = _ref2.displayName, + hookName = _ref2.hookName, + prevProps = _ref2.prevProps, + prevState = _ref2.prevState, + prevHook = _ref2.prevHook, + nextProps = _ref2.nextProps, + nextState = _ref2.nextState, + nextHook = _ref2.nextHook, + options = _ref2.options, + ownerDataMap = _ref2.ownerDataMap; return { Component: Component, displayName: displayName, @@ -654,7 +733,8 @@ function getUpdateInfo(_ref) { nextState: nextState, nextHook: nextHook, options: options, - reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) + ownerDataMap: ownerDataMap, + reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) }; } @@ -719,7 +799,7 @@ function shouldTrack(_ref) { return !!(Component.whyDidYouRender || options.trackAllPureComponents && (Component && Component.prototype instanceof React.PureComponent || isMemoComponent(Component)) || shouldInclude(displayName, options)); } -function patchClassComponent(ClassComponent, displayName, React, options) { +function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap) { var WDYRPatchedClassComponent = /*#__PURE__*/function (_ClassComponent) { _inherits(WDYRPatchedClassComponent, _ClassComponent); @@ -769,7 +849,8 @@ function patchClassComponent(ClassComponent, displayName, React, options) { prevState: this._WDYR.prevState, nextProps: this.props, nextState: this.state, - options: options + options: options, + ownerDataMap: ownerDataMap })); } @@ -800,7 +881,7 @@ var getFunctionalComponentFromStringComponent = function getFunctionalComponentF }; }; -function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options) { +function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap) { var FunctionalComponent = typeof FunctionalOrStringComponent === 'string' ? getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) : FunctionalOrStringComponent; function WDYRFunctionalComponent() { @@ -815,7 +896,8 @@ function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, disp displayName: displayName, prevProps: prevProps, nextProps: nextProps, - options: options + options: options, + ownerDataMap: ownerDataMap }); var shouldNotify = updateInfo.reason.propsDifferences && !(isPure && updateInfo.reason.propsDifferences.length === 0); @@ -839,13 +921,13 @@ function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, disp return WDYRFunctionalComponent; } -function patchMemoComponent(MemoComponent, displayName, React, options) { +function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap) { var InnerMemoComponent = MemoComponent.type; var isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent); var isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent); var isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent); var WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ? InnerMemoComponent.render : InnerMemoComponent; - var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options); + var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap); try { PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent); @@ -868,11 +950,11 @@ function patchMemoComponent(MemoComponent, displayName, React, options) { return WDYRMemoizedFunctionalComponent; } -function patchForwardRefComponent(ForwardRefComponent, displayName, React, options) { +function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap) { var InnerForwardRefComponent = ForwardRefComponent.render; var isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent); var WrappedFunctionalComponent = isInnerComponentMemoized ? InnerForwardRefComponent.type : InnerForwardRefComponent; - var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options); + var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap); WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent); WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent; @@ -892,8 +974,13 @@ function patchForwardRefComponent(ForwardRefComponent, displayName, React, optio var initialHookValue = Symbol('initial-hook-value'); -function trackHookChanges(hookName, _ref, hookResult, React, options) { +function trackHookChanges(hookName, _ref, hookResult, React, options, ownerDataMap, hooksRef) { var hookPath = _ref.path; + var nextHook = hookPath ? _get$1(hookResult, hookPath) : hookResult; + hooksRef.current.push({ + hookName: hookName, + result: nextHook + }); var ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; var prevHookResultRef = React.useRef(initialHookValue); @@ -924,8 +1011,9 @@ function trackHookChanges(hookName, _ref, hookResult, React, options) { displayName: displayName, hookName: hookName, prevHook: hookPath ? _get$1(prevHookResult, hookPath) : prevHookResult, - nextHook: hookPath ? _get$1(hookResult, hookPath) : hookResult, - options: options + nextHook: nextHook, + options: options, + ownerDataMap: ownerDataMap }); if (notification.reason.hookDifferences) { @@ -936,28 +1024,28 @@ function trackHookChanges(hookName, _ref, hookResult, React, options) { return hookResult; } -function createPatchedComponent(componentsMap, Component, displayName, React, options) { +function createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (isMemoComponent(Component)) { - return patchMemoComponent(Component, displayName, React, options); + return patchMemoComponent(Component, displayName, React, options, ownerDataMap); } if (isForwardRefComponent(Component)) { - return patchForwardRefComponent(Component, displayName, React, options); + return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap); } if (isReactClassComponent(Component)) { - return patchClassComponent(Component, displayName, React, options); + return patchClassComponent(Component, displayName, React, options, ownerDataMap); } - return patchFunctionalOrStrComponent(Component, false, displayName, React, options); + return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap); } -function getPatchedComponent(componentsMap, Component, displayName, React, options) { +function getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (componentsMap.has(Component)) { return componentsMap.get(Component); } - var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options); + var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap); componentsMap.set(Component, WDYRPatchedComponent); return WDYRPatchedComponent; } @@ -977,6 +1065,21 @@ function whyDidYouRender(React, userOptions) { var origCreateElement = React.createElement; var origCreateFactory = React.createFactory; var componentsMap = new WeakMap(); + var ownerDataMap = new WeakMap(); + var hooksRef = { + current: [] + }; // Intercept assignments to ReactCurrentOwner.current and reset hooksRef + + var currentOwner = null; + Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', { + get: function get() { + return currentOwner; + }, + set: function set(value) { + currentOwner = value; + hooksRef.current = []; + } + }); React.createElement = function (componentNameOrComponent) { var isShouldTrack = null; @@ -997,8 +1100,28 @@ function whyDidYouRender(React, userOptions) { if (isShouldTrack) { displayName = componentNameOrComponent && componentNameOrComponent.whyDidYouRender && componentNameOrComponent.whyDidYouRender.customName || getDisplayName(componentNameOrComponent); - WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options); - return origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap); + var element = origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + + if (options.logOwnerReasons) { + var OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; + + if (OwnerInstance != null) { + var Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type; + + var _displayName = getDisplayName(Component); + + ownerDataMap.set(element.props, { + Component: Component, + displayName: _displayName, + props: OwnerInstance.pendingProps, + state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null, + hooks: hooksRef.current + }); + } + } + + return element; } } catch (e) { options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', { @@ -1052,7 +1175,7 @@ function whyDidYouRender(React, userOptions) { } var hookResult = originalHook.call.apply(originalHook, [this].concat(args)); - trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options); + trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef); return hookResult; }; diff --git a/dist/cjs/whyDidYouRender.min.js b/dist/cjs/whyDidYouRender.min.js index 322f004..3388292 100644 --- a/dist/cjs/whyDidYouRender.min.js +++ b/dist/cjs/whyDidYouRender.min.js @@ -1,9 +1,9 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ -"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var t=e(require("lodash/get")),r=e(require("lodash/isString")),n=e(require("lodash/reduce")),o=e(require("lodash/has")),a=e(require("lodash/keys")),i=e(require("lodash/isFunction")),c=e(require("lodash/isRegExp")),u=e(require("lodash/isDate")),s=e(require("lodash/isPlainObject")),f=e(require("lodash/isArray")),l=e(require("lodash/defaults"));function p(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r0?(u.consoleLog(d({},r,t),"".concat(o," of ").concat(a," changes:")),i.forEach((function(e){var t=e.pathString,r=e.diffType,o=e.prevValue,i=e.nextValue;u.consoleGroup("%c".concat("hook"===a?"[hook ".concat(n," result]"):"".concat(a,"."),"%c").concat(t,"%c"),"color:".concat(u.diffNameColor,";"),"color:".concat(u.diffPathColor,";"),"color:default;"),u.consoleLog("".concat(W[r]," (more info at ").concat(n?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),u.consoleLog(d({},"prev ".concat(t),o),"!==",d({},"next ".concat(t),i)),u.consoleGroupEnd()}))):i&&(u.consoleLog(d({},r,t),"".concat(o," the ").concat(a," object itself changed but its values are all equal."),"props"===a?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),u.consoleLog("prev ".concat(a,":"),c.prev," !== ",c.next,":next ".concat(a)))}function L(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,u=e.nextState,s=e.nextHook,f=e.reason,l=e.options;if(function(e,t,r){return!A&&(!!r.logOnDifferentValues||(!(!t.whyDidYouRender||!t.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===j}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===j}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===j})))))}(f,t,l)){l.consoleGroup("%c".concat(r),"color: ".concat(l.titleColor,";"));var p="Re-rendered because";f.propsDifferences&&(q({Component:t,displayName:r,prefixMessage:p,diffObjType:"props",differences:f.propsDifferences,values:{prev:o,next:c},options:l}),p="And because"),f.stateDifferences&&q({Component:t,displayName:r,prefixMessage:p,diffObjType:"state",differences:f.stateDifferences,values:{prev:a,next:u},options:l}),f.hookDifferences&&q({Component:t,displayName:r,prefixMessage:p,diffObjType:"hook",differences:f.hookDifferences,values:{prev:i,next:s},hookName:n,options:l}),f.propsDifferences||f.stateDifferences||f.hookDifferences||l.consoleLog(d({},r,t),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),l.consoleGroupEnd()}}function M(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(t){"idle"===t&&(A=!0,setTimeout((function(){A=!1}),e))})),L}var I=function(){};function F(e){return e.displayName||e.name||e.type&&F(e.type)||e.render&&F(e.render)||(r(e)?e:void 0)}var V="undefined"!=typeof Element,G="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103,U=function(e){return e.$$typeof===G};function $(e,t,r,n,o){return r.push({diffType:o,pathString:n,prevValue:e,nextValue:t}),o!==j}function B(e,t,r){try{var n=[];return function e(t,r,n){var l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(t===r)return!0;if(!t||!r)return $(t,r,n,l,j);if(f(t)&&f(r)){var p=t.length;if(p!==r.length)return $(t,r,n,l,j);for(var d=!0,y=p;0!=y--;)e(t[y],r[y],n,"".concat(l,"[").concat(y,"]"))||(d=!1);return $(t,r,n,l,d?E:j)}if(u(t)&&u(r))return t.getTime()===r.getTime()?$(t,r,n,l,N):$(t,r,n,l,j);if(c(t)&&c(r))return t.toString()===r.toString()?$(t,r,n,l,x):$(t,r,n,l,j);if(V&&t instanceof Element&&r instanceof Element)return $(t,r,n,l,j);if(U(t)&&U(r)){if(t.type!==r.type)return $(t,r,n,l,j);var h=e(t.props,r.props,n,"".concat(l,".props"));return $(t,r,n,l,h?P:j)}if(i(t)&&i(r))return t.name===r.name?$(t,r,n,l,C):$(t,r,n,l,j);if(s(t)&&s(r)){var m=a(t),v=m.length;if(v!==a(r).length)return $(t,r,n,l,j);for(var b=v;0!=b--;)if(!o(r,m[b]))return $(t,r,n,l,j);for(var g=!0,k=v;0!=k--;){var D=m[k];e(t[D],r[D],n,"".concat(l,".").concat(D))||(g=!1)}return $(t,r,n,l,g?E:j)}return $(t,r,n,l,j)}(e,t,n,r),n}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var z={};function J(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.shallow,a=void 0===o||o;if(e===t)return!1;if(!a)return B(e,t);var i=e||z,c=t||z,u=Object.keys(h({},i,{},c));return n(u,(function(e,t){var r=B(i[t],c[t],t);return r&&(e=[].concat(w(e),w(r))),e}),[])}function K(e,t,r,n,o,a){return{propsDifferences:J(e,n),stateDifferences:J(t,o),hookDifferences:J(r,a,{shallow:!1})}}function Q(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,u=e.nextState,s=e.nextHook;return{Component:t,displayName:r,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:u,nextHook:s,options:e.options,reason:K(o,a,i,c,u,s)}}function X(e){return e.prototype&&!!e.prototype.isReactComponent}function Z(e){return e.$$typeof===H}function ee(e){return e.$$typeof===Y}function te(e){var t=e.Component,r=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,t){return t.exclude&&t.exclude.length>0&&t.exclude.some((function(t){return t.test(e)}))}(r,n)&&(!1!==t.whyDidYouRender&&((!a||!t.whyDidYouRender||!1!==t.whyDidYouRender.trackHooks)&&!!(t.whyDidYouRender||n.trackAllPureComponents&&(t&&t.prototype instanceof o.PureComponent||Z(t))||function(e,t){return t.include&&t.include.length>0&&t.include.some((function(t){return t.test(e)}))}(r,n))))}function re(e,t,r,n){var o=function(r){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(s,r);var o,a,i,c,u=(o=s,function(){var e,t=m(o);if(b()){var r=m(this).constructor;e=Reflect.construct(t,arguments,r)}else e=t.apply(this,arguments);return k(this,e)});function s(t,r){var n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,s),(n=u.call(this,t,r))._WDYR={renderNumber:0};var o=D(m(s.prototype),"render",g(n))||n.render;return o!==e.prototype.render&&(n.render=function(){return s.prototype.render.apply(g(n)),o()}),n}return a=s,(i=[{key:"render",value:function(){return this._WDYR.renderNumber++,"isStrictMode"in this._WDYR||(this._WDYR.isStrictMode=function(e){for(var t=e&&e._reactInternalFiber;t;){if(1&t.mode)return!0;t=t.return}return!1}(this)),this._WDYR.isStrictMode&&this._WDYR.renderNumber%2==1||(this._WDYR.prevProps&&n.notifier(Q({Component:e,displayName:t,prevProps:this._WDYR.prevProps,prevState:this._WDYR.prevState,nextProps:this.props,nextState:this.state,options:n})),this._WDYR.prevProps=this.props,this._WDYR.prevState=this.state),D(m(s.prototype),"render",this)?D(m(s.prototype),"render",this).call(this):null}}])&&p(a.prototype,i),c&&p(a,c),s}(e);try{o.displayName=t}catch(e){}return l(o,e),o}function ne(e,t,r,n,o){var a="string"==typeof e?function(e,t){return function(r){return t.createElement(e,r)}}(e,n):e;function i(){var e=arguments[0],i=n.useRef(),c=i.current;if(i.current=e,c){var u=Q({Component:a,displayName:r,prevProps:c,nextProps:e,options:o}),s=u.reason.propsDifferences&&!(t&&0===u.reason.propsDifferences.length);s&&o.notifier(u)}return a.apply(void 0,arguments)}try{i.displayName=r}catch(e){}return i.ComponentForHooksTracking=a,l(i,a),i}var oe=Symbol("initial-hook-value");function ae(e,r,n,o,a){var i=r.path,c=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current,u=o.useRef(oe);if(!c)return n;var s=c.type.ComponentForHooksTracking||c.type,f=F(s);if(!te({Component:s,displayName:f,options:a,React:o,isHookChange:!0}))return n;var l=u.current;if(u.current=n,l!==oe){var p=Q({Component:s,displayName:f,hookName:e,prevHook:i?t(l,i):l,nextHook:i?t(n,i):n,options:a});p.reason.hookDifferences&&a.notifier(p)}return n}function ie(e,t,r,n,o){return Z(t)?function e(t,r,n,o){var a=t.type,i=X(a),c=ee(a),u=Z(a),s=c?a.render:a,f=i?re(s,r,0,o):u?e(s,r,n,o):ne(s,!0,r,n,o);try{f.displayName=F(s)}catch(e){}f.ComponentForHooksTracking=t,l(f,s);var p=n.memo(c?n.forwardRef(f):f,t.compare);try{p.displayName=r}catch(e){}return l(p,t),p}(t,r,n,o):ee(t)?function(e,t,r,n){var o=e.render,a=Z(o),i=a?o.type:o,c=ne(i,a,t,r,n);c.displayName=F(i),c.ComponentForHooksTracking=i,l(c,i);var u=r.forwardRef(a?r.memo(c,o.compare):c);try{u.displayName=t}catch(e){}return l(u,e),u}(t,r,n,o):X(t)?re(t,r,0,o):ne(t,!1,r,n,o)}function ce(e,t,r,n,o){if(e.has(t))return e.get(t);var a=ie(0,t,r,n,o);return e.set(t,a),a}var ue={useState:{path:"0"},useReducer:{path:"0"},useContext:!0,useMemo:!0};function se(e,t){var r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=console.group,r=console.groupEnd;e.collapseGroups?t=console.groupCollapsed:e.onlyLogs&&(t=console.log,r=I);var n=e.notifier||M("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return h({include:null,exclude:null,notifier:n,onlyLogs:!1,consoleLog:console.log,consoleGroup:t,consoleGroupEnd:r,logOnDifferentValues:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(t),n=e.createElement,o=e.createFactory,a=new WeakMap;if(e.createElement=function(t){for(var o=null,i=null,c=null,u=arguments.length,s=new Array(u>1?u-1:0),f=1;fe.length)&&(r=e.length);for(var t=0,n=new Array(r);t0?(s.consoleLog(d({},t,r),"".concat(o," of ").concat(a," changes:")),i.forEach((function(e){var r=e.pathString,t=e.diffType,o=e.prevValue,i=e.nextValue;s.consoleGroup("%c".concat("hook"===a?"[hook ".concat(n," result]"):"".concat(a,"."),"%c").concat(r,"%c"),"color:".concat(s.diffNameColor,";"),"color:".concat(s.diffPathColor,";"),"color:default;"),s.consoleLog("".concat(M[t]," (more info at ").concat(n?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),s.consoleLog(d({},"prev ".concat(r),o),"!==",d({},"next ".concat(r),i)),s.consoleGroupEnd()}))):i&&(s.consoleLog(d({},t,r),"".concat(o," the ").concat(a," object itself changed but its values are all equal."),"props"===a?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),s.consoleLog("prev ".concat(a,":"),c.prev," !== ",c.next,":next ".concat(a)))}function L(e){var r=e.Component,t=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,f=e.nextHook,u=e.reason,p=e.options,l=e.ownerDataMap;if(function(e,r,t){return!W&&(!!t.logOnDifferentValues||(!(!r.whyDidYouRender||!r.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===E}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===E}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===E})))))}(u,r,p)){p.consoleGroup("%c".concat(t),"color: ".concat(p.titleColor,";"));var y="Re-rendered because";if(u.propsDifferences&&(A({Component:r,displayName:t,prefixMessage:y,diffObjType:"props",differences:u.propsDifferences,values:{prev:o,next:c},options:p}),y="And because"),u.stateDifferences&&A({Component:r,displayName:t,prefixMessage:y,diffObjType:"state",differences:u.stateDifferences,values:{prev:a,next:s},options:p}),u.hookDifferences&&A({Component:r,displayName:t,prefixMessage:y,diffObjType:"hook",differences:u.hookDifferences,values:{prev:i,next:f},hookName:n,options:p}),u.propsDifferences&&u.ownerDifferences){var h=l.get(o),m=l.get(c);p.consoleGroup("Rendered by ".concat(m.displayName));var v="Re-rendered because";u.ownerDifferences.propsDifferences&&(A({Component:m.Component,displayName:m.displayName,prefixMessage:v,diffObjType:"props",differences:u.ownerDifferences.propsDifferences,values:{prev:h.props,next:m.props},options:p}),v="And because"),u.ownerDifferences.stateDifferences&&A({Component:m.Component,displayName:m.displayName,prefixMessage:v,diffObjType:"state",differences:u.ownerDifferences.stateDifferences,values:{prev:h.state,next:m.state},options:p}),u.ownerDifferences.hookDifferences&&u.ownerDifferences.hookDifferences.forEach((function(e,r){var t=e.hookName,n=e.differences;return A({Component:m.Component,displayName:m.displayName,prefixMessage:v,diffObjType:"hook",differences:n,values:{prev:h.hooks[r].result,next:m.hooks[r].result},hookName:t,options:p})})),p.consoleGroupEnd()}u.propsDifferences||u.stateDifferences||u.hookDifferences||p.consoleLog(d({},t,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),p.consoleGroupEnd()}}function I(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(r){"idle"===r&&(W=!0,setTimeout((function(){W=!1}),e))})),L}var q=function(){};function F(e){return e.displayName||e.name||e.type&&F(e.type)||e.render&&F(e.render)||(t(e)?e:void 0)}var U="undefined"!=typeof Element,G="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103,V=function(e){return e.$$typeof===G};function $(e,r,t,n,o){return t.push({diffType:o,pathString:n,prevValue:e,nextValue:r}),o!==E}function B(e,r,t){try{var n=[];return function e(r,t,n){var p=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(r===t)return!0;if(!r||!t)return $(r,t,n,p,E);if(u(r)&&u(t)){var l=r.length;if(l!==t.length)return $(r,t,n,p,E);for(var d=!0,y=l;0!=y--;)e(r[y],t[y],n,"".concat(p,"[").concat(y,"]"))||(d=!1);return $(r,t,n,p,d?S:E)}if(s(r)&&s(t))return r.getTime()===t.getTime()?$(r,t,n,p,j):$(r,t,n,p,E);if(c(r)&&c(t))return r.toString()===t.toString()?$(r,t,n,p,C):$(r,t,n,p,E);if(U&&r instanceof Element&&t instanceof Element)return $(r,t,n,p,E);if(V(r)&&V(t)){if(r.type!==t.type)return $(r,t,n,p,E);var h=e(r.props,t.props,n,"".concat(p,".props"));return $(r,t,n,p,h?x:E)}if(i(r)&&i(t))return r.name===t.name?$(r,t,n,p,P):$(r,t,n,p,E);if(f(r)&&f(t)){var m=a(r),v=m.length;if(v!==a(t).length)return $(r,t,n,p,E);for(var g=v;0!=g--;)if(!o(t,m[g]))return $(r,t,n,p,E);for(var b=!0,D=v;0!=D--;){var k=m[D];e(r[k],t[k],n,"".concat(p,".").concat(k))||(b=!1)}return $(r,t,n,p,b?S:E)}return $(r,t,n,p,E)}(e,r,n,t),n}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var z={};function J(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=t.shallow,a=void 0===o||o;if(e===r)return!1;if(!a)return B(e,r);var i=e||z,c=r||z,s=Object.keys(h({},i,{},c));return n(s,(function(e,r){var t=B(i[r],c[r],r);return t&&(e=[].concat(O(e),O(t))),e}),[])}function K(e,r,t,n,o,a,i){var c=i.get(e),s=i.get(n);return{propsDifferences:J(e,n),stateDifferences:J(r,o),hookDifferences:J(t,a,{shallow:!1}),ownerDifferences:null!=c&&null!=s&&{propsDifferences:J(c.props,s.props),stateDifferences:J(c.state,s.state),hookDifferences:c.hooks.map((function(e,r){return{hookName:e.hookName,differences:J(e.result,s.hooks[r].result,{shallow:!1})}}))}}}function Q(e){var r=e.Component,t=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,f=e.nextHook,u=e.options,p=e.ownerDataMap;return{Component:r,displayName:t,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:s,nextHook:f,options:u,ownerDataMap:p,reason:K(o,a,i,c,s,f,p)}}function X(e){return e.prototype&&!!e.prototype.isReactComponent}function Z(e){return e.$$typeof===H}function ee(e){return e.$$typeof===Y}function re(e){var r=e.Component,t=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,r){return r.exclude&&r.exclude.length>0&&r.exclude.some((function(r){return r.test(e)}))}(t,n)&&(!1!==r.whyDidYouRender&&((!a||!r.whyDidYouRender||!1!==r.whyDidYouRender.trackHooks)&&!!(r.whyDidYouRender||n.trackAllPureComponents&&(r&&r.prototype instanceof o.PureComponent||Z(r))||function(e,r){return r.include&&r.include.length>0&&r.include.some((function(r){return r.test(e)}))}(t,n))))}function te(e,r,t,n,o){var a=function(t){!function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),r&&v(e,r)}(u,t);var a,i,c,s,f=(a=u,function(){var e,r=m(a);if(g()){var t=m(this).constructor;e=Reflect.construct(r,arguments,t)}else e=r.apply(this,arguments);return D(this,e)});function u(r,t){var n;!function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}(this,u),(n=f.call(this,r,t))._WDYR={renderNumber:0};var o=k(m(u.prototype),"render",b(n))||n.render;return o!==e.prototype.render&&(n.render=function(){return u.prototype.render.apply(b(n)),o()}),n}return i=u,(c=[{key:"render",value:function(){return this._WDYR.renderNumber++,"isStrictMode"in this._WDYR||(this._WDYR.isStrictMode=function(e){for(var r=e&&e._reactInternalFiber;r;){if(1&r.mode)return!0;r=r.return}return!1}(this)),this._WDYR.isStrictMode&&this._WDYR.renderNumber%2==1||(this._WDYR.prevProps&&n.notifier(Q({Component:e,displayName:r,prevProps:this._WDYR.prevProps,prevState:this._WDYR.prevState,nextProps:this.props,nextState:this.state,options:n,ownerDataMap:o})),this._WDYR.prevProps=this.props,this._WDYR.prevState=this.state),k(m(u.prototype),"render",this)?k(m(u.prototype),"render",this).call(this):null}}])&&l(i.prototype,c),s&&l(i,s),u}(e);try{a.displayName=r}catch(e){}return p(a,e),a}function ne(e,r,t,n,o,a){var i="string"==typeof e?function(e,r){return function(t){return r.createElement(e,t)}}(e,n):e;function c(){var e=arguments[0],c=n.useRef(),s=c.current;if(c.current=e,s){var f=Q({Component:i,displayName:t,prevProps:s,nextProps:e,options:o,ownerDataMap:a}),u=f.reason.propsDifferences&&!(r&&0===f.reason.propsDifferences.length);u&&o.notifier(f)}return i.apply(void 0,arguments)}try{c.displayName=t}catch(e){}return c.ComponentForHooksTracking=i,p(c,i),c}var oe=Symbol("initial-hook-value");function ae(e,t,n,o,a,i,c){var s=t.path,f=s?r(n,s):n;c.current.push({hookName:e,result:f});var u=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current,p=o.useRef(oe);if(!u)return n;var l=u.type.ComponentForHooksTracking||u.type,d=F(l);if(!re({Component:l,displayName:d,options:a,React:o,isHookChange:!0}))return n;var y=p.current;if(p.current=n,y!==oe){var h=Q({Component:l,displayName:d,hookName:e,prevHook:s?r(y,s):y,nextHook:f,options:a,ownerDataMap:i});h.reason.hookDifferences&&a.notifier(h)}return n}function ie(e,r,t,n,o,a){return Z(r)?function e(r,t,n,o,a){var i=r.type,c=X(i),s=ee(i),f=Z(i),u=s?i.render:i,l=c?te(u,t,0,o,a):f?e(u,t,n,o,a):ne(u,!0,t,n,o,a);try{l.displayName=F(u)}catch(e){}l.ComponentForHooksTracking=r,p(l,u);var d=n.memo(s?n.forwardRef(l):l,r.compare);try{d.displayName=t}catch(e){}return p(d,r),d}(r,t,n,o,a):ee(r)?function(e,r,t,n,o){var a=e.render,i=Z(a),c=i?a.type:a,s=ne(c,i,r,t,n,o);s.displayName=F(c),s.ComponentForHooksTracking=c,p(s,c);var f=t.forwardRef(i?t.memo(s,a.compare):s);try{f.displayName=r}catch(e){}return p(f,e),f}(r,t,n,o,a):X(r)?te(r,t,0,o,a):ne(r,!1,t,n,o,a)}function ce(e,r,t,n,o,a){if(e.has(r))return e.get(r);var i=ie(0,r,t,n,o,a);return e.set(r,i),i}var se={useState:{path:"0"},useReducer:{path:"0"},useContext:!0,useMemo:!0};function fe(e,r){var t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=console.group,t=console.groupEnd;e.collapseGroups?r=console.groupCollapsed:e.onlyLogs&&(r=console.log,t=q);var n=e.notifier||I("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return h({include:null,exclude:null,notifier:n,onlyLogs:!1,consoleLog:console.log,consoleGroup:r,consoleGroupEnd:t,logOnDifferentValues:!1,logOwnerReasons:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(r),n=e.createElement,o=e.createFactory,a=new WeakMap,i=new WeakMap,c={current:[]},s=null;if(Object.defineProperty(e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,"current",{get:function(){return s},set:function(e){s=e,c.current=[]}}),e.createElement=function(r){for(var o=null,s=null,f=null,u=arguments.length,p=new Array(u>1?u-1:0),l=1;l diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook){\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false})\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options){\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook: hookPath ? get(hookResult, hookPath) : hookResult,\r\n options\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options)\r\n return origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["diffTypes","hasSymbol","Symbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","length","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","type","name","render","_isString","undefined","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","object","$$typeof","trackDiff","a","b","diffsAccumulator","push","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","i","_isDate","getTime","_isRegExp","toString","reactElementPropsAreDeepEqual","props","_isFunction","_isPlainObject","keys","_keys","_has","key","error","message","match","number","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","Object","_reduce","result","deepEqualDiffs","getUpdateReason","getUpdateInfo","isReactClassComponent","prototype","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","test","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","context","_WDYR","renderNumber","origRender","_get","_this","apply","this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","state","e","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","arguments","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hookPath","path","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","has","get","WDYRPatchedComponent","set","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","WeakMap","componentNameOrComponent","isShouldTrack","rest","customName","errorInfo","assign","factory","bind","nativeHooks","entries","map","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","args","call","defineProperty","value","writable","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"whyDidYouRender.min.js.map","sources":["../../src/consts.js","../../src/defaultNotifier.js","../../src/normalizeOptions.js","../../src/getDisplayName.js","../../src/calculateDeepEqualDiffs.js","../../src/findObjectsDifferences.js","../../src/getUpdateInfo.js","../../src/utils.js","../../src/shouldTrack.js","../../src/patches/patchClassComponent.js","../../src/patches/patchFunctionalOrStrComponent.js","../../src/whyDidYouRender.js","../../src/patches/patchMemoComponent.js","../../src/patches/patchForwardRefComponent.js","../../src/index.js"],"sourcesContent":["export const diffTypes = {\r\n 'different': 'different',\r\n 'deepEquals': 'deepEquals',\r\n 'date': 'date',\r\n 'regex': 'regex',\r\n 'reactElement': 'reactElement',\r\n 'function': 'function'\r\n}\r\n\r\n// copied from packages/shared/ReactSymbols.js in https://github.com/facebook/react\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nexport const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3\r\nexport const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0\r\n","import {diffTypes} from './consts'\r\n\r\nconst moreInfoUrl = 'http://bit.ly/wdyr02'\r\nconst moreInfoHooksUrl = 'http://bit.ly/wdyr3'\r\n\r\nconst diffTypesDescriptions = {\r\n [diffTypes.different]: 'different objects.',\r\n [diffTypes.deepEquals]: 'different objects that are equal by value.',\r\n [diffTypes.date]: 'different date objects with the same value.',\r\n [diffTypes.regex]: 'different regular expressions with the same value.',\r\n [diffTypes.reactElement]: 'different React elements with the same displayName.',\r\n [diffTypes.function]: 'different functions with the same name.'\r\n}\r\n\r\nlet inHotReload = false\r\n\r\nfunction shouldLog(reason, Component, options){\r\n if(inHotReload){\r\n return false\r\n }\r\n\r\n if(options.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n if(Component.whyDidYouRender && Component.whyDidYouRender.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n const hasDifferentValues = ((\r\n reason.propsDifferences &&\r\n reason.propsDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options, ownerDataMap} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n\r\n if(reason.propsDifferences && reason.ownerDifferences){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n options.consoleGroup(`Rendered by ${nextOwnerData.displayName}`)\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.ownerDifferences.propsDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.ownerDifferences.propsDifferences,\r\n values: {prev: prevOwnerData.props, next: nextOwnerData.props},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.ownerDifferences.stateDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.ownerDifferences.stateDifferences,\r\n values: {prev: prevOwnerData.state, next: nextOwnerData.state},\r\n options\r\n })\r\n }\r\n\r\n if(reason.ownerDifferences.hookDifferences){\r\n reason.ownerDifferences.hookDifferences.forEach(({hookName, differences}, i) =>\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences,\r\n values: {prev: prevOwnerData.hooks[i].result, next: nextOwnerData.hooks[i].result},\r\n hookName,\r\n options\r\n })\r\n )\r\n }\r\n options.consoleGroupEnd()\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n logOwnerReasons: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false}),\r\n ownerDifferences: prevOwnerData != null && nextOwnerData != null ? {\r\n propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props),\r\n stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state),\r\n hookDifferences: prevOwnerData.hooks.map(({hookName, result}, i) => ({\r\n hookName,\r\n differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, {shallow: false})\r\n }))\r\n } : false\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options, ownerDataMap}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n ownerDataMap,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options,\r\n ownerDataMap\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options, ownerDataMap, hooksRef){\r\n const nextHook = hookPath ? get(hookResult, hookPath) : hookResult\r\n hooksRef.current.push({hookName, result: nextHook})\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n const ownerDataMap = new WeakMap()\r\n const hooksRef = {current: []}\r\n\r\n // Intercept assignments to ReactCurrentOwner.current and reset hooksRef\r\n let currentOwner = null\r\n Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', {\r\n get(){\r\n return currentOwner\r\n },\r\n set(value){\r\n currentOwner = value\r\n hooksRef.current = []\r\n }\r\n })\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap)\r\n\r\n const element = origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n if(options.logOwnerReasons){\r\n const OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n if(OwnerInstance != null){\r\n const Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type\r\n const displayName = getDisplayName(Component)\r\n ownerDataMap.set(element.props, {\r\n Component,\r\n displayName,\r\n props: OwnerInstance.pendingProps,\r\n state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null,\r\n hooks: hooksRef.current\r\n })\r\n }\r\n }\r\n\r\n return element\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["diffTypes","hasSymbol","Symbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","length","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","ownerDataMap","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","ownerDifferences","prevOwnerData","get","nextOwnerData","props","state","i","hooks","result","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","type","name","render","_isString","undefined","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","object","$$typeof","trackDiff","a","b","diffsAccumulator","push","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","_isDate","getTime","_isRegExp","toString","reactElementPropsAreDeepEqual","_isFunction","_isPlainObject","keys","_keys","_has","key","error","message","match","number","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","Object","_reduce","deepEqualDiffs","getUpdateReason","map","getUpdateInfo","isReactClassComponent","prototype","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","test","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","context","_WDYR","renderNumber","origRender","_get","_this","apply","this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","e","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","arguments","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hooksRef","hookPath","path","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","has","WDYRPatchedComponent","set","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","logOwnerReasons","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","WeakMap","currentOwner","defineProperty","value","componentNameOrComponent","isShouldTrack","rest","customName","element","OwnerInstance","pendingProps","stateNode","errorInfo","assign","factory","bind","nativeHooks","entries","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","args","call","writable","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/whyDidYouRender.js b/dist/esm/whyDidYouRender.js index 28d978b..949fe9a 100644 --- a/dist/esm/whyDidYouRender.js +++ b/dist/esm/whyDidYouRender.js @@ -1,8 +1,8 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ import _get$1 from 'lodash/get'; @@ -348,7 +348,8 @@ function defaultNotifier(updateInfo) { nextState = updateInfo.nextState, nextHook = updateInfo.nextHook, reason = updateInfo.reason, - options = updateInfo.options; + options = updateInfo.options, + ownerDataMap = updateInfo.ownerDataMap; if (!shouldLog(reason, Component, options)) { return; @@ -404,6 +405,66 @@ function defaultNotifier(updateInfo) { }); } + if (reason.propsDifferences && reason.ownerDifferences) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); + options.consoleGroup("Rendered by ".concat(nextOwnerData.displayName)); + var _prefixMessage = 'Re-rendered because'; + + if (reason.ownerDifferences.propsDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'props', + differences: reason.ownerDifferences.propsDifferences, + values: { + prev: prevOwnerData.props, + next: nextOwnerData.props + }, + options: options + }); + _prefixMessage = 'And because'; + } + + if (reason.ownerDifferences.stateDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'state', + differences: reason.ownerDifferences.stateDifferences, + values: { + prev: prevOwnerData.state, + next: nextOwnerData.state + }, + options: options + }); + } + + if (reason.ownerDifferences.hookDifferences) { + reason.ownerDifferences.hookDifferences.forEach(function (_ref3, i) { + var hookName = _ref3.hookName, + differences = _ref3.differences; + return logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'hook', + differences: differences, + values: { + prev: prevOwnerData.hooks[i].result, + next: nextOwnerData.hooks[i].result + }, + hookName: hookName, + options: options + }); + }); + } + + options.consoleGroupEnd(); + } + if (!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences) { options.consoleLog(_defineProperty({}, displayName, Component), 'Re-rendered although props and state objects are the same.', 'This usually means there was a call to this.forceUpdate() inside the component.', "more info at ".concat(moreInfoUrl)); } @@ -451,6 +512,7 @@ function normalizeOptions() { consoleGroup: consoleGroup, consoleGroupEnd: consoleGroupEnd, logOnDifferentValues: false, + logOwnerReasons: false, trackHooks: true, titleColor: '#058', diffNameColor: 'blue', @@ -618,27 +680,44 @@ function findObjectsDifferences(userPrevObj, userNextObj) { }, []); } -function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) { +function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); return { propsDifferences: findObjectsDifferences(prevProps, nextProps), stateDifferences: findObjectsDifferences(prevState, nextState), hookDifferences: findObjectsDifferences(prevHook, nextHook, { shallow: false - }) + }), + ownerDifferences: prevOwnerData != null && nextOwnerData != null ? { + propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props), + stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state), + hookDifferences: prevOwnerData.hooks.map(function (_ref, i) { + var hookName = _ref.hookName, + result = _ref.result; + return { + hookName: hookName, + differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, { + shallow: false + }) + }; + }) + } : false }; } -function getUpdateInfo(_ref) { - var Component = _ref.Component, - displayName = _ref.displayName, - hookName = _ref.hookName, - prevProps = _ref.prevProps, - prevState = _ref.prevState, - prevHook = _ref.prevHook, - nextProps = _ref.nextProps, - nextState = _ref.nextState, - nextHook = _ref.nextHook, - options = _ref.options; +function getUpdateInfo(_ref2) { + var Component = _ref2.Component, + displayName = _ref2.displayName, + hookName = _ref2.hookName, + prevProps = _ref2.prevProps, + prevState = _ref2.prevState, + prevHook = _ref2.prevHook, + nextProps = _ref2.nextProps, + nextState = _ref2.nextState, + nextHook = _ref2.nextHook, + options = _ref2.options, + ownerDataMap = _ref2.ownerDataMap; return { Component: Component, displayName: displayName, @@ -650,7 +729,8 @@ function getUpdateInfo(_ref) { nextState: nextState, nextHook: nextHook, options: options, - reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) + ownerDataMap: ownerDataMap, + reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) }; } @@ -715,7 +795,7 @@ function shouldTrack(_ref) { return !!(Component.whyDidYouRender || options.trackAllPureComponents && (Component && Component.prototype instanceof React.PureComponent || isMemoComponent(Component)) || shouldInclude(displayName, options)); } -function patchClassComponent(ClassComponent, displayName, React, options) { +function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap) { var WDYRPatchedClassComponent = /*#__PURE__*/function (_ClassComponent) { _inherits(WDYRPatchedClassComponent, _ClassComponent); @@ -765,7 +845,8 @@ function patchClassComponent(ClassComponent, displayName, React, options) { prevState: this._WDYR.prevState, nextProps: this.props, nextState: this.state, - options: options + options: options, + ownerDataMap: ownerDataMap })); } @@ -796,7 +877,7 @@ var getFunctionalComponentFromStringComponent = function getFunctionalComponentF }; }; -function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options) { +function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap) { var FunctionalComponent = typeof FunctionalOrStringComponent === 'string' ? getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) : FunctionalOrStringComponent; function WDYRFunctionalComponent() { @@ -811,7 +892,8 @@ function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, disp displayName: displayName, prevProps: prevProps, nextProps: nextProps, - options: options + options: options, + ownerDataMap: ownerDataMap }); var shouldNotify = updateInfo.reason.propsDifferences && !(isPure && updateInfo.reason.propsDifferences.length === 0); @@ -835,13 +917,13 @@ function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, disp return WDYRFunctionalComponent; } -function patchMemoComponent(MemoComponent, displayName, React, options) { +function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap) { var InnerMemoComponent = MemoComponent.type; var isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent); var isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent); var isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent); var WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ? InnerMemoComponent.render : InnerMemoComponent; - var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options); + var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap); try { PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent); @@ -864,11 +946,11 @@ function patchMemoComponent(MemoComponent, displayName, React, options) { return WDYRMemoizedFunctionalComponent; } -function patchForwardRefComponent(ForwardRefComponent, displayName, React, options) { +function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap) { var InnerForwardRefComponent = ForwardRefComponent.render; var isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent); var WrappedFunctionalComponent = isInnerComponentMemoized ? InnerForwardRefComponent.type : InnerForwardRefComponent; - var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options); + var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap); WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent); WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent; @@ -888,8 +970,13 @@ function patchForwardRefComponent(ForwardRefComponent, displayName, React, optio var initialHookValue = Symbol('initial-hook-value'); -function trackHookChanges(hookName, _ref, hookResult, React, options) { +function trackHookChanges(hookName, _ref, hookResult, React, options, ownerDataMap, hooksRef) { var hookPath = _ref.path; + var nextHook = hookPath ? _get$1(hookResult, hookPath) : hookResult; + hooksRef.current.push({ + hookName: hookName, + result: nextHook + }); var ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; var prevHookResultRef = React.useRef(initialHookValue); @@ -920,8 +1007,9 @@ function trackHookChanges(hookName, _ref, hookResult, React, options) { displayName: displayName, hookName: hookName, prevHook: hookPath ? _get$1(prevHookResult, hookPath) : prevHookResult, - nextHook: hookPath ? _get$1(hookResult, hookPath) : hookResult, - options: options + nextHook: nextHook, + options: options, + ownerDataMap: ownerDataMap }); if (notification.reason.hookDifferences) { @@ -932,28 +1020,28 @@ function trackHookChanges(hookName, _ref, hookResult, React, options) { return hookResult; } -function createPatchedComponent(componentsMap, Component, displayName, React, options) { +function createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (isMemoComponent(Component)) { - return patchMemoComponent(Component, displayName, React, options); + return patchMemoComponent(Component, displayName, React, options, ownerDataMap); } if (isForwardRefComponent(Component)) { - return patchForwardRefComponent(Component, displayName, React, options); + return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap); } if (isReactClassComponent(Component)) { - return patchClassComponent(Component, displayName, React, options); + return patchClassComponent(Component, displayName, React, options, ownerDataMap); } - return patchFunctionalOrStrComponent(Component, false, displayName, React, options); + return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap); } -function getPatchedComponent(componentsMap, Component, displayName, React, options) { +function getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (componentsMap.has(Component)) { return componentsMap.get(Component); } - var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options); + var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap); componentsMap.set(Component, WDYRPatchedComponent); return WDYRPatchedComponent; } @@ -973,6 +1061,21 @@ function whyDidYouRender(React, userOptions) { var origCreateElement = React.createElement; var origCreateFactory = React.createFactory; var componentsMap = new WeakMap(); + var ownerDataMap = new WeakMap(); + var hooksRef = { + current: [] + }; // Intercept assignments to ReactCurrentOwner.current and reset hooksRef + + var currentOwner = null; + Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', { + get: function get() { + return currentOwner; + }, + set: function set(value) { + currentOwner = value; + hooksRef.current = []; + } + }); React.createElement = function (componentNameOrComponent) { var isShouldTrack = null; @@ -993,8 +1096,28 @@ function whyDidYouRender(React, userOptions) { if (isShouldTrack) { displayName = componentNameOrComponent && componentNameOrComponent.whyDidYouRender && componentNameOrComponent.whyDidYouRender.customName || getDisplayName(componentNameOrComponent); - WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options); - return origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap); + var element = origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + + if (options.logOwnerReasons) { + var OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; + + if (OwnerInstance != null) { + var Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type; + + var _displayName = getDisplayName(Component); + + ownerDataMap.set(element.props, { + Component: Component, + displayName: _displayName, + props: OwnerInstance.pendingProps, + state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null, + hooks: hooksRef.current + }); + } + } + + return element; } } catch (e) { options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', { @@ -1048,7 +1171,7 @@ function whyDidYouRender(React, userOptions) { } var hookResult = originalHook.call.apply(originalHook, [this].concat(args)); - trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options); + trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef); return hookResult; }; diff --git a/dist/esm/whyDidYouRender.min.js b/dist/esm/whyDidYouRender.min.js index b4104f9..2fe85f8 100644 --- a/dist/esm/whyDidYouRender.min.js +++ b/dist/esm/whyDidYouRender.min.js @@ -1,9 +1,9 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ -import e from"lodash/get";import t from"lodash/isString";import r from"lodash/reduce";import n from"lodash/has";import o from"lodash/keys";import a from"lodash/isFunction";import i from"lodash/isRegExp";import c from"lodash/isDate";import s from"lodash/isPlainObject";import f from"lodash/isArray";import u from"lodash/defaults";function l(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r0?(s.consoleLog(p({},r,t),"".concat(o," of ").concat(a," changes:")),i.forEach((function(e){var t=e.pathString,r=e.diffType,o=e.prevValue,i=e.nextValue;s.consoleGroup("%c".concat("hook"===a?"[hook ".concat(n," result]"):"".concat(a,"."),"%c").concat(t,"%c"),"color:".concat(s.diffNameColor,";"),"color:".concat(s.diffPathColor,";"),"color:default;"),s.consoleLog("".concat(Y[r]," (more info at ").concat(n?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),s.consoleLog(p({},"prev ".concat(t),o),"!==",p({},"next ".concat(t),i)),s.consoleGroupEnd()}))):i&&(s.consoleLog(p({},r,t),"".concat(o," the ").concat(a," object itself changed but its values are all equal."),"props"===a?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),s.consoleLog("prev ".concat(a,":"),c.prev," !== ",c.next,":next ".concat(a)))}function L(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,f=e.nextHook,u=e.reason,l=e.options;if(function(e,t,r){return!W&&(!!r.logOnDifferentValues||(!(!t.whyDidYouRender||!t.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===S}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===S}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===S})))))}(u,t,l)){l.consoleGroup("%c".concat(r),"color: ".concat(l.titleColor,";"));var d="Re-rendered because";u.propsDifferences&&(A({Component:t,displayName:r,prefixMessage:d,diffObjType:"props",differences:u.propsDifferences,values:{prev:o,next:c},options:l}),d="And because"),u.stateDifferences&&A({Component:t,displayName:r,prefixMessage:d,diffObjType:"state",differences:u.stateDifferences,values:{prev:a,next:s},options:l}),u.hookDifferences&&A({Component:t,displayName:r,prefixMessage:d,diffObjType:"hook",differences:u.hookDifferences,values:{prev:i,next:f},hookName:n,options:l}),u.propsDifferences||u.stateDifferences||u.hookDifferences||l.consoleLog(p({},r,t),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),l.consoleGroupEnd()}}function M(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(t){"idle"===t&&(W=!0,setTimeout((function(){W=!1}),e))})),L}var I=function(){};function F(e){return e.displayName||e.name||e.type&&F(e.type)||e.render&&F(e.render)||(t(e)?e:void 0)}var V="undefined"!=typeof Element,G="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103,U=function(e){return e.$$typeof===G};function $(e,t,r,n,o){return r.push({diffType:o,pathString:n,prevValue:e,nextValue:t}),o!==S}function q(e,t,r){try{var u=[];return function e(t,r,u){var l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(t===r)return!0;if(!t||!r)return $(t,r,u,l,S);if(f(t)&&f(r)){var p=t.length;if(p!==r.length)return $(t,r,u,l,S);for(var d=!0,y=p;0!=y--;)e(t[y],r[y],u,"".concat(l,"[").concat(y,"]"))||(d=!1);return $(t,r,u,l,d?j:S)}if(c(t)&&c(r))return t.getTime()===r.getTime()?$(t,r,u,l,E):$(t,r,u,l,S);if(i(t)&&i(r))return t.toString()===r.toString()?$(t,r,u,l,N):$(t,r,u,l,S);if(V&&t instanceof Element&&r instanceof Element)return $(t,r,u,l,S);if(U(t)&&U(r)){if(t.type!==r.type)return $(t,r,u,l,S);var m=e(t.props,r.props,u,"".concat(l,".props"));return $(t,r,u,l,m?x:S)}if(a(t)&&a(r))return t.name===r.name?$(t,r,u,l,P):$(t,r,u,l,S);if(s(t)&&s(r)){var h=o(t),v=h.length;if(v!==o(r).length)return $(t,r,u,l,S);for(var b=v;0!=b--;)if(!n(r,h[b]))return $(t,r,u,l,S);for(var g=!0,k=v;0!=k--;){var D=h[k];e(t[D],r[D],u,"".concat(l,".").concat(D))||(g=!1)}return $(t,r,u,l,g?j:S)}return $(t,r,u,l,S)}(e,t,u,r),u}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var B={};function z(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=n.shallow,a=void 0===o||o;if(e===t)return!1;if(!a)return q(e,t);var i=e||B,c=t||B,s=Object.keys(y({},i,{},c));return r(s,(function(e,t){var r=q(i[t],c[t],t);return r&&(e=[].concat(O(e),O(r))),e}),[])}function J(e,t,r,n,o,a){return{propsDifferences:z(e,n),stateDifferences:z(t,o),hookDifferences:z(r,a,{shallow:!1})}}function K(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,f=e.nextHook;return{Component:t,displayName:r,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:s,nextHook:f,options:e.options,reason:J(o,a,i,c,s,f)}}function Q(e){return e.prototype&&!!e.prototype.isReactComponent}function X(e){return e.$$typeof===T}function Z(e){return e.$$typeof===H}function ee(e){var t=e.Component,r=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,t){return t.exclude&&t.exclude.length>0&&t.exclude.some((function(t){return t.test(e)}))}(r,n)&&(!1!==t.whyDidYouRender&&((!a||!t.whyDidYouRender||!1!==t.whyDidYouRender.trackHooks)&&!!(t.whyDidYouRender||n.trackAllPureComponents&&(t&&t.prototype instanceof o.PureComponent||X(t))||function(e,t){return t.include&&t.include.length>0&&t.include.some((function(t){return t.test(e)}))}(r,n))))}function te(e,t,r,n){var o=function(r){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&h(e,t)}(f,r);var o,a,i,c,s=(o=f,function(){var e,t=m(o);if(v()){var r=m(this).constructor;e=Reflect.construct(t,arguments,r)}else e=t.apply(this,arguments);return g(this,e)});function f(t,r){var n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,f),(n=s.call(this,t,r))._WDYR={renderNumber:0};var o=k(m(f.prototype),"render",b(n))||n.render;return o!==e.prototype.render&&(n.render=function(){return f.prototype.render.apply(b(n)),o()}),n}return a=f,(i=[{key:"render",value:function(){return this._WDYR.renderNumber++,"isStrictMode"in this._WDYR||(this._WDYR.isStrictMode=function(e){for(var t=e&&e._reactInternalFiber;t;){if(1&t.mode)return!0;t=t.return}return!1}(this)),this._WDYR.isStrictMode&&this._WDYR.renderNumber%2==1||(this._WDYR.prevProps&&n.notifier(K({Component:e,displayName:t,prevProps:this._WDYR.prevProps,prevState:this._WDYR.prevState,nextProps:this.props,nextState:this.state,options:n})),this._WDYR.prevProps=this.props,this._WDYR.prevState=this.state),k(m(f.prototype),"render",this)?k(m(f.prototype),"render",this).call(this):null}}])&&l(a.prototype,i),c&&l(a,c),f}(e);try{o.displayName=t}catch(e){}return u(o,e),o}function re(e,t,r,n,o){var a="string"==typeof e?function(e,t){return function(r){return t.createElement(e,r)}}(e,n):e;function i(){var e=arguments[0],i=n.useRef(),c=i.current;if(i.current=e,c){var s=K({Component:a,displayName:r,prevProps:c,nextProps:e,options:o}),f=s.reason.propsDifferences&&!(t&&0===s.reason.propsDifferences.length);f&&o.notifier(s)}return a.apply(void 0,arguments)}try{i.displayName=r}catch(e){}return i.ComponentForHooksTracking=a,u(i,a),i}var ne=Symbol("initial-hook-value");function oe(t,r,n,o,a){var i=r.path,c=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current,s=o.useRef(ne);if(!c)return n;var f=c.type.ComponentForHooksTracking||c.type,u=F(f);if(!ee({Component:f,displayName:u,options:a,React:o,isHookChange:!0}))return n;var l=s.current;if(s.current=n,l!==ne){var p=K({Component:f,displayName:u,hookName:t,prevHook:i?e(l,i):l,nextHook:i?e(n,i):n,options:a});p.reason.hookDifferences&&a.notifier(p)}return n}function ae(e,t,r,n,o){return X(t)?function e(t,r,n,o){var a=t.type,i=Q(a),c=Z(a),s=X(a),f=c?a.render:a,l=i?te(f,r,0,o):s?e(f,r,n,o):re(f,!0,r,n,o);try{l.displayName=F(f)}catch(e){}l.ComponentForHooksTracking=t,u(l,f);var p=n.memo(c?n.forwardRef(l):l,t.compare);try{p.displayName=r}catch(e){}return u(p,t),p}(t,r,n,o):Z(t)?function(e,t,r,n){var o=e.render,a=X(o),i=a?o.type:o,c=re(i,a,t,r,n);c.displayName=F(i),c.ComponentForHooksTracking=i,u(c,i);var s=r.forwardRef(a?r.memo(c,o.compare):c);try{s.displayName=t}catch(e){}return u(s,e),s}(t,r,n,o):Q(t)?te(t,r,0,o):re(t,!1,r,n,o)}function ie(e,t,r,n,o){if(e.has(t))return e.get(t);var a=ae(0,t,r,n,o);return e.set(t,a),a}var ce={useState:{path:"0"},useReducer:{path:"0"},useContext:!0,useMemo:!0};function se(e,t){var r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=console.group,r=console.groupEnd;e.collapseGroups?t=console.groupCollapsed:e.onlyLogs&&(t=console.log,r=I);var n=e.notifier||M("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return y({include:null,exclude:null,notifier:n,onlyLogs:!1,consoleLog:console.log,consoleGroup:t,consoleGroupEnd:r,logOnDifferentValues:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(t),n=e.createElement,o=e.createFactory,a=new WeakMap;if(e.createElement=function(t){for(var o=null,i=null,c=null,s=arguments.length,f=new Array(s>1?s-1:0),u=1;ue.length)&&(t=e.length);for(var r=0,n=new Array(t);r0?(s.consoleLog(l({},r,t),"".concat(o," of ").concat(a," changes:")),i.forEach((function(e){var t=e.pathString,r=e.diffType,o=e.prevValue,i=e.nextValue;s.consoleGroup("%c".concat("hook"===a?"[hook ".concat(n," result]"):"".concat(a,"."),"%c").concat(t,"%c"),"color:".concat(s.diffNameColor,";"),"color:".concat(s.diffPathColor,";"),"color:default;"),s.consoleLog("".concat(Y[r]," (more info at ").concat(n?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),s.consoleLog(l({},"prev ".concat(t),o),"!==",l({},"next ".concat(t),i)),s.consoleGroupEnd()}))):i&&(s.consoleLog(l({},r,t),"".concat(o," the ").concat(a," object itself changed but its values are all equal."),"props"===a?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),s.consoleLog("prev ".concat(a,":"),c.prev," !== ",c.next,":next ".concat(a)))}function A(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,f=e.nextHook,u=e.reason,p=e.options,d=e.ownerDataMap;if(function(e,t,r){return!M&&(!!r.logOnDifferentValues||(!(!t.whyDidYouRender||!t.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===N}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===N}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===N})))))}(u,t,p)){p.consoleGroup("%c".concat(r),"color: ".concat(p.titleColor,";"));var m="Re-rendered because";if(u.propsDifferences&&(W({Component:t,displayName:r,prefixMessage:m,diffObjType:"props",differences:u.propsDifferences,values:{prev:o,next:c},options:p}),m="And because"),u.stateDifferences&&W({Component:t,displayName:r,prefixMessage:m,diffObjType:"state",differences:u.stateDifferences,values:{prev:a,next:s},options:p}),u.hookDifferences&&W({Component:t,displayName:r,prefixMessage:m,diffObjType:"hook",differences:u.hookDifferences,values:{prev:i,next:f},hookName:n,options:p}),u.propsDifferences&&u.ownerDifferences){var y=d.get(o),h=d.get(c);p.consoleGroup("Rendered by ".concat(h.displayName));var v="Re-rendered because";u.ownerDifferences.propsDifferences&&(W({Component:h.Component,displayName:h.displayName,prefixMessage:v,diffObjType:"props",differences:u.ownerDifferences.propsDifferences,values:{prev:y.props,next:h.props},options:p}),v="And because"),u.ownerDifferences.stateDifferences&&W({Component:h.Component,displayName:h.displayName,prefixMessage:v,diffObjType:"state",differences:u.ownerDifferences.stateDifferences,values:{prev:y.state,next:h.state},options:p}),u.ownerDifferences.hookDifferences&&u.ownerDifferences.hookDifferences.forEach((function(e,t){var r=e.hookName,n=e.differences;return W({Component:h.Component,displayName:h.displayName,prefixMessage:v,diffObjType:"hook",differences:n,values:{prev:y.hooks[t].result,next:h.hooks[t].result},hookName:r,options:p})})),p.consoleGroupEnd()}u.propsDifferences||u.stateDifferences||u.hookDifferences||p.consoleLog(l({},r,t),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),p.consoleGroupEnd()}}function L(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(t){"idle"===t&&(M=!0,setTimeout((function(){M=!1}),e))})),A}var I=function(){};function F(e){return e.displayName||e.name||e.type&&F(e.type)||e.render&&F(e.render)||(t(e)?e:void 0)}var U="undefined"!=typeof Element,G="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103,V=function(e){return e.$$typeof===G};function $(e,t,r,n,o){return r.push({diffType:o,pathString:n,prevValue:e,nextValue:t}),o!==N}function B(e,t,r){try{var u=[];return function e(t,r,u){var p=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(t===r)return!0;if(!t||!r)return $(t,r,u,p,N);if(f(t)&&f(r)){var l=t.length;if(l!==r.length)return $(t,r,u,p,N);for(var d=!0,m=l;0!=m--;)e(t[m],r[m],u,"".concat(p,"[").concat(m,"]"))||(d=!1);return $(t,r,u,p,d?E:N)}if(c(t)&&c(r))return t.getTime()===r.getTime()?$(t,r,u,p,S):$(t,r,u,p,N);if(i(t)&&i(r))return t.toString()===r.toString()?$(t,r,u,p,C):$(t,r,u,p,N);if(U&&t instanceof Element&&r instanceof Element)return $(t,r,u,p,N);if(V(t)&&V(r)){if(t.type!==r.type)return $(t,r,u,p,N);var y=e(t.props,r.props,u,"".concat(p,".props"));return $(t,r,u,p,y?j:N)}if(a(t)&&a(r))return t.name===r.name?$(t,r,u,p,x):$(t,r,u,p,N);if(s(t)&&s(r)){var h=o(t),v=h.length;if(v!==o(r).length)return $(t,r,u,p,N);for(var g=v;0!=g--;)if(!n(r,h[g]))return $(t,r,u,p,N);for(var b=!0,D=v;0!=D--;){var k=h[D];e(t[k],r[k],u,"".concat(p,".").concat(k))||(b=!1)}return $(t,r,u,p,b?E:N)}return $(t,r,u,p,N)}(e,t,u,r),u}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var q={};function z(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=n.shallow,a=void 0===o||o;if(e===t)return!1;if(!a)return B(e,t);var i=e||q,c=t||q,s=Object.keys(m({},i,{},c));return r(s,(function(e,t){var r=B(i[t],c[t],t);return r&&(e=[].concat(w(e),w(r))),e}),[])}function J(e,t,r,n,o,a,i){var c=i.get(e),s=i.get(n);return{propsDifferences:z(e,n),stateDifferences:z(t,o),hookDifferences:z(r,a,{shallow:!1}),ownerDifferences:null!=c&&null!=s&&{propsDifferences:z(c.props,s.props),stateDifferences:z(c.state,s.state),hookDifferences:c.hooks.map((function(e,t){return{hookName:e.hookName,differences:z(e.result,s.hooks[t].result,{shallow:!1})}}))}}}function K(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,f=e.nextHook,u=e.options,p=e.ownerDataMap;return{Component:t,displayName:r,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:s,nextHook:f,options:u,ownerDataMap:p,reason:J(o,a,i,c,s,f,p)}}function Q(e){return e.prototype&&!!e.prototype.isReactComponent}function X(e){return e.$$typeof===T}function Z(e){return e.$$typeof===H}function ee(e){var t=e.Component,r=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,t){return t.exclude&&t.exclude.length>0&&t.exclude.some((function(t){return t.test(e)}))}(r,n)&&(!1!==t.whyDidYouRender&&((!a||!t.whyDidYouRender||!1!==t.whyDidYouRender.trackHooks)&&!!(t.whyDidYouRender||n.trackAllPureComponents&&(t&&t.prototype instanceof o.PureComponent||X(t))||function(e,t){return t.include&&t.include.length>0&&t.include.some((function(t){return t.test(e)}))}(r,n))))}function te(e,t,r,n,o){var a=function(r){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&h(e,t)}(u,r);var a,i,c,s,f=(a=u,function(){var e,t=y(a);if(v()){var r=y(this).constructor;e=Reflect.construct(t,arguments,r)}else e=t.apply(this,arguments);return b(this,e)});function u(t,r){var n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,u),(n=f.call(this,t,r))._WDYR={renderNumber:0};var o=D(y(u.prototype),"render",g(n))||n.render;return o!==e.prototype.render&&(n.render=function(){return u.prototype.render.apply(g(n)),o()}),n}return i=u,(c=[{key:"render",value:function(){return this._WDYR.renderNumber++,"isStrictMode"in this._WDYR||(this._WDYR.isStrictMode=function(e){for(var t=e&&e._reactInternalFiber;t;){if(1&t.mode)return!0;t=t.return}return!1}(this)),this._WDYR.isStrictMode&&this._WDYR.renderNumber%2==1||(this._WDYR.prevProps&&n.notifier(K({Component:e,displayName:t,prevProps:this._WDYR.prevProps,prevState:this._WDYR.prevState,nextProps:this.props,nextState:this.state,options:n,ownerDataMap:o})),this._WDYR.prevProps=this.props,this._WDYR.prevState=this.state),D(y(u.prototype),"render",this)?D(y(u.prototype),"render",this).call(this):null}}])&&p(i.prototype,c),s&&p(i,s),u}(e);try{a.displayName=t}catch(e){}return u(a,e),a}function re(e,t,r,n,o,a){var i="string"==typeof e?function(e,t){return function(r){return t.createElement(e,r)}}(e,n):e;function c(){var e=arguments[0],c=n.useRef(),s=c.current;if(c.current=e,s){var f=K({Component:i,displayName:r,prevProps:s,nextProps:e,options:o,ownerDataMap:a}),u=f.reason.propsDifferences&&!(t&&0===f.reason.propsDifferences.length);u&&o.notifier(f)}return i.apply(void 0,arguments)}try{c.displayName=r}catch(e){}return c.ComponentForHooksTracking=i,u(c,i),c}var ne=Symbol("initial-hook-value");function oe(t,r,n,o,a,i,c){var s=r.path,f=s?e(n,s):n;c.current.push({hookName:t,result:f});var u=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current,p=o.useRef(ne);if(!u)return n;var l=u.type.ComponentForHooksTracking||u.type,d=F(l);if(!ee({Component:l,displayName:d,options:a,React:o,isHookChange:!0}))return n;var m=p.current;if(p.current=n,m!==ne){var y=K({Component:l,displayName:d,hookName:t,prevHook:s?e(m,s):m,nextHook:f,options:a,ownerDataMap:i});y.reason.hookDifferences&&a.notifier(y)}return n}function ae(e,t,r,n,o,a){return X(t)?function e(t,r,n,o,a){var i=t.type,c=Q(i),s=Z(i),f=X(i),p=s?i.render:i,l=c?te(p,r,0,o,a):f?e(p,r,n,o,a):re(p,!0,r,n,o,a);try{l.displayName=F(p)}catch(e){}l.ComponentForHooksTracking=t,u(l,p);var d=n.memo(s?n.forwardRef(l):l,t.compare);try{d.displayName=r}catch(e){}return u(d,t),d}(t,r,n,o,a):Z(t)?function(e,t,r,n,o){var a=e.render,i=X(a),c=i?a.type:a,s=re(c,i,t,r,n,o);s.displayName=F(c),s.ComponentForHooksTracking=c,u(s,c);var f=r.forwardRef(i?r.memo(s,a.compare):s);try{f.displayName=t}catch(e){}return u(f,e),f}(t,r,n,o,a):Q(t)?te(t,r,0,o,a):re(t,!1,r,n,o,a)}function ie(e,t,r,n,o,a){if(e.has(t))return e.get(t);var i=ae(0,t,r,n,o,a);return e.set(t,i),i}var ce={useState:{path:"0"},useReducer:{path:"0"},useContext:!0,useMemo:!0};function se(e,t){var r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=console.group,r=console.groupEnd;e.collapseGroups?t=console.groupCollapsed:e.onlyLogs&&(t=console.log,r=I);var n=e.notifier||L("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return m({include:null,exclude:null,notifier:n,onlyLogs:!1,consoleLog:console.log,consoleGroup:t,consoleGroupEnd:r,logOnDifferentValues:!1,logOwnerReasons:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(t),n=e.createElement,o=e.createFactory,a=new WeakMap,i=new WeakMap,c={current:[]},s=null;if(Object.defineProperty(e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,"current",{get:function(){return s},set:function(e){s=e,c.current=[]}}),e.createElement=function(t){for(var o=null,s=null,f=null,u=arguments.length,p=new Array(u>1?u-1:0),l=1;l diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook){\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false})\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options){\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook: hookPath ? get(hookResult, hookPath) : hookResult,\r\n options\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options)\r\n return origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["diffTypes","hasSymbol","Symbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","length","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","type","name","render","_isString","undefined","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","object","$$typeof","trackDiff","a","b","diffsAccumulator","push","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","i","_isDate","getTime","_isRegExp","toString","reactElementPropsAreDeepEqual","props","_isFunction","_isPlainObject","keys","_keys","_has","key","error","message","match","number","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","Object","_reduce","result","deepEqualDiffs","getUpdateReason","getUpdateInfo","isReactClassComponent","prototype","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","test","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","context","_WDYR","renderNumber","origRender","_get","_this","apply","this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","state","e","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","arguments","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hookPath","path","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","has","get","WDYRPatchedComponent","set","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","WeakMap","componentNameOrComponent","isShouldTrack","rest","customName","errorInfo","assign","factory","bind","nativeHooks","entries","map","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","args","call","defineProperty","value","writable","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"whyDidYouRender.min.js.map","sources":["../../src/consts.js","../../src/defaultNotifier.js","../../src/normalizeOptions.js","../../src/getDisplayName.js","../../src/calculateDeepEqualDiffs.js","../../src/findObjectsDifferences.js","../../src/getUpdateInfo.js","../../src/utils.js","../../src/shouldTrack.js","../../src/patches/patchClassComponent.js","../../src/patches/patchFunctionalOrStrComponent.js","../../src/whyDidYouRender.js","../../src/patches/patchMemoComponent.js","../../src/patches/patchForwardRefComponent.js","../../src/index.js"],"sourcesContent":["export const diffTypes = {\r\n 'different': 'different',\r\n 'deepEquals': 'deepEquals',\r\n 'date': 'date',\r\n 'regex': 'regex',\r\n 'reactElement': 'reactElement',\r\n 'function': 'function'\r\n}\r\n\r\n// copied from packages/shared/ReactSymbols.js in https://github.com/facebook/react\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nexport const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3\r\nexport const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0\r\n","import {diffTypes} from './consts'\r\n\r\nconst moreInfoUrl = 'http://bit.ly/wdyr02'\r\nconst moreInfoHooksUrl = 'http://bit.ly/wdyr3'\r\n\r\nconst diffTypesDescriptions = {\r\n [diffTypes.different]: 'different objects.',\r\n [diffTypes.deepEquals]: 'different objects that are equal by value.',\r\n [diffTypes.date]: 'different date objects with the same value.',\r\n [diffTypes.regex]: 'different regular expressions with the same value.',\r\n [diffTypes.reactElement]: 'different React elements with the same displayName.',\r\n [diffTypes.function]: 'different functions with the same name.'\r\n}\r\n\r\nlet inHotReload = false\r\n\r\nfunction shouldLog(reason, Component, options){\r\n if(inHotReload){\r\n return false\r\n }\r\n\r\n if(options.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n if(Component.whyDidYouRender && Component.whyDidYouRender.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n const hasDifferentValues = ((\r\n reason.propsDifferences &&\r\n reason.propsDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options, ownerDataMap} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n\r\n if(reason.propsDifferences && reason.ownerDifferences){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n options.consoleGroup(`Rendered by ${nextOwnerData.displayName}`)\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.ownerDifferences.propsDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.ownerDifferences.propsDifferences,\r\n values: {prev: prevOwnerData.props, next: nextOwnerData.props},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.ownerDifferences.stateDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.ownerDifferences.stateDifferences,\r\n values: {prev: prevOwnerData.state, next: nextOwnerData.state},\r\n options\r\n })\r\n }\r\n\r\n if(reason.ownerDifferences.hookDifferences){\r\n reason.ownerDifferences.hookDifferences.forEach(({hookName, differences}, i) =>\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences,\r\n values: {prev: prevOwnerData.hooks[i].result, next: nextOwnerData.hooks[i].result},\r\n hookName,\r\n options\r\n })\r\n )\r\n }\r\n options.consoleGroupEnd()\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n logOwnerReasons: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false}),\r\n ownerDifferences: prevOwnerData != null && nextOwnerData != null ? {\r\n propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props),\r\n stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state),\r\n hookDifferences: prevOwnerData.hooks.map(({hookName, result}, i) => ({\r\n hookName,\r\n differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, {shallow: false})\r\n }))\r\n } : false\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options, ownerDataMap}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n ownerDataMap,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options,\r\n ownerDataMap\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options, ownerDataMap, hooksRef){\r\n const nextHook = hookPath ? get(hookResult, hookPath) : hookResult\r\n hooksRef.current.push({hookName, result: nextHook})\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n const ownerDataMap = new WeakMap()\r\n const hooksRef = {current: []}\r\n\r\n // Intercept assignments to ReactCurrentOwner.current and reset hooksRef\r\n let currentOwner = null\r\n Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', {\r\n get(){\r\n return currentOwner\r\n },\r\n set(value){\r\n currentOwner = value\r\n hooksRef.current = []\r\n }\r\n })\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap)\r\n\r\n const element = origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n if(options.logOwnerReasons){\r\n const OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n if(OwnerInstance != null){\r\n const Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type\r\n const displayName = getDisplayName(Component)\r\n ownerDataMap.set(element.props, {\r\n Component,\r\n displayName,\r\n props: OwnerInstance.pendingProps,\r\n state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null,\r\n hooks: hooksRef.current\r\n })\r\n }\r\n }\r\n\r\n return element\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["diffTypes","hasSymbol","Symbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","length","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","ownerDataMap","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","ownerDifferences","prevOwnerData","get","nextOwnerData","props","state","i","hooks","result","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","type","name","render","_isString","undefined","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","object","$$typeof","trackDiff","a","b","diffsAccumulator","push","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","_isDate","getTime","_isRegExp","toString","reactElementPropsAreDeepEqual","_isFunction","_isPlainObject","keys","_keys","_has","key","error","message","match","number","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","Object","_reduce","deepEqualDiffs","getUpdateReason","map","getUpdateInfo","isReactClassComponent","prototype","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","test","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","context","_WDYR","renderNumber","origRender","_get","_this","apply","this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","e","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","arguments","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hooksRef","hookPath","path","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","has","WDYRPatchedComponent","set","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","logOwnerReasons","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","WeakMap","currentOwner","defineProperty","value","componentNameOrComponent","isShouldTrack","rest","customName","element","OwnerInstance","pendingProps","stateNode","errorInfo","assign","factory","bind","nativeHooks","entries","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","args","call","writable","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":";;;;;;;83GAAO,MAAMA,EACE,YADFA,EAEG,aAFHA,EAGH,OAHGA,EAIF,QAJEA,EAKK,eALLA,EAMC,WAIRC,EAA8B,mBAAXC,QAAyBA,WACrCC,EAAkBF,EAAYC,WAAW,cAAgB,MACzDE,EAAyBH,EAAYC,WAAW,qBAAuB,MCP9EG,UACHL,EAAsB,0BACtBA,EAAuB,kDACvBA,EAAiB,mDACjBA,EAAkB,0DAClBA,EAAyB,2DACzBA,EAAqB,8CAGpBM,GAAc,EA6BlB,SAASC,SAAeC,IAAAA,UAAWC,IAAAA,YAAaC,IAAAA,SAAUC,IAAAA,cAAeC,IAAAA,YAAaC,IAAAA,YAAaC,IAAAA,OAAQC,IAAAA,QACtGF,GAAeA,EAAYG,OAAS,GACrCD,EAAQE,gBAAaR,EAAcD,aAAeG,iBAAoBC,gBACtEC,EAAYK,SAAQ,gBAAEC,IAAAA,WAAYC,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,UACrDP,EAAQQ,yBACe,SAAhBX,kBAAkCF,wBAAwBE,oBAAmBO,wBACzEJ,EAAQS,mCAA2BT,EAAQU,mBAAkB,kBAExEV,EAAQE,qBACHZ,EAAsBe,6BAA2BV,EAjDnC,sBADL,6BAoDdK,EAAQE,+BAAqBE,GAAeE,GAAY,0BAAiBF,GAAeG,IACxFP,EAAQW,sBAGJb,IACNE,EAAQE,gBACJR,EAAcD,aACbG,kBAAqBC,0DACR,UAAhBA,EACE,4GACA,2HA9DY,yBAiEhBG,EAAQE,0BAAmBL,OAAgBE,EAAOa,KAAM,QAASb,EAAOc,qBAAehB,KAI5E,SAASiB,EAAgBC,OAC/BtB,EAAmIsB,EAAnItB,UAAWC,EAAwHqB,EAAxHrB,YAAaC,EAA2GoB,EAA3GpB,SAAUqB,EAAiGD,EAAjGC,UAAWC,EAAsFF,EAAtFE,UAAWC,EAA2EH,EAA3EG,SAAUC,EAAiEJ,EAAjEI,UAAWC,EAAsDL,EAAtDK,UAAWC,EAA2CN,EAA3CM,SAAUC,EAAiCP,EAAjCO,OAAQtB,EAAyBe,EAAzBf,QAASuB,EAAgBR,EAAhBQ,gBAxD5H,SAAmBD,EAAQ7B,EAAWO,UACjCT,MAIAS,EAAQwB,0BAIR/B,EAAUgC,kBAAmBhC,EAAUgC,gBAAgBD,yBAKxDF,EAAOI,kBACPJ,EAAOI,iBAAiBC,MAAK,SAAAC,UAAQA,EAAKvB,WAAapB,MAEvDqC,EAAOO,kBACPP,EAAOO,iBAAiBF,MAAK,SAAAC,UAAQA,EAAKvB,WAAapB,MAEvDqC,EAAOQ,iBACPR,EAAOQ,gBAAgBH,MAAK,SAAAC,UAAQA,EAAKvB,WAAapB,QAqCpD8C,CAAUT,EAAQ7B,EAAWO,IAIjCA,EAAQQ,yBAAkBd,oBAAyBM,EAAQgC,qBAEvDpC,EAAgB,yBAEjB0B,EAAOI,mBACRlC,EAAc,CACZC,UAAAA,EACAC,YAAAA,EACAE,cAAAA,EACAC,YAAa,QACbC,YAAawB,EAAOI,iBACpB3B,OAAQ,CAACa,KAAMI,EAAWH,KAAMM,GAChCnB,QAAAA,IAEFJ,EAAgB,eAGf0B,EAAOO,kBACRrC,EAAc,CACZC,UAAAA,EACAC,YAAAA,EACAE,cAAAA,EACAC,YAAa,QACbC,YAAawB,EAAOO,iBACpB9B,OAAQ,CAACa,KAAMK,EAAWJ,KAAMO,GAChCpB,QAAAA,IAIDsB,EAAOQ,iBACRtC,EAAc,CACZC,UAAAA,EACAC,YAAAA,EACAE,cAAAA,EACAC,YAAa,OACbC,YAAawB,EAAOQ,gBACpB/B,OAAQ,CAACa,KAAMM,EAAUL,KAAMQ,GAC/B1B,SAAAA,EACAK,QAAAA,IAKDsB,EAAOI,kBAAoBJ,EAAOW,iBAAiB,KAC9CC,EAAgBX,EAAaY,IAAInB,GACjCoB,EAAgBb,EAAaY,IAAIhB,GAEvCnB,EAAQQ,mCAA4B4B,EAAc1C,kBAC9CE,EAAgB,sBAEjB0B,EAAOW,iBAAiBP,mBACzBlC,EAAc,CACZC,UAAW2C,EAAc3C,UACzBC,YAAa0C,EAAc1C,YAC3BE,cAAAA,EACAC,YAAa,QACbC,YAAawB,EAAOW,iBAAiBP,iBACrC3B,OAAQ,CAACa,KAAMsB,EAAcG,MAAOxB,KAAMuB,EAAcC,OACxDrC,QAAAA,IAEFJ,EAAgB,eAGf0B,EAAOW,iBAAiBJ,kBACzBrC,EAAc,CACZC,UAAW2C,EAAc3C,UACzBC,YAAa0C,EAAc1C,YAC3BE,cAAAA,EACAC,YAAa,QACbC,YAAawB,EAAOW,iBAAiBJ,iBACrC9B,OAAQ,CAACa,KAAMsB,EAAcI,MAAOzB,KAAMuB,EAAcE,OACxDtC,QAAAA,IAIDsB,EAAOW,iBAAiBH,iBACzBR,EAAOW,iBAAiBH,gBAAgB3B,SAAQ,WAA0BoC,OAAxB5C,IAAAA,SAAUG,IAAAA,mBAC1DN,EAAc,CACZC,UAAW2C,EAAc3C,UACzBC,YAAa0C,EAAc1C,YAC3BE,cAAAA,EACAC,YAAa,OACbC,YAAAA,EACAC,OAAQ,CAACa,KAAMsB,EAAcM,MAAMD,GAAGE,OAAQ5B,KAAMuB,EAAcI,MAAMD,GAAGE,QAC3E9C,SAAAA,EACAK,QAAAA,OAINA,EAAQW,kBAGNW,EAAOI,kBAAqBJ,EAAOO,kBAAqBP,EAAOQ,iBACjE9B,EAAQE,gBACJR,EAAcD,GAChB,6DACA,yGA5Kc,yBAiLlBO,EAAQW,mBAGH,SAAS+B,EAAsBC,UACjCA,GACqB,oBAAZC,QAA2BA,OAAOC,KAAOD,OAAOC,IAAIC,kBAC5DF,OAAOC,IAAIC,kBAAiB,SAAAC,GACZ,SAAXA,IACDxD,GAAc,EACdyD,YAAW,WACTzD,GAAc,IACboD,OAMJ7B,ECjMT,IAAMmC,EAAU,aCDD,SAASC,EAAeC,UAEnCA,EAAKzD,aACLyD,EAAKC,MACJD,EAAKA,MAAQD,EAAeC,EAAKA,OACjCA,EAAKE,QAAUH,EAAeC,EAAKE,UACnCC,EAASH,GAAQA,OAAOI,GCL7B,IAAMC,EAAoC,oBAAZC,QAIxBC,EAD8B,mBAAXvE,QAAyBA,WACXA,WAAW,iBAAmB,MAC/DwE,EAAiB,SAAAC,UAAUA,EAAOC,WAAaH,GAGrD,SAASI,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYC,UACrD4D,EAAiBC,KAAK,CACpB7D,SAAAA,EACAD,WAAAA,EACAE,UAAWyD,EACXxD,UAAWyD,IAEN3D,IAAapB,EAgGP,SAASkF,EAAwBJ,EAAGC,EAAGI,WAE5CC,EAAQ,UA/FlB,SAASC,EAAyBP,EAAGC,EAAGC,OAAkB7D,yDAAa,MAClE2D,IAAMC,SACA,MAGLD,IAAMC,SACDF,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,MAGpDsF,EAAQR,IAAMQ,EAAQP,GAAG,KACpB/D,EAAS8D,EAAE9D,UACdA,IAAW+D,EAAE/D,cACP6D,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,WAGnDuF,GAAuB,EACnBjC,EAAItC,EAAgB,GAARsC,KACd+B,EAAyBP,EAAExB,GAAIyB,EAAEzB,GAAI0B,YAAqB7D,cAAcmC,UAC1EiC,GAAuB,UAKzBV,EAAUC,EAAGC,EAAGC,EAAkB7D,EAD7BoE,EACyCvF,EACAA,MAG/CwF,EAAOV,IAAMU,EAAOT,UACdD,EAAEW,YAAcV,EAAEU,UACvBZ,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,GAC9C6E,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,MAG/C0F,EAASZ,IAAMY,EAASX,UAClBD,EAAEa,aAAeZ,EAAEY,WACxBd,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,GAC9C6E,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,MAG/CuE,GAAkBO,aAAaN,SAAWO,aAAaP,eACjDK,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,MAGpD0E,EAAeI,IAAMJ,EAAeK,GAAG,IACrCD,EAAEZ,OAASa,EAAEb,YACPW,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,OAI/C4F,EACJP,EAAyBP,EAAE1B,MAAO2B,EAAE3B,MAAO4B,YAAqB7D,oBAGhE0D,EAAUC,EAAGC,EAAGC,EAAkB7D,EAD7ByE,EACyC5F,EACAA,MAIjD6F,EAAWf,IAAMe,EAAWd,UACtBD,EAAEX,OAASY,EAAEZ,KAClBU,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,GAC9C6E,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,MAG/C8F,EAAchB,IAAMgB,EAAcf,GAAG,KAChCgB,EAAOC,EAAQlB,GACf9D,EAAS+E,EAAK/E,UACjBA,IAAWgF,EAAQjB,GAAG/D,cAChB6D,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,OAGnD,IAAIsD,EAAItC,EAAgB,GAARsC,SACd2C,EAAIlB,EAAGgB,EAAKzC,WACPuB,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,WAIrDuF,GAAuB,EACnBjC,EAAItC,EAAgB,GAARsC,KAAW,KACvB4C,EAAMH,EAAKzC,GACb+B,EAAyBP,EAAEoB,GAAMnB,EAAEmB,GAAMlB,YAAqB7D,cAAc+E,MAC9EX,GAAuB,UAKzBV,EAAUC,EAAGC,EAAGC,EAAkB7D,EAD7BoE,EACyCvF,EACAA,UAG3C6E,EAAUC,EAAGC,EAAGC,EAAkB7D,EAAYnB,GAMnDqF,CAAyBP,EAAGC,EAAGK,EAAOD,GAC/BC,EACR,MAAMe,MACDA,EAAMC,SAAWD,EAAMC,QAAQC,MAAM,sBAA2C,aAAlBF,EAAMG,cAOtEC,QAAQC,KAAK,4EAA8EL,EAAMhC,KAAMgC,EAAMC,UACtG,QAEHD,GC/HV,IAAMM,EAAc,GAEL,SAASC,EAAuBC,EAAaC,gEAAgC,OAAlBC,QAAAA,mBACrEF,IAAgBC,SACV,MAGLC,SACK3B,EAAwByB,EAAaC,OAGxCE,EAAUH,GAAeF,EACzBM,EAAUH,GAAeH,EAEzBO,EAAoBC,OAAOlB,UAASe,KAAYC,WAE/CG,EAAOF,GAAmB,SAACxD,EAAQ0C,OAClCiB,EAAiBjC,EAAwB4B,EAAQZ,GAAMa,EAAQb,GAAMA,UACxEiB,IACD3D,cACKA,KACA2D,KAGA3D,IACN,IC1BL,SAAS4D,EAAgBrF,EAAWC,EAAWC,EAAUC,EAAWC,EAAWC,EAAUE,OACjFW,EAAgBX,EAAaY,IAAInB,GACjCoB,EAAgBb,EAAaY,IAAIhB,SAEhC,CACLO,iBAAkBiE,EAAuB3E,EAAWG,GACpDU,iBAAkB8D,EAAuB1E,EAAWG,GACpDU,gBAAiB6D,EAAuBzE,EAAUG,EAAU,CAACyE,SAAS,IACtE7D,iBAAmC,MAAjBC,GAA0C,MAAjBE,GAAwB,CACjEV,iBAAkBiE,EAAuBzD,EAAcG,MAAOD,EAAcC,OAC5ER,iBAAkB8D,EAAuBzD,EAAcI,MAAOF,EAAcE,OAC5ER,gBAAiBI,EAAcM,MAAM8D,KAAI,WAAqB/D,SAAO,CACnE5C,WADyCA,SAEzCG,YAAa6F,IAFsClD,OAEPL,EAAcI,MAAMD,GAAGE,OAAQ,CAACqD,SAAS,UAM9E,SAASS,SAAe9G,IAAAA,UAAWC,IAAAA,YAAaC,IAAAA,SAAUqB,IAAAA,UAAWC,IAAAA,UAAWC,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,UAAWC,IAAAA,SAAUrB,IAAAA,QAASuB,IAAAA,mBACzI,CACL9B,UAAAA,EACAC,YAAAA,EACAC,SAAAA,EACAqB,UAAAA,EACAC,UAAAA,EACAC,SAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAC,SAAAA,EACArB,QAAAA,EACAuB,aAAAA,EACAD,OAAQ+E,EAAgBrF,EAAWC,EAAWC,EAAUC,EAAWC,EAAWC,EAAUE,IChBrF,SAASiF,EAAsB/G,UAC7BA,EAAUgH,aAAehH,EAAUgH,UAAUC,iBAG/C,SAASC,EAAgBlH,UACvBA,EAAUoE,WAAazE,EAGzB,SAASwH,EAAsBnH,UAC7BA,EAAUoE,WAAaxE,ECTjB,SAASwH,UAAapH,IAAAA,UAAWC,IAAAA,YAAaM,IAAAA,QAAS8G,IAAAA,MAAOC,IAAAA,oBAR7E,SAAuBrH,EAAaM,UAEhCA,EAAQgH,SACRhH,EAAQgH,QAAQ/G,OAAS,GACzBD,EAAQgH,QAAQrF,MAAK,SAAAsF,UAASA,EAAMC,KAAKxH,MAKxCyH,CAAczH,EAAaM,MAIG,IAA9BP,EAAUgC,oBAIVsF,IACDtH,EAAUgC,kBAA4D,IAAzChC,EAAUgC,gBAAgB2F,gBAMvD3H,EAAUgC,iBACRzB,EAAQqH,yBACL5H,GAAaA,EAAUgH,qBAAqBK,EAAMQ,eACnDX,EAAgBlH,KAnCxB,SAAuBC,EAAaM,UAEhCA,EAAQuH,SACRvH,EAAQuH,QAAQtH,OAAS,GACzBD,EAAQuH,QAAQ5F,MAAK,SAAAsF,UAASA,EAAMC,KAAKxH,MAkCzC8H,CAAc9H,EAAaM,MCnChB,SAASyH,GAAoBC,EAAgBhI,EAAaoH,EAAO9G,EAASuB,OACjFoG,oaACQtF,EAAOuF,8HACXvF,EAAOuF,IAERC,MAAQ,CACXC,aAAc,OAGVC,EAAaC,iCAAgBC,EAAK5E,cAER0E,IAAeL,EAAejB,UAAUpD,WAEjEA,OAAS,kBACZsE,EAA0BlB,UAAUpD,OAAO6E,YACpCH,kEAKNF,MAAMC,eAEN,iBAAkBK,KAAKN,aACrBA,MAAMO,aFrBZ,SAAsCC,WACvCC,EAAqBD,GAA0BA,EAAuBE,oBACpED,GAAmB,IANR,EAOZA,EAAmBE,YACb,EAETF,EAAqBA,gBAEhB,EEayBG,CAA6BN,OAIpDA,KAAKN,MAAMO,cAAgBD,KAAKN,MAAMC,aAAe,GAAM,IAC3DK,KAAKN,MAAM7G,WACZhB,EAAQ0I,SAASnC,EAAc,CAC7B9G,UAAWiI,EACXhI,YAAAA,EACAsB,UAAWmH,KAAKN,MAAM7G,UACtBC,UAAWkH,KAAKN,MAAM5G,UACtBE,UAAWgH,KAAK9F,MAChBjB,UAAW+G,KAAK7F,MAChBtC,QAAAA,EACAuB,aAAAA,UAICsG,MAAM7G,UAAYmH,KAAK9F,WACvBwF,MAAM5G,UAAYkH,KAAK7F,OAGvB0F,2EAAgC,wCA5CHN,OAiDtCC,EAA0BjI,YAAcA,EACzC,MAAMiJ,aAIEhB,EAA2BD,GAE7BC,ECtDM,SAASiB,GAA8BC,EAA6BC,EAAQpJ,EAAaoH,EAAO9G,EAASuB,OAChHwH,EAA8D,iBAAjCF,EALa,SAACG,EAAkBlC,UAAU,SAAAzE,UAC7EyE,EAAMmC,cAAcD,EAAkB3G,IAKpC6G,CAA0CL,EAA6B/B,GACvE+B,WAEOM,QACDhI,EAAYiI,UAAU,GACtBC,EAAMvC,EAAMwC,SAEZtI,EAAYqI,EAAIE,WACtBF,EAAIE,QAAUpI,EAEXH,EAAU,KACLD,EAAawF,EAAc,CAC/B9G,UAAWsJ,EACXrJ,YAAAA,EACAsB,UAAAA,EACAG,UAAAA,EACAnB,QAAAA,EACAuB,aAAAA,IAGIiI,EACJzI,EAAWO,OAAOI,oBACdoH,GAAwD,IAA9C/H,EAAWO,OAAOI,iBAAiBzB,QAIhDuJ,GACDxJ,EAAQ0I,SAAS3H,UAIdgI,eAAuBK,eAI9BD,EAAwBzJ,YAAcA,EACvC,MAAMiJ,WAIPQ,EAAwBM,0BAA4BV,IAC3CI,EAAyBJ,GAE3BI,ECvCT,IAAMO,GAAmBvK,OAAO,sBAChC,SAASwK,GAAiBhK,IAA4BiK,EAAY9C,EAAO9G,EAASuB,EAAcsI,OAArDC,IAANC,KAC7B1I,EAAWyI,EAAW9B,EAAI4B,EAAYE,GAAYF,EACxDC,EAASN,QAAQrF,KAAK,CAACvE,SAAAA,EAAU8C,OAAQpB,QACnC2I,EAAsClD,EAAMmD,mDAAmDC,kBAAkBX,QACjHY,EAAoBrD,EAAMwC,OAAOI,QAEnCM,SACKJ,MAGHnK,EAAYuK,EAAoC7G,KAAKsG,2BAA6BO,EAAoC7G,KACtHzD,EAAcwD,EAAezD,OAEboH,GAAY,CAACpH,UAAAA,EAAWC,YAAAA,EAAaM,QAAAA,EAAS8G,MAAAA,EAAOC,cAAc,WAEhF6C,MAGHQ,EAAiBD,EAAkBZ,WACzCY,EAAkBZ,QAAUK,EAEzBQ,IAAmBV,GAAiB,KAC/BW,EAAe9D,EAAc,CACjC9G,UAAWA,EACXC,YAAAA,EACAC,SAAAA,EACAuB,SAAU4I,EAAW9B,EAAIoC,EAAgBN,GAAYM,EACrD/I,SAAAA,EACArB,QAAAA,EACAuB,aAAAA,IAGC8I,EAAa/I,OAAOQ,iBACrB9B,EAAQ0I,SAAS2B,UAIdT,EAGT,SAASU,GAAuBC,EAAe9K,EAAWC,EAAaoH,EAAO9G,EAASuB,UAClFoF,EAAgBlH,GChDN,SAAS+K,EAAmBC,EAAe/K,EAAaoH,EAAO9G,EAASuB,OACxEmJ,EAAsBD,EAA5BtH,KAEDwH,EAAsCnE,EAAsBkE,GAC5DE,EAAkChE,EAAsB8D,GACxDG,EAA2ClE,EAAgB+D,GAE3DI,EAA6BF,EACjCF,EAAmBrH,OACnBqH,EAEIK,EAAwBJ,EAC5BlD,GAAoBqD,EAA4BpL,EAAaoH,EAAO9G,EAASuB,GAC5EsJ,EACCL,EAAmBM,EAA4BpL,EAAaoH,EAAO9G,EAASuB,GAC5EqH,GAA8BkC,GAA4B,EAAMpL,EAAaoH,EAAO9G,EAASuB,OAI/FwJ,EAAsBrL,YAAcwD,EAAe4H,GACpD,MAAMnC,IAIPoC,EAAsBtB,0BAA4BgB,IACzCM,EAAuBD,OAE1BE,EAAkClE,EAAMmE,KAC5CL,EAAkC9D,EAAMoE,WAAWH,GAAyBA,EAC5EN,EAAcU,aAIdH,EAAgCtL,YAAcA,EAC/C,MAAMiJ,aAIEqC,EAAiCP,GAEnCO,EDSER,CAAmB/K,EAAWC,EAAaoH,EAAO9G,EAASuB,GAGjEqF,EAAsBnH,GEtDZ,SAAkC2L,EAAqB1L,EAAaoH,EAAO9G,EAASuB,OAClF8J,EAA4BD,EAApC/H,OAEDiI,EAA2B3E,EAAgB0E,GAC3CP,EAA6BQ,EACjCD,EAAyBlI,KAAOkI,EAE5BE,EACJ3C,GAA8BkC,EAA4BQ,EAA0B5L,EAAaoH,EAAO9G,EAASuB,GAGnHgK,EAAgD7L,YAAcwD,EAAe4H,GAC7ES,EAAgD9B,0BAA4BqB,IACnES,EAAiDT,OAEpDU,EAAoC1E,EAAMoE,WAC9CI,EACExE,EAAMmE,KAAKM,EAAiDF,EAAyBF,SACrFI,OAIFC,EAAkC9L,YAAcA,EACjD,MAAMiJ,aAIE6C,EAAmCJ,GAErCI,EF0BEC,CAAyBhM,EAAWC,EAAaoH,EAAO9G,EAASuB,GAGvEiF,EAAsB/G,GAChBgI,GAAoBhI,EAAWC,EAAaoH,EAAO9G,EAASuB,GAG9DqH,GAA8BnJ,GAAW,EAAOC,EAAaoH,EAAO9G,EAASuB,GAGtF,SAASmK,GAAoBnB,EAAe9K,EAAWC,EAAaoH,EAAO9G,EAASuB,MAC/EgJ,EAAcoB,IAAIlM,UACZ8K,EAAcpI,IAAI1C,OAGrBmM,EAAuBtB,GAAuBC,EAAe9K,EAAWC,EAAaoH,EAAO9G,EAASuB,UAE3GgJ,EAAcsB,IAAIpM,EAAWmM,GACtBA,EAGF,IAAME,GAAc,CACzBC,SAAU,CAAChC,KAAM,KACjBiC,WAAY,CAACjC,KAAM,KACnBkC,YAAY,EACZC,SAAS,GAGI,SAASzK,GAAgBqF,EAAOqF,OACvCnM,ETrFO,eAA0BmM,yDAAc,GACjD3L,EAAegF,QAAQ4G,MACvBzL,EAAkB6E,QAAQ6G,SAE3BF,EAAYG,eACb9L,EAAegF,QAAQ+G,eAEjBJ,EAAYK,WAClBhM,EAAegF,QAAQiH,IACvB9L,EAAkBsC,OAGdyF,EAAWyD,EAAYzD,UAC3BhG,EACG,sBAAuByJ,EAAeA,EAAYxJ,kBAAoB,eAKzE4E,QAAS,KACTP,QAAS,KACT0B,SAAAA,EACA8D,UAAU,EACVtM,WAAYsF,QAAQiH,IACpBjM,aAAAA,EACAG,gBAAAA,EACAa,sBAAsB,EACtBkL,iBAAiB,EACjBtF,YAAY,EACZpF,WAAY,OACZvB,cAAe,OACfC,cAAe,MACfiM,gBAAiB,GACjBtF,wBAAwB,GACrB8E,GSmDWS,CAAiBT,GAE3BU,EAAoB/F,EAAMmC,cAC1B6D,EAAoBhG,EAAMiG,cAE5BxC,EAAgB,IAAIyC,QAClBzL,EAAe,IAAIyL,QACnBnD,EAAW,CAACN,QAAS,IAGvB0D,EAAe,QACnB/G,OAAOgH,eAAepG,EAAMmD,mDAAmDC,kBAAmB,UAAW,CAC3G/H,sBACS8K,GAETpB,aAAIsB,GACFF,EAAeE,EACftD,EAASN,QAAU,MAIvBzC,EAAMmC,cAAgB,SAASmE,WACzBC,EAAgB,KAChB3N,EAAc,KACdkM,EAAuB,wBAH+B0B,mCAAAA,2BAMxDD,GAEwC,mBAA7BD,GACPzG,EAAgByG,IAChBxG,EAAsBwG,KAExBvG,GAAY,CAACpH,UAAW2N,EAA0B1N,YAAawD,EAAekK,GAA2BtG,MAAAA,EAAO9G,QAAAA,IAGjG,CACfN,EACE0N,GACAA,EAAyB3L,iBACzB2L,EAAyB3L,gBAAgB8L,YACzCrK,EAAekK,GAGjBxB,EAAuBF,GAAoBnB,EAAe6C,EAA0B1N,EAAaoH,EAAO9G,EAASuB,OAE3GiM,EAAUX,EAAkB3E,MAAMpB,GAAQ8E,UAAyB0B,OACtEtN,EAAQ0M,gBAAgB,KACnBe,EAAgB3G,EAAMmD,mDAAmDC,kBAAkBX,WAC7E,MAAjBkE,EAAsB,KACjBhO,EAAYgO,EAActK,KAAKsG,2BAA6BgE,EAActK,KAC1EzD,EAAcwD,EAAezD,GACnC8B,EAAasK,IAAI2B,EAAQnL,MAAO,CAC9B5C,UAAAA,EACAC,YAAAA,EACA2C,MAAOoL,EAAcC,aACrBpL,MAAkC,MAA3BmL,EAAcE,UAAoBF,EAAcE,UAAUrL,MAAQ,KACzEE,MAAOqH,EAASN,kBAKfiE,GAGX,MAAM7E,GACJ3I,EAAQE,WAAW,8GAA+G,CAChI0N,UAAW,CACTxI,MAAOuD,EACPyE,yBAAAA,EACAE,KAAAA,EACAtN,QAAAA,EACAqN,cAAAA,EACA3N,YAAAA,EACAkM,qBAAAA,YAKCiB,EAAkB3E,MAAMpB,GAAQsG,UAA6BE,KAGtEpH,OAAO2H,OAAO/G,EAAMmC,cAAe4D,GAEnC/F,EAAMiG,cAAgB,SAAA5J,OACd2K,EAAUhH,EAAMmC,cAAc8E,KAAK,KAAM5K,UAC/C2K,EAAQ3K,KAAOA,EACR2K,GAGT5H,OAAO2H,OAAO/G,EAAMiG,cAAeD,GAEhC9M,EAAQoH,WAAW,KACd4G,EAAc9H,OAAO+H,QAAQnC,IAAaxF,KAAI,yBAAE3G,OAAUuO,aACvD,CAACpH,EAAOnH,EAAUuO,kBAItBF,KACAhO,EAAQ2M,kBAGAxM,SAAQ,yBAAEgO,OAAYxO,cAAUuO,aAAqB,KAC1DE,EAAeD,EAAWxO,GAC1B0O,EAAc1O,EAAS,GAAG2O,cAAgB3O,EAAS4O,MAAM,GACzDC,EAAU,sCAAYC,2BAAAA,sBACpB7E,EAAawE,EAAaM,WAAbN,GAAkBjG,aAASsG,WAC9C9E,GAAiBhK,EAAUuO,EAAoBtE,EAAY9C,EAAO9G,EAASuB,EAAcsI,GAClFD,GAET1D,OAAOgH,eAAesB,EAAS,OAAQ,CAACrB,MAAOkB,EAAaM,UAAU,IACtEzI,OAAO2H,OAAOW,EAAS,CAACJ,aAAAA,IACxBD,EAAWxO,GAAY6O,YAI3B1H,EAAM8H,8BAAgC,WACpC1I,OAAO2H,OAAO/G,EAAO,CACnBmC,cAAe4D,EACfE,cAAeD,IAGjBvC,EAAgB,iBAGXrE,OAAOlB,KAAK8G,IAAaxF,KAAI,SAAA3G,SAAY,CAACmH,EAAOnH,SACjDK,EAAQ2M,kBAECxM,SAAQ,yBAAEgO,OAAYxO,OAC/BwO,EAAWxO,GAAUyO,eACtBD,EAAWxO,GAAYwO,EAAWxO,GAAUyO,wBAIzCtH,EAAM8H,+BAGR9H,EGhOTrF,GAAgBX,gBAAkBA"} \ No newline at end of file diff --git a/dist/no-classes-transpile/cjs/whyDidYouRender.js b/dist/no-classes-transpile/cjs/whyDidYouRender.js index 9cd0482..56a402a 100644 --- a/dist/no-classes-transpile/cjs/whyDidYouRender.js +++ b/dist/no-classes-transpile/cjs/whyDidYouRender.js @@ -1,8 +1,8 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ 'use strict'; @@ -223,7 +223,8 @@ function defaultNotifier(updateInfo) { nextState = updateInfo.nextState, nextHook = updateInfo.nextHook, reason = updateInfo.reason, - options = updateInfo.options; + options = updateInfo.options, + ownerDataMap = updateInfo.ownerDataMap; if (!shouldLog(reason, Component, options)) { return; @@ -279,6 +280,66 @@ function defaultNotifier(updateInfo) { }); } + if (reason.propsDifferences && reason.ownerDifferences) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); + options.consoleGroup("Rendered by ".concat(nextOwnerData.displayName)); + var _prefixMessage = 'Re-rendered because'; + + if (reason.ownerDifferences.propsDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'props', + differences: reason.ownerDifferences.propsDifferences, + values: { + prev: prevOwnerData.props, + next: nextOwnerData.props + }, + options: options + }); + _prefixMessage = 'And because'; + } + + if (reason.ownerDifferences.stateDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'state', + differences: reason.ownerDifferences.stateDifferences, + values: { + prev: prevOwnerData.state, + next: nextOwnerData.state + }, + options: options + }); + } + + if (reason.ownerDifferences.hookDifferences) { + reason.ownerDifferences.hookDifferences.forEach(function (_ref3, i) { + var hookName = _ref3.hookName, + differences = _ref3.differences; + return logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'hook', + differences: differences, + values: { + prev: prevOwnerData.hooks[i].result, + next: nextOwnerData.hooks[i].result + }, + hookName: hookName, + options: options + }); + }); + } + + options.consoleGroupEnd(); + } + if (!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences) { options.consoleLog(_defineProperty({}, displayName, Component), 'Re-rendered although props and state objects are the same.', 'This usually means there was a call to this.forceUpdate() inside the component.', "more info at ".concat(moreInfoUrl)); } @@ -326,6 +387,7 @@ function normalizeOptions() { consoleGroup: consoleGroup, consoleGroupEnd: consoleGroupEnd, logOnDifferentValues: false, + logOwnerReasons: false, trackHooks: true, titleColor: '#058', diffNameColor: 'blue', @@ -493,27 +555,44 @@ function findObjectsDifferences(userPrevObj, userNextObj) { }, []); } -function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) { +function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); return { propsDifferences: findObjectsDifferences(prevProps, nextProps), stateDifferences: findObjectsDifferences(prevState, nextState), hookDifferences: findObjectsDifferences(prevHook, nextHook, { shallow: false - }) + }), + ownerDifferences: prevOwnerData != null && nextOwnerData != null ? { + propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props), + stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state), + hookDifferences: prevOwnerData.hooks.map(function (_ref, i) { + var hookName = _ref.hookName, + result = _ref.result; + return { + hookName: hookName, + differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, { + shallow: false + }) + }; + }) + } : false }; } -function getUpdateInfo(_ref) { - var Component = _ref.Component, - displayName = _ref.displayName, - hookName = _ref.hookName, - prevProps = _ref.prevProps, - prevState = _ref.prevState, - prevHook = _ref.prevHook, - nextProps = _ref.nextProps, - nextState = _ref.nextState, - nextHook = _ref.nextHook, - options = _ref.options; +function getUpdateInfo(_ref2) { + var Component = _ref2.Component, + displayName = _ref2.displayName, + hookName = _ref2.hookName, + prevProps = _ref2.prevProps, + prevState = _ref2.prevState, + prevHook = _ref2.prevHook, + nextProps = _ref2.nextProps, + nextState = _ref2.nextState, + nextHook = _ref2.nextHook, + options = _ref2.options, + ownerDataMap = _ref2.ownerDataMap; return { Component: Component, displayName: displayName, @@ -525,7 +604,8 @@ function getUpdateInfo(_ref) { nextState: nextState, nextHook: nextHook, options: options, - reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) + ownerDataMap: ownerDataMap, + reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) }; } @@ -590,7 +670,7 @@ function shouldTrack(_ref) { return !!(Component.whyDidYouRender || options.trackAllPureComponents && (Component && Component.prototype instanceof React.PureComponent || isMemoComponent(Component)) || shouldInclude(displayName, options)); } -function patchClassComponent(ClassComponent, displayName, React, options) { +function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap) { class WDYRPatchedClassComponent extends ClassComponent { constructor(props, context) { var _this; @@ -629,7 +709,8 @@ function patchClassComponent(ClassComponent, displayName, React, options) { prevState: this._WDYR.prevState, nextProps: this.props, nextState: this.state, - options: options + options: options, + ownerDataMap: ownerDataMap })); } @@ -658,7 +739,7 @@ var getFunctionalComponentFromStringComponent = function getFunctionalComponentF }; }; -function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options) { +function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap) { var FunctionalComponent = typeof FunctionalOrStringComponent === 'string' ? getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) : FunctionalOrStringComponent; function WDYRFunctionalComponent() { @@ -673,7 +754,8 @@ function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, disp displayName: displayName, prevProps: prevProps, nextProps: nextProps, - options: options + options: options, + ownerDataMap: ownerDataMap }); var shouldNotify = updateInfo.reason.propsDifferences && !(isPure && updateInfo.reason.propsDifferences.length === 0); @@ -697,13 +779,13 @@ function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, disp return WDYRFunctionalComponent; } -function patchMemoComponent(MemoComponent, displayName, React, options) { +function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap) { var InnerMemoComponent = MemoComponent.type; var isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent); var isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent); var isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent); var WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ? InnerMemoComponent.render : InnerMemoComponent; - var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options); + var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap); try { PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent); @@ -726,11 +808,11 @@ function patchMemoComponent(MemoComponent, displayName, React, options) { return WDYRMemoizedFunctionalComponent; } -function patchForwardRefComponent(ForwardRefComponent, displayName, React, options) { +function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap) { var InnerForwardRefComponent = ForwardRefComponent.render; var isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent); var WrappedFunctionalComponent = isInnerComponentMemoized ? InnerForwardRefComponent.type : InnerForwardRefComponent; - var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options); + var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap); WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent); WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent; @@ -750,8 +832,13 @@ function patchForwardRefComponent(ForwardRefComponent, displayName, React, optio var initialHookValue = Symbol('initial-hook-value'); -function trackHookChanges(hookName, _ref, hookResult, React, options) { +function trackHookChanges(hookName, _ref, hookResult, React, options, ownerDataMap, hooksRef) { var hookPath = _ref.path; + var nextHook = hookPath ? _get(hookResult, hookPath) : hookResult; + hooksRef.current.push({ + hookName: hookName, + result: nextHook + }); var ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; var prevHookResultRef = React.useRef(initialHookValue); @@ -782,8 +869,9 @@ function trackHookChanges(hookName, _ref, hookResult, React, options) { displayName: displayName, hookName: hookName, prevHook: hookPath ? _get(prevHookResult, hookPath) : prevHookResult, - nextHook: hookPath ? _get(hookResult, hookPath) : hookResult, - options: options + nextHook: nextHook, + options: options, + ownerDataMap: ownerDataMap }); if (notification.reason.hookDifferences) { @@ -794,28 +882,28 @@ function trackHookChanges(hookName, _ref, hookResult, React, options) { return hookResult; } -function createPatchedComponent(componentsMap, Component, displayName, React, options) { +function createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (isMemoComponent(Component)) { - return patchMemoComponent(Component, displayName, React, options); + return patchMemoComponent(Component, displayName, React, options, ownerDataMap); } if (isForwardRefComponent(Component)) { - return patchForwardRefComponent(Component, displayName, React, options); + return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap); } if (isReactClassComponent(Component)) { - return patchClassComponent(Component, displayName, React, options); + return patchClassComponent(Component, displayName, React, options, ownerDataMap); } - return patchFunctionalOrStrComponent(Component, false, displayName, React, options); + return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap); } -function getPatchedComponent(componentsMap, Component, displayName, React, options) { +function getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (componentsMap.has(Component)) { return componentsMap.get(Component); } - var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options); + var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap); componentsMap.set(Component, WDYRPatchedComponent); return WDYRPatchedComponent; } @@ -835,6 +923,21 @@ function whyDidYouRender(React, userOptions) { var origCreateElement = React.createElement; var origCreateFactory = React.createFactory; var componentsMap = new WeakMap(); + var ownerDataMap = new WeakMap(); + var hooksRef = { + current: [] + }; // Intercept assignments to ReactCurrentOwner.current and reset hooksRef + + var currentOwner = null; + Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', { + get: function get() { + return currentOwner; + }, + set: function set(value) { + currentOwner = value; + hooksRef.current = []; + } + }); React.createElement = function (componentNameOrComponent) { var isShouldTrack = null; @@ -855,8 +958,28 @@ function whyDidYouRender(React, userOptions) { if (isShouldTrack) { displayName = componentNameOrComponent && componentNameOrComponent.whyDidYouRender && componentNameOrComponent.whyDidYouRender.customName || getDisplayName(componentNameOrComponent); - WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options); - return origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap); + var element = origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + + if (options.logOwnerReasons) { + var OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; + + if (OwnerInstance != null) { + var Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type; + + var _displayName = getDisplayName(Component); + + ownerDataMap.set(element.props, { + Component: Component, + displayName: _displayName, + props: OwnerInstance.pendingProps, + state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null, + hooks: hooksRef.current + }); + } + } + + return element; } } catch (e) { options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', { @@ -910,7 +1033,7 @@ function whyDidYouRender(React, userOptions) { } var hookResult = originalHook.call.apply(originalHook, [this].concat(args)); - trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options); + trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef); return hookResult; }; diff --git a/dist/no-classes-transpile/cjs/whyDidYouRender.min.js b/dist/no-classes-transpile/cjs/whyDidYouRender.min.js index 645171a..a376519 100644 --- a/dist/no-classes-transpile/cjs/whyDidYouRender.min.js +++ b/dist/no-classes-transpile/cjs/whyDidYouRender.min.js @@ -1,9 +1,9 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ -"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var r=e(require("lodash/get")),t=e(require("lodash/isString")),n=e(require("lodash/reduce")),o=e(require("lodash/has")),a=e(require("lodash/keys")),i=e(require("lodash/isFunction")),c=e(require("lodash/isRegExp")),s=e(require("lodash/isDate")),u=e(require("lodash/isPlainObject")),f=e(require("lodash/isArray")),l=e(require("lodash/defaults"));function p(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function d(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function h(e){for(var r=1;re.length)&&(r=e.length);for(var t=0,n=new Array(r);t0?(s.consoleLog(p({},t,r),"".concat(o," of ").concat(a," changes:")),i.forEach((function(e){var r=e.pathString,t=e.diffType,o=e.prevValue,i=e.nextValue;s.consoleGroup("%c".concat("hook"===a?"[hook ".concat(n," result]"):"".concat(a,"."),"%c").concat(r,"%c"),"color:".concat(s.diffNameColor,";"),"color:".concat(s.diffPathColor,";"),"color:default;"),s.consoleLog("".concat(x[t]," (more info at ").concat(n?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),s.consoleLog(p({},"prev ".concat(r),o),"!==",p({},"next ".concat(r),i)),s.consoleGroupEnd()}))):i&&(s.consoleLog(p({},t,r),"".concat(o," the ").concat(a," object itself changed but its values are all equal."),"props"===a?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),s.consoleLog("prev ".concat(a,":"),c.prev," !== ",c.next,":next ".concat(a)))}function P(e){var r=e.Component,t=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,u=e.nextHook,f=e.reason,l=e.options;if(function(e,r,t){return!j&&(!!t.logOnDifferentValues||(!(!r.whyDidYouRender||!r.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===k}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===k}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===k})))))}(f,r,l)){l.consoleGroup("%c".concat(t),"color: ".concat(l.titleColor,";"));var d="Re-rendered because";f.propsDifferences&&(C({Component:r,displayName:t,prefixMessage:d,diffObjType:"props",differences:f.propsDifferences,values:{prev:o,next:c},options:l}),d="And because"),f.stateDifferences&&C({Component:r,displayName:t,prefixMessage:d,diffObjType:"state",differences:f.stateDifferences,values:{prev:a,next:s},options:l}),f.hookDifferences&&C({Component:r,displayName:t,prefixMessage:d,diffObjType:"hook",differences:f.hookDifferences,values:{prev:i,next:u},hookName:n,options:l}),f.propsDifferences||f.stateDifferences||f.hookDifferences||l.consoleLog(p({},t,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),l.consoleGroupEnd()}}function H(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(r){"idle"===r&&(j=!0,setTimeout((function(){j=!1}),e))})),P}var T=function(){};function Y(e){return e.displayName||e.name||e.type&&Y(e.type)||e.render&&Y(e.render)||(t(e)?e:void 0)}var W="undefined"!=typeof Element,A="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103,q=function(e){return e.$$typeof===A};function L(e,r,t,n,o){return t.push({diffType:o,pathString:n,prevValue:e,nextValue:r}),o!==k}function M(e,r,t){try{var n=[];return function e(r,t,n){var l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(r===t)return!0;if(!r||!t)return L(r,t,n,l,k);if(f(r)&&f(t)){var p=r.length;if(p!==t.length)return L(r,t,n,l,k);for(var d=!0,h=p;0!=h--;)e(r[h],t[h],n,"".concat(l,"[").concat(h,"]"))||(d=!1);return L(r,t,n,l,d?D:k)}if(s(r)&&s(t))return r.getTime()===t.getTime()?L(r,t,n,l,R):L(r,t,n,l,k);if(c(r)&&c(t))return r.toString()===t.toString()?L(r,t,n,l,w):L(r,t,n,l,k);if(W&&r instanceof Element&&t instanceof Element)return L(r,t,n,l,k);if(q(r)&&q(t)){if(r.type!==t.type)return L(r,t,n,l,k);var y=e(r.props,t.props,n,"".concat(l,".props"));return L(r,t,n,l,y?O:k)}if(i(r)&&i(t))return r.name===t.name?L(r,t,n,l,S):L(r,t,n,l,k);if(u(r)&&u(t)){var m=a(r),v=m.length;if(v!==a(t).length)return L(r,t,n,l,k);for(var g=v;0!=g--;)if(!o(t,m[g]))return L(r,t,n,l,k);for(var b=!0,N=v;0!=N--;){var E=m[N];e(r[E],t[E],n,"".concat(l,".").concat(E))||(b=!1)}return L(r,t,n,l,b?D:k)}return L(r,t,n,l,k)}(e,r,n,t),n}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var I={};function F(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=t.shallow,a=void 0===o||o;if(e===r)return!1;if(!a)return M(e,r);var i=e||I,c=r||I,s=Object.keys(h({},i,{},c));return n(s,(function(e,r){var t=M(i[r],c[r],r);return t&&(e=[].concat(m(e),m(t))),e}),[])}function V(e,r,t,n,o,a){return{propsDifferences:F(e,n),stateDifferences:F(r,o),hookDifferences:F(t,a,{shallow:!1})}}function G(e){var r=e.Component,t=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,u=e.nextHook;return{Component:r,displayName:t,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:s,nextHook:u,options:e.options,reason:V(o,a,i,c,s,u)}}function U(e){return e.prototype&&!!e.prototype.isReactComponent}function $(e){return e.$$typeof===E}function B(e){return e.$$typeof===_}function z(e){var r=e.Component,t=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,r){return r.exclude&&r.exclude.length>0&&r.exclude.some((function(r){return r.test(e)}))}(t,n)&&(!1!==r.whyDidYouRender&&((!a||!r.whyDidYouRender||!1!==r.whyDidYouRender.trackHooks)&&!!(r.whyDidYouRender||n.trackAllPureComponents&&(r&&r.prototype instanceof o.PureComponent||$(r))||function(e,r){return r.include&&r.include.length>0&&r.include.some((function(r){return r.test(e)}))}(t,n))))}function J(e,r,t,n){class o extends e{constructor(r,t){var n;super(r,t),n=this,this._WDYR={renderNumber:0};var a=super.render||this.render;a!==e.prototype.render&&(this.render=function(){return o.prototype.render.apply(n),a()})}render(){return this._WDYR.renderNumber++,"isStrictMode"in this._WDYR||(this._WDYR.isStrictMode=function(e){for(var r=e&&e._reactInternalFiber;r;){if(1&r.mode)return!0;r=r.return}return!1}(this)),this._WDYR.isStrictMode&&this._WDYR.renderNumber%2==1||(this._WDYR.prevProps&&n.notifier(G({Component:e,displayName:r,prevProps:this._WDYR.prevProps,prevState:this._WDYR.prevState,nextProps:this.props,nextState:this.state,options:n})),this._WDYR.prevProps=this.props,this._WDYR.prevState=this.state),super.render?super.render():null}}try{o.displayName=r}catch(e){}return l(o,e),o}function K(e,r,t,n,o){var a="string"==typeof e?function(e,r){return function(t){return r.createElement(e,t)}}(e,n):e;function i(){var e=arguments[0],i=n.useRef(),c=i.current;if(i.current=e,c){var s=G({Component:a,displayName:t,prevProps:c,nextProps:e,options:o}),u=s.reason.propsDifferences&&!(r&&0===s.reason.propsDifferences.length);u&&o.notifier(s)}return a.apply(void 0,arguments)}try{i.displayName=t}catch(e){}return i.ComponentForHooksTracking=a,l(i,a),i}var Q=Symbol("initial-hook-value");function X(e,t,n,o,a){var i=t.path,c=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current,s=o.useRef(Q);if(!c)return n;var u=c.type.ComponentForHooksTracking||c.type,f=Y(u);if(!z({Component:u,displayName:f,options:a,React:o,isHookChange:!0}))return n;var l=s.current;if(s.current=n,l!==Q){var p=G({Component:u,displayName:f,hookName:e,prevHook:i?r(l,i):l,nextHook:i?r(n,i):n,options:a});p.reason.hookDifferences&&a.notifier(p)}return n}function Z(e,r,t,n,o){return $(r)?function e(r,t,n,o){var a=r.type,i=U(a),c=B(a),s=$(a),u=c?a.render:a,f=i?J(u,t,0,o):s?e(u,t,n,o):K(u,!0,t,n,o);try{f.displayName=Y(u)}catch(e){}f.ComponentForHooksTracking=r,l(f,u);var p=n.memo(c?n.forwardRef(f):f,r.compare);try{p.displayName=t}catch(e){}return l(p,r),p}(r,t,n,o):B(r)?function(e,r,t,n){var o=e.render,a=$(o),i=a?o.type:o,c=K(i,a,r,t,n);c.displayName=Y(i),c.ComponentForHooksTracking=i,l(c,i);var s=t.forwardRef(a?t.memo(c,o.compare):c);try{s.displayName=r}catch(e){}return l(s,e),s}(r,t,n,o):U(r)?J(r,t,0,o):K(r,!1,t,n,o)}function ee(e,r,t,n,o){if(e.has(r))return e.get(r);var a=Z(0,r,t,n,o);return e.set(r,a),a}var re={useState:{path:"0"},useReducer:{path:"0"},useContext:!0,useMemo:!0};function te(e,r){var t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=console.group,t=console.groupEnd;e.collapseGroups?r=console.groupCollapsed:e.onlyLogs&&(r=console.log,t=T);var n=e.notifier||H("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return h({include:null,exclude:null,notifier:n,onlyLogs:!1,consoleLog:console.log,consoleGroup:r,consoleGroupEnd:t,logOnDifferentValues:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(r),n=e.createElement,o=e.createFactory,a=new WeakMap;if(e.createElement=function(r){for(var o=null,i=null,c=null,s=arguments.length,u=new Array(s>1?s-1:0),f=1;fe.length)&&(r=e.length);for(var t=0,n=new Array(r);t0?(c.consoleLog(l({},t,r),"".concat(o," of ").concat(a," changes:")),i.forEach((function(e){var r=e.pathString,t=e.diffType,o=e.prevValue,i=e.nextValue;c.consoleGroup("%c".concat("hook"===a?"[hook ".concat(n," result]"):"".concat(a,"."),"%c").concat(r,"%c"),"color:".concat(c.diffNameColor,";"),"color:".concat(c.diffPathColor,";"),"color:default;"),c.consoleLog("".concat(C[t]," (more info at ").concat(n?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),c.consoleLog(l({},"prev ".concat(r),o),"!==",l({},"next ".concat(r),i)),c.consoleGroupEnd()}))):i&&(c.consoleLog(l({},t,r),"".concat(o," the ").concat(a," object itself changed but its values are all equal."),"props"===a?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),c.consoleLog("prev ".concat(a,":"),s.prev," !== ",s.next,":next ".concat(a)))}function T(e){var r=e.Component,t=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,s=e.nextProps,c=e.nextState,f=e.nextHook,u=e.reason,p=e.options,d=e.ownerDataMap;if(function(e,r,t){return!x&&(!!t.logOnDifferentValues||(!(!r.whyDidYouRender||!r.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===D}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===D}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===D})))))}(u,r,p)){p.consoleGroup("%c".concat(t),"color: ".concat(p.titleColor,";"));var m="Re-rendered because";if(u.propsDifferences&&(j({Component:r,displayName:t,prefixMessage:m,diffObjType:"props",differences:u.propsDifferences,values:{prev:o,next:s},options:p}),m="And because"),u.stateDifferences&&j({Component:r,displayName:t,prefixMessage:m,diffObjType:"state",differences:u.stateDifferences,values:{prev:a,next:c},options:p}),u.hookDifferences&&j({Component:r,displayName:t,prefixMessage:m,diffObjType:"hook",differences:u.hookDifferences,values:{prev:i,next:f},hookName:n,options:p}),u.propsDifferences&&u.ownerDifferences){var h=d.get(o),y=d.get(s);p.consoleGroup("Rendered by ".concat(y.displayName));var v="Re-rendered because";u.ownerDifferences.propsDifferences&&(j({Component:y.Component,displayName:y.displayName,prefixMessage:v,diffObjType:"props",differences:u.ownerDifferences.propsDifferences,values:{prev:h.props,next:y.props},options:p}),v="And because"),u.ownerDifferences.stateDifferences&&j({Component:y.Component,displayName:y.displayName,prefixMessage:v,diffObjType:"state",differences:u.ownerDifferences.stateDifferences,values:{prev:h.state,next:y.state},options:p}),u.ownerDifferences.hookDifferences&&u.ownerDifferences.hookDifferences.forEach((function(e,r){var t=e.hookName,n=e.differences;return j({Component:y.Component,displayName:y.displayName,prefixMessage:v,diffObjType:"hook",differences:n,values:{prev:h.hooks[r].result,next:y.hooks[r].result},hookName:t,options:p})})),p.consoleGroupEnd()}u.propsDifferences||u.stateDifferences||u.hookDifferences||p.consoleLog(l({},t,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),p.consoleGroupEnd()}}function P(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(r){"idle"===r&&(x=!0,setTimeout((function(){x=!1}),e))})),T}var H=function(){};function Y(e){return e.displayName||e.name||e.type&&Y(e.type)||e.render&&Y(e.render)||(t(e)?e:void 0)}var M="undefined"!=typeof Element,W="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103,A=function(e){return e.$$typeof===W};function L(e,r,t,n,o){return t.push({diffType:o,pathString:n,prevValue:e,nextValue:r}),o!==D}function I(e,r,t){try{var n=[];return function e(r,t,n){var p=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(r===t)return!0;if(!r||!t)return L(r,t,n,p,D);if(u(r)&&u(t)){var l=r.length;if(l!==t.length)return L(r,t,n,p,D);for(var d=!0,m=l;0!=m--;)e(r[m],t[m],n,"".concat(p,"[").concat(m,"]"))||(d=!1);return L(r,t,n,p,d?k:D)}if(c(r)&&c(t))return r.getTime()===t.getTime()?L(r,t,n,p,w):L(r,t,n,p,D);if(s(r)&&s(t))return r.toString()===t.toString()?L(r,t,n,p,R):L(r,t,n,p,D);if(M&&r instanceof Element&&t instanceof Element)return L(r,t,n,p,D);if(A(r)&&A(t)){if(r.type!==t.type)return L(r,t,n,p,D);var h=e(r.props,t.props,n,"".concat(p,".props"));return L(r,t,n,p,h?N:D)}if(i(r)&&i(t))return r.name===t.name?L(r,t,n,p,O):L(r,t,n,p,D);if(f(r)&&f(t)){var y=a(r),v=y.length;if(v!==a(t).length)return L(r,t,n,p,D);for(var g=v;0!=g--;)if(!o(t,y[g]))return L(r,t,n,p,D);for(var b=!0,_=v;0!=_--;){var E=y[_];e(r[E],t[E],n,"".concat(p,".").concat(E))||(b=!1)}return L(r,t,n,p,b?k:D)}return L(r,t,n,p,D)}(e,r,n,t),n}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var q={};function F(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=t.shallow,a=void 0===o||o;if(e===r)return!1;if(!a)return I(e,r);var i=e||q,s=r||q,c=Object.keys(m({},i,{},s));return n(c,(function(e,r){var t=I(i[r],s[r],r);return t&&(e=[].concat(y(e),y(t))),e}),[])}function U(e,r,t,n,o,a,i){var s=i.get(e),c=i.get(n);return{propsDifferences:F(e,n),stateDifferences:F(r,o),hookDifferences:F(t,a,{shallow:!1}),ownerDifferences:null!=s&&null!=c&&{propsDifferences:F(s.props,c.props),stateDifferences:F(s.state,c.state),hookDifferences:s.hooks.map((function(e,r){return{hookName:e.hookName,differences:F(e.result,c.hooks[r].result,{shallow:!1})}}))}}}function G(e){var r=e.Component,t=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,s=e.nextProps,c=e.nextState,f=e.nextHook,u=e.options,p=e.ownerDataMap;return{Component:r,displayName:t,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:s,nextState:c,nextHook:f,options:u,ownerDataMap:p,reason:U(o,a,i,s,c,f,p)}}function V(e){return e.prototype&&!!e.prototype.isReactComponent}function $(e){return e.$$typeof===E}function B(e){return e.$$typeof===S}function z(e){var r=e.Component,t=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,r){return r.exclude&&r.exclude.length>0&&r.exclude.some((function(r){return r.test(e)}))}(t,n)&&(!1!==r.whyDidYouRender&&((!a||!r.whyDidYouRender||!1!==r.whyDidYouRender.trackHooks)&&!!(r.whyDidYouRender||n.trackAllPureComponents&&(r&&r.prototype instanceof o.PureComponent||$(r))||function(e,r){return r.include&&r.include.length>0&&r.include.some((function(r){return r.test(e)}))}(t,n))))}function J(e,r,t,n,o){class a extends e{constructor(r,t){var n;super(r,t),n=this,this._WDYR={renderNumber:0};var o=super.render||this.render;o!==e.prototype.render&&(this.render=function(){return a.prototype.render.apply(n),o()})}render(){return this._WDYR.renderNumber++,"isStrictMode"in this._WDYR||(this._WDYR.isStrictMode=function(e){for(var r=e&&e._reactInternalFiber;r;){if(1&r.mode)return!0;r=r.return}return!1}(this)),this._WDYR.isStrictMode&&this._WDYR.renderNumber%2==1||(this._WDYR.prevProps&&n.notifier(G({Component:e,displayName:r,prevProps:this._WDYR.prevProps,prevState:this._WDYR.prevState,nextProps:this.props,nextState:this.state,options:n,ownerDataMap:o})),this._WDYR.prevProps=this.props,this._WDYR.prevState=this.state),super.render?super.render():null}}try{a.displayName=r}catch(e){}return p(a,e),a}function K(e,r,t,n,o,a){var i="string"==typeof e?function(e,r){return function(t){return r.createElement(e,t)}}(e,n):e;function s(){var e=arguments[0],s=n.useRef(),c=s.current;if(s.current=e,c){var f=G({Component:i,displayName:t,prevProps:c,nextProps:e,options:o,ownerDataMap:a}),u=f.reason.propsDifferences&&!(r&&0===f.reason.propsDifferences.length);u&&o.notifier(f)}return i.apply(void 0,arguments)}try{s.displayName=t}catch(e){}return s.ComponentForHooksTracking=i,p(s,i),s}var Q=Symbol("initial-hook-value");function X(e,t,n,o,a,i,s){var c=t.path,f=c?r(n,c):n;s.current.push({hookName:e,result:f});var u=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current,p=o.useRef(Q);if(!u)return n;var l=u.type.ComponentForHooksTracking||u.type,d=Y(l);if(!z({Component:l,displayName:d,options:a,React:o,isHookChange:!0}))return n;var m=p.current;if(p.current=n,m!==Q){var h=G({Component:l,displayName:d,hookName:e,prevHook:c?r(m,c):m,nextHook:f,options:a,ownerDataMap:i});h.reason.hookDifferences&&a.notifier(h)}return n}function Z(e,r,t,n,o,a){return $(r)?function e(r,t,n,o,a){var i=r.type,s=V(i),c=B(i),f=$(i),u=c?i.render:i,l=s?J(u,t,0,o,a):f?e(u,t,n,o,a):K(u,!0,t,n,o,a);try{l.displayName=Y(u)}catch(e){}l.ComponentForHooksTracking=r,p(l,u);var d=n.memo(c?n.forwardRef(l):l,r.compare);try{d.displayName=t}catch(e){}return p(d,r),d}(r,t,n,o,a):B(r)?function(e,r,t,n,o){var a=e.render,i=$(a),s=i?a.type:a,c=K(s,i,r,t,n,o);c.displayName=Y(s),c.ComponentForHooksTracking=s,p(c,s);var f=t.forwardRef(i?t.memo(c,a.compare):c);try{f.displayName=r}catch(e){}return p(f,e),f}(r,t,n,o,a):V(r)?J(r,t,0,o,a):K(r,!1,t,n,o,a)}function ee(e,r,t,n,o,a){if(e.has(r))return e.get(r);var i=Z(0,r,t,n,o,a);return e.set(r,i),i}var re={useState:{path:"0"},useReducer:{path:"0"},useContext:!0,useMemo:!0};function te(e,r){var t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=console.group,t=console.groupEnd;e.collapseGroups?r=console.groupCollapsed:e.onlyLogs&&(r=console.log,t=H);var n=e.notifier||P("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return m({include:null,exclude:null,notifier:n,onlyLogs:!1,consoleLog:console.log,consoleGroup:r,consoleGroupEnd:t,logOnDifferentValues:!1,logOwnerReasons:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(r),n=e.createElement,o=e.createFactory,a=new WeakMap,i=new WeakMap,s={current:[]},c=null;if(Object.defineProperty(e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,"current",{get:function(){return c},set:function(e){c=e,s.current=[]}}),e.createElement=function(r){for(var o=null,c=null,f=null,u=arguments.length,p=new Array(u>1?u-1:0),l=1;l diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook){\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false})\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options){\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook: hookPath ? get(hookResult, hookPath) : hookResult,\r\n options\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options)\r\n return origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["diffTypes","hasSymbol","Symbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","length","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","type","name","render","_isString","undefined","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","object","$$typeof","trackDiff","a","b","diffsAccumulator","push","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","i","_isDate","getTime","_isRegExp","toString","reactElementPropsAreDeepEqual","props","_isFunction","_isPlainObject","keys","_keys","_has","key","error","message","match","number","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","Object","_reduce","result","deepEqualDiffs","getUpdateReason","getUpdateInfo","isReactClassComponent","prototype","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","test","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","constructor","context","_WDYR","renderNumber","origRender","super","this","apply","_this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","state","e","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","arguments","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hookPath","path","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","_get","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","has","get","WDYRPatchedComponent","set","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","WeakMap","componentNameOrComponent","isShouldTrack","rest","customName","errorInfo","assign","factory","bind","nativeHooks","entries","map","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","args","call","defineProperty","value","writable","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"whyDidYouRender.min.js.map","sources":["../../src/consts.js","../../src/defaultNotifier.js","../../src/normalizeOptions.js","../../src/getDisplayName.js","../../src/calculateDeepEqualDiffs.js","../../src/findObjectsDifferences.js","../../src/getUpdateInfo.js","../../src/utils.js","../../src/shouldTrack.js","../../src/patches/patchClassComponent.js","../../src/patches/patchFunctionalOrStrComponent.js","../../src/whyDidYouRender.js","../../src/patches/patchMemoComponent.js","../../src/patches/patchForwardRefComponent.js","../../src/index.js"],"sourcesContent":["export const diffTypes = {\r\n 'different': 'different',\r\n 'deepEquals': 'deepEquals',\r\n 'date': 'date',\r\n 'regex': 'regex',\r\n 'reactElement': 'reactElement',\r\n 'function': 'function'\r\n}\r\n\r\n// copied from packages/shared/ReactSymbols.js in https://github.com/facebook/react\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nexport const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3\r\nexport const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0\r\n","import {diffTypes} from './consts'\r\n\r\nconst moreInfoUrl = 'http://bit.ly/wdyr02'\r\nconst moreInfoHooksUrl = 'http://bit.ly/wdyr3'\r\n\r\nconst diffTypesDescriptions = {\r\n [diffTypes.different]: 'different objects.',\r\n [diffTypes.deepEquals]: 'different objects that are equal by value.',\r\n [diffTypes.date]: 'different date objects with the same value.',\r\n [diffTypes.regex]: 'different regular expressions with the same value.',\r\n [diffTypes.reactElement]: 'different React elements with the same displayName.',\r\n [diffTypes.function]: 'different functions with the same name.'\r\n}\r\n\r\nlet inHotReload = false\r\n\r\nfunction shouldLog(reason, Component, options){\r\n if(inHotReload){\r\n return false\r\n }\r\n\r\n if(options.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n if(Component.whyDidYouRender && Component.whyDidYouRender.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n const hasDifferentValues = ((\r\n reason.propsDifferences &&\r\n reason.propsDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options, ownerDataMap} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n\r\n if(reason.propsDifferences && reason.ownerDifferences){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n options.consoleGroup(`Rendered by ${nextOwnerData.displayName}`)\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.ownerDifferences.propsDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.ownerDifferences.propsDifferences,\r\n values: {prev: prevOwnerData.props, next: nextOwnerData.props},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.ownerDifferences.stateDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.ownerDifferences.stateDifferences,\r\n values: {prev: prevOwnerData.state, next: nextOwnerData.state},\r\n options\r\n })\r\n }\r\n\r\n if(reason.ownerDifferences.hookDifferences){\r\n reason.ownerDifferences.hookDifferences.forEach(({hookName, differences}, i) =>\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences,\r\n values: {prev: prevOwnerData.hooks[i].result, next: nextOwnerData.hooks[i].result},\r\n hookName,\r\n options\r\n })\r\n )\r\n }\r\n options.consoleGroupEnd()\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n logOwnerReasons: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false}),\r\n ownerDifferences: prevOwnerData != null && nextOwnerData != null ? {\r\n propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props),\r\n stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state),\r\n hookDifferences: prevOwnerData.hooks.map(({hookName, result}, i) => ({\r\n hookName,\r\n differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, {shallow: false})\r\n }))\r\n } : false\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options, ownerDataMap}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n ownerDataMap,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options,\r\n ownerDataMap\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options, ownerDataMap, hooksRef){\r\n const nextHook = hookPath ? get(hookResult, hookPath) : hookResult\r\n hooksRef.current.push({hookName, result: nextHook})\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n const ownerDataMap = new WeakMap()\r\n const hooksRef = {current: []}\r\n\r\n // Intercept assignments to ReactCurrentOwner.current and reset hooksRef\r\n let currentOwner = null\r\n Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', {\r\n get(){\r\n return currentOwner\r\n },\r\n set(value){\r\n currentOwner = value\r\n hooksRef.current = []\r\n }\r\n })\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap)\r\n\r\n const element = origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n if(options.logOwnerReasons){\r\n const OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n if(OwnerInstance != null){\r\n const Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type\r\n const displayName = getDisplayName(Component)\r\n ownerDataMap.set(element.props, {\r\n Component,\r\n displayName,\r\n props: OwnerInstance.pendingProps,\r\n state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null,\r\n hooks: hooksRef.current\r\n })\r\n }\r\n }\r\n\r\n return element\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["diffTypes","hasSymbol","Symbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","length","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","ownerDataMap","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","ownerDifferences","prevOwnerData","get","nextOwnerData","props","state","i","hooks","result","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","type","name","render","_isString","undefined","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","object","$$typeof","trackDiff","a","b","diffsAccumulator","push","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","_isDate","getTime","_isRegExp","toString","reactElementPropsAreDeepEqual","_isFunction","_isPlainObject","keys","_keys","_has","key","error","message","match","number","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","Object","_reduce","deepEqualDiffs","getUpdateReason","map","getUpdateInfo","isReactClassComponent","prototype","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","test","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","constructor","context","_WDYR","renderNumber","origRender","super","this","apply","_this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","e","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","arguments","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hooksRef","hookPath","path","_get","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","has","WDYRPatchedComponent","set","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","logOwnerReasons","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","WeakMap","currentOwner","defineProperty","value","componentNameOrComponent","isShouldTrack","rest","customName","element","OwnerInstance","pendingProps","stateNode","errorInfo","assign","factory","bind","nativeHooks","entries","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","args","call","writable","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file diff --git a/dist/no-classes-transpile/esm/whyDidYouRender.js b/dist/no-classes-transpile/esm/whyDidYouRender.js index c625f65..1af6357 100644 --- a/dist/no-classes-transpile/esm/whyDidYouRender.js +++ b/dist/no-classes-transpile/esm/whyDidYouRender.js @@ -1,8 +1,8 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ import _get from 'lodash/get'; @@ -219,7 +219,8 @@ function defaultNotifier(updateInfo) { nextState = updateInfo.nextState, nextHook = updateInfo.nextHook, reason = updateInfo.reason, - options = updateInfo.options; + options = updateInfo.options, + ownerDataMap = updateInfo.ownerDataMap; if (!shouldLog(reason, Component, options)) { return; @@ -275,6 +276,66 @@ function defaultNotifier(updateInfo) { }); } + if (reason.propsDifferences && reason.ownerDifferences) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); + options.consoleGroup("Rendered by ".concat(nextOwnerData.displayName)); + var _prefixMessage = 'Re-rendered because'; + + if (reason.ownerDifferences.propsDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'props', + differences: reason.ownerDifferences.propsDifferences, + values: { + prev: prevOwnerData.props, + next: nextOwnerData.props + }, + options: options + }); + _prefixMessage = 'And because'; + } + + if (reason.ownerDifferences.stateDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'state', + differences: reason.ownerDifferences.stateDifferences, + values: { + prev: prevOwnerData.state, + next: nextOwnerData.state + }, + options: options + }); + } + + if (reason.ownerDifferences.hookDifferences) { + reason.ownerDifferences.hookDifferences.forEach(function (_ref3, i) { + var hookName = _ref3.hookName, + differences = _ref3.differences; + return logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'hook', + differences: differences, + values: { + prev: prevOwnerData.hooks[i].result, + next: nextOwnerData.hooks[i].result + }, + hookName: hookName, + options: options + }); + }); + } + + options.consoleGroupEnd(); + } + if (!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences) { options.consoleLog(_defineProperty({}, displayName, Component), 'Re-rendered although props and state objects are the same.', 'This usually means there was a call to this.forceUpdate() inside the component.', "more info at ".concat(moreInfoUrl)); } @@ -322,6 +383,7 @@ function normalizeOptions() { consoleGroup: consoleGroup, consoleGroupEnd: consoleGroupEnd, logOnDifferentValues: false, + logOwnerReasons: false, trackHooks: true, titleColor: '#058', diffNameColor: 'blue', @@ -489,27 +551,44 @@ function findObjectsDifferences(userPrevObj, userNextObj) { }, []); } -function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) { +function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); return { propsDifferences: findObjectsDifferences(prevProps, nextProps), stateDifferences: findObjectsDifferences(prevState, nextState), hookDifferences: findObjectsDifferences(prevHook, nextHook, { shallow: false - }) + }), + ownerDifferences: prevOwnerData != null && nextOwnerData != null ? { + propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props), + stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state), + hookDifferences: prevOwnerData.hooks.map(function (_ref, i) { + var hookName = _ref.hookName, + result = _ref.result; + return { + hookName: hookName, + differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, { + shallow: false + }) + }; + }) + } : false }; } -function getUpdateInfo(_ref) { - var Component = _ref.Component, - displayName = _ref.displayName, - hookName = _ref.hookName, - prevProps = _ref.prevProps, - prevState = _ref.prevState, - prevHook = _ref.prevHook, - nextProps = _ref.nextProps, - nextState = _ref.nextState, - nextHook = _ref.nextHook, - options = _ref.options; +function getUpdateInfo(_ref2) { + var Component = _ref2.Component, + displayName = _ref2.displayName, + hookName = _ref2.hookName, + prevProps = _ref2.prevProps, + prevState = _ref2.prevState, + prevHook = _ref2.prevHook, + nextProps = _ref2.nextProps, + nextState = _ref2.nextState, + nextHook = _ref2.nextHook, + options = _ref2.options, + ownerDataMap = _ref2.ownerDataMap; return { Component: Component, displayName: displayName, @@ -521,7 +600,8 @@ function getUpdateInfo(_ref) { nextState: nextState, nextHook: nextHook, options: options, - reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) + ownerDataMap: ownerDataMap, + reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) }; } @@ -586,7 +666,7 @@ function shouldTrack(_ref) { return !!(Component.whyDidYouRender || options.trackAllPureComponents && (Component && Component.prototype instanceof React.PureComponent || isMemoComponent(Component)) || shouldInclude(displayName, options)); } -function patchClassComponent(ClassComponent, displayName, React, options) { +function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap) { class WDYRPatchedClassComponent extends ClassComponent { constructor(props, context) { var _this; @@ -625,7 +705,8 @@ function patchClassComponent(ClassComponent, displayName, React, options) { prevState: this._WDYR.prevState, nextProps: this.props, nextState: this.state, - options: options + options: options, + ownerDataMap: ownerDataMap })); } @@ -654,7 +735,7 @@ var getFunctionalComponentFromStringComponent = function getFunctionalComponentF }; }; -function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options) { +function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap) { var FunctionalComponent = typeof FunctionalOrStringComponent === 'string' ? getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) : FunctionalOrStringComponent; function WDYRFunctionalComponent() { @@ -669,7 +750,8 @@ function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, disp displayName: displayName, prevProps: prevProps, nextProps: nextProps, - options: options + options: options, + ownerDataMap: ownerDataMap }); var shouldNotify = updateInfo.reason.propsDifferences && !(isPure && updateInfo.reason.propsDifferences.length === 0); @@ -693,13 +775,13 @@ function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, disp return WDYRFunctionalComponent; } -function patchMemoComponent(MemoComponent, displayName, React, options) { +function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap) { var InnerMemoComponent = MemoComponent.type; var isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent); var isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent); var isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent); var WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ? InnerMemoComponent.render : InnerMemoComponent; - var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options); + var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap); try { PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent); @@ -722,11 +804,11 @@ function patchMemoComponent(MemoComponent, displayName, React, options) { return WDYRMemoizedFunctionalComponent; } -function patchForwardRefComponent(ForwardRefComponent, displayName, React, options) { +function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap) { var InnerForwardRefComponent = ForwardRefComponent.render; var isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent); var WrappedFunctionalComponent = isInnerComponentMemoized ? InnerForwardRefComponent.type : InnerForwardRefComponent; - var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options); + var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap); WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent); WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent; @@ -746,8 +828,13 @@ function patchForwardRefComponent(ForwardRefComponent, displayName, React, optio var initialHookValue = Symbol('initial-hook-value'); -function trackHookChanges(hookName, _ref, hookResult, React, options) { +function trackHookChanges(hookName, _ref, hookResult, React, options, ownerDataMap, hooksRef) { var hookPath = _ref.path; + var nextHook = hookPath ? _get(hookResult, hookPath) : hookResult; + hooksRef.current.push({ + hookName: hookName, + result: nextHook + }); var ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; var prevHookResultRef = React.useRef(initialHookValue); @@ -778,8 +865,9 @@ function trackHookChanges(hookName, _ref, hookResult, React, options) { displayName: displayName, hookName: hookName, prevHook: hookPath ? _get(prevHookResult, hookPath) : prevHookResult, - nextHook: hookPath ? _get(hookResult, hookPath) : hookResult, - options: options + nextHook: nextHook, + options: options, + ownerDataMap: ownerDataMap }); if (notification.reason.hookDifferences) { @@ -790,28 +878,28 @@ function trackHookChanges(hookName, _ref, hookResult, React, options) { return hookResult; } -function createPatchedComponent(componentsMap, Component, displayName, React, options) { +function createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (isMemoComponent(Component)) { - return patchMemoComponent(Component, displayName, React, options); + return patchMemoComponent(Component, displayName, React, options, ownerDataMap); } if (isForwardRefComponent(Component)) { - return patchForwardRefComponent(Component, displayName, React, options); + return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap); } if (isReactClassComponent(Component)) { - return patchClassComponent(Component, displayName, React, options); + return patchClassComponent(Component, displayName, React, options, ownerDataMap); } - return patchFunctionalOrStrComponent(Component, false, displayName, React, options); + return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap); } -function getPatchedComponent(componentsMap, Component, displayName, React, options) { +function getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (componentsMap.has(Component)) { return componentsMap.get(Component); } - var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options); + var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap); componentsMap.set(Component, WDYRPatchedComponent); return WDYRPatchedComponent; } @@ -831,6 +919,21 @@ function whyDidYouRender(React, userOptions) { var origCreateElement = React.createElement; var origCreateFactory = React.createFactory; var componentsMap = new WeakMap(); + var ownerDataMap = new WeakMap(); + var hooksRef = { + current: [] + }; // Intercept assignments to ReactCurrentOwner.current and reset hooksRef + + var currentOwner = null; + Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', { + get: function get() { + return currentOwner; + }, + set: function set(value) { + currentOwner = value; + hooksRef.current = []; + } + }); React.createElement = function (componentNameOrComponent) { var isShouldTrack = null; @@ -851,8 +954,28 @@ function whyDidYouRender(React, userOptions) { if (isShouldTrack) { displayName = componentNameOrComponent && componentNameOrComponent.whyDidYouRender && componentNameOrComponent.whyDidYouRender.customName || getDisplayName(componentNameOrComponent); - WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options); - return origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap); + var element = origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + + if (options.logOwnerReasons) { + var OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; + + if (OwnerInstance != null) { + var Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type; + + var _displayName = getDisplayName(Component); + + ownerDataMap.set(element.props, { + Component: Component, + displayName: _displayName, + props: OwnerInstance.pendingProps, + state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null, + hooks: hooksRef.current + }); + } + } + + return element; } } catch (e) { options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', { @@ -906,7 +1029,7 @@ function whyDidYouRender(React, userOptions) { } var hookResult = originalHook.call.apply(originalHook, [this].concat(args)); - trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options); + trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef); return hookResult; }; diff --git a/dist/no-classes-transpile/esm/whyDidYouRender.min.js b/dist/no-classes-transpile/esm/whyDidYouRender.min.js index f53bcdb..8335674 100644 --- a/dist/no-classes-transpile/esm/whyDidYouRender.min.js +++ b/dist/no-classes-transpile/esm/whyDidYouRender.min.js @@ -1,9 +1,9 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ -import e from"lodash/get";import r from"lodash/isString";import t from"lodash/reduce";import o from"lodash/has";import n from"lodash/keys";import a from"lodash/isFunction";import i from"lodash/isRegExp";import c from"lodash/isDate";import s from"lodash/isPlainObject";import f from"lodash/isArray";import u from"lodash/defaults";function p(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function l(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function d(e){for(var r=1;re.length)&&(r=e.length);for(var t=0,o=new Array(r);t0?(s.consoleLog(p({},t,r),"".concat(n," of ").concat(a," changes:")),i.forEach((function(e){var r=e.pathString,t=e.diffType,n=e.prevValue,i=e.nextValue;s.consoleGroup("%c".concat("hook"===a?"[hook ".concat(o," result]"):"".concat(a,"."),"%c").concat(r,"%c"),"color:".concat(s.diffNameColor,";"),"color:".concat(s.diffPathColor,";"),"color:default;"),s.consoleLog("".concat(_[t]," (more info at ").concat(o?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),s.consoleLog(p({},"prev ".concat(r),n),"!==",p({},"next ".concat(r),i)),s.consoleGroupEnd()}))):i&&(s.consoleLog(p({},t,r),"".concat(n," the ").concat(a," object itself changed but its values are all equal."),"props"===a?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),s.consoleLog("prev ".concat(a,":"),c.prev," !== ",c.next,":next ".concat(a)))}function j(e){var r=e.Component,t=e.displayName,o=e.hookName,n=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,f=e.nextHook,u=e.reason,l=e.options;if(function(e,r,t){return!x&&(!!t.logOnDifferentValues||(!(!r.whyDidYouRender||!r.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===b}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===b}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===b})))))}(u,r,l)){l.consoleGroup("%c".concat(t),"color: ".concat(l.titleColor,";"));var d="Re-rendered because";u.propsDifferences&&(C({Component:r,displayName:t,prefixMessage:d,diffObjType:"props",differences:u.propsDifferences,values:{prev:n,next:c},options:l}),d="And because"),u.stateDifferences&&C({Component:r,displayName:t,prefixMessage:d,diffObjType:"state",differences:u.stateDifferences,values:{prev:a,next:s},options:l}),u.hookDifferences&&C({Component:r,displayName:t,prefixMessage:d,diffObjType:"hook",differences:u.hookDifferences,values:{prev:i,next:f},hookName:o,options:l}),u.propsDifferences||u.stateDifferences||u.hookDifferences||l.consoleLog(p({},t,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),l.consoleGroupEnd()}}function P(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(r){"idle"===r&&(x=!0,setTimeout((function(){x=!1}),e))})),j}var H=function(){};function T(e){return e.displayName||e.name||e.type&&T(e.type)||e.render&&T(e.render)||(r(e)?e:void 0)}var Y="undefined"!=typeof Element,W="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103,A=function(e){return e.$$typeof===W};function L(e,r,t,o,n){return t.push({diffType:n,pathString:o,prevValue:e,nextValue:r}),n!==b}function M(e,r,t){try{var u=[];return function e(r,t,u){var p=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(r===t)return!0;if(!r||!t)return L(r,t,u,p,b);if(f(r)&&f(t)){var l=r.length;if(l!==t.length)return L(r,t,u,p,b);for(var d=!0,m=l;0!=m--;)e(r[m],t[m],u,"".concat(p,"[").concat(m,"]"))||(d=!1);return L(r,t,u,p,d?k:b)}if(c(r)&&c(t))return r.getTime()===t.getTime()?L(r,t,u,p,D):L(r,t,u,p,b);if(i(r)&&i(t))return r.toString()===t.toString()?L(r,t,u,p,R):L(r,t,u,p,b);if(Y&&r instanceof Element&&t instanceof Element)return L(r,t,u,p,b);if(A(r)&&A(t)){if(r.type!==t.type)return L(r,t,u,p,b);var h=e(r.props,t.props,u,"".concat(p,".props"));return L(r,t,u,p,h?w:b)}if(a(r)&&a(t))return r.name===t.name?L(r,t,u,p,O):L(r,t,u,p,b);if(s(r)&&s(t)){var y=n(r),v=y.length;if(v!==n(t).length)return L(r,t,u,p,b);for(var g=v;0!=g--;)if(!o(t,y[g]))return L(r,t,u,p,b);for(var S=!0,N=v;0!=N--;){var E=y[N];e(r[E],t[E],u,"".concat(p,".").concat(E))||(S=!1)}return L(r,t,u,p,S?k:b)}return L(r,t,u,p,b)}(e,r,u,t),u}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var I={};function F(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=o.shallow,a=void 0===n||n;if(e===r)return!1;if(!a)return M(e,r);var i=e||I,c=r||I,s=Object.keys(d({},i,{},c));return t(s,(function(e,r){var t=M(i[r],c[r],r);return t&&(e=[].concat(h(e),h(t))),e}),[])}function V(e,r,t,o,n,a){return{propsDifferences:F(e,o),stateDifferences:F(r,n),hookDifferences:F(t,a,{shallow:!1})}}function G(e){var r=e.Component,t=e.displayName,o=e.hookName,n=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,s=e.nextState,f=e.nextHook;return{Component:r,displayName:t,hookName:o,prevProps:n,prevState:a,prevHook:i,nextProps:c,nextState:s,nextHook:f,options:e.options,reason:V(n,a,i,c,s,f)}}function U(e){return e.prototype&&!!e.prototype.isReactComponent}function $(e){return e.$$typeof===N}function q(e){return e.$$typeof===E}function B(e){var r=e.Component,t=e.displayName,o=e.options,n=e.React,a=e.isHookChange;return!function(e,r){return r.exclude&&r.exclude.length>0&&r.exclude.some((function(r){return r.test(e)}))}(t,o)&&(!1!==r.whyDidYouRender&&((!a||!r.whyDidYouRender||!1!==r.whyDidYouRender.trackHooks)&&!!(r.whyDidYouRender||o.trackAllPureComponents&&(r&&r.prototype instanceof n.PureComponent||$(r))||function(e,r){return r.include&&r.include.length>0&&r.include.some((function(r){return r.test(e)}))}(t,o))))}function z(e,r,t,o){class n extends e{constructor(r,t){var o;super(r,t),o=this,this._WDYR={renderNumber:0};var a=super.render||this.render;a!==e.prototype.render&&(this.render=function(){return n.prototype.render.apply(o),a()})}render(){return this._WDYR.renderNumber++,"isStrictMode"in this._WDYR||(this._WDYR.isStrictMode=function(e){for(var r=e&&e._reactInternalFiber;r;){if(1&r.mode)return!0;r=r.return}return!1}(this)),this._WDYR.isStrictMode&&this._WDYR.renderNumber%2==1||(this._WDYR.prevProps&&o.notifier(G({Component:e,displayName:r,prevProps:this._WDYR.prevProps,prevState:this._WDYR.prevState,nextProps:this.props,nextState:this.state,options:o})),this._WDYR.prevProps=this.props,this._WDYR.prevState=this.state),super.render?super.render():null}}try{n.displayName=r}catch(e){}return u(n,e),n}function J(e,r,t,o,n){var a="string"==typeof e?function(e,r){return function(t){return r.createElement(e,t)}}(e,o):e;function i(){var e=arguments[0],i=o.useRef(),c=i.current;if(i.current=e,c){var s=G({Component:a,displayName:t,prevProps:c,nextProps:e,options:n}),f=s.reason.propsDifferences&&!(r&&0===s.reason.propsDifferences.length);f&&n.notifier(s)}return a.apply(void 0,arguments)}try{i.displayName=t}catch(e){}return i.ComponentForHooksTracking=a,u(i,a),i}var K=Symbol("initial-hook-value");function Q(r,t,o,n,a){var i=t.path,c=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current,s=n.useRef(K);if(!c)return o;var f=c.type.ComponentForHooksTracking||c.type,u=T(f);if(!B({Component:f,displayName:u,options:a,React:n,isHookChange:!0}))return o;var p=s.current;if(s.current=o,p!==K){var l=G({Component:f,displayName:u,hookName:r,prevHook:i?e(p,i):p,nextHook:i?e(o,i):o,options:a});l.reason.hookDifferences&&a.notifier(l)}return o}function X(e,r,t,o,n){return $(r)?function e(r,t,o,n){var a=r.type,i=U(a),c=q(a),s=$(a),f=c?a.render:a,p=i?z(f,t,0,n):s?e(f,t,o,n):J(f,!0,t,o,n);try{p.displayName=T(f)}catch(e){}p.ComponentForHooksTracking=r,u(p,f);var l=o.memo(c?o.forwardRef(p):p,r.compare);try{l.displayName=t}catch(e){}return u(l,r),l}(r,t,o,n):q(r)?function(e,r,t,o){var n=e.render,a=$(n),i=a?n.type:n,c=J(i,a,r,t,o);c.displayName=T(i),c.ComponentForHooksTracking=i,u(c,i);var s=t.forwardRef(a?t.memo(c,n.compare):c);try{s.displayName=r}catch(e){}return u(s,e),s}(r,t,o,n):U(r)?z(r,t,0,n):J(r,!1,t,o,n)}function Z(e,r,t,o,n){if(e.has(r))return e.get(r);var a=X(0,r,t,o,n);return e.set(r,a),a}var ee={useState:{path:"0"},useReducer:{path:"0"},useContext:!0,useMemo:!0};function re(e,r){var t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=console.group,t=console.groupEnd;e.collapseGroups?r=console.groupCollapsed:e.onlyLogs&&(r=console.log,t=H);var o=e.notifier||P("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return d({include:null,exclude:null,notifier:o,onlyLogs:!1,consoleLog:console.log,consoleGroup:r,consoleGroupEnd:t,logOnDifferentValues:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(r),o=e.createElement,n=e.createFactory,a=new WeakMap;if(e.createElement=function(r){for(var n=null,i=null,c=null,s=arguments.length,f=new Array(s>1?s-1:0),u=1;ue.length)&&(r=e.length);for(var t=0,o=new Array(r);t0?(c.consoleLog(u({},t,r),"".concat(n," of ").concat(a," changes:")),i.forEach((function(e){var r=e.pathString,t=e.diffType,n=e.prevValue,i=e.nextValue;c.consoleGroup("%c".concat("hook"===a?"[hook ".concat(o," result]"):"".concat(a,"."),"%c").concat(r,"%c"),"color:".concat(c.diffNameColor,";"),"color:".concat(c.diffPathColor,";"),"color:default;"),c.consoleLog("".concat(S[t]," (more info at ").concat(o?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),c.consoleLog(u({},"prev ".concat(r),n),"!==",u({},"next ".concat(r),i)),c.consoleGroupEnd()}))):i&&(c.consoleLog(u({},t,r),"".concat(n," the ").concat(a," object itself changed but its values are all equal."),"props"===a?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),c.consoleLog("prev ".concat(a,":"),s.prev," !== ",s.next,":next ".concat(a)))}function j(e){var r=e.Component,t=e.displayName,o=e.hookName,n=e.prevProps,a=e.prevState,i=e.prevHook,s=e.nextProps,c=e.nextState,f=e.nextHook,p=e.reason,l=e.options,d=e.ownerDataMap;if(function(e,r,t){return!C&&(!!t.logOnDifferentValues||(!(!r.whyDidYouRender||!r.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===b}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===b}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===b})))))}(p,r,l)){l.consoleGroup("%c".concat(t),"color: ".concat(l.titleColor,";"));var m="Re-rendered because";if(p.propsDifferences&&(x({Component:r,displayName:t,prefixMessage:m,diffObjType:"props",differences:p.propsDifferences,values:{prev:n,next:s},options:l}),m="And because"),p.stateDifferences&&x({Component:r,displayName:t,prefixMessage:m,diffObjType:"state",differences:p.stateDifferences,values:{prev:a,next:c},options:l}),p.hookDifferences&&x({Component:r,displayName:t,prefixMessage:m,diffObjType:"hook",differences:p.hookDifferences,values:{prev:i,next:f},hookName:o,options:l}),p.propsDifferences&&p.ownerDifferences){var h=d.get(n),y=d.get(s);l.consoleGroup("Rendered by ".concat(y.displayName));var v="Re-rendered because";p.ownerDifferences.propsDifferences&&(x({Component:y.Component,displayName:y.displayName,prefixMessage:v,diffObjType:"props",differences:p.ownerDifferences.propsDifferences,values:{prev:h.props,next:y.props},options:l}),v="And because"),p.ownerDifferences.stateDifferences&&x({Component:y.Component,displayName:y.displayName,prefixMessage:v,diffObjType:"state",differences:p.ownerDifferences.stateDifferences,values:{prev:h.state,next:y.state},options:l}),p.ownerDifferences.hookDifferences&&p.ownerDifferences.hookDifferences.forEach((function(e,r){var t=e.hookName,o=e.differences;return x({Component:y.Component,displayName:y.displayName,prefixMessage:v,diffObjType:"hook",differences:o,values:{prev:h.hooks[r].result,next:y.hooks[r].result},hookName:t,options:l})})),l.consoleGroupEnd()}p.propsDifferences||p.stateDifferences||p.hookDifferences||l.consoleLog(u({},t,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),l.consoleGroupEnd()}}function T(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(r){"idle"===r&&(C=!0,setTimeout((function(){C=!1}),e))})),j}var P=function(){};function H(e){return e.displayName||e.name||e.type&&H(e.type)||e.render&&H(e.render)||(r(e)?e:void 0)}var Y="undefined"!=typeof Element,M="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103,W=function(e){return e.$$typeof===M};function A(e,r,t,o,n){return t.push({diffType:n,pathString:o,prevValue:e,nextValue:r}),n!==b}function L(e,r,t){try{var p=[];return function e(r,t,p){var u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";if(r===t)return!0;if(!r||!t)return A(r,t,p,u,b);if(f(r)&&f(t)){var l=r.length;if(l!==t.length)return A(r,t,p,u,b);for(var d=!0,m=l;0!=m--;)e(r[m],t[m],p,"".concat(u,"[").concat(m,"]"))||(d=!1);return A(r,t,p,u,d?D:b)}if(s(r)&&s(t))return r.getTime()===t.getTime()?A(r,t,p,u,k):A(r,t,p,u,b);if(i(r)&&i(t))return r.toString()===t.toString()?A(r,t,p,u,w):A(r,t,p,u,b);if(Y&&r instanceof Element&&t instanceof Element)return A(r,t,p,u,b);if(W(r)&&W(t)){if(r.type!==t.type)return A(r,t,p,u,b);var h=e(r.props,t.props,p,"".concat(u,".props"));return A(r,t,p,u,h?R:b)}if(a(r)&&a(t))return r.name===t.name?A(r,t,p,u,N):A(r,t,p,u,b);if(c(r)&&c(t)){var y=n(r),v=y.length;if(v!==n(t).length)return A(r,t,p,u,b);for(var g=v;0!=g--;)if(!o(t,y[g]))return A(r,t,p,u,b);for(var O=!0,_=v;0!=_--;){var E=y[_];e(r[E],t[E],p,"".concat(u,".").concat(E))||(O=!1)}return A(r,t,p,u,O?D:b)}return A(r,t,p,u,b)}(e,r,p,t),p}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var I={};function F(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=o.shallow,a=void 0===n||n;if(e===r)return!1;if(!a)return L(e,r);var i=e||I,s=r||I,c=Object.keys(d({},i,{},s));return t(c,(function(e,r){var t=L(i[r],s[r],r);return t&&(e=[].concat(h(e),h(t))),e}),[])}function U(e,r,t,o,n,a,i){var s=i.get(e),c=i.get(o);return{propsDifferences:F(e,o),stateDifferences:F(r,n),hookDifferences:F(t,a,{shallow:!1}),ownerDifferences:null!=s&&null!=c&&{propsDifferences:F(s.props,c.props),stateDifferences:F(s.state,c.state),hookDifferences:s.hooks.map((function(e,r){return{hookName:e.hookName,differences:F(e.result,c.hooks[r].result,{shallow:!1})}}))}}}function G(e){var r=e.Component,t=e.displayName,o=e.hookName,n=e.prevProps,a=e.prevState,i=e.prevHook,s=e.nextProps,c=e.nextState,f=e.nextHook,p=e.options,u=e.ownerDataMap;return{Component:r,displayName:t,hookName:o,prevProps:n,prevState:a,prevHook:i,nextProps:s,nextState:c,nextHook:f,options:p,ownerDataMap:u,reason:U(n,a,i,s,c,f,u)}}function V(e){return e.prototype&&!!e.prototype.isReactComponent}function $(e){return e.$$typeof===_}function B(e){return e.$$typeof===E}function q(e){var r=e.Component,t=e.displayName,o=e.options,n=e.React,a=e.isHookChange;return!function(e,r){return r.exclude&&r.exclude.length>0&&r.exclude.some((function(r){return r.test(e)}))}(t,o)&&(!1!==r.whyDidYouRender&&((!a||!r.whyDidYouRender||!1!==r.whyDidYouRender.trackHooks)&&!!(r.whyDidYouRender||o.trackAllPureComponents&&(r&&r.prototype instanceof n.PureComponent||$(r))||function(e,r){return r.include&&r.include.length>0&&r.include.some((function(r){return r.test(e)}))}(t,o))))}function z(e,r,t,o,n){class a extends e{constructor(r,t){var o;super(r,t),o=this,this._WDYR={renderNumber:0};var n=super.render||this.render;n!==e.prototype.render&&(this.render=function(){return a.prototype.render.apply(o),n()})}render(){return this._WDYR.renderNumber++,"isStrictMode"in this._WDYR||(this._WDYR.isStrictMode=function(e){for(var r=e&&e._reactInternalFiber;r;){if(1&r.mode)return!0;r=r.return}return!1}(this)),this._WDYR.isStrictMode&&this._WDYR.renderNumber%2==1||(this._WDYR.prevProps&&o.notifier(G({Component:e,displayName:r,prevProps:this._WDYR.prevProps,prevState:this._WDYR.prevState,nextProps:this.props,nextState:this.state,options:o,ownerDataMap:n})),this._WDYR.prevProps=this.props,this._WDYR.prevState=this.state),super.render?super.render():null}}try{a.displayName=r}catch(e){}return p(a,e),a}function J(e,r,t,o,n,a){var i="string"==typeof e?function(e,r){return function(t){return r.createElement(e,t)}}(e,o):e;function s(){var e=arguments[0],s=o.useRef(),c=s.current;if(s.current=e,c){var f=G({Component:i,displayName:t,prevProps:c,nextProps:e,options:n,ownerDataMap:a}),p=f.reason.propsDifferences&&!(r&&0===f.reason.propsDifferences.length);p&&n.notifier(f)}return i.apply(void 0,arguments)}try{s.displayName=t}catch(e){}return s.ComponentForHooksTracking=i,p(s,i),s}var K=Symbol("initial-hook-value");function Q(r,t,o,n,a,i,s){var c=t.path,f=c?e(o,c):o;s.current.push({hookName:r,result:f});var p=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current,u=n.useRef(K);if(!p)return o;var l=p.type.ComponentForHooksTracking||p.type,d=H(l);if(!q({Component:l,displayName:d,options:a,React:n,isHookChange:!0}))return o;var m=u.current;if(u.current=o,m!==K){var h=G({Component:l,displayName:d,hookName:r,prevHook:c?e(m,c):m,nextHook:f,options:a,ownerDataMap:i});h.reason.hookDifferences&&a.notifier(h)}return o}function X(e,r,t,o,n,a){return $(r)?function e(r,t,o,n,a){var i=r.type,s=V(i),c=B(i),f=$(i),u=c?i.render:i,l=s?z(u,t,0,n,a):f?e(u,t,o,n,a):J(u,!0,t,o,n,a);try{l.displayName=H(u)}catch(e){}l.ComponentForHooksTracking=r,p(l,u);var d=o.memo(c?o.forwardRef(l):l,r.compare);try{d.displayName=t}catch(e){}return p(d,r),d}(r,t,o,n,a):B(r)?function(e,r,t,o,n){var a=e.render,i=$(a),s=i?a.type:a,c=J(s,i,r,t,o,n);c.displayName=H(s),c.ComponentForHooksTracking=s,p(c,s);var f=t.forwardRef(i?t.memo(c,a.compare):c);try{f.displayName=r}catch(e){}return p(f,e),f}(r,t,o,n,a):V(r)?z(r,t,0,n,a):J(r,!1,t,o,n,a)}function Z(e,r,t,o,n,a){if(e.has(r))return e.get(r);var i=X(0,r,t,o,n,a);return e.set(r,i),i}var ee={useState:{path:"0"},useReducer:{path:"0"},useContext:!0,useMemo:!0};function re(e,r){var t=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=console.group,t=console.groupEnd;e.collapseGroups?r=console.groupCollapsed:e.onlyLogs&&(r=console.log,t=P);var o=e.notifier||T("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return d({include:null,exclude:null,notifier:o,onlyLogs:!1,consoleLog:console.log,consoleGroup:r,consoleGroupEnd:t,logOnDifferentValues:!1,logOwnerReasons:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(r),o=e.createElement,n=e.createFactory,a=new WeakMap,i=new WeakMap,s={current:[]},c=null;if(Object.defineProperty(e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,"current",{get:function(){return c},set:function(e){c=e,s.current=[]}}),e.createElement=function(r){for(var n=null,c=null,f=null,p=arguments.length,u=new Array(p>1?p-1:0),l=1;l diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook){\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false})\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options){\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook: hookPath ? get(hookResult, hookPath) : hookResult,\r\n options\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options)\r\n return origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["diffTypes","hasSymbol","Symbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","length","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","type","name","render","_isString","undefined","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","object","$$typeof","trackDiff","a","b","diffsAccumulator","push","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","i","_isDate","getTime","_isRegExp","toString","reactElementPropsAreDeepEqual","props","_isFunction","_isPlainObject","keys","_keys","_has","key","error","message","match","number","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","Object","_reduce","result","deepEqualDiffs","getUpdateReason","getUpdateInfo","isReactClassComponent","prototype","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","test","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","constructor","context","_WDYR","renderNumber","origRender","super","this","apply","_this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","state","e","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","arguments","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hookPath","path","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","_get","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","has","get","WDYRPatchedComponent","set","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","WeakMap","componentNameOrComponent","isShouldTrack","rest","customName","errorInfo","assign","factory","bind","nativeHooks","entries","map","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","args","call","defineProperty","value","writable","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"whyDidYouRender.min.js.map","sources":["../../src/consts.js","../../src/defaultNotifier.js","../../src/normalizeOptions.js","../../src/getDisplayName.js","../../src/calculateDeepEqualDiffs.js","../../src/findObjectsDifferences.js","../../src/getUpdateInfo.js","../../src/utils.js","../../src/shouldTrack.js","../../src/patches/patchClassComponent.js","../../src/patches/patchFunctionalOrStrComponent.js","../../src/whyDidYouRender.js","../../src/patches/patchMemoComponent.js","../../src/patches/patchForwardRefComponent.js","../../src/index.js"],"sourcesContent":["export const diffTypes = {\r\n 'different': 'different',\r\n 'deepEquals': 'deepEquals',\r\n 'date': 'date',\r\n 'regex': 'regex',\r\n 'reactElement': 'reactElement',\r\n 'function': 'function'\r\n}\r\n\r\n// copied from packages/shared/ReactSymbols.js in https://github.com/facebook/react\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nexport const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3\r\nexport const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0\r\n","import {diffTypes} from './consts'\r\n\r\nconst moreInfoUrl = 'http://bit.ly/wdyr02'\r\nconst moreInfoHooksUrl = 'http://bit.ly/wdyr3'\r\n\r\nconst diffTypesDescriptions = {\r\n [diffTypes.different]: 'different objects.',\r\n [diffTypes.deepEquals]: 'different objects that are equal by value.',\r\n [diffTypes.date]: 'different date objects with the same value.',\r\n [diffTypes.regex]: 'different regular expressions with the same value.',\r\n [diffTypes.reactElement]: 'different React elements with the same displayName.',\r\n [diffTypes.function]: 'different functions with the same name.'\r\n}\r\n\r\nlet inHotReload = false\r\n\r\nfunction shouldLog(reason, Component, options){\r\n if(inHotReload){\r\n return false\r\n }\r\n\r\n if(options.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n if(Component.whyDidYouRender && Component.whyDidYouRender.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n const hasDifferentValues = ((\r\n reason.propsDifferences &&\r\n reason.propsDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options, ownerDataMap} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n\r\n if(reason.propsDifferences && reason.ownerDifferences){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n options.consoleGroup(`Rendered by ${nextOwnerData.displayName}`)\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.ownerDifferences.propsDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.ownerDifferences.propsDifferences,\r\n values: {prev: prevOwnerData.props, next: nextOwnerData.props},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.ownerDifferences.stateDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.ownerDifferences.stateDifferences,\r\n values: {prev: prevOwnerData.state, next: nextOwnerData.state},\r\n options\r\n })\r\n }\r\n\r\n if(reason.ownerDifferences.hookDifferences){\r\n reason.ownerDifferences.hookDifferences.forEach(({hookName, differences}, i) =>\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences,\r\n values: {prev: prevOwnerData.hooks[i].result, next: nextOwnerData.hooks[i].result},\r\n hookName,\r\n options\r\n })\r\n )\r\n }\r\n options.consoleGroupEnd()\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n logOwnerReasons: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false}),\r\n ownerDifferences: prevOwnerData != null && nextOwnerData != null ? {\r\n propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props),\r\n stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state),\r\n hookDifferences: prevOwnerData.hooks.map(({hookName, result}, i) => ({\r\n hookName,\r\n differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, {shallow: false})\r\n }))\r\n } : false\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options, ownerDataMap}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n ownerDataMap,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options,\r\n ownerDataMap\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options, ownerDataMap, hooksRef){\r\n const nextHook = hookPath ? get(hookResult, hookPath) : hookResult\r\n hooksRef.current.push({hookName, result: nextHook})\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n const ownerDataMap = new WeakMap()\r\n const hooksRef = {current: []}\r\n\r\n // Intercept assignments to ReactCurrentOwner.current and reset hooksRef\r\n let currentOwner = null\r\n Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', {\r\n get(){\r\n return currentOwner\r\n },\r\n set(value){\r\n currentOwner = value\r\n hooksRef.current = []\r\n }\r\n })\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap)\r\n\r\n const element = origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n if(options.logOwnerReasons){\r\n const OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n if(OwnerInstance != null){\r\n const Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type\r\n const displayName = getDisplayName(Component)\r\n ownerDataMap.set(element.props, {\r\n Component,\r\n displayName,\r\n props: OwnerInstance.pendingProps,\r\n state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null,\r\n hooks: hooksRef.current\r\n })\r\n }\r\n }\r\n\r\n return element\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["diffTypes","hasSymbol","Symbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","length","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","ownerDataMap","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","ownerDifferences","prevOwnerData","get","nextOwnerData","props","state","i","hooks","result","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","type","name","render","_isString","undefined","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","object","$$typeof","trackDiff","a","b","diffsAccumulator","push","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","_isDate","getTime","_isRegExp","toString","reactElementPropsAreDeepEqual","_isFunction","_isPlainObject","keys","_keys","_has","key","error","message","match","number","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","Object","_reduce","deepEqualDiffs","getUpdateReason","map","getUpdateInfo","isReactClassComponent","prototype","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","test","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","constructor","context","_WDYR","renderNumber","origRender","super","this","apply","_this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","e","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","arguments","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hooksRef","hookPath","path","_get","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","has","WDYRPatchedComponent","set","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","logOwnerReasons","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","WeakMap","currentOwner","defineProperty","value","componentNameOrComponent","isShouldTrack","rest","customName","element","OwnerInstance","pendingProps","stateNode","errorInfo","assign","factory","bind","nativeHooks","entries","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","args","call","writable","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file diff --git a/dist/no-classes-transpile/umd/whyDidYouRender.js b/dist/no-classes-transpile/umd/whyDidYouRender.js index 052daec..74680cc 100644 --- a/dist/no-classes-transpile/umd/whyDidYouRender.js +++ b/dist/no-classes-transpile/umd/whyDidYouRender.js @@ -1,8 +1,8 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ (function (global, factory) { @@ -1406,7 +1406,8 @@ nextState = updateInfo.nextState, nextHook = updateInfo.nextHook, reason = updateInfo.reason, - options = updateInfo.options; + options = updateInfo.options, + ownerDataMap = updateInfo.ownerDataMap; if (!shouldLog(reason, Component, options)) { return; @@ -1462,6 +1463,66 @@ }); } + if (reason.propsDifferences && reason.ownerDifferences) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); + options.consoleGroup("Rendered by ".concat(nextOwnerData.displayName)); + var _prefixMessage = 'Re-rendered because'; + + if (reason.ownerDifferences.propsDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'props', + differences: reason.ownerDifferences.propsDifferences, + values: { + prev: prevOwnerData.props, + next: nextOwnerData.props + }, + options: options + }); + _prefixMessage = 'And because'; + } + + if (reason.ownerDifferences.stateDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'state', + differences: reason.ownerDifferences.stateDifferences, + values: { + prev: prevOwnerData.state, + next: nextOwnerData.state + }, + options: options + }); + } + + if (reason.ownerDifferences.hookDifferences) { + reason.ownerDifferences.hookDifferences.forEach(function (_ref3, i) { + var hookName = _ref3.hookName, + differences = _ref3.differences; + return logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'hook', + differences: differences, + values: { + prev: prevOwnerData.hooks[i].result, + next: nextOwnerData.hooks[i].result + }, + hookName: hookName, + options: options + }); + }); + } + + options.consoleGroupEnd(); + } + if (!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences) { options.consoleLog(_defineProperty({}, displayName, Component), 'Re-rendered although props and state objects are the same.', 'This usually means there was a call to this.forceUpdate() inside the component.', "more info at ".concat(moreInfoUrl)); } @@ -1509,6 +1570,7 @@ consoleGroup: consoleGroup, consoleGroupEnd: consoleGroupEnd, logOnDifferentValues: false, + logOwnerReasons: false, trackHooks: true, titleColor: '#058', diffNameColor: 'blue', @@ -3766,27 +3828,44 @@ }, []); } - function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) { + function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); return { propsDifferences: findObjectsDifferences(prevProps, nextProps), stateDifferences: findObjectsDifferences(prevState, nextState), hookDifferences: findObjectsDifferences(prevHook, nextHook, { shallow: false - }) + }), + ownerDifferences: prevOwnerData != null && nextOwnerData != null ? { + propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props), + stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state), + hookDifferences: prevOwnerData.hooks.map(function (_ref, i) { + var hookName = _ref.hookName, + result = _ref.result; + return { + hookName: hookName, + differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, { + shallow: false + }) + }; + }) + } : false }; } - function getUpdateInfo(_ref) { - var Component = _ref.Component, - displayName = _ref.displayName, - hookName = _ref.hookName, - prevProps = _ref.prevProps, - prevState = _ref.prevState, - prevHook = _ref.prevHook, - nextProps = _ref.nextProps, - nextState = _ref.nextState, - nextHook = _ref.nextHook, - options = _ref.options; + function getUpdateInfo(_ref2) { + var Component = _ref2.Component, + displayName = _ref2.displayName, + hookName = _ref2.hookName, + prevProps = _ref2.prevProps, + prevState = _ref2.prevState, + prevHook = _ref2.prevHook, + nextProps = _ref2.nextProps, + nextState = _ref2.nextState, + nextHook = _ref2.nextHook, + options = _ref2.options, + ownerDataMap = _ref2.ownerDataMap; return { Component: Component, displayName: displayName, @@ -3798,7 +3877,8 @@ nextState: nextState, nextHook: nextHook, options: options, - reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) + ownerDataMap: ownerDataMap, + reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) }; } @@ -4206,7 +4286,7 @@ var defaults_1 = defaults; - function patchClassComponent(ClassComponent, displayName, React, options) { + function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap) { class WDYRPatchedClassComponent extends ClassComponent { constructor(props, context) { var _this; @@ -4245,7 +4325,8 @@ prevState: this._WDYR.prevState, nextProps: this.props, nextState: this.state, - options: options + options: options, + ownerDataMap: ownerDataMap })); } @@ -4274,7 +4355,7 @@ }; }; - function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options) { + function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap) { var FunctionalComponent = typeof FunctionalOrStringComponent === 'string' ? getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) : FunctionalOrStringComponent; function WDYRFunctionalComponent() { @@ -4289,7 +4370,8 @@ displayName: displayName, prevProps: prevProps, nextProps: nextProps, - options: options + options: options, + ownerDataMap: ownerDataMap }); var shouldNotify = updateInfo.reason.propsDifferences && !(isPure && updateInfo.reason.propsDifferences.length === 0); @@ -4313,13 +4395,13 @@ return WDYRFunctionalComponent; } - function patchMemoComponent(MemoComponent, displayName, React, options) { + function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap) { var InnerMemoComponent = MemoComponent.type; var isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent); var isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent); var isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent); var WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ? InnerMemoComponent.render : InnerMemoComponent; - var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options); + var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap); try { PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent); @@ -4342,11 +4424,11 @@ return WDYRMemoizedFunctionalComponent; } - function patchForwardRefComponent(ForwardRefComponent, displayName, React, options) { + function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap) { var InnerForwardRefComponent = ForwardRefComponent.render; var isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent); var WrappedFunctionalComponent = isInnerComponentMemoized ? InnerForwardRefComponent.type : InnerForwardRefComponent; - var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options); + var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap); WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent); WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent; @@ -4366,8 +4448,13 @@ var initialHookValue = Symbol('initial-hook-value'); - function trackHookChanges(hookName, _ref, hookResult, React, options) { + function trackHookChanges(hookName, _ref, hookResult, React, options, ownerDataMap, hooksRef) { var hookPath = _ref.path; + var nextHook = hookPath ? get_1(hookResult, hookPath) : hookResult; + hooksRef.current.push({ + hookName: hookName, + result: nextHook + }); var ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; var prevHookResultRef = React.useRef(initialHookValue); @@ -4398,8 +4485,9 @@ displayName: displayName, hookName: hookName, prevHook: hookPath ? get_1(prevHookResult, hookPath) : prevHookResult, - nextHook: hookPath ? get_1(hookResult, hookPath) : hookResult, - options: options + nextHook: nextHook, + options: options, + ownerDataMap: ownerDataMap }); if (notification.reason.hookDifferences) { @@ -4410,28 +4498,28 @@ return hookResult; } - function createPatchedComponent(componentsMap, Component, displayName, React, options) { + function createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (isMemoComponent(Component)) { - return patchMemoComponent(Component, displayName, React, options); + return patchMemoComponent(Component, displayName, React, options, ownerDataMap); } if (isForwardRefComponent(Component)) { - return patchForwardRefComponent(Component, displayName, React, options); + return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap); } if (isReactClassComponent(Component)) { - return patchClassComponent(Component, displayName, React, options); + return patchClassComponent(Component, displayName, React, options, ownerDataMap); } - return patchFunctionalOrStrComponent(Component, false, displayName, React, options); + return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap); } - function getPatchedComponent(componentsMap, Component, displayName, React, options) { + function getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (componentsMap.has(Component)) { return componentsMap.get(Component); } - var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options); + var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap); componentsMap.set(Component, WDYRPatchedComponent); return WDYRPatchedComponent; } @@ -4451,6 +4539,21 @@ var origCreateElement = React.createElement; var origCreateFactory = React.createFactory; var componentsMap = new WeakMap(); + var ownerDataMap = new WeakMap(); + var hooksRef = { + current: [] + }; // Intercept assignments to ReactCurrentOwner.current and reset hooksRef + + var currentOwner = null; + Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', { + get: function get() { + return currentOwner; + }, + set: function set(value) { + currentOwner = value; + hooksRef.current = []; + } + }); React.createElement = function (componentNameOrComponent) { var isShouldTrack = null; @@ -4471,8 +4574,28 @@ if (isShouldTrack) { displayName = componentNameOrComponent && componentNameOrComponent.whyDidYouRender && componentNameOrComponent.whyDidYouRender.customName || getDisplayName(componentNameOrComponent); - WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options); - return origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap); + var element = origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + + if (options.logOwnerReasons) { + var OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; + + if (OwnerInstance != null) { + var Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type; + + var _displayName = getDisplayName(Component); + + ownerDataMap.set(element.props, { + Component: Component, + displayName: _displayName, + props: OwnerInstance.pendingProps, + state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null, + hooks: hooksRef.current + }); + } + } + + return element; } } catch (e) { options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', { @@ -4526,7 +4649,7 @@ } var hookResult = originalHook.call.apply(originalHook, [this].concat(args)); - trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options); + trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef); return hookResult; }; diff --git a/dist/no-classes-transpile/umd/whyDidYouRender.min.js b/dist/no-classes-transpile/umd/whyDidYouRender.min.js index 56e0ee2..e9ff8d7 100644 --- a/dist/no-classes-transpile/umd/whyDidYouRender.min.js +++ b/dist/no-classes-transpile/umd/whyDidYouRender.min.js @@ -1,9 +1,9 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).whyDidYouRender=t()}(this,(function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;ne.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1};var ue=function(e,t){var r=this.__data__,n=ne(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function fe(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t0?(f.consoleLog(e({},n,r),"".concat(a," of ").concat(i," changes:")),c.forEach((function(t){var r=t.pathString,n=t.diffType,a=t.prevValue,c=t.nextValue;f.consoleGroup("%c".concat("hook"===i?"[hook ".concat(o," result]"):"".concat(i,"."),"%c").concat(r,"%c"),"color:".concat(f.diffNameColor,";"),"color:".concat(f.diffPathColor,";"),"color:default;"),f.consoleLog("".concat(Ue[n]," (more info at ").concat(o?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),f.consoleLog(e({},"prev ".concat(r),a),"!==",e({},"next ".concat(r),c)),f.consoleGroupEnd()}))):c&&(f.consoleLog(e({},n,r),"".concat(a," the ").concat(i," object itself changed but its values are all equal."),"props"===i?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),f.consoleLog("prev ".concat(i,":"),u.prev," !== ",u.next,":next ".concat(i)))}function qe(t){var r=t.Component,n=t.displayName,o=t.hookName,a=t.prevProps,i=t.prevState,c=t.prevHook,u=t.nextProps,f=t.nextState,s=t.nextHook,l=t.reason,p=t.options;if(function(e,t,r){return!Be&&(!!r.logOnDifferentValues||(!(!t.whyDidYouRender||!t.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===Ye}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===Ye}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===Ye})))))}(l,r,p)){p.consoleGroup("%c".concat(n),"color: ".concat(p.titleColor,";"));var v="Re-rendered because";l.propsDifferences&&(Ge({Component:r,displayName:n,prefixMessage:v,diffObjType:"props",differences:l.propsDifferences,values:{prev:a,next:u},options:p}),v="And because"),l.stateDifferences&&Ge({Component:r,displayName:n,prefixMessage:v,diffObjType:"state",differences:l.stateDifferences,values:{prev:i,next:f},options:p}),l.hookDifferences&&Ge({Component:r,displayName:n,prefixMessage:v,diffObjType:"hook",differences:l.hookDifferences,values:{prev:c,next:s},hookName:o,options:p}),l.propsDifferences||l.stateDifferences||l.hookDifferences||p.consoleLog(e({},n,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),p.consoleGroupEnd()}}function Je(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(t){"idle"===t&&(Be=!0,setTimeout((function(){Be=!1}),e))})),qe}var Ke=function(){};var Qe=function(e){return"string"==typeof e||!c(e)&&w(e)&&"[object String]"==O(e)};function Xe(e){return e.displayName||e.name||e.type&&Xe(e.type)||e.render&&Xe(e.render)||(Qe(e)?e:void 0)}var Ze=function(e,t,r,n){var o=-1,a=null==e?0:e.length;for(n&&a&&(r=e[++o]);++o-1&&e%1==0&&e-1&&e%1==0&&e<=9007199254740991},pt={};pt["[object Float32Array]"]=pt["[object Float64Array]"]=pt["[object Int8Array]"]=pt["[object Int16Array]"]=pt["[object Int32Array]"]=pt["[object Uint8Array]"]=pt["[object Uint8ClampedArray]"]=pt["[object Uint16Array]"]=pt["[object Uint32Array]"]=!0,pt["[object Arguments]"]=pt["[object Array]"]=pt["[object ArrayBuffer]"]=pt["[object Boolean]"]=pt["[object DataView]"]=pt["[object Date]"]=pt["[object Error]"]=pt["[object Function]"]=pt["[object Map]"]=pt["[object Number]"]=pt["[object Object]"]=pt["[object RegExp]"]=pt["[object Set]"]=pt["[object String]"]=pt["[object WeakMap]"]=!1;var vt=function(e){return w(e)&<(e.length)&&!!pt[O(e)]};var ht=function(e){return function(t){return e(t)}},yt=f((function(e,t){var r=t&&!t.nodeType&&t,n=r&&e&&!e.nodeType&&e,o=n&&n.exports===r&&s.process,a=function(){try{var e=n&&n.require&&n.require("util").types;return e||o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=a})),dt=yt&&yt.isTypedArray,bt=dt?ht(dt):vt,mt=Object.prototype.hasOwnProperty;var gt=function(e,t){var r=c(e),n=!r&&it(e),o=!r&&!n&&ut(e),a=!r&&!n&&!o&&bt(e),i=r||n||o||a,u=i?tt(e.length,String):[],f=u.length;for(var s in e)!t&&!mt.call(e,s)||i&&("length"==s||o&&("offset"==s||"parent"==s)||a&&("buffer"==s||"byteLength"==s||"byteOffset"==s)||st(s,f))||u.push(s);return u},_t=Object.prototype;var jt=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||_t)};var Ot=function(e,t){return function(r){return e(t(r))}},wt=Ot(Object.keys,Object),kt=Object.prototype.hasOwnProperty;var Dt=function(e){if(!jt(e))return wt(e);var t=[];for(var r in Object(e))kt.call(e,r)&&"constructor"!=r&&t.push(r);return t};var St=function(e){return null!=e&<(e.length)&&!P(e)};var xt=function(e){return St(e)?gt(e):Dt(e)};var Rt=function(e,t){return function(r,n){if(null==r)return r;if(!St(r))return e(r,n);for(var o=r.length,a=t?o:-1,i=Object(r);(t?a--:++ac))return!1;var f=a.get(e);if(f&&a.get(t))return f==t;var s=-1,l=!0,p=2&r?new Wt:void 0;for(a.set(e,t),a.set(t,e);++s3&&void 0!==arguments[3]?arguments[3]:"";if(t===r)return!0;if(!t||!r)return en(t,r,n,o,Ye);if(c(t)&&c(r)){var a=t.length;if(a!==r.length)return en(t,r,n,o,Ye);for(var i=!0,u=a;0!=u--;)e(t[u],r[u],n,"".concat(o,"[").concat(u,"]"))||(i=!1);return en(t,r,n,o,i?ze:Ye)}if($r(t)&&$r(r))return t.getTime()===r.getTime()?en(t,r,n,o,Me):en(t,r,n,o,Ye);if(Fr(t)&&Fr(r))return t.toString()===r.toString()?en(t,r,n,o,We):en(t,r,n,o,Ye);if(Qr&&t instanceof Element&&r instanceof Element)return en(t,r,n,o,Ye);if(Zr(t)&&Zr(r)){if(t.type!==r.type)return en(t,r,n,o,Ye);var f=e(t.props,r.props,n,"".concat(o,".props"));return en(t,r,n,o,f?Fe:Ye)}if(P(t)&&P(r))return t.name===r.name?en(t,r,n,o,Ie):en(t,r,n,o,Ye);if(Kr(t)&&Kr(r)){var s=xt(t),l=s.length;if(l!==xt(r).length)return en(t,r,n,o,Ye);for(var p=l;0!=p--;)if(!zr(r,s[p]))return en(t,r,n,o,Ye);for(var v=!0,h=l;0!=h--;){var y=s[h];e(t[y],r[y],n,"".concat(o,".").concat(y))||(v=!1)}return en(t,r,n,o,v?ze:Ye)}return en(t,r,n,o,Ye)}(e,t,n,r),n}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var rn={};function nn(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=n.shallow,i=void 0===a||a;if(e===t)return!1;if(!i)return tn(e,t);var c=e||rn,u=t||rn,f=Object.keys(r({},c,{},u));return Tr(f,(function(e,t){var r=tn(c[t],u[t],t);return r&&(e=[].concat(o(e),o(r))),e}),[])}function on(e,t,r,n,o,a){return{propsDifferences:nn(e,n),stateDifferences:nn(t,o),hookDifferences:nn(r,a,{shallow:!1})}}function an(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,u=e.nextState,f=e.nextHook;return{Component:t,displayName:r,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:u,nextHook:f,options:e.options,reason:on(o,a,i,c,u,f)}}function cn(e){return e.prototype&&!!e.prototype.isReactComponent}function un(e){return e.$$typeof===$e}function fn(e){return e.$$typeof===Ve}function sn(e){var t=e.Component,r=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,t){return t.exclude&&t.exclude.length>0&&t.exclude.some((function(t){return t.test(e)}))}(r,n)&&(!1!==t.whyDidYouRender&&((!a||!t.whyDidYouRender||!1!==t.whyDidYouRender.trackHooks)&&!!(t.whyDidYouRender||n.trackAllPureComponents&&(t&&t.prototype instanceof o.PureComponent||un(t))||function(e,t){return t.include&&t.include.length>0&&t.include.some((function(t){return t.test(e)}))}(r,n))))}var ln=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)},pn=Math.max;var vn=function(e,t,r){return t=pn(void 0===t?e.length-1:t,0),function(){for(var n=arguments,o=-1,a=pn(n.length-t,0),i=Array(a);++o0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(dn);var gn=function(e,t){return mn(vn(e,t,Rr),e+"")};var _n=function(e,t,r){if(!R(r))return!1;var n=typeof t;return!!("number"==n?St(r)&&st(t,r.length):"string"==n&&t in r)&&re(r[t],e)};var jn=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t},On=Object.prototype.hasOwnProperty;var wn=function(e){if(!R(e))return jn(e);var t=jt(e),r=[];for(var n in e)("constructor"!=n||!t&&On.call(e,n))&&r.push(n);return r};var kn=function(e){return St(e)?gt(e,!0):wn(e)},Dn=Object.prototype,Sn=Dn.hasOwnProperty,xn=gn((function(e,t){e=Object(e);var r=-1,n=t.length,o=n>2?t[2]:void 0;for(o&&_n(t[0],t[1],o)&&(n=1);++r0&&void 0!==arguments[0]?arguments[0]:{},t=console.group,n=console.groupEnd;e.collapseGroups?t=console.groupCollapsed:e.onlyLogs&&(t=console.log,n=Ke);var o=e.notifier||Je("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return r({include:null,exclude:null,notifier:o,onlyLogs:!1,consoleLog:console.log,consoleGroup:t,consoleGroupEnd:n,logOnDifferentValues:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(t),i=e.createElement,c=e.createFactory,u=new WeakMap;if(e.createElement=function(t){for(var r=null,n=null,o=null,c=arguments.length,f=new Array(c>1?c-1:0),s=1;se.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1};var ue=function(e,t){var r=this.__data__,n=ne(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function fe(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t0?(f.consoleLog(e({},n,r),"".concat(a," of ").concat(i," changes:")),c.forEach((function(t){var r=t.pathString,n=t.diffType,a=t.prevValue,c=t.nextValue;f.consoleGroup("%c".concat("hook"===i?"[hook ".concat(o," result]"):"".concat(i,"."),"%c").concat(r,"%c"),"color:".concat(f.diffNameColor,";"),"color:".concat(f.diffPathColor,";"),"color:default;"),f.consoleLog("".concat(Ve[n]," (more info at ").concat(o?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),f.consoleLog(e({},"prev ".concat(r),a),"!==",e({},"next ".concat(r),c)),f.consoleGroupEnd()}))):c&&(f.consoleLog(e({},n,r),"".concat(a," the ").concat(i," object itself changed but its values are all equal."),"props"===i?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),f.consoleLog("prev ".concat(i,":"),u.prev," !== ",u.next,":next ".concat(i)))}function qe(t){var r=t.Component,n=t.displayName,o=t.hookName,a=t.prevProps,i=t.prevState,c=t.prevHook,u=t.nextProps,f=t.nextState,s=t.nextHook,l=t.reason,p=t.options,v=t.ownerDataMap;if(function(e,t,r){return!Be&&(!!r.logOnDifferentValues||(!(!t.whyDidYouRender||!t.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===Ye}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===Ye}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===Ye})))))}(l,r,p)){p.consoleGroup("%c".concat(n),"color: ".concat(p.titleColor,";"));var h="Re-rendered because";if(l.propsDifferences&&(Ge({Component:r,displayName:n,prefixMessage:h,diffObjType:"props",differences:l.propsDifferences,values:{prev:a,next:u},options:p}),h="And because"),l.stateDifferences&&Ge({Component:r,displayName:n,prefixMessage:h,diffObjType:"state",differences:l.stateDifferences,values:{prev:i,next:f},options:p}),l.hookDifferences&&Ge({Component:r,displayName:n,prefixMessage:h,diffObjType:"hook",differences:l.hookDifferences,values:{prev:c,next:s},hookName:o,options:p}),l.propsDifferences&&l.ownerDifferences){var d=v.get(a),y=v.get(u);p.consoleGroup("Rendered by ".concat(y.displayName));var b="Re-rendered because";l.ownerDifferences.propsDifferences&&(Ge({Component:y.Component,displayName:y.displayName,prefixMessage:b,diffObjType:"props",differences:l.ownerDifferences.propsDifferences,values:{prev:d.props,next:y.props},options:p}),b="And because"),l.ownerDifferences.stateDifferences&&Ge({Component:y.Component,displayName:y.displayName,prefixMessage:b,diffObjType:"state",differences:l.ownerDifferences.stateDifferences,values:{prev:d.state,next:y.state},options:p}),l.ownerDifferences.hookDifferences&&l.ownerDifferences.hookDifferences.forEach((function(e,t){var r=e.hookName,n=e.differences;return Ge({Component:y.Component,displayName:y.displayName,prefixMessage:b,diffObjType:"hook",differences:n,values:{prev:d.hooks[t].result,next:y.hooks[t].result},hookName:r,options:p})})),p.consoleGroupEnd()}l.propsDifferences||l.stateDifferences||l.hookDifferences||p.consoleLog(e({},n,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),p.consoleGroupEnd()}}function Je(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(t){"idle"===t&&(Be=!0,setTimeout((function(){Be=!1}),e))})),qe}var Ke=function(){};var Qe=function(e){return"string"==typeof e||!c(e)&&w(e)&&"[object String]"==O(e)};function Xe(e){return e.displayName||e.name||e.type&&Xe(e.type)||e.render&&Xe(e.render)||(Qe(e)?e:void 0)}var Ze=function(e,t,r,n){var o=-1,a=null==e?0:e.length;for(n&&a&&(r=e[++o]);++o-1&&e%1==0&&e-1&&e%1==0&&e<=9007199254740991},pt={};pt["[object Float32Array]"]=pt["[object Float64Array]"]=pt["[object Int8Array]"]=pt["[object Int16Array]"]=pt["[object Int32Array]"]=pt["[object Uint8Array]"]=pt["[object Uint8ClampedArray]"]=pt["[object Uint16Array]"]=pt["[object Uint32Array]"]=!0,pt["[object Arguments]"]=pt["[object Array]"]=pt["[object ArrayBuffer]"]=pt["[object Boolean]"]=pt["[object DataView]"]=pt["[object Date]"]=pt["[object Error]"]=pt["[object Function]"]=pt["[object Map]"]=pt["[object Number]"]=pt["[object Object]"]=pt["[object RegExp]"]=pt["[object Set]"]=pt["[object String]"]=pt["[object WeakMap]"]=!1;var vt=function(e){return w(e)&<(e.length)&&!!pt[O(e)]};var ht=function(e){return function(t){return e(t)}},dt=f((function(e,t){var r=t&&!t.nodeType&&t,n=r&&e&&!e.nodeType&&e,o=n&&n.exports===r&&s.process,a=function(){try{var e=n&&n.require&&n.require("util").types;return e||o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=a})),yt=dt&&dt.isTypedArray,bt=yt?ht(yt):vt,mt=Object.prototype.hasOwnProperty;var gt=function(e,t){var r=c(e),n=!r&&it(e),o=!r&&!n&&ut(e),a=!r&&!n&&!o&&bt(e),i=r||n||o||a,u=i?tt(e.length,String):[],f=u.length;for(var s in e)!t&&!mt.call(e,s)||i&&("length"==s||o&&("offset"==s||"parent"==s)||a&&("buffer"==s||"byteLength"==s||"byteOffset"==s)||st(s,f))||u.push(s);return u},_t=Object.prototype;var jt=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||_t)};var Ot=function(e,t){return function(r){return e(t(r))}},wt=Ot(Object.keys,Object),Dt=Object.prototype.hasOwnProperty;var kt=function(e){if(!jt(e))return wt(e);var t=[];for(var r in Object(e))Dt.call(e,r)&&"constructor"!=r&&t.push(r);return t};var St=function(e){return null!=e&<(e.length)&&!x(e)};var Rt=function(e){return St(e)?gt(e):kt(e)};var Et=function(e,t){return function(r,n){if(null==r)return r;if(!St(r))return e(r,n);for(var o=r.length,a=t?o:-1,i=Object(r);(t?a--:++ac))return!1;var f=a.get(e);if(f&&a.get(t))return f==t;var s=-1,l=!0,p=2&r?new It:void 0;for(a.set(e,t),a.set(t,e);++s3&&void 0!==arguments[3]?arguments[3]:"";if(t===r)return!0;if(!t||!r)return en(t,r,n,o,Ye);if(c(t)&&c(r)){var a=t.length;if(a!==r.length)return en(t,r,n,o,Ye);for(var i=!0,u=a;0!=u--;)e(t[u],r[u],n,"".concat(o,"[").concat(u,"]"))||(i=!1);return en(t,r,n,o,i?He:Ye)}if(Ur(t)&&Ur(r))return t.getTime()===r.getTime()?en(t,r,n,o,ze):en(t,r,n,o,Ye);if(Lr(t)&&Lr(r))return t.toString()===r.toString()?en(t,r,n,o,Ie):en(t,r,n,o,Ye);if(Qr&&t instanceof Element&&r instanceof Element)return en(t,r,n,o,Ye);if(Zr(t)&&Zr(r)){if(t.type!==r.type)return en(t,r,n,o,Ye);var f=e(t.props,r.props,n,"".concat(o,".props"));return en(t,r,n,o,f?Le:Ye)}if(x(t)&&x(r))return t.name===r.name?en(t,r,n,o,We):en(t,r,n,o,Ye);if(Kr(t)&&Kr(r)){var s=Rt(t),l=s.length;if(l!==Rt(r).length)return en(t,r,n,o,Ye);for(var p=l;0!=p--;)if(!Hr(r,s[p]))return en(t,r,n,o,Ye);for(var v=!0,h=l;0!=h--;){var d=s[h];e(t[d],r[d],n,"".concat(o,".").concat(d))||(v=!1)}return en(t,r,n,o,v?He:Ye)}return en(t,r,n,o,Ye)}(e,t,n,r),n}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var rn={};function nn(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=n.shallow,i=void 0===a||a;if(e===t)return!1;if(!i)return tn(e,t);var c=e||rn,u=t||rn,f=Object.keys(r({},c,{},u));return Tr(f,(function(e,t){var r=tn(c[t],u[t],t);return r&&(e=[].concat(o(e),o(r))),e}),[])}function on(e,t,r,n,o,a,i){var c=i.get(e),u=i.get(n);return{propsDifferences:nn(e,n),stateDifferences:nn(t,o),hookDifferences:nn(r,a,{shallow:!1}),ownerDifferences:null!=c&&null!=u&&{propsDifferences:nn(c.props,u.props),stateDifferences:nn(c.state,u.state),hookDifferences:c.hooks.map((function(e,t){return{hookName:e.hookName,differences:nn(e.result,u.hooks[t].result,{shallow:!1})}}))}}}function an(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,u=e.nextState,f=e.nextHook,s=e.options,l=e.ownerDataMap;return{Component:t,displayName:r,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:u,nextHook:f,options:s,ownerDataMap:l,reason:on(o,a,i,c,u,f,l)}}function cn(e){return e.prototype&&!!e.prototype.isReactComponent}function un(e){return e.$$typeof===Ue}function fn(e){return e.$$typeof===$e}function sn(e){var t=e.Component,r=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,t){return t.exclude&&t.exclude.length>0&&t.exclude.some((function(t){return t.test(e)}))}(r,n)&&(!1!==t.whyDidYouRender&&((!a||!t.whyDidYouRender||!1!==t.whyDidYouRender.trackHooks)&&!!(t.whyDidYouRender||n.trackAllPureComponents&&(t&&t.prototype instanceof o.PureComponent||un(t))||function(e,t){return t.include&&t.include.length>0&&t.include.some((function(t){return t.test(e)}))}(r,n))))}var ln=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)},pn=Math.max;var vn=function(e,t,r){return t=pn(void 0===t?e.length-1:t,0),function(){for(var n=arguments,o=-1,a=pn(n.length-t,0),i=Array(a);++o0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(yn);var gn=function(e,t){return mn(vn(e,t,Er),e+"")};var _n=function(e,t,r){if(!E(r))return!1;var n=typeof t;return!!("number"==n?St(r)&&st(t,r.length):"string"==n&&t in r)&&re(r[t],e)};var jn=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t},On=Object.prototype.hasOwnProperty;var wn=function(e){if(!E(e))return jn(e);var t=jt(e),r=[];for(var n in e)("constructor"!=n||!t&&On.call(e,n))&&r.push(n);return r};var Dn=function(e){return St(e)?gt(e,!0):wn(e)},kn=Object.prototype,Sn=kn.hasOwnProperty,Rn=gn((function(e,t){e=Object(e);var r=-1,n=t.length,o=n>2?t[2]:void 0;for(o&&_n(t[0],t[1],o)&&(n=1);++r0&&void 0!==arguments[0]?arguments[0]:{},t=console.group,n=console.groupEnd;e.collapseGroups?t=console.groupCollapsed:e.onlyLogs&&(t=console.log,n=Ke);var o=e.notifier||Je("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return r({include:null,exclude:null,notifier:o,onlyLogs:!1,consoleLog:console.log,consoleGroup:t,consoleGroupEnd:n,logOnDifferentValues:!1,logOwnerReasons:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(t),i=e.createElement,c=e.createFactory,u=new WeakMap,f=new WeakMap,s={current:[]},l=null;if(Object.defineProperty(e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,"current",{get:function(){return l},set:function(e){l=e,s.current=[]}}),e.createElement=function(t){for(var r=null,n=null,o=null,c=arguments.length,l=new Array(c>1?c-1:0),p=1;p true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","export const diffTypes = {\r\n 'different': 'different',\r\n 'deepEquals': 'deepEquals',\r\n 'date': 'date',\r\n 'regex': 'regex',\r\n 'reactElement': 'reactElement',\r\n 'function': 'function'\r\n}\r\n\r\n// copied from packages/shared/ReactSymbols.js in https://github.com/facebook/react\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nexport const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3\r\nexport const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0\r\n","import {diffTypes} from './consts'\r\n\r\nconst moreInfoUrl = 'http://bit.ly/wdyr02'\r\nconst moreInfoHooksUrl = 'http://bit.ly/wdyr3'\r\n\r\nconst diffTypesDescriptions = {\r\n [diffTypes.different]: 'different objects.',\r\n [diffTypes.deepEquals]: 'different objects that are equal by value.',\r\n [diffTypes.date]: 'different date objects with the same value.',\r\n [diffTypes.regex]: 'different regular expressions with the same value.',\r\n [diffTypes.reactElement]: 'different React elements with the same displayName.',\r\n [diffTypes.function]: 'different functions with the same name.'\r\n}\r\n\r\nlet inHotReload = false\r\n\r\nfunction shouldLog(reason, Component, options){\r\n if(inHotReload){\r\n return false\r\n }\r\n\r\n if(options.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n if(Component.whyDidYouRender && Component.whyDidYouRender.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n const hasDifferentValues = ((\r\n reason.propsDifferences &&\r\n reason.propsDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseReduce;\n","var arrayReduce = require('./_arrayReduce'),\n baseEach = require('./_baseEach'),\n baseIteratee = require('./_baseIteratee'),\n baseReduce = require('./_baseReduce'),\n isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n","var baseHas = require('./_baseHas'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nmodule.exports = baseIsRegExp;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar dateTag = '[object Date]';\n\n/**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\nfunction baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n}\n\nmodule.exports = baseIsDate;\n","var baseIsDate = require('./_baseIsDate'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsDate = nodeUtil && nodeUtil.isDate;\n\n/**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\nvar isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\nmodule.exports = isDate;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook){\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false})\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseRest = require('./_baseRest'),\n eq = require('./eq'),\n isIterateeCall = require('./_isIterateeCall'),\n keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options){\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook: hookPath ? get(hookResult, hookPath) : hookResult,\r\n options\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options)\r\n return origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["Array","isArray","global","Object","freeSelf","self","freeGlobal","Function","root","Symbol","objectProto","prototype","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","value","isOwn","call","tag","unmasked","e","result","getRawTag","objectToString","isObjectLike","baseGetTag","reIsDeepProp","reIsPlainProp","object","type","isSymbol","test","uid","isObject","maskSrcKey","exec","coreJsData","keys","IE_PROTO","func","funcToString","reIsHostCtor","funcProto","reIsNative","RegExp","replace","isMasked","isFunction","toSource","key","getValue","baseIsNative","getNative","this","__data__","nativeCreate","size","has","data","Hash","entries","index","length","clear","entry","set","hashClear","hashDelete","get","hashGet","hashHas","hashSet","other","array","eq","splice","assocIndexOf","pop","push","ListCache","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","hash","map","Map","string","isKeyable","getMapData","MapCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","memoize","resolver","TypeError","memoized","args","arguments","apply","cache","Cache","rePropName","reEscapeChar","memoizeCapped","charCodeAt","match","number","quote","subString","iteratee","symbolProto","symbolToString","baseToString","arrayMap","isKey","stringToPath","path","castPath","toKey","defaultValue","baseGet","diffTypes","hasSymbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","name","render","_isString","accumulator","initAccum","fromRight","keysFunc","iterable","props","createBaseFor","n","propertyIsEnumerable","baseIsArguments","freeExports","exports","nodeType","freeModule","Buffer","isBuffer","stubFalse","reIsUint","typedArrayTags","isLength","freeProcess","process","nodeUtil","types","require","binding","nodeIsTypedArray","isTypedArray","baseUnary","baseIsTypedArray","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","baseTimes","String","isIndex","Ctor","constructor","transform","arg","overArg","isPrototype","nativeKeys","isArrayLike","arrayLikeKeys","baseKeys","eachFunc","collection","createBaseEach","baseFor","pairs","LARGE_ARRAY_SIZE","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","SetCache","add","setCacheAdd","setCacheHas","predicate","bitmask","customizer","equalFunc","stack","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","arraySome","othIndex","cacheHas","Uint8Array","symbolValueOf","valueOf","byteLength","byteOffset","buffer","message","convert","mapToArray","setToArray","equalArrays","offset","symbolsFunc","arrayPush","resIndex","nativeGetSymbols","getOwnPropertySymbols","arrayFilter","symbol","stubArray","baseGetAllKeys","getSymbols","objProps","getAllKeys","objLength","skipCtor","objValue","objCtor","othCtor","dataViewCtorString","DataView","mapCtorString","promiseCtorString","Promise","setCtorString","Set","weakMapCtorString","WeakMap","getTag","ArrayBuffer","resolve","ctorString","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsEqual","baseIsEqualDeep","source","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isStrictComparable","getMatchData","matchesStrictComparable","baseIsMatch","hasFunc","hasPath","baseHasIn","hasIn","baseProperty","basePropertyDeep","identity","baseMatchesProperty","baseMatches","property","arrayReduce","baseReduce","baseIteratee","baseEach","baseHas","nodeIsRegExp","isRegExp","baseIsRegExp","nodeIsDate","isDate","baseIsDate","getPrototypeOf","objectCtorString","proto","getPrototype","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","$$typeof","trackDiff","a","b","diffsAccumulator","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","i","_isDate","getTime","_isRegExp","reactElementPropsAreDeepEqual","_isFunction","_isPlainObject","_keys","_has","error","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","_reduce","deepEqualDiffs","getUpdateReason","getUpdateInfo","isReactClassComponent","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","thisArg","nativeMax","Math","max","start","otherArgs","defineProperty","configurable","enumerable","constant","writable","nativeNow","Date","now","count","lastCalled","stamp","remaining","shortOut","baseSetToString","setToString","overRest","nativeKeysIn","isProto","baseKeysIn","baseRest","sources","guard","isIterateeCall","keysIn","propsIndex","propsLength","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","context","_WDYR","renderNumber","origRender","super","_this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","state","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hookPath","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","_get","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","WDYRPatchedComponent","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","componentNameOrComponent","isShouldTrack","rest","customName","errorInfo","assign","factory","bind","nativeHooks","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"whyDidYouRender.min.js.map","sources":["../../node_modules/lodash/isArray.js","../../node_modules/lodash/_freeGlobal.js","../../node_modules/lodash/_root.js","../../node_modules/lodash/_Symbol.js","../../node_modules/lodash/_getRawTag.js","../../node_modules/lodash/_objectToString.js","../../node_modules/lodash/_baseGetTag.js","../../node_modules/lodash/isObjectLike.js","../../node_modules/lodash/isSymbol.js","../../node_modules/lodash/_isKey.js","../../node_modules/lodash/isObject.js","../../node_modules/lodash/isFunction.js","../../node_modules/lodash/_isMasked.js","../../node_modules/lodash/_coreJsData.js","../../node_modules/lodash/_toSource.js","../../node_modules/lodash/_baseIsNative.js","../../node_modules/lodash/_getValue.js","../../node_modules/lodash/_getNative.js","../../node_modules/lodash/_nativeCreate.js","../../node_modules/lodash/_hashClear.js","../../node_modules/lodash/_hashDelete.js","../../node_modules/lodash/_hashGet.js","../../node_modules/lodash/_hashHas.js","../../node_modules/lodash/_hashSet.js","../../node_modules/lodash/_Hash.js","../../node_modules/lodash/_listCacheClear.js","../../node_modules/lodash/eq.js","../../node_modules/lodash/_assocIndexOf.js","../../node_modules/lodash/_listCacheDelete.js","../../node_modules/lodash/_listCacheGet.js","../../node_modules/lodash/_listCacheHas.js","../../node_modules/lodash/_listCacheSet.js","../../node_modules/lodash/_ListCache.js","../../node_modules/lodash/_Map.js","../../node_modules/lodash/_mapCacheClear.js","../../node_modules/lodash/_isKeyable.js","../../node_modules/lodash/_getMapData.js","../../node_modules/lodash/_mapCacheDelete.js","../../node_modules/lodash/_mapCacheGet.js","../../node_modules/lodash/_mapCacheHas.js","../../node_modules/lodash/_mapCacheSet.js","../../node_modules/lodash/_MapCache.js","../../node_modules/lodash/memoize.js","../../node_modules/lodash/_memoizeCapped.js","../../node_modules/lodash/_stringToPath.js","../../node_modules/lodash/_arrayMap.js","../../node_modules/lodash/_baseToString.js","../../node_modules/lodash/toString.js","../../node_modules/lodash/_castPath.js","../../node_modules/lodash/_toKey.js","../../node_modules/lodash/_baseGet.js","../../node_modules/lodash/get.js","../../src/consts.js","../../src/defaultNotifier.js","../../src/normalizeOptions.js","../../node_modules/lodash/isString.js","../../src/getDisplayName.js","../../node_modules/lodash/_arrayReduce.js","../../node_modules/lodash/_createBaseFor.js","../../node_modules/lodash/_baseFor.js","../../node_modules/lodash/_baseTimes.js","../../node_modules/lodash/_baseIsArguments.js","../../node_modules/lodash/isArguments.js","../../node_modules/lodash/stubFalse.js","../../node_modules/lodash/isBuffer.js","../../node_modules/lodash/_isIndex.js","../../node_modules/lodash/isLength.js","../../node_modules/lodash/_baseIsTypedArray.js","../../node_modules/lodash/_baseUnary.js","../../node_modules/lodash/_nodeUtil.js","../../node_modules/lodash/isTypedArray.js","../../node_modules/lodash/_arrayLikeKeys.js","../../node_modules/lodash/_isPrototype.js","../../node_modules/lodash/_overArg.js","../../node_modules/lodash/_nativeKeys.js","../../node_modules/lodash/_baseKeys.js","../../node_modules/lodash/isArrayLike.js","../../node_modules/lodash/keys.js","../../node_modules/lodash/_createBaseEach.js","../../node_modules/lodash/_baseEach.js","../../node_modules/lodash/_baseForOwn.js","../../node_modules/lodash/_stackClear.js","../../node_modules/lodash/_stackDelete.js","../../node_modules/lodash/_stackGet.js","../../node_modules/lodash/_stackHas.js","../../node_modules/lodash/_stackSet.js","../../node_modules/lodash/_Stack.js","../../node_modules/lodash/_setCacheAdd.js","../../node_modules/lodash/_setCacheHas.js","../../node_modules/lodash/_SetCache.js","../../node_modules/lodash/_arraySome.js","../../node_modules/lodash/_cacheHas.js","../../node_modules/lodash/_equalArrays.js","../../node_modules/lodash/_Uint8Array.js","../../node_modules/lodash/_mapToArray.js","../../node_modules/lodash/_setToArray.js","../../node_modules/lodash/_equalByTag.js","../../node_modules/lodash/_arrayPush.js","../../node_modules/lodash/_baseGetAllKeys.js","../../node_modules/lodash/_arrayFilter.js","../../node_modules/lodash/stubArray.js","../../node_modules/lodash/_getSymbols.js","../../node_modules/lodash/_getAllKeys.js","../../node_modules/lodash/_equalObjects.js","../../node_modules/lodash/_DataView.js","../../node_modules/lodash/_Promise.js","../../node_modules/lodash/_Set.js","../../node_modules/lodash/_WeakMap.js","../../node_modules/lodash/_getTag.js","../../node_modules/lodash/_baseIsEqualDeep.js","../../node_modules/lodash/_baseIsEqual.js","../../node_modules/lodash/_baseIsMatch.js","../../node_modules/lodash/_isStrictComparable.js","../../node_modules/lodash/_getMatchData.js","../../node_modules/lodash/_matchesStrictComparable.js","../../node_modules/lodash/_baseMatches.js","../../node_modules/lodash/_baseHasIn.js","../../node_modules/lodash/_hasPath.js","../../node_modules/lodash/hasIn.js","../../node_modules/lodash/_baseMatchesProperty.js","../../node_modules/lodash/identity.js","../../node_modules/lodash/_baseProperty.js","../../node_modules/lodash/_basePropertyDeep.js","../../node_modules/lodash/property.js","../../node_modules/lodash/_baseIteratee.js","../../node_modules/lodash/_baseReduce.js","../../node_modules/lodash/reduce.js","../../node_modules/lodash/_baseHas.js","../../node_modules/lodash/has.js","../../node_modules/lodash/_baseIsRegExp.js","../../node_modules/lodash/isRegExp.js","../../node_modules/lodash/_baseIsDate.js","../../node_modules/lodash/isDate.js","../../node_modules/lodash/_getPrototype.js","../../node_modules/lodash/isPlainObject.js","../../src/calculateDeepEqualDiffs.js","../../src/findObjectsDifferences.js","../../src/getUpdateInfo.js","../../src/utils.js","../../src/shouldTrack.js","../../node_modules/lodash/_apply.js","../../node_modules/lodash/_overRest.js","../../node_modules/lodash/constant.js","../../node_modules/lodash/_defineProperty.js","../../node_modules/lodash/_baseSetToString.js","../../node_modules/lodash/_shortOut.js","../../node_modules/lodash/_setToString.js","../../node_modules/lodash/_baseRest.js","../../node_modules/lodash/_isIterateeCall.js","../../node_modules/lodash/_nativeKeysIn.js","../../node_modules/lodash/_baseKeysIn.js","../../node_modules/lodash/keysIn.js","../../node_modules/lodash/defaults.js","../../src/patches/patchClassComponent.js","../../src/patches/patchFunctionalOrStrComponent.js","../../src/whyDidYouRender.js","../../src/patches/patchMemoComponent.js","../../src/patches/patchForwardRefComponent.js","../../src/index.js"],"sourcesContent":["/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","export const diffTypes = {\r\n 'different': 'different',\r\n 'deepEquals': 'deepEquals',\r\n 'date': 'date',\r\n 'regex': 'regex',\r\n 'reactElement': 'reactElement',\r\n 'function': 'function'\r\n}\r\n\r\n// copied from packages/shared/ReactSymbols.js in https://github.com/facebook/react\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nexport const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3\r\nexport const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0\r\n","import {diffTypes} from './consts'\r\n\r\nconst moreInfoUrl = 'http://bit.ly/wdyr02'\r\nconst moreInfoHooksUrl = 'http://bit.ly/wdyr3'\r\n\r\nconst diffTypesDescriptions = {\r\n [diffTypes.different]: 'different objects.',\r\n [diffTypes.deepEquals]: 'different objects that are equal by value.',\r\n [diffTypes.date]: 'different date objects with the same value.',\r\n [diffTypes.regex]: 'different regular expressions with the same value.',\r\n [diffTypes.reactElement]: 'different React elements with the same displayName.',\r\n [diffTypes.function]: 'different functions with the same name.'\r\n}\r\n\r\nlet inHotReload = false\r\n\r\nfunction shouldLog(reason, Component, options){\r\n if(inHotReload){\r\n return false\r\n }\r\n\r\n if(options.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n if(Component.whyDidYouRender && Component.whyDidYouRender.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n const hasDifferentValues = ((\r\n reason.propsDifferences &&\r\n reason.propsDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options, ownerDataMap} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n\r\n if(reason.propsDifferences && reason.ownerDifferences){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n options.consoleGroup(`Rendered by ${nextOwnerData.displayName}`)\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.ownerDifferences.propsDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.ownerDifferences.propsDifferences,\r\n values: {prev: prevOwnerData.props, next: nextOwnerData.props},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.ownerDifferences.stateDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.ownerDifferences.stateDifferences,\r\n values: {prev: prevOwnerData.state, next: nextOwnerData.state},\r\n options\r\n })\r\n }\r\n\r\n if(reason.ownerDifferences.hookDifferences){\r\n reason.ownerDifferences.hookDifferences.forEach(({hookName, differences}, i) =>\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences,\r\n values: {prev: prevOwnerData.hooks[i].result, next: nextOwnerData.hooks[i].result},\r\n hookName,\r\n options\r\n })\r\n )\r\n }\r\n options.consoleGroupEnd()\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n logOwnerReasons: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseReduce;\n","var arrayReduce = require('./_arrayReduce'),\n baseEach = require('./_baseEach'),\n baseIteratee = require('./_baseIteratee'),\n baseReduce = require('./_baseReduce'),\n isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n","var baseHas = require('./_baseHas'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nmodule.exports = baseIsRegExp;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar dateTag = '[object Date]';\n\n/**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\nfunction baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n}\n\nmodule.exports = baseIsDate;\n","var baseIsDate = require('./_baseIsDate'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsDate = nodeUtil && nodeUtil.isDate;\n\n/**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\nvar isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\nmodule.exports = isDate;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false}),\r\n ownerDifferences: prevOwnerData != null && nextOwnerData != null ? {\r\n propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props),\r\n stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state),\r\n hookDifferences: prevOwnerData.hooks.map(({hookName, result}, i) => ({\r\n hookName,\r\n differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, {shallow: false})\r\n }))\r\n } : false\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options, ownerDataMap}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n ownerDataMap,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseRest = require('./_baseRest'),\n eq = require('./eq'),\n isIterateeCall = require('./_isIterateeCall'),\n keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options,\r\n ownerDataMap\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options, ownerDataMap, hooksRef){\r\n const nextHook = hookPath ? get(hookResult, hookPath) : hookResult\r\n hooksRef.current.push({hookName, result: nextHook})\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n const ownerDataMap = new WeakMap()\r\n const hooksRef = {current: []}\r\n\r\n // Intercept assignments to ReactCurrentOwner.current and reset hooksRef\r\n let currentOwner = null\r\n Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', {\r\n get(){\r\n return currentOwner\r\n },\r\n set(value){\r\n currentOwner = value\r\n hooksRef.current = []\r\n }\r\n })\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap)\r\n\r\n const element = origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n if(options.logOwnerReasons){\r\n const OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n if(OwnerInstance != null){\r\n const Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type\r\n const displayName = getDisplayName(Component)\r\n ownerDataMap.set(element.props, {\r\n Component,\r\n displayName,\r\n props: OwnerInstance.pendingProps,\r\n state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null,\r\n hooks: hooksRef.current\r\n })\r\n }\r\n }\r\n\r\n return element\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["Array","isArray","global","Object","freeSelf","self","freeGlobal","Function","root","Symbol","objectProto","prototype","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","value","isOwn","call","tag","unmasked","e","result","getRawTag","objectToString","isObjectLike","baseGetTag","reIsDeepProp","reIsPlainProp","object","type","isSymbol","test","uid","isObject","maskSrcKey","exec","coreJsData","keys","IE_PROTO","func","funcToString","reIsHostCtor","funcProto","reIsNative","RegExp","replace","isMasked","isFunction","toSource","key","getValue","baseIsNative","getNative","this","__data__","nativeCreate","size","has","data","Hash","entries","index","length","clear","entry","set","hashClear","hashDelete","get","hashGet","hashHas","hashSet","other","array","eq","splice","assocIndexOf","pop","push","ListCache","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","hash","map","Map","string","isKeyable","getMapData","MapCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","memoize","resolver","TypeError","memoized","args","arguments","apply","cache","Cache","rePropName","reEscapeChar","memoizeCapped","charCodeAt","match","number","quote","subString","iteratee","symbolProto","symbolToString","baseToString","arrayMap","isKey","stringToPath","path","castPath","toKey","defaultValue","baseGet","diffTypes","hasSymbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","ownerDataMap","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","ownerDifferences","prevOwnerData","nextOwnerData","props","state","i","hooks","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","name","render","_isString","accumulator","initAccum","fromRight","keysFunc","iterable","createBaseFor","n","propertyIsEnumerable","baseIsArguments","freeExports","exports","nodeType","freeModule","Buffer","isBuffer","stubFalse","reIsUint","typedArrayTags","isLength","freeProcess","process","nodeUtil","types","require","binding","nodeIsTypedArray","isTypedArray","baseUnary","baseIsTypedArray","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","baseTimes","String","isIndex","Ctor","constructor","transform","arg","overArg","isPrototype","nativeKeys","isArrayLike","arrayLikeKeys","baseKeys","eachFunc","collection","createBaseEach","baseFor","pairs","LARGE_ARRAY_SIZE","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","SetCache","add","setCacheAdd","setCacheHas","predicate","bitmask","customizer","equalFunc","stack","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","arraySome","othIndex","cacheHas","Uint8Array","symbolValueOf","valueOf","byteLength","byteOffset","buffer","message","convert","mapToArray","setToArray","equalArrays","offset","symbolsFunc","arrayPush","resIndex","nativeGetSymbols","getOwnPropertySymbols","arrayFilter","symbol","stubArray","baseGetAllKeys","getSymbols","objProps","getAllKeys","objLength","skipCtor","objValue","objCtor","othCtor","dataViewCtorString","DataView","mapCtorString","promiseCtorString","Promise","setCtorString","Set","weakMapCtorString","WeakMap","getTag","ArrayBuffer","resolve","ctorString","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsEqual","baseIsEqualDeep","source","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isStrictComparable","getMatchData","matchesStrictComparable","baseIsMatch","hasFunc","hasPath","baseHasIn","hasIn","baseProperty","basePropertyDeep","identity","baseMatchesProperty","baseMatches","property","arrayReduce","baseReduce","baseIteratee","baseEach","baseHas","nodeIsRegExp","isRegExp","baseIsRegExp","nodeIsDate","isDate","baseIsDate","getPrototypeOf","objectCtorString","proto","getPrototype","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","$$typeof","trackDiff","a","b","diffsAccumulator","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","_isDate","getTime","_isRegExp","reactElementPropsAreDeepEqual","_isFunction","_isPlainObject","_keys","_has","error","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","_reduce","deepEqualDiffs","getUpdateReason","getUpdateInfo","isReactClassComponent","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","thisArg","nativeMax","Math","max","start","otherArgs","defineProperty","configurable","enumerable","constant","writable","nativeNow","Date","now","count","lastCalled","stamp","remaining","shortOut","baseSetToString","setToString","overRest","nativeKeysIn","isProto","baseKeysIn","baseRest","sources","guard","isIterateeCall","keysIn","propsIndex","propsLength","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","context","_WDYR","renderNumber","origRender","super","_this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hooksRef","hookPath","_get","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","WDYRPatchedComponent","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","logOwnerReasons","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","currentOwner","componentNameOrComponent","isShouldTrack","rest","customName","element","OwnerInstance","pendingProps","stateNode","errorInfo","assign","factory","bind","nativeHooks","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/whyDidYouRender.js b/dist/umd/whyDidYouRender.js index 52163c2..dbd594c 100644 --- a/dist/umd/whyDidYouRender.js +++ b/dist/umd/whyDidYouRender.js @@ -1,8 +1,8 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ (function (global, factory) { @@ -1535,7 +1535,8 @@ nextState = updateInfo.nextState, nextHook = updateInfo.nextHook, reason = updateInfo.reason, - options = updateInfo.options; + options = updateInfo.options, + ownerDataMap = updateInfo.ownerDataMap; if (!shouldLog(reason, Component, options)) { return; @@ -1591,6 +1592,66 @@ }); } + if (reason.propsDifferences && reason.ownerDifferences) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); + options.consoleGroup("Rendered by ".concat(nextOwnerData.displayName)); + var _prefixMessage = 'Re-rendered because'; + + if (reason.ownerDifferences.propsDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'props', + differences: reason.ownerDifferences.propsDifferences, + values: { + prev: prevOwnerData.props, + next: nextOwnerData.props + }, + options: options + }); + _prefixMessage = 'And because'; + } + + if (reason.ownerDifferences.stateDifferences) { + logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'state', + differences: reason.ownerDifferences.stateDifferences, + values: { + prev: prevOwnerData.state, + next: nextOwnerData.state + }, + options: options + }); + } + + if (reason.ownerDifferences.hookDifferences) { + reason.ownerDifferences.hookDifferences.forEach(function (_ref3, i) { + var hookName = _ref3.hookName, + differences = _ref3.differences; + return logDifference({ + Component: nextOwnerData.Component, + displayName: nextOwnerData.displayName, + prefixMessage: _prefixMessage, + diffObjType: 'hook', + differences: differences, + values: { + prev: prevOwnerData.hooks[i].result, + next: nextOwnerData.hooks[i].result + }, + hookName: hookName, + options: options + }); + }); + } + + options.consoleGroupEnd(); + } + if (!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences) { options.consoleLog(_defineProperty({}, displayName, Component), 'Re-rendered although props and state objects are the same.', 'This usually means there was a call to this.forceUpdate() inside the component.', "more info at ".concat(moreInfoUrl)); } @@ -1638,6 +1699,7 @@ consoleGroup: consoleGroup, consoleGroupEnd: consoleGroupEnd, logOnDifferentValues: false, + logOwnerReasons: false, trackHooks: true, titleColor: '#058', diffNameColor: 'blue', @@ -3895,27 +3957,44 @@ }, []); } - function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) { + function getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) { + var prevOwnerData = ownerDataMap.get(prevProps); + var nextOwnerData = ownerDataMap.get(nextProps); return { propsDifferences: findObjectsDifferences(prevProps, nextProps), stateDifferences: findObjectsDifferences(prevState, nextState), hookDifferences: findObjectsDifferences(prevHook, nextHook, { shallow: false - }) + }), + ownerDifferences: prevOwnerData != null && nextOwnerData != null ? { + propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props), + stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state), + hookDifferences: prevOwnerData.hooks.map(function (_ref, i) { + var hookName = _ref.hookName, + result = _ref.result; + return { + hookName: hookName, + differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, { + shallow: false + }) + }; + }) + } : false }; } - function getUpdateInfo(_ref) { - var Component = _ref.Component, - displayName = _ref.displayName, - hookName = _ref.hookName, - prevProps = _ref.prevProps, - prevState = _ref.prevState, - prevHook = _ref.prevHook, - nextProps = _ref.nextProps, - nextState = _ref.nextState, - nextHook = _ref.nextHook, - options = _ref.options; + function getUpdateInfo(_ref2) { + var Component = _ref2.Component, + displayName = _ref2.displayName, + hookName = _ref2.hookName, + prevProps = _ref2.prevProps, + prevState = _ref2.prevState, + prevHook = _ref2.prevHook, + nextProps = _ref2.nextProps, + nextState = _ref2.nextState, + nextHook = _ref2.nextHook, + options = _ref2.options, + ownerDataMap = _ref2.ownerDataMap; return { Component: Component, displayName: displayName, @@ -3927,7 +4006,8 @@ nextState: nextState, nextHook: nextHook, options: options, - reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook) + ownerDataMap: ownerDataMap, + reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap) }; } @@ -4335,7 +4415,7 @@ var defaults_1 = defaults; - function patchClassComponent(ClassComponent, displayName, React, options) { + function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap) { var WDYRPatchedClassComponent = /*#__PURE__*/function (_ClassComponent) { _inherits(WDYRPatchedClassComponent, _ClassComponent); @@ -4385,7 +4465,8 @@ prevState: this._WDYR.prevState, nextProps: this.props, nextState: this.state, - options: options + options: options, + ownerDataMap: ownerDataMap })); } @@ -4416,7 +4497,7 @@ }; }; - function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options) { + function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap) { var FunctionalComponent = typeof FunctionalOrStringComponent === 'string' ? getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) : FunctionalOrStringComponent; function WDYRFunctionalComponent() { @@ -4431,7 +4512,8 @@ displayName: displayName, prevProps: prevProps, nextProps: nextProps, - options: options + options: options, + ownerDataMap: ownerDataMap }); var shouldNotify = updateInfo.reason.propsDifferences && !(isPure && updateInfo.reason.propsDifferences.length === 0); @@ -4455,13 +4537,13 @@ return WDYRFunctionalComponent; } - function patchMemoComponent(MemoComponent, displayName, React, options) { + function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap) { var InnerMemoComponent = MemoComponent.type; var isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent); var isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent); var isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent); var WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ? InnerMemoComponent.render : InnerMemoComponent; - var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options); + var PatchedInnerComponent = isInnerMemoComponentAClassComponent ? patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : isInnerMemoComponentAnotherMemoComponent ? patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) : patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap); try { PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent); @@ -4484,11 +4566,11 @@ return WDYRMemoizedFunctionalComponent; } - function patchForwardRefComponent(ForwardRefComponent, displayName, React, options) { + function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap) { var InnerForwardRefComponent = ForwardRefComponent.render; var isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent); var WrappedFunctionalComponent = isInnerComponentMemoized ? InnerForwardRefComponent.type : InnerForwardRefComponent; - var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options); + var WDYRWrappedByReactForwardRefFunctionalComponent = patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap); WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent); WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent; @@ -4508,8 +4590,13 @@ var initialHookValue = Symbol('initial-hook-value'); - function trackHookChanges(hookName, _ref, hookResult, React, options) { + function trackHookChanges(hookName, _ref, hookResult, React, options, ownerDataMap, hooksRef) { var hookPath = _ref.path; + var nextHook = hookPath ? get_1(hookResult, hookPath) : hookResult; + hooksRef.current.push({ + hookName: hookName, + result: nextHook + }); var ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; var prevHookResultRef = React.useRef(initialHookValue); @@ -4540,8 +4627,9 @@ displayName: displayName, hookName: hookName, prevHook: hookPath ? get_1(prevHookResult, hookPath) : prevHookResult, - nextHook: hookPath ? get_1(hookResult, hookPath) : hookResult, - options: options + nextHook: nextHook, + options: options, + ownerDataMap: ownerDataMap }); if (notification.reason.hookDifferences) { @@ -4552,28 +4640,28 @@ return hookResult; } - function createPatchedComponent(componentsMap, Component, displayName, React, options) { + function createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (isMemoComponent(Component)) { - return patchMemoComponent(Component, displayName, React, options); + return patchMemoComponent(Component, displayName, React, options, ownerDataMap); } if (isForwardRefComponent(Component)) { - return patchForwardRefComponent(Component, displayName, React, options); + return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap); } if (isReactClassComponent(Component)) { - return patchClassComponent(Component, displayName, React, options); + return patchClassComponent(Component, displayName, React, options, ownerDataMap); } - return patchFunctionalOrStrComponent(Component, false, displayName, React, options); + return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap); } - function getPatchedComponent(componentsMap, Component, displayName, React, options) { + function getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap) { if (componentsMap.has(Component)) { return componentsMap.get(Component); } - var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options); + var WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap); componentsMap.set(Component, WDYRPatchedComponent); return WDYRPatchedComponent; } @@ -4593,6 +4681,21 @@ var origCreateElement = React.createElement; var origCreateFactory = React.createFactory; var componentsMap = new WeakMap(); + var ownerDataMap = new WeakMap(); + var hooksRef = { + current: [] + }; // Intercept assignments to ReactCurrentOwner.current and reset hooksRef + + var currentOwner = null; + Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', { + get: function get() { + return currentOwner; + }, + set: function set(value) { + currentOwner = value; + hooksRef.current = []; + } + }); React.createElement = function (componentNameOrComponent) { var isShouldTrack = null; @@ -4613,8 +4716,28 @@ if (isShouldTrack) { displayName = componentNameOrComponent && componentNameOrComponent.whyDidYouRender && componentNameOrComponent.whyDidYouRender.customName || getDisplayName(componentNameOrComponent); - WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options); - return origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap); + var element = origCreateElement.apply(React, [WDYRPatchedComponent].concat(rest)); + + if (options.logOwnerReasons) { + var OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current; + + if (OwnerInstance != null) { + var Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type; + + var _displayName = getDisplayName(Component); + + ownerDataMap.set(element.props, { + Component: Component, + displayName: _displayName, + props: OwnerInstance.pendingProps, + state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null, + hooks: hooksRef.current + }); + } + } + + return element; } } catch (e) { options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', { @@ -4668,7 +4791,7 @@ } var hookResult = originalHook.call.apply(originalHook, [this].concat(args)); - trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options); + trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef); return hookResult; }; diff --git a/dist/umd/whyDidYouRender.min.js b/dist/umd/whyDidYouRender.min.js index 9a23ee8..0becdc5 100644 --- a/dist/umd/whyDidYouRender.min.js +++ b/dist/umd/whyDidYouRender.min.js @@ -1,9 +1,9 @@ /** - * @welldone-software/why-did-you-render 4.0.8 + * @welldone-software/why-did-you-render 4.1.0-alpha.0 * MIT Licensed * Generated by Vitali Zaidman (https://github.com/vzaidman) - * Generated at 2020-04-15 + * Generated at 2020-04-18 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).whyDidYouRender=t()}(this,(function(){"use strict";function e(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1};var he=function(e,t){var r=this.__data__,n=se(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function de(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t0?(f.consoleLog(t({},n,r),"".concat(a," of ").concat(i," changes:")),c.forEach((function(e){var r=e.pathString,n=e.diffType,a=e.prevValue,c=e.nextValue;f.consoleGroup("%c".concat("hook"===i?"[hook ".concat(o," result]"):"".concat(i,"."),"%c").concat(r,"%c"),"color:".concat(f.diffNameColor,";"),"color:".concat(f.diffPathColor,";"),"color:default;"),f.consoleLog("".concat(Xe[n]," (more info at ").concat(o?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),f.consoleLog(t({},"prev ".concat(r),a),"!==",t({},"next ".concat(r),c)),f.consoleGroupEnd()}))):c&&(f.consoleLog(t({},n,r),"".concat(a," the ").concat(i," object itself changed but its values are all equal."),"props"===i?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),f.consoleLog("prev ".concat(i,":"),u.prev," !== ",u.next,":next ".concat(i)))}function tt(e){var r=e.Component,n=e.displayName,o=e.hookName,a=e.prevProps,i=e.prevState,c=e.prevHook,u=e.nextProps,f=e.nextState,s=e.nextHook,l=e.reason,p=e.options;if(function(e,t,r){return!Ze&&(!!r.logOnDifferentValues||(!(!t.whyDidYouRender||!t.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===$e}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===$e}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===$e})))))}(l,r,p)){p.consoleGroup("%c".concat(n),"color: ".concat(p.titleColor,";"));var v="Re-rendered because";l.propsDifferences&&(et({Component:r,displayName:n,prefixMessage:v,diffObjType:"props",differences:l.propsDifferences,values:{prev:a,next:u},options:p}),v="And because"),l.stateDifferences&&et({Component:r,displayName:n,prefixMessage:v,diffObjType:"state",differences:l.stateDifferences,values:{prev:i,next:f},options:p}),l.hookDifferences&&et({Component:r,displayName:n,prefixMessage:v,diffObjType:"hook",differences:l.hookDifferences,values:{prev:c,next:s},hookName:o,options:p}),l.propsDifferences||l.stateDifferences||l.hookDifferences||p.consoleLog(t({},n,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),p.consoleGroupEnd()}}function rt(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(t){"idle"===t&&(Ze=!0,setTimeout((function(){Ze=!1}),e))})),tt}var nt=function(){};var ot=function(e){return"string"==typeof e||!y(e)&&E(e)&&"[object String]"==x(e)};function at(e){return e.displayName||e.name||e.type&&at(e.type)||e.render&&at(e.render)||(ot(e)?e:void 0)}var it=function(e,t,r,n){var o=-1,a=null==e?0:e.length;for(n&&a&&(r=e[++o]);++o-1&&e%1==0&&e-1&&e%1==0&&e<=9007199254740991},mt={};mt["[object Float32Array]"]=mt["[object Float64Array]"]=mt["[object Int8Array]"]=mt["[object Int16Array]"]=mt["[object Int32Array]"]=mt["[object Uint8Array]"]=mt["[object Uint8ClampedArray]"]=mt["[object Uint16Array]"]=mt["[object Uint32Array]"]=!0,mt["[object Arguments]"]=mt["[object Array]"]=mt["[object ArrayBuffer]"]=mt["[object Boolean]"]=mt["[object DataView]"]=mt["[object Date]"]=mt["[object Error]"]=mt["[object Function]"]=mt["[object Map]"]=mt["[object Number]"]=mt["[object Object]"]=mt["[object RegExp]"]=mt["[object Set]"]=mt["[object String]"]=mt["[object WeakMap]"]=!1;var _t=function(e){return E(e)&>(e.length)&&!!mt[x(e)]};var jt=function(e){return function(t){return e(t)}},Ot=d((function(e,t){var r=t&&!t.nodeType&&t,n=r&&e&&!e.nodeType&&e,o=n&&n.exports===r&&b.process,a=function(){try{var e=n&&n.require&&n.require("util").types;return e||o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=a})),wt=Ot&&Ot.isTypedArray,kt=wt?jt(wt):_t,Dt=Object.prototype.hasOwnProperty;var St=function(e,t){var r=y(e),n=!r&&vt(e),o=!r&&!n&&ht(e),a=!r&&!n&&!o&&kt(e),i=r||n||o||a,c=i?ut(e.length,String):[],u=c.length;for(var f in e)!t&&!Dt.call(e,f)||i&&("length"==f||o&&("offset"==f||"parent"==f)||a&&("buffer"==f||"byteLength"==f||"byteOffset"==f)||bt(f,u))||c.push(f);return c},Rt=Object.prototype;var Pt=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Rt)};var xt=function(e,t){return function(r){return e(t(r))}},Et=xt(Object.keys,Object),At=Object.prototype.hasOwnProperty;var Nt=function(e){if(!Pt(e))return Et(e);var t=[];for(var r in Object(e))At.call(e,r)&&"constructor"!=r&&t.push(r);return t};var Ct=function(e){return null!=e&>(e.length)&&!z(e)};var Tt=function(e){return Ct(e)?St(e):Nt(e)};var Ht=function(e,t){return function(r,n){if(null==r)return r;if(!Ct(r))return e(r,n);for(var o=r.length,a=t?o:-1,i=Object(r);(t?a--:++ac))return!1;var f=a.get(e);if(f&&a.get(t))return f==t;var s=-1,l=!0,p=2&r?new Bt:void 0;for(a.set(e,t),a.set(t,e);++s3&&void 0!==arguments[3]?arguments[3]:"";if(t===r)return!0;if(!t||!r)return un(t,r,n,o,$e);if(y(t)&&y(r)){var a=t.length;if(a!==r.length)return un(t,r,n,o,$e);for(var i=!0,c=a;0!=c--;)e(t[c],r[c],n,"".concat(o,"[").concat(c,"]"))||(i=!1);return un(t,r,n,o,i?Ve:$e)}if(Kr(t)&&Kr(r))return t.getTime()===r.getTime()?un(t,r,n,o,Ue):un(t,r,n,o,$e);if(Gr(t)&&Gr(r))return t.toString()===r.toString()?un(t,r,n,o,Be):un(t,r,n,o,$e);if(on&&t instanceof Element&&r instanceof Element)return un(t,r,n,o,$e);if(cn(t)&&cn(r)){if(t.type!==r.type)return un(t,r,n,o,$e);var u=e(t.props,r.props,n,"".concat(o,".props"));return un(t,r,n,o,u?Ge:$e)}if(z(t)&&z(r))return t.name===r.name?un(t,r,n,o,qe):un(t,r,n,o,$e);if(nn(t)&&nn(r)){var f=Tt(t),s=f.length;if(s!==Tt(r).length)return un(t,r,n,o,$e);for(var l=s;0!=l--;)if(!Vr(r,f[l]))return un(t,r,n,o,$e);for(var p=!0,v=s;0!=v--;){var h=f[v];e(t[h],r[h],n,"".concat(o,".").concat(h))||(p=!1)}return un(t,r,n,o,p?Ve:$e)}return un(t,r,n,o,$e)}(e,t,n,r),n}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var sn={};function ln(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.shallow,a=void 0===o||o;if(e===t)return!1;if(!a)return fn(e,t);var i=e||sn,c=t||sn,u=Object.keys(n({},i,{},c));return Ir(u,(function(e,t){var r=fn(i[t],c[t],t);return r&&(e=[].concat(l(e),l(r))),e}),[])}function pn(e,t,r,n,o,a){return{propsDifferences:ln(e,n),stateDifferences:ln(t,o),hookDifferences:ln(r,a,{shallow:!1})}}function vn(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,u=e.nextState,f=e.nextHook;return{Component:t,displayName:r,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:u,nextHook:f,options:e.options,reason:pn(o,a,i,c,u,f)}}function yn(e){return e.prototype&&!!e.prototype.isReactComponent}function hn(e){return e.$$typeof===Ke}function dn(e){return e.$$typeof===Qe}function bn(e){var t=e.Component,r=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,t){return t.exclude&&t.exclude.length>0&&t.exclude.some((function(t){return t.test(e)}))}(r,n)&&(!1!==t.whyDidYouRender&&((!a||!t.whyDidYouRender||!1!==t.whyDidYouRender.trackHooks)&&!!(t.whyDidYouRender||n.trackAllPureComponents&&(t&&t.prototype instanceof o.PureComponent||hn(t))||function(e,t){return t.include&&t.include.length>0&&t.include.some((function(t){return t.test(e)}))}(r,n))))}var gn=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)},mn=Math.max;var _n=function(e,t,r){return t=mn(void 0===t?e.length-1:t,0),function(){for(var n=arguments,o=-1,a=mn(n.length-t,0),i=Array(a);++o0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(wn);var Sn=function(e,t){return Dn(_n(e,t,Hr),e+"")};var Rn=function(e,t,r){if(!H(r))return!1;var n=typeof t;return!!("number"==n?Ct(r)&&bt(t,r.length):"string"==n&&t in r)&&fe(r[t],e)};var Pn=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t},xn=Object.prototype.hasOwnProperty;var En=function(e){if(!H(e))return Pn(e);var t=Pt(e),r=[];for(var n in e)("constructor"!=n||!t&&xn.call(e,n))&&r.push(n);return r};var An=function(e){return Ct(e)?St(e,!0):En(e)},Nn=Object.prototype,Cn=Nn.hasOwnProperty,Tn=Sn((function(e,t){e=Object(e);var r=-1,n=t.length,o=n>2?t[2]:void 0;for(o&&Rn(t[0],t[1],o)&&(n=1);++r0&&void 0!==arguments[0]?arguments[0]:{},t=console.group,r=console.groupEnd;e.collapseGroups?t=console.groupCollapsed:e.onlyLogs&&(t=console.log,r=nt);var o=e.notifier||rt("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return n({include:null,exclude:null,notifier:o,onlyLogs:!1,consoleLog:console.log,consoleGroup:t,consoleGroupEnd:r,logOnDifferentValues:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(t),o=e.createElement,a=e.createFactory,i=new WeakMap;if(e.createElement=function(t){for(var n=null,a=null,c=null,u=arguments.length,f=new Array(u>1?u-1:0),s=1;se.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1};var he=function(e,t){var r=this.__data__,n=se(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function de(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t0?(f.consoleLog(t({},n,r),"".concat(a," of ").concat(i," changes:")),c.forEach((function(e){var r=e.pathString,n=e.diffType,a=e.prevValue,c=e.nextValue;f.consoleGroup("%c".concat("hook"===i?"[hook ".concat(o," result]"):"".concat(i,"."),"%c").concat(r,"%c"),"color:".concat(f.diffNameColor,";"),"color:".concat(f.diffPathColor,";"),"color:default;"),f.consoleLog("".concat(Xe[n]," (more info at ").concat(o?"http://bit.ly/wdyr3":"http://bit.ly/wdyr02",")")),f.consoleLog(t({},"prev ".concat(r),a),"!==",t({},"next ".concat(r),c)),f.consoleGroupEnd()}))):c&&(f.consoleLog(t({},n,r),"".concat(a," the ").concat(i," object itself changed but its values are all equal."),"props"===i?"This could have been avoided by making the component pure, or by preventing its father from re-rendering.":"This usually means this component called setState when no changes in its state actually occurred.","More info at ".concat("http://bit.ly/wdyr02")),f.consoleLog("prev ".concat(i,":"),u.prev," !== ",u.next,":next ".concat(i)))}function tt(e){var r=e.Component,n=e.displayName,o=e.hookName,a=e.prevProps,i=e.prevState,c=e.prevHook,u=e.nextProps,f=e.nextState,s=e.nextHook,l=e.reason,p=e.options,v=e.ownerDataMap;if(function(e,t,r){return!Ze&&(!!r.logOnDifferentValues||(!(!t.whyDidYouRender||!t.whyDidYouRender.logOnDifferentValues)||!(e.propsDifferences&&e.propsDifferences.some((function(e){return e.diffType===Ue}))||e.stateDifferences&&e.stateDifferences.some((function(e){return e.diffType===Ue}))||e.hookDifferences&&e.hookDifferences.some((function(e){return e.diffType===Ue})))))}(l,r,p)){p.consoleGroup("%c".concat(n),"color: ".concat(p.titleColor,";"));var y="Re-rendered because";if(l.propsDifferences&&(et({Component:r,displayName:n,prefixMessage:y,diffObjType:"props",differences:l.propsDifferences,values:{prev:a,next:u},options:p}),y="And because"),l.stateDifferences&&et({Component:r,displayName:n,prefixMessage:y,diffObjType:"state",differences:l.stateDifferences,values:{prev:i,next:f},options:p}),l.hookDifferences&&et({Component:r,displayName:n,prefixMessage:y,diffObjType:"hook",differences:l.hookDifferences,values:{prev:c,next:s},hookName:o,options:p}),l.propsDifferences&&l.ownerDifferences){var h=v.get(a),d=v.get(u);p.consoleGroup("Rendered by ".concat(d.displayName));var b="Re-rendered because";l.ownerDifferences.propsDifferences&&(et({Component:d.Component,displayName:d.displayName,prefixMessage:b,diffObjType:"props",differences:l.ownerDifferences.propsDifferences,values:{prev:h.props,next:d.props},options:p}),b="And because"),l.ownerDifferences.stateDifferences&&et({Component:d.Component,displayName:d.displayName,prefixMessage:b,diffObjType:"state",differences:l.ownerDifferences.stateDifferences,values:{prev:h.state,next:d.state},options:p}),l.ownerDifferences.hookDifferences&&l.ownerDifferences.hookDifferences.forEach((function(e,t){var r=e.hookName,n=e.differences;return et({Component:d.Component,displayName:d.displayName,prefixMessage:b,diffObjType:"hook",differences:n,values:{prev:h.hooks[t].result,next:d.hooks[t].result},hookName:r,options:p})})),p.consoleGroupEnd()}l.propsDifferences||l.stateDifferences||l.hookDifferences||p.consoleLog(t({},n,r),"Re-rendered although props and state objects are the same.","This usually means there was a call to this.forceUpdate() inside the component.","more info at ".concat("http://bit.ly/wdyr02")),p.consoleGroupEnd()}}function rt(e){return e&&"undefined"!=typeof module&&module.hot&&module.hot.addStatusHandler&&module.hot.addStatusHandler((function(t){"idle"===t&&(Ze=!0,setTimeout((function(){Ze=!1}),e))})),tt}var nt=function(){};var ot=function(e){return"string"==typeof e||!y(e)&&x(e)&&"[object String]"==N(e)};function at(e){return e.displayName||e.name||e.type&&at(e.type)||e.render&&at(e.render)||(ot(e)?e:void 0)}var it=function(e,t,r,n){var o=-1,a=null==e?0:e.length;for(n&&a&&(r=e[++o]);++o-1&&e%1==0&&e-1&&e%1==0&&e<=9007199254740991},gt={};gt["[object Float32Array]"]=gt["[object Float64Array]"]=gt["[object Int8Array]"]=gt["[object Int16Array]"]=gt["[object Int32Array]"]=gt["[object Uint8Array]"]=gt["[object Uint8ClampedArray]"]=gt["[object Uint16Array]"]=gt["[object Uint32Array]"]=!0,gt["[object Arguments]"]=gt["[object Array]"]=gt["[object ArrayBuffer]"]=gt["[object Boolean]"]=gt["[object DataView]"]=gt["[object Date]"]=gt["[object Error]"]=gt["[object Function]"]=gt["[object Map]"]=gt["[object Number]"]=gt["[object Object]"]=gt["[object RegExp]"]=gt["[object Set]"]=gt["[object String]"]=gt["[object WeakMap]"]=!1;var _t=function(e){return x(e)&&mt(e.length)&&!!gt[N(e)]};var jt=function(e){return function(t){return e(t)}},Ot=d((function(e,t){var r=t&&!t.nodeType&&t,n=r&&e&&!e.nodeType&&e,o=n&&n.exports===r&&b.process,a=function(){try{var e=n&&n.require&&n.require("util").types;return e||o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=a})),wt=Ot&&Ot.isTypedArray,Dt=wt?jt(wt):_t,kt=Object.prototype.hasOwnProperty;var Rt=function(e,t){var r=y(e),n=!r&&vt(e),o=!r&&!n&&ht(e),a=!r&&!n&&!o&&Dt(e),i=r||n||o||a,c=i?ut(e.length,String):[],u=c.length;for(var f in e)!t&&!kt.call(e,f)||i&&("length"==f||o&&("offset"==f||"parent"==f)||a&&("buffer"==f||"byteLength"==f||"byteOffset"==f)||bt(f,u))||c.push(f);return c},St=Object.prototype;var Et=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||St)};var Nt=function(e,t){return function(r){return e(t(r))}},xt=Nt(Object.keys,Object),Pt=Object.prototype.hasOwnProperty;var Ct=function(e){if(!Et(e))return xt(e);var t=[];for(var r in Object(e))Pt.call(e,r)&&"constructor"!=r&&t.push(r);return t};var At=function(e){return null!=e&&mt(e.length)&&!H(e)};var Tt=function(e){return At(e)?Rt(e):Ct(e)};var Mt=function(e,t){return function(r,n){if(null==r)return r;if(!At(r))return e(r,n);for(var o=r.length,a=t?o:-1,i=Object(r);(t?a--:++ac))return!1;var f=a.get(e);if(f&&a.get(t))return f==t;var s=-1,l=!0,p=2&r?new Bt:void 0;for(a.set(e,t),a.set(t,e);++s3&&void 0!==arguments[3]?arguments[3]:"";if(t===r)return!0;if(!t||!r)return un(t,r,n,o,Ue);if(y(t)&&y(r)){var a=t.length;if(a!==r.length)return un(t,r,n,o,Ue);for(var i=!0,c=a;0!=c--;)e(t[c],r[c],n,"".concat(o,"[").concat(c,"]"))||(i=!1);return un(t,r,n,o,i?$e:Ue)}if(Kr(t)&&Kr(r))return t.getTime()===r.getTime()?un(t,r,n,o,Ve):un(t,r,n,o,Ue);if(Gr(t)&&Gr(r))return t.toString()===r.toString()?un(t,r,n,o,Be):un(t,r,n,o,Ue);if(on&&t instanceof Element&&r instanceof Element)return un(t,r,n,o,Ue);if(cn(t)&&cn(r)){if(t.type!==r.type)return un(t,r,n,o,Ue);var u=e(t.props,r.props,n,"".concat(o,".props"));return un(t,r,n,o,u?Ge:Ue)}if(H(t)&&H(r))return t.name===r.name?un(t,r,n,o,qe):un(t,r,n,o,Ue);if(nn(t)&&nn(r)){var f=Tt(t),s=f.length;if(s!==Tt(r).length)return un(t,r,n,o,Ue);for(var l=s;0!=l--;)if(!$r(r,f[l]))return un(t,r,n,o,Ue);for(var p=!0,v=s;0!=v--;){var h=f[v];e(t[h],r[h],n,"".concat(o,".").concat(h))||(p=!1)}return un(t,r,n,o,p?$e:Ue)}return un(t,r,n,o,Ue)}(e,t,n,r),n}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: why-did-you-render couldn't handle circular references in props.",e.name,e.message),!1;throw e}}var sn={};function ln(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.shallow,a=void 0===o||o;if(e===t)return!1;if(!a)return fn(e,t);var i=e||sn,c=t||sn,u=Object.keys(n({},i,{},c));return Wr(u,(function(e,t){var r=fn(i[t],c[t],t);return r&&(e=[].concat(l(e),l(r))),e}),[])}function pn(e,t,r,n,o,a,i){var c=i.get(e),u=i.get(n);return{propsDifferences:ln(e,n),stateDifferences:ln(t,o),hookDifferences:ln(r,a,{shallow:!1}),ownerDifferences:null!=c&&null!=u&&{propsDifferences:ln(c.props,u.props),stateDifferences:ln(c.state,u.state),hookDifferences:c.hooks.map((function(e,t){return{hookName:e.hookName,differences:ln(e.result,u.hooks[t].result,{shallow:!1})}}))}}}function vn(e){var t=e.Component,r=e.displayName,n=e.hookName,o=e.prevProps,a=e.prevState,i=e.prevHook,c=e.nextProps,u=e.nextState,f=e.nextHook,s=e.options,l=e.ownerDataMap;return{Component:t,displayName:r,hookName:n,prevProps:o,prevState:a,prevHook:i,nextProps:c,nextState:u,nextHook:f,options:s,ownerDataMap:l,reason:pn(o,a,i,c,u,f,l)}}function yn(e){return e.prototype&&!!e.prototype.isReactComponent}function hn(e){return e.$$typeof===Ke}function dn(e){return e.$$typeof===Qe}function bn(e){var t=e.Component,r=e.displayName,n=e.options,o=e.React,a=e.isHookChange;return!function(e,t){return t.exclude&&t.exclude.length>0&&t.exclude.some((function(t){return t.test(e)}))}(r,n)&&(!1!==t.whyDidYouRender&&((!a||!t.whyDidYouRender||!1!==t.whyDidYouRender.trackHooks)&&!!(t.whyDidYouRender||n.trackAllPureComponents&&(t&&t.prototype instanceof o.PureComponent||hn(t))||function(e,t){return t.include&&t.include.length>0&&t.include.some((function(t){return t.test(e)}))}(r,n))))}var mn=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)},gn=Math.max;var _n=function(e,t,r){return t=gn(void 0===t?e.length-1:t,0),function(){for(var n=arguments,o=-1,a=gn(n.length-t,0),i=Array(a);++o0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(wn);var Rn=function(e,t){return kn(_n(e,t,Mr),e+"")};var Sn=function(e,t,r){if(!M(r))return!1;var n=typeof t;return!!("number"==n?At(r)&&bt(t,r.length):"string"==n&&t in r)&&fe(r[t],e)};var En=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t},Nn=Object.prototype.hasOwnProperty;var xn=function(e){if(!M(e))return En(e);var t=Et(e),r=[];for(var n in e)("constructor"!=n||!t&&Nn.call(e,n))&&r.push(n);return r};var Pn=function(e){return At(e)?Rt(e,!0):xn(e)},Cn=Object.prototype,An=Cn.hasOwnProperty,Tn=Rn((function(e,t){e=Object(e);var r=-1,n=t.length,o=n>2?t[2]:void 0;for(o&&Sn(t[0],t[1],o)&&(n=1);++r0&&void 0!==arguments[0]?arguments[0]:{},t=console.group,r=console.groupEnd;e.collapseGroups?t=console.groupCollapsed:e.onlyLogs&&(t=console.log,r=nt);var o=e.notifier||rt("hotReloadBufferMs"in e?e.hotReloadBufferMs:500);return n({include:null,exclude:null,notifier:o,onlyLogs:!1,consoleLog:console.log,consoleGroup:t,consoleGroupEnd:r,logOnDifferentValues:!1,logOwnerReasons:!1,trackHooks:!0,titleColor:"#058",diffNameColor:"blue",diffPathColor:"red",trackExtraHooks:[],trackAllPureComponents:!1},e)}(t),o=e.createElement,a=e.createFactory,i=new WeakMap,c=new WeakMap,u={current:[]},f=null;if(Object.defineProperty(e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,"current",{get:function(){return f},set:function(e){f=e,u.current=[]}}),e.createElement=function(t){for(var n=null,a=null,f=null,s=arguments.length,l=new Array(s>1?s-1:0),p=1;p true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","export const diffTypes = {\r\n 'different': 'different',\r\n 'deepEquals': 'deepEquals',\r\n 'date': 'date',\r\n 'regex': 'regex',\r\n 'reactElement': 'reactElement',\r\n 'function': 'function'\r\n}\r\n\r\n// copied from packages/shared/ReactSymbols.js in https://github.com/facebook/react\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nexport const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3\r\nexport const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0\r\n","import {diffTypes} from './consts'\r\n\r\nconst moreInfoUrl = 'http://bit.ly/wdyr02'\r\nconst moreInfoHooksUrl = 'http://bit.ly/wdyr3'\r\n\r\nconst diffTypesDescriptions = {\r\n [diffTypes.different]: 'different objects.',\r\n [diffTypes.deepEquals]: 'different objects that are equal by value.',\r\n [diffTypes.date]: 'different date objects with the same value.',\r\n [diffTypes.regex]: 'different regular expressions with the same value.',\r\n [diffTypes.reactElement]: 'different React elements with the same displayName.',\r\n [diffTypes.function]: 'different functions with the same name.'\r\n}\r\n\r\nlet inHotReload = false\r\n\r\nfunction shouldLog(reason, Component, options){\r\n if(inHotReload){\r\n return false\r\n }\r\n\r\n if(options.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n if(Component.whyDidYouRender && Component.whyDidYouRender.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n const hasDifferentValues = ((\r\n reason.propsDifferences &&\r\n reason.propsDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseReduce;\n","var arrayReduce = require('./_arrayReduce'),\n baseEach = require('./_baseEach'),\n baseIteratee = require('./_baseIteratee'),\n baseReduce = require('./_baseReduce'),\n isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n","var baseHas = require('./_baseHas'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nmodule.exports = baseIsRegExp;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar dateTag = '[object Date]';\n\n/**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\nfunction baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n}\n\nmodule.exports = baseIsDate;\n","var baseIsDate = require('./_baseIsDate'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsDate = nodeUtil && nodeUtil.isDate;\n\n/**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\nvar isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\nmodule.exports = isDate;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook){\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false})\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseRest = require('./_baseRest'),\n eq = require('./eq'),\n isIterateeCall = require('./_isIterateeCall'),\n keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options){\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook: hookPath ? get(hookResult, hookPath) : hookResult,\r\n options\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options)\r\n return origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["Array","isArray","global","Object","freeSelf","self","freeGlobal","Function","root","Symbol","objectProto","prototype","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","value","isOwn","call","tag","unmasked","e","result","getRawTag","objectToString","isObjectLike","baseGetTag","reIsDeepProp","reIsPlainProp","object","type","isSymbol","test","uid","isObject","maskSrcKey","exec","coreJsData","keys","IE_PROTO","func","funcToString","reIsHostCtor","funcProto","reIsNative","RegExp","replace","isMasked","isFunction","toSource","key","getValue","baseIsNative","getNative","this","__data__","nativeCreate","size","has","data","Hash","entries","index","length","clear","entry","set","hashClear","hashDelete","get","hashGet","hashHas","hashSet","other","array","eq","splice","assocIndexOf","pop","push","ListCache","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","hash","map","Map","string","isKeyable","getMapData","MapCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","memoize","resolver","TypeError","memoized","args","arguments","apply","cache","Cache","rePropName","reEscapeChar","memoizeCapped","charCodeAt","match","number","quote","subString","iteratee","symbolProto","symbolToString","baseToString","arrayMap","isKey","stringToPath","path","castPath","toKey","defaultValue","baseGet","diffTypes","hasSymbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","name","render","_isString","accumulator","initAccum","fromRight","keysFunc","iterable","props","createBaseFor","n","propertyIsEnumerable","baseIsArguments","freeExports","exports","nodeType","freeModule","Buffer","isBuffer","stubFalse","reIsUint","typedArrayTags","isLength","freeProcess","process","nodeUtil","types","require","binding","nodeIsTypedArray","isTypedArray","baseUnary","baseIsTypedArray","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","baseTimes","String","isIndex","Ctor","constructor","transform","arg","overArg","isPrototype","nativeKeys","isArrayLike","arrayLikeKeys","baseKeys","eachFunc","collection","createBaseEach","baseFor","pairs","LARGE_ARRAY_SIZE","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","SetCache","add","setCacheAdd","setCacheHas","predicate","bitmask","customizer","equalFunc","stack","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","arraySome","othIndex","cacheHas","Uint8Array","symbolValueOf","valueOf","byteLength","byteOffset","buffer","message","convert","mapToArray","setToArray","equalArrays","offset","symbolsFunc","arrayPush","resIndex","nativeGetSymbols","getOwnPropertySymbols","arrayFilter","symbol","stubArray","baseGetAllKeys","getSymbols","objProps","getAllKeys","objLength","skipCtor","objValue","objCtor","othCtor","dataViewCtorString","DataView","mapCtorString","promiseCtorString","Promise","setCtorString","Set","weakMapCtorString","WeakMap","getTag","ArrayBuffer","resolve","ctorString","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsEqual","baseIsEqualDeep","source","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isStrictComparable","getMatchData","matchesStrictComparable","baseIsMatch","hasFunc","hasPath","baseHasIn","hasIn","baseProperty","basePropertyDeep","identity","baseMatchesProperty","baseMatches","property","arrayReduce","baseReduce","baseIteratee","baseEach","baseHas","nodeIsRegExp","isRegExp","baseIsRegExp","nodeIsDate","isDate","baseIsDate","getPrototypeOf","objectCtorString","proto","getPrototype","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","$$typeof","trackDiff","a","b","diffsAccumulator","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","i","_isDate","getTime","_isRegExp","reactElementPropsAreDeepEqual","_isFunction","_isPlainObject","_keys","_has","error","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","_reduce","deepEqualDiffs","getUpdateReason","getUpdateInfo","isReactClassComponent","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","thisArg","nativeMax","Math","max","start","otherArgs","defineProperty","configurable","enumerable","constant","writable","nativeNow","Date","now","count","lastCalled","stamp","remaining","shortOut","baseSetToString","setToString","overRest","nativeKeysIn","isProto","baseKeysIn","baseRest","sources","guard","isIterateeCall","keysIn","propsIndex","propsLength","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","context","_WDYR","renderNumber","origRender","_get","_this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","state","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hookPath","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","WDYRPatchedComponent","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","componentNameOrComponent","isShouldTrack","rest","customName","errorInfo","assign","factory","bind","nativeHooks","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":";;;;;;;2vGAuBA,MAAcA,MAAMC,sNCtBpB,MAAkC,iBAAVC,GAAsBA,GAAUA,EAAOC,SAAWA,QAAUD,ECEhFE,EAA0B,iBAARC,MAAoBA,MAAQA,KAAKF,SAAWA,QAAUE,OAGjEC,GAAcF,GAAYG,SAAS,cAATA,KCHxBC,EAAKC,OCAdC,EAAcP,OAAOQ,UAGrBC,EAAiBF,EAAYE,eAO7BC,EAAuBH,EAAYI,SAGnCC,EAAiBN,EAASA,EAAOO,iBAAcC,EA6BnD,MApBA,SAAmBC,GACjB,IAAIC,EAAQP,EAAeQ,KAAKF,EAAOH,GACnCM,EAAMH,EAAMH,GAEhB,IACEG,EAAMH,QAAkBE,EACxB,IAAIK,GAAW,EACf,MAAOC,IAET,IAAIC,EAASX,EAAqBO,KAAKF,GAQvC,OAPII,IACEH,EACFD,EAAMH,GAAkBM,SAEjBH,EAAMH,IAGVS,GClCLX,EAPcV,OAAOQ,UAOcG,SAavC,MAJA,SAAwBI,GACtB,OAAOL,EAAqBO,KAAKF,ICT/BH,EAAiBN,EAASA,EAAOO,iBAAcC,EAkBnD,MATA,SAAoBC,GAClB,OAAa,MAATA,OACeD,IAAVC,EAdQ,qBADL,gBAiBJH,GAAkBA,KAAkBZ,OAAOe,GAC/CO,EAAUP,GACVQ,EAAeR,ICIrB,MAJA,SAAsBA,GACpB,OAAgB,MAATA,GAAiC,iBAATA,GCGjC,MALA,SAAkBA,GAChB,MAAuB,iBAATA,GACXS,EAAaT,IArBF,mBAqBYU,EAAWV,ICrBnCW,EAAe,mDACfC,EAAgB,QAuBpB,MAbA,SAAeZ,EAAOa,GACpB,GAAI9B,EAAQiB,GACV,OAAO,EAET,IAAIc,SAAcd,EAClB,QAAY,UAARc,GAA4B,UAARA,GAA4B,WAARA,GAC/B,MAATd,IAAiBe,EAASf,MAGvBY,EAAcI,KAAKhB,KAAWW,EAAaK,KAAKhB,IAC1C,MAAVa,GAAkBb,KAASf,OAAO4B,KCKvC,MALA,SAAkBb,GAChB,IAAIc,SAAcd,EAClB,OAAgB,MAATA,IAA0B,UAARc,GAA4B,YAARA,ICS/C,IChCMG,IDsBN,SAAoBjB,GAClB,IAAKkB,EAASlB,GACZ,OAAO,EAIT,IAAIG,EAAMO,EAAWV,GACrB,MA5BY,qBA4BLG,GA3BI,8BA2BcA,GA7BZ,0BA6B6BA,GA1B7B,kBA0BgDA,KE9B9Cb,EAAK,sBDAlB6B,GACEF,EAAM,SAASG,KAAKC,GAAcA,EAAWC,MAAQD,EAAWC,KAAKC,UAAY,KACvE,iBAAmBN,EAAO,GAc1C,MAJA,SAAkBO,GAChB,QAASL,GAAeA,KAAcK,GEZpCC,EAHYpC,SAASI,UAGIG,SAqB7B,MAZA,SAAkB4B,GAChB,GAAY,MAARA,EAAc,CAChB,IACE,OAAOC,EAAavB,KAAKsB,GACzB,MAAOnB,IACT,IACE,OAAQmB,EAAO,GACf,MAAOnB,KAEX,MAAO,ICVLqB,EAAe,8BAGfC,EAAYtC,SAASI,UACrBD,EAAcP,OAAOQ,UAGrBgC,EAAeE,EAAU/B,SAGzBF,EAAiBF,EAAYE,eAG7BkC,EAAaC,OAAO,IACtBJ,EAAavB,KAAKR,GAAgBoC,QAjBjB,sBAiBuC,QACvDA,QAAQ,yDAA0D,SAAW,KAmBhF,MARA,SAAsB9B,GACpB,SAAKkB,EAASlB,IAAU+B,EAAS/B,MAGnBgC,EAAWhC,GAAS4B,EAAaF,GAChCV,KAAKiB,EAASjC,KC/B/B,MAJA,SAAkBa,EAAQqB,GACxB,OAAiB,MAAVrB,OAAiBd,EAAYc,EAAOqB,ICO7C,MALA,SAAmBrB,EAAQqB,GACzB,IAAIlC,EAAQmC,EAAStB,EAAQqB,GAC7B,OAAOE,EAAapC,GAASA,OAAQD,KCVpBsC,EAAUpD,OAAQ,UCWrC,MALA,WACEqD,KAAKC,SAAWC,EAAeA,EAAa,MAAQ,GACpDF,KAAKG,KAAO,GCKd,OANA,SAAoBP,GAClB,IAAI5B,EAASgC,KAAKI,IAAIR,WAAeI,KAAKC,SAASL,GAEnD,OADAI,KAAKG,MAAQnC,EAAS,EAAI,EACnBA,GCJLZ,GAHcT,OAAOQ,UAGQC,eAoBjC,OATA,SAAiBwC,GACf,IAAIS,EAAOL,KAAKC,SAChB,GAAIC,EAAc,CAChB,IAAIlC,EAASqC,EAAKT,GAClB,MArBiB,8BAqBV5B,OAA4BP,EAAYO,EAEjD,OAAOZ,GAAeQ,KAAKyC,EAAMT,GAAOS,EAAKT,QAAOnC,GCpBlDL,GAHcT,OAAOQ,UAGQC,eAgBjC,OALA,SAAiBwC,GACf,IAAIS,EAAOL,KAAKC,SAChB,OAAOC,OAA8BzC,IAAd4C,EAAKT,GAAsBxC,GAAeQ,KAAKyC,EAAMT,ICG9E,OAPA,SAAiBA,EAAKlC,GACpB,IAAI2C,EAAOL,KAAKC,SAGhB,OAFAD,KAAKG,MAAQH,KAAKI,IAAIR,GAAO,EAAI,EACjCS,EAAKT,GAAQM,QAA0BzC,IAAVC,EAfV,4BAekDA,EAC9DsC,MCNT,SAASM,GAAKC,GACZ,IAAIC,GAAS,EACTC,EAAoB,MAAXF,EAAkB,EAAIA,EAAQE,OAG3C,IADAT,KAAKU,UACIF,EAAQC,GAAQ,CACvB,IAAIE,EAAQJ,EAAQC,GACpBR,KAAKY,IAAID,EAAM,GAAIA,EAAM,KAK7BL,GAAKnD,UAAUuD,MAAQG,EACvBP,GAAKnD,UAAkB,OAAI2D,GAC3BR,GAAKnD,UAAU4D,IAAMC,GACrBV,GAAKnD,UAAUiD,IAAMa,GACrBX,GAAKnD,UAAUyD,IAAMM,GAErB,OAAiBZ,GCnBjB,OALA,WACEN,KAAKC,SAAW,GAChBD,KAAKG,KAAO,GC2Bd,OAJA,SAAYzC,EAAOyD,GACjB,OAAOzD,IAAUyD,GAAUzD,GAAUA,GAASyD,GAAUA,GCb1D,OAVA,SAAsBC,EAAOxB,GAE3B,IADA,IAAIa,EAASW,EAAMX,OACZA,KACL,GAAIY,GAAGD,EAAMX,GAAQ,GAAIb,GACvB,OAAOa,EAGX,OAAQ,GCXNa,GAHa9E,MAAMW,UAGCmE,OA4BxB,OAjBA,SAAyB1B,GACvB,IAAIS,EAAOL,KAAKC,SACZO,EAAQe,GAAalB,EAAMT,GAE/B,QAAIY,EAAQ,KAIRA,GADYH,EAAKI,OAAS,EAE5BJ,EAAKmB,MAELF,GAAO1D,KAAKyC,EAAMG,EAAO,KAEzBR,KAAKG,MACA,ICbT,OAPA,SAAsBP,GACpB,IAAIS,EAAOL,KAAKC,SACZO,EAAQe,GAAalB,EAAMT,GAE/B,OAAOY,EAAQ,OAAI/C,EAAY4C,EAAKG,GAAO,ICA7C,OAJA,SAAsBZ,GACpB,OAAO2B,GAAavB,KAAKC,SAAUL,IAAQ,GCa7C,OAbA,SAAsBA,EAAKlC,GACzB,IAAI2C,EAAOL,KAAKC,SACZO,EAAQe,GAAalB,EAAMT,GAQ/B,OANIY,EAAQ,KACRR,KAAKG,KACPE,EAAKoB,KAAK,CAAC7B,EAAKlC,KAEhB2C,EAAKG,GAAO,GAAK9C,EAEZsC,MCTT,SAAS0B,GAAUnB,GACjB,IAAIC,GAAS,EACTC,EAAoB,MAAXF,EAAkB,EAAIA,EAAQE,OAG3C,IADAT,KAAKU,UACIF,EAAQC,GAAQ,CACvB,IAAIE,EAAQJ,EAAQC,GACpBR,KAAKY,IAAID,EAAM,GAAIA,EAAM,KAK7Be,GAAUvE,UAAUuD,MAAQiB,GAC5BD,GAAUvE,UAAkB,OAAIyE,GAChCF,GAAUvE,UAAU4D,IAAMc,GAC1BH,GAAUvE,UAAUiD,IAAM0B,GAC1BJ,GAAUvE,UAAUyD,IAAMmB,GAE1B,OAAiBL,MC3BP3B,EAAU/C,EAAM,OCgB1B,OATA,WACEgD,KAAKG,KAAO,EACZH,KAAKC,SAAW,CACd+B,KAAQ,IAAI1B,GACZ2B,IAAO,IAAKC,IAAOR,IACnBS,OAAU,IAAI7B,KCFlB,OAPA,SAAmB5C,GACjB,IAAIc,SAAcd,EAClB,MAAgB,UAARc,GAA4B,UAARA,GAA4B,UAARA,GAA4B,WAARA,EACrD,cAAVd,EACU,OAAVA,GCMP,OAPA,SAAoBuE,EAAKrC,GACvB,IAAIS,EAAO4B,EAAIhC,SACf,OAAOmC,GAAUxC,GACbS,EAAmB,iBAAPT,EAAkB,SAAW,QACzCS,EAAK4B,KCGX,OANA,SAAwBrC,GACtB,IAAI5B,EAASqE,GAAWrC,KAAMJ,GAAa,OAAEA,GAE7C,OADAI,KAAKG,MAAQnC,EAAS,EAAI,EACnBA,GCCT,OAJA,SAAqB4B,GACnB,OAAOyC,GAAWrC,KAAMJ,GAAKmB,IAAInB,ICGnC,OAJA,SAAqBA,GACnB,OAAOyC,GAAWrC,KAAMJ,GAAKQ,IAAIR,ICSnC,OATA,SAAqBA,EAAKlC,GACxB,IAAI2C,EAAOgC,GAAWrC,KAAMJ,GACxBO,EAAOE,EAAKF,KAIhB,OAFAE,EAAKO,IAAIhB,EAAKlC,GACdsC,KAAKG,MAAQE,EAAKF,MAAQA,EAAO,EAAI,EAC9BH,MCLT,SAASsC,GAAS/B,GAChB,IAAIC,GAAS,EACTC,EAAoB,MAAXF,EAAkB,EAAIA,EAAQE,OAG3C,IADAT,KAAKU,UACIF,EAAQC,GAAQ,CACvB,IAAIE,EAAQJ,EAAQC,GACpBR,KAAKY,IAAID,EAAM,GAAIA,EAAM,KAK7B2B,GAASnF,UAAUuD,MAAQ6B,GAC3BD,GAASnF,UAAkB,OAAIqF,GAC/BF,GAASnF,UAAU4D,IAAM0B,GACzBH,GAASnF,UAAUiD,IAAMsC,GACzBJ,GAASnF,UAAUyD,IAAM+B,GAEzB,OAAiBL,GCkBjB,SAASM,GAAQ1D,EAAM2D,GACrB,GAAmB,mBAAR3D,GAAmC,MAAZ2D,GAAuC,mBAAZA,EAC3D,MAAM,IAAIC,UAhDQ,uBAkDpB,IAAIC,EAAW,WACb,IAAIC,EAAOC,UACPrD,EAAMiD,EAAWA,EAASK,MAAMlD,KAAMgD,GAAQA,EAAK,GACnDG,EAAQJ,EAASI,MAErB,GAAIA,EAAM/C,IAAIR,GACZ,OAAOuD,EAAMpC,IAAInB,GAEnB,IAAI5B,EAASkB,EAAKgE,MAAMlD,KAAMgD,GAE9B,OADAD,EAASI,MAAQA,EAAMvC,IAAIhB,EAAK5B,IAAWmF,EACpCnF,GAGT,OADA+E,EAASI,MAAQ,IAAKP,GAAQQ,OAASd,IAChCS,EAITH,GAAQQ,MAAQd,GAEhB,OAAiBM,GC/CjB,ICtBIS,GAAa,mGAGbC,GAAe,cDOnB,SAAuBpE,GACrB,IAAIlB,EAAS4E,GAAQ1D,GAAM,SAASU,GAIlC,OAfmB,MAYfuD,EAAMhD,MACRgD,EAAMzC,QAEDd,KAGLuD,EAAQnF,EAAOmF,MACnB,OAAOnF,ECPUuF,EAAc,SAASpB,GACxC,IAAInE,EAAS,GAOb,OAN6B,KAAzBmE,EAAOqB,WAAW,IACpBxF,EAAOyD,KAAK,IAEdU,EAAO3C,QAAQ6D,IAAY,SAASI,EAAOC,EAAQC,EAAOC,GACxD5F,EAAOyD,KAAKkC,EAAQC,EAAUpE,QAAQ8D,GAAc,MAASI,GAAUD,MAElEzF,KCHT,OAXA,SAAkBoD,EAAOyC,GAKvB,IAJA,IAAIrD,GAAS,EACTC,EAAkB,MAATW,EAAgB,EAAIA,EAAMX,OACnCzC,EAASxB,MAAMiE,KAEVD,EAAQC,GACfzC,EAAOwC,GAASqD,EAASzC,EAAMZ,GAAQA,EAAOY,GAEhD,OAAOpD,GCRL8F,GAAc7G,EAASA,EAAOE,eAAYM,EAC1CsG,GAAiBD,GAAcA,GAAYxG,cAAWG,EA0B1D,OAhBA,SAASuG,EAAatG,GAEpB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAIjB,EAAQiB,GAEV,OAAOuG,GAASvG,EAAOsG,GAAgB,GAEzC,GAAIvF,EAASf,GACX,OAAOqG,GAAiBA,GAAenG,KAAKF,GAAS,GAEvD,IAAIM,EAAUN,EAAQ,GACtB,MAAkB,KAAVM,GAAkB,EAAIN,IA3BjB,EAAA,EA2BwC,KAAOM,GCN9D,OAJA,SAAkBN,GAChB,OAAgB,MAATA,EAAgB,GAAKsG,GAAatG,ICJ3C,OAPA,SAAkBA,EAAOa,GACvB,OAAI9B,EAAQiB,GACHA,EAEFwG,EAAMxG,EAAOa,GAAU,CAACb,GAASyG,GAAa7G,GAASI,KCGhE,OARA,SAAeA,GACb,GAAoB,iBAATA,GAAqBe,EAASf,GACvC,OAAOA,EAET,IAAIM,EAAUN,EAAQ,GACtB,MAAkB,KAAVM,GAAkB,EAAIN,IAdjB,EAAA,EAcwC,KAAOM,GCM9D,OAZA,SAAiBO,EAAQ6F,GAMvB,IAHA,IAAI5D,EAAQ,EACRC,GAHJ2D,EAAOC,GAASD,EAAM7F,IAGJkC,OAED,MAAVlC,GAAkBiC,EAAQC,GAC/BlC,EAASA,EAAO+F,GAAMF,EAAK5D,OAE7B,OAAQA,GAASA,GAASC,EAAUlC,OAASd,GCY/C,UALA,SAAac,EAAQ6F,EAAMG,GACzB,IAAIvG,EAAmB,MAAVO,OAAiBd,EAAY+G,GAAQjG,EAAQ6F,GAC1D,YAAkB3G,IAAXO,EAAuBuG,EAAevG,GC7BlCyG,GACE,YADFA,GAEG,aAFHA,GAGH,OAHGA,GAIF,QAJEA,GAKK,eALLA,GAMC,WAIRC,GAA8B,mBAAXzH,QAAyBA,WACrC0H,GAAkBD,GAAYzH,WAAW,cAAgB,MACzD2H,GAAyBF,GAAYzH,WAAW,qBAAuB,MCP9E4H,YACHJ,GAAsB,2BACtBA,GAAuB,mDACvBA,GAAiB,oDACjBA,GAAkB,2DAClBA,GAAyB,4DACzBA,GAAqB,+CAGpBK,IAAc,EA6BlB,SAASC,UAAeC,IAAAA,UAAWC,IAAAA,YAAaC,IAAAA,SAAUC,IAAAA,cAAeC,IAAAA,YAAaC,IAAAA,YAAaC,IAAAA,OAAQC,IAAAA,QACtGF,GAAeA,EAAY5E,OAAS,GACrC8E,EAAQC,gBAAaP,EAAcD,aAAeG,iBAAoBC,gBACtEC,EAAYI,SAAQ,gBAAEC,IAAAA,WAAYC,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,UACrDN,EAAQO,yBACe,SAAhBV,kBAAkCF,wBAAwBE,oBAAmBM,wBACzEH,EAAQQ,mCAA2BR,EAAQS,mBAAkB,kBAExET,EAAQC,qBACHX,GAAsBc,6BAA2BT,EAjDnC,sBADL,6BAoDdK,EAAQC,+BAAqBE,GAAeE,GAAY,0BAAiBF,GAAeG,IACxFN,EAAQU,sBAGJZ,IACNE,EAAQC,gBACJP,EAAcD,aACbG,kBAAqBC,0DACR,UAAhBA,EACE,4GACA,2HA9DY,yBAiEhBG,EAAQC,0BAAmBJ,OAAgBE,EAAOY,KAAM,QAASZ,EAAOa,qBAAef,KAI5E,SAASgB,GAAgBC,OAC/BrB,EAAqHqB,EAArHrB,UAAWC,EAA0GoB,EAA1GpB,YAAaC,EAA6FmB,EAA7FnB,SAAUoB,EAAmFD,EAAnFC,UAAWC,EAAwEF,EAAxEE,UAAWC,EAA6DH,EAA7DG,SAAUC,EAAmDJ,EAAnDI,UAAWC,EAAwCL,EAAxCK,UAAWC,EAA6BN,EAA7BM,SAAUC,EAAmBP,EAAnBO,OAAQrB,EAAWc,EAAXd,WAxDnH,SAAmBqB,EAAQ5B,EAAWO,UACjCT,OAIAS,EAAQsB,0BAIR7B,EAAU8B,kBAAmB9B,EAAU8B,gBAAgBD,yBAKxDD,EAAOG,kBACPH,EAAOG,iBAAiBC,MAAK,SAAAC,UAAQA,EAAKtB,WAAalB,OAEvDmC,EAAOM,kBACPN,EAAOM,iBAAiBF,MAAK,SAAAC,UAAQA,EAAKtB,WAAalB,OAEvDmC,EAAOO,iBACPP,EAAOO,gBAAgBH,MAAK,SAAAC,UAAQA,EAAKtB,WAAalB,SAqCpD2C,CAAUR,EAAQ5B,EAAWO,IAIjCA,EAAQO,yBAAkBb,oBAAyBM,EAAQ8B,qBAEvDlC,EAAgB,sBAEjByB,EAAOG,mBACRhC,GAAc,CACZC,UAAAA,EACAC,YAAAA,EACAE,cAAAA,EACAC,YAAa,QACbC,YAAauB,EAAOG,iBACpBzB,OAAQ,CAACY,KAAMI,EAAWH,KAAMM,GAChClB,QAAAA,IAEFJ,EAAgB,eAGfyB,EAAOM,kBACRnC,GAAc,CACZC,UAAAA,EACAC,YAAAA,EACAE,cAAAA,EACAC,YAAa,QACbC,YAAauB,EAAOM,iBACpB5B,OAAQ,CAACY,KAAMK,EAAWJ,KAAMO,GAChCnB,QAAAA,IAIDqB,EAAOO,iBACRpC,GAAc,CACZC,UAAAA,EACAC,YAAAA,EACAE,cAAAA,EACAC,YAAa,OACbC,YAAauB,EAAOO,gBACpB7B,OAAQ,CAACY,KAAMM,EAAUL,KAAMQ,GAC/BzB,SAAAA,EACAK,QAAAA,IAIAqB,EAAOG,kBAAqBH,EAAOM,kBAAqBN,EAAOO,iBACjE5B,EAAQC,gBACJP,EAAcD,GAChB,6DACA,yGA1Hc,yBA+HlBO,EAAQU,mBAGH,SAASqB,GAAsBC,UACjCA,GACqB,oBAAZC,QAA2BA,OAAOC,KAAOD,OAAOC,IAAIC,kBAC5DF,OAAOC,IAAIC,kBAAiB,SAAAC,GACZ,SAAXA,IACD7C,IAAc,EACd8C,YAAW,WACT9C,IAAc,IACbyC,OAMJnB,GC/IT,IAAMyB,GAAU,aC0BhB,OALA,SAAkBnK,GAChB,MAAuB,iBAATA,IACVjB,EAAQiB,IAAUS,EAAaT,IArBrB,mBAqB+BU,EAAWV,ICxB3C,SAASoK,GAAetJ,UAEnCA,EAAKyG,aACLzG,EAAKuJ,MACJvJ,EAAKA,MAAQsJ,GAAetJ,EAAKA,OACjCA,EAAKwJ,QAAUF,GAAetJ,EAAKwJ,UACnCC,GAASzJ,GAAQA,OAAOf,GCiB7B,OAbA,SAAqB2D,EAAOyC,EAAUqE,EAAaC,GACjD,IAAI3H,GAAS,EACTC,EAAkB,MAATW,EAAgB,EAAIA,EAAMX,OAKvC,IAHI0H,GAAa1H,IACfyH,EAAc9G,IAAQZ,MAEfA,EAAQC,GACfyH,EAAcrE,EAASqE,EAAa9G,EAAMZ,GAAQA,EAAOY,GAE3D,OAAO8G,GCET,OAjBA,SAAuBE,GACrB,OAAO,SAAS7J,EAAQsF,EAAUwE,GAMhC,IALA,IAAI7H,GAAS,EACT8H,EAAW3L,OAAO4B,GAClBgK,EAAQF,EAAS9J,GACjBkC,EAAS8H,EAAM9H,OAEZA,KAAU,CACf,IAAIb,EAAM2I,EAAMH,EAAY3H,IAAWD,GACvC,IAA+C,IAA3CqD,EAASyE,EAAS1I,GAAMA,EAAK0I,GAC/B,MAGJ,OAAO/J,GCPGiK,GCMd,OAVA,SAAmBC,EAAG5E,GAIpB,IAHA,IAAIrD,GAAS,EACTxC,EAASxB,MAAMiM,KAEVjI,EAAQiI,GACfzK,EAAOwC,GAASqD,EAASrD,GAE3B,OAAOxC,GCCT,OAJA,SAAyBN,GACvB,OAAOS,EAAaT,IAVR,sBAUkBU,EAAWV,ICVvCR,GAAcP,OAAOQ,UAGrBC,GAAiBF,GAAYE,eAG7BsL,GAAuBxL,GAAYwL,wBAoBrBC,GAAgB,WAAa,OAAO1F,UAApB,IAAsC0F,GAAkB,SAASjL,GACjG,OAAOS,EAAaT,IAAUN,GAAeQ,KAAKF,EAAO,YACtDgL,GAAqB9K,KAAKF,EAAO,WCftC,OAJA,WACE,OAAO,uBCVT,IAAIkL,EAA4CC,IAAYA,EAAQC,UAAYD,EAG5EE,EAAaH,GAA4CpB,IAAWA,EAAOsB,UAAYtB,EAMvFwB,EAHgBD,GAAcA,EAAWF,UAAYD,EAG5B5L,EAAKgM,YAASvL,EAsBvCwL,GAnBiBD,EAASA,EAAOC,cAAWxL,IAmBfyL,GAEjC1B,UAAiByB,KCjCbE,GAAW,mBAoBf,OAVA,SAAiBzL,EAAO+C,GACtB,IAAIjC,SAAcd,EAGlB,SAFA+C,EAAmB,MAAVA,EAfY,iBAewBA,KAGlC,UAARjC,GACU,UAARA,GAAoB2K,GAASzK,KAAKhB,KAChCA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,EAAQ+C,GCajD,OALA,SAAkB/C,GAChB,MAAuB,iBAATA,GACZA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,GA9Bb,kBC+BnB0L,GAAiB,GACrBA,GAZiB,yBAYYA,GAXZ,yBAYjBA,GAXc,sBAWYA,GAVX,uBAWfA,GAVe,uBAUYA,GATZ,uBAUfA,GATsB,8BASYA,GARlB,wBAShBA,GARgB,yBAQY,EAC5BA,GAjCc,sBAiCYA,GAhCX,kBAiCfA,GApBqB,wBAoBYA,GAhCnB,oBAiCdA,GApBkB,qBAoBYA,GAhChB,iBAiCdA,GAhCe,kBAgCYA,GA/Bb,qBAgCdA,GA/Ba,gBA+BYA,GA9BT,mBA+BhBA,GA9BgB,mBA8BYA,GA7BZ,mBA8BhBA,GA7Ba,gBA6BYA,GA5BT,mBA6BhBA,GA5BiB,qBA4BY,EAc7B,OALA,SAA0B1L,GACxB,OAAOS,EAAaT,IAClB2L,GAAS3L,EAAM+C,WAAa2I,GAAehL,EAAWV,KC3C1D,OANA,SAAmBwB,GACjB,OAAO,SAASxB,GACd,OAAOwB,EAAKxB,yBCNhB,IAAIkL,EAA4CC,IAAYA,EAAQC,UAAYD,EAG5EE,EAAaH,GAA4CpB,IAAWA,EAAOsB,UAAYtB,EAMvF8B,EAHgBP,GAAcA,EAAWF,UAAYD,GAGtB9L,EAAWyM,QAG1CC,EAAY,WACd,IAEE,IAAIC,EAAQV,GAAcA,EAAWW,SAAWX,EAAWW,QAAQ,QAAQD,MAE3E,OAAIA,GAKGH,GAAeA,EAAYK,SAAWL,EAAYK,QAAQ,QACjE,MAAO5L,QAGXyJ,UAAiBgC,KCxBbI,GAAmBJ,IAAYA,GAASK,gBAmBzBD,GAAmBE,GAAUF,IAAoBG,GCbhE3M,GAHcT,OAAOQ,UAGQC,eAqCjC,OA3BA,SAAuBM,EAAOsM,GAC5B,IAAIC,EAAQxN,EAAQiB,GAChBwM,GAASD,GAASE,GAAYzM,GAC9B0M,GAAUH,IAAUC,GAASjB,GAASvL,GACtC2M,GAAUJ,IAAUC,IAAUE,GAAUP,GAAanM,GACrD4M,EAAcL,GAASC,GAASE,GAAUC,EAC1CrM,EAASsM,EAAcC,GAAU7M,EAAM+C,OAAQ+J,QAAU,GACzD/J,EAASzC,EAAOyC,OAEpB,IAAK,IAAIb,KAAOlC,GACTsM,IAAa5M,GAAeQ,KAAKF,EAAOkC,IACvC0K,IAEQ,UAAP1K,GAECwK,IAAkB,UAAPxK,GAA0B,UAAPA,IAE9ByK,IAAkB,UAAPzK,GAA0B,cAAPA,GAA8B,cAAPA,IAEtD6K,GAAQ7K,EAAKa,KAElBzC,EAAOyD,KAAK7B,GAGhB,OAAO5B,GC5CLd,GAAcP,OAAOQ,UAgBzB,OAPA,SAAqBO,GACnB,IAAIgN,EAAOhN,GAASA,EAAMiN,YAG1B,OAAOjN,KAFqB,mBAARgN,GAAsBA,EAAKvN,WAAcD,KCE/D,OANA,SAAiBgC,EAAM0L,GACrB,OAAO,SAASC,GACd,OAAO3L,EAAK0L,EAAUC,SCPTC,GAAQnO,OAAOqC,KAAMrC,QCIlCS,GAHcT,OAAOQ,UAGQC,eAsBjC,OAbA,SAAkBmB,GAChB,IAAKwM,GAAYxM,GACf,OAAOyM,GAAWzM,GAEpB,IAAIP,EAAS,GACb,IAAK,IAAI4B,KAAOjD,OAAO4B,GACjBnB,GAAeQ,KAAKW,EAAQqB,IAAe,eAAPA,GACtC5B,EAAOyD,KAAK7B,GAGhB,OAAO5B,GCMT,OAJA,SAAqBN,GACnB,OAAgB,MAATA,GAAiB2L,GAAS3L,EAAM+C,UAAYf,EAAWhC,ICOhE,OAJA,SAAca,GACZ,OAAO0M,GAAY1M,GAAU2M,GAAc3M,GAAU4M,GAAS5M,ICFhE,OArBA,SAAwB6M,EAAUhD,GAChC,OAAO,SAASiD,EAAYxH,GAC1B,GAAkB,MAAdwH,EACF,OAAOA,EAET,IAAKJ,GAAYI,GACf,OAAOD,EAASC,EAAYxH,GAM9B,IAJA,IAAIpD,EAAS4K,EAAW5K,OACpBD,EAAQ4H,EAAY3H,GAAU,EAC9B6H,EAAW3L,OAAO0O,IAEdjD,EAAY5H,MAAYA,EAAQC,KACa,IAA/CoD,EAASyE,EAAS9H,GAAQA,EAAO8H,KAIvC,OAAO+C,GChBIC,ECAf,SAAoB/M,EAAQsF,GAC1B,OAAOtF,GAAUgN,GAAQhN,EAAQsF,EAAU7E,OCE7C,OALA,WACEgB,KAAKC,SAAW,IAAIyB,GACpB1B,KAAKG,KAAO,GCMd,OARA,SAAqBP,GACnB,IAAIS,EAAOL,KAAKC,SACZjC,EAASqC,EAAa,OAAET,GAG5B,OADAI,KAAKG,KAAOE,EAAKF,KACVnC,GCDT,OAJA,SAAkB4B,GAChB,OAAOI,KAAKC,SAASc,IAAInB,ICG3B,OAJA,SAAkBA,GAChB,OAAOI,KAAKC,SAASG,IAAIR,ICuB3B,OAhBA,SAAkBA,EAAKlC,GACrB,IAAI2C,EAAOL,KAAKC,SAChB,GAAII,aAAgBqB,GAAW,CAC7B,IAAI8J,EAAQnL,EAAKJ,SACjB,IAAKiC,IAAQsJ,EAAM/K,OAASgL,IAG1B,OAFAD,EAAM/J,KAAK,CAAC7B,EAAKlC,IACjBsC,KAAKG,OAASE,EAAKF,KACZH,KAETK,EAAOL,KAAKC,SAAW,IAAIqC,GAASkJ,GAItC,OAFAnL,EAAKO,IAAIhB,EAAKlC,GACdsC,KAAKG,KAAOE,EAAKF,KACVH,MChBT,SAAS0L,GAAMnL,GACb,IAAIF,EAAOL,KAAKC,SAAW,IAAIyB,GAAUnB,GACzCP,KAAKG,KAAOE,EAAKF,KAInBuL,GAAMvO,UAAUuD,MAAQiL,GACxBD,GAAMvO,UAAkB,OAAIyO,GAC5BF,GAAMvO,UAAU4D,IAAM8K,GACtBH,GAAMvO,UAAUiD,IAAM0L,GACtBJ,GAAMvO,UAAUyD,IAAMmL,GAEtB,OAAiBL,GCRjB,OALA,SAAqBhO,GAEnB,OADAsC,KAAKC,SAASW,IAAIlD,EAbC,6BAcZsC,MCFT,OAJA,SAAqBtC,GACnB,OAAOsC,KAAKC,SAASG,IAAI1C,ICE3B,SAASsO,GAAS1G,GAChB,IAAI9E,GAAS,EACTC,EAAmB,MAAV6E,EAAiB,EAAIA,EAAO7E,OAGzC,IADAT,KAAKC,SAAW,IAAIqC,KACX9B,EAAQC,GACfT,KAAKiM,IAAI3G,EAAO9E,IAKpBwL,GAAS7O,UAAU8O,IAAMD,GAAS7O,UAAUsE,KAAOyK,GACnDF,GAAS7O,UAAUiD,IAAM+L,GAEzB,OAAiBH,GCJjB,OAZA,SAAmB5K,EAAOgL,GAIxB,IAHA,IAAI5L,GAAS,EACTC,EAAkB,MAATW,EAAgB,EAAIA,EAAMX,SAE9BD,EAAQC,GACf,GAAI2L,EAAUhL,EAAMZ,GAAQA,EAAOY,GACjC,OAAO,EAGX,OAAO,GCPT,OAJA,SAAkB+B,EAAOvD,GACvB,OAAOuD,EAAM/C,IAAIR,ICyEnB,OA7DA,SAAqBwB,EAAOD,EAAOkL,EAASC,EAAYC,EAAWC,GACjE,IAAIC,EAjBqB,EAiBTJ,EACZK,EAAYtL,EAAMX,OAClBkM,EAAYxL,EAAMV,OAEtB,GAAIiM,GAAaC,KAAeF,GAAaE,EAAYD,GACvD,OAAO,EAGT,IAAIE,EAAUJ,EAAMzL,IAAIK,GACxB,GAAIwL,GAAWJ,EAAMzL,IAAII,GACvB,OAAOyL,GAAWzL,EAEpB,IAAIX,GAAS,EACTxC,GAAS,EACT6O,EA9BuB,EA8BfR,EAAoC,IAAIL,QAAWvO,EAM/D,IAJA+O,EAAM5L,IAAIQ,EAAOD,GACjBqL,EAAM5L,IAAIO,EAAOC,KAGRZ,EAAQkM,GAAW,CAC1B,IAAII,EAAW1L,EAAMZ,GACjBuM,EAAW5L,EAAMX,GAErB,GAAI8L,EACF,IAAIU,EAAWP,EACXH,EAAWS,EAAUD,EAAUtM,EAAOW,EAAOC,EAAOoL,GACpDF,EAAWQ,EAAUC,EAAUvM,EAAOY,EAAOD,EAAOqL,GAE1D,QAAiB/O,IAAbuP,EAAwB,CAC1B,GAAIA,EACF,SAEFhP,GAAS,EACT,MAGF,GAAI6O,GACF,IAAKI,GAAU9L,GAAO,SAAS4L,EAAUG,GACnC,IAAKC,GAASN,EAAMK,KACfJ,IAAaC,GAAYR,EAAUO,EAAUC,EAAUV,EAASC,EAAYE,IAC/E,OAAOK,EAAKpL,KAAKyL,MAEjB,CACNlP,GAAS,EACT,YAEG,GACD8O,IAAaC,IACXR,EAAUO,EAAUC,EAAUV,EAASC,EAAYE,GACpD,CACLxO,GAAS,EACT,OAKJ,OAFAwO,EAAc,OAAEpL,GAChBoL,EAAc,OAAErL,GACTnD,MC5EQhB,EAAKoQ,WCctB,OAVA,SAAoBnL,GAClB,IAAIzB,GAAS,EACTxC,EAASxB,MAAMyF,EAAI9B,MAKvB,OAHA8B,EAAIwD,SAAQ,SAAS/H,EAAOkC,GAC1B5B,IAASwC,GAAS,CAACZ,EAAKlC,MAEnBM,GCGT,OAVA,SAAoB4C,GAClB,IAAIJ,GAAS,EACTxC,EAASxB,MAAMoE,EAAIT,MAKvB,OAHAS,EAAI6E,SAAQ,SAAS/H,GACnBM,IAASwC,GAAS9C,KAEbM,GCYL8F,GAAc7G,EAASA,EAAOE,eAAYM,EAC1C4P,GAAgBvJ,GAAcA,GAAYwJ,aAAU7P,EAoFxD,OAjEA,SAAoBc,EAAQ4C,EAAOtD,EAAKwO,EAASC,EAAYC,EAAWC,GACtE,OAAQ3O,GACN,IAzBc,oBA0BZ,GAAKU,EAAOgP,YAAcpM,EAAMoM,YAC3BhP,EAAOiP,YAAcrM,EAAMqM,WAC9B,OAAO,EAETjP,EAASA,EAAOkP,OAChBtM,EAAQA,EAAMsM,OAEhB,IAlCiB,uBAmCf,QAAKlP,EAAOgP,YAAcpM,EAAMoM,aAC3BhB,EAAU,IAAIa,GAAW7O,GAAS,IAAI6O,GAAWjM,KAKxD,IAnDU,mBAoDV,IAnDU,gBAoDV,IAjDY,kBAoDV,OAAOE,IAAI9C,GAAS4C,GAEtB,IAxDW,iBAyDT,OAAO5C,EAAOwJ,MAAQ5G,EAAM4G,MAAQxJ,EAAOmP,SAAWvM,EAAMuM,QAE9D,IAxDY,kBAyDZ,IAvDY,kBA2DV,OAAOnP,GAAW4C,EAAQ,GAE5B,IAjES,eAkEP,IAAIwM,EAAUC,GAEhB,IAjES,eAkEP,IAAInB,EA5EiB,EA4ELJ,EAGhB,GAFAsB,IAAYA,EAAUE,IAElBtP,EAAO4B,MAAQgB,EAAMhB,OAASsM,EAChC,OAAO,EAGT,IAAIG,EAAUJ,EAAMzL,IAAIxC,GACxB,GAAIqO,EACF,OAAOA,GAAWzL,EAEpBkL,GAtFuB,EAyFvBG,EAAM5L,IAAIrC,EAAQ4C,GAClB,IAAInD,EAAS8P,GAAYH,EAAQpP,GAASoP,EAAQxM,GAAQkL,EAASC,EAAYC,EAAWC,GAE1F,OADAA,EAAc,OAAEjO,GACTP,EAET,IAnFY,kBAoFV,GAAIqP,GACF,OAAOA,GAAczP,KAAKW,IAAW8O,GAAczP,KAAKuD,GAG9D,OAAO,GCzFT,OAXA,SAAmBC,EAAOkE,GAKxB,IAJA,IAAI9E,GAAS,EACTC,EAAS6E,EAAO7E,OAChBsN,EAAS3M,EAAMX,SAEVD,EAAQC,GACfW,EAAM2M,EAASvN,GAAS8E,EAAO9E,GAEjC,OAAOY,GCGT,OALA,SAAwB7C,EAAQ8J,EAAU2F,GACxC,IAAIhQ,EAASqK,EAAS9J,GACtB,OAAO9B,EAAQ8B,GAAUP,EAASiQ,GAAUjQ,EAAQgQ,EAAYzP,KCQlE,OAfA,SAAqB6C,EAAOgL,GAM1B,IALA,IAAI5L,GAAS,EACTC,EAAkB,MAATW,EAAgB,EAAIA,EAAMX,OACnCyN,EAAW,EACXlQ,EAAS,KAEJwC,EAAQC,GAAQ,CACvB,IAAI/C,EAAQ0D,EAAMZ,GACd4L,EAAU1O,EAAO8C,EAAOY,KAC1BpD,EAAOkQ,KAAcxQ,GAGzB,OAAOM,GCCT,OAJA,WACE,MAAO,ICZL0K,GAHc/L,OAAOQ,UAGcuL,qBAGnCyF,GAAmBxR,OAAOyR,yBASZD,GAA+B,SAAS5P,GACxD,OAAc,MAAVA,EACK,IAETA,EAAS5B,OAAO4B,GACT8P,GAAYF,GAAiB5P,IAAS,SAAS+P,GACpD,OAAO5F,GAAqB9K,KAAKW,EAAQ+P,QANRC,GCJrC,OAJA,SAAoBhQ,GAClB,OAAOiQ,GAAejQ,EAAQS,GAAMyP,KCHlCrR,GAHcT,OAAOQ,UAGQC,eA+EjC,OAhEA,SAAsBmB,EAAQ4C,EAAOkL,EAASC,EAAYC,EAAWC,GACnE,IAAIC,EAtBqB,EAsBTJ,EACZqC,EAAWC,GAAWpQ,GACtBqQ,EAAYF,EAASjO,OAIzB,GAAImO,GAHWD,GAAWxN,GACDV,SAEMgM,EAC7B,OAAO,EAGT,IADA,IAAIjM,EAAQoO,EACLpO,KAAS,CACd,IAAIZ,EAAM8O,EAASlO,GACnB,KAAMiM,EAAY7M,KAAOuB,EAAQ/D,GAAeQ,KAAKuD,EAAOvB,IAC1D,OAAO,EAIX,IAAIgN,EAAUJ,EAAMzL,IAAIxC,GACxB,GAAIqO,GAAWJ,EAAMzL,IAAII,GACvB,OAAOyL,GAAWzL,EAEpB,IAAInD,GAAS,EACbwO,EAAM5L,IAAIrC,EAAQ4C,GAClBqL,EAAM5L,IAAIO,EAAO5C,GAGjB,IADA,IAAIsQ,EAAWpC,IACNjM,EAAQoO,GAAW,CAE1B,IAAIE,EAAWvQ,EADfqB,EAAM8O,EAASlO,IAEXuM,EAAW5L,EAAMvB,GAErB,GAAI0M,EACF,IAAIU,EAAWP,EACXH,EAAWS,EAAU+B,EAAUlP,EAAKuB,EAAO5C,EAAQiO,GACnDF,EAAWwC,EAAU/B,EAAUnN,EAAKrB,EAAQ4C,EAAOqL,GAGzD,UAAmB/O,IAAbuP,EACG8B,IAAa/B,GAAYR,EAAUuC,EAAU/B,EAAUV,EAASC,EAAYE,GAC7EQ,GACD,CACLhP,GAAS,EACT,MAEF6Q,IAAaA,EAAkB,eAAPjP,GAE1B,GAAI5B,IAAW6Q,EAAU,CACvB,IAAIE,EAAUxQ,EAAOoM,YACjBqE,EAAU7N,EAAMwJ,YAGhBoE,GAAWC,GACV,gBAAiBzQ,GAAU,gBAAiB4C,KACzB,mBAAX4N,GAAyBA,aAAmBA,GACjC,mBAAXC,GAAyBA,aAAmBA,KACvDhR,GAAS,GAKb,OAFAwO,EAAc,OAAEjO,GAChBiO,EAAc,OAAErL,GACTnD,MCjFM+B,EAAU/C,EAAM,eCAjB+C,EAAU/C,EAAM,cCApB+C,EAAU/C,EAAM,UCAZ+C,EAAU/C,EAAM,WCc1BiS,GAAqBtP,EAASuP,IAC9BC,GAAgBxP,EAASuC,IACzBkN,GAAoBzP,EAAS0P,IAC7BC,GAAgB3P,EAAS4P,IACzBC,GAAoB7P,EAAS8P,IAS7BC,GAAStR,GAGR8Q,IAnBa,qBAmBDQ,GAAO,IAAIR,GAAS,IAAIS,YAAY,MAChDzN,IA1BQ,gBA0BDwN,GAAO,IAAIxN,KAClBmN,IAzBY,oBAyBDK,GAAOL,GAAQO,YAC1BL,IAzBQ,gBAyBDG,GAAO,IAAIH,KAClBE,IAzBY,oBAyBDC,GAAO,IAAID,OACzBC,GAAS,SAAShS,GAChB,IAAIM,EAASI,EAAWV,GACpBgN,EA/BQ,mBA+BD1M,EAAsBN,EAAMiN,iBAAclN,EACjDoS,EAAanF,EAAO/K,EAAS+K,GAAQ,GAEzC,GAAImF,EACF,OAAQA,GACN,KAAKZ,GAAoB,MA/Bf,oBAgCV,KAAKE,GAAe,MAtCf,eAuCL,KAAKC,GAAmB,MArCf,mBAsCT,KAAKE,GAAe,MArCf,eAsCL,KAAKE,GAAmB,MArCf,mBAwCb,OAAOxR,IAIX,OAAiB0R,GCpCbtS,GAHcT,OAAOQ,UAGQC,eA6DjC,OA7CA,SAAyBmB,EAAQ4C,EAAOkL,EAASC,EAAYC,EAAWC,GACtE,IAAIsD,EAAWrT,EAAQ8B,GACnBwR,EAAWtT,EAAQ0E,GACnB6O,EAASF,EA1BA,iBA0BsBJ,GAAOnR,GACtC0R,EAASF,EA3BA,iBA2BsBL,GAAOvO,GAKtC+O,EA/BU,oBA4BdF,EA9BY,sBA8BHA,EA5BK,kBA4B2BA,GAIrCG,EAhCU,oBA6BdF,EA/BY,sBA+BHA,EA7BK,kBA6B2BA,GAIrCG,EAAYJ,GAAUC,EAE1B,GAAIG,GAAanH,GAAS1K,GAAS,CACjC,IAAK0K,GAAS9H,GACZ,OAAO,EAET2O,GAAW,EACXI,GAAW,EAEb,GAAIE,IAAcF,EAEhB,OADA1D,IAAUA,EAAQ,IAAId,IACdoE,GAAYjG,GAAatL,GAC7BuP,GAAYvP,EAAQ4C,EAAOkL,EAASC,EAAYC,EAAWC,GAC3D6D,GAAW9R,EAAQ4C,EAAO6O,EAAQ3D,EAASC,EAAYC,EAAWC,GAExE,KArDyB,EAqDnBH,GAAiC,CACrC,IAAIiE,EAAeJ,GAAY9S,GAAeQ,KAAKW,EAAQ,eACvDgS,EAAeJ,GAAY/S,GAAeQ,KAAKuD,EAAO,eAE1D,GAAImP,GAAgBC,EAAc,CAChC,IAAIC,EAAeF,EAAe/R,EAAOb,QAAUa,EAC/CkS,EAAeF,EAAepP,EAAMzD,QAAUyD,EAGlD,OADAqL,IAAUA,EAAQ,IAAId,IACfa,EAAUiE,EAAcC,EAAcpE,EAASC,EAAYE,IAGtE,QAAK4D,IAGL5D,IAAUA,EAAQ,IAAId,IACfgF,GAAanS,EAAQ4C,EAAOkL,EAASC,EAAYC,EAAWC,KCpDrE,OAVA,SAASmE,EAAYjT,EAAOyD,EAAOkL,EAASC,EAAYE,GACtD,OAAI9O,IAAUyD,IAGD,MAATzD,GAA0B,MAATyD,IAAmBhD,EAAaT,KAAWS,EAAagD,GACpEzD,GAAUA,GAASyD,GAAUA,EAE/ByP,GAAgBlT,EAAOyD,EAAOkL,EAASC,EAAYqE,EAAanE,KCqCzE,OA5CA,SAAqBjO,EAAQsS,EAAQC,EAAWxE,GAC9C,IAAI9L,EAAQsQ,EAAUrQ,OAClBA,EAASD,EACTuQ,GAAgBzE,EAEpB,GAAc,MAAV/N,EACF,OAAQkC,EAGV,IADAlC,EAAS5B,OAAO4B,GACTiC,KAAS,CACd,IAAIH,EAAOyQ,EAAUtQ,GACrB,GAAKuQ,GAAgB1Q,EAAK,GAClBA,EAAK,KAAO9B,EAAO8B,EAAK,MACtBA,EAAK,KAAM9B,GAEnB,OAAO,EAGX,OAASiC,EAAQC,GAAQ,CAEvB,IAAIb,GADJS,EAAOyQ,EAAUtQ,IACF,GACXsO,EAAWvQ,EAAOqB,GAClBoR,EAAW3Q,EAAK,GAEpB,GAAI0Q,GAAgB1Q,EAAK,IACvB,QAAiB5C,IAAbqR,KAA4BlP,KAAOrB,GACrC,OAAO,MAEJ,CACL,IAAIiO,EAAQ,IAAId,GAChB,GAAIY,EACF,IAAItO,EAASsO,EAAWwC,EAAUkC,EAAUpR,EAAKrB,EAAQsS,EAAQrE,GAEnE,UAAiB/O,IAAXO,EACE2S,GAAYK,EAAUlC,EAAUmC,EAA+C3E,EAAYE,GAC3FxO,GAEN,OAAO,GAIb,OAAO,GC5CT,OAJA,SAA4BN,GAC1B,OAAOA,GAAUA,IAAUkB,EAASlB,ICYtC,OAbA,SAAsBa,GAIpB,IAHA,IAAIP,EAASgB,GAAKT,GACdkC,EAASzC,EAAOyC,OAEbA,KAAU,CACf,IAAIb,EAAM5B,EAAOyC,GACb/C,EAAQa,EAAOqB,GAEnB5B,EAAOyC,GAAU,CAACb,EAAKlC,EAAOwT,GAAmBxT,IAEnD,OAAOM,GCDT,OAVA,SAAiC4B,EAAKoR,GACpC,OAAO,SAASzS,GACd,OAAc,MAAVA,IAGGA,EAAOqB,KAASoR,SACPvT,IAAbuT,GAA2BpR,KAAOjD,OAAO4B,OCMhD,OAVA,SAAqBsS,GACnB,IAAIC,EAAYK,GAAaN,GAC7B,OAAwB,GAApBC,EAAUrQ,QAAeqQ,EAAU,GAAG,GACjCM,GAAwBN,EAAU,GAAG,GAAIA,EAAU,GAAG,IAExD,SAASvS,GACd,OAAOA,IAAWsS,GAAUQ,GAAY9S,EAAQsS,EAAQC,KCL5D,OAJA,SAAmBvS,EAAQqB,GACzB,OAAiB,MAAVrB,GAAkBqB,KAAOjD,OAAO4B,IC6BzC,OAtBA,SAAiBA,EAAQ6F,EAAMkN,GAO7B,IAJA,IAAI9Q,GAAS,EACTC,GAHJ2D,EAAOC,GAASD,EAAM7F,IAGJkC,OACdzC,GAAS,IAEJwC,EAAQC,GAAQ,CACvB,IAAIb,EAAM0E,GAAMF,EAAK5D,IACrB,KAAMxC,EAAmB,MAAVO,GAAkB+S,EAAQ/S,EAAQqB,IAC/C,MAEFrB,EAASA,EAAOqB,GAElB,OAAI5B,KAAYwC,GAASC,EAChBzC,KAETyC,EAAmB,MAAVlC,EAAiB,EAAIA,EAAOkC,SAClB4I,GAAS5I,IAAWgK,GAAQ7K,EAAKa,KACjDhE,EAAQ8B,IAAW4L,GAAY5L,KCFpC,OAJA,SAAeA,EAAQ6F,GACrB,OAAiB,MAAV7F,GAAkBgT,GAAQhT,EAAQ6F,EAAMoN,KCEjD,OAZA,SAA6BpN,EAAM4M,GACjC,OAAI9M,EAAME,IAAS8M,GAAmBF,GAC7BI,GAAwB9M,GAAMF,GAAO4M,GAEvC,SAASzS,GACd,IAAIuQ,EAAW/N,GAAIxC,EAAQ6F,GAC3B,YAAqB3G,IAAbqR,GAA0BA,IAAakC,EAC3CS,GAAMlT,EAAQ6F,GACduM,GAAYK,EAAUlC,EAAUmC,KCRxC,OAJA,SAAkBvT,GAChB,OAAOA,GCJT,OANA,SAAsBkC,GACpB,OAAO,SAASrB,GACd,OAAiB,MAAVA,OAAiBd,EAAYc,EAAOqB,KCM/C,OANA,SAA0BwE,GACxB,OAAO,SAAS7F,GACd,OAAOiG,GAAQjG,EAAQ6F,KCoB3B,OAJA,SAAkBA,GAChB,OAAOF,EAAME,GAAQsN,GAAapN,GAAMF,IAASuN,GAAiBvN,ICEpE,OAjBA,SAAsB1G,GAGpB,MAAoB,mBAATA,EACFA,EAEI,MAATA,EACKkU,GAEW,iBAATlU,EACFjB,EAAQiB,GACXmU,GAAoBnU,EAAM,GAAIA,EAAM,IACpCoU,GAAYpU,GAEXqU,GAASrU,ICLlB,OATA,SAAoB2N,EAAYxH,EAAUqE,EAAaC,EAAWiD,GAMhE,OALAA,EAASC,GAAY,SAAS3N,EAAO8C,EAAO6K,GAC1CnD,EAAcC,GACTA,GAAY,EAAOzK,GACpBmG,EAASqE,EAAaxK,EAAO8C,EAAO6K,MAEnCnD,GC+BT,OAPA,SAAgBmD,EAAYxH,EAAUqE,GACpC,IAAIhJ,EAAOzC,EAAQ4O,GAAc2G,GAAcC,GAC3C9J,EAAYlF,UAAUxC,OAAS,EAEnC,OAAOvB,EAAKmM,EAAY6G,GAAarO,GAAcqE,EAAaC,EAAWgK,KC3CzE/U,GAHcT,OAAOQ,UAGQC,eAcjC,OAJA,SAAiBmB,EAAQqB,GACvB,OAAiB,MAAVrB,GAAkBnB,GAAeQ,KAAKW,EAAQqB,ICmBvD,OAJA,SAAarB,EAAQ6F,GACnB,OAAiB,MAAV7F,GAAkBgT,GAAQhT,EAAQ6F,EAAMgO,KCdjD,OAJA,SAAsB1U,GACpB,OAAOS,EAAaT,IAVN,mBAUgBU,EAAWV,ICTvC2U,GAAe7I,IAAYA,GAAS8I,YAmBzBD,GAAevI,GAAUuI,IAAgBE,GCPxD,OAJA,SAAoB7U,GAClB,OAAOS,EAAaT,IAVR,iBAUkBU,EAAWV,ICTvC8U,GAAahJ,IAAYA,GAASiJ,UAmBzBD,GAAa1I,GAAU0I,IAAcE,MCrB/B5H,GAAQnO,OAAOgW,eAAgBhW,QCK9C0C,GAAYtC,SAASI,UACrBD,GAAcP,OAAOQ,UAGrBgC,GAAeE,GAAU/B,SAGzBF,GAAiBF,GAAYE,eAG7BwV,GAAmBzT,GAAavB,KAAKjB,QA2CzC,OAbA,SAAuBe,GACrB,IAAKS,EAAaT,IA5CJ,mBA4CcU,EAAWV,GACrC,OAAO,EAET,IAAImV,EAAQC,GAAapV,GACzB,GAAc,OAAVmV,EACF,OAAO,EAET,IAAInI,EAAOtN,GAAeQ,KAAKiV,EAAO,gBAAkBA,EAAMlI,YAC9D,MAAsB,mBAARD,GAAsBA,aAAgBA,GAClDvL,GAAavB,KAAK8M,IAASkI,ICvDzBG,GAAoC,oBAAZC,QAIxBC,GAD8B,mBAAXhW,QAAyBA,WACXA,WAAW,iBAAmB,MAC/DiW,GAAiB,SAAA3U,UAAUA,EAAO4U,WAAaF,IAGrD,SAASG,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYC,UACrD4N,EAAiB9R,KAAK,CACpBkE,SAAAA,EACAD,WAAAA,EACAE,UAAWyN,EACXxN,UAAWyN,IAEN3N,IAAalB,GAgGP,SAAS+O,GAAwBH,EAAGC,EAAGG,WAE5CC,EAAQ,UA/FlB,SAASC,EAAyBN,EAAGC,EAAGC,OAAkB7N,yDAAa,MAClE2N,IAAMC,SACA,MAGLD,IAAMC,SACDF,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,OAGpDmP,EAAQP,IAAMO,EAAQN,GAAG,KACpB7S,EAAS4S,EAAE5S,UACdA,IAAW6S,EAAE7S,cACP2S,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,YAGnDoP,GAAuB,EACnBC,EAAIrT,EAAgB,GAARqT,KACdH,EAAyBN,EAAES,GAAIR,EAAEQ,GAAIP,YAAqB7N,cAAcoO,UAC1ED,GAAuB,UAKzBT,GAAUC,EAAGC,EAAGC,EAAkB7N,EAD7BmO,EACyCpP,GACAA,OAG/CsP,GAAOV,IAAMU,GAAOT,UACdD,EAAEW,YAAcV,EAAEU,UACvBZ,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,IAC9C2O,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,OAG/CwP,GAASZ,IAAMY,GAASX,UAClBD,EAAE/V,aAAegW,EAAEhW,WACxB8V,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,IAC9C2O,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,OAG/CsO,IAAkBM,aAAaL,SAAWM,aAAaN,eACjDI,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,OAGpDyO,GAAeG,IAAMH,GAAeI,GAAG,IACrCD,EAAE7U,OAAS8U,EAAE9U,YACP4U,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,QAI/CyP,EACJP,EAAyBN,EAAE9K,MAAO+K,EAAE/K,MAAOgL,YAAqB7N,oBAGhE0N,GAAUC,EAAGC,EAAGC,EAAkB7N,EAD7BwO,EACyCzP,GACAA,OAIjD0P,EAAWd,IAAMc,EAAWb,UACtBD,EAAEtL,OAASuL,EAAEvL,KAClBqL,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,IAC9C2O,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,OAG/C2P,GAAcf,IAAMe,GAAcd,GAAG,KAChCtU,EAAOqV,GAAQhB,GACf5S,EAASzB,EAAKyB,UACjBA,IAAW4T,GAAQf,GAAG7S,cAChB2S,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,QAGnD,IAAIqP,EAAIrT,EAAgB,GAARqT,SACdQ,GAAIhB,EAAGtU,EAAK8U,WACPV,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,YAIrDoP,GAAuB,EACnBC,EAAIrT,EAAgB,GAARqT,KAAW,KACvBlU,EAAMZ,EAAK8U,GACbH,EAAyBN,EAAEzT,GAAM0T,EAAE1T,GAAM2T,YAAqB7N,cAAc9F,MAC9EiU,GAAuB,UAKzBT,GAAUC,EAAGC,EAAGC,EAAkB7N,EAD7BmO,EACyCpP,GACAA,WAG3C2O,GAAUC,EAAGC,EAAGC,EAAkB7N,EAAYjB,IAMnDkP,CAAyBN,EAAGC,EAAGI,EAAOD,GAC/BC,EACR,MAAMa,MACDA,EAAM7G,SAAW6G,EAAM7G,QAAQjK,MAAM,sBAA2C,aAAlB8Q,EAAM7Q,cAOtE8Q,QAAQC,KAAK,4EAA8EF,EAAMxM,KAAMwM,EAAM7G,UACtG,QAEH6G,GC/HV,IAAMG,GAAc,GAEL,SAASC,GAAuBC,EAAaC,gEAAgC,OAAlBC,QAAAA,mBACrEF,IAAgBC,SACV,MAGLC,SACKtB,GAAwBoB,EAAaC,OAGxCE,EAAUH,GAAeF,GACzBM,EAAUH,GAAeH,GAEzBO,EAAoBtY,OAAOqC,UAAS+V,KAAYC,WAE/CE,GAAOD,GAAmB,SAACjX,EAAQ4B,OAClCuV,EAAiB3B,GAAwBuB,EAAQnV,GAAMoV,EAAQpV,GAAMA,UACxEuV,IACDnX,cACKA,KACAmX,KAGAnX,IACN,IC1BL,SAASoX,GAAgB9O,EAAWC,EAAWC,EAAUC,EAAWC,EAAWC,SACtE,CACLI,iBAAkB4N,GAAuBrO,EAAWG,GACpDS,iBAAkByN,GAAuBpO,EAAWG,GACpDS,gBAAiBwN,GAAuBnO,EAAUG,EAAU,CAACmO,SAAS,KAI3D,SAASO,UAAerQ,IAAAA,UAAWC,IAAAA,YAAaC,IAAAA,SAAUoB,IAAAA,UAAWC,IAAAA,UAAWC,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,UAAWC,IAAAA,eACtH,CACL3B,UAAAA,EACAC,YAAAA,EACAC,SAAAA,EACAoB,UAAAA,EACAC,UAAAA,EACAC,SAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAC,SAAAA,EACApB,UAXqIA,QAYrIqB,OAAQwO,GAAgB9O,EAAWC,EAAWC,EAAUC,EAAWC,EAAWC,ICJ3E,SAAS2O,GAAsBtQ,UAC7BA,EAAU7H,aAAe6H,EAAU7H,UAAUoY,iBAG/C,SAASC,GAAgBxQ,UACvBA,EAAUmO,WAAaxO,GAGzB,SAAS8Q,GAAsBzQ,UAC7BA,EAAUmO,WAAavO,GCTjB,SAAS8Q,UAAa1Q,IAAAA,UAAWC,IAAAA,YAAaM,IAAAA,QAASoQ,IAAAA,MAAOC,IAAAA,oBAR7E,SAAuB3Q,EAAaM,UAEhCA,EAAQsQ,SACRtQ,EAAQsQ,QAAQpV,OAAS,GACzB8E,EAAQsQ,QAAQ7O,MAAK,SAAA8O,UAASA,EAAMpX,KAAKuG,MAKxC8Q,CAAc9Q,EAAaM,MAIG,IAA9BP,EAAU8B,oBAIV8O,IACD5Q,EAAU8B,kBAA4D,IAAzC9B,EAAU8B,gBAAgBkP,gBAMvDhR,EAAU8B,iBACRvB,EAAQ0Q,yBACLjR,GAAaA,EAAU7H,qBAAqBwY,EAAMO,eACnDV,GAAgBxQ,KAnCxB,SAAuBC,EAAaM,UAEhCA,EAAQ4Q,SACR5Q,EAAQ4Q,QAAQ1V,OAAS,GACzB8E,EAAQ4Q,QAAQnP,MAAK,SAAA8O,UAASA,EAAMpX,KAAKuG,MAkCzCmR,CAAcnR,EAAaM,MCpB/B,OAVA,SAAerG,EAAMmX,EAASrT,GAC5B,OAAQA,EAAKvC,QACX,KAAK,EAAG,OAAOvB,EAAKtB,KAAKyY,GACzB,KAAK,EAAG,OAAOnX,EAAKtB,KAAKyY,EAASrT,EAAK,IACvC,KAAK,EAAG,OAAO9D,EAAKtB,KAAKyY,EAASrT,EAAK,GAAIA,EAAK,IAChD,KAAK,EAAG,OAAO9D,EAAKtB,KAAKyY,EAASrT,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAE3D,OAAO9D,EAAKgE,MAAMmT,EAASrT,ICdzBsT,GAAYC,KAAKC,IAgCrB,OArBA,SAAkBtX,EAAMuX,EAAO7L,GAE7B,OADA6L,EAAQH,QAAoB7Y,IAAVgZ,EAAuBvX,EAAKuB,OAAS,EAAKgW,EAAO,GAC5D,WAML,IALA,IAAIzT,EAAOC,UACPzC,GAAS,EACTC,EAAS6V,GAAUtT,EAAKvC,OAASgW,EAAO,GACxCrV,EAAQ5E,MAAMiE,KAETD,EAAQC,GACfW,EAAMZ,GAASwC,EAAKyT,EAAQjW,GAE9BA,GAAS,EAET,IADA,IAAIkW,EAAYla,MAAMia,EAAQ,KACrBjW,EAAQiW,GACfC,EAAUlW,GAASwC,EAAKxC,GAG1B,OADAkW,EAAUD,GAAS7L,EAAUxJ,GACtB8B,GAAMhE,EAAMc,KAAM0W,KCN7B,OANA,SAAkBhZ,GAChB,OAAO,WACL,OAAOA,OCnBW,WACpB,IACE,IAAIwB,EAAOa,EAAUpD,OAAQ,kBAE7B,OADAuC,EAAK,GAAI,GAAI,IACNA,EACP,MAAOnB,WCKY4Y,GAA4B,SAASzX,EAAMiD,GAChE,OAAOwU,GAAezX,EAAM,WAAY,CACtC0X,cAAgB,EAChBC,YAAc,EACdnZ,MAASoZ,GAAS3U,GAClB4U,UAAY,KALwBnF,GCPpCoF,GAAYC,KAAKC,IA+BrB,OApBA,SAAkBhY,GAChB,IAAIiY,EAAQ,EACRC,EAAa,EAEjB,OAAO,WACL,IAAIC,EAAQL,KACRM,EApBO,IAoBiBD,EAAQD,GAGpC,GADAA,EAAaC,EACTC,EAAY,GACd,KAAMH,GAzBI,IA0BR,OAAOlU,UAAU,QAGnBkU,EAAQ,EAEV,OAAOjY,EAAKgE,WAAMzF,EAAWwF,YCrBfsU,CAASC,ICK3B,OAJA,SAAkBtY,EAAMuX,GACtB,OAAOgB,GAAYC,GAASxY,EAAMuX,EAAO7E,IAAW1S,EAAO,KCgB7D,OAdA,SAAwBxB,EAAO8C,EAAOjC,GACpC,IAAKK,EAASL,GACZ,OAAO,EAET,IAAIC,SAAcgC,EAClB,SAAY,UAARhC,EACKyM,GAAY1M,IAAWkM,GAAQjK,EAAOjC,EAAOkC,QACrC,UAARjC,GAAoBgC,KAASjC,IAE7B8C,GAAG9C,EAAOiC,GAAQ9C,ICL7B,OAVA,SAAsBa,GACpB,IAAIP,EAAS,GACb,GAAc,MAAVO,EACF,IAAK,IAAIqB,KAAOjD,OAAO4B,GACrBP,EAAOyD,KAAK7B,GAGhB,OAAO5B,GCRLZ,GAHcT,OAAOQ,UAGQC,eAwBjC,OAfA,SAAoBmB,GAClB,IAAKK,EAASL,GACZ,OAAOoZ,GAAapZ,GAEtB,IAAIqZ,EAAU7M,GAAYxM,GACtBP,EAAS,GAEb,IAAK,IAAI4B,KAAOrB,GACD,eAAPqB,IAAyBgY,GAAYxa,GAAeQ,KAAKW,EAAQqB,KACrE5B,EAAOyD,KAAK7B,GAGhB,OAAO5B,GCET,OAJA,SAAgBO,GACd,OAAO0M,GAAY1M,GAAU2M,GAAc3M,GAAQ,GAAQsZ,GAAWtZ,ICtBpErB,GAAcP,OAAOQ,UAGrBC,GAAiBF,GAAYE,kBAuBlB0a,IAAS,SAASvZ,EAAQwZ,GACvCxZ,EAAS5B,OAAO4B,GAEhB,IAAIiC,GAAS,EACTC,EAASsX,EAAQtX,OACjBuX,EAAQvX,EAAS,EAAIsX,EAAQ,QAAKta,EAMtC,IAJIua,GAASC,GAAeF,EAAQ,GAAIA,EAAQ,GAAIC,KAClDvX,EAAS,KAGFD,EAAQC,GAMf,IALA,IAAIoQ,EAASkH,EAAQvX,GACjB+H,EAAQ2P,GAAOrH,GACfsH,GAAc,EACdC,EAAc7P,EAAM9H,SAEf0X,EAAaC,GAAa,CACjC,IAAIxY,EAAM2I,EAAM4P,GACZza,EAAQa,EAAOqB,SAELnC,IAAVC,GACC2D,GAAG3D,EAAOR,GAAY0C,MAAUxC,GAAeQ,KAAKW,EAAQqB,MAC/DrB,EAAOqB,GAAOiR,EAAOjR,IAK3B,OAAOrB,KCvDM,SAAS8Z,GAAoBC,EAAgBrT,EAAa0Q,EAAOpQ,OACxEgT,oaACQhQ,EAAOiQ,8HACXjQ,EAAOiQ,IAERC,MAAQ,CACXC,aAAc,OAGVC,EAAaC,iCAAgBC,EAAK7Q,cAER2Q,IAAeL,EAAenb,UAAU6K,WAEjEA,OAAS,kBACZuQ,EAA0Bpb,UAAU6K,OAAO9E,YACpCyV,kEAKNF,MAAMC,eAEN,iBAAkB1Y,KAAKyY,aACrBA,MAAMK,afrBZ,SAAsCC,WACvCC,EAAqBD,GAA0BA,EAAuBE,oBACpED,GAAmB,IANR,EAOZA,EAAmBE,YACb,EAETF,EAAqBA,gBAEhB,EeayBG,CAA6BnZ,OAIpDA,KAAKyY,MAAMK,cAAgB9Y,KAAKyY,MAAMC,aAAe,GAAM,IAC3D1Y,KAAKyY,MAAMnS,WACZf,EAAQ6T,SAAS/D,GAAc,CAC7BrQ,UAAWsT,EACXrT,YAAAA,EACAqB,UAAWtG,KAAKyY,MAAMnS,UACtBC,UAAWvG,KAAKyY,MAAMlS,UACtBE,UAAWzG,KAAKuI,MAChB7B,UAAW1G,KAAKqZ,MAChB9T,QAAAA,UAICkT,MAAMnS,UAAYtG,KAAKuI,WACvBkQ,MAAMlS,UAAYvG,KAAKqZ,OAGvBT,2EAAgC,wCA3CHN,OAgDtCC,EAA0BtT,YAAcA,EACzC,MAAMlH,cAIEwa,EAA2BD,GAE7BC,ECrDM,SAASe,GAA8BC,EAA6BC,EAAQvU,EAAa0Q,EAAOpQ,OACvGkU,EAA8D,iBAAjCF,EALa,SAACG,EAAkB/D,UAAU,SAAApN,UAC7EoN,EAAMgE,cAAcD,EAAkBnR,IAKpCqR,CAA0CL,EAA6B5D,GACvE4D,WAEOM,QACDpT,EAAYxD,UAAU,GACtB6W,EAAMnE,EAAMoE,SAEZzT,EAAYwT,EAAIE,WACtBF,EAAIE,QAAUvT,EAEXH,EAAU,KACLD,EAAagP,GAAc,CAC/BrQ,UAAWyU,EACXxU,YAAAA,EACAqB,UAAAA,EACAG,UAAAA,EACAlB,QAAAA,IAGI0U,EACJ5T,EAAWO,OAAOG,oBACdyS,GAAwD,IAA9CnT,EAAWO,OAAOG,iBAAiBtG,QAIhDwZ,GACD1U,EAAQ6T,SAAS/S,UAIdoT,eAAuBxW,eAI9B4W,EAAwB5U,YAAcA,EACvC,MAAMlH,WAIP8b,EAAwBK,0BAA4BT,KAC3CI,EAAyBJ,GAE3BI,ECtCT,IAAMM,GAAmBld,OAAO,sBAChC,SAASmd,GAAiBlV,IAA4BmV,EAAY1E,EAAOpQ,OAA9B+U,IAANlW,KAC7BmW,EAAsC5E,EAAM6E,mDAAmDC,kBAAkBT,QACjHU,EAAoB/E,EAAMoE,OAAOI,QAEnCI,SACKF,MAGHrV,EAAYuV,EAAoC/b,KAAK0b,2BAA6BK,EAAoC/b,KACtHyG,EAAc6C,GAAe9C,OAEb0Q,GAAY,CAAC1Q,UAAAA,EAAWC,YAAAA,EAAaM,QAAAA,EAASoQ,MAAAA,EAAOC,cAAc,WAEhFyE,MAGHM,EAAiBD,EAAkBV,WACzCU,EAAkBV,QAAUK,EAEzBM,IAAmBR,GAAiB,KAC/BS,EAAevF,GAAc,CACjCrQ,UAAWA,EACXC,YAAAA,EACAC,SAAAA,EACAsB,SAAU8T,EAAW1B,GAAI+B,EAAgBL,GAAYK,EACrDhU,SAAU2T,EAAW1B,GAAIyB,EAAYC,GAAYD,EACjD9U,QAAAA,IAGCqV,EAAahU,OAAOO,iBACrB5B,EAAQ6T,SAASwB,UAIdP,EAGT,SAASQ,GAAuBC,EAAe9V,EAAWC,EAAa0Q,EAAOpQ,UACzEiQ,GAAgBxQ,GC7CN,SAAS+V,EAAmBC,EAAe/V,EAAa0Q,EAAOpQ,OAC/D0V,EAAsBD,EAA5Bxc,KAED0c,EAAsC5F,GAAsB2F,GAC5DE,EAAkC1F,GAAsBwF,GACxDG,EAA2C5F,GAAgByF,GAE3DI,EAA6BF,EACjCF,EAAmBjT,OACnBiT,EAEIK,EAAwBJ,EAC5B7C,GAAoBgD,EAA4BpW,EAAa0Q,EAAOpQ,GACnE6V,EACCL,EAAmBM,EAA4BpW,EAAa0Q,EAAOpQ,GACnE+T,GAA8B+B,GAA4B,EAAMpW,EAAa0Q,EAAOpQ,OAItF+V,EAAsBrW,YAAc6C,GAAeuT,GACpD,MAAMtd,IAIPud,EAAsBpB,0BAA4Bc,KACzCM,EAAuBD,OAE1BE,EAAkC5F,EAAM6F,KAC5CL,EAAkCxF,EAAM8F,WAAWH,GAAyBA,EAC5EN,EAAcU,aAIdH,EAAgCtW,YAAcA,EAC/C,MAAMlH,cAIEwd,EAAiCP,GAEnCO,EDMER,CAAmB/V,EAAWC,EAAa0Q,EAAOpQ,GAGxDkQ,GAAsBzQ,GEnDZ,SAAkC2W,EAAqB1W,EAAa0Q,EAAOpQ,OACzEqW,EAA4BD,EAApC3T,OAED6T,EAA2BrG,GAAgBoG,GAC3CP,EAA6BQ,EACjCD,EAAyBpd,KAAOod,EAE5BE,EACJxC,GAA8B+B,EAA4BQ,EAA0B5W,EAAa0Q,EAAOpQ,GAG1GuW,EAAgD7W,YAAc6C,GAAeuT,GAC7ES,EAAgD5B,0BAA4BmB,KACnES,EAAiDT,OAEpDU,EAAoCpG,EAAM8F,WAC9CI,EACElG,EAAM6F,KAAKM,EAAiDF,EAAyBF,SACrFI,OAIFC,EAAkC9W,YAAcA,EACjD,MAAMlH,cAIEge,EAAmCJ,GAErCI,EFuBEC,CAAyBhX,EAAWC,EAAa0Q,EAAOpQ,GAG9D+P,GAAsBtQ,GAChBqT,GAAoBrT,EAAWC,EAAa0Q,EAAOpQ,GAGrD+T,GAA8BtU,GAAW,EAAOC,EAAa0Q,EAAOpQ,GAG7E,SAAS0W,GAAoBnB,EAAe9V,EAAWC,EAAa0Q,EAAOpQ,MACtEuV,EAAc1a,IAAI4E,UACZ8V,EAAc/Z,IAAIiE,OAGrBkX,EAAuBrB,GAAuBC,EAAe9V,EAAWC,EAAa0Q,EAAOpQ,UAElGuV,EAAcla,IAAIoE,EAAWkX,GACtBA,EAGF,IAAMC,GAAc,CACzBC,SAAU,CAAChY,KAAM,KACjBiY,WAAY,CAACjY,KAAM,KACnBkY,YAAY,EACZC,SAAS,GAGI,SAASzV,GAAgB6O,EAAO6G,OACvCjX,ErGlFO,eAA0BiX,yDAAc,GACjD1W,EAAe0O,QAAQiI,MACvBxW,EAAkBuO,QAAQkI,SAE3BF,EAAYG,eACb7W,EAAe0O,QAAQoI,eAEjBJ,EAAYK,WAClB/W,EAAe0O,QAAQsI,IACvB7W,EAAkB4B,QAGduR,EAAWoD,EAAYpD,UAC3B9R,GACG,sBAAuBkV,EAAeA,EAAYjV,kBAAoB,eAKzE4O,QAAS,KACTN,QAAS,KACTuD,SAAAA,EACAyD,UAAU,EACVrX,WAAYgP,QAAQsI,IACpBhX,aAAAA,EACAG,gBAAAA,EACAY,sBAAsB,EACtBmP,YAAY,EACZ3O,WAAY,OACZtB,cAAe,OACfC,cAAe,MACf+W,gBAAiB,GACjB9G,wBAAwB,GACrBuG,GqGiDWQ,CAAiBR,GAE3BS,EAAoBtH,EAAMgE,cAC1BuD,EAAoBvH,EAAMwH,cAE5BrC,EAAgB,IAAIrL,WAExBkG,EAAMgE,cAAgB,SAASyD,WACzBC,EAAgB,KAChBpY,EAAc,KACdiX,EAAuB,wBAH+BoB,mCAAAA,2BAMxDD,GAEwC,mBAA7BD,GACP5H,GAAgB4H,IAChB3H,GAAsB2H,KAExB1H,GAAY,CAAC1Q,UAAWoY,EAA0BnY,YAAa6C,GAAesV,GAA2BzH,MAAAA,EAAOpQ,QAAAA,WAIhHN,EACEmY,GACAA,EAAyBtW,iBACzBsW,EAAyBtW,gBAAgByW,YACzCzV,GAAesV,GAGjBlB,EAAuBD,GAAoBnB,EAAesC,EAA0BnY,EAAa0Q,EAAOpQ,GACjG0X,EAAkB/Z,MAAMyS,GAAQuG,UAAyBoB,IAGpE,MAAMvf,GACJwH,EAAQC,WAAW,8GAA+G,CAChIgY,UAAW,CACTjJ,MAAOxW,EACPqf,yBAAAA,EACAE,KAAAA,EACA/X,QAAAA,EACA8X,cAAAA,EACApY,YAAAA,EACAiX,qBAAAA,YAKCe,EAAkB/Z,MAAMyS,GAAQyH,UAA6BE,KAGtE3gB,OAAO8gB,OAAO9H,EAAMgE,cAAesD,GAEnCtH,EAAMwH,cAAgB,SAAA3e,OACdkf,EAAU/H,EAAMgE,cAAcgE,KAAK,KAAMnf,UAC/Ckf,EAAQlf,KAAOA,EACRkf,GAGT/gB,OAAO8gB,OAAO9H,EAAMwH,cAAeD,GAEhC3X,EAAQyQ,WAAW,KACd4H,EAAcjhB,OAAO4D,QAAQ4b,IAAala,KAAI,yBAAEiD,OAAU2Y,aACvD,CAAClI,EAAOzQ,EAAU2Y,kBAItBD,KACArY,EAAQwX,kBAGAtX,SAAQ,yBAAEqY,OAAY5Y,cAAU2Y,aAAqB,KAC1DE,EAAeD,EAAW5Y,GAC1B8Y,EAAc9Y,EAAS,GAAG+Y,cAAgB/Y,EAASgZ,MAAM,GACzDC,EAAU,sCAAYnb,2BAAAA,sBACpBqX,EAAa0D,EAAangB,WAAbmgB,GAAkB/d,aAASgD,WAC9CoX,GAAiBlV,EAAU2Y,EAAoBxD,EAAY1E,EAAOpQ,GAC3D8U,GAET1d,OAAOga,eAAewH,EAAS,OAAQ,CAACzgB,MAAOsgB,EAAajH,UAAU,IACtEpa,OAAO8gB,OAAOU,EAAS,CAACJ,aAAAA,IACxBD,EAAW5Y,GAAYiZ,YAI3BxI,EAAMyI,8BAAgC,WACpCzhB,OAAO8gB,OAAO9H,EAAO,CACnBgE,cAAesD,EACfE,cAAeD,IAGjBpC,EAAgB,iBAGXne,OAAOqC,KAAKmd,IAAala,KAAI,SAAAiD,SAAY,CAACyQ,EAAOzQ,SACjDK,EAAQwX,kBAECtX,SAAQ,yBAAEqY,OAAY5Y,OAC/B4Y,EAAW5Y,GAAU6Y,eACtBD,EAAW5Y,GAAY4Y,EAAW5Y,GAAU6Y,wBAIzCpI,EAAMyI,+BAGRzI,SG9LT7O,GAAgBV,gBAAkBA"} \ No newline at end of file +{"version":3,"file":"whyDidYouRender.min.js.map","sources":["../../node_modules/lodash/isArray.js","../../node_modules/lodash/_freeGlobal.js","../../node_modules/lodash/_root.js","../../node_modules/lodash/_Symbol.js","../../node_modules/lodash/_getRawTag.js","../../node_modules/lodash/_objectToString.js","../../node_modules/lodash/_baseGetTag.js","../../node_modules/lodash/isObjectLike.js","../../node_modules/lodash/isSymbol.js","../../node_modules/lodash/_isKey.js","../../node_modules/lodash/isObject.js","../../node_modules/lodash/isFunction.js","../../node_modules/lodash/_isMasked.js","../../node_modules/lodash/_coreJsData.js","../../node_modules/lodash/_toSource.js","../../node_modules/lodash/_baseIsNative.js","../../node_modules/lodash/_getValue.js","../../node_modules/lodash/_getNative.js","../../node_modules/lodash/_nativeCreate.js","../../node_modules/lodash/_hashClear.js","../../node_modules/lodash/_hashDelete.js","../../node_modules/lodash/_hashGet.js","../../node_modules/lodash/_hashHas.js","../../node_modules/lodash/_hashSet.js","../../node_modules/lodash/_Hash.js","../../node_modules/lodash/_listCacheClear.js","../../node_modules/lodash/eq.js","../../node_modules/lodash/_assocIndexOf.js","../../node_modules/lodash/_listCacheDelete.js","../../node_modules/lodash/_listCacheGet.js","../../node_modules/lodash/_listCacheHas.js","../../node_modules/lodash/_listCacheSet.js","../../node_modules/lodash/_ListCache.js","../../node_modules/lodash/_Map.js","../../node_modules/lodash/_mapCacheClear.js","../../node_modules/lodash/_isKeyable.js","../../node_modules/lodash/_getMapData.js","../../node_modules/lodash/_mapCacheDelete.js","../../node_modules/lodash/_mapCacheGet.js","../../node_modules/lodash/_mapCacheHas.js","../../node_modules/lodash/_mapCacheSet.js","../../node_modules/lodash/_MapCache.js","../../node_modules/lodash/memoize.js","../../node_modules/lodash/_memoizeCapped.js","../../node_modules/lodash/_stringToPath.js","../../node_modules/lodash/_arrayMap.js","../../node_modules/lodash/_baseToString.js","../../node_modules/lodash/toString.js","../../node_modules/lodash/_castPath.js","../../node_modules/lodash/_toKey.js","../../node_modules/lodash/_baseGet.js","../../node_modules/lodash/get.js","../../src/consts.js","../../src/defaultNotifier.js","../../src/normalizeOptions.js","../../node_modules/lodash/isString.js","../../src/getDisplayName.js","../../node_modules/lodash/_arrayReduce.js","../../node_modules/lodash/_createBaseFor.js","../../node_modules/lodash/_baseFor.js","../../node_modules/lodash/_baseTimes.js","../../node_modules/lodash/_baseIsArguments.js","../../node_modules/lodash/isArguments.js","../../node_modules/lodash/stubFalse.js","../../node_modules/lodash/isBuffer.js","../../node_modules/lodash/_isIndex.js","../../node_modules/lodash/isLength.js","../../node_modules/lodash/_baseIsTypedArray.js","../../node_modules/lodash/_baseUnary.js","../../node_modules/lodash/_nodeUtil.js","../../node_modules/lodash/isTypedArray.js","../../node_modules/lodash/_arrayLikeKeys.js","../../node_modules/lodash/_isPrototype.js","../../node_modules/lodash/_overArg.js","../../node_modules/lodash/_nativeKeys.js","../../node_modules/lodash/_baseKeys.js","../../node_modules/lodash/isArrayLike.js","../../node_modules/lodash/keys.js","../../node_modules/lodash/_createBaseEach.js","../../node_modules/lodash/_baseEach.js","../../node_modules/lodash/_baseForOwn.js","../../node_modules/lodash/_stackClear.js","../../node_modules/lodash/_stackDelete.js","../../node_modules/lodash/_stackGet.js","../../node_modules/lodash/_stackHas.js","../../node_modules/lodash/_stackSet.js","../../node_modules/lodash/_Stack.js","../../node_modules/lodash/_setCacheAdd.js","../../node_modules/lodash/_setCacheHas.js","../../node_modules/lodash/_SetCache.js","../../node_modules/lodash/_arraySome.js","../../node_modules/lodash/_cacheHas.js","../../node_modules/lodash/_equalArrays.js","../../node_modules/lodash/_Uint8Array.js","../../node_modules/lodash/_mapToArray.js","../../node_modules/lodash/_setToArray.js","../../node_modules/lodash/_equalByTag.js","../../node_modules/lodash/_arrayPush.js","../../node_modules/lodash/_baseGetAllKeys.js","../../node_modules/lodash/_arrayFilter.js","../../node_modules/lodash/stubArray.js","../../node_modules/lodash/_getSymbols.js","../../node_modules/lodash/_getAllKeys.js","../../node_modules/lodash/_equalObjects.js","../../node_modules/lodash/_DataView.js","../../node_modules/lodash/_Promise.js","../../node_modules/lodash/_Set.js","../../node_modules/lodash/_WeakMap.js","../../node_modules/lodash/_getTag.js","../../node_modules/lodash/_baseIsEqualDeep.js","../../node_modules/lodash/_baseIsEqual.js","../../node_modules/lodash/_baseIsMatch.js","../../node_modules/lodash/_isStrictComparable.js","../../node_modules/lodash/_getMatchData.js","../../node_modules/lodash/_matchesStrictComparable.js","../../node_modules/lodash/_baseMatches.js","../../node_modules/lodash/_baseHasIn.js","../../node_modules/lodash/_hasPath.js","../../node_modules/lodash/hasIn.js","../../node_modules/lodash/_baseMatchesProperty.js","../../node_modules/lodash/identity.js","../../node_modules/lodash/_baseProperty.js","../../node_modules/lodash/_basePropertyDeep.js","../../node_modules/lodash/property.js","../../node_modules/lodash/_baseIteratee.js","../../node_modules/lodash/_baseReduce.js","../../node_modules/lodash/reduce.js","../../node_modules/lodash/_baseHas.js","../../node_modules/lodash/has.js","../../node_modules/lodash/_baseIsRegExp.js","../../node_modules/lodash/isRegExp.js","../../node_modules/lodash/_baseIsDate.js","../../node_modules/lodash/isDate.js","../../node_modules/lodash/_getPrototype.js","../../node_modules/lodash/isPlainObject.js","../../src/calculateDeepEqualDiffs.js","../../src/findObjectsDifferences.js","../../src/getUpdateInfo.js","../../src/utils.js","../../src/shouldTrack.js","../../node_modules/lodash/_apply.js","../../node_modules/lodash/_overRest.js","../../node_modules/lodash/constant.js","../../node_modules/lodash/_defineProperty.js","../../node_modules/lodash/_baseSetToString.js","../../node_modules/lodash/_shortOut.js","../../node_modules/lodash/_setToString.js","../../node_modules/lodash/_baseRest.js","../../node_modules/lodash/_isIterateeCall.js","../../node_modules/lodash/_nativeKeysIn.js","../../node_modules/lodash/_baseKeysIn.js","../../node_modules/lodash/keysIn.js","../../node_modules/lodash/defaults.js","../../src/patches/patchClassComponent.js","../../src/patches/patchFunctionalOrStrComponent.js","../../src/whyDidYouRender.js","../../src/patches/patchMemoComponent.js","../../src/patches/patchForwardRefComponent.js","../../src/index.js"],"sourcesContent":["/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","export const diffTypes = {\r\n 'different': 'different',\r\n 'deepEquals': 'deepEquals',\r\n 'date': 'date',\r\n 'regex': 'regex',\r\n 'reactElement': 'reactElement',\r\n 'function': 'function'\r\n}\r\n\r\n// copied from packages/shared/ReactSymbols.js in https://github.com/facebook/react\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nexport const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3\r\nexport const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0\r\n","import {diffTypes} from './consts'\r\n\r\nconst moreInfoUrl = 'http://bit.ly/wdyr02'\r\nconst moreInfoHooksUrl = 'http://bit.ly/wdyr3'\r\n\r\nconst diffTypesDescriptions = {\r\n [diffTypes.different]: 'different objects.',\r\n [diffTypes.deepEquals]: 'different objects that are equal by value.',\r\n [diffTypes.date]: 'different date objects with the same value.',\r\n [diffTypes.regex]: 'different regular expressions with the same value.',\r\n [diffTypes.reactElement]: 'different React elements with the same displayName.',\r\n [diffTypes.function]: 'different functions with the same name.'\r\n}\r\n\r\nlet inHotReload = false\r\n\r\nfunction shouldLog(reason, Component, options){\r\n if(inHotReload){\r\n return false\r\n }\r\n\r\n if(options.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n if(Component.whyDidYouRender && Component.whyDidYouRender.logOnDifferentValues){\r\n return true\r\n }\r\n\r\n const hasDifferentValues = ((\r\n reason.propsDifferences &&\r\n reason.propsDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.stateDifferences &&\r\n reason.stateDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ) || (\r\n reason.hookDifferences &&\r\n reason.hookDifferences.some(diff => diff.diffType === diffTypes.different)\r\n ))\r\n\r\n return !hasDifferentValues\r\n}\r\n\r\nfunction logDifference({Component, displayName, hookName, prefixMessage, diffObjType, differences, values, options}){\r\n if(differences && differences.length > 0){\r\n options.consoleLog({[displayName]: Component}, `${prefixMessage} of ${diffObjType} changes:`)\r\n differences.forEach(({pathString, diffType, prevValue, nextValue}) => {\r\n options.consoleGroup(\r\n `%c${diffObjType === 'hook' ? `[hook ${hookName} result]` : `${diffObjType}.`}%c${pathString}%c`,\r\n `color:${options.diffNameColor};`, `color:${options.diffPathColor};`, 'color:default;'\r\n )\r\n options.consoleLog(\r\n `${diffTypesDescriptions[diffType]} (more info at ${hookName ? moreInfoHooksUrl : moreInfoUrl})`,\r\n )\r\n options.consoleLog({[`prev ${pathString}`]: prevValue}, '!==', {[`next ${pathString}`]: nextValue})\r\n options.consoleGroupEnd()\r\n })\r\n }\r\n else if(differences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n `${prefixMessage} the ${diffObjType} object itself changed but its values are all equal.`,\r\n diffObjType === 'props' ?\r\n 'This could have been avoided by making the component pure, or by preventing its father from re-rendering.' :\r\n 'This usually means this component called setState when no changes in its state actually occurred.',\r\n `More info at ${moreInfoUrl}`\r\n )\r\n options.consoleLog(`prev ${diffObjType}:`, values.prev, ' !== ', values.next, `:next ${diffObjType}`)\r\n }\r\n}\r\n\r\nexport default function defaultNotifier(updateInfo){\r\n const {Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, reason, options, ownerDataMap} = updateInfo\r\n\r\n if(!shouldLog(reason, Component, options)){\r\n return\r\n }\r\n\r\n options.consoleGroup(`%c${displayName}`, `color: ${options.titleColor};`)\r\n\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.propsDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.propsDifferences,\r\n values: {prev: prevProps, next: nextProps},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.stateDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.stateDifferences,\r\n values: {prev: prevState, next: nextState},\r\n options\r\n })\r\n }\r\n\r\n if(reason.hookDifferences){\r\n logDifference({\r\n Component,\r\n displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences: reason.hookDifferences,\r\n values: {prev: prevHook, next: nextHook},\r\n hookName,\r\n options\r\n })\r\n }\r\n\r\n\r\n if(reason.propsDifferences && reason.ownerDifferences){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n options.consoleGroup(`Rendered by ${nextOwnerData.displayName}`)\r\n let prefixMessage = 'Re-rendered because'\r\n\r\n if(reason.ownerDifferences.propsDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'props',\r\n differences: reason.ownerDifferences.propsDifferences,\r\n values: {prev: prevOwnerData.props, next: nextOwnerData.props},\r\n options\r\n })\r\n prefixMessage = 'And because'\r\n }\r\n\r\n if(reason.ownerDifferences.stateDifferences){\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'state',\r\n differences: reason.ownerDifferences.stateDifferences,\r\n values: {prev: prevOwnerData.state, next: nextOwnerData.state},\r\n options\r\n })\r\n }\r\n\r\n if(reason.ownerDifferences.hookDifferences){\r\n reason.ownerDifferences.hookDifferences.forEach(({hookName, differences}, i) =>\r\n logDifference({\r\n Component: nextOwnerData.Component,\r\n displayName: nextOwnerData.displayName,\r\n prefixMessage,\r\n diffObjType: 'hook',\r\n differences,\r\n values: {prev: prevOwnerData.hooks[i].result, next: nextOwnerData.hooks[i].result},\r\n hookName,\r\n options\r\n })\r\n )\r\n }\r\n options.consoleGroupEnd()\r\n }\r\n\r\n if(!reason.propsDifferences && !reason.stateDifferences && !reason.hookDifferences){\r\n options.consoleLog(\r\n {[displayName]: Component},\r\n 'Re-rendered although props and state objects are the same.',\r\n 'This usually means there was a call to this.forceUpdate() inside the component.',\r\n `more info at ${moreInfoUrl}`\r\n )\r\n }\r\n\r\n options.consoleGroupEnd()\r\n}\r\n\r\nexport function createDefaultNotifier(hotReloadBufferMs){\r\n if(hotReloadBufferMs){\r\n if(typeof(module) !== 'undefined' && module.hot && module.hot.addStatusHandler){\r\n module.hot.addStatusHandler(status => {\r\n if(status === 'idle'){\r\n inHotReload = true\r\n setTimeout(() => {\r\n inHotReload = false\r\n }, hotReloadBufferMs)\r\n }\r\n })\r\n }\r\n }\r\n\r\n return defaultNotifier\r\n}\r\n","/* eslint-disable no-console */\r\nimport {createDefaultNotifier} from './defaultNotifier'\r\n\r\nconst emptyFn = () => {}\r\n\r\nexport default function normalizeOptions(userOptions = {}){\r\n let consoleGroup = console.group\r\n let consoleGroupEnd = console.groupEnd\r\n\r\n if(userOptions.collapseGroups){\r\n consoleGroup = console.groupCollapsed\r\n }\r\n else if(userOptions.onlyLogs){\r\n consoleGroup = console.log\r\n consoleGroupEnd = emptyFn\r\n }\r\n\r\n const notifier = userOptions.notifier || (\r\n createDefaultNotifier(\r\n ('hotReloadBufferMs' in userOptions) ? userOptions.hotReloadBufferMs : 500\r\n )\r\n )\r\n\r\n return {\r\n include: null,\r\n exclude: null,\r\n notifier,\r\n onlyLogs: false,\r\n consoleLog: console.log,\r\n consoleGroup,\r\n consoleGroupEnd,\r\n logOnDifferentValues: false,\r\n logOwnerReasons: false,\r\n trackHooks: true,\r\n titleColor: '#058',\r\n diffNameColor: 'blue',\r\n diffPathColor: 'red',\r\n trackExtraHooks: [],\r\n trackAllPureComponents: false,\r\n ...userOptions\r\n }\r\n}\r\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","import {isString} from 'lodash'\r\n\r\nexport default function getDisplayName(type){\r\n return (\r\n type.displayName ||\r\n type.name ||\r\n (type.type && getDisplayName(type.type)) ||\r\n (type.render && getDisplayName(type.render)) ||\r\n (isString(type) ? type : undefined)\r\n )\r\n}\r\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseReduce;\n","var arrayReduce = require('./_arrayReduce'),\n baseEach = require('./_baseEach'),\n baseIteratee = require('./_baseIteratee'),\n baseReduce = require('./_baseReduce'),\n isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n","var baseHas = require('./_baseHas'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nmodule.exports = baseIsRegExp;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar dateTag = '[object Date]';\n\n/**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\nfunction baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n}\n\nmodule.exports = baseIsDate;\n","var baseIsDate = require('./_baseIsDate'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsDate = nodeUtil && nodeUtil.isDate;\n\n/**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\nvar isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\nmodule.exports = isDate;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","import {isArray, isPlainObject, isDate, isRegExp, isFunction, keys as getKeys, has} from 'lodash'\r\nimport {diffTypes} from './consts'\r\n\r\nconst hasElementType = typeof Element !== 'undefined'\r\n\r\n// copied from https://github.com/facebook/react/packages/shared/ReactSymbols.js\r\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for\r\nconst REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7\r\nconst isReactElement = object => object.$$typeof === REACT_ELEMENT_TYPE\r\n// end\r\n\r\nfunction trackDiff(a, b, diffsAccumulator, pathString, diffType){\r\n diffsAccumulator.push({\r\n diffType,\r\n pathString,\r\n prevValue: a,\r\n nextValue: b\r\n })\r\n return diffType !== diffTypes.different\r\n}\r\n\r\nfunction accumulateDeepEqualDiffs(a, b, diffsAccumulator, pathString = ''){\r\n if(a === b){\r\n return true\r\n }\r\n\r\n if(!a || !b){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isArray(a) && isArray(b)){\r\n const length = a.length\r\n if(length !== b.length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n if(!accumulateDeepEqualDiffs(a[i], b[i], diffsAccumulator, `${pathString}[${i}]`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isDate(a) && isDate(b)){\r\n return a.getTime() === b.getTime() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.date) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isRegExp(a) && isRegExp(b)){\r\n return a.toString() === b.toString() ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.regex) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(hasElementType && a instanceof Element && b instanceof Element){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isReactElement(a) && isReactElement(b)){\r\n if(a.type !== b.type){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n else{\r\n const reactElementPropsAreDeepEqual =\r\n accumulateDeepEqualDiffs(a.props, b.props, diffsAccumulator, `${pathString}.props`)\r\n\r\n return reactElementPropsAreDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.reactElement) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n if(isFunction(a) && isFunction(b)){\r\n return a.name === b.name ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.function) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n if(isPlainObject(a) && isPlainObject(b)){\r\n const keys = getKeys(a)\r\n const length = keys.length\r\n if(length !== getKeys(b).length){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n for(let i = length; i-- !== 0;){\r\n if(!has(b, keys[i])){\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n }\r\n\r\n let allChildrenDeepEqual = true\r\n for(let i = length; i-- !== 0;){\r\n const key = keys[i]\r\n if(!accumulateDeepEqualDiffs(a[key], b[key], diffsAccumulator, `${pathString}.${key}`)){\r\n allChildrenDeepEqual = false\r\n }\r\n }\r\n\r\n return allChildrenDeepEqual ?\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.deepEquals) :\r\n trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n }\r\n\r\n return trackDiff(a, b, diffsAccumulator, pathString, diffTypes.different)\r\n}\r\n\r\nexport default function calculateDeepEqualDiffs(a, b, initialPathString){\r\n try{\r\n const diffs = []\r\n accumulateDeepEqualDiffs(a, b, diffs, initialPathString)\r\n return diffs\r\n }catch(error){\r\n if((error.message && error.message.match(/stack|recursion/i)) || (error.number === -2146828260)){\r\n // warn on circular references, don't crash.\r\n // browsers throw different errors name and messages:\r\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\r\n // firefox: \"InternalError\", too much recursion\"\r\n // edge: \"Error\", \"Out of stack space\"\r\n // eslint-disable-next-line no-console\r\n console.warn('Warning: why-did-you-render couldn\\'t handle circular references in props.', error.name, error.message)\r\n return false\r\n }\r\n throw error\r\n }\r\n}\r\n","import {reduce} from 'lodash'\r\nimport calculateDeepEqualDiffs from './calculateDeepEqualDiffs'\r\n\r\nconst emptyObject = {}\r\n\r\nexport default function findObjectsDifferences(userPrevObj, userNextObj, {shallow = true} = {}){\r\n if(userPrevObj === userNextObj){\r\n return false\r\n }\r\n\r\n if(!shallow){\r\n return calculateDeepEqualDiffs(userPrevObj, userNextObj)\r\n }\r\n\r\n const prevObj = userPrevObj || emptyObject\r\n const nextObj = userNextObj || emptyObject\r\n\r\n const keysOfBothObjects = Object.keys({...prevObj, ...nextObj})\r\n\r\n return reduce(keysOfBothObjects, (result, key) => {\r\n const deepEqualDiffs = calculateDeepEqualDiffs(prevObj[key], nextObj[key], key)\r\n if(deepEqualDiffs){\r\n result = [\r\n ...result,\r\n ...deepEqualDiffs\r\n ]\r\n }\r\n return result\r\n }, [])\r\n}\r\n","import findObjectsDifferences from './findObjectsDifferences'\r\n\r\nfunction getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap){\r\n const prevOwnerData = ownerDataMap.get(prevProps)\r\n const nextOwnerData = ownerDataMap.get(nextProps)\r\n\r\n return {\r\n propsDifferences: findObjectsDifferences(prevProps, nextProps),\r\n stateDifferences: findObjectsDifferences(prevState, nextState),\r\n hookDifferences: findObjectsDifferences(prevHook, nextHook, {shallow: false}),\r\n ownerDifferences: prevOwnerData != null && nextOwnerData != null ? {\r\n propsDifferences: findObjectsDifferences(prevOwnerData.props, nextOwnerData.props),\r\n stateDifferences: findObjectsDifferences(prevOwnerData.state, nextOwnerData.state),\r\n hookDifferences: prevOwnerData.hooks.map(({hookName, result}, i) => ({\r\n hookName,\r\n differences: findObjectsDifferences(result, nextOwnerData.hooks[i].result, {shallow: false})\r\n }))\r\n } : false\r\n }\r\n}\r\n\r\nexport default function getUpdateInfo({Component, displayName, hookName, prevProps, prevState, prevHook, nextProps, nextState, nextHook, options, ownerDataMap}){\r\n return {\r\n Component,\r\n displayName,\r\n hookName,\r\n prevProps,\r\n prevState,\r\n prevHook,\r\n nextProps,\r\n nextState,\r\n nextHook,\r\n options,\r\n ownerDataMap,\r\n reason: getUpdateReason(prevProps, prevState, prevHook, nextProps, nextState, nextHook, ownerDataMap)\r\n }\r\n}\r\n","// copied from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactTypeOfMode.js\r\nimport {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from './consts'\r\n\r\nconst StrictMode = 0b0001\r\n\r\n// based on \"findStrictRoot\" from https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactStrictModeWarnings.js\r\n// notice: this is only used for class components. functional components doesn't re-rendered inside strict mode\r\nexport function checkIfInsideAStrictModeTree(reactComponentInstance){\r\n let reactInternalFiber = reactComponentInstance && reactComponentInstance._reactInternalFiber\r\n while(reactInternalFiber){\r\n if(reactInternalFiber.mode & StrictMode){\r\n return true\r\n }\r\n reactInternalFiber = reactInternalFiber.return\r\n }\r\n return false\r\n}\r\n\r\nexport function isReactClassComponent(Component){\r\n return Component.prototype && !!Component.prototype.isReactComponent\r\n}\r\n\r\nexport function isMemoComponent(Component){\r\n return Component.$$typeof === REACT_MEMO_TYPE\r\n}\r\n\r\nexport function isForwardRefComponent(Component){\r\n return Component.$$typeof === REACT_FORWARD_REF_TYPE\r\n}\r\n","import {isMemoComponent} from './utils'\r\n\r\nfunction shouldInclude(displayName, options){\r\n return (\r\n options.include &&\r\n options.include.length > 0 &&\r\n options.include.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nfunction shouldExclude(displayName, options){\r\n return (\r\n options.exclude &&\r\n options.exclude.length > 0 &&\r\n options.exclude.some(regex => regex.test(displayName))\r\n )\r\n}\r\n\r\nexport default function shouldTrack({Component, displayName, options, React, isHookChange}){\r\n if(shouldExclude(displayName, options)){\r\n return false\r\n }\r\n\r\n if(Component.whyDidYouRender === false){\r\n return false\r\n }\r\n\r\n if(isHookChange && (\r\n Component.whyDidYouRender && Component.whyDidYouRender.trackHooks === false\r\n )){\r\n return false\r\n }\r\n\r\n return !!(\r\n Component.whyDidYouRender || (\r\n options.trackAllPureComponents && (\r\n (Component && Component.prototype instanceof React.PureComponent) ||\r\n isMemoComponent(Component)\r\n )\r\n ) ||\r\n shouldInclude(displayName, options)\r\n )\r\n}\r\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseRest = require('./_baseRest'),\n eq = require('./eq'),\n isIterateeCall = require('./_isIterateeCall'),\n keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n","import {defaults} from 'lodash'\r\n\r\nimport {checkIfInsideAStrictModeTree} from '../utils'\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nexport default function patchClassComponent(ClassComponent, displayName, React, options, ownerDataMap){\r\n class WDYRPatchedClassComponent extends ClassComponent{\r\n constructor(props, context){\r\n super(props, context)\r\n\r\n this._WDYR = {\r\n renderNumber: 0\r\n }\r\n\r\n const origRender = super.render || this.render\r\n // this probably means render is an arrow function or this.render.bind(this) was called on the original class\r\n const renderIsABindedFunction = origRender !== ClassComponent.prototype.render\r\n if(renderIsABindedFunction){\r\n this.render = () => {\r\n WDYRPatchedClassComponent.prototype.render.apply(this)\r\n return origRender()\r\n }\r\n }\r\n }\r\n render(){\r\n this._WDYR.renderNumber++\r\n\r\n if(!('isStrictMode' in this._WDYR)){\r\n this._WDYR.isStrictMode = checkIfInsideAStrictModeTree(this)\r\n }\r\n\r\n // in strict mode- ignore every other render\r\n if(!(this._WDYR.isStrictMode && this._WDYR.renderNumber % 2 === 1)){\r\n if(this._WDYR.prevProps){\r\n options.notifier(getUpdateInfo({\r\n Component: ClassComponent,\r\n displayName,\r\n prevProps: this._WDYR.prevProps,\r\n prevState: this._WDYR.prevState,\r\n nextProps: this.props,\r\n nextState: this.state,\r\n options,\r\n ownerDataMap\r\n }))\r\n }\r\n\r\n this._WDYR.prevProps = this.props\r\n this._WDYR.prevState = this.state\r\n }\r\n\r\n return super.render ? super.render() : null\r\n }\r\n }\r\n\r\n try{\r\n WDYRPatchedClassComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRPatchedClassComponent, ClassComponent)\r\n\r\n return WDYRPatchedClassComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getUpdateInfo from '../getUpdateInfo'\r\n\r\nconst getFunctionalComponentFromStringComponent = (componentTypeStr, React) => props => (\r\n React.createElement(componentTypeStr, props)\r\n)\r\n\r\nexport default function patchFunctionalOrStrComponent(FunctionalOrStringComponent, isPure, displayName, React, options, ownerDataMap){\r\n const FunctionalComponent = typeof(FunctionalOrStringComponent) === 'string' ?\r\n getFunctionalComponentFromStringComponent(FunctionalOrStringComponent, React) :\r\n FunctionalOrStringComponent\r\n\r\n function WDYRFunctionalComponent(){\r\n const nextProps = arguments[0]\r\n const ref = React.useRef()\r\n\r\n const prevProps = ref.current\r\n ref.current = nextProps\r\n\r\n if(prevProps){\r\n const updateInfo = getUpdateInfo({\r\n Component: FunctionalComponent,\r\n displayName,\r\n prevProps,\r\n nextProps,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n const shouldNotify = (\r\n updateInfo.reason.propsDifferences && (\r\n !(isPure && updateInfo.reason.propsDifferences.length === 0)\r\n )\r\n )\r\n\r\n if(shouldNotify){\r\n options.notifier(updateInfo)\r\n }\r\n }\r\n\r\n return FunctionalComponent(...arguments)\r\n }\r\n\r\n try{\r\n WDYRFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n WDYRFunctionalComponent.ComponentForHooksTracking = FunctionalComponent\r\n defaults(WDYRFunctionalComponent, FunctionalComponent)\r\n\r\n return WDYRFunctionalComponent\r\n}\r\n","import {get} from 'lodash'\r\n\r\nimport normalizeOptions from './normalizeOptions'\r\nimport getDisplayName from './getDisplayName'\r\nimport getUpdateInfo from './getUpdateInfo'\r\nimport shouldTrack from './shouldTrack'\r\n\r\nimport patchClassComponent from './patches/patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patches/patchFunctionalOrStrComponent'\r\nimport patchMemoComponent from './patches/patchMemoComponent'\r\nimport patchForwardRefComponent from './patches/patchForwardRefComponent'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from './utils'\r\n\r\nconst initialHookValue = Symbol('initial-hook-value')\r\nfunction trackHookChanges(hookName, {path: hookPath}, hookResult, React, options, ownerDataMap, hooksRef){\r\n const nextHook = hookPath ? get(hookResult, hookPath) : hookResult\r\n hooksRef.current.push({hookName, result: nextHook})\r\n const ComponentHookDispatchedFromInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n const prevHookResultRef = React.useRef(initialHookValue)\r\n\r\n if(!ComponentHookDispatchedFromInstance){\r\n return hookResult\r\n }\r\n\r\n const Component = ComponentHookDispatchedFromInstance.type.ComponentForHooksTracking || ComponentHookDispatchedFromInstance.type\r\n const displayName = getDisplayName(Component)\r\n\r\n const isShouldTrack = shouldTrack({Component, displayName, options, React, isHookChange: true})\r\n if(!isShouldTrack){\r\n return hookResult\r\n }\r\n\r\n const prevHookResult = prevHookResultRef.current\r\n prevHookResultRef.current = hookResult\r\n\r\n if(prevHookResult !== initialHookValue){\r\n const notification = getUpdateInfo({\r\n Component: Component,\r\n displayName,\r\n hookName,\r\n prevHook: hookPath ? get(prevHookResult, hookPath) : prevHookResult,\r\n nextHook,\r\n options,\r\n ownerDataMap\r\n })\r\n\r\n if(notification.reason.hookDifferences){\r\n options.notifier(notification)\r\n }\r\n }\r\n\r\n return hookResult\r\n}\r\n\r\nfunction createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(isMemoComponent(Component)){\r\n return patchMemoComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isForwardRefComponent(Component)){\r\n return patchForwardRefComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n if(isReactClassComponent(Component)){\r\n return patchClassComponent(Component, displayName, React, options, ownerDataMap)\r\n }\r\n\r\n return patchFunctionalOrStrComponent(Component, false, displayName, React, options, ownerDataMap)\r\n}\r\n\r\nfunction getPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap){\r\n if(componentsMap.has(Component)){\r\n return componentsMap.get(Component)\r\n }\r\n\r\n const WDYRPatchedComponent = createPatchedComponent(componentsMap, Component, displayName, React, options, ownerDataMap)\r\n\r\n componentsMap.set(Component, WDYRPatchedComponent)\r\n return WDYRPatchedComponent\r\n}\r\n\r\nexport const hooksConfig = {\r\n useState: {path: '0'},\r\n useReducer: {path: '0'},\r\n useContext: true,\r\n useMemo: true\r\n}\r\n\r\nexport default function whyDidYouRender(React, userOptions){\r\n const options = normalizeOptions(userOptions)\r\n\r\n const origCreateElement = React.createElement\r\n const origCreateFactory = React.createFactory\r\n\r\n let componentsMap = new WeakMap()\r\n const ownerDataMap = new WeakMap()\r\n const hooksRef = {current: []}\r\n\r\n // Intercept assignments to ReactCurrentOwner.current and reset hooksRef\r\n let currentOwner = null\r\n Object.defineProperty(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, 'current', {\r\n get(){\r\n return currentOwner\r\n },\r\n set(value){\r\n currentOwner = value\r\n hooksRef.current = []\r\n }\r\n })\r\n\r\n React.createElement = function(componentNameOrComponent, ...rest){\r\n let isShouldTrack = null\r\n let displayName = null\r\n let WDYRPatchedComponent = null\r\n\r\n try{\r\n isShouldTrack = (\r\n (\r\n typeof componentNameOrComponent === 'function' ||\r\n isMemoComponent(componentNameOrComponent) ||\r\n isForwardRefComponent(componentNameOrComponent)\r\n ) &&\r\n shouldTrack({Component: componentNameOrComponent, displayName: getDisplayName(componentNameOrComponent), React, options})\r\n )\r\n\r\n if(isShouldTrack){\r\n displayName = (\r\n componentNameOrComponent &&\r\n componentNameOrComponent.whyDidYouRender &&\r\n componentNameOrComponent.whyDidYouRender.customName ||\r\n getDisplayName(componentNameOrComponent)\r\n )\r\n\r\n WDYRPatchedComponent = getPatchedComponent(componentsMap, componentNameOrComponent, displayName, React, options, ownerDataMap)\r\n\r\n const element = origCreateElement.apply(React, [WDYRPatchedComponent, ...rest])\r\n if(options.logOwnerReasons){\r\n const OwnerInstance = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.current\r\n if(OwnerInstance != null){\r\n const Component = OwnerInstance.type.ComponentForHooksTracking || OwnerInstance.type\r\n const displayName = getDisplayName(Component)\r\n ownerDataMap.set(element.props, {\r\n Component,\r\n displayName,\r\n props: OwnerInstance.pendingProps,\r\n state: OwnerInstance.stateNode != null ? OwnerInstance.stateNode.state : null,\r\n hooks: hooksRef.current\r\n })\r\n }\r\n }\r\n\r\n return element\r\n }\r\n }\r\n catch(e){\r\n options.consoleLog('whyDidYouRender error. Please file a bug at https://github.com/welldone-software/why-did-you-render/issues.', {\r\n errorInfo: {\r\n error: e,\r\n componentNameOrComponent,\r\n rest,\r\n options,\r\n isShouldTrack,\r\n displayName,\r\n WDYRPatchedComponent\r\n }\r\n })\r\n }\r\n\r\n return origCreateElement.apply(React, [componentNameOrComponent, ...rest])\r\n }\r\n\r\n Object.assign(React.createElement, origCreateElement)\r\n\r\n React.createFactory = type => {\r\n const factory = React.createElement.bind(null, type)\r\n factory.type = type\r\n return factory\r\n }\r\n\r\n Object.assign(React.createFactory, origCreateFactory)\r\n\r\n if(options.trackHooks){\r\n const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => {\r\n return [React, hookName, hookTrackingConfig]\r\n })\r\n\r\n const hooksToTrack = [\r\n ...nativeHooks,\r\n ...options.trackExtraHooks\r\n ]\r\n\r\n hooksToTrack.forEach(([hookParent, hookName, hookTrackingConfig = {}]) => {\r\n const originalHook = hookParent[hookName]\r\n const newHookName = hookName[0].toUpperCase() + hookName.slice(1)\r\n const newHook = function(...args){\r\n const hookResult = originalHook.call(this, ...args)\r\n trackHookChanges(hookName, hookTrackingConfig, hookResult, React, options, ownerDataMap, hooksRef)\r\n return hookResult\r\n }\r\n Object.defineProperty(newHook, 'name', {value: newHookName, writable: false})\r\n Object.assign(newHook, {originalHook})\r\n hookParent[hookName] = newHook\r\n })\r\n }\r\n\r\n React.__REVERT_WHY_DID_YOU_RENDER__ = () => {\r\n Object.assign(React, {\r\n createElement: origCreateElement,\r\n createFactory: origCreateFactory\r\n })\r\n\r\n componentsMap = null\r\n\r\n const hooksToRevert = [\r\n ...Object.keys(hooksConfig).map(hookName => [React, hookName]),\r\n ...options.trackExtraHooks\r\n ]\r\n hooksToRevert.forEach(([hookParent, hookName]) => {\r\n if(hookParent[hookName].originalHook){\r\n hookParent[hookName] = hookParent[hookName].originalHook\r\n }\r\n })\r\n\r\n delete React.__REVERT_WHY_DID_YOU_RENDER__\r\n }\r\n\r\n return React\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\n\r\nimport {isForwardRefComponent, isMemoComponent, isReactClassComponent} from '../utils'\r\nimport patchClassComponent from './patchClassComponent'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchMemoComponent(MemoComponent, displayName, React, options, ownerDataMap){\r\n const {type: InnerMemoComponent} = MemoComponent\r\n\r\n const isInnerMemoComponentAClassComponent = isReactClassComponent(InnerMemoComponent)\r\n const isInnerMemoComponentForwardRefs = isForwardRefComponent(InnerMemoComponent)\r\n const isInnerMemoComponentAnotherMemoComponent = isMemoComponent(InnerMemoComponent)\r\n\r\n const WrappedFunctionalComponent = isInnerMemoComponentForwardRefs ?\r\n InnerMemoComponent.render :\r\n InnerMemoComponent\r\n\r\n const PatchedInnerComponent = isInnerMemoComponentAClassComponent ?\r\n patchClassComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n (isInnerMemoComponentAnotherMemoComponent ?\r\n patchMemoComponent(WrappedFunctionalComponent, displayName, React, options, ownerDataMap) :\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, true, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n try{\r\n PatchedInnerComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n PatchedInnerComponent.ComponentForHooksTracking = MemoComponent\r\n defaults(PatchedInnerComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRMemoizedFunctionalComponent = React.memo(\r\n isInnerMemoComponentForwardRefs ? React.forwardRef(PatchedInnerComponent) : PatchedInnerComponent,\r\n MemoComponent.compare\r\n )\r\n\r\n try{\r\n WDYRMemoizedFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRMemoizedFunctionalComponent, MemoComponent)\r\n\r\n return WDYRMemoizedFunctionalComponent\r\n}\r\n","import {defaults} from 'lodash'\r\n\r\nimport getDisplayName from '../getDisplayName'\r\nimport {isMemoComponent} from '../utils'\r\nimport patchFunctionalOrStrComponent from './patchFunctionalOrStrComponent'\r\n\r\nexport default function patchForwardRefComponent(ForwardRefComponent, displayName, React, options, ownerDataMap){\r\n const {render: InnerForwardRefComponent} = ForwardRefComponent\r\n\r\n const isInnerComponentMemoized = isMemoComponent(InnerForwardRefComponent)\r\n const WrappedFunctionalComponent = isInnerComponentMemoized ?\r\n InnerForwardRefComponent.type : InnerForwardRefComponent\r\n\r\n const WDYRWrappedByReactForwardRefFunctionalComponent = (\r\n patchFunctionalOrStrComponent(WrappedFunctionalComponent, isInnerComponentMemoized, displayName, React, options, ownerDataMap)\r\n )\r\n\r\n WDYRWrappedByReactForwardRefFunctionalComponent.displayName = getDisplayName(WrappedFunctionalComponent)\r\n WDYRWrappedByReactForwardRefFunctionalComponent.ComponentForHooksTracking = WrappedFunctionalComponent\r\n defaults(WDYRWrappedByReactForwardRefFunctionalComponent, WrappedFunctionalComponent)\r\n\r\n const WDYRForwardRefFunctionalComponent = React.forwardRef(\r\n isInnerComponentMemoized ?\r\n React.memo(WDYRWrappedByReactForwardRefFunctionalComponent, InnerForwardRefComponent.compare) :\r\n WDYRWrappedByReactForwardRefFunctionalComponent\r\n )\r\n\r\n try{\r\n WDYRForwardRefFunctionalComponent.displayName = displayName\r\n }catch(e){\r\n // not crucial if displayName couldn't be set\r\n }\r\n\r\n defaults(WDYRForwardRefFunctionalComponent, ForwardRefComponent)\r\n\r\n return WDYRForwardRefFunctionalComponent\r\n}\r\n","import whyDidYouRender from './whyDidYouRender'\r\nimport defaultNotifier from './defaultNotifier'\r\n\r\nwhyDidYouRender.defaultNotifier = defaultNotifier\r\nexport default whyDidYouRender\r\n"],"names":["Array","isArray","global","Object","freeSelf","self","freeGlobal","Function","root","Symbol","objectProto","prototype","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","value","isOwn","call","tag","unmasked","e","result","getRawTag","objectToString","isObjectLike","baseGetTag","reIsDeepProp","reIsPlainProp","object","type","isSymbol","test","uid","isObject","maskSrcKey","exec","coreJsData","keys","IE_PROTO","func","funcToString","reIsHostCtor","funcProto","reIsNative","RegExp","replace","isMasked","isFunction","toSource","key","getValue","baseIsNative","getNative","this","__data__","nativeCreate","size","has","data","Hash","entries","index","length","clear","entry","set","hashClear","hashDelete","get","hashGet","hashHas","hashSet","other","array","eq","splice","assocIndexOf","pop","push","ListCache","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","hash","map","Map","string","isKeyable","getMapData","MapCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","memoize","resolver","TypeError","memoized","args","arguments","apply","cache","Cache","rePropName","reEscapeChar","memoizeCapped","charCodeAt","match","number","quote","subString","iteratee","symbolProto","symbolToString","baseToString","arrayMap","isKey","stringToPath","path","castPath","toKey","defaultValue","baseGet","diffTypes","hasSymbol","REACT_MEMO_TYPE","REACT_FORWARD_REF_TYPE","diffTypesDescriptions","inHotReload","logDifference","Component","displayName","hookName","prefixMessage","diffObjType","differences","values","options","consoleLog","forEach","pathString","diffType","prevValue","nextValue","consoleGroup","diffNameColor","diffPathColor","consoleGroupEnd","prev","next","defaultNotifier","updateInfo","prevProps","prevState","prevHook","nextProps","nextState","nextHook","reason","ownerDataMap","logOnDifferentValues","whyDidYouRender","propsDifferences","some","diff","stateDifferences","hookDifferences","shouldLog","titleColor","ownerDifferences","prevOwnerData","nextOwnerData","props","state","i","hooks","createDefaultNotifier","hotReloadBufferMs","module","hot","addStatusHandler","status","setTimeout","emptyFn","getDisplayName","name","render","_isString","accumulator","initAccum","fromRight","keysFunc","iterable","createBaseFor","n","propertyIsEnumerable","baseIsArguments","freeExports","exports","nodeType","freeModule","Buffer","isBuffer","stubFalse","reIsUint","typedArrayTags","isLength","freeProcess","process","nodeUtil","types","require","binding","nodeIsTypedArray","isTypedArray","baseUnary","baseIsTypedArray","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","baseTimes","String","isIndex","Ctor","constructor","transform","arg","overArg","isPrototype","nativeKeys","isArrayLike","arrayLikeKeys","baseKeys","eachFunc","collection","createBaseEach","baseFor","pairs","LARGE_ARRAY_SIZE","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","SetCache","add","setCacheAdd","setCacheHas","predicate","bitmask","customizer","equalFunc","stack","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","arraySome","othIndex","cacheHas","Uint8Array","symbolValueOf","valueOf","byteLength","byteOffset","buffer","message","convert","mapToArray","setToArray","equalArrays","offset","symbolsFunc","arrayPush","resIndex","nativeGetSymbols","getOwnPropertySymbols","arrayFilter","symbol","stubArray","baseGetAllKeys","getSymbols","objProps","getAllKeys","objLength","skipCtor","objValue","objCtor","othCtor","dataViewCtorString","DataView","mapCtorString","promiseCtorString","Promise","setCtorString","Set","weakMapCtorString","WeakMap","getTag","ArrayBuffer","resolve","ctorString","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsEqual","baseIsEqualDeep","source","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isStrictComparable","getMatchData","matchesStrictComparable","baseIsMatch","hasFunc","hasPath","baseHasIn","hasIn","baseProperty","basePropertyDeep","identity","baseMatchesProperty","baseMatches","property","arrayReduce","baseReduce","baseIteratee","baseEach","baseHas","nodeIsRegExp","isRegExp","baseIsRegExp","nodeIsDate","isDate","baseIsDate","getPrototypeOf","objectCtorString","proto","getPrototype","hasElementType","Element","REACT_ELEMENT_TYPE","isReactElement","$$typeof","trackDiff","a","b","diffsAccumulator","calculateDeepEqualDiffs","initialPathString","diffs","accumulateDeepEqualDiffs","_isArray","allChildrenDeepEqual","_isDate","getTime","_isRegExp","reactElementPropsAreDeepEqual","_isFunction","_isPlainObject","_keys","_has","error","console","warn","emptyObject","findObjectsDifferences","userPrevObj","userNextObj","shallow","prevObj","nextObj","keysOfBothObjects","_reduce","deepEqualDiffs","getUpdateReason","getUpdateInfo","isReactClassComponent","isReactComponent","isMemoComponent","isForwardRefComponent","shouldTrack","React","isHookChange","exclude","regex","shouldExclude","trackHooks","trackAllPureComponents","PureComponent","include","shouldInclude","thisArg","nativeMax","Math","max","start","otherArgs","defineProperty","configurable","enumerable","constant","writable","nativeNow","Date","now","count","lastCalled","stamp","remaining","shortOut","baseSetToString","setToString","overRest","nativeKeysIn","isProto","baseKeysIn","baseRest","sources","guard","isIterateeCall","keysIn","propsIndex","propsLength","patchClassComponent","ClassComponent","WDYRPatchedClassComponent","context","_WDYR","renderNumber","origRender","_get","_this","isStrictMode","reactComponentInstance","reactInternalFiber","_reactInternalFiber","mode","checkIfInsideAStrictModeTree","notifier","patchFunctionalOrStrComponent","FunctionalOrStringComponent","isPure","FunctionalComponent","componentTypeStr","createElement","getFunctionalComponentFromStringComponent","WDYRFunctionalComponent","ref","useRef","current","shouldNotify","ComponentForHooksTracking","initialHookValue","trackHookChanges","hookResult","hooksRef","hookPath","ComponentHookDispatchedFromInstance","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","prevHookResultRef","prevHookResult","notification","createPatchedComponent","componentsMap","patchMemoComponent","MemoComponent","InnerMemoComponent","isInnerMemoComponentAClassComponent","isInnerMemoComponentForwardRefs","isInnerMemoComponentAnotherMemoComponent","WrappedFunctionalComponent","PatchedInnerComponent","WDYRMemoizedFunctionalComponent","memo","forwardRef","compare","ForwardRefComponent","InnerForwardRefComponent","isInnerComponentMemoized","WDYRWrappedByReactForwardRefFunctionalComponent","WDYRForwardRefFunctionalComponent","patchForwardRefComponent","getPatchedComponent","WDYRPatchedComponent","hooksConfig","useState","useReducer","useContext","useMemo","userOptions","group","groupEnd","collapseGroups","groupCollapsed","onlyLogs","log","logOwnerReasons","trackExtraHooks","normalizeOptions","origCreateElement","origCreateFactory","createFactory","currentOwner","componentNameOrComponent","isShouldTrack","rest","customName","element","OwnerInstance","pendingProps","stateNode","errorInfo","assign","factory","bind","nativeHooks","hookTrackingConfig","hookParent","originalHook","newHookName","toUpperCase","slice","newHook","__REVERT_WHY_DID_YOU_RENDER__"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index c6d3836..7af17a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@welldone-software/why-did-you-render", - "version": "4.0.8", + "version": "4.1.0-alpha.0", "description": "Monkey patches React to notify you about avoidable re-renders.", "types": "types.d.ts", "main": "dist/cjs/whyDidYouRender.min.js",