{"version":3,"file":"ugc-olapic-widget.68fbead76fdca9a0fd80.bundle.js","mappings":"kTA2BA,YAvBO,oBACK,KAAAA,MAGJ,GAESC,kBAAqBC,EAAkBC,GAAkC,O,EAAA,K,EAAA,K,EAAA,YAClF,IACI,IAAKC,KAAKJ,MAAME,GAAW,CACvB,MAAMG,QAAeF,IAErBC,KAAKJ,MAAME,GAAYG,EAAOC,SAAA,MAE7BC,GACLC,QAAQD,MAAMA,K,0MAIfE,QAAQP,GACX,OAAOE,KAAKJ,MAAME,K,4JChB1B,IAAKQ,EAAA,KAAAA,IAAAA,EAAA,KACD,KAAO,OACP,UAAU,U,4HCKP,MAAMC,UAAsB,YAG/BC,YAAYC,GACRC,MAAMD,GACNT,KAAKW,MAAQ,CAAER,WAAO,GACtBH,KAAKY,OAAS,IAAIC,EAAA,EAAU,CACxBC,YAAaL,EAAMK,YACnBC,KAAM,WAAa,GACnBC,YAAa,UAAY,GACzBC,gBAAgB,QAAkBR,EAAMK,cAAgB,qCAIhCX,GAC5B,MAAO,CAAEA,MAAAA,GAGNe,kBAAkBf,GACrBH,KAAKY,OAAOT,MAAM,CACdgB,YAAa,WACbC,QAAS,iCAAiCpB,KAAKS,MAAMY,OACrDC,QAAS,CACLnB,MAAAA,EACAoB,QAAS,CAAEC,gBAAiB,yBAKjCC,SACH,OAAOzB,KAAKW,MAAMR,MAAQ,KAAOH,KAAKS,MAAMiB,U,2YCtCpD,SCMIC,EDLA,IAAM,qGCMN7B,EDLA,KCMA8B,EDLA,gCCOO,gBAAc,YAGjBpB,YAAYC,GACRC,MAAMD,GAEN,MAAMoB,EAAaC,EAAA,oBACbA,EAAA,gBAA6BF,QAC7B,EAEN5B,KAAKW,MAAQ,CACToB,eAAgBF,EAChBG,UAAW,UAAqBlC,IAI3BmC,oBAAoB,O,EAAA,K,EAAA,K,EAAA,YAC7B,IACSH,EAAA,4BACKA,EAAA,wBAEJ,oBAA+BhC,EAAU6B,GAE/C3B,KAAKkC,SAAS,CACVH,eAAgBD,EAAA,gBAA6BF,GAC7CI,UAAW,UAAqBlC,KAAA,MAE/BK,GACLC,QAAQD,MAAMA,K,0MAItBsB,SACI,MAAMU,EAAYnC,KAAKW,MAAMqB,UAE7B,OAAKF,EAAA,qBAAqCK,EAKtC,gBAAC5B,EAAD,CAAeO,YAAagB,EAAA,cAA4BT,KAAMvB,GAC1D,gBAACqC,G,qHAAD,IAAenC,KAAKS,O,EAApB,CAA2BsB,eAAgB/B,KAAKW,MAAMoB,gB,aALnD,K,WAnCRK,eAAiBR,EADrB,GALJ,IACHD,EACA7B,EACA8B,EAdJ,G,oCCUA3B,EAAOoC,QAAU,SAASC,EAAEC,GACxB,IAAIC,EAAU,GAEd,OADAC,EAAaH,EAAEC,EAAEC,EAAQ,IAClBA,GAGX,IAAIC,EAAe,SAASH,EAAEC,EAAEG,EAAIC,GA+FhC,IAA2BC,EA9F3B,KAAGN,IAAMC,GAAKM,OAAOC,MAAMR,IAAIO,OAAOC,MAAMP,IAErC,GAAGD,aAAaS,OAASR,aAAaQ,MAAO,CAEhD,IADA,IAAIC,EAAGV,EAAEW,OAAO,EAAEC,EAAGX,EAAEU,OAAO,EACxBD,GAAM,GAAKE,GAAM,GACnB,GAAIC,EAAMb,EAAEU,GAAKT,EAAEW,IAmDfF,IAAME,QAnDe,CAIrB,IAHA,IAAIE,EAAUC,EAAiBF,EAAOb,EAAEC,EAAGS,EAAGE,EAAI,EAAG,GAEjDI,EAAQN,EAAGO,EAAQL,EACjBI,EAAUF,EAAQd,GAAKiB,EAAUH,EAAQb,GAC3C,GAAGiB,EAAQlB,EAAEgB,GAAUf,EAAEgB,IAErBd,EAAaH,EAAEgB,GAASf,EAAEgB,GAASb,EAAKC,EAAKc,OAAO,CAACH,KACrDA,IAAWC,QACR,CACH,IAAIG,EAAeL,EAAiBG,EAASlB,EAAEC,EAAGe,EAAQC,EAASH,EAAQd,EAAE,EAAGc,EAAQb,EAAE,GAEtFoB,EAAeL,EAAQI,EAAapB,EACpCsB,EAAeL,EAAQG,EAAanB,EAEpB,IAAjBoB,GAAuC,IAAjBC,EACrBC,EAAInB,EAAKC,EAAKc,OAAOC,EAAapB,EAAE,GAAIC,EAAEmB,EAAanB,EAAE,IAClC,IAAjBoB,GAAuC,IAAjBC,GAE5BE,EAAIpB,EAAKC,EAAKe,EAAapB,EAAE,EAAGC,EAAEwB,MAAML,EAAanB,EAAE,EAAGgB,EAAQ,IAClEM,EAAInB,EAAKC,EAAKc,OAAOC,EAAapB,EAAE,GAAIC,EAAEmB,EAAanB,EAAE,KAClC,IAAjBoB,GAAuC,IAAjBC,GAE5BI,EAAGtB,EAAKC,EAAMe,EAAapB,EAAE,EAAG,EAAGA,GACnCuB,EAAInB,EAAKC,EAAKc,OAAOC,EAAapB,EAAE,GAAIC,EAAEmB,EAAanB,EAAE,KAClC,IAAjBoB,GAAuC,IAAjBC,GAC5BC,EAAInB,EAAKC,EAAKc,OAAOC,EAAapB,EAAE,GAAIC,EAAEmB,EAAanB,EAAE,IACzDsB,EAAInB,EAAKC,EAAKc,OAAOC,EAAapB,EAAE,GAAIC,EAAEmB,EAAanB,EAAE,MAEtDoB,EAAe,GACdK,EAAGtB,EAAKC,EAAMe,EAAapB,EAAE,EAAGqB,EAAcrB,GAE/CsB,EAAe,GACdE,EAAIpB,EAAKC,EAAKe,EAAapB,EAAE,EAAGC,EAAEwB,MAAML,EAAanB,EAAE,EAAGgB,EAAQ,KAI1ED,EAAUI,EAAapB,EACvBiB,EAAUG,EAAanB,EAI5Be,EAAUF,EAAQd,EACjB0B,EAAGtB,EAAKC,EAAMW,EAASA,EAAQF,EAAQd,EAAGA,GACpCiB,EAAUH,EAAQb,GACxBuB,EAAIpB,EAAKC,EAAMW,EAAQ,EAAGf,EAAEwB,MAAMX,EAAQb,EAAE,EAAGgB,EAAQ,IAG3DP,EAAKI,EAAQd,EACbY,EAAKE,EAAQb,EAMlBS,GAAM,EACLgB,EAAGtB,EAAKC,EAAM,EAAGK,EAAG,EAAGV,GACjBY,GAAM,GACZY,EAAIpB,EAAKC,EAAK,EAAGJ,EAAEwB,MAAM,EAAGb,EAAG,SAGhC,GAAGZ,aAAa2B,MAAQ1B,aAAa0B,KACrC3B,EAAE4B,YAAc3B,EAAE2B,WACjBL,EAAInB,EAAKC,EAAMJ,QAEhB,GAAGD,aAAa6B,QAAU5B,aAAa4B,OAAQ,CAClD,IAAIC,EAASC,EAAMC,EAAWH,OAAOI,KAAKjC,IAAKgC,EAAWH,OAAOI,KAAKhC,KACtE,IAAI,IAAIiC,KAAOJ,EAAQ,CACnB,IAAIK,EAAO9B,EAAKc,OAAO,CAACe,IACrBA,KAAOlC,KAAOkC,KAAOjC,IAoBLK,EAnBJ6B,EAAL/B,EAoBHgC,KAAK,CACZC,KAAK,QACLF,KAAM7B,KApBFH,EAAaH,EAAEkC,GAAKjC,EAAEiC,GAAK9B,EAAK+B,SAIxCZ,EAAInB,EAAKC,EAAMJ,GAInB,SAASsB,EAAIe,EAAYhC,EAAUiC,GAC/BD,EAAWF,KAAK,CACZC,KAAK,MACLF,KAAM7B,EACNkC,IAAKD,IAab,SAASb,EAAGY,EAAYhC,EAAUmC,EAAOC,EAAO1C,GAC5C,IAAI2C,EAAaF,EAAQA,EAAQC,EAAQ,EAAI,EAC7CJ,EAAWF,KAAK,CACZC,KAAK,KACLF,KAAM7B,EACNmC,MAAOE,EACPC,IAAKF,EACLG,KAAM7C,EAAEyB,MAAMkB,EAAYA,EAAWD,KAK7C,SAASlB,EAAIc,EAAYhC,EAAUmC,EAAOK,GACtCR,EAAWF,KAAK,CACZC,KAAK,MACLF,KAAM7B,EACNmC,MAAOA,EACPI,KAAMC,MAiBlB,SAAS/B,EAAiBgC,EAAW/C,EAAEC,EAAG+C,EAAiBC,EAAkBC,EAASC,GAIlF,IAHA,IAAIC,EAAWJ,EAAiBE,EAC5BG,EAAWJ,EAAiBE,EAC5BG,EAAOC,KAAKC,IAAIJ,EAAUC,GACtBI,EAAE,EAAGA,GAAGH,EAAMG,IAAK,CACvB,IAAIC,EAAU1D,EAAEgD,EAAiBS,GAC7BE,EAAU1D,EAAEgD,EAAiBQ,GAEjC,GAAGA,GAAGJ,GAAYI,GAAGL,GAAYL,EAAUW,EAASC,GAChD,MAAO,CAAC3D,EAAEgD,EAAiBS,EAAGxD,EAAEgD,EAAiBQ,GAGrD,IAAI,IAAIG,EAAE,EAAGA,EAAEH,EAAGG,IAAK,CACnB,IAAIC,EAAQ7D,EAAEgD,EAAiBY,GAC3BE,EAAQ7D,EAAEgD,EAAiBW,GAE/B,GAAGH,GAAGJ,GAAYN,EAAUc,EAAOF,GAC/B,MAAO,CAAC3D,EAAEgD,EAAiBY,EAAG3D,EAAEgD,EAAiBQ,GAC9C,GAAGA,GAAGL,GAAYL,EAAUW,EAASI,GACxC,MAAO,CAAC9D,EAAEgD,EAAiBS,EAAGxD,EAAEgD,EAAiBW,IAK7D,MAAO,CAAC5D,EAAGkD,EAAQ,EAAGjD,EAAGkD,EAAQ,GAOrC,SAASjC,EAAQlB,EAAEC,GACf,GAAGD,aAAaS,MAAO,CACnB,KAAKR,aAAaQ,OACd,OAAO,EAIX,IAFA,IAAIsD,EAAa/D,EAAEW,OAAO,GACtBqD,EAAWT,KAAKU,IAAIjE,EAAEW,OAAOV,EAAEU,QAC3B8C,EAAE,EAAGA,EAAEzD,EAAEW,OAAQ8C,IACrB,GAAG5C,EAAMb,EAAEyD,GAAGxD,EAAEwD,IAAK,CACjB,GAAGO,GAAY,GAAKA,EAAWD,GAAcC,IAAahE,EAAEW,OACxD,OAAO,EAGXqD,IAIR,OAAO,EAEJ,GAAGhE,aAAa6B,OAAQ,CAC3B,KAAK5B,aAAa4B,QACd,OAAO,EAEX,IAAIC,EAASC,EAAMC,EAAWH,OAAOI,KAAKjC,IAAKgC,EAAWH,OAAOI,KAAKhC,KAClEiE,EAAYrC,OAAOI,KAAKH,GAAQnB,OAChCoD,EAAaG,EAAY,GACzBF,EAAW,EACf,IAAI,IAAI9B,KAAOJ,EAAQ,CAInB,IAAIjB,EAHOb,EAAEkC,GACFjC,EAAEiC,IAES,CAClB,GAAG8B,GAAY,GAAKA,EAAWD,GAAcC,EAAS,IAAME,EACxD,OAAO,EAGXF,KAIR,OAAO,EAGP,OAAOhE,IAAIC,GAAKM,OAAOC,MAAMR,IAAMO,OAAOC,MAAMP,GAKxD,SAASY,EAAMb,EAAEC,GACb,GAAGD,aAAaS,MAAO,CACnB,KAAKR,aAAaQ,OACd,OAAO,EACX,GAAGT,EAAEW,SAAWV,EAAEU,OACd,OAAO,EAEP,IAAI,IAAI8C,EAAE,EAAGA,EAAEzD,EAAEW,OAAQ8C,IACrB,IAAI5C,EAAMb,EAAEyD,GAAGxD,EAAEwD,IACb,OAAO,EAIf,OAAO,EAER,GAAGzD,aAAa6B,OAAQ,CAC3B,KAAK5B,aAAa4B,QACd,OAAO,EAEX,IAAIsC,EAAQtC,OAAOI,KAAKjC,GACpBoE,EAAQvC,OAAOI,KAAKhC,GAExB,GAAGkE,EAAMxD,SAAWyD,EAAMzD,OACtB,OAAO,EAEP,IAAQ8C,EAAE,EAAGA,EAAEU,EAAMxD,OAAQ8C,IAAK,CAC9B,IAAIvB,EAAMiC,EAAMV,GAIhB,IAAI5C,EAHOb,EAAEkC,GACFjC,EAAEiC,IAGT,OAAO,EAIf,OAAO,EAGX,OAAOlC,IAAIC,GAAKM,OAAOC,MAAMR,IAAMO,OAAOC,MAAMP,GAMxD,SAAS+B,EAAWqC,GAChB,IAAIC,EAAS,GAIb,OAHAD,EAAME,SAAQ,SAASC,GACnBF,EAAOE,IAAK,KAETF,EAKX,SAASvC,EAAM0C,EAAMC,GACjB,IAAI,IAAIxC,KAAOwC,EACXD,EAAKvC,GAAOwC,EAAKxC,GAGrB,OAAOuC,EAtJX9G,EAAOoC,QAAQmB,QAAUA,EACzBvD,EAAOoC,QAAQc,MAAQA","sources":["webpack://elc-service-product-ugc/./node_modules/@estee/elc-service/src/Service/ServiceManager/ViewsManager.ts","webpack://elc-service-product-ugc/./node_modules/@estee/elc-service/node_modules/@estee/elc-telemetry/src/ComponentTelemetry.tsx","webpack://elc-service-product-ugc/./node_modules/@estee/elc-service/node_modules/@estee/elc-telemetry/src/ErrorBoundary.tsx","webpack://elc-service-product-ugc/./src/exported/olapic/index.ts","webpack://elc-service-product-ugc/./node_modules/@estee/elc-service/src/Service/ServiceManager/BaseComponent.tsx","webpack://elc-service-product-ugc/./node_modules/odiff/odiff.js"],"sourcesContent":["export type ImportStatement = () => Promise<{\n default: React.ComponentClass;\n}>;\n\nexport class ViewsManager {\n private views: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: React.ComponentClass | undefined;\n } = {};\n\n public async loadAndSaveModule(viewName: string, importMethod: ImportStatement) {\n try {\n if (!this.views[viewName]) {\n const module = await importMethod();\n\n this.views[viewName] = module.default;\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n public getView(viewName: string) {\n return this.views[viewName];\n }\n}\n\nexport default new ViewsManager();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as React from 'react';\nimport * as deepDiff from 'odiff';\nimport { processComponentName } from './utils/helpers';\n\nconst COMPONENT_TELEMETRY = 'componentTelemetry';\n\nenum Configs {\n DEEP = 'deep',\n SHALLOW = 'shallow'\n}\n\ninterface IEntry {\n key: string;\n value: Record;\n action: string;\n}\n\nexport const getShallowDiff = (prevObject: any, newObject: any): IEntry[] => {\n const prevObjectKeys = Object.keys(prevObject);\n const newObjectKeys = Object.keys(newObject);\n\n const removedEntries: IEntry[] = [];\n prevObjectKeys.forEach((key: string) => {\n if (!newObject.hasOwnProperty(key)) {\n removedEntries.push({\n key,\n value: prevObject[key],\n action: 'removed'\n });\n }\n });\n\n const newEntries: IEntry[] = [];\n newObjectKeys.forEach((key: string) => {\n if (newObject[key] !== prevObject[key]) {\n newEntries.push({\n key,\n value: newObject[key],\n action: prevObject.hasOwnProperty(key) ? 'modified' : 'added'\n });\n }\n });\n\n return [...removedEntries, ...newEntries];\n};\n\nexport const logPropDiff = (\n config: Configs,\n prevProps: any,\n props: any,\n componentName: string = '',\n callCount: number\n) => {\n const diff =\n config === Configs.DEEP ? deepDiff(prevProps, props) : getShallowDiff(prevProps, props);\n\n // eslint-disable-next-line no-console\n console.log(`${componentName} Render #${callCount}:`, diff);\n};\n\nexport function componentTelemetry(customName?: string | (() => string) | string) {\n const componentTelemetryConfig = localStorage.getItem(COMPONENT_TELEMETRY);\n if (componentTelemetryConfig === Configs.DEEP || componentTelemetryConfig === Configs.SHALLOW) {\n let callCount = 0;\n\n return (WrappedComponent: React.ComponentType) => {\n const componentName = processComponentName(\n WrappedComponent.displayName || 'UnnamedReactComponent',\n customName\n );\n\n return class extends React.Component {\n constructor(props: any) {\n super(props);\n }\n componentDidMount() {\n callCount++;\n\n logPropDiff(componentTelemetryConfig, {}, this.props, componentName, callCount);\n }\n\n componentDidUpdate(prevProps: any) {\n callCount++;\n\n logPropDiff(\n componentTelemetryConfig,\n prevProps,\n this.props,\n componentName,\n callCount\n );\n }\n\n public render() {\n return ;\n }\n };\n };\n }\n\n return (WrappedComponent: React.ComponentType): any => WrappedComponent;\n}\n","import * as React from 'react';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\nimport { root, getServiceVersion } from '@estee/elc-universal-utils';\n\ninterface IProps {\n children: JSX.Element | null;\n serviceName: string;\n name: string;\n}\n\ninterface IState {\n error?: Error;\n}\n\nexport class ErrorBoundary extends React.Component {\n private logger: ELCLogger;\n\n constructor(props: IProps) {\n super(props);\n this.state = { error: undefined };\n this.logger = new ELCLogger({\n serviceName: props.serviceName,\n buid: root.buid || '',\n environment: root.env || '',\n serviceVersion: getServiceVersion(props.serviceName) || ''\n });\n }\n\n static getDerivedStateFromError(error?: Error) {\n return { error };\n }\n\n public componentDidCatch(error?: Error) {\n this.logger.error({\n triggerType: TriggerType.render,\n message: `Error caught in external view ${this.props.name}`,\n payload: {\n error: error,\n context: { serviceRegistry: root.ServiceRegistry }\n }\n });\n }\n\n public render() {\n return this.state.error ? null : this.props.children;\n }\n}\n","import { convertToExportedView } from '@estee/elc-service';\nimport { OLAPIC_WIDGET } from '@estee/elc-service-view-names';\nimport serviceNames from '~setup/ProductUgcService';\nimport { IOlapicWidget } from './OlapicWidget';\n\n/*eslint no-restricted-syntax: [\"off\"]*/\nexport default convertToExportedView(\n () => import('./OlapicWidget'),\n OLAPIC_WIDGET,\n serviceNames.olapicWidgetViewController\n);\n","import * as React from 'react';\nimport { ServiceManager } from './ServiceManager';\nimport { ViewController } from '../../ViewController';\nimport ViewsManager, { ImportStatement } from './ViewsManager';\nimport { ErrorBoundary } from '@estee/elc-telemetry';\n\ntype ExportedViewState = {\n viewController?: ViewController;\n component: React.ComponentClass | undefined;\n};\n\nexport function convertToExportedView(\n WrappedComponentImport: ImportStatement,\n viewName: string,\n controllerKey?: string\n) {\n return class extends React.Component> {\n static controllerName = controllerKey;\n\n constructor(props: IProps) {\n super(props);\n\n const controller = ServiceManager.serviceHasStarted\n ? ServiceManager.getController(controllerKey)\n : undefined;\n\n this.state = {\n viewController: controller,\n component: ViewsManager.getView(viewName)\n };\n }\n\n public async componentDidMount() {\n try {\n if (!ServiceManager.serviceHasStarted) {\n await ServiceManager.startService();\n }\n await ViewsManager.loadAndSaveModule(viewName, WrappedComponentImport);\n\n this.setState({\n viewController: ServiceManager.getController(controllerKey),\n component: ViewsManager.getView(viewName)\n });\n } catch (error) {\n console.error(error);\n }\n }\n\n render() {\n const Component = this.state.component;\n\n if (!ServiceManager.serviceHasStarted || !Component) {\n return null;\n }\n\n return (\n \n \n \n );\n }\n };\n}\n","\"use strict\";\n\n/* Copyright (c) 2013 Billy Tetrud - Free to use for any purpose: MIT License*/\n// gets the changes that need to happen to a to change it into b\n// returns an object with the members\n // type\n // property\n // value\n // values\n // count\nmodule.exports = function(a,b) {\n var results = []\n diffInternal(a,b,results,[])\n return results\n}\n\nvar diffInternal = function(a,b,acc,base) {\n if(a === b || Number.isNaN(a)&&Number.isNaN(b)) {\n return;\n } else if(a instanceof Array && b instanceof Array) {\n var an=a.length-1,bn=b.length-1\n while(an >= 0 && bn >= 0) { // loop backwards (so that making changes in order will work correctly)\n if(!equal(a[an], b[bn])) {\n var indexes = findMatchIndexes(equal, a,b, an,bn, 0, 0)\n\n var anInner=an,bnInner=bn\n while(anInner > indexes.a && bnInner > indexes.b) {\n if(similar(a[anInner], b[bnInner])) {\n // get change for that element\n diffInternal(a[anInner],b[bnInner],acc, base.concat([anInner]))\n anInner--; bnInner--;\n } else {\n var indexesInner = findMatchIndexes(similar, a,b, anInner,bnInner, indexes.a+1, indexes.b+1)\n\n var numberPulled = anInner-indexesInner.a\n var numberPushed = bnInner-indexesInner.b\n\n if(numberPulled === 1 && numberPushed === 1) {\n set(acc, base.concat(indexesInner.a+1), b[indexesInner.b+1]) // set the one\n } else if(numberPulled === 1 && numberPushed === 2) {\n // set one, push the other\n add(acc, base,indexesInner.a+2, b.slice(indexesInner.b+2, bnInner+1))\n set(acc, base.concat(indexesInner.a+1), b[indexesInner.b+1])\n } else if(numberPulled === 2 && numberPushed === 1) {\n // set one, pull the other\n rm(acc, base, indexesInner.a+2, 1, a)\n set(acc, base.concat(indexesInner.a+1), b[indexesInner.b+1])\n } else if(numberPulled === 2 && numberPushed === 2) {\n set(acc, base.concat(indexesInner.a+2), b[indexesInner.b+2])\n set(acc, base.concat(indexesInner.a+1), b[indexesInner.b+1])\n } else {\n if(numberPulled > 0) { // if there were some elements pulled\n rm(acc, base, indexesInner.a+1, numberPulled, a)\n }\n if(numberPushed > 0) { // if there were some elements pushed\n add(acc, base,indexesInner.a+1, b.slice(indexesInner.b+1, bnInner+1))\n }\n }\n\n anInner = indexesInner.a\n bnInner = indexesInner.b\n }\n }\n\n if(anInner > indexes.a) { // more to pull\n rm(acc, base, anInner, anInner-indexes.a, a)\n } else if(bnInner > indexes.b) { // more to push\n add(acc, base, anInner+1, b.slice(indexes.b+1, bnInner+1))\n }\n\n an = indexes.a\n bn = indexes.b\n } else {\n an--; bn--;\n }\n }\n\n if(an >= 0) { // more to pull\n rm(acc, base, 0, an+1, a)\n } else if(bn >= 0) { // more to push\n add(acc, base,0, b.slice(0, bn+1))\n }\n\n } else if(a instanceof Date && b instanceof Date) {\n if(a.getTime() !== b.getTime()) {\n set(acc, base, b)\n }\n } else if(a instanceof Object && b instanceof Object) {\n var keyMap = merge(arrayToMap(Object.keys(a)), arrayToMap(Object.keys(b)))\n for(var key in keyMap) {\n var path = base.concat([key])\n if(key in a && !(key in b)) {\n unset(acc, path)\n } else {\n diffInternal(a[key],b[key],acc, path)\n }\n }\n } else {\n set(acc, base, b)\n }\n\n // adds a 'set' type to the changeList\n function set(changeList, property, value) {\n changeList.push({\n type:'set',\n path: property,\n val: value\n })\n }\n\n // adds an 'unset' type to the changeList\n function unset(changeList, property) {\n changeList.push({\n type:'unset',\n path: property\n })\n }\n\n // adds an 'rm' type to the changeList\n function rm(changeList, property, index, count, a) {\n var finalIndex = index ? index - count + 1 : 0\n changeList.push({\n type:'rm',\n path: property,\n index: finalIndex,\n num: count,\n vals: a.slice(finalIndex, finalIndex+count)\n })\n }\n\n // adds an 'add' type to the changeList\n function add(changeList, property, index, values) {\n changeList.push({\n type:'add',\n path: property,\n index: index,\n vals: values\n })\n }\n}\n\nmodule.exports.similar = similar\nmodule.exports.equal = equal\n\n\n// finds and returns the closest indexes in a and b that match starting with divergenceIndex\n// note: loops backwards like the rest of this stuff\n// returns the index beyond the first element (aSubMin-1 or bSubMin-1) for each if there is no match\n// parameters:\n // compareFn - determines what matches (returns true if the arguments match)\n // a,b - two arrays to compare\n // divergenceIndexA,divergenceIndexB - the two positions of a and b to start comparing from\n // aSubMin,bSubMin - the two positions to compare until\nfunction findMatchIndexes(compareFn, a,b, divergenceIndexA,divergenceIndexB, aSubMin, bSubMin) {\n var maxNForA = divergenceIndexA-aSubMin\n var maxNForB = divergenceIndexB-bSubMin\n var maxN = Math.max(maxNForA, maxNForB)\n for(var n=1; n<=maxN; n++) {\n var newestA = a[divergenceIndexA-n] // the current item farthest from the divergence index being compared\n var newestB = b[divergenceIndexB-n]\n\n if(n<=maxNForB && n<=maxNForA && compareFn(newestA, newestB)) {\n return {a:divergenceIndexA-n, b:divergenceIndexB-n}\n }\n\n for(var j=0; j= 2 && notEqual > tenPercent || notEqual === a.length) {\n return false\n }\n\n notEqual++\n }\n }\n // else\n return true\n\n } else if(a instanceof Object) {\n if(!(b instanceof Object))\n return false\n\n var keyMap = merge(arrayToMap(Object.keys(a)), arrayToMap(Object.keys(b)))\n var keyLength = Object.keys(keyMap).length\n var tenPercent = keyLength / 10\n var notEqual = 0\n for(var key in keyMap) {\n var aVal = a[key]\n var bVal = b[key]\n\n if(!equal(aVal,bVal)) {\n if(notEqual >= 2 && notEqual > tenPercent || notEqual+1 === keyLength) {\n return false\n }\n\n notEqual++\n }\n }\n // else\n return true\n\n } else {\n return a===b || Number.isNaN(a) && Number.isNaN(b)\n }\n}\n\n// compares arrays and objects for value equality (all elements and members must match)\nfunction equal(a,b) {\n if(a instanceof Array) {\n if(!(b instanceof Array))\n return false\n if(a.length !== b.length) {\n return false\n } else {\n for(var n=0; n