{"version":3,"file":"static/js/vendors-index-2b4841d6-633fb48dfee7c166e56c.js","mappings":"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AAAA,EAAA,YAAAA,EAAA,WACA,cAEA,CACA,SACAA,EAAA,KAAAA,GACA,SACA,QACA,oBACA,WACA,qBACA,MAEA,KAWA,UACA,UAZA,CACA,YACA,KACA,QAAAA,EAAA,WACA,MAEA,UACA,MAQA,KACA,OAIA,oBA2CA,MAEA,YACA,YAEA,uBAAA7R,EACA,QAEA,qBACA,IAAA8E,EAAA,GAEA,EAdA,QAXA,EA2BA,mBACA,iDAqCA,2BACA,SAEA,6BAEA,KADA,EAGA,KACA,EACA,0BAPA,EASA,iBACA,WACA,UACA,YACA,SACA,IACA,KACA,uBACA,sBACA,cAEA,GA/BA,cACA,kCAEA,UADA,gBAEA,SAGA,SAwBA,MACA,SAGA,2BAIA,SACA,WAIA,yBACA,IACA,QAAA0P,EAAA,WAAAA,EAAA,aACA,EACA,gBACA,YACA,SACA,wBACA,uCAUA,GATA,CACA,mBACA,eACA,YACA,SACA,eACA,cACA,UAEA,YACA,SAGA,SACA,KACA,MAEA,GADA,gBACA,IACA,SAEA,8BAEA,CAEA,GADA,gBACA,IACA,SAEA,0BAEA,WAIA,OAEA,EALA,KACA,KAMA,UAEA,UA6DA,iBACA,kCAAA8H,cAAAA,EAAA,8RACA,EA2EA,cACA,iBACA,OACA,mBACA,WAAAC,OAAA,EAAAA,EA/EA,MACA,mBACA,qBACA,kCACA,CACA,KAAAzF,EAAA,SACA,cACA,yBAIA,CACA,KAAAA,EAAA,SACA,eAGA,0BACA,OACA,KAAAA,EAAA,aACA,YACA,oBACA,oBACA,UAEA,oBACA,OA8GA,cACA,qTACA,EA9TA,kBACA,IACA,mBACA,SAEA,uBACA,2BACA,cAIA,kCAEA,UADA,gBAEA,SAIA,KACA,oBAGA,UAEA,SAsSA,CAAAtO,EAAA,OACA,EAhfrC,SAAyBoR,GACrB,GAAIA,aAAmB4C,gBACnB,MAAO,OAEX,MAAMC,EAAmBxM,EAAY2J,EAAQH,SAC7C,OAAI4B,GAAarP,KAAKyQ,GACX,MAEJA,EAwe0B,IACA,SACA,4BACA,qBACA,wBACA,wBACA,yCAGA,kBACA,2CACA,kBAEA,WACA,IACA,QAEA,WACA,aACA,OACA,yBAGA,gBACA,WACA,+CACA,mBACA,IACA,wBAGA,gBACA,gBACA,cACA,cACA,UACA,OACA,cACA,YACA,kCACA,wBACA,OACAhD,QAAA,EAAAA,GACA,sBAEA,WACA,WACA,UACA,QACA,gBAGA,IACA,aAGA,eACA,sBACA,qBAGA,YAGA,mBACA,uBAzpBrC,SAAyBiD,GACrB,MAAMC,EAAMD,EAAOE,WAAW,MAC9B,IAAKD,EACD,OAAO,EAEX,IAAK,IAAIhL,EAAI,EAAO+K,EAAOG,MAAXlL,EAAkBA,GADhB,GAEd,IAAK,IAAImL,EAAI,EAAOJ,EAAOK,OAAXD,EAAmBA,GAFrB,GAEqC,CAC/C,MAAME,EAAeL,EAAIK,aAKzB,GADoB,IAAIC,aAHKnD,KAA2BkD,EAClDA,EAAoC,mBACpCA,GACmDvZ,KAAKkZ,EAAKhL,EAAGmL,EAAGnY,KAAKuY,IAPpE,GAOmFR,EAAOG,MAAQlL,GAAIhN,KAAKuY,IAP3G,GAO0HR,EAAOK,OAASD,IAAIvR,KAAK1H,QAC7IsZ,MAAMC,GAAoB,IAAVA,IAC5B,OAAO,EAGnB,OAAO,GA0oB0B,MACA,iDAGA,uBACA,sCACA,4BACA,gBACA,kBAEA,IADA,gCAEA,gBAIA,iBACA,KACA,6BACA,wBAEA,UAEA,GADA,oCACA,eACA,OACA,gCACA,IACA,wBACA,0BACA,oBACA,4CAEA,SACA,+BAMA,OALA,+BACA,+BACA,IAEA,8BAOA,8BACA,EACA,gBACA,mCAGA,+BACA,IAEA,6BAEA,2BACA,kBAAAC,OACA,SACA,SACA,qCAEA,IACA,eACA,8BAEA,cACA,6BAGA,MACA,kDACA,GACA,cACA,kBACA,oBAGA,yBACA,uBACA,uBAEA,OAEA,MACA,IACA,wBACA,MAEA,UAEA,OACA,KAAAvG,EAAA,QACA,UACA,aACA,cACA,oBACA,YACA,SACA,YArRA,IACA,MACA,aACA,gBACA,kBACA,mBACA,kBACA,mBACA,cACA,iBACA,eACA,eACA,kBACA,oBACA,SACA,cACA,gBACA,kBACA,mBACA,uBAEA,iBACA,OAkCA,cACA,wJACA,qCACA,oBACA,4BACA,uBACA,yBACA,SACA,IACA,kCAEAD,EAAA,mFACA,yBAGA,UAGA,kBAEA,IACA,wBAEA,wBACA,kBACA,IACA,qBACA,wBAEA,wBACA,IACA,kBACA,wBAEA,oBAMA,KACA,sBANA,GACA,UACA,UACA,sBAIA,UACA,QACA,gBAGA,OACA,KAAAC,EAAA,KACA,kBACA,UACA,UArFA,CAAAtO,EAAA,CACA,MACA,cACA,gBACA,kBACA,mBACA,qBACA,aACA,mBACA,cACA,WAEA,0BACA,OACA,KAAAsO,EAAA,MACA,eACA,UAEA,oBACA,OACA,KAAAA,EAAA,QACA,YAAAtO,EAAA,gBACA,UAEA,QACA,UAyOA,eACA,eACA,GAGA,gBA2EA,YAAAA,EAAA,GACA,kCAAA8T,cAAAA,EAAA,obACA,+BACA,cACA,MACA,SACA,aACA,gBACA,cACA,kBACA,gBACA,kBACA,mBACA,qBACA,mBACA,mBACA,kBACA,aACA,cACA,iBACA,eACA,eACA,kBACA,sBAEA,MAEA,YAEA,MAEA,EADA,aACA,YAvGA,cACA,gBAAA/a,OAAAuV,EAAA,QACA,SAEA,YAAAA,EAAA,SACA,cACA,sBACA,qBACA,8BACA,qCACA,4BACA,oBACA,+BACA,oCACA,8BACA,SAEA,mBACA,wDACA,qBACA,kEACA,4CACA,+BACA,2CACA,yCACA,SAEA,uBACA,2BACA,sDACA,SAEA,sBACA,sDACA,KAAAwG,WAAA,+BACA,mBAAAA,WAAA,OACA,SAEA,sBACA,kCACA,mBAAAA,WAAA,OACA,iBAAAA,WAAA,OACA,SAEA,6BACA,+BACA,SAEA,0BACA,kCACA,mBAAAA,WAAA,OACA,mBAAAA,WAAA,OACA,mBAAAA,WAAA,OACA,gBAAAA,WAAA,OACA,KAAAA,WAAA,8BACA,KAAAA,WAAA,8BACA,SAEA,4BACA,oDACA,6BAAAA,WAAA,OACA,oBAAAA,WAAA,OACA,yBAAAA,WAAA,OACA,mBAAAA,WAAA,OACA,sBAAAA,WAAA,OACA,oCAAAA,WAAA,OACA,UAIA,SAmCA,QACA,GACA,SAAAxG,EAAA,MACA,WACA,gDAIA,MApxBhB,EAsxBgB,gCAEA,GADA,YAvxBhB,IAwxBgB,EACA,YAEA,GACA,KAEA,SACA,YAAAA,EAAA,SACA,yBACA,YACA,qBACA,UACA,mBAEA,aAAAA,EAAA,UACA,SAAAA,EAAA,UACA,GACA,kBACA,SAAAA,EAAA,SACA,qBACA,MAEA,SACA,MACA,SACA,aACA,gBACA,cACA,kBACA,gBACA,kBACA,mBACA,qBACA,YACA,mBACA,mBACA,kBACA,aACA,cACA,iBACA,iBACA,eACA,eACA,qBACA,cACA,eACA,oBACA,mBACA,wBACA,mBAEA,yCACA,gBACA,GACA,qBAGA,GA/kCrC,SAAmBtO,GACf,OAAOA,EAAExB,WAAawB,EAAE+U,aA8kCSC,CAAA,iBACA,oDACA,gBACA,IACA,kBACA,eACA,uBA8FA,OAzFA,cACA,iBACA,kBACA,eAEA,SAAA1G,EAAA,SACA,sBArjBA,gBACA,wBACA,MACA,OAEA,IACA,EADA,KAEA,IACA,wBAEA,SACA,OAEA,mBACA,QAAAmE,IAAA,KACA,IACA,IACA,QAEA,GAMA,YALA,gCACAE,GAAA,GACA,KACA,OAIA,sBACA,wBACA,WACA,WAEA,OADAF,GAAA,KACA,6BAEA,6BAohBA,SACA,QAAAzS,EAAA,gBACA,SACA,cACA,MACA,SACA,aACA,gBACA,kBACA,cACA,gBACA,kBACA,mBACA,qBACA,aACA,mBACA,mBACA,kBACA,aACA,cACA,iBACA,iBACA,eACA,eACA,qBACA,cACA,eACA,oBACA,mBACA,wBACA,oBAEA,GACA,UAGA,GAEA,SAAAsO,EAAA,SACA,oBACA,oCACA,iCACA,8BACA,oCACA,WAAA2G,EAAA,mBA9jBA,gBACA,IACA,EADA,KAEA,IACA,UAEA,SACA,OAEA,KACA,OACA,QAAAxC,IAAA,KACA,IACA,IACA,QAEA,GACA,gCACAE,GAAA,GACA,KACA,OA2iBA,SACA,MACA,cACA,MACA,SACA,aACA,gBACA,kBACA,cACA,gBACA,kBACA,mBACA,qBACA,aACA,mBACA,mBACA,kBACA,aACA,cACA,iBACA,i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ACA,MACA,8CACA,EAAAyQ,EAAA,UACA,gBACA,KAGA,OACA,MAAAC,EAAA,KACA,SACA,UAEA,GADAC,EAAAA,EAAA,SACA,GACA,8CAEA,QADA,WAEA,SACA,WACA,IACA,MAEA,CACA,gBACA,iBACA,wBACA,6BAIA,QADA,kBAFA,aACA,MAEA,CACA,IACA,WAOA,OACA,OAAA5e,MACA,2BAEA,MAEA,aACA,aAAAuO,EAAA,OACA,WAEA,SACA,iBACA,UACA,6BACA,kBAEA,0BACA,mCACA,2BACA,SACA,sBACA,6BACA,oCACA,qCACA,0BACA,4BACA,+BACA,qBAIA,OACA,6BACA,iBAGA,0BACA,mCACA,qBACA,SAEA,gBACA,qBACA,kBACA,iBAGA,cACA,mBACA,8BACA,gBACA,sBACA,sBACA,wBACA,iBACA,qBAEA,yBACA,6BAGA,eACA,qBACA,6BACA,GAAA7Q,EAAA,oEACA,gBACA,WAAA1C,KAAA,CACA,MAAA6jB,GAAA,oHACA,gBACA,gCACA,uBACA,EACA,gBAGA,MAEA,kBACA,QAAAnhB,EAAA,OACA,MAAAA,EAAA,cACA,2BACA,gBACA,aACA,YACA,WACA,WACA,uCACA,UACA,SAGA,KACA,SAFA,qGAGA,UACA,QACA,+BAGA,4EACA,eACA,OAEA,sCACA,yBACA,YACA,yBACA,qBAIA,OAHA,WAqBA,GAfA,IACA,GACA,cACA,cACA,aACA,qBAEA,wBACA,mCAEA,YACA,qBACA,6CACA,8CAEA,kBACA,wEACA,cACA,uBACA,IACA,mBACA,6CAEA,SACA,4BAGA,iDACA,YACA,mCAEA,oCACA,oCACA,iCACA,iCACA,mCAEA,eADA,OACA,EAGA,MAIA,4BAGA,mCACA,mCACA,mBAKA,MAEA,gBACA,2EACA,OAEA,oDACA,eAAAiF,SAAA,IACA,6BACA,cACA,KAAA4Y,OAAA,MAAA7d,EAAA,aACA,KAAA6d,OAAA,MAAA7d,EAAA,QACA,yEACA,oBF5PnC,SAAsB6E,EAAGgZ,GACrB,OAA4B,IAArBA,EAAO7I,MAAMnQ,GE4PW,kBAGA,sBACA,oBACA,wBAEA,qCACA,2BA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","sources":["webpack://leadsbridge/./node_modules/@reduxjs/toolkit/node_modules/redux-thunk/es/index.js","webpack://leadsbridge/./node_modules/@tapfiliate/tapfiliate-js/index.js","webpack://leadsbridge/./node_modules/exenv/index.js","webpack://leadsbridge/./node_modules/filter-obj/index.js","webpack://leadsbridge/./node_modules/html-escaper/esm/index.js","webpack://leadsbridge/./node_modules/ieee754/index.js","webpack://leadsbridge/./node_modules/isarray/index.js","webpack://leadsbridge/./node_modules/load-script/index.js","webpack://leadsbridge/./node_modules/nanoclone/src/index.js","webpack://leadsbridge/./node_modules/object-assign/index.js","webpack://leadsbridge/./node_modules/path-to-regexp/index.js","webpack://leadsbridge/./node_modules/path-to-regexp/node_modules/isarray/index.js","webpack://leadsbridge/./node_modules/prop-types/index.js","webpack://leadsbridge/./node_modules/property-expr/index.js","webpack://leadsbridge/./node_modules/query-string/index.js","webpack://leadsbridge/./node_modules/querystring/index.js","webpack://leadsbridge/./node_modules/scheduler/index.js","webpack://leadsbridge/./node_modules/shallowequal/index.js","webpack://leadsbridge/./node_modules/split-on-first/index.js","webpack://leadsbridge/./node_modules/strict-uri-encode/index.js","webpack://leadsbridge/./node_modules/symbol-observable/es/index.js","webpack://leadsbridge/./node_modules/toposort/index.js","webpack://leadsbridge/./node_modules/universal-cookie/es6/index.js","webpack://leadsbridge/./node_modules/universal-cookie/node_modules/cookie/index.js","webpack://leadsbridge/./node_modules/uuid/index.js","webpack://leadsbridge/./node_modules/void-elements/index.js","webpack://leadsbridge/./node_modules/zen-observable/index.js","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/constants.ts","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/utils.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/types/dist/rrweb-types.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/mutation.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/error-handler.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/observer.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/cross-origin-iframe-mirror.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/iframe-manager.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/stylesheet-manager.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/processed-node-manager.js","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/index.js","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/timestamp.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/addBreadcrumbEvent.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/domUtils.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/onWindowOpen.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleClick.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/types/rrweb.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/createBreadcrumb.ts","webpack://leadsbridge/./node_modules/node_modules/@sentry-internal/rrweb-snapshot/es/rrweb-snapshot.js","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/getAttributesToRecord.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleDom.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleKeyboardEvent.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/createPerformanceEntries.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/debug-build.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/logger.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/eventBuffer/error.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/eventBuffer/EventBufferArray.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/eventBuffer/WorkerHandler.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/eventBuffer/EventBufferCompressionWorker.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/eventBuffer/EventBufferProxy.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/eventBuffer/index.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay-worker/build/esm/index.js","webpack://leadsbridge/./node_modules/@sentry-internal/replay-worker/build/esm/worker.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/hasSessionStorage.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/session/clearSession.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/isSampled.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/session/Session.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/session/saveSession.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/session/createSession.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/isExpired.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/isSessionExpired.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/session/shouldRefreshSession.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/session/loadOrCreateSession.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/session/fetchSession.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/addEvent.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/eventUtils.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleAfterSendEvent.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleBeforeSendEvent.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleBreadcrumbs.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/resetReplayIdOnDynamicSamplingContext.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleGlobalEvent.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/addFeedbackBreadcrumb.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/isRrwebError.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/shouldSampleForBufferEvent.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/createPerformanceSpans.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleHistory.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/addNetworkBreadcrumb.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/shouldFilterRequest.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/networkUtils.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/fetchUtils.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/util/xhrUtils.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/handleNetworkBreadcrumbs.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/addMemoryEntry.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/handleRecordingEmit.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/sendReplayRequest.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/prepareRecordingData.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/prepareReplayEvent.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/createReplayEnvelope.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/sendReplay.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/throttle.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/replay.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/debounce.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/addGlobalListeners.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/coreHandlers/performanceObserver.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/getPrivacyOptions.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/integration.ts","webpack://leadsbridge/./node_modules/@sentry-internal/replay/src/util/maskAttribute.ts","webpack://leadsbridge/./node_modules/@sentry/core/src/asyncContext/index.ts"],"sourcesContent":["/** A function that accepts a potential \"extra argument\" value to be injected later,\r\n * and returns an instance of the thunk middleware that uses that value\r\n */\nfunction createThunkMiddleware(extraArgument) {\n // Standard Redux middleware definition pattern:\n // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware\n var middleware = function middleware(_ref) {\n var dispatch = _ref.dispatch,\n getState = _ref.getState;\n return function (next) {\n return function (action) {\n // The thunk middleware looks for any functions that were passed to `store.dispatch`.\n // If this \"action\" is really a function, call it and return the result.\n if (typeof action === 'function') {\n // Inject the store's `dispatch` and `getState` methods, as well as any \"extra arg\"\n return action(dispatch, getState, extraArgument);\n } // Otherwise, pass the action down the middleware chain as usual\n\n\n return next(action);\n };\n };\n };\n\n return middleware;\n}\n\nvar thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version\n// with whatever \"extra arg\" they want to inject into their thunks\n\nthunk.withExtraArgument = createThunkMiddleware;\nexport default thunk;","const handler = {\n get: function (target, name) {\n return target.hasOwnProperty(name)\n ? target[name]\n : (...args) => {\n window.__tap(name, ...args);\n };\n }\n};\n\nconst target = {\n init: (\n accountId,\n createOptions = { integration: \"npm-module\" },\n createCallback,\n detectOptions = {},\n detectCallback\n ) => {\n if (window.__tap) return;\n\n (function (t, a, p) {\n t.TapfiliateObject = a;\n t[a] =\n t[a] ||\n function () {\n (t[a].q = t[a].q || []).push(arguments);\n };\n })(window, \"__tap\");\n\n var script = document.createElement(\"script\");\n script.src = \"https://script.tapfiliate.com/tapfiliate.js\";\n script.type = \"text/javascript\";\n script.async = true;\n\n document.getElementsByTagName(\"head\")[0].appendChild(script);\n script.addEventListener(\"error\", () => {\n new Error(`${this.src} failed to load.`);\n });\n\n window.__tap(\"create\", accountId, createOptions, createCallback);\n window.__tap(\"detect\", detectOptions, detectCallback);\n }\n};\nvar Tap = new Proxy(target, handler);\n\nexport default Tap;\n","/*!\n Copyright (c) 2015 Jed Watson.\n Based on code that is Copyright 2013-2015, Facebook, Inc.\n All rights reserved.\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar canUseDOM = !!(\n\t\ttypeof window !== 'undefined' &&\n\t\twindow.document &&\n\t\twindow.document.createElement\n\t);\n\n\tvar ExecutionEnvironment = {\n\n\t\tcanUseDOM: canUseDOM,\n\n\t\tcanUseWorkers: typeof Worker !== 'undefined',\n\n\t\tcanUseEventListeners:\n\t\t\tcanUseDOM && !!(window.addEventListener || window.attachEvent),\n\n\t\tcanUseViewport: canUseDOM && !!window.screen\n\n\t};\n\n\tif (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\tdefine(function () {\n\t\t\treturn ExecutionEnvironment;\n\t\t});\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = ExecutionEnvironment;\n\t} else {\n\t\twindow.ExecutionEnvironment = ExecutionEnvironment;\n\t}\n\n}());\n","'use strict';\nmodule.exports = function (obj, predicate) {\n\tvar ret = {};\n\tvar keys = Object.keys(obj);\n\tvar isArr = Array.isArray(predicate);\n\n\tfor (var i = 0; i < keys.length; i++) {\n\t\tvar key = keys[i];\n\t\tvar val = obj[key];\n\n\t\tif (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {\n\t\t\tret[key] = val;\n\t\t}\n\t}\n\n\treturn ret;\n};\n","/**\n * Copyright (C) 2017-present by Andrea Giammarchi - @WebReflection\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nvar replace = ''.replace;\n\nvar ca = /[&<>'\"]/g;\nvar es = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g;\n\nvar esca = {\n '&': '&',\n '<': '<',\n '>': '>',\n \"'\": ''',\n '\"': '"'\n};\nvar unes = {\n '&': '&',\n '&': '&',\n '<': '<',\n '<': '<',\n '>': '>',\n '>': '>',\n ''': \"'\",\n ''': \"'\",\n '"': '\"',\n '"': '\"'\n};\n\nexport function escape(es) {\n return replace.call(es, ca, pe);\n};\n\nexport function unescape(un) {\n return replace.call(un, es, cape);\n};\n\nfunction pe(m) {\n return esca[m];\n}\n\nfunction cape(m) {\n return unes[m];\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","\nmodule.exports = function load (src, opts, cb) {\n var head = document.head || document.getElementsByTagName('head')[0]\n var script = document.createElement('script')\n\n if (typeof opts === 'function') {\n cb = opts\n opts = {}\n }\n\n opts = opts || {}\n cb = cb || function() {}\n\n script.type = opts.type || 'text/javascript'\n script.charset = opts.charset || 'utf8';\n script.async = 'async' in opts ? !!opts.async : true\n script.src = src\n\n if (opts.attrs) {\n setAttributes(script, opts.attrs)\n }\n\n if (opts.text) {\n script.text = '' + opts.text\n }\n\n var onend = 'onload' in script ? stdOnEnd : ieOnEnd\n onend(script, cb)\n\n // some good legacy browsers (firefox) fail the 'in' detection above\n // so as a fallback we always set onload\n // old IE will ignore this and new IE will set onload\n if (!script.onload) {\n stdOnEnd(script, cb);\n }\n\n head.appendChild(script)\n}\n\nfunction setAttributes(script, attrs) {\n for (var attr in attrs) {\n script.setAttribute(attr, attrs[attr]);\n }\n}\n\nfunction stdOnEnd (script, cb) {\n script.onload = function () {\n this.onerror = this.onload = null\n cb(null, script)\n }\n script.onerror = function () {\n // this.onload = null here is necessary\n // because even IE9 works not like others\n this.onerror = this.onload = null\n cb(new Error('Failed to load ' + this.src), script)\n }\n}\n\nfunction ieOnEnd (script, cb) {\n script.onreadystatechange = function () {\n if (this.readyState != 'complete' && this.readyState != 'loaded') return\n this.onreadystatechange = null\n cb(null, script) // there is no way to catch loading errors in IE8\n }\n}\n","// ES6 Map\nvar map\ntry {\n map = Map\n} catch (_) { }\nvar set\n\n// ES6 Set\ntry {\n set = Set\n} catch (_) { }\n\nfunction baseClone (src, circulars, clones) {\n // Null/undefined/functions/etc\n if (!src || typeof src !== 'object' || typeof src === 'function') {\n return src\n }\n\n // DOM Node\n if (src.nodeType && 'cloneNode' in src) {\n return src.cloneNode(true)\n }\n\n // Date\n if (src instanceof Date) {\n return new Date(src.getTime())\n }\n\n // RegExp\n if (src instanceof RegExp) {\n return new RegExp(src)\n }\n\n // Arrays\n if (Array.isArray(src)) {\n return src.map(clone)\n }\n\n // ES6 Maps\n if (map && src instanceof map) {\n return new Map(Array.from(src.entries()))\n }\n\n // ES6 Sets\n if (set && src instanceof set) {\n return new Set(Array.from(src.values()))\n }\n\n // Object\n if (src instanceof Object) {\n circulars.push(src)\n var obj = Object.create(src)\n clones.push(obj)\n for (var key in src) {\n var idx = circulars.findIndex(function (i) {\n return i === src[key]\n })\n obj[key] = idx > -1 ? clones[idx] : baseClone(src[key], circulars, clones)\n }\n return obj\n }\n\n // ???\n return src\n}\n\nexport default function clone (src) {\n return baseClone(src, [], [])\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","var isarray = require('isarray')\n\n/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = []\n var key = 0\n var index = 0\n var path = ''\n var defaultDelimiter = options && options.delimiter || '/'\n var res\n\n while ((res = PATH_REGEXP.exec(str)) != null) {\n var m = res[0]\n var escaped = res[1]\n var offset = res.index\n path += str.slice(index, offset)\n index = offset + m.length\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1]\n continue\n }\n\n var next = str[index]\n var prefix = res[2]\n var name = res[3]\n var capture = res[4]\n var group = res[5]\n var modifier = res[6]\n var asterisk = res[7]\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n }\n\n var partial = prefix != null && next != null && next !== prefix\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = res[2] || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n })\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index)\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path)\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options), options)\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens, options) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length)\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options))\n }\n }\n\n return function (obj, opts) {\n var path = ''\n var data = obj || {}\n var options = opts || {}\n var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n path += token\n\n continue\n }\n\n var value = data[token.name]\n var segment\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j])\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys\n return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {!Array} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g)\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n asterisk: false,\n pattern: null\n })\n }\n }\n\n return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = []\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source)\n }\n\n var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {!Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var route = ''\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n route += escapeString(token)\n } else {\n var prefix = escapeString(token.prefix)\n var capture = '(?:' + token.pattern + ')'\n\n keys.push(token)\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*'\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?'\n } else {\n capture = prefix + '(' + capture + ')?'\n }\n } else {\n capture = prefix + '(' + capture + ')'\n }\n\n route += capture\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/')\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n }\n\n if (end) {\n route += '$'\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\n","module.exports = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Based on Kendo UI Core expression code <https://github.com/telerik/kendo-ui-core#license-information>\n */\n'use strict'\n\nfunction Cache(maxSize) {\n this._maxSize = maxSize\n this.clear()\n}\nCache.prototype.clear = function () {\n this._size = 0\n this._values = Object.create(null)\n}\nCache.prototype.get = function (key) {\n return this._values[key]\n}\nCache.prototype.set = function (key, value) {\n this._size >= this._maxSize && this.clear()\n if (!(key in this._values)) this._size++\n\n return (this._values[key] = value)\n}\n\nvar SPLIT_REGEX = /[^.^\\]^[]+|(?=\\[\\]|\\.\\.)/g,\n DIGIT_REGEX = /^\\d+$/,\n LEAD_DIGIT_REGEX = /^\\d/,\n SPEC_CHAR_REGEX = /[~`!#$%\\^&*+=\\-\\[\\]\\\\';,/{}|\\\\\":<>\\?]/g,\n CLEAN_QUOTES_REGEX = /^\\s*(['\"]?)(.*?)(\\1)\\s*$/,\n MAX_CACHE_SIZE = 512\n\nvar pathCache = new Cache(MAX_CACHE_SIZE),\n setCache = new Cache(MAX_CACHE_SIZE),\n getCache = new Cache(MAX_CACHE_SIZE)\n\nvar config\n\nmodule.exports = {\n Cache: Cache,\n\n split: split,\n\n normalizePath: normalizePath,\n\n setter: function (path) {\n var parts = normalizePath(path)\n\n return (\n setCache.get(path) ||\n setCache.set(path, function setter(obj, value) {\n var index = 0\n var len = parts.length\n var data = obj\n\n while (index < len - 1) {\n var part = parts[index]\n if (\n part === '__proto__' ||\n part === 'constructor' ||\n part === 'prototype'\n ) {\n return obj\n }\n\n data = data[parts[index++]]\n }\n data[parts[index]] = value\n })\n )\n },\n\n getter: function (path, safe) {\n var parts = normalizePath(path)\n return (\n getCache.get(path) ||\n getCache.set(path, function getter(data) {\n var index = 0,\n len = parts.length\n while (index < len) {\n if (data != null || !safe) data = data[parts[index++]]\n else return\n }\n return data\n })\n )\n },\n\n join: function (segments) {\n return segments.reduce(function (path, part) {\n return (\n path +\n (isQuoted(part) || DIGIT_REGEX.test(part)\n ? '[' + part + ']'\n : (path ? '.' : '') + part)\n )\n }, '')\n },\n\n forEach: function (path, cb, thisArg) {\n forEach(Array.isArray(path) ? path : split(path), cb, thisArg)\n },\n}\n\nfunction normalizePath(path) {\n return (\n pathCache.get(path) ||\n pathCache.set(\n path,\n split(path).map(function (part) {\n return part.replace(CLEAN_QUOTES_REGEX, '$2')\n })\n )\n )\n}\n\nfunction split(path) {\n return path.match(SPLIT_REGEX)\n}\n\nfunction forEach(parts, iter, thisArg) {\n var len = parts.length,\n part,\n idx,\n isArray,\n isBracket\n\n for (idx = 0; idx < len; idx++) {\n part = parts[idx]\n\n if (part) {\n if (shouldBeQuoted(part)) {\n part = '\"' + part + '\"'\n }\n\n isBracket = isQuoted(part)\n isArray = !isBracket && /^\\d+$/.test(part)\n\n iter.call(thisArg, part, isBracket, isArray, idx, parts)\n }\n }\n}\n\nfunction isQuoted(str) {\n return (\n typeof str === 'string' && str && [\"'\", '\"'].indexOf(str.charAt(0)) !== -1\n )\n}\n\nfunction hasLeadingNumber(part) {\n return part.match(LEAD_DIGIT_REGEX) && !part.match(DIGIT_REGEX)\n}\n\nfunction hasSpecialChars(part) {\n return SPEC_CHAR_REGEX.test(part)\n}\n\nfunction shouldBeQuoted(part) {\n return !isQuoted(part) && (hasLeadingNumber(part) || hasSpecialChars(part))\n}\n","'use strict';\nconst strictUriEncode = require('strict-uri-encode');\nconst decodeComponent = require('decode-uri-component');\nconst splitOnFirst = require('split-on-first');\nconst filterObject = require('filter-obj');\n\nconst isNullOrUndefined = value => value === null || value === undefined;\n\nconst encodeFragmentIdentifier = Symbol('encodeFragmentIdentifier');\n\nfunction encoderForArrayFormat(options) {\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tconst index = result.length;\n\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[', index, ']'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')\n\t\t\t\t];\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[]'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '[]=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\tcase 'bracket-separator': {\n\t\t\tconst keyValueSep = options.arrayFormat === 'bracket-separator' ?\n\t\t\t\t'[]=' :\n\t\t\t\t'=';\n\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\t// Translate null to an empty string so that it doesn't serialize as 'null'\n\t\t\t\tvalue = value === null ? '' : value;\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn [[encode(key, options), keyValueSep, encode(value, options)].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, encode(key, options)];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t};\n\t}\n}\n\nfunction parserForArrayFormat(options) {\n\tlet result;\n\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /\\[(\\d*)\\]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(\\[\\])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n\t\t\t\tconst isEncodedArray = (typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator));\n\t\t\t\tvalue = isEncodedArray ? decode(value, options) : value;\n\t\t\t\tconst newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);\n\t\t\t\taccumulator[key] = newValue;\n\t\t\t};\n\n\t\tcase 'bracket-separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = /(\\[\\])$/.test(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!isArray) {\n\t\t\t\t\taccumulator[key] = value ? decode(value, options) : value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst arrayValue = value === null ?\n\t\t\t\t\t[] :\n\t\t\t\t\tvalue.split(options.arrayFormatSeparator).map(item => decode(item, options));\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = arrayValue;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], arrayValue);\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\t}\n}\n\nfunction validateArrayFormatSeparator(value) {\n\tif (typeof value !== 'string' || value.length !== 1) {\n\t\tthrow new TypeError('arrayFormatSeparator must be single character string');\n\t}\n}\n\nfunction encode(value, options) {\n\tif (options.encode) {\n\t\treturn options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction decode(value, options) {\n\tif (options.decode) {\n\t\treturn decodeComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t}\n\n\tif (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input))\n\t\t\t.sort((a, b) => Number(a) - Number(b))\n\t\t\t.map(key => input[key]);\n\t}\n\n\treturn input;\n}\n\nfunction removeHash(input) {\n\tconst hashStart = input.indexOf('#');\n\tif (hashStart !== -1) {\n\t\tinput = input.slice(0, hashStart);\n\t}\n\n\treturn input;\n}\n\nfunction getHash(url) {\n\tlet hash = '';\n\tconst hashStart = url.indexOf('#');\n\tif (hashStart !== -1) {\n\t\thash = url.slice(hashStart);\n\t}\n\n\treturn hash;\n}\n\nfunction extract(input) {\n\tinput = removeHash(input);\n\tconst queryStart = input.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\n\treturn input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n\tif (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {\n\t\tvalue = Number(value);\n\t} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n\t\tvalue = value.toLowerCase() === 'true';\n\t}\n\n\treturn value;\n}\n\nfunction parse(query, options) {\n\toptions = Object.assign({\n\t\tdecode: true,\n\t\tsort: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',',\n\t\tparseNumbers: false,\n\t\tparseBooleans: false\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = parserForArrayFormat(options);\n\n\t// Create an object with no prototype\n\tconst ret = Object.create(null);\n\n\tif (typeof query !== 'string') {\n\t\treturn ret;\n\t}\n\n\tquery = query.trim().replace(/^[?#&]/, '');\n\n\tif (!query) {\n\t\treturn ret;\n\t}\n\n\tfor (const param of query.split('&')) {\n\t\tif (param === '') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet [key, value] = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '=');\n\n\t\t// Missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tvalue = value === undefined ? null : ['comma', 'separator', 'bracket-separator'].includes(options.arrayFormat) ? value : decode(value, options);\n\t\tformatter(decode(key, options), value, ret);\n\t}\n\n\tfor (const key of Object.keys(ret)) {\n\t\tconst value = ret[key];\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const k of Object.keys(value)) {\n\t\t\t\tvalue[k] = parseValue(value[k], options);\n\t\t\t}\n\t\t} else {\n\t\t\tret[key] = parseValue(value, options);\n\t\t}\n\t}\n\n\tif (options.sort === false) {\n\t\treturn ret;\n\t}\n\n\treturn (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {\n\t\tconst value = ret[key];\n\t\tif (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t// Sort object keys, not values\n\t\t\tresult[key] = keysSorter(value);\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = (object, options) => {\n\tif (!object) {\n\t\treturn '';\n\t}\n\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ','\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst shouldFilter = key => (\n\t\t(options.skipNull && isNullOrUndefined(object[key])) ||\n\t\t(options.skipEmptyString && object[key] === '')\n\t);\n\n\tconst formatter = encoderForArrayFormat(options);\n\n\tconst objectCopy = {};\n\n\tfor (const key of Object.keys(object)) {\n\t\tif (!shouldFilter(key)) {\n\t\t\tobjectCopy[key] = object[key];\n\t\t}\n\t}\n\n\tconst keys = Object.keys(objectCopy);\n\n\tif (options.sort !== false) {\n\t\tkeys.sort(options.sort);\n\t}\n\n\treturn keys.map(key => {\n\t\tconst value = object[key];\n\n\t\tif (value === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (value === null) {\n\t\t\treturn encode(key, options);\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.length === 0 && options.arrayFormat === 'bracket-separator') {\n\t\t\t\treturn encode(key, options) + '[]';\n\t\t\t}\n\n\t\t\treturn value\n\t\t\t\t.reduce(formatter(key), [])\n\t\t\t\t.join('&');\n\t\t}\n\n\t\treturn encode(key, options) + '=' + encode(value, options);\n\t}).filter(x => x.length > 0).join('&');\n};\n\nexports.parseUrl = (url, options) => {\n\toptions = Object.assign({\n\t\tdecode: true\n\t}, options);\n\n\tconst [url_, hash] = splitOnFirst(url, '#');\n\n\treturn Object.assign(\n\t\t{\n\t\t\turl: url_.split('?')[0] || '',\n\t\t\tquery: parse(extract(url), options)\n\t\t},\n\t\toptions && options.parseFragmentIdentifier && hash ? {fragmentIdentifier: decode(hash, options)} : {}\n\t);\n};\n\nexports.stringifyUrl = (object, options) => {\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\t[encodeFragmentIdentifier]: true\n\t}, options);\n\n\tconst url = removeHash(object.url).split('?')[0] || '';\n\tconst queryFromUrl = exports.extract(object.url);\n\tconst parsedQueryFromUrl = exports.parse(queryFromUrl, {sort: false});\n\n\tconst query = Object.assign(parsedQueryFromUrl, object.query);\n\tlet queryString = exports.stringify(query, options);\n\tif (queryString) {\n\t\tqueryString = `?${queryString}`;\n\t}\n\n\tlet hash = getHash(object.url);\n\tif (object.fragmentIdentifier) {\n\t\thash = `#${options[encodeFragmentIdentifier] ? encode(object.fragmentIdentifier, options) : object.fragmentIdentifier}`;\n\t}\n\n\treturn `${url}${queryString}${hash}`;\n};\n\nexports.pick = (input, filter, options) => {\n\toptions = Object.assign({\n\t\tparseFragmentIdentifier: true,\n\t\t[encodeFragmentIdentifier]: false\n\t}, options);\n\n\tconst {url, query, fragmentIdentifier} = exports.parseUrl(input, options);\n\treturn exports.stringifyUrl({\n\t\turl,\n\t\tquery: filterObject(query, filter),\n\t\tfragmentIdentifier\n\t}, options);\n};\n\nexports.exclude = (input, filter, options) => {\n\tconst exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);\n\n\treturn exports.pick(input, exclusionFilter, options);\n};\n","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","//\n\nmodule.exports = function shallowEqual(objA, objB, compare, compareContext) {\n var ret = compare ? compare.call(compareContext, objA, objB) : void 0;\n\n if (ret !== void 0) {\n return !!ret;\n }\n\n if (objA === objB) {\n return true;\n }\n\n if (typeof objA !== \"object\" || !objA || typeof objB !== \"object\" || !objB) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n\n // Test for A's keys different from B.\n for (var idx = 0; idx < keysA.length; idx++) {\n var key = keysA[idx];\n\n if (!bHasOwnProperty(key)) {\n return false;\n }\n\n var valueA = objA[key];\n var valueB = objB[key];\n\n ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;\n\n if (ret === false || (ret === void 0 && valueA !== valueB)) {\n return false;\n }\n }\n\n return true;\n};\n","'use strict';\n\nmodule.exports = (string, separator) => {\n\tif (!(typeof string === 'string' && typeof separator === 'string')) {\n\t\tthrow new TypeError('Expected the arguments to be of type `string`');\n\t}\n\n\tif (separator === '') {\n\t\treturn [string];\n\t}\n\n\tconst separatorIndex = string.indexOf(separator);\n\n\tif (separatorIndex === -1) {\n\t\treturn [string];\n\t}\n\n\treturn [\n\t\tstring.slice(0, separatorIndex),\n\t\tstring.slice(separatorIndex + separator.length)\n\t];\n};\n","'use strict';\nmodule.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);\n","/* global window */\nimport ponyfill from './ponyfill.js';\n\nvar root;\n\nif (typeof self !== 'undefined') {\n root = self;\n} else if (typeof window !== 'undefined') {\n root = window;\n} else if (typeof global !== 'undefined') {\n root = global;\n} else if (typeof module !== 'undefined') {\n root = module;\n} else {\n root = Function('return this')();\n}\n\nvar result = ponyfill(root);\nexport default result;\n","\n/**\n * Topological sorting function\n *\n * @param {Array} edges\n * @returns {Array}\n */\n\nmodule.exports = function(edges) {\n return toposort(uniqueNodes(edges), edges)\n}\n\nmodule.exports.array = toposort\n\nfunction toposort(nodes, edges) {\n var cursor = nodes.length\n , sorted = new Array(cursor)\n , visited = {}\n , i = cursor\n // Better data structures make algorithm much faster.\n , outgoingEdges = makeOutgoingEdges(edges)\n , nodesHash = makeNodesHash(nodes)\n\n // check for unknown nodes\n edges.forEach(function(edge) {\n if (!nodesHash.has(edge[0]) || !nodesHash.has(edge[1])) {\n throw new Error('Unknown node. There is an unknown node in the supplied edges.')\n }\n })\n\n while (i--) {\n if (!visited[i]) visit(nodes[i], i, new Set())\n }\n\n return sorted\n\n function visit(node, i, predecessors) {\n if(predecessors.has(node)) {\n var nodeRep\n try {\n nodeRep = \", node was:\" + JSON.stringify(node)\n } catch(e) {\n nodeRep = \"\"\n }\n throw new Error('Cyclic dependency' + nodeRep)\n }\n\n if (!nodesHash.has(node)) {\n throw new Error('Found unknown node. Make sure to provided all involved nodes. Unknown node: '+JSON.stringify(node))\n }\n\n if (visited[i]) return;\n visited[i] = true\n\n var outgoing = outgoingEdges.get(node) || new Set()\n outgoing = Array.from(outgoing)\n\n if (i = outgoing.length) {\n predecessors.add(node)\n do {\n var child = outgoing[--i]\n visit(child, nodesHash.get(child), predecessors)\n } while (i)\n predecessors.delete(node)\n }\n\n sorted[--cursor] = node\n }\n}\n\nfunction uniqueNodes(arr){\n var res = new Set()\n for (var i = 0, len = arr.length; i < len; i++) {\n var edge = arr[i]\n res.add(edge[0])\n res.add(edge[1])\n }\n return Array.from(res)\n}\n\nfunction makeOutgoingEdges(arr){\n var edges = new Map()\n for (var i = 0, len = arr.length; i < len; i++) {\n var edge = arr[i]\n if (!edges.has(edge[0])) edges.set(edge[0], new Set())\n if (!edges.has(edge[1])) edges.set(edge[1], new Set())\n edges.get(edge[0]).add(edge[1])\n }\n return edges\n}\n\nfunction makeNodesHash(arr){\n var res = new Map()\n for (var i = 0, len = arr.length; i < len; i++) {\n res.set(arr[i], i)\n }\n return res\n}\n","import Cookies from './Cookies';\r\nexport default Cookies;\r\n","/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module exports.\n * @public\n */\n\nexports.parse = parse;\nexports.serialize = serialize;\n\n/**\n * Module variables.\n * @private\n */\n\nvar decode = decodeURIComponent;\nvar encode = encodeURIComponent;\nvar pairSplitRegExp = /; */;\n\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2\n *\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n * obs-text = %x80-FF\n */\n\nvar fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\n/**\n * Parse a cookie header.\n *\n * Parse the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n *\n * @param {string} str\n * @param {object} [options]\n * @return {object}\n * @public\n */\n\nfunction parse(str, options) {\n if (typeof str !== 'string') {\n throw new TypeError('argument str must be a string');\n }\n\n var obj = {}\n var opt = options || {};\n var pairs = str.split(pairSplitRegExp);\n var dec = opt.decode || decode;\n\n for (var i = 0; i < pairs.length; i++) {\n var pair = pairs[i];\n var eq_idx = pair.indexOf('=');\n\n // skip things that don't look like key=value\n if (eq_idx < 0) {\n continue;\n }\n\n var key = pair.substr(0, eq_idx).trim()\n var val = pair.substr(++eq_idx, pair.length).trim();\n\n // quoted values\n if ('\"' == val[0]) {\n val = val.slice(1, -1);\n }\n\n // only assign once\n if (undefined == obj[key]) {\n obj[key] = tryDecode(val, dec);\n }\n }\n\n return obj;\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize the a name value pair into a cookie string suitable for\n * http headers. An optional options object specified cookie parameters.\n *\n * serialize('foo', 'bar', { httpOnly: true })\n * => \"foo=bar; httpOnly\"\n *\n * @param {string} name\n * @param {string} val\n * @param {object} [options]\n * @return {string}\n * @public\n */\n\nfunction serialize(name, val, options) {\n var opt = options || {};\n var enc = opt.encode || encode;\n\n if (typeof enc !== 'function') {\n throw new TypeError('option encode is invalid');\n }\n\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError('argument name is invalid');\n }\n\n var value = enc(val);\n\n if (value && !fieldContentRegExp.test(value)) {\n throw new TypeError('argument val is invalid');\n }\n\n var str = name + '=' + value;\n\n if (null != opt.maxAge) {\n var maxAge = opt.maxAge - 0;\n\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError('option maxAge is invalid')\n }\n\n str += '; Max-Age=' + Math.floor(maxAge);\n }\n\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError('option domain is invalid');\n }\n\n str += '; Domain=' + opt.domain;\n }\n\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError('option path is invalid');\n }\n\n str += '; Path=' + opt.path;\n }\n\n if (opt.expires) {\n if (typeof opt.expires.toUTCString !== 'function') {\n throw new TypeError('option expires is invalid');\n }\n\n str += '; Expires=' + opt.expires.toUTCString();\n }\n\n if (opt.httpOnly) {\n str += '; HttpOnly';\n }\n\n if (opt.secure) {\n str += '; Secure';\n }\n\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === 'string'\n ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n str += '; SameSite=Strict';\n break;\n case 'lax':\n str += '; SameSite=Lax';\n break;\n case 'strict':\n str += '; SameSite=Strict';\n break;\n case 'none':\n str += '; SameSite=None';\n break;\n default:\n throw new TypeError('option sameSite is invalid');\n }\n }\n\n return str;\n}\n\n/**\n * Try decoding a string using a decoding function.\n *\n * @param {string} str\n * @param {function} decode\n * @private\n */\n\nfunction tryDecode(str, decode) {\n try {\n return decode(str);\n } catch (e) {\n return str;\n }\n}\n","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * This file automatically generated from `pre-publish.js`.\n * Do not manually edit.\n */\n\nmodule.exports = {\n \"area\": true,\n \"base\": true,\n \"br\": true,\n \"col\": true,\n \"embed\": true,\n \"hr\": true,\n \"img\": true,\n \"input\": true,\n \"link\": true,\n \"meta\": true,\n \"param\": true,\n \"source\": true,\n \"track\": true,\n \"wbr\": true\n};\n","module.exports = require('./lib/Observable.js').Observable;\n","import { GLOBAL_OBJ } from '@sentry/core';\n\n// exporting a separate copy of `WINDOW` rather than exporting the one from `@sentry/browser`\n// prevents the browser package from being bundled in the CDN bundle, and avoids a\n// circular dependency between the browser and replay packages should `@sentry/browser` import\n// from `@sentry/replay` in the future\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nexport const REPLAY_SESSION_KEY = 'sentryReplaySession';\nexport const REPLAY_EVENT_NAME = 'replay_event';\nexport const RECORDING_EVENT_NAME = 'replay_recording';\nexport const UNABLE_TO_SEND_REPLAY = 'Unable to send Replay';\n\n// The idle limit for a session after which recording is paused.\nexport const SESSION_IDLE_PAUSE_DURATION = 300_000; // 5 minutes in ms\n\n// The idle limit for a session after which the session expires.\nexport const SESSION_IDLE_EXPIRE_DURATION = 900_000; // 15 minutes in ms\n\n/** Default flush delays */\nexport const DEFAULT_FLUSH_MIN_DELAY = 5_000;\n// XXX: Temp fix for our debounce logic where `maxWait` would never occur if it\n// was the same as `wait`\nexport const DEFAULT_FLUSH_MAX_DELAY = 5_500;\n\n/* How long to wait for error checkouts */\nexport const BUFFER_CHECKOUT_TIME = 60_000;\n\nexport const RETRY_BASE_INTERVAL = 5000;\nexport const RETRY_MAX_COUNT = 3;\n\n/* The max (uncompressed) size in bytes of a network body. Any body larger than this will be truncated. */\nexport const NETWORK_BODY_MAX_SIZE = 150_000;\n\n/* The max size of a single console arg that is captured. Any arg larger than this will be truncated. */\nexport const CONSOLE_ARG_MAX_SIZE = 5_000;\n\n/* Min. time to wait before we consider something a slow click. */\nexport const SLOW_CLICK_THRESHOLD = 3_000;\n/* For scroll actions after a click, we only look for a very short time period to detect programmatic scrolling. */\nexport const SLOW_CLICK_SCROLL_TIMEOUT = 300;\n\n/** When encountering a total segment size exceeding this size, stop the replay (as we cannot properly ingest it). */\nexport const REPLAY_MAX_EVENT_BUFFER_SIZE = 20_000_000; // ~20MB\n\n/** Replays must be min. 5s long before we send them. */\nexport const MIN_REPLAY_DURATION = 4_999;\n/* The max. allowed value that the minReplayDuration can be set to. */\nexport const MIN_REPLAY_DURATION_LIMIT = 15_000;\n\n/** The max. length of a replay. */\nexport const MAX_REPLAY_DURATION = 3_600_000; // 60 minutes in ms;\n\n/** Default attributes to be ignored when `maskAllText` is enabled */\nexport const DEFAULT_IGNORED_ATTRIBUTES = ['title', 'placeholder'];\n","var NodeType;\r\n(function (NodeType) {\r\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\r\n return n.nodeType === n.ELEMENT_NODE;\r\n}\r\nfunction isShadowRoot(n) {\r\n const host = n?.host;\r\n return Boolean(host?.shadowRoot === n);\r\n}\r\nfunction isNativeShadowDom(shadowRoot) {\r\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\r\n}\r\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\r\n if (cssText.includes(' background-clip: text;') &&\r\n !cssText.includes(' -webkit-background-clip: text;')) {\r\n cssText = cssText.replace(/\\sbackground-clip:\\s*text;/g, ' -webkit-background-clip: text; background-clip: text;');\r\n }\r\n return cssText;\r\n}\r\nfunction escapeImportStatement(rule) {\r\n const { cssText } = rule;\r\n if (cssText.split('\"').length < 3)\r\n return cssText;\r\n const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\r\n if (rule.layerName === '') {\r\n statement.push(`layer`);\r\n }\r\n else if (rule.layerName) {\r\n statement.push(`layer(${rule.layerName})`);\r\n }\r\n if (rule.supportsText) {\r\n statement.push(`supports(${rule.supportsText})`);\r\n }\r\n if (rule.media.length) {\r\n statement.push(rule.media.mediaText);\r\n }\r\n return statement.join(' ') + ';';\r\n}\r\nfunction stringifyStylesheet(s) {\r\n try {\r\n const rules = s.rules || s.cssRules;\r\n return rules\r\n ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules, stringifyRule).join(''))\r\n : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n}\r\nfunction stringifyRule(rule) {\r\n let importStringified;\r\n if (isCSSImportRule(rule)) {\r\n try {\r\n importStringified =\r\n stringifyStylesheet(rule.styleSheet) ||\r\n escapeImportStatement(rule);\r\n }\r\n catch (error) {\r\n }\r\n }\r\n else if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {\r\n return fixSafariColons(rule.cssText);\r\n }\r\n return importStringified || rule.cssText;\r\n}\r\nfunction fixSafariColons(cssStringified) {\r\n const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\r\n return cssStringified.replace(regex, '$1\\\\$2');\r\n}\r\nfunction isCSSImportRule(rule) {\r\n return 'styleSheet' in rule;\r\n}\r\nfunction isCSSStyleRule(rule) {\r\n return 'selectorText' in rule;\r\n}\r\nclass Mirror {\r\n constructor() {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n }\r\n getId(n) {\r\n if (!n)\r\n return -1;\r\n const id = this.getMeta(n)?.id;\r\n return id ?? -1;\r\n }\r\n getNode(id) {\r\n return this.idNodeMap.get(id) || null;\r\n }\r\n getIds() {\r\n return Array.from(this.idNodeMap.keys());\r\n }\r\n getMeta(n) {\r\n return this.nodeMetaMap.get(n) || null;\r\n }\r\n removeNodeFromMap(n) {\r\n const id = this.getId(n);\r\n this.idNodeMap.delete(id);\r\n if (n.childNodes) {\r\n n.childNodes.forEach((childNode) => this.removeNodeFromMap(childNode));\r\n }\r\n }\r\n has(id) {\r\n return this.idNodeMap.has(id);\r\n }\r\n hasNode(node) {\r\n return this.nodeMetaMap.has(node);\r\n }\r\n add(n, meta) {\r\n const id = meta.id;\r\n this.idNodeMap.set(id, n);\r\n this.nodeMetaMap.set(n, meta);\r\n }\r\n replace(id, n) {\r\n const oldNode = this.getNode(id);\r\n if (oldNode) {\r\n const meta = this.nodeMetaMap.get(oldNode);\r\n if (meta)\r\n this.nodeMetaMap.set(n, meta);\r\n }\r\n this.idNodeMap.set(id, n);\r\n }\r\n reset() {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n }\r\n}\r\nfunction createMirror() {\r\n return new Mirror();\r\n}\r\nfunction shouldMaskInput({ maskInputOptions, tagName, type, }) {\r\n if (tagName === 'OPTION') {\r\n tagName = 'SELECT';\r\n }\r\n return Boolean(maskInputOptions[tagName.toLowerCase()] ||\r\n (type && maskInputOptions[type]) ||\r\n type === 'password' ||\r\n (tagName === 'INPUT' && !type && maskInputOptions['text']));\r\n}\r\nfunction maskInputValue({ isMasked, element, value, maskInputFn, }) {\r\n let text = value || '';\r\n if (!isMasked) {\r\n return text;\r\n }\r\n if (maskInputFn) {\r\n text = maskInputFn(text, element);\r\n }\r\n return '*'.repeat(text.length);\r\n}\r\nfunction toLowerCase(str) {\r\n return str.toLowerCase();\r\n}\r\nfunction toUpperCase(str) {\r\n return str.toUpperCase();\r\n}\r\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\r\nfunction is2DCanvasBlank(canvas) {\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx)\r\n return true;\r\n const chunkSize = 50;\r\n for (let x = 0; x < canvas.width; x += chunkSize) {\r\n for (let y = 0; y < canvas.height; y += chunkSize) {\r\n const getImageData = ctx.getImageData;\r\n const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\r\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\r\n : getImageData;\r\n const pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\r\n if (pixelBuffer.some((pixel) => pixel !== 0))\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isNodeMetaEqual(a, b) {\r\n if (!a || !b || a.type !== b.type)\r\n return false;\r\n if (a.type === NodeType.Document)\r\n return a.compatMode === b.compatMode;\r\n else if (a.type === NodeType.DocumentType)\r\n return (a.name === b.name &&\r\n a.publicId === b.publicId &&\r\n a.systemId === b.systemId);\r\n else if (a.type === NodeType.Comment ||\r\n a.type === NodeType.Text ||\r\n a.type === NodeType.CDATA)\r\n return a.textContent === b.textContent;\r\n else if (a.type === NodeType.Element)\r\n return (a.tagName === b.tagName &&\r\n JSON.stringify(a.attributes) ===\r\n JSON.stringify(b.attributes) &&\r\n a.isSVG === b.isSVG &&\r\n a.needBlock === b.needBlock);\r\n return false;\r\n}\r\nfunction getInputType(element) {\r\n const type = element.type;\r\n return element.hasAttribute('data-rr-is-password')\r\n ? 'password'\r\n : type\r\n ?\r\n toLowerCase(type)\r\n : null;\r\n}\r\nfunction getInputValue(el, tagName, type) {\r\n if (tagName === 'INPUT' && (type === 'radio' || type === 'checkbox')) {\r\n return el.getAttribute('value') || '';\r\n }\r\n return el.value;\r\n}\r\nfunction extractFileExtension(path, baseURL) {\r\n let url;\r\n try {\r\n url = new URL(path, baseURL ?? window.location.href);\r\n }\r\n catch (err) {\r\n return null;\r\n }\r\n const regex = /\\.([0-9a-z]+)(?:$)/i;\r\n const match = url.pathname.match(regex);\r\n return match?.[1] ?? null;\r\n}\r\nconst cachedImplementations = {};\r\nfunction getImplementation(name) {\r\n const cached = cachedImplementations[name];\r\n if (cached) {\r\n return cached;\r\n }\r\n const document = window.document;\r\n let impl = window[name];\r\n if (document && typeof document.createElement === 'function') {\r\n try {\r\n const sandbox = document.createElement('iframe');\r\n sandbox.hidden = true;\r\n document.head.appendChild(sandbox);\r\n const contentWindow = sandbox.contentWindow;\r\n if (contentWindow && contentWindow[name]) {\r\n impl =\r\n contentWindow[name];\r\n }\r\n document.head.removeChild(sandbox);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n return (cachedImplementations[name] = impl.bind(window));\r\n}\r\nfunction setTimeout(...rest) {\r\n return getImplementation('setTimeout')(...rest);\r\n}\r\nfunction clearTimeout(...rest) {\r\n return getImplementation('clearTimeout')(...rest);\r\n}\n\nlet _id = 1;\r\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\r\nconst IGNORED_NODE = -2;\r\nfunction genId() {\r\n return _id++;\r\n}\r\nfunction getValidTagName(element) {\r\n if (element instanceof HTMLFormElement) {\r\n return 'form';\r\n }\r\n const processedTagName = toLowerCase(element.tagName);\r\n if (tagNameRegex.test(processedTagName)) {\r\n return 'div';\r\n }\r\n return processedTagName;\r\n}\r\nfunction extractOrigin(url) {\r\n let origin = '';\r\n if (url.indexOf('//') > -1) {\r\n origin = url.split('/').slice(0, 3).join('/');\r\n }\r\n else {\r\n origin = url.split('/')[0];\r\n }\r\n origin = origin.split('?')[0];\r\n return origin;\r\n}\r\nlet canvasService;\r\nlet canvasCtx;\r\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\r\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\r\nconst URL_WWW_MATCH = /^www\\..*/i;\r\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\r\nfunction absoluteToStylesheet(cssText, href) {\r\n return (cssText || '').replace(URL_IN_CSS_REF, (origin, quote1, path1, quote2, path2, path3) => {\r\n const filePath = path1 || path2 || path3;\r\n const maybeQuote = quote1 || quote2 || '';\r\n if (!filePath) {\r\n return origin;\r\n }\r\n if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\r\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\r\n }\r\n if (DATA_URI.test(filePath)) {\r\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\r\n }\r\n if (filePath[0] === '/') {\r\n return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`;\r\n }\r\n const stack = href.split('/');\r\n const parts = filePath.split('/');\r\n stack.pop();\r\n for (const part of parts) {\r\n if (part === '.') {\r\n continue;\r\n }\r\n else if (part === '..') {\r\n stack.pop();\r\n }\r\n else {\r\n stack.push(part);\r\n }\r\n }\r\n return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\r\n });\r\n}\r\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\r\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n if (attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n let pos = 0;\r\n function collectCharacters(regEx) {\r\n let chars;\r\n const match = regEx.exec(attributeValue.substring(pos));\r\n if (match) {\r\n chars = match[0];\r\n pos += chars.length;\r\n return chars;\r\n }\r\n return '';\r\n }\r\n const output = [];\r\n while (true) {\r\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\r\n if (pos >= attributeValue.length) {\r\n break;\r\n }\r\n let url = collectCharacters(SRCSET_NOT_SPACES);\r\n if (url.slice(-1) === ',') {\r\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\r\n output.push(url);\r\n }\r\n else {\r\n let descriptorsStr = '';\r\n url = absoluteToDoc(doc, url);\r\n let inParens = false;\r\n while (true) {\r\n const c = attributeValue.charAt(pos);\r\n if (c === '') {\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (!inParens) {\r\n if (c === ',') {\r\n pos += 1;\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (c === '(') {\r\n inParens = true;\r\n }\r\n }\r\n else {\r\n if (c === ')') {\r\n inParens = false;\r\n }\r\n }\r\n descriptorsStr += c;\r\n pos += 1;\r\n }\r\n }\r\n }\r\n return output.join(', ');\r\n}\r\nconst cachedDocument = new WeakMap();\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n if (!attributeValue || attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n return getHref(doc, attributeValue);\r\n}\r\nfunction isSVGElement(el) {\r\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\r\n}\r\nfunction getHref(doc, customHref) {\r\n let a = cachedDocument.get(doc);\r\n if (!a) {\r\n a = doc.createElement('a');\r\n cachedDocument.set(doc, a);\r\n }\r\n if (!customHref) {\r\n customHref = '';\r\n }\r\n else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\r\n return customHref;\r\n }\r\n a.setAttribute('href', customHref);\r\n return a.href;\r\n}\r\nfunction transformAttribute(doc, tagName, name, value, element, maskAttributeFn) {\r\n if (!value) {\r\n return value;\r\n }\r\n if (name === 'src' ||\r\n (name === 'href' && !(tagName === 'use' && value[0] === '#'))) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'xlink:href' && value[0] !== '#') {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'background' &&\r\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'srcset') {\r\n return getAbsoluteSrcsetString(doc, value);\r\n }\r\n else if (name === 'style') {\r\n return absoluteToStylesheet(value, getHref(doc));\r\n }\r\n else if (tagName === 'object' && name === 'data') {\r\n return absoluteToDoc(doc, value);\r\n }\r\n if (typeof maskAttributeFn === 'function') {\r\n return maskAttributeFn(name, value, element);\r\n }\r\n return value;\r\n}\r\nfunction ignoreAttribute(tagName, name, _value) {\r\n return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\r\n}\r\nfunction _isBlockedElement(element, blockClass, blockSelector, unblockSelector) {\r\n try {\r\n if (unblockSelector && element.matches(unblockSelector)) {\r\n return false;\r\n }\r\n if (typeof blockClass === 'string') {\r\n if (element.classList.contains(blockClass)) {\r\n return true;\r\n }\r\n }\r\n else {\r\n for (let eIndex = element.classList.length; eIndex--;) {\r\n const className = element.classList[eIndex];\r\n if (blockClass.test(className)) {\r\n return true;\r\n }\r\n }\r\n }\r\n if (blockSelector) {\r\n return element.matches(blockSelector);\r\n }\r\n }\r\n catch (e) {\r\n }\r\n return false;\r\n}\r\nfunction elementClassMatchesRegex(el, regex) {\r\n for (let eIndex = el.classList.length; eIndex--;) {\r\n const className = el.classList[eIndex];\r\n if (regex.test(className)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction distanceToMatch(node, matchPredicate, limit = Infinity, distance = 0) {\r\n if (!node)\r\n return -1;\r\n if (node.nodeType !== node.ELEMENT_NODE)\r\n return -1;\r\n if (distance > limit)\r\n return -1;\r\n if (matchPredicate(node))\r\n return distance;\r\n return distanceToMatch(node.parentNode, matchPredicate, limit, distance + 1);\r\n}\r\nfunction createMatchPredicate(className, selector) {\r\n return (node) => {\r\n const el = node;\r\n if (el === null)\r\n return false;\r\n try {\r\n if (className) {\r\n if (typeof className === 'string') {\r\n if (el.matches(`.${className}`))\r\n return true;\r\n }\r\n else if (elementClassMatchesRegex(el, className)) {\r\n return true;\r\n }\r\n }\r\n if (selector && el.matches(selector))\r\n return true;\r\n return false;\r\n }\r\n catch {\r\n return false;\r\n }\r\n };\r\n}\r\nfunction needMaskingText(node, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText) {\r\n try {\r\n const el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (el === null)\r\n return false;\r\n if (el.tagName === 'INPUT') {\r\n const autocomplete = el.getAttribute('autocomplete');\r\n const disallowedAutocompleteValues = [\r\n 'current-password',\r\n 'new-password',\r\n 'cc-number',\r\n 'cc-exp',\r\n 'cc-exp-month',\r\n 'cc-exp-year',\r\n 'cc-csc',\r\n ];\r\n if (disallowedAutocompleteValues.includes(autocomplete)) {\r\n return true;\r\n }\r\n }\r\n let maskDistance = -1;\r\n let unmaskDistance = -1;\r\n if (maskAllText) {\r\n unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector));\r\n if (unmaskDistance < 0) {\r\n return true;\r\n }\r\n maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector), unmaskDistance >= 0 ? unmaskDistance : Infinity);\r\n }\r\n else {\r\n maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector));\r\n if (maskDistance < 0) {\r\n return false;\r\n }\r\n unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector), maskDistance >= 0 ? maskDistance : Infinity);\r\n }\r\n return maskDistance >= 0\r\n ? unmaskDistance >= 0\r\n ? maskDistance <= unmaskDistance\r\n : true\r\n : unmaskDistance >= 0\r\n ? false\r\n : !!maskAllText;\r\n }\r\n catch (e) {\r\n }\r\n return !!maskAllText;\r\n}\r\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\r\n const win = iframeEl.contentWindow;\r\n if (!win) {\r\n return;\r\n }\r\n let fired = false;\r\n let readyState;\r\n try {\r\n readyState = win.document.readyState;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (readyState !== 'complete') {\r\n const timer = setTimeout(() => {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, iframeLoadTimeout);\r\n iframeEl.addEventListener('load', () => {\r\n clearTimeout(timer);\r\n fired = true;\r\n listener();\r\n });\r\n return;\r\n }\r\n const blankUrl = 'about:blank';\r\n if (win.location.href !== blankUrl ||\r\n iframeEl.src === blankUrl ||\r\n iframeEl.src === '') {\r\n setTimeout(listener, 0);\r\n return iframeEl.addEventListener('load', listener);\r\n }\r\n iframeEl.addEventListener('load', listener);\r\n}\r\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\r\n let fired = false;\r\n let styleSheetLoaded;\r\n try {\r\n styleSheetLoaded = link.sheet;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (styleSheetLoaded)\r\n return;\r\n const timer = setTimeout(() => {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, styleSheetLoadTimeout);\r\n link.addEventListener('load', () => {\r\n clearTimeout(timer);\r\n fired = true;\r\n listener();\r\n });\r\n}\r\nfunction serializeNode(n, options) {\r\n const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskAttributeFn, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, inlineStylesheet, maskInputOptions = {}, maskTextFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, } = options;\r\n const rootId = getRootId(doc, mirror);\r\n switch (n.nodeType) {\r\n case n.DOCUMENT_NODE:\r\n if (n.compatMode !== 'CSS1Compat') {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: [],\r\n compatMode: n.compatMode,\r\n };\r\n }\r\n else {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: [],\r\n };\r\n }\r\n case n.DOCUMENT_TYPE_NODE:\r\n return {\r\n type: NodeType.DocumentType,\r\n name: n.name,\r\n publicId: n.publicId,\r\n systemId: n.systemId,\r\n rootId,\r\n };\r\n case n.ELEMENT_NODE:\r\n return serializeElementNode(n, {\r\n doc,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n inlineStylesheet,\r\n maskAttributeFn,\r\n maskInputOptions,\r\n maskInputFn,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n keepIframeSrcFn,\r\n newlyAddedElement,\r\n rootId,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n });\r\n case n.TEXT_NODE:\r\n return serializeTextNode(n, {\r\n doc,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n maskTextFn,\r\n maskInputOptions,\r\n maskInputFn,\r\n rootId,\r\n });\r\n case n.CDATA_SECTION_NODE:\r\n return {\r\n type: NodeType.CDATA,\r\n textContent: '',\r\n rootId,\r\n };\r\n case n.COMMENT_NODE:\r\n return {\r\n type: NodeType.Comment,\r\n textContent: n.textContent || '',\r\n rootId,\r\n };\r\n default:\r\n return false;\r\n }\r\n}\r\nfunction getRootId(doc, mirror) {\r\n if (!mirror.hasNode(doc))\r\n return undefined;\r\n const docId = mirror.getId(doc);\r\n return docId === 1 ? undefined : docId;\r\n}\r\nfunction serializeTextNode(n, options) {\r\n const { maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, maskTextFn, maskInputOptions, maskInputFn, rootId, } = options;\r\n const parentTagName = n.parentNode && n.parentNode.tagName;\r\n let textContent = n.textContent;\r\n const isStyle = parentTagName === 'STYLE' ? true : undefined;\r\n const isScript = parentTagName === 'SCRIPT' ? true : undefined;\r\n const isTextarea = parentTagName === 'TEXTAREA' ? true : undefined;\r\n if (isStyle && textContent) {\r\n try {\r\n if (n.nextSibling || n.previousSibling) {\r\n }\r\n else if (n.parentNode.sheet?.cssRules) {\r\n textContent = stringifyStylesheet(n.parentNode.sheet);\r\n }\r\n }\r\n catch (err) {\r\n console.warn(`Cannot get CSS styles from text's parentNode. Error: ${err}`, n);\r\n }\r\n textContent = absoluteToStylesheet(textContent, getHref(options.doc));\r\n }\r\n if (isScript) {\r\n textContent = 'SCRIPT_PLACEHOLDER';\r\n }\r\n const forceMask = needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText);\r\n if (!isStyle && !isScript && !isTextarea && textContent && forceMask) {\r\n textContent = maskTextFn\r\n ? maskTextFn(textContent, n.parentElement)\r\n : textContent.replace(/[\\S]/g, '*');\r\n }\r\n if (isTextarea && textContent && (maskInputOptions.textarea || forceMask)) {\r\n textContent = maskInputFn\r\n ? maskInputFn(textContent, n.parentNode)\r\n : textContent.replace(/[\\S]/g, '*');\r\n }\r\n if (parentTagName === 'OPTION' && textContent) {\r\n const isInputMasked = shouldMaskInput({\r\n type: null,\r\n tagName: parentTagName,\r\n maskInputOptions,\r\n });\r\n textContent = maskInputValue({\r\n isMasked: needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked),\r\n element: n,\r\n value: textContent,\r\n maskInputFn,\r\n });\r\n }\r\n return {\r\n type: NodeType.Text,\r\n textContent: textContent || '',\r\n isStyle,\r\n rootId,\r\n };\r\n}\r\nfunction serializeElementNode(n, options) {\r\n const { doc, blockClass, blockSelector, unblockSelector, inlineStylesheet, maskInputOptions = {}, maskAttributeFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, rootId, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, } = options;\r\n const needBlock = _isBlockedElement(n, blockClass, blockSelector, unblockSelector);\r\n const tagName = getValidTagName(n);\r\n let attributes = {};\r\n const len = n.attributes.length;\r\n for (let i = 0; i < len; i++) {\r\n const attr = n.attributes[i];\r\n if (attr.name && !ignoreAttribute(tagName, attr.name, attr.value)) {\r\n attributes[attr.name] = transformAttribute(doc, tagName, toLowerCase(attr.name), attr.value, n, maskAttributeFn);\r\n }\r\n }\r\n if (tagName === 'link' && inlineStylesheet) {\r\n const stylesheet = Array.from(doc.styleSheets).find((s) => {\r\n return s.href === n.href;\r\n });\r\n let cssText = null;\r\n if (stylesheet) {\r\n cssText = stringifyStylesheet(stylesheet);\r\n }\r\n if (cssText) {\r\n delete attributes.rel;\r\n delete attributes.href;\r\n attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n }\r\n }\r\n if (tagName === 'style' &&\r\n n.sheet &&\r\n !(n.innerText || n.textContent || '').trim().length) {\r\n const cssText = stringifyStylesheet(n.sheet);\r\n if (cssText) {\r\n attributes._cssText = absoluteToStylesheet(cssText, getHref(doc));\r\n }\r\n }\r\n if (tagName === 'input' ||\r\n tagName === 'textarea' ||\r\n tagName === 'select' ||\r\n tagName === 'option') {\r\n const el = n;\r\n const type = getInputType(el);\r\n const value = getInputValue(el, toUpperCase(tagName), type);\r\n const checked = el.checked;\r\n if (type !== 'submit' && type !== 'button' && value) {\r\n const forceMask = needMaskingText(el, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, shouldMaskInput({\r\n type,\r\n tagName: toUpperCase(tagName),\r\n maskInputOptions,\r\n }));\r\n attributes.value = maskInputValue({\r\n isMasked: forceMask,\r\n element: el,\r\n value,\r\n maskInputFn,\r\n });\r\n }\r\n if (checked) {\r\n attributes.checked = checked;\r\n }\r\n }\r\n if (tagName === 'option') {\r\n if (n.selected && !maskInputOptions['select']) {\r\n attributes.selected = true;\r\n }\r\n else {\r\n delete attributes.selected;\r\n }\r\n }\r\n if (tagName === 'canvas' && recordCanvas) {\r\n if (n.__context === '2d') {\r\n if (!is2DCanvasBlank(n)) {\r\n attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n }\r\n else if (!('__context' in n)) {\r\n const canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n const blankCanvas = doc.createElement('canvas');\r\n blankCanvas.width = n.width;\r\n blankCanvas.height = n.height;\r\n const blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n if (canvasDataURL !== blankCanvasDataURL) {\r\n attributes.rr_dataURL = canvasDataURL;\r\n }\r\n }\r\n }\r\n if (tagName === 'img' && inlineImages) {\r\n if (!canvasService) {\r\n canvasService = doc.createElement('canvas');\r\n canvasCtx = canvasService.getContext('2d');\r\n }\r\n const image = n;\r\n const imageSrc = image.currentSrc || image.getAttribute('src') || '<unknown-src>';\r\n const priorCrossOrigin = image.crossOrigin;\r\n const recordInlineImage = () => {\r\n image.removeEventListener('load', recordInlineImage);\r\n try {\r\n canvasService.width = image.naturalWidth;\r\n canvasService.height = image.naturalHeight;\r\n canvasCtx.drawImage(image, 0, 0);\r\n attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n catch (err) {\r\n if (image.crossOrigin !== 'anonymous') {\r\n image.crossOrigin = 'anonymous';\r\n if (image.complete && image.naturalWidth !== 0)\r\n recordInlineImage();\r\n else\r\n image.addEventListener('load', recordInlineImage);\r\n return;\r\n }\r\n else {\r\n console.warn(`Cannot inline img src=${imageSrc}! Error: ${err}`);\r\n }\r\n }\r\n if (image.crossOrigin === 'anonymous') {\r\n priorCrossOrigin\r\n ? (attributes.crossOrigin = priorCrossOrigin)\r\n : image.removeAttribute('crossorigin');\r\n }\r\n };\r\n if (image.complete && image.naturalWidth !== 0)\r\n recordInlineImage();\r\n else\r\n image.addEventListener('load', recordInlineImage);\r\n }\r\n if (tagName === 'audio' || tagName === 'video') {\r\n attributes.rr_mediaState = n.paused\r\n ? 'paused'\r\n : 'played';\r\n attributes.rr_mediaCurrentTime = n.currentTime;\r\n }\r\n if (!newlyAddedElement) {\r\n if (n.scrollLeft) {\r\n attributes.rr_scrollLeft = n.scrollLeft;\r\n }\r\n if (n.scrollTop) {\r\n attributes.rr_scrollTop = n.scrollTop;\r\n }\r\n }\r\n if (needBlock) {\r\n const { width, height } = n.getBoundingClientRect();\r\n attributes = {\r\n class: attributes.class,\r\n rr_width: `${width}px`,\r\n rr_height: `${height}px`,\r\n };\r\n }\r\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\r\n if (!needBlock && !n.contentDocument) {\r\n attributes.rr_src = attributes.src;\r\n }\r\n delete attributes.src;\r\n }\r\n let isCustomElement;\r\n try {\r\n if (customElements.get(tagName))\r\n isCustomElement = true;\r\n }\r\n catch (e) {\r\n }\r\n return {\r\n type: NodeType.Element,\r\n tagName,\r\n attributes,\r\n childNodes: [],\r\n isSVG: isSVGElement(n) || undefined,\r\n needBlock,\r\n rootId,\r\n isCustom: isCustomElement,\r\n };\r\n}\r\nfunction lowerIfExists(maybeAttr) {\r\n if (maybeAttr === undefined || maybeAttr === null) {\r\n return '';\r\n }\r\n else {\r\n return maybeAttr.toLowerCase();\r\n }\r\n}\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\r\n return true;\r\n }\r\n else if (sn.type === NodeType.Element) {\r\n if (slimDOMOptions.script &&\r\n (sn.tagName === 'script' ||\r\n (sn.tagName === 'link' &&\r\n (sn.attributes.rel === 'preload' ||\r\n sn.attributes.rel === 'modulepreload') &&\r\n sn.attributes.as === 'script') ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'prefetch' &&\r\n typeof sn.attributes.href === 'string' &&\r\n extractFileExtension(sn.attributes.href) === 'js'))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headFavicon &&\r\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\r\n (sn.tagName === 'meta' &&\r\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\r\n lowerIfExists(sn.attributes.name) === 'application-name' ||\r\n lowerIfExists(sn.attributes.rel) === 'icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\r\n return true;\r\n }\r\n else if (sn.tagName === 'meta') {\r\n if (slimDOMOptions.headMetaDescKeywords &&\r\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaSocial &&\r\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\r\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\r\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaRobots &&\r\n (lowerIfExists(sn.attributes.name) === 'robots' ||\r\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\r\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaHttpEquiv &&\r\n sn.attributes['http-equiv'] !== undefined) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaAuthorship &&\r\n (lowerIfExists(sn.attributes.name) === 'author' ||\r\n lowerIfExists(sn.attributes.name) === 'generator' ||\r\n lowerIfExists(sn.attributes.name) === 'framework' ||\r\n lowerIfExists(sn.attributes.name) === 'publisher' ||\r\n lowerIfExists(sn.attributes.name) === 'progid' ||\r\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\r\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaVerification &&\r\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\r\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\r\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\r\n lowerIfExists(sn.attributes.name) === 'verification' ||\r\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nfunction serializeNodeWithId(n, options) {\r\n const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, skipChild = false, inlineStylesheet = true, maskInputOptions = {}, maskAttributeFn, maskTextFn, maskInputFn, slimDOMOptions, dataURLOptions = {}, inlineImages = false, recordCanvas = false, onSerialize, onIframeLoad, iframeLoadTimeout = 5000, onStylesheetLoad, stylesheetLoadTimeout = 5000, keepIframeSrcFn = () => false, newlyAddedElement = false, } = options;\r\n let { preserveWhiteSpace = true } = options;\r\n const _serializedNode = serializeNode(n, {\r\n doc,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n maskAllText,\r\n unblockSelector,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n keepIframeSrcFn,\r\n newlyAddedElement,\r\n });\r\n if (!_serializedNode) {\r\n console.warn(n, 'not serialized');\r\n return null;\r\n }\r\n let id;\r\n if (mirror.hasNode(n)) {\r\n id = mirror.getId(n);\r\n }\r\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\r\n (!preserveWhiteSpace &&\r\n _serializedNode.type === NodeType.Text &&\r\n !_serializedNode.isStyle &&\r\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\r\n id = IGNORED_NODE;\r\n }\r\n else {\r\n id = genId();\r\n }\r\n const serializedNode = Object.assign(_serializedNode, { id });\r\n mirror.add(n, serializedNode);\r\n if (id === IGNORED_NODE) {\r\n return null;\r\n }\r\n if (onSerialize) {\r\n onSerialize(n);\r\n }\r\n let recordChild = !skipChild;\r\n if (serializedNode.type === NodeType.Element) {\r\n recordChild = recordChild && !serializedNode.needBlock;\r\n delete serializedNode.needBlock;\r\n const shadowRoot = n.shadowRoot;\r\n if (shadowRoot && isNativeShadowDom(shadowRoot))\r\n serializedNode.isShadowHost = true;\r\n }\r\n if ((serializedNode.type === NodeType.Document ||\r\n serializedNode.type === NodeType.Element) &&\r\n recordChild) {\r\n if (slimDOMOptions.headWhitespace &&\r\n serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'head') {\r\n preserveWhiteSpace = false;\r\n }\r\n const bypassOptions = {\r\n doc,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n maskAllText,\r\n unblockSelector,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n skipChild,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n preserveWhiteSpace,\r\n onSerialize,\r\n onIframeLoad,\r\n iframeLoadTimeout,\r\n onStylesheetLoad,\r\n stylesheetLoadTimeout,\r\n keepIframeSrcFn,\r\n };\r\n for (const childN of Array.from(n.childNodes)) {\r\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n if (isElement(n) && n.shadowRoot) {\r\n for (const childN of Array.from(n.shadowRoot.childNodes)) {\r\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n isNativeShadowDom(n.shadowRoot) &&\r\n (serializedChildNode.isShadow = true);\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n }\r\n }\r\n if (n.parentNode &&\r\n isShadowRoot(n.parentNode) &&\r\n isNativeShadowDom(n.parentNode)) {\r\n serializedNode.isShadow = true;\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'iframe') {\r\n onceIframeLoaded(n, () => {\r\n const iframeDoc = n.contentDocument;\r\n if (iframeDoc && onIframeLoad) {\r\n const serializedIframeNode = serializeNodeWithId(iframeDoc, {\r\n doc: iframeDoc,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n preserveWhiteSpace,\r\n onSerialize,\r\n onIframeLoad,\r\n iframeLoadTimeout,\r\n onStylesheetLoad,\r\n stylesheetLoadTimeout,\r\n keepIframeSrcFn,\r\n });\r\n if (serializedIframeNode) {\r\n onIframeLoad(n, serializedIframeNode);\r\n }\r\n }\r\n }, iframeLoadTimeout);\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'link' &&\r\n typeof serializedNode.attributes.rel === 'string' &&\r\n (serializedNode.attributes.rel === 'stylesheet' ||\r\n (serializedNode.attributes.rel === 'preload' &&\r\n typeof serializedNode.attributes.href === 'string' &&\r\n extractFileExtension(serializedNode.attributes.href) === 'css'))) {\r\n onceStylesheetLoaded(n, () => {\r\n if (onStylesheetLoad) {\r\n const serializedLinkNode = serializeNodeWithId(n, {\r\n doc,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n preserveWhiteSpace,\r\n onSerialize,\r\n onIframeLoad,\r\n iframeLoadTimeout,\r\n onStylesheetLoad,\r\n stylesheetLoadTimeout,\r\n keepIframeSrcFn,\r\n });\r\n if (serializedLinkNode) {\r\n onStylesheetLoad(n, serializedLinkNode);\r\n }\r\n }\r\n }, stylesheetLoadTimeout);\r\n }\r\n return serializedNode;\r\n}\r\nfunction snapshot(n, options) {\r\n const { mirror = new Mirror(), blockClass = 'rr-block', blockSelector = null, unblockSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, inlineImages = false, recordCanvas = false, maskAllInputs = false, maskAttributeFn, maskTextFn, maskInputFn, slimDOM = false, dataURLOptions, preserveWhiteSpace, onSerialize, onIframeLoad, iframeLoadTimeout, onStylesheetLoad, stylesheetLoadTimeout, keepIframeSrcFn = () => false, } = options || {};\r\n const maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n }\r\n : maskAllInputs === false\r\n ? {}\r\n : maskAllInputs;\r\n const slimDOMOptions = slimDOM === true || slimDOM === 'all'\r\n ?\r\n {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaDescKeywords: slimDOM === 'all',\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaAuthorship: true,\r\n headMetaVerification: true,\r\n }\r\n : slimDOM === false\r\n ? {}\r\n : slimDOM;\r\n return serializeNodeWithId(n, {\r\n doc: n,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n preserveWhiteSpace,\r\n onSerialize,\r\n onIframeLoad,\r\n iframeLoadTimeout,\r\n onStylesheetLoad,\r\n stylesheetLoadTimeout,\r\n keepIframeSrcFn,\r\n newlyAddedElement: false,\r\n });\r\n}\r\n\nconst commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\r\nfunction parse(css, options = {}) {\r\n let lineno = 1;\r\n let column = 1;\r\n function updatePosition(str) {\r\n const lines = str.match(/\\n/g);\r\n if (lines) {\r\n lineno += lines.length;\r\n }\r\n const i = str.lastIndexOf('\\n');\r\n column = i === -1 ? column + str.length : str.length - i;\r\n }\r\n function position() {\r\n const start = { line: lineno, column };\r\n return (node) => {\r\n node.position = new Position(start);\r\n whitespace();\r\n return node;\r\n };\r\n }\r\n class Position {\r\n constructor(start) {\r\n this.start = start;\r\n this.end = { line: lineno, column };\r\n this.source = options.source;\r\n }\r\n }\r\n Position.prototype.content = css;\r\n const errorsList = [];\r\n function error(msg) {\r\n const err = new Error(`${options.source || ''}:${lineno}:${column}: ${msg}`);\r\n err.reason = msg;\r\n err.filename = options.source;\r\n err.line = lineno;\r\n err.column = column;\r\n err.source = css;\r\n if (options.silent) {\r\n errorsList.push(err);\r\n }\r\n else {\r\n throw err;\r\n }\r\n }\r\n function stylesheet() {\r\n const rulesList = rules();\r\n return {\r\n type: 'stylesheet',\r\n stylesheet: {\r\n source: options.source,\r\n rules: rulesList,\r\n parsingErrors: errorsList,\r\n },\r\n };\r\n }\r\n function open() {\r\n return match(/^{\\s*/);\r\n }\r\n function close() {\r\n return match(/^}/);\r\n }\r\n function rules() {\r\n let node;\r\n const rules = [];\r\n whitespace();\r\n comments(rules);\r\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\r\n if (node) {\r\n rules.push(node);\r\n comments(rules);\r\n }\r\n }\r\n return rules;\r\n }\r\n function match(re) {\r\n const m = re.exec(css);\r\n if (!m) {\r\n return;\r\n }\r\n const str = m[0];\r\n updatePosition(str);\r\n css = css.slice(str.length);\r\n return m;\r\n }\r\n function whitespace() {\r\n match(/^\\s*/);\r\n }\r\n function comments(rules = []) {\r\n let c;\r\n while ((c = comment())) {\r\n if (c) {\r\n rules.push(c);\r\n }\r\n c = comment();\r\n }\r\n return rules;\r\n }\r\n function comment() {\r\n const pos = position();\r\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\r\n return;\r\n }\r\n let i = 2;\r\n while ('' !== css.charAt(i) &&\r\n ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\r\n ++i;\r\n }\r\n i += 2;\r\n if ('' === css.charAt(i - 1)) {\r\n return error('End of comment missing');\r\n }\r\n const str = css.slice(2, i - 2);\r\n column += 2;\r\n updatePosition(str);\r\n css = css.slice(i);\r\n column += 2;\r\n return pos({\r\n type: 'comment',\r\n comment: str,\r\n });\r\n }\r\n function selector() {\r\n const m = match(/^([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n const splitSelectors = trim(m[0])\r\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\r\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, (m) => {\r\n return m.replace(/,/g, '\\u200C');\r\n })\r\n .split(/\\s*(?![^(]*\\)),\\s*/);\r\n if (splitSelectors.length <= 1) {\r\n return splitSelectors.map((s) => {\r\n return s.replace(/\\u200C/g, ',');\r\n });\r\n }\r\n let i = 0;\r\n let j = 0;\r\n const len = splitSelectors.length;\r\n const finalSelectors = [];\r\n while (i < len) {\r\n const openingParensCount = (splitSelectors[i].match(/\\(/g) || []).length;\r\n const closingParensCount = (splitSelectors[i].match(/\\)/g) || []).length;\r\n let unbalancedParens = openingParensCount - closingParensCount;\r\n if (unbalancedParens >= 1) {\r\n let foundClosingSelector = false;\r\n j = i + 1;\r\n while (j < len) {\r\n const nextOpeningParensCount = (splitSelectors[j].match(/\\(/g) || [])\r\n .length;\r\n const nextClosingParensCount = (splitSelectors[j].match(/\\)/g) || [])\r\n .length;\r\n const nextUnbalancedParens = nextClosingParensCount - nextOpeningParensCount;\r\n if (nextUnbalancedParens === unbalancedParens) {\r\n finalSelectors.push(splitSelectors.slice(i, j + 1).join(','));\r\n i = j + 1;\r\n foundClosingSelector = true;\r\n break;\r\n }\r\n j++;\r\n unbalancedParens -= nextUnbalancedParens;\r\n }\r\n if (foundClosingSelector) {\r\n continue;\r\n }\r\n splitSelectors\r\n .slice(i, len)\r\n .forEach((selector) => selector && finalSelectors.push(selector));\r\n break;\r\n }\r\n splitSelectors[i] && finalSelectors.push(splitSelectors[i]);\r\n i++;\r\n }\r\n return finalSelectors.map((s) => {\r\n return s.replace(/\\u200C/g, ',');\r\n });\r\n }\r\n function declaration() {\r\n const pos = position();\r\n const propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\r\n if (!propMatch) {\r\n return;\r\n }\r\n const prop = trim(propMatch[0]);\r\n if (!match(/^:\\s*/)) {\r\n return error(`property missing ':'`);\r\n }\r\n const val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\r\n const ret = pos({\r\n type: 'declaration',\r\n property: prop.replace(commentre, ''),\r\n value: val ? trim(val[0]).replace(commentre, '') : '',\r\n });\r\n match(/^[;\\s]*/);\r\n return ret;\r\n }\r\n function declarations() {\r\n const decls = [];\r\n if (!open()) {\r\n return error(`missing '{'`);\r\n }\r\n comments(decls);\r\n let decl;\r\n while ((decl = declaration())) {\r\n if (decl !== false) {\r\n decls.push(decl);\r\n comments(decls);\r\n }\r\n decl = declaration();\r\n }\r\n if (!close()) {\r\n return error(`missing '}'`);\r\n }\r\n return decls;\r\n }\r\n function keyframe() {\r\n let m;\r\n const vals = [];\r\n const pos = position();\r\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\r\n vals.push(m[1]);\r\n match(/^,\\s*/);\r\n }\r\n if (!vals.length) {\r\n return;\r\n }\r\n return pos({\r\n type: 'keyframe',\r\n values: vals,\r\n declarations: declarations(),\r\n });\r\n }\r\n function atkeyframes() {\r\n const pos = position();\r\n let m = match(/^@([-\\w]+)?keyframes\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n const vendor = m[1];\r\n m = match(/^([-\\w]+)\\s*/);\r\n if (!m) {\r\n return error('@keyframes missing name');\r\n }\r\n const name = m[1];\r\n if (!open()) {\r\n return error(`@keyframes missing '{'`);\r\n }\r\n let frame;\r\n let frames = comments();\r\n while ((frame = keyframe())) {\r\n frames.push(frame);\r\n frames = frames.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(`@keyframes missing '}'`);\r\n }\r\n return pos({\r\n type: 'keyframes',\r\n name,\r\n vendor,\r\n keyframes: frames,\r\n });\r\n }\r\n function atsupports() {\r\n const pos = position();\r\n const m = match(/^@supports *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n const supports = trim(m[1]);\r\n if (!open()) {\r\n return error(`@supports missing '{'`);\r\n }\r\n const style = comments().concat(rules());\r\n if (!close()) {\r\n return error(`@supports missing '}'`);\r\n }\r\n return pos({\r\n type: 'supports',\r\n supports,\r\n rules: style,\r\n });\r\n }\r\n function athost() {\r\n const pos = position();\r\n const m = match(/^@host\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(`@host missing '{'`);\r\n }\r\n const style = comments().concat(rules());\r\n if (!close()) {\r\n return error(`@host missing '}'`);\r\n }\r\n return pos({\r\n type: 'host',\r\n rules: style,\r\n });\r\n }\r\n function atmedia() {\r\n const pos = position();\r\n const m = match(/^@media *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n const media = trim(m[1]);\r\n if (!open()) {\r\n return error(`@media missing '{'`);\r\n }\r\n const style = comments().concat(rules());\r\n if (!close()) {\r\n return error(`@media missing '}'`);\r\n }\r\n return pos({\r\n type: 'media',\r\n media,\r\n rules: style,\r\n });\r\n }\r\n function atcustommedia() {\r\n const pos = position();\r\n const m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\r\n if (!m) {\r\n return;\r\n }\r\n return pos({\r\n type: 'custom-media',\r\n name: trim(m[1]),\r\n media: trim(m[2]),\r\n });\r\n }\r\n function atpage() {\r\n const pos = position();\r\n const m = match(/^@page */);\r\n if (!m) {\r\n return;\r\n }\r\n const sel = selector() || [];\r\n if (!open()) {\r\n return error(`@page missing '{'`);\r\n }\r\n let decls = comments();\r\n let decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(`@page missing '}'`);\r\n }\r\n return pos({\r\n type: 'page',\r\n selectors: sel,\r\n declarations: decls,\r\n });\r\n }\r\n function atdocument() {\r\n const pos = position();\r\n const m = match(/^@([-\\w]+)?document *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n const vendor = trim(m[1]);\r\n const doc = trim(m[2]);\r\n if (!open()) {\r\n return error(`@document missing '{'`);\r\n }\r\n const style = comments().concat(rules());\r\n if (!close()) {\r\n return error(`@document missing '}'`);\r\n }\r\n return pos({\r\n type: 'document',\r\n document: doc,\r\n vendor,\r\n rules: style,\r\n });\r\n }\r\n function atfontface() {\r\n const pos = position();\r\n const m = match(/^@font-face\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(`@font-face missing '{'`);\r\n }\r\n let decls = comments();\r\n let decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(`@font-face missing '}'`);\r\n }\r\n return pos({\r\n type: 'font-face',\r\n declarations: decls,\r\n });\r\n }\r\n const atimport = _compileAtrule('import');\r\n const atcharset = _compileAtrule('charset');\r\n const atnamespace = _compileAtrule('namespace');\r\n function _compileAtrule(name) {\r\n const re = new RegExp('^@' +\r\n name +\r\n '\\\\s*((?:' +\r\n [\r\n /[^\\\\]\"(?:\\\\\"|[^\"])*\"/.source,\r\n /[^\\\\]'(?:\\\\'|[^'])*'/.source,\r\n '[^;]',\r\n ].join('|') +\r\n ')+);');\r\n return () => {\r\n const pos = position();\r\n const m = match(re);\r\n if (!m) {\r\n return;\r\n }\r\n const ret = { type: name };\r\n ret[name] = m[1].trim();\r\n return pos(ret);\r\n };\r\n }\r\n function atrule() {\r\n if (css[0] !== '@') {\r\n return;\r\n }\r\n return (atkeyframes() ||\r\n atmedia() ||\r\n atcustommedia() ||\r\n atsupports() ||\r\n atimport() ||\r\n atcharset() ||\r\n atnamespace() ||\r\n atdocument() ||\r\n atpage() ||\r\n athost() ||\r\n atfontface());\r\n }\r\n function rule() {\r\n const pos = position();\r\n const sel = selector();\r\n if (!sel) {\r\n return error('selector missing');\r\n }\r\n comments();\r\n return pos({\r\n type: 'rule',\r\n selectors: sel,\r\n declarations: declarations(),\r\n });\r\n }\r\n return addParent(stylesheet());\r\n}\r\nfunction trim(str) {\r\n return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\r\n}\r\nfunction addParent(obj, parent) {\r\n const isNode = obj && typeof obj.type === 'string';\r\n const childParent = isNode ? obj : parent;\r\n for (const k of Object.keys(obj)) {\r\n const value = obj[k];\r\n if (Array.isArray(value)) {\r\n value.forEach((v) => {\r\n addParent(v, childParent);\r\n });\r\n }\r\n else if (value && typeof value === 'object') {\r\n addParent(value, childParent);\r\n }\r\n }\r\n if (isNode) {\r\n Object.defineProperty(obj, 'parent', {\r\n configurable: true,\r\n writable: true,\r\n enumerable: false,\r\n value: parent || null,\r\n });\r\n }\r\n return obj;\r\n}\n\nconst tagMap = {\r\n script: 'noscript',\r\n altglyph: 'altGlyph',\r\n altglyphdef: 'altGlyphDef',\r\n altglyphitem: 'altGlyphItem',\r\n animatecolor: 'animateColor',\r\n animatemotion: 'animateMotion',\r\n animatetransform: 'animateTransform',\r\n clippath: 'clipPath',\r\n feblend: 'feBlend',\r\n fecolormatrix: 'feColorMatrix',\r\n fecomponenttransfer: 'feComponentTransfer',\r\n fecomposite: 'feComposite',\r\n feconvolvematrix: 'feConvolveMatrix',\r\n fediffuselighting: 'feDiffuseLighting',\r\n fedisplacementmap: 'feDisplacementMap',\r\n fedistantlight: 'feDistantLight',\r\n fedropshadow: 'feDropShadow',\r\n feflood: 'feFlood',\r\n fefunca: 'feFuncA',\r\n fefuncb: 'feFuncB',\r\n fefuncg: 'feFuncG',\r\n fefuncr: 'feFuncR',\r\n fegaussianblur: 'feGaussianBlur',\r\n feimage: 'feImage',\r\n femerge: 'feMerge',\r\n femergenode: 'feMergeNode',\r\n femorphology: 'feMorphology',\r\n feoffset: 'feOffset',\r\n fepointlight: 'fePointLight',\r\n fespecularlighting: 'feSpecularLighting',\r\n fespotlight: 'feSpotLight',\r\n fetile: 'feTile',\r\n feturbulence: 'feTurbulence',\r\n foreignobject: 'foreignObject',\r\n glyphref: 'glyphRef',\r\n lineargradient: 'linearGradient',\r\n radialgradient: 'radialGradient',\r\n};\r\nfunction getTagName(n) {\r\n let tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\r\n if (tagName === 'link' && n.attributes._cssText) {\r\n tagName = 'style';\r\n }\r\n return tagName;\r\n}\r\nfunction escapeRegExp(str) {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\nconst HOVER_SELECTOR = /([^\\\\]):hover/;\r\nconst HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\r\nfunction addHoverClass(cssText, cache) {\r\n const cachedStyle = cache?.stylesWithHoverClass.get(cssText);\r\n if (cachedStyle)\r\n return cachedStyle;\r\n if (cssText.length >= 1000000) {\r\n return cssText;\r\n }\r\n const ast = parse(cssText, {\r\n silent: true,\r\n });\r\n if (!ast.stylesheet) {\r\n return cssText;\r\n }\r\n const selectors = [];\r\n ast.stylesheet.rules.forEach((rule) => {\r\n if ('selectors' in rule) {\r\n (rule.selectors || []).forEach((selector) => {\r\n if (HOVER_SELECTOR.test(selector)) {\r\n selectors.push(selector);\r\n }\r\n });\r\n }\r\n });\r\n if (selectors.length === 0) {\r\n return cssText;\r\n }\r\n const selectorMatcher = new RegExp(selectors\r\n .filter((selector, index) => selectors.indexOf(selector) === index)\r\n .sort((a, b) => b.length - a.length)\r\n .map((selector) => {\r\n return escapeRegExp(selector);\r\n })\r\n .join('|'), 'g');\r\n const result = cssText.replace(selectorMatcher, (selector) => {\r\n const newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\r\n return `${selector}, ${newSelector}`;\r\n });\r\n cache?.stylesWithHoverClass.set(cssText, result);\r\n return result;\r\n}\r\nfunction createCache() {\r\n const stylesWithHoverClass = new Map();\r\n return {\r\n stylesWithHoverClass,\r\n };\r\n}\r\nfunction buildNode(n, options) {\r\n const { doc, hackCss, cache } = options;\r\n switch (n.type) {\r\n case NodeType.Document:\r\n return doc.implementation.createDocument(null, '', null);\r\n case NodeType.DocumentType:\r\n return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\r\n case NodeType.Element: {\r\n const tagName = getTagName(n);\r\n let node;\r\n if (n.isSVG) {\r\n node = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\r\n }\r\n else {\r\n if (n.isCustom &&\r\n doc.defaultView?.customElements &&\r\n !doc.defaultView.customElements.get(n.tagName))\r\n doc.defaultView.customElements.define(n.tagName, class extends doc.defaultView.HTMLElement {\r\n });\r\n node = doc.createElement(tagName);\r\n }\r\n const specialAttributes = {};\r\n for (const name in n.attributes) {\r\n if (!Object.prototype.hasOwnProperty.call(n.attributes, name)) {\r\n continue;\r\n }\r\n let value = n.attributes[name];\r\n if (tagName === 'option' &&\r\n name === 'selected' &&\r\n value === false) {\r\n continue;\r\n }\r\n if (value === null) {\r\n continue;\r\n }\r\n if (value === true)\r\n value = '';\r\n if (name.startsWith('rr_')) {\r\n specialAttributes[name] = value;\r\n continue;\r\n }\r\n const isTextarea = tagName === 'textarea' && name === 'value';\r\n const isRemoteOrDynamicCss = tagName === 'style' && name === '_cssText';\r\n if (isRemoteOrDynamicCss && hackCss && typeof value === 'string') {\r\n value = addHoverClass(value, cache);\r\n }\r\n if ((isTextarea || isRemoteOrDynamicCss) && typeof value === 'string') {\r\n const child = doc.createTextNode(value);\r\n for (const c of Array.from(node.childNodes)) {\r\n if (c.nodeType === node.TEXT_NODE) {\r\n node.removeChild(c);\r\n }\r\n }\r\n node.appendChild(child);\r\n continue;\r\n }\r\n try {\r\n if (n.isSVG && name === 'xlink:href') {\r\n node.setAttributeNS('http://www.w3.org/1999/xlink', name, value.toString());\r\n }\r\n else if (name === 'onload' ||\r\n name === 'onclick' ||\r\n name.substring(0, 7) === 'onmouse') {\r\n node.setAttribute('_' + name, value.toString());\r\n }\r\n else if (tagName === 'meta' &&\r\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\r\n name === 'content') {\r\n node.setAttribute('csp-content', value.toString());\r\n continue;\r\n }\r\n else if (tagName === 'link' &&\r\n (n.attributes.rel === 'preload' ||\r\n n.attributes.rel === 'modulepreload') &&\r\n n.attributes.as === 'script') {\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'prefetch' &&\r\n typeof n.attributes.href === 'string' &&\r\n n.attributes.href.endsWith('.js')) {\r\n }\r\n else if (tagName === 'img' &&\r\n n.attributes.srcset &&\r\n n.attributes.rr_dataURL) {\r\n node.setAttribute('rrweb-original-srcset', n.attributes.srcset);\r\n }\r\n else {\r\n node.setAttribute(name, value.toString());\r\n }\r\n }\r\n catch (error) {\r\n }\r\n }\r\n for (const name in specialAttributes) {\r\n const value = specialAttributes[name];\r\n if (tagName === 'canvas' && name === 'rr_dataURL') {\r\n const image = doc.createElement('img');\r\n image.onload = () => {\r\n const ctx = node.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(image, 0, 0, image.width, image.height);\r\n }\r\n };\r\n image.src = value.toString();\r\n if (node.RRNodeType)\r\n node.rr_dataURL = value.toString();\r\n }\r\n else if (tagName === 'img' && name === 'rr_dataURL') {\r\n const image = node;\r\n if (!image.currentSrc.startsWith('data:')) {\r\n image.setAttribute('rrweb-original-src', n.attributes.src);\r\n image.src = value.toString();\r\n }\r\n }\r\n if (name === 'rr_width') {\r\n node.style.setProperty('width', value.toString());\r\n }\r\n else if (name === 'rr_height') {\r\n node.style.setProperty('height', value.toString());\r\n }\r\n else if (name === 'rr_mediaCurrentTime' &&\r\n typeof value === 'number') {\r\n node.currentTime = value;\r\n }\r\n else if (name === 'rr_mediaState') {\r\n switch (value) {\r\n case 'played':\r\n node\r\n .play()\r\n .catch((e) => console.warn('media playback error', e));\r\n break;\r\n case 'paused':\r\n node.pause();\r\n break;\r\n }\r\n }\r\n }\r\n if (n.isShadowHost) {\r\n if (!node.shadowRoot) {\r\n node.attachShadow({ mode: 'open' });\r\n }\r\n else {\r\n while (node.shadowRoot.firstChild) {\r\n node.shadowRoot.removeChild(node.shadowRoot.firstChild);\r\n }\r\n }\r\n }\r\n return node;\r\n }\r\n case NodeType.Text:\r\n return doc.createTextNode(n.isStyle && hackCss\r\n ? addHoverClass(n.textContent, cache)\r\n : n.textContent);\r\n case NodeType.CDATA:\r\n return doc.createCDATASection(n.textContent);\r\n case NodeType.Comment:\r\n return doc.createComment(n.textContent);\r\n default:\r\n return null;\r\n }\r\n}\r\nfunction buildNodeWithSN(n, options) {\r\n const { doc, mirror, skipChild = false, hackCss = true, afterAppend, cache, } = options;\r\n if (mirror.has(n.id)) {\r\n const nodeInMirror = mirror.getNode(n.id);\r\n const meta = mirror.getMeta(nodeInMirror);\r\n if (isNodeMetaEqual(meta, n))\r\n return mirror.getNode(n.id);\r\n }\r\n let node = buildNode(n, { doc, hackCss, cache });\r\n if (!node) {\r\n return null;\r\n }\r\n if (n.rootId && mirror.getNode(n.rootId) !== doc) {\r\n mirror.replace(n.rootId, doc);\r\n }\r\n if (n.type === NodeType.Document) {\r\n doc.close();\r\n doc.open();\r\n if (n.compatMode === 'BackCompat' &&\r\n n.childNodes &&\r\n n.childNodes[0].type !== NodeType.DocumentType) {\r\n if (n.childNodes[0].type === NodeType.Element &&\r\n 'xmlns' in n.childNodes[0].attributes &&\r\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\r\n }\r\n else {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\r\n }\r\n }\r\n node = doc;\r\n }\r\n mirror.add(node, n);\r\n if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\r\n !skipChild) {\r\n for (const childN of n.childNodes) {\r\n const childNode = buildNodeWithSN(childN, {\r\n doc,\r\n mirror,\r\n skipChild: false,\r\n hackCss,\r\n afterAppend,\r\n cache,\r\n });\r\n if (!childNode) {\r\n console.warn('Failed to rebuild', childN);\r\n continue;\r\n }\r\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\r\n node.shadowRoot.appendChild(childNode);\r\n }\r\n else if (n.type === NodeType.Document &&\r\n childN.type == NodeType.Element) {\r\n const htmlElement = childNode;\r\n let body = null;\r\n htmlElement.childNodes.forEach((child) => {\r\n if (child.nodeName === 'BODY')\r\n body = child;\r\n });\r\n if (body) {\r\n htmlElement.removeChild(body);\r\n node.appendChild(childNode);\r\n htmlElement.appendChild(body);\r\n }\r\n else {\r\n node.appendChild(childNode);\r\n }\r\n }\r\n else {\r\n node.appendChild(childNode);\r\n }\r\n if (afterAppend) {\r\n afterAppend(childNode, childN.id);\r\n }\r\n }\r\n }\r\n return node;\r\n}\r\nfunction visit(mirror, onVisit) {\r\n function walk(node) {\r\n onVisit(node);\r\n }\r\n for (const id of mirror.getIds()) {\r\n if (mirror.has(id)) {\r\n walk(mirror.getNode(id));\r\n }\r\n }\r\n}\r\nfunction handleScroll(node, mirror) {\r\n const n = mirror.getMeta(node);\r\n if (n?.type !== NodeType.Element) {\r\n return;\r\n }\r\n const el = node;\r\n for (const name in n.attributes) {\r\n if (!(Object.prototype.hasOwnProperty.call(n.attributes, name) &&\r\n name.startsWith('rr_'))) {\r\n continue;\r\n }\r\n const value = n.attributes[name];\r\n if (name === 'rr_scrollLeft') {\r\n el.scrollLeft = value;\r\n }\r\n if (name === 'rr_scrollTop') {\r\n el.scrollTop = value;\r\n }\r\n }\r\n}\r\nfunction rebuild(n, options) {\r\n const { doc, onVisit, hackCss = true, afterAppend, cache, mirror = new Mirror(), } = options;\r\n const node = buildNodeWithSN(n, {\r\n doc,\r\n mirror,\r\n skipChild: false,\r\n hackCss,\r\n afterAppend,\r\n cache,\r\n });\r\n visit(mirror, (visitedNode) => {\r\n if (onVisit) {\r\n onVisit(visitedNode);\r\n }\r\n handleScroll(visitedNode, mirror);\r\n });\r\n return node;\r\n}\n\nexport { IGNORED_NODE, Mirror, NodeType, addHoverClass, buildNodeWithSN, clearTimeout, createCache, createMatchPredicate, createMirror, distanceToMatch, escapeImportStatement, extractFileExtension, fixSafariColons, genId, getInputType, getInputValue, ignoreAttribute, is2DCanvasBlank, isCSSImportRule, isCSSStyleRule, isElement, isNativeShadowDom, isNodeMetaEqual, isShadowRoot, maskInputValue, needMaskingText, rebuild, serializeNodeWithId, setTimeout, shouldMaskInput, snapshot, stringifyRule, stringifyStylesheet, toLowerCase, toUpperCase, transformAttribute };\n","import { distanceToMatch, IGNORED_NODE, isShadowRoot, createMatchPredicate } from '../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nfunction on(type, fn, target = document) {\r\n const options = { capture: true, passive: true };\r\n target.addEventListener(type, fn, options);\r\n return () => target.removeEventListener(type, fn, options);\r\n}\r\nconst DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\r\n '\\r\\n' +\r\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\r\n '\\r\\n' +\r\n 'or you can use record.mirror to access the mirror instance during recording.';\r\nlet _mirror = {\r\n map: {},\r\n getId() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return -1;\r\n },\r\n getNode() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return null;\r\n },\r\n removeNodeFromMap() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n has() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return false;\r\n },\r\n reset() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n};\r\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\r\n _mirror = new Proxy(_mirror, {\r\n get(target, prop, receiver) {\r\n if (prop === 'map') {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n}\r\nfunction throttle(func, wait, options = {}) {\r\n let timeout = null;\r\n let previous = 0;\r\n return function (...args) {\r\n const now = Date.now();\r\n if (!previous && options.leading === false) {\r\n previous = now;\r\n }\r\n const remaining = wait - (now - previous);\r\n const context = this;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n func.apply(context, args);\r\n }\r\n else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(() => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n func.apply(context, args);\r\n }, remaining);\r\n }\r\n };\r\n}\r\nfunction hookSetter(target, key, d, isRevoked, win = window) {\r\n const original = win.Object.getOwnPropertyDescriptor(target, key);\r\n win.Object.defineProperty(target, key, isRevoked\r\n ? d\r\n : {\r\n set(value) {\r\n setTimeout(() => {\r\n d.set.call(this, value);\r\n }, 0);\r\n if (original && original.set) {\r\n original.set.call(this, value);\r\n }\r\n },\r\n });\r\n return () => hookSetter(target, key, original || {}, true);\r\n}\r\nfunction patch(source, name, replacement) {\r\n try {\r\n if (!(name in source)) {\r\n return () => {\r\n };\r\n }\r\n const original = source[name];\r\n const wrapped = replacement(original);\r\n if (typeof wrapped === 'function') {\r\n wrapped.prototype = wrapped.prototype || {};\r\n Object.defineProperties(wrapped, {\r\n __rrweb_original__: {\r\n enumerable: false,\r\n value: original,\r\n },\r\n });\r\n }\r\n source[name] = wrapped;\r\n return () => {\r\n source[name] = original;\r\n };\r\n }\r\n catch {\r\n return () => {\r\n };\r\n }\r\n}\r\nlet nowTimestamp = Date.now;\r\nif (!(/[1-9][0-9]{12}/.test(Date.now().toString()))) {\r\n nowTimestamp = () => new Date().getTime();\r\n}\r\nfunction getWindowScroll(win) {\r\n const doc = win.document;\r\n return {\r\n left: doc.scrollingElement\r\n ? doc.scrollingElement.scrollLeft\r\n : win.pageXOffset !== undefined\r\n ? win.pageXOffset\r\n : doc?.documentElement.scrollLeft ||\r\n doc?.body?.parentElement?.scrollLeft ||\r\n doc?.body?.scrollLeft ||\r\n 0,\r\n top: doc.scrollingElement\r\n ? doc.scrollingElement.scrollTop\r\n : win.pageYOffset !== undefined\r\n ? win.pageYOffset\r\n : doc?.documentElement.scrollTop ||\r\n doc?.body?.parentElement?.scrollTop ||\r\n doc?.body?.scrollTop ||\r\n 0,\r\n };\r\n}\r\nfunction getWindowHeight() {\r\n return (window.innerHeight ||\r\n (document.documentElement && document.documentElement.clientHeight) ||\r\n (document.body && document.body.clientHeight));\r\n}\r\nfunction getWindowWidth() {\r\n return (window.innerWidth ||\r\n (document.documentElement && document.documentElement.clientWidth) ||\r\n (document.body && document.body.clientWidth));\r\n}\r\nfunction closestElementOfNode(node) {\r\n if (!node) {\r\n return null;\r\n }\r\n const el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n return el;\r\n}\r\nfunction isBlocked(node, blockClass, blockSelector, unblockSelector, checkAncestors) {\r\n if (!node) {\r\n return false;\r\n }\r\n const el = closestElementOfNode(node);\r\n if (!el) {\r\n return false;\r\n }\r\n const blockedPredicate = createMatchPredicate(blockClass, blockSelector);\r\n if (!checkAncestors) {\r\n const isUnblocked = unblockSelector && el.matches(unblockSelector);\r\n return blockedPredicate(el) && !isUnblocked;\r\n }\r\n const blockDistance = distanceToMatch(el, blockedPredicate);\r\n let unblockDistance = -1;\r\n if (blockDistance < 0) {\r\n return false;\r\n }\r\n if (unblockSelector) {\r\n unblockDistance = distanceToMatch(el, createMatchPredicate(null, unblockSelector));\r\n }\r\n if (blockDistance > -1 && unblockDistance < 0) {\r\n return true;\r\n }\r\n return blockDistance < unblockDistance;\r\n}\r\nfunction isSerialized(n, mirror) {\r\n return mirror.getId(n) !== -1;\r\n}\r\nfunction isIgnored(n, mirror) {\r\n return mirror.getId(n) === IGNORED_NODE;\r\n}\r\nfunction isAncestorRemoved(target, mirror) {\r\n if (isShadowRoot(target)) {\r\n return false;\r\n }\r\n const id = mirror.getId(target);\r\n if (!mirror.has(id)) {\r\n return true;\r\n }\r\n if (target.parentNode &&\r\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\r\n return false;\r\n }\r\n if (!target.parentNode) {\r\n return true;\r\n }\r\n return isAncestorRemoved(target.parentNode, mirror);\r\n}\r\nfunction legacy_isTouchEvent(event) {\r\n return Boolean(event.changedTouches);\r\n}\r\nfunction polyfill(win = window) {\r\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\r\n win.NodeList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\r\n win.DOMTokenList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if (!Node.prototype.contains) {\r\n Node.prototype.contains = (...args) => {\r\n let node = args[0];\r\n if (!(0 in args)) {\r\n throw new TypeError('1 argument is required');\r\n }\r\n do {\r\n if (this === node) {\r\n return true;\r\n }\r\n } while ((node = node && node.parentNode));\r\n return false;\r\n };\r\n }\r\n}\r\nfunction queueToResolveTrees(queue) {\r\n const queueNodeMap = {};\r\n const putIntoMap = (m, parent) => {\r\n const nodeInTree = {\r\n value: m,\r\n parent,\r\n children: [],\r\n };\r\n queueNodeMap[m.node.id] = nodeInTree;\r\n return nodeInTree;\r\n };\r\n const queueNodeTrees = [];\r\n for (const mutation of queue) {\r\n const { nextId, parentId } = mutation;\r\n if (nextId && nextId in queueNodeMap) {\r\n const nextInTree = queueNodeMap[nextId];\r\n if (nextInTree.parent) {\r\n const idx = nextInTree.parent.children.indexOf(nextInTree);\r\n nextInTree.parent.children.splice(idx, 0, putIntoMap(mutation, nextInTree.parent));\r\n }\r\n else {\r\n const idx = queueNodeTrees.indexOf(nextInTree);\r\n queueNodeTrees.splice(idx, 0, putIntoMap(mutation, null));\r\n }\r\n continue;\r\n }\r\n if (parentId in queueNodeMap) {\r\n const parentInTree = queueNodeMap[parentId];\r\n parentInTree.children.push(putIntoMap(mutation, parentInTree));\r\n continue;\r\n }\r\n queueNodeTrees.push(putIntoMap(mutation, null));\r\n }\r\n return queueNodeTrees;\r\n}\r\nfunction iterateResolveTree(tree, cb) {\r\n cb(tree.value);\r\n for (let i = tree.children.length - 1; i >= 0; i--) {\r\n iterateResolveTree(tree.children[i], cb);\r\n }\r\n}\r\nfunction isSerializedIframe(n, mirror) {\r\n return Boolean(n.nodeName === 'IFRAME' && mirror.getMeta(n));\r\n}\r\nfunction isSerializedStylesheet(n, mirror) {\r\n return Boolean(n.nodeName === 'LINK' &&\r\n n.nodeType === n.ELEMENT_NODE &&\r\n n.getAttribute &&\r\n n.getAttribute('rel') === 'stylesheet' &&\r\n mirror.getMeta(n));\r\n}\r\nfunction getBaseDimension(node, rootIframe) {\r\n const frameElement = node.ownerDocument?.defaultView?.frameElement;\r\n if (!frameElement || frameElement === rootIframe) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n relativeScale: 1,\r\n absoluteScale: 1,\r\n };\r\n }\r\n const frameDimension = frameElement.getBoundingClientRect();\r\n const frameBaseDimension = getBaseDimension(frameElement, rootIframe);\r\n const relativeScale = frameDimension.height / frameElement.clientHeight;\r\n return {\r\n x: frameDimension.x * frameBaseDimension.relativeScale +\r\n frameBaseDimension.x,\r\n y: frameDimension.y * frameBaseDimension.relativeScale +\r\n frameBaseDimension.y,\r\n relativeScale,\r\n absoluteScale: frameBaseDimension.absoluteScale * relativeScale,\r\n };\r\n}\r\nfunction hasShadowRoot(n) {\r\n return Boolean(n?.shadowRoot);\r\n}\r\nfunction getNestedRule(rules, position) {\r\n const rule = rules[position[0]];\r\n if (position.length === 1) {\r\n return rule;\r\n }\r\n else {\r\n return getNestedRule(rule.cssRules[position[1]].cssRules, position.slice(2));\r\n }\r\n}\r\nfunction getPositionsAndIndex(nestedIndex) {\r\n const positions = [...nestedIndex];\r\n const index = positions.pop();\r\n return { positions, index };\r\n}\r\nfunction uniqueTextMutations(mutations) {\r\n const idSet = new Set();\r\n const uniqueMutations = [];\r\n for (let i = mutations.length; i--;) {\r\n const mutation = mutations[i];\r\n if (!idSet.has(mutation.id)) {\r\n uniqueMutations.push(mutation);\r\n idSet.add(mutation.id);\r\n }\r\n }\r\n return uniqueMutations;\r\n}\r\nclass StyleSheetMirror {\r\n constructor() {\r\n this.id = 1;\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n }\r\n getId(stylesheet) {\r\n return this.styleIDMap.get(stylesheet) ?? -1;\r\n }\r\n has(stylesheet) {\r\n return this.styleIDMap.has(stylesheet);\r\n }\r\n add(stylesheet, id) {\r\n if (this.has(stylesheet))\r\n return this.getId(stylesheet);\r\n let newId;\r\n if (id === undefined) {\r\n newId = this.id++;\r\n }\r\n else\r\n newId = id;\r\n this.styleIDMap.set(stylesheet, newId);\r\n this.idStyleMap.set(newId, stylesheet);\r\n return newId;\r\n }\r\n getStyle(id) {\r\n return this.idStyleMap.get(id) || null;\r\n }\r\n reset() {\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n this.id = 1;\r\n }\r\n generateId() {\r\n return this.id++;\r\n }\r\n}\r\nfunction getShadowHost(n) {\r\n let shadowHost = null;\r\n if (n.getRootNode?.()?.nodeType === Node.DOCUMENT_FRAGMENT_NODE &&\r\n n.getRootNode().host)\r\n shadowHost = n.getRootNode().host;\r\n return shadowHost;\r\n}\r\nfunction getRootShadowHost(n) {\r\n let rootShadowHost = n;\r\n let shadowHost;\r\n while ((shadowHost = getShadowHost(rootShadowHost)))\r\n rootShadowHost = shadowHost;\r\n return rootShadowHost;\r\n}\r\nfunction shadowHostInDom(n) {\r\n const doc = n.ownerDocument;\r\n if (!doc)\r\n return false;\r\n const shadowHost = getRootShadowHost(n);\r\n return doc.contains(shadowHost);\r\n}\r\nfunction inDom(n) {\r\n const doc = n.ownerDocument;\r\n if (!doc)\r\n return false;\r\n return doc.contains(n) || shadowHostInDom(n);\r\n}\r\nconst cachedImplementations = {};\r\nfunction getImplementation(name) {\r\n const cached = cachedImplementations[name];\r\n if (cached) {\r\n return cached;\r\n }\r\n const document = window.document;\r\n let impl = window[name];\r\n if (document && typeof document.createElement === 'function') {\r\n try {\r\n const sandbox = document.createElement('iframe');\r\n sandbox.hidden = true;\r\n document.head.appendChild(sandbox);\r\n const contentWindow = sandbox.contentWindow;\r\n if (contentWindow && contentWindow[name]) {\r\n impl =\r\n contentWindow[name];\r\n }\r\n document.head.removeChild(sandbox);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n return (cachedImplementations[name] = impl.bind(window));\r\n}\r\nfunction onRequestAnimationFrame(...rest) {\r\n return getImplementation('requestAnimationFrame')(...rest);\r\n}\r\nfunction setTimeout(...rest) {\r\n return getImplementation('setTimeout')(...rest);\r\n}\r\nfunction clearTimeout(...rest) {\r\n return getImplementation('clearTimeout')(...rest);\r\n}\n\nexport { StyleSheetMirror, _mirror, clearTimeout, closestElementOfNode, getBaseDimension, getNestedRule, getPositionsAndIndex, getRootShadowHost, getShadowHost, getWindowHeight, getWindowScroll, getWindowWidth, hasShadowRoot, hookSetter, inDom, isAncestorRemoved, isBlocked, isIgnored, isSerialized, isSerializedIframe, isSerializedStylesheet, iterateResolveTree, legacy_isTouchEvent, nowTimestamp, on, onRequestAnimationFrame, patch, polyfill, queueToResolveTrees, setTimeout, shadowHostInDom, throttle, uniqueTextMutations };\n","var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\n\nexport { CanvasContext, EventType, IncrementalSource, MouseInteractions, PointerTypes, ReplayerEvents };\n","import { isShadowRoot, isNativeShadowDom, getInputType, getInputValue, shouldMaskInput, needMaskingText, maskInputValue, ignoreAttribute, transformAttribute, toLowerCase, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { isIgnored, isBlocked, isSerialized, isAncestorRemoved, closestElementOfNode, hasShadowRoot, inDom, getShadowHost, isSerializedIframe, isSerializedStylesheet } from '../utils.js';\n\nfunction isNodeInLinkedList(n) {\r\n return '__ln' in n;\r\n}\r\nclass DoubleLinkedList {\r\n constructor() {\r\n this.length = 0;\r\n this.head = null;\r\n this.tail = null;\r\n }\r\n get(position) {\r\n if (position >= this.length) {\r\n throw new Error('Position outside of list range');\r\n }\r\n let current = this.head;\r\n for (let index = 0; index < position; index++) {\r\n current = current?.next || null;\r\n }\r\n return current;\r\n }\r\n addNode(n) {\r\n const node = {\r\n value: n,\r\n previous: null,\r\n next: null,\r\n };\r\n n.__ln = node;\r\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\r\n const current = n.previousSibling.__ln.next;\r\n node.next = current;\r\n node.previous = n.previousSibling.__ln;\r\n n.previousSibling.__ln.next = node;\r\n if (current) {\r\n current.previous = node;\r\n }\r\n }\r\n else if (n.nextSibling &&\r\n isNodeInLinkedList(n.nextSibling) &&\r\n n.nextSibling.__ln.previous) {\r\n const current = n.nextSibling.__ln.previous;\r\n node.previous = current;\r\n node.next = n.nextSibling.__ln;\r\n n.nextSibling.__ln.previous = node;\r\n if (current) {\r\n current.next = node;\r\n }\r\n }\r\n else {\r\n if (this.head) {\r\n this.head.previous = node;\r\n }\r\n node.next = this.head;\r\n this.head = node;\r\n }\r\n if (node.next === null) {\r\n this.tail = node;\r\n }\r\n this.length++;\r\n }\r\n removeNode(n) {\r\n const current = n.__ln;\r\n if (!this.head) {\r\n return;\r\n }\r\n if (!current.previous) {\r\n this.head = current.next;\r\n if (this.head) {\r\n this.head.previous = null;\r\n }\r\n else {\r\n this.tail = null;\r\n }\r\n }\r\n else {\r\n current.previous.next = current.next;\r\n if (current.next) {\r\n current.next.previous = current.previous;\r\n }\r\n else {\r\n this.tail = current.previous;\r\n }\r\n }\r\n if (n.__ln) {\r\n delete n.__ln;\r\n }\r\n this.length--;\r\n }\r\n}\r\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\r\nclass MutationBuffer {\r\n constructor() {\r\n this.frozen = false;\r\n this.locked = false;\r\n this.texts = [];\r\n this.attributes = [];\r\n this.attributeMap = new WeakMap();\r\n this.removes = [];\r\n this.mapRemoves = [];\r\n this.movedMap = {};\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.processMutations = (mutations) => {\r\n mutations.forEach(this.processMutation);\r\n this.emit();\r\n };\r\n this.emit = () => {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const adds = [];\r\n const addedIds = new Set();\r\n const addList = new DoubleLinkedList();\r\n const getNextId = (n) => {\r\n let ns = n;\r\n let nextId = IGNORED_NODE;\r\n while (nextId === IGNORED_NODE) {\r\n ns = ns && ns.nextSibling;\r\n nextId = ns && this.mirror.getId(ns);\r\n }\r\n return nextId;\r\n };\r\n const pushAdd = (n) => {\r\n if (!n.parentNode || !inDom(n)) {\r\n return;\r\n }\r\n const parentId = isShadowRoot(n.parentNode)\r\n ? this.mirror.getId(getShadowHost(n))\r\n : this.mirror.getId(n.parentNode);\r\n const nextId = getNextId(n);\r\n if (parentId === -1 || nextId === -1) {\r\n return addList.addNode(n);\r\n }\r\n const sn = serializeNodeWithId(n, {\r\n doc: this.doc,\r\n mirror: this.mirror,\r\n blockClass: this.blockClass,\r\n blockSelector: this.blockSelector,\r\n maskAllText: this.maskAllText,\r\n unblockSelector: this.unblockSelector,\r\n maskTextClass: this.maskTextClass,\r\n unmaskTextClass: this.unmaskTextClass,\r\n maskTextSelector: this.maskTextSelector,\r\n unmaskTextSelector: this.unmaskTextSelector,\r\n skipChild: true,\r\n newlyAddedElement: true,\r\n inlineStylesheet: this.inlineStylesheet,\r\n maskInputOptions: this.maskInputOptions,\r\n maskAttributeFn: this.maskAttributeFn,\r\n maskTextFn: this.maskTextFn,\r\n maskInputFn: this.maskInputFn,\r\n slimDOMOptions: this.slimDOMOptions,\r\n dataURLOptions: this.dataURLOptions,\r\n recordCanvas: this.recordCanvas,\r\n inlineImages: this.inlineImages,\r\n onSerialize: (currentN) => {\r\n if (isSerializedIframe(currentN, this.mirror) &&\r\n !isBlocked(currentN, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\r\n this.iframeManager.addIframe(currentN);\r\n }\r\n if (isSerializedStylesheet(currentN, this.mirror)) {\r\n this.stylesheetManager.trackLinkElement(currentN);\r\n }\r\n if (hasShadowRoot(n)) {\r\n this.shadowDomManager.addShadowRoot(n.shadowRoot, this.doc);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n if (isBlocked(iframe, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\r\n return;\r\n }\r\n this.iframeManager.attachIframe(iframe, childSn);\r\n if (iframe.contentWindow) {\r\n this.canvasManager.addWindow(iframe.contentWindow);\r\n }\r\n this.shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (link, childSn) => {\r\n this.stylesheetManager.attachLinkElement(link, childSn);\r\n },\r\n });\r\n if (sn) {\r\n adds.push({\r\n parentId,\r\n nextId,\r\n node: sn,\r\n });\r\n addedIds.add(sn.id);\r\n }\r\n };\r\n while (this.mapRemoves.length) {\r\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\r\n }\r\n for (const n of this.movedSet) {\r\n if (isParentRemoved(this.removes, n, this.mirror) &&\r\n !this.movedSet.has(n.parentNode)) {\r\n continue;\r\n }\r\n pushAdd(n);\r\n }\r\n for (const n of this.addedSet) {\r\n if (!isAncestorInSet(this.droppedSet, n) &&\r\n !isParentRemoved(this.removes, n, this.mirror)) {\r\n pushAdd(n);\r\n }\r\n else if (isAncestorInSet(this.movedSet, n)) {\r\n pushAdd(n);\r\n }\r\n else {\r\n this.droppedSet.add(n);\r\n }\r\n }\r\n let candidate = null;\r\n while (addList.length) {\r\n let node = null;\r\n if (candidate) {\r\n const parentId = this.mirror.getId(candidate.value.parentNode);\r\n const nextId = getNextId(candidate.value);\r\n if (parentId !== -1 && nextId !== -1) {\r\n node = candidate;\r\n }\r\n }\r\n if (!node) {\r\n let tailNode = addList.tail;\r\n while (tailNode) {\r\n const _node = tailNode;\r\n tailNode = tailNode.previous;\r\n if (_node) {\r\n const parentId = this.mirror.getId(_node.value.parentNode);\r\n const nextId = getNextId(_node.value);\r\n if (nextId === -1)\r\n continue;\r\n else if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n else {\r\n const unhandledNode = _node.value;\r\n if (unhandledNode.parentNode &&\r\n unhandledNode.parentNode.nodeType ===\r\n Node.DOCUMENT_FRAGMENT_NODE) {\r\n const shadowHost = unhandledNode.parentNode\r\n .host;\r\n const parentId = this.mirror.getId(shadowHost);\r\n if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (!node) {\r\n while (addList.head) {\r\n addList.removeNode(addList.head.value);\r\n }\r\n break;\r\n }\r\n candidate = node.previous;\r\n addList.removeNode(node.value);\r\n pushAdd(node.value);\r\n }\r\n const payload = {\r\n texts: this.texts\r\n .map((text) => ({\r\n id: this.mirror.getId(text.node),\r\n value: text.value,\r\n }))\r\n .filter((text) => !addedIds.has(text.id))\r\n .filter((text) => this.mirror.has(text.id)),\r\n attributes: this.attributes\r\n .map((attribute) => {\r\n const { attributes } = attribute;\r\n if (typeof attributes.style === 'string') {\r\n const diffAsStr = JSON.stringify(attribute.styleDiff);\r\n const unchangedAsStr = JSON.stringify(attribute._unchangedStyles);\r\n if (diffAsStr.length < attributes.style.length) {\r\n if ((diffAsStr + unchangedAsStr).split('var(').length ===\r\n attributes.style.split('var(').length) {\r\n attributes.style = attribute.styleDiff;\r\n }\r\n }\r\n }\r\n return {\r\n id: this.mirror.getId(attribute.node),\r\n attributes: attributes,\r\n };\r\n })\r\n .filter((attribute) => !addedIds.has(attribute.id))\r\n .filter((attribute) => this.mirror.has(attribute.id)),\r\n removes: this.removes,\r\n adds,\r\n };\r\n if (!payload.texts.length &&\r\n !payload.attributes.length &&\r\n !payload.removes.length &&\r\n !payload.adds.length) {\r\n return;\r\n }\r\n this.texts = [];\r\n this.attributes = [];\r\n this.attributeMap = new WeakMap();\r\n this.removes = [];\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.movedMap = {};\r\n this.mutationCb(payload);\r\n };\r\n this.processMutation = (m) => {\r\n if (isIgnored(m.target, this.mirror)) {\r\n return;\r\n }\r\n switch (m.type) {\r\n case 'characterData': {\r\n const value = m.target.textContent;\r\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) &&\r\n value !== m.oldValue) {\r\n this.texts.push({\r\n value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, this.maskAllText) && value\r\n ? this.maskTextFn\r\n ? this.maskTextFn(value, closestElementOfNode(m.target))\r\n : value.replace(/[\\S]/g, '*')\r\n : value,\r\n node: m.target,\r\n });\r\n }\r\n break;\r\n }\r\n case 'attributes': {\r\n const target = m.target;\r\n let attributeName = m.attributeName;\r\n let value = m.target.getAttribute(attributeName);\r\n if (attributeName === 'value') {\r\n const type = getInputType(target);\r\n const tagName = target.tagName;\r\n value = getInputValue(target, tagName, type);\r\n const isInputMasked = shouldMaskInput({\r\n maskInputOptions: this.maskInputOptions,\r\n tagName,\r\n type,\r\n });\r\n const forceMask = needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, isInputMasked);\r\n value = maskInputValue({\r\n isMasked: forceMask,\r\n element: target,\r\n value,\r\n maskInputFn: this.maskInputFn,\r\n });\r\n }\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) ||\r\n value === m.oldValue) {\r\n return;\r\n }\r\n let item = this.attributeMap.get(m.target);\r\n if (target.tagName === 'IFRAME' &&\r\n attributeName === 'src' &&\r\n !this.keepIframeSrcFn(value)) {\r\n if (!target.contentDocument) {\r\n attributeName = 'rr_src';\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n if (!item) {\r\n item = {\r\n node: m.target,\r\n attributes: {},\r\n styleDiff: {},\r\n _unchangedStyles: {},\r\n };\r\n this.attributes.push(item);\r\n this.attributeMap.set(m.target, item);\r\n }\r\n if (attributeName === 'type' &&\r\n target.tagName === 'INPUT' &&\r\n (m.oldValue || '').toLowerCase() === 'password') {\r\n target.setAttribute('data-rr-is-password', 'true');\r\n }\r\n if (!ignoreAttribute(target.tagName, attributeName)) {\r\n item.attributes[attributeName] = transformAttribute(this.doc, toLowerCase(target.tagName), toLowerCase(attributeName), value, target, this.maskAttributeFn);\r\n if (attributeName === 'style') {\r\n if (!this.unattachedDoc) {\r\n try {\r\n this.unattachedDoc =\r\n document.implementation.createHTMLDocument();\r\n }\r\n catch (e) {\r\n this.unattachedDoc = this.doc;\r\n }\r\n }\r\n const old = this.unattachedDoc.createElement('span');\r\n if (m.oldValue) {\r\n old.setAttribute('style', m.oldValue);\r\n }\r\n for (const pname of Array.from(target.style)) {\r\n const newValue = target.style.getPropertyValue(pname);\r\n const newPriority = target.style.getPropertyPriority(pname);\r\n if (newValue !== old.style.getPropertyValue(pname) ||\r\n newPriority !== old.style.getPropertyPriority(pname)) {\r\n if (newPriority === '') {\r\n item.styleDiff[pname] = newValue;\r\n }\r\n else {\r\n item.styleDiff[pname] = [newValue, newPriority];\r\n }\r\n }\r\n else {\r\n item._unchangedStyles[pname] = [newValue, newPriority];\r\n }\r\n }\r\n for (const pname of Array.from(old.style)) {\r\n if (target.style.getPropertyValue(pname) === '') {\r\n item.styleDiff[pname] = false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case 'childList': {\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, true)) {\r\n return;\r\n }\r\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\r\n m.removedNodes.forEach((n) => {\r\n const nodeId = this.mirror.getId(n);\r\n const parentId = isShadowRoot(m.target)\r\n ? this.mirror.getId(m.target.host)\r\n : this.mirror.getId(m.target);\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) ||\r\n isIgnored(n, this.mirror) ||\r\n !isSerialized(n, this.mirror)) {\r\n return;\r\n }\r\n if (this.addedSet.has(n)) {\r\n deepDelete(this.addedSet, n);\r\n this.droppedSet.add(n);\r\n }\r\n else if (this.addedSet.has(m.target) && nodeId === -1) ;\r\n else if (isAncestorRemoved(m.target, this.mirror)) ;\r\n else if (this.movedSet.has(n) &&\r\n this.movedMap[moveKey(nodeId, parentId)]) {\r\n deepDelete(this.movedSet, n);\r\n }\r\n else {\r\n this.removes.push({\r\n parentId,\r\n id: nodeId,\r\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target)\r\n ? true\r\n : undefined,\r\n });\r\n }\r\n this.mapRemoves.push(n);\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n this.genAdds = (n, target) => {\r\n if (this.processedNodeManager.inOtherBuffer(n, this))\r\n return;\r\n if (this.addedSet.has(n) || this.movedSet.has(n))\r\n return;\r\n if (this.mirror.hasNode(n)) {\r\n if (isIgnored(n, this.mirror)) {\r\n return;\r\n }\r\n this.movedSet.add(n);\r\n let targetId = null;\r\n if (target && this.mirror.hasNode(target)) {\r\n targetId = this.mirror.getId(target);\r\n }\r\n if (targetId && targetId !== -1) {\r\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\r\n }\r\n }\r\n else {\r\n this.addedSet.add(n);\r\n this.droppedSet.delete(n);\r\n }\r\n if (!isBlocked(n, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\r\n n.childNodes.forEach((childN) => this.genAdds(childN));\r\n if (hasShadowRoot(n)) {\r\n n.shadowRoot.childNodes.forEach((childN) => {\r\n this.processedNodeManager.add(childN, this);\r\n this.genAdds(childN, n);\r\n });\r\n }\r\n }\r\n };\r\n }\r\n init(options) {\r\n [\r\n 'mutationCb',\r\n 'blockClass',\r\n 'blockSelector',\r\n 'unblockSelector',\r\n 'maskAllText',\r\n 'maskTextClass',\r\n 'unmaskTextClass',\r\n 'maskTextSelector',\r\n 'unmaskTextSelector',\r\n 'inlineStylesheet',\r\n 'maskInputOptions',\r\n 'maskAttributeFn',\r\n 'maskTextFn',\r\n 'maskInputFn',\r\n 'keepIframeSrcFn',\r\n 'recordCanvas',\r\n 'inlineImages',\r\n 'slimDOMOptions',\r\n 'dataURLOptions',\r\n 'doc',\r\n 'mirror',\r\n 'iframeManager',\r\n 'stylesheetManager',\r\n 'shadowDomManager',\r\n 'canvasManager',\r\n 'processedNodeManager',\r\n ].forEach((key) => {\r\n this[key] = options[key];\r\n });\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n this.canvasManager.freeze();\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n this.canvasManager.unfreeze();\r\n this.emit();\r\n }\r\n isFrozen() {\r\n return this.frozen;\r\n }\r\n lock() {\r\n this.locked = true;\r\n this.canvasManager.lock();\r\n }\r\n unlock() {\r\n this.locked = false;\r\n this.canvasManager.unlock();\r\n this.emit();\r\n }\r\n reset() {\r\n this.shadowDomManager.reset();\r\n this.canvasManager.reset();\r\n }\r\n}\r\nfunction deepDelete(addsSet, n) {\r\n addsSet.delete(n);\r\n n.childNodes.forEach((childN) => deepDelete(addsSet, childN));\r\n}\r\nfunction isParentRemoved(removes, n, mirror) {\r\n if (removes.length === 0)\r\n return false;\r\n return _isParentRemoved(removes, n, mirror);\r\n}\r\nfunction _isParentRemoved(removes, n, mirror) {\r\n let node = n.parentNode;\r\n while (node) {\r\n const parentId = mirror.getId(node);\r\n if (removes.some((r) => r.id === parentId)) {\r\n return true;\r\n }\r\n node = node.parentNode;\r\n }\r\n return false;\r\n}\r\nfunction isAncestorInSet(set, n) {\r\n if (set.size === 0)\r\n return false;\r\n return _isAncestorInSet(set, n);\r\n}\r\nfunction _isAncestorInSet(set, n) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n if (set.has(parentNode)) {\r\n return true;\r\n }\r\n return _isAncestorInSet(set, parentNode);\r\n}\n\nexport { MutationBuffer as default };\n","let errorHandler;\r\nfunction registerErrorHandler(handler) {\r\n errorHandler = handler;\r\n}\r\nfunction unregisterErrorHandler() {\r\n errorHandler = undefined;\r\n}\r\nconst callbackWrapper = (cb) => {\r\n if (!errorHandler) {\r\n return cb;\r\n }\r\n const rrwebWrapped = ((...rest) => {\r\n try {\r\n return cb(...rest);\r\n }\r\n catch (error) {\r\n if (errorHandler && errorHandler(error) === true) {\r\n return () => {\r\n };\r\n }\r\n throw error;\r\n }\r\n });\r\n return rrwebWrapped;\r\n};\n\nexport { callbackWrapper, registerErrorHandler, unregisterErrorHandler };\n","import { toLowerCase, toUpperCase, getInputType, getInputValue, shouldMaskInput, needMaskingText, maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { on, throttle, isBlocked, getWindowScroll, hookSetter, patch, setTimeout, legacy_isTouchEvent, nowTimestamp, getWindowHeight, getWindowWidth } from '../utils.js';\nimport { MouseInteractions, IncrementalSource, PointerTypes } from '../../../types/dist/rrweb-types.js';\nimport MutationBuffer from './mutation.js';\nimport { callbackWrapper } from './error-handler.js';\n\nconst mutationBuffers = [];\r\nfunction getEventTarget(event) {\r\n try {\r\n if ('composedPath' in event) {\r\n const path = event.composedPath();\r\n if (path.length) {\r\n return path[0];\r\n }\r\n }\r\n else if ('path' in event && event.path.length) {\r\n return event.path[0];\r\n }\r\n }\r\n catch {\r\n }\r\n return event && event.target;\r\n}\r\nfunction initMutationObserver(options, rootEl) {\r\n const mutationBuffer = new MutationBuffer();\r\n mutationBuffers.push(mutationBuffer);\r\n mutationBuffer.init(options);\r\n let mutationObserverCtor = window.MutationObserver ||\r\n window.__rrMutationObserver;\r\n const angularZoneSymbol = window?.Zone?.__symbol__?.('MutationObserver');\r\n if (angularZoneSymbol &&\r\n window[angularZoneSymbol]) {\r\n mutationObserverCtor = window[angularZoneSymbol];\r\n }\r\n const observer = new mutationObserverCtor(callbackWrapper((mutations) => {\r\n if (options.onMutation && options.onMutation(mutations) === false) {\r\n return;\r\n }\r\n mutationBuffer.processMutations.bind(mutationBuffer)(mutations);\r\n }));\r\n observer.observe(rootEl, {\r\n attributes: true,\r\n attributeOldValue: true,\r\n characterData: true,\r\n characterDataOldValue: true,\r\n childList: true,\r\n subtree: true,\r\n });\r\n return observer;\r\n}\r\nfunction initMoveObserver({ mousemoveCb, sampling, doc, mirror, }) {\r\n if (sampling.mousemove === false) {\r\n return () => {\r\n };\r\n }\r\n const threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\r\n const callbackThreshold = typeof sampling.mousemoveCallback === 'number'\r\n ? sampling.mousemoveCallback\r\n : 500;\r\n let positions = [];\r\n let timeBaseline;\r\n const wrappedCb = throttle(callbackWrapper((source) => {\r\n const totalOffset = Date.now() - timeBaseline;\r\n mousemoveCb(positions.map((p) => {\r\n p.timeOffset -= totalOffset;\r\n return p;\r\n }), source);\r\n positions = [];\r\n timeBaseline = null;\r\n }), callbackThreshold);\r\n const updatePosition = callbackWrapper(throttle(callbackWrapper((evt) => {\r\n const target = getEventTarget(evt);\r\n const { clientX, clientY } = legacy_isTouchEvent(evt)\r\n ? evt.changedTouches[0]\r\n : evt;\r\n if (!timeBaseline) {\r\n timeBaseline = nowTimestamp();\r\n }\r\n positions.push({\r\n x: clientX,\r\n y: clientY,\r\n id: mirror.getId(target),\r\n timeOffset: nowTimestamp() - timeBaseline,\r\n });\r\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\r\n ? IncrementalSource.Drag\r\n : evt instanceof MouseEvent\r\n ? IncrementalSource.MouseMove\r\n : IncrementalSource.TouchMove);\r\n }), threshold, {\r\n trailing: false,\r\n }));\r\n const handlers = [\r\n on('mousemove', updatePosition, doc),\r\n on('touchmove', updatePosition, doc),\r\n on('drag', updatePosition, doc),\r\n ];\r\n return callbackWrapper(() => {\r\n handlers.forEach((h) => h());\r\n });\r\n}\r\nfunction initMouseInteractionObserver({ mouseInteractionCb, doc, mirror, blockClass, blockSelector, unblockSelector, sampling, }) {\r\n if (sampling.mouseInteraction === false) {\r\n return () => {\r\n };\r\n }\r\n const disableMap = sampling.mouseInteraction === true ||\r\n sampling.mouseInteraction === undefined\r\n ? {}\r\n : sampling.mouseInteraction;\r\n const handlers = [];\r\n let currentPointerType = null;\r\n const getHandler = (eventKey) => {\r\n return (event) => {\r\n const target = getEventTarget(event);\r\n if (isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\r\n return;\r\n }\r\n let pointerType = null;\r\n let thisEventKey = eventKey;\r\n if ('pointerType' in event) {\r\n switch (event.pointerType) {\r\n case 'mouse':\r\n pointerType = PointerTypes.Mouse;\r\n break;\r\n case 'touch':\r\n pointerType = PointerTypes.Touch;\r\n break;\r\n case 'pen':\r\n pointerType = PointerTypes.Pen;\r\n break;\r\n }\r\n if (pointerType === PointerTypes.Touch) {\r\n if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) {\r\n thisEventKey = 'TouchStart';\r\n }\r\n else if (MouseInteractions[eventKey] === MouseInteractions.MouseUp) {\r\n thisEventKey = 'TouchEnd';\r\n }\r\n }\r\n else if (pointerType === PointerTypes.Pen) ;\r\n }\r\n else if (legacy_isTouchEvent(event)) {\r\n pointerType = PointerTypes.Touch;\r\n }\r\n if (pointerType !== null) {\r\n currentPointerType = pointerType;\r\n if ((thisEventKey.startsWith('Touch') &&\r\n pointerType === PointerTypes.Touch) ||\r\n (thisEventKey.startsWith('Mouse') &&\r\n pointerType === PointerTypes.Mouse)) {\r\n pointerType = null;\r\n }\r\n }\r\n else if (MouseInteractions[eventKey] === MouseInteractions.Click) {\r\n pointerType = currentPointerType;\r\n currentPointerType = null;\r\n }\r\n const e = legacy_isTouchEvent(event) ? event.changedTouches[0] : event;\r\n if (!e) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n const { clientX, clientY } = e;\r\n callbackWrapper(mouseInteractionCb)({\r\n type: MouseInteractions[thisEventKey],\r\n id,\r\n x: clientX,\r\n y: clientY,\r\n ...(pointerType !== null && { pointerType }),\r\n });\r\n };\r\n };\r\n Object.keys(MouseInteractions)\r\n .filter((key) => Number.isNaN(Number(key)) &&\r\n !key.endsWith('_Departed') &&\r\n disableMap[key] !== false)\r\n .forEach((eventKey) => {\r\n let eventName = toLowerCase(eventKey);\r\n const handler = getHandler(eventKey);\r\n if (window.PointerEvent) {\r\n switch (MouseInteractions[eventKey]) {\r\n case MouseInteractions.MouseDown:\r\n case MouseInteractions.MouseUp:\r\n eventName = eventName.replace('mouse', 'pointer');\r\n break;\r\n case MouseInteractions.TouchStart:\r\n case MouseInteractions.TouchEnd:\r\n return;\r\n }\r\n }\r\n handlers.push(on(eventName, handler, doc));\r\n });\r\n return callbackWrapper(() => {\r\n handlers.forEach((h) => h());\r\n });\r\n}\r\nfunction initScrollObserver({ scrollCb, doc, mirror, blockClass, blockSelector, unblockSelector, sampling, }) {\r\n const updatePosition = callbackWrapper(throttle(callbackWrapper((evt) => {\r\n const target = getEventTarget(evt);\r\n if (!target ||\r\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n if (target === doc && doc.defaultView) {\r\n const scrollLeftTop = getWindowScroll(doc.defaultView);\r\n scrollCb({\r\n id,\r\n x: scrollLeftTop.left,\r\n y: scrollLeftTop.top,\r\n });\r\n }\r\n else {\r\n scrollCb({\r\n id,\r\n x: target.scrollLeft,\r\n y: target.scrollTop,\r\n });\r\n }\r\n }), sampling.scroll || 100));\r\n return on('scroll', updatePosition, doc);\r\n}\r\nfunction initViewportResizeObserver({ viewportResizeCb }, { win }) {\r\n let lastH = -1;\r\n let lastW = -1;\r\n const updateDimension = callbackWrapper(throttle(callbackWrapper(() => {\r\n const height = getWindowHeight();\r\n const width = getWindowWidth();\r\n if (lastH !== height || lastW !== width) {\r\n viewportResizeCb({\r\n width: Number(width),\r\n height: Number(height),\r\n });\r\n lastH = height;\r\n lastW = width;\r\n }\r\n }), 200));\r\n return on('resize', updateDimension, win);\r\n}\r\nconst INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\r\nconst lastInputValueMap = new WeakMap();\r\nfunction initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, unblockSelector, ignoreClass, ignoreSelector, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, }) {\r\n function eventHandler(event) {\r\n let target = getEventTarget(event);\r\n const userTriggered = event.isTrusted;\r\n const tagName = target && toUpperCase(target.tagName);\r\n if (tagName === 'OPTION')\r\n target = target.parentElement;\r\n if (!target ||\r\n !tagName ||\r\n INPUT_TAGS.indexOf(tagName) < 0 ||\r\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\r\n return;\r\n }\r\n const el = target;\r\n if (el.classList.contains(ignoreClass) ||\r\n (ignoreSelector && el.matches(ignoreSelector))) {\r\n return;\r\n }\r\n const type = getInputType(target);\r\n let text = getInputValue(el, tagName, type);\r\n let isChecked = false;\r\n const isInputMasked = shouldMaskInput({\r\n maskInputOptions,\r\n tagName,\r\n type,\r\n });\r\n const forceMask = needMaskingText(target, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked);\r\n if (type === 'radio' || type === 'checkbox') {\r\n isChecked = target.checked;\r\n }\r\n text = maskInputValue({\r\n isMasked: forceMask,\r\n element: target,\r\n value: text,\r\n maskInputFn,\r\n });\r\n cbWithDedup(target, userTriggeredOnInput\r\n ? { text, isChecked, userTriggered }\r\n : { text, isChecked });\r\n const name = target.name;\r\n if (type === 'radio' && name && isChecked) {\r\n doc\r\n .querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)\r\n .forEach((el) => {\r\n if (el !== target) {\r\n const text = maskInputValue({\r\n isMasked: forceMask,\r\n element: el,\r\n value: getInputValue(el, tagName, type),\r\n maskInputFn,\r\n });\r\n cbWithDedup(el, userTriggeredOnInput\r\n ? { text, isChecked: !isChecked, userTriggered: false }\r\n : { text, isChecked: !isChecked });\r\n }\r\n });\r\n }\r\n }\r\n function cbWithDedup(target, v) {\r\n const lastInputValue = lastInputValueMap.get(target);\r\n if (!lastInputValue ||\r\n lastInputValue.text !== v.text ||\r\n lastInputValue.isChecked !== v.isChecked) {\r\n lastInputValueMap.set(target, v);\r\n const id = mirror.getId(target);\r\n callbackWrapper(inputCb)({\r\n ...v,\r\n id,\r\n });\r\n }\r\n }\r\n const events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\r\n const handlers = events.map((eventName) => on(eventName, callbackWrapper(eventHandler), doc));\r\n const currentWindow = doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n }\r\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, 'value');\r\n const hookProperties = [\r\n [currentWindow.HTMLInputElement.prototype, 'value'],\r\n [currentWindow.HTMLInputElement.prototype, 'checked'],\r\n [currentWindow.HTMLSelectElement.prototype, 'value'],\r\n [currentWindow.HTMLTextAreaElement.prototype, 'value'],\r\n [currentWindow.HTMLSelectElement.prototype, 'selectedIndex'],\r\n [currentWindow.HTMLOptionElement.prototype, 'selected'],\r\n ];\r\n if (propertyDescriptor && propertyDescriptor.set) {\r\n handlers.push(...hookProperties.map((p) => hookSetter(p[0], p[1], {\r\n set() {\r\n callbackWrapper(eventHandler)({\r\n target: this,\r\n isTrusted: false,\r\n });\r\n },\r\n }, false, currentWindow)));\r\n }\r\n return callbackWrapper(() => {\r\n handlers.forEach((h) => h());\r\n });\r\n}\r\nfunction getNestedCSSRulePositions(rule) {\r\n const positions = [];\r\n function recurse(childRule, pos) {\r\n if ((hasNestedCSSRule('CSSGroupingRule') &&\r\n childRule.parentRule instanceof CSSGroupingRule) ||\r\n (hasNestedCSSRule('CSSMediaRule') &&\r\n childRule.parentRule instanceof CSSMediaRule) ||\r\n (hasNestedCSSRule('CSSSupportsRule') &&\r\n childRule.parentRule instanceof CSSSupportsRule) ||\r\n (hasNestedCSSRule('CSSConditionRule') &&\r\n childRule.parentRule instanceof CSSConditionRule)) {\r\n const rules = Array.from(childRule.parentRule.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n else if (childRule.parentStyleSheet) {\r\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n return pos;\r\n }\r\n return recurse(rule, positions);\r\n}\r\nfunction getIdAndStyleId(sheet, mirror, styleMirror) {\r\n let id, styleId;\r\n if (!sheet)\r\n return {};\r\n if (sheet.ownerNode)\r\n id = mirror.getId(sheet.ownerNode);\r\n else\r\n styleId = styleMirror.getId(sheet);\r\n return {\r\n styleId,\r\n id,\r\n };\r\n}\r\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror, stylesheetManager }, { win }) {\r\n if (!win.CSSStyleSheet || !win.CSSStyleSheet.prototype) {\r\n return () => {\r\n };\r\n }\r\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\r\n win.CSSStyleSheet.prototype.insertRule = new Proxy(insertRule, {\r\n apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n const [rule, index] = argumentsList;\r\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [{ rule, index }],\r\n });\r\n }\r\n return target.apply(thisArg, argumentsList);\r\n }),\r\n });\r\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\r\n win.CSSStyleSheet.prototype.deleteRule = new Proxy(deleteRule, {\r\n apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n const [index] = argumentsList;\r\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [{ index }],\r\n });\r\n }\r\n return target.apply(thisArg, argumentsList);\r\n }),\r\n });\r\n let replace;\r\n if (win.CSSStyleSheet.prototype.replace) {\r\n replace = win.CSSStyleSheet.prototype.replace;\r\n win.CSSStyleSheet.prototype.replace = new Proxy(replace, {\r\n apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n const [text] = argumentsList;\r\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replace: text,\r\n });\r\n }\r\n return target.apply(thisArg, argumentsList);\r\n }),\r\n });\r\n }\r\n let replaceSync;\r\n if (win.CSSStyleSheet.prototype.replaceSync) {\r\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\r\n win.CSSStyleSheet.prototype.replaceSync = new Proxy(replaceSync, {\r\n apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n const [text] = argumentsList;\r\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replaceSync: text,\r\n });\r\n }\r\n return target.apply(thisArg, argumentsList);\r\n }),\r\n });\r\n }\r\n const supportedNestedCSSRuleTypes = {};\r\n if (canMonkeyPatchNestedCSSRule('CSSGroupingRule')) {\r\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\r\n }\r\n else {\r\n if (canMonkeyPatchNestedCSSRule('CSSMediaRule')) {\r\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\r\n }\r\n if (canMonkeyPatchNestedCSSRule('CSSConditionRule')) {\r\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\r\n }\r\n if (canMonkeyPatchNestedCSSRule('CSSSupportsRule')) {\r\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\r\n }\r\n }\r\n const unmodifiedFunctions = {};\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n unmodifiedFunctions[typeKey] = {\r\n insertRule: type.prototype.insertRule,\r\n deleteRule: type.prototype.deleteRule,\r\n };\r\n type.prototype.insertRule = new Proxy(unmodifiedFunctions[typeKey].insertRule, {\r\n apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n const [rule, index] = argumentsList;\r\n const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [\r\n {\r\n rule,\r\n index: [\r\n ...getNestedCSSRulePositions(thisArg),\r\n index || 0,\r\n ],\r\n },\r\n ],\r\n });\r\n }\r\n return target.apply(thisArg, argumentsList);\r\n }),\r\n });\r\n type.prototype.deleteRule = new Proxy(unmodifiedFunctions[typeKey].deleteRule, {\r\n apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n const [index] = argumentsList;\r\n const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [\r\n { index: [...getNestedCSSRulePositions(thisArg), index] },\r\n ],\r\n });\r\n }\r\n return target.apply(thisArg, argumentsList);\r\n }),\r\n });\r\n });\r\n return callbackWrapper(() => {\r\n win.CSSStyleSheet.prototype.insertRule = insertRule;\r\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\r\n replace && (win.CSSStyleSheet.prototype.replace = replace);\r\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\r\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\r\n });\r\n });\r\n}\r\nfunction initAdoptedStyleSheetObserver({ mirror, stylesheetManager, }, host) {\r\n let hostId = null;\r\n if (host.nodeName === '#document')\r\n hostId = mirror.getId(host);\r\n else\r\n hostId = mirror.getId(host.host);\r\n const patchTarget = host.nodeName === '#document'\r\n ? host.defaultView?.Document\r\n : host.ownerDocument?.defaultView?.ShadowRoot;\r\n const originalPropertyDescriptor = patchTarget?.prototype\r\n ? Object.getOwnPropertyDescriptor(patchTarget?.prototype, 'adoptedStyleSheets')\r\n : undefined;\r\n if (hostId === null ||\r\n hostId === -1 ||\r\n !patchTarget ||\r\n !originalPropertyDescriptor)\r\n return () => {\r\n };\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get() {\r\n return originalPropertyDescriptor.get?.call(this);\r\n },\r\n set(sheets) {\r\n const result = originalPropertyDescriptor.set?.call(this, sheets);\r\n if (hostId !== null && hostId !== -1) {\r\n try {\r\n stylesheetManager.adoptStyleSheets(sheets, hostId);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n return result;\r\n },\r\n });\r\n return callbackWrapper(() => {\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get: originalPropertyDescriptor.get,\r\n set: originalPropertyDescriptor.set,\r\n });\r\n });\r\n}\r\nfunction initStyleDeclarationObserver({ styleDeclarationCb, mirror, ignoreCSSAttributes, stylesheetManager, }, { win }) {\r\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\r\n win.CSSStyleDeclaration.prototype.setProperty = new Proxy(setProperty, {\r\n apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n const [property, value, priority] = argumentsList;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return setProperty.apply(thisArg, [property, value, priority]);\r\n }\r\n const { id, styleId } = getIdAndStyleId(thisArg.parentRule?.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n set: {\r\n property,\r\n value,\r\n priority,\r\n },\r\n index: getNestedCSSRulePositions(thisArg.parentRule),\r\n });\r\n }\r\n return target.apply(thisArg, argumentsList);\r\n }),\r\n });\r\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = new Proxy(removeProperty, {\r\n apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n const [property] = argumentsList;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return removeProperty.apply(thisArg, [property]);\r\n }\r\n const { id, styleId } = getIdAndStyleId(thisArg.parentRule?.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n remove: {\r\n property,\r\n },\r\n index: getNestedCSSRulePositions(thisArg.parentRule),\r\n });\r\n }\r\n return target.apply(thisArg, argumentsList);\r\n }),\r\n });\r\n return callbackWrapper(() => {\r\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\r\n });\r\n}\r\nfunction initMediaInteractionObserver({ mediaInteractionCb, blockClass, blockSelector, unblockSelector, mirror, sampling, doc, }) {\r\n const handler = callbackWrapper((type) => throttle(callbackWrapper((event) => {\r\n const target = getEventTarget(event);\r\n if (!target ||\r\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\r\n return;\r\n }\r\n const { currentTime, volume, muted, playbackRate } = target;\r\n mediaInteractionCb({\r\n type,\r\n id: mirror.getId(target),\r\n currentTime,\r\n volume,\r\n muted,\r\n playbackRate,\r\n });\r\n }), sampling.media || 500));\r\n const handlers = [\r\n on('play', handler(0), doc),\r\n on('pause', handler(1), doc),\r\n on('seeked', handler(2), doc),\r\n on('volumechange', handler(3), doc),\r\n on('ratechange', handler(4), doc),\r\n ];\r\n return callbackWrapper(() => {\r\n handlers.forEach((h) => h());\r\n });\r\n}\r\nfunction initFontObserver({ fontCb, doc }) {\r\n const win = doc.defaultView;\r\n if (!win) {\r\n return () => {\r\n };\r\n }\r\n const handlers = [];\r\n const fontMap = new WeakMap();\r\n const originalFontFace = win.FontFace;\r\n win.FontFace = function FontFace(family, source, descriptors) {\r\n const fontFace = new originalFontFace(family, source, descriptors);\r\n fontMap.set(fontFace, {\r\n family,\r\n buffer: typeof source !== 'string',\r\n descriptors,\r\n fontSource: typeof source === 'string'\r\n ? source\r\n : JSON.stringify(Array.from(new Uint8Array(source))),\r\n });\r\n return fontFace;\r\n };\r\n const restoreHandler = patch(doc.fonts, 'add', function (original) {\r\n return function (fontFace) {\r\n setTimeout(callbackWrapper(() => {\r\n const p = fontMap.get(fontFace);\r\n if (p) {\r\n fontCb(p);\r\n fontMap.delete(fontFace);\r\n }\r\n }), 0);\r\n return original.apply(this, [fontFace]);\r\n };\r\n });\r\n handlers.push(() => {\r\n win.FontFace = originalFontFace;\r\n });\r\n handlers.push(restoreHandler);\r\n return callbackWrapper(() => {\r\n handlers.forEach((h) => h());\r\n });\r\n}\r\nfunction initSelectionObserver(param) {\r\n const { doc, mirror, blockClass, blockSelector, unblockSelector, selectionCb, } = param;\r\n let collapsed = true;\r\n const updateSelection = callbackWrapper(() => {\r\n const selection = doc.getSelection();\r\n if (!selection || (collapsed && selection?.isCollapsed))\r\n return;\r\n collapsed = selection.isCollapsed || false;\r\n const ranges = [];\r\n const count = selection.rangeCount || 0;\r\n for (let i = 0; i < count; i++) {\r\n const range = selection.getRangeAt(i);\r\n const { startContainer, startOffset, endContainer, endOffset } = range;\r\n const blocked = isBlocked(startContainer, blockClass, blockSelector, unblockSelector, true) ||\r\n isBlocked(endContainer, blockClass, blockSelector, unblockSelector, true);\r\n if (blocked)\r\n continue;\r\n ranges.push({\r\n start: mirror.getId(startContainer),\r\n startOffset,\r\n end: mirror.getId(endContainer),\r\n endOffset,\r\n });\r\n }\r\n selectionCb({ ranges });\r\n });\r\n updateSelection();\r\n return on('selectionchange', updateSelection);\r\n}\r\nfunction initCustomElementObserver({ doc, customElementCb, }) {\r\n const win = doc.defaultView;\r\n if (!win || !win.customElements)\r\n return () => { };\r\n const restoreHandler = patch(win.customElements, 'define', function (original) {\r\n return function (name, constructor, options) {\r\n try {\r\n customElementCb({\r\n define: {\r\n name,\r\n },\r\n });\r\n }\r\n catch (e) {\r\n }\r\n return original.apply(this, [name, constructor, options]);\r\n };\r\n });\r\n return restoreHandler;\r\n}\r\nfunction initObservers(o, _hooks = {}) {\r\n const currentWindow = o.doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n };\r\n }\r\n let mutationObserver;\r\n if (o.recordDOM) {\r\n mutationObserver = initMutationObserver(o, o.doc);\r\n }\r\n const mousemoveHandler = initMoveObserver(o);\r\n const mouseInteractionHandler = initMouseInteractionObserver(o);\r\n const scrollHandler = initScrollObserver(o);\r\n const viewportResizeHandler = initViewportResizeObserver(o, {\r\n win: currentWindow,\r\n });\r\n const inputHandler = initInputObserver(o);\r\n const mediaInteractionHandler = initMediaInteractionObserver(o);\r\n let styleSheetObserver = () => { };\r\n let adoptedStyleSheetObserver = () => { };\r\n let styleDeclarationObserver = () => { };\r\n let fontObserver = () => { };\r\n if (o.recordDOM) {\r\n styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\r\n adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\r\n styleDeclarationObserver = initStyleDeclarationObserver(o, {\r\n win: currentWindow,\r\n });\r\n if (o.collectFonts) {\r\n fontObserver = initFontObserver(o);\r\n }\r\n }\r\n const selectionObserver = initSelectionObserver(o);\r\n const customElementObserver = initCustomElementObserver(o);\r\n const pluginHandlers = [];\r\n for (const plugin of o.plugins) {\r\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\r\n }\r\n return callbackWrapper(() => {\r\n mutationBuffers.forEach((b) => b.reset());\r\n mutationObserver?.disconnect();\r\n mousemoveHandler();\r\n mouseInteractionHandler();\r\n scrollHandler();\r\n viewportResizeHandler();\r\n inputHandler();\r\n mediaInteractionHandler();\r\n styleSheetObserver();\r\n adoptedStyleSheetObserver();\r\n styleDeclarationObserver();\r\n fontObserver();\r\n selectionObserver();\r\n customElementObserver();\r\n pluginHandlers.forEach((h) => h());\r\n });\r\n}\r\nfunction hasNestedCSSRule(prop) {\r\n return typeof window[prop] !== 'undefined';\r\n}\r\nfunction canMonkeyPatchNestedCSSRule(prop) {\r\n return Boolean(typeof window[prop] !== 'undefined' &&\r\n window[prop].prototype &&\r\n 'insertRule' in window[prop].prototype &&\r\n 'deleteRule' in window[prop].prototype);\r\n}\n\nexport { INPUT_TAGS, initAdoptedStyleSheetObserver, initMutationObserver, initObservers, initScrollObserver, mutationBuffers };\n","class CrossOriginIframeMirror {\r\n constructor(generateIdFn) {\r\n this.generateIdFn = generateIdFn;\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n }\r\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\r\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\r\n let id = idToRemoteIdMap.get(remoteId);\r\n if (!id) {\r\n id = this.generateIdFn();\r\n idToRemoteIdMap.set(remoteId, id);\r\n remoteIdToIdMap.set(id, remoteId);\r\n }\r\n return id;\r\n }\r\n getIds(iframe, remoteId) {\r\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return remoteId.map((id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap));\r\n }\r\n getRemoteId(iframe, id, map) {\r\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\r\n if (typeof id !== 'number')\r\n return id;\r\n const remoteId = remoteIdToIdMap.get(id);\r\n if (!remoteId)\r\n return -1;\r\n return remoteId;\r\n }\r\n getRemoteIds(iframe, ids) {\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\r\n }\r\n reset(iframe) {\r\n if (!iframe) {\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n return;\r\n }\r\n this.iframeIdToRemoteIdMap.delete(iframe);\r\n this.iframeRemoteIdToIdMap.delete(iframe);\r\n }\r\n getIdToRemoteIdMap(iframe) {\r\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\r\n if (!idToRemoteIdMap) {\r\n idToRemoteIdMap = new Map();\r\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\r\n }\r\n return idToRemoteIdMap;\r\n }\r\n getRemoteIdToIdMap(iframe) {\r\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\r\n if (!remoteIdToIdMap) {\r\n remoteIdToIdMap = new Map();\r\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\r\n }\r\n return remoteIdToIdMap;\r\n }\r\n}\n\nexport { CrossOriginIframeMirror as default };\n","import { genId, NodeType } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport CrossOriginIframeMirror from './cross-origin-iframe-mirror.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/rrweb-types.js';\n\nclass IframeManagerNoop {\r\n constructor() {\r\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\r\n this.crossOriginIframeRootIdMap = new WeakMap();\r\n }\r\n addIframe() {\r\n }\r\n addLoadListener() {\r\n }\r\n attachIframe() {\r\n }\r\n}\r\nclass IframeManager {\r\n constructor(options) {\r\n this.iframes = new WeakMap();\r\n this.crossOriginIframeMap = new WeakMap();\r\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\r\n this.crossOriginIframeRootIdMap = new WeakMap();\r\n this.mutationCb = options.mutationCb;\r\n this.wrappedEmit = options.wrappedEmit;\r\n this.stylesheetManager = options.stylesheetManager;\r\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\r\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror));\r\n this.mirror = options.mirror;\r\n if (this.recordCrossOriginIframes) {\r\n window.addEventListener('message', this.handleMessage.bind(this));\r\n }\r\n }\r\n addIframe(iframeEl) {\r\n this.iframes.set(iframeEl, true);\r\n if (iframeEl.contentWindow)\r\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\r\n }\r\n addLoadListener(cb) {\r\n this.loadListener = cb;\r\n }\r\n attachIframe(iframeEl, childSn) {\r\n this.mutationCb({\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: childSn,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n });\r\n this.loadListener?.(iframeEl);\r\n if (iframeEl.contentDocument &&\r\n iframeEl.contentDocument.adoptedStyleSheets &&\r\n iframeEl.contentDocument.adoptedStyleSheets.length > 0)\r\n this.stylesheetManager.adoptStyleSheets(iframeEl.contentDocument.adoptedStyleSheets, this.mirror.getId(iframeEl.contentDocument));\r\n }\r\n handleMessage(message) {\r\n const crossOriginMessageEvent = message;\r\n if (crossOriginMessageEvent.data.type !== 'rrweb' ||\r\n crossOriginMessageEvent.origin !== crossOriginMessageEvent.data.origin)\r\n return;\r\n const iframeSourceWindow = message.source;\r\n if (!iframeSourceWindow)\r\n return;\r\n const iframeEl = this.crossOriginIframeMap.get(message.source);\r\n if (!iframeEl)\r\n return;\r\n const transformedEvent = this.transformCrossOriginEvent(iframeEl, crossOriginMessageEvent.data.event);\r\n if (transformedEvent)\r\n this.wrappedEmit(transformedEvent, crossOriginMessageEvent.data.isCheckout);\r\n }\r\n transformCrossOriginEvent(iframeEl, e) {\r\n switch (e.type) {\r\n case EventType.FullSnapshot: {\r\n this.crossOriginIframeMirror.reset(iframeEl);\r\n this.crossOriginIframeStyleMirror.reset(iframeEl);\r\n this.replaceIdOnNode(e.data.node, iframeEl);\r\n const rootId = e.data.node.id;\r\n this.crossOriginIframeRootIdMap.set(iframeEl, rootId);\r\n this.patchRootIdOnNode(e.data.node, rootId);\r\n return {\r\n timestamp: e.timestamp,\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Mutation,\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: e.data.node,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n },\r\n };\r\n }\r\n case EventType.Meta:\r\n case EventType.Load:\r\n case EventType.DomContentLoaded: {\r\n return false;\r\n }\r\n case EventType.Plugin: {\r\n return e;\r\n }\r\n case EventType.Custom: {\r\n this.replaceIds(e.data.payload, iframeEl, ['id', 'parentId', 'previousId', 'nextId']);\r\n return e;\r\n }\r\n case EventType.IncrementalSnapshot: {\r\n switch (e.data.source) {\r\n case IncrementalSource.Mutation: {\r\n e.data.adds.forEach((n) => {\r\n this.replaceIds(n, iframeEl, [\r\n 'parentId',\r\n 'nextId',\r\n 'previousId',\r\n ]);\r\n this.replaceIdOnNode(n.node, iframeEl);\r\n const rootId = this.crossOriginIframeRootIdMap.get(iframeEl);\r\n rootId && this.patchRootIdOnNode(n.node, rootId);\r\n });\r\n e.data.removes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['parentId', 'id']);\r\n });\r\n e.data.attributes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n e.data.texts.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.Drag:\r\n case IncrementalSource.TouchMove:\r\n case IncrementalSource.MouseMove: {\r\n e.data.positions.forEach((p) => {\r\n this.replaceIds(p, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.ViewportResize: {\r\n return false;\r\n }\r\n case IncrementalSource.MediaInteraction:\r\n case IncrementalSource.MouseInteraction:\r\n case IncrementalSource.Scroll:\r\n case IncrementalSource.CanvasMutation:\r\n case IncrementalSource.Input: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n return e;\r\n }\r\n case IncrementalSource.StyleSheetRule:\r\n case IncrementalSource.StyleDeclaration: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleId']);\r\n return e;\r\n }\r\n case IncrementalSource.Font: {\r\n return e;\r\n }\r\n case IncrementalSource.Selection: {\r\n e.data.ranges.forEach((range) => {\r\n this.replaceIds(range, iframeEl, ['start', 'end']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.AdoptedStyleSheet: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleIds']);\r\n e.data.styles?.forEach((style) => {\r\n this.replaceStyleIds(style, iframeEl, ['styleId']);\r\n });\r\n return e;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n replace(iframeMirror, obj, iframeEl, keys) {\r\n for (const key of keys) {\r\n if (!Array.isArray(obj[key]) && typeof obj[key] !== 'number')\r\n continue;\r\n if (Array.isArray(obj[key])) {\r\n obj[key] = iframeMirror.getIds(iframeEl, obj[key]);\r\n }\r\n else {\r\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\r\n }\r\n }\r\n return obj;\r\n }\r\n replaceIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\r\n }\r\n replaceStyleIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\r\n }\r\n replaceIdOnNode(node, iframeEl) {\r\n this.replaceIds(node, iframeEl, ['id', 'rootId']);\r\n if ('childNodes' in node) {\r\n node.childNodes.forEach((child) => {\r\n this.replaceIdOnNode(child, iframeEl);\r\n });\r\n }\r\n }\r\n patchRootIdOnNode(node, rootId) {\r\n if (node.type !== NodeType.Document && !node.rootId)\r\n node.rootId = rootId;\r\n if ('childNodes' in node) {\r\n node.childNodes.forEach((child) => {\r\n this.patchRootIdOnNode(child, rootId);\r\n });\r\n }\r\n }\r\n}\n\nexport { IframeManager, IframeManagerNoop };\n","import { initMutationObserver, initScrollObserver, initAdoptedStyleSheetObserver } from './observer.js';\nimport { setTimeout, patch, inDom } from '../utils.js';\nimport { isNativeShadowDom } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nclass ShadowDomManagerNoop {\r\n init() {\r\n }\r\n addShadowRoot() {\r\n }\r\n observeAttachShadow() {\r\n }\r\n reset() {\r\n }\r\n}\r\nclass ShadowDomManager {\r\n constructor(options) {\r\n this.shadowDoms = new WeakSet();\r\n this.restoreHandlers = [];\r\n this.mutationCb = options.mutationCb;\r\n this.scrollCb = options.scrollCb;\r\n this.bypassOptions = options.bypassOptions;\r\n this.mirror = options.mirror;\r\n this.init();\r\n }\r\n init() {\r\n this.reset();\r\n this.patchAttachShadow(Element, document);\r\n }\r\n addShadowRoot(shadowRoot, doc) {\r\n if (!isNativeShadowDom(shadowRoot))\r\n return;\r\n if (this.shadowDoms.has(shadowRoot))\r\n return;\r\n this.shadowDoms.add(shadowRoot);\r\n this.bypassOptions.canvasManager.addShadowRoot(shadowRoot);\r\n const observer = initMutationObserver({\r\n ...this.bypassOptions,\r\n doc,\r\n mutationCb: this.mutationCb,\r\n mirror: this.mirror,\r\n shadowDomManager: this,\r\n }, shadowRoot);\r\n this.restoreHandlers.push(() => observer.disconnect());\r\n this.restoreHandlers.push(initScrollObserver({\r\n ...this.bypassOptions,\r\n scrollCb: this.scrollCb,\r\n doc: shadowRoot,\r\n mirror: this.mirror,\r\n }));\r\n setTimeout(() => {\r\n if (shadowRoot.adoptedStyleSheets &&\r\n shadowRoot.adoptedStyleSheets.length > 0)\r\n this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host));\r\n this.restoreHandlers.push(initAdoptedStyleSheetObserver({\r\n mirror: this.mirror,\r\n stylesheetManager: this.bypassOptions.stylesheetManager,\r\n }, shadowRoot));\r\n }, 0);\r\n }\r\n observeAttachShadow(iframeElement) {\r\n if (!iframeElement.contentWindow || !iframeElement.contentDocument)\r\n return;\r\n this.patchAttachShadow(iframeElement.contentWindow.Element, iframeElement.contentDocument);\r\n }\r\n patchAttachShadow(element, doc) {\r\n const manager = this;\r\n this.restoreHandlers.push(patch(element.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot && inDom(this))\r\n manager.addShadowRoot(this.shadowRoot, doc);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n reset() {\r\n this.restoreHandlers.forEach((handler) => {\r\n try {\r\n handler();\r\n }\r\n catch (e) {\r\n }\r\n });\r\n this.restoreHandlers = [];\r\n this.shadowDoms = new WeakSet();\r\n this.bypassOptions.canvasManager.resetShadowRoots();\r\n }\r\n}\n\nexport { ShadowDomManager, ShadowDomManagerNoop };\n","import { onRequestAnimationFrame, isBlocked } from '../../../utils.js';\nimport { CanvasContext } from '../../../../../types/dist/rrweb-types.js';\nimport initCanvas2DMutationObserver from './2d.js';\nimport initCanvasContextObserver from './canvas.js';\nimport initCanvasWebGLMutationObserver from './webgl.js';\nimport { getImageBitmapDataUrlWorkerURL as t } from '../../../../../rrweb-worker/es/rrweb-worker/index.js';\nimport { callbackWrapper, registerErrorHandler } from '../../error-handler.js';\n\nclass CanvasManagerNoop {\r\n reset() {\r\n }\r\n freeze() {\r\n }\r\n unfreeze() {\r\n }\r\n lock() {\r\n }\r\n unlock() {\r\n }\r\n snapshot() {\r\n }\r\n addWindow() {\r\n }\r\n addShadowRoot() {\r\n }\r\n resetShadowRoots() {\r\n }\r\n}\r\nclass CanvasManager {\r\n reset() {\r\n this.pendingCanvasMutations.clear();\r\n this.restoreHandlers.forEach((handler) => {\r\n try {\r\n handler();\r\n }\r\n catch (e) {\r\n }\r\n });\r\n this.restoreHandlers = [];\r\n this.windowsSet = new WeakSet();\r\n this.windows = [];\r\n this.shadowDoms = new Set();\r\n this.worker?.terminate();\r\n this.worker = null;\r\n this.snapshotInProgressMap = new Map();\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n }\r\n lock() {\r\n this.locked = true;\r\n }\r\n unlock() {\r\n this.locked = false;\r\n }\r\n constructor(options) {\r\n this.pendingCanvasMutations = new Map();\r\n this.rafStamps = { latestId: 0, invokeId: null };\r\n this.shadowDoms = new Set();\r\n this.windowsSet = new WeakSet();\r\n this.windows = [];\r\n this.restoreHandlers = [];\r\n this.frozen = false;\r\n this.locked = false;\r\n this.snapshotInProgressMap = new Map();\r\n this.worker = null;\r\n this.processMutation = (target, mutation) => {\r\n const newFrame = this.rafStamps.invokeId &&\r\n this.rafStamps.latestId !== this.rafStamps.invokeId;\r\n if (newFrame || !this.rafStamps.invokeId)\r\n this.rafStamps.invokeId = this.rafStamps.latestId;\r\n if (!this.pendingCanvasMutations.has(target)) {\r\n this.pendingCanvasMutations.set(target, []);\r\n }\r\n this.pendingCanvasMutations.get(target).push(mutation);\r\n };\r\n const { sampling = 'all', win, blockClass, blockSelector, unblockSelector, maxCanvasSize, recordCanvas, dataURLOptions, errorHandler, } = options;\r\n this.mutationCb = options.mutationCb;\r\n this.mirror = options.mirror;\r\n this.options = options;\r\n if (errorHandler) {\r\n registerErrorHandler(errorHandler);\r\n }\r\n if ((recordCanvas && typeof sampling === 'number') ||\r\n options.enableManualSnapshot) {\r\n this.worker = this.initFPSWorker();\r\n }\r\n this.addWindow(win);\r\n if (options.enableManualSnapshot) {\r\n return;\r\n }\r\n callbackWrapper(() => {\r\n if (recordCanvas && sampling === 'all') {\r\n this.startRAFTimestamping();\r\n this.startPendingCanvasMutationFlusher();\r\n }\r\n if (recordCanvas && typeof sampling === 'number') {\r\n this.initCanvasFPSObserver(sampling, blockClass, blockSelector, unblockSelector, maxCanvasSize, {\r\n dataURLOptions,\r\n });\r\n }\r\n })();\r\n }\r\n addWindow(win) {\r\n const { sampling = 'all', blockClass, blockSelector, unblockSelector, recordCanvas, enableManualSnapshot, } = this.options;\r\n if (this.windowsSet.has(win))\r\n return;\r\n if (enableManualSnapshot) {\r\n this.windowsSet.add(win);\r\n this.windows.push(new WeakRef(win));\r\n return;\r\n }\r\n callbackWrapper(() => {\r\n if (recordCanvas && sampling === 'all') {\r\n this.initCanvasMutationObserver(win, blockClass, blockSelector, unblockSelector);\r\n }\r\n if (recordCanvas && typeof sampling === 'number') {\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector, unblockSelector, true);\r\n this.restoreHandlers.push(() => {\r\n canvasContextReset();\r\n });\r\n }\r\n })();\r\n this.windowsSet.add(win);\r\n this.windows.push(new WeakRef(win));\r\n }\r\n addShadowRoot(shadowRoot) {\r\n this.shadowDoms.add(new WeakRef(shadowRoot));\r\n }\r\n resetShadowRoots() {\r\n this.shadowDoms = new Set();\r\n }\r\n initFPSWorker() {\r\n const worker = new Worker(t());\r\n worker.onmessage = (e) => {\r\n const data = e.data;\r\n const { id } = data;\r\n this.snapshotInProgressMap.set(id, false);\r\n if (!('base64' in data))\r\n return;\r\n const { base64, type, width, height } = data;\r\n this.mutationCb({\r\n id,\r\n type: CanvasContext['2D'],\r\n commands: [\r\n {\r\n property: 'clearRect',\r\n args: [0, 0, width, height],\r\n },\r\n {\r\n property: 'drawImage',\r\n args: [\r\n {\r\n rr_type: 'ImageBitmap',\r\n args: [\r\n {\r\n rr_type: 'Blob',\r\n data: [{ rr_type: 'ArrayBuffer', base64 }],\r\n type,\r\n },\r\n ],\r\n },\r\n 0,\r\n 0,\r\n width,\r\n height,\r\n ],\r\n },\r\n ],\r\n });\r\n };\r\n return worker;\r\n }\r\n initCanvasFPSObserver(fps, blockClass, blockSelector, unblockSelector, maxCanvasSize, options) {\r\n const rafId = this.takeSnapshot(false, fps, blockClass, blockSelector, unblockSelector, maxCanvasSize, options.dataURLOptions);\r\n this.restoreHandlers.push(() => {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n initCanvasMutationObserver(win, blockClass, blockSelector, unblockSelector) {\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector, unblockSelector, false);\r\n const canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, unblockSelector);\r\n const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, unblockSelector, this.mirror);\r\n this.restoreHandlers.push(() => {\r\n canvasContextReset();\r\n canvas2DReset();\r\n canvasWebGL1and2Reset();\r\n });\r\n }\r\n snapshot(canvasElement) {\r\n const { options } = this;\r\n const rafId = this.takeSnapshot(true, options.sampling === 'all' ? 2 : options.sampling || 2, options.blockClass, options.blockSelector, options.unblockSelector, options.maxCanvasSize, options.dataURLOptions, canvasElement);\r\n this.restoreHandlers.push(() => {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n takeSnapshot(isManualSnapshot, fps, blockClass, blockSelector, unblockSelector, maxCanvasSize, dataURLOptions, canvasElement) {\r\n const timeBetweenSnapshots = 1000 / fps;\r\n let lastSnapshotTime = 0;\r\n let rafId;\r\n const getCanvas = (canvasElement) => {\r\n if (canvasElement) {\r\n return [canvasElement];\r\n }\r\n const matchedCanvas = [];\r\n const searchCanvas = (root) => {\r\n root.querySelectorAll('canvas').forEach((canvas) => {\r\n if (!isBlocked(canvas, blockClass, blockSelector, unblockSelector, true)) {\r\n matchedCanvas.push(canvas);\r\n }\r\n });\r\n };\r\n for (const item of this.windows) {\r\n const window = item.deref();\r\n if (window) {\r\n searchCanvas(window.document);\r\n }\r\n }\r\n for (const item of this.shadowDoms) {\r\n const shadowRoot = item.deref();\r\n if (shadowRoot) {\r\n searchCanvas(shadowRoot);\r\n }\r\n }\r\n return matchedCanvas;\r\n };\r\n const takeCanvasSnapshots = (timestamp) => {\r\n if (!this.windows.length) {\r\n return;\r\n }\r\n if (lastSnapshotTime &&\r\n timestamp - lastSnapshotTime < timeBetweenSnapshots) {\r\n rafId = onRequestAnimationFrame(takeCanvasSnapshots);\r\n return;\r\n }\r\n lastSnapshotTime = timestamp;\r\n getCanvas(canvasElement).forEach((canvas) => {\r\n if (!this.mirror.hasNode(canvas)) {\r\n return;\r\n }\r\n const id = this.mirror.getId(canvas);\r\n if (this.snapshotInProgressMap.get(id))\r\n return;\r\n if (!canvas.width || !canvas.height)\r\n return;\r\n this.snapshotInProgressMap.set(id, true);\r\n if (!isManualSnapshot &&\r\n ['webgl', 'webgl2'].includes(canvas.__context)) {\r\n const context = canvas.getContext(canvas.__context);\r\n if (context?.getContextAttributes()?.preserveDrawingBuffer === false) {\r\n context.clear(context.COLOR_BUFFER_BIT);\r\n }\r\n }\r\n createImageBitmap(canvas)\r\n .then((bitmap) => {\r\n this.worker?.postMessage({\r\n id,\r\n bitmap,\r\n width: canvas.width,\r\n height: canvas.height,\r\n dataURLOptions,\r\n maxCanvasSize,\r\n }, [bitmap]);\r\n })\r\n .catch((error) => {\r\n callbackWrapper(() => {\r\n throw error;\r\n })();\r\n });\r\n });\r\n if (!isManualSnapshot) {\r\n rafId = onRequestAnimationFrame(takeCanvasSnapshots);\r\n }\r\n };\r\n rafId = onRequestAnimationFrame(takeCanvasSnapshots);\r\n return rafId;\r\n }\r\n startPendingCanvasMutationFlusher() {\r\n onRequestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n startRAFTimestamping() {\r\n const setLatestRAFTimestamp = (timestamp) => {\r\n this.rafStamps.latestId = timestamp;\r\n onRequestAnimationFrame(setLatestRAFTimestamp);\r\n };\r\n onRequestAnimationFrame(setLatestRAFTimestamp);\r\n }\r\n flushPendingCanvasMutations() {\r\n this.pendingCanvasMutations.forEach((values, canvas) => {\r\n const id = this.mirror.getId(canvas);\r\n this.flushPendingCanvasMutationFor(canvas, id);\r\n });\r\n onRequestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n flushPendingCanvasMutationFor(canvas, id) {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const valuesWithType = this.pendingCanvasMutations.get(canvas);\r\n if (!valuesWithType || id === -1)\r\n return;\r\n const values = valuesWithType.map((value) => {\r\n const { type, ...rest } = value;\r\n return rest;\r\n });\r\n const { type } = valuesWithType[0];\r\n this.mutationCb({ id, type, commands: values });\r\n this.pendingCanvasMutations.delete(canvas);\r\n }\r\n}\n\nexport { CanvasManager, CanvasManagerNoop };\n","import { stringifyRule } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { StyleSheetMirror } from '../utils.js';\n\nclass StylesheetManager {\r\n constructor(options) {\r\n this.trackedLinkElements = new WeakSet();\r\n this.styleMirror = new StyleSheetMirror();\r\n this.mutationCb = options.mutationCb;\r\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\r\n }\r\n attachLinkElement(linkEl, childSn) {\r\n if ('_cssText' in childSn.attributes)\r\n this.mutationCb({\r\n adds: [],\r\n removes: [],\r\n texts: [],\r\n attributes: [\r\n {\r\n id: childSn.id,\r\n attributes: childSn\r\n .attributes,\r\n },\r\n ],\r\n });\r\n this.trackLinkElement(linkEl);\r\n }\r\n trackLinkElement(linkEl) {\r\n if (this.trackedLinkElements.has(linkEl))\r\n return;\r\n this.trackedLinkElements.add(linkEl);\r\n this.trackStylesheetInLinkElement(linkEl);\r\n }\r\n adoptStyleSheets(sheets, hostId) {\r\n if (sheets.length === 0)\r\n return;\r\n const adoptedStyleSheetData = {\r\n id: hostId,\r\n styleIds: [],\r\n };\r\n const styles = [];\r\n for (const sheet of sheets) {\r\n let styleId;\r\n if (!this.styleMirror.has(sheet)) {\r\n styleId = this.styleMirror.add(sheet);\r\n styles.push({\r\n styleId,\r\n rules: Array.from(sheet.rules || CSSRule, (r, index) => ({\r\n rule: stringifyRule(r),\r\n index,\r\n })),\r\n });\r\n }\r\n else\r\n styleId = this.styleMirror.getId(sheet);\r\n adoptedStyleSheetData.styleIds.push(styleId);\r\n }\r\n if (styles.length > 0)\r\n adoptedStyleSheetData.styles = styles;\r\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\r\n }\r\n reset() {\r\n this.styleMirror.reset();\r\n this.trackedLinkElements = new WeakSet();\r\n }\r\n trackStylesheetInLinkElement(linkEl) {\r\n }\r\n}\n\nexport { StylesheetManager };\n","import { onRequestAnimationFrame } from '../utils.js';\n\nclass ProcessedNodeManager {\r\n constructor() {\r\n this.nodeMap = new WeakMap();\r\n this.active = false;\r\n }\r\n inOtherBuffer(node, thisBuffer) {\r\n const buffers = this.nodeMap.get(node);\r\n return (buffers && Array.from(buffers).some((buffer) => buffer !== thisBuffer));\r\n }\r\n add(node, buffer) {\r\n if (!this.active) {\r\n this.active = true;\r\n onRequestAnimationFrame(() => {\r\n this.nodeMap = new WeakMap();\r\n this.active = false;\r\n });\r\n }\r\n this.nodeMap.set(node, (this.nodeMap.get(node) || new Set()).add(buffer));\r\n }\r\n destroy() {\r\n }\r\n}\n\nexport { ProcessedNodeManager as default };\n","import { createMirror, snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { initObservers, mutationBuffers } from './observer.js';\nimport { polyfill, on, nowTimestamp, getWindowWidth, getWindowHeight, getWindowScroll, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/rrweb-types.js';\nimport { IframeManagerNoop, IframeManager } from './iframe-manager.js';\nimport { ShadowDomManagerNoop, ShadowDomManager } from './shadow-dom-manager.js';\nimport { CanvasManagerNoop } from './observers/canvas/canvas-manager.js';\nexport { CanvasManager } from './observers/canvas/canvas-manager.js';\nimport { StylesheetManager } from './stylesheet-manager.js';\nimport ProcessedNodeManager from './processed-node-manager.js';\nimport { callbackWrapper, unregisterErrorHandler, registerErrorHandler } from './error-handler.js';\n\nlet wrappedEmit;\r\nlet _wrappedEmit;\r\nlet _takeFullSnapshot;\r\ntry {\r\n if (Array.from([1], (x) => x * 2)[0] !== 2) {\r\n const cleanFrame = document.createElement('iframe');\r\n document.body.appendChild(cleanFrame);\r\n Array.from = cleanFrame.contentWindow?.Array.from || Array.from;\r\n document.body.removeChild(cleanFrame);\r\n }\r\n}\r\ncatch (err) {\r\n console.debug('Unable to override Array.from', err);\r\n}\r\nconst mirror = createMirror();\r\nfunction record(options = {}) {\r\n const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, unblockSelector = null, ignoreClass = 'rr-ignore', ignoreSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskAttributeFn, maskInputFn, maskTextFn, maxCanvasSize = null, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordDOM = true, recordCanvas = false, recordCrossOriginIframes = false, recordAfter = options.recordAfter === 'DOMContentLoaded'\r\n ? options.recordAfter\r\n : 'load', userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), errorHandler, onMutation, getCanvasManager, } = options;\r\n registerErrorHandler(errorHandler);\r\n const inEmittingFrame = recordCrossOriginIframes\r\n ? window.parent === window\r\n : true;\r\n let passEmitsToParent = false;\r\n if (!inEmittingFrame) {\r\n try {\r\n if (window.parent.document) {\r\n passEmitsToParent = false;\r\n }\r\n }\r\n catch (e) {\r\n passEmitsToParent = true;\r\n }\r\n }\r\n if (inEmittingFrame && !emit) {\r\n throw new Error('emit function is required');\r\n }\r\n if (!inEmittingFrame && !passEmitsToParent) {\r\n return () => {\r\n };\r\n }\r\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\r\n sampling.mousemove = mousemoveWait;\r\n }\r\n mirror.reset();\r\n const maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n radio: true,\r\n checkbox: true,\r\n }\r\n : _maskInputOptions !== undefined\r\n ? _maskInputOptions\r\n : {};\r\n const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\r\n ? {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaVerification: true,\r\n headMetaAuthorship: _slimDOMOptions === 'all',\r\n headMetaDescKeywords: _slimDOMOptions === 'all',\r\n }\r\n : _slimDOMOptions\r\n ? _slimDOMOptions\r\n : {};\r\n polyfill();\r\n let lastFullSnapshotEvent;\r\n let incrementalSnapshotCount = 0;\r\n const eventProcessor = (e) => {\r\n for (const plugin of plugins || []) {\r\n if (plugin.eventProcessor) {\r\n e = plugin.eventProcessor(e);\r\n }\r\n }\r\n if (packFn &&\r\n !passEmitsToParent) {\r\n e = packFn(e);\r\n }\r\n return e;\r\n };\r\n wrappedEmit = (r, isCheckout) => {\r\n const e = r;\r\n e.timestamp = nowTimestamp();\r\n if (mutationBuffers[0]?.isFrozen() &&\r\n e.type !== EventType.FullSnapshot &&\r\n !(e.type === EventType.IncrementalSnapshot &&\r\n e.data.source === IncrementalSource.Mutation)) {\r\n mutationBuffers.forEach((buf) => buf.unfreeze());\r\n }\r\n if (inEmittingFrame) {\r\n emit?.(eventProcessor(e), isCheckout);\r\n }\r\n else if (passEmitsToParent) {\r\n const message = {\r\n type: 'rrweb',\r\n event: eventProcessor(e),\r\n origin: window.location.origin,\r\n isCheckout,\r\n };\r\n window.parent.postMessage(message, '*');\r\n }\r\n if (e.type === EventType.FullSnapshot) {\r\n lastFullSnapshotEvent = e;\r\n incrementalSnapshotCount = 0;\r\n }\r\n else if (e.type === EventType.IncrementalSnapshot) {\r\n if (e.data.source === IncrementalSource.Mutation &&\r\n e.data.isAttachIframe) {\r\n return;\r\n }\r\n incrementalSnapshotCount++;\r\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\r\n const exceedTime = checkoutEveryNms &&\r\n lastFullSnapshotEvent &&\r\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\r\n if (exceedCount || exceedTime) {\r\n takeFullSnapshot(true);\r\n }\r\n }\r\n };\r\n _wrappedEmit = wrappedEmit;\r\n const wrappedMutationEmit = (m) => {\r\n wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Mutation,\r\n ...m,\r\n },\r\n });\r\n };\r\n const wrappedScrollEmit = (p) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Scroll,\r\n ...p,\r\n },\r\n });\r\n const wrappedCanvasMutationEmit = (p) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.CanvasMutation,\r\n ...p,\r\n },\r\n });\r\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.AdoptedStyleSheet,\r\n ...a,\r\n },\r\n });\r\n const stylesheetManager = new StylesheetManager({\r\n mutationCb: wrappedMutationEmit,\r\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit,\r\n });\r\n const iframeManager = typeof __RRWEB_EXCLUDE_IFRAME__ === 'boolean' && __RRWEB_EXCLUDE_IFRAME__\r\n ? new IframeManagerNoop()\r\n : new IframeManager({\r\n mirror,\r\n mutationCb: wrappedMutationEmit,\r\n stylesheetManager: stylesheetManager,\r\n recordCrossOriginIframes,\r\n wrappedEmit,\r\n });\r\n for (const plugin of plugins || []) {\r\n if (plugin.getMirror)\r\n plugin.getMirror({\r\n nodeMirror: mirror,\r\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\r\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,\r\n });\r\n }\r\n const processedNodeManager = new ProcessedNodeManager();\r\n const canvasManager = _getCanvasManager(getCanvasManager, {\r\n mirror,\r\n win: window,\r\n mutationCb: (p) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.CanvasMutation,\r\n ...p,\r\n },\r\n }),\r\n recordCanvas,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maxCanvasSize,\r\n sampling: sampling['canvas'],\r\n dataURLOptions,\r\n errorHandler,\r\n });\r\n const shadowDomManager = typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === 'boolean' &&\r\n __RRWEB_EXCLUDE_SHADOW_DOM__\r\n ? new ShadowDomManagerNoop()\r\n : new ShadowDomManager({\r\n mutationCb: wrappedMutationEmit,\r\n scrollCb: wrappedScrollEmit,\r\n bypassOptions: {\r\n onMutation,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n dataURLOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n recordCanvas,\r\n inlineImages,\r\n sampling,\r\n slimDOMOptions,\r\n iframeManager,\r\n stylesheetManager,\r\n canvasManager,\r\n keepIframeSrcFn,\r\n processedNodeManager,\r\n },\r\n mirror,\r\n });\r\n const takeFullSnapshot = (isCheckout = false) => {\r\n if (!recordDOM) {\r\n return;\r\n }\r\n wrappedEmit({\r\n type: EventType.Meta,\r\n data: {\r\n href: window.location.href,\r\n width: getWindowWidth(),\r\n height: getWindowHeight(),\r\n },\r\n }, isCheckout);\r\n stylesheetManager.reset();\r\n shadowDomManager.init();\r\n mutationBuffers.forEach((buf) => buf.lock());\r\n const node = snapshot(document, {\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n inlineStylesheet,\r\n maskAllInputs: maskInputOptions,\r\n maskAttributeFn,\r\n maskInputFn,\r\n maskTextFn,\r\n slimDOM: slimDOMOptions,\r\n dataURLOptions,\r\n recordCanvas,\r\n inlineImages,\r\n onSerialize: (n) => {\r\n if (isSerializedIframe(n, mirror)) {\r\n iframeManager.addIframe(n);\r\n }\r\n if (isSerializedStylesheet(n, mirror)) {\r\n stylesheetManager.trackLinkElement(n);\r\n }\r\n if (hasShadowRoot(n)) {\r\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n iframeManager.attachIframe(iframe, childSn);\r\n if (iframe.contentWindow) {\r\n canvasManager.addWindow(iframe.contentWindow);\r\n }\r\n shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (linkEl, childSn) => {\r\n stylesheetManager.attachLinkElement(linkEl, childSn);\r\n },\r\n keepIframeSrcFn,\r\n });\r\n if (!node) {\r\n return console.warn('Failed to snapshot the document');\r\n }\r\n wrappedEmit({\r\n type: EventType.FullSnapshot,\r\n data: {\r\n node,\r\n initialOffset: getWindowScroll(window),\r\n },\r\n });\r\n mutationBuffers.forEach((buf) => buf.unlock());\r\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\r\n stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));\r\n };\r\n _takeFullSnapshot = takeFullSnapshot;\r\n try {\r\n const handlers = [];\r\n const observe = (doc) => {\r\n return callbackWrapper(initObservers)({\r\n onMutation,\r\n mutationCb: wrappedMutationEmit,\r\n mousemoveCb: (positions, source) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source,\r\n positions,\r\n },\r\n }),\r\n mouseInteractionCb: (d) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.MouseInteraction,\r\n ...d,\r\n },\r\n }),\r\n scrollCb: wrappedScrollEmit,\r\n viewportResizeCb: (d) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.ViewportResize,\r\n ...d,\r\n },\r\n }),\r\n inputCb: (v) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Input,\r\n ...v,\r\n },\r\n }),\r\n mediaInteractionCb: (p) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.MediaInteraction,\r\n ...p,\r\n },\r\n }),\r\n styleSheetRuleCb: (r) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.StyleSheetRule,\r\n ...r,\r\n },\r\n }),\r\n styleDeclarationCb: (r) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.StyleDeclaration,\r\n ...r,\r\n },\r\n }),\r\n canvasMutationCb: wrappedCanvasMutationEmit,\r\n fontCb: (p) => wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Font,\r\n ...p,\r\n },\r\n }),\r\n selectionCb: (p) => {\r\n wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Selection,\r\n ...p,\r\n },\r\n });\r\n },\r\n customElementCb: (c) => {\r\n wrappedEmit({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.CustomElement,\r\n ...c,\r\n },\r\n });\r\n },\r\n blockClass,\r\n ignoreClass,\r\n ignoreSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n maskInputOptions,\r\n inlineStylesheet,\r\n sampling,\r\n recordDOM,\r\n recordCanvas,\r\n inlineImages,\r\n userTriggeredOnInput,\r\n collectFonts,\r\n doc,\r\n maskAttributeFn,\r\n maskInputFn,\r\n maskTextFn,\r\n keepIframeSrcFn,\r\n blockSelector,\r\n unblockSelector,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n mirror,\r\n iframeManager,\r\n stylesheetManager,\r\n shadowDomManager,\r\n processedNodeManager,\r\n canvasManager,\r\n ignoreCSSAttributes,\r\n plugins: plugins\r\n ?.filter((p) => p.observer)\r\n ?.map((p) => ({\r\n observer: p.observer,\r\n options: p.options,\r\n callback: (payload) => wrappedEmit({\r\n type: EventType.Plugin,\r\n data: {\r\n plugin: p.name,\r\n payload,\r\n },\r\n }),\r\n })) || [],\r\n }, {});\r\n };\r\n iframeManager.addLoadListener((iframeEl) => {\r\n try {\r\n handlers.push(observe(iframeEl.contentDocument));\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n }\r\n });\r\n const init = () => {\r\n takeFullSnapshot();\r\n handlers.push(observe(document));\r\n };\r\n if (document.readyState === 'interactive' ||\r\n document.readyState === 'complete') {\r\n init();\r\n }\r\n else {\r\n handlers.push(on('DOMContentLoaded', () => {\r\n wrappedEmit({\r\n type: EventType.DomContentLoaded,\r\n data: {},\r\n });\r\n if (recordAfter === 'DOMContentLoaded')\r\n init();\r\n }));\r\n handlers.push(on('load', () => {\r\n wrappedEmit({\r\n type: EventType.Load,\r\n data: {},\r\n });\r\n if (recordAfter === 'load')\r\n init();\r\n }, window));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n processedNodeManager.destroy();\r\n _takeFullSnapshot = undefined;\r\n unregisterErrorHandler();\r\n };\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n }\r\n}\r\nfunction addCustomEvent(tag, payload) {\r\n if (!_wrappedEmit) {\r\n throw new Error('please add custom event after start recording');\r\n }\r\n wrappedEmit({\r\n type: EventType.Custom,\r\n data: {\r\n tag,\r\n payload,\r\n },\r\n });\r\n}\r\nfunction freezePage() {\r\n mutationBuffers.forEach((buf) => buf.freeze());\r\n}\r\nfunction takeFullSnapshot(isCheckout) {\r\n if (!_takeFullSnapshot) {\r\n throw new Error('please take full snapshot after start recording');\r\n }\r\n _takeFullSnapshot(isCheckout);\r\n}\r\nrecord.mirror = mirror;\r\nrecord.takeFullSnapshot = takeFullSnapshot;\r\nfunction _getCanvasManager(getCanvasManagerFn, options) {\r\n try {\r\n return getCanvasManagerFn\r\n ? getCanvasManagerFn(options)\r\n : new CanvasManagerNoop();\r\n }\r\n catch {\r\n console.warn('Unable to initialize CanvasManager');\r\n return new CanvasManagerNoop();\r\n }\r\n}\n\nexport { addCustomEvent, record as default, freezePage, takeFullSnapshot };\n","/**\n * Converts a timestamp to ms, if it was in s, or keeps it as ms.\n */\nexport function timestampToMs(timestamp: number): number {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp : timestamp * 1000;\n}\n\n/**\n * Converts a timestamp to s, if it was in ms, or keeps it as s.\n */\nexport function timestampToS(timestamp: number): number {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp / 1000 : timestamp;\n}\n","import { EventType } from '@sentry-internal/rrweb';\nimport { normalize } from '@sentry/core';\nimport type { Breadcrumb } from '@sentry/core';\n\nimport type { ReplayContainer } from '../../types';\n\n/**\n * Add a breadcrumb event to replay.\n */\nexport function addBreadcrumbEvent(replay: ReplayContainer, breadcrumb: Breadcrumb): void {\n if (breadcrumb.category === 'sentry.transaction') {\n return;\n }\n\n if (['ui.click', 'ui.input'].includes(breadcrumb.category as string)) {\n replay.triggerUserActivity();\n } else {\n replay.checkAndHandleExpiredSession();\n }\n\n replay.addUpdate(() => {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.throttledAddEvent({\n type: EventType.Custom,\n // TODO: We were converting from ms to seconds for breadcrumbs, spans,\n // but maybe we should just keep them as milliseconds\n timestamp: (breadcrumb.timestamp || 0) * 1000,\n data: {\n tag: 'breadcrumb',\n // normalize to max. 10 depth and 1_000 properties per object\n payload: normalize(breadcrumb, 10, 1_000),\n },\n });\n\n // Do not flush after console log messages\n return breadcrumb.category === 'console';\n });\n}\n","import type { INode } from '@sentry-internal/rrweb-snapshot';\n\nconst INTERACTIVE_SELECTOR = 'button,a';\n\n/** Get the closest interactive parent element, or else return the given element. */\nexport function getClosestInteractive(element: Element): Element {\n const closestInteractive = element.closest(INTERACTIVE_SELECTOR);\n return closestInteractive || element;\n}\n\n/**\n * For clicks, we check if the target is inside of a button or link\n * If so, we use this as the target instead\n * This is useful because if you click on the image in <button><img></button>,\n * The target will be the image, not the button, which we don't want here\n */\nexport function getClickTargetNode(event: Event | MouseEvent | Node): Node | INode | null {\n const target = getTargetNode(event);\n\n if (!target || !(target instanceof Element)) {\n return target;\n }\n\n return getClosestInteractive(target);\n}\n\n/** Get the event target node. */\nexport function getTargetNode(event: Node | { target: EventTarget | null }): Node | INode | null {\n if (isEventWithTarget(event)) {\n return event.target as Node | null;\n }\n\n return event;\n}\n\nfunction isEventWithTarget(event: unknown): event is { target: EventTarget | null } {\n return typeof event === 'object' && !!event && 'target' in event;\n}\n","import { fill } from '@sentry/core';\n\nimport { WINDOW } from '../../constants';\n\ntype WindowOpenHandler = () => void;\n\nlet handlers: undefined | WindowOpenHandler[];\n\n/**\n * Register a handler to be called when `window.open()` is called.\n * Returns a cleanup function.\n */\nexport function onWindowOpen(cb: WindowOpenHandler): () => void {\n // Ensure to only register this once\n if (!handlers) {\n handlers = [];\n monkeyPatchWindowOpen();\n }\n\n handlers.push(cb);\n\n return () => {\n const pos = handlers ? handlers.indexOf(cb) : -1;\n if (pos > -1) {\n (handlers as WindowOpenHandler[]).splice(pos, 1);\n }\n };\n}\n\nfunction monkeyPatchWindowOpen(): void {\n fill(WINDOW, 'open', function (originalWindowOpen: () => void): () => void {\n return function (...args: unknown[]): void {\n if (handlers) {\n try {\n handlers.forEach(handler => handler());\n } catch (e) {\n // ignore errors in here\n }\n }\n\n return originalWindowOpen.apply(WINDOW, args);\n };\n });\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\nimport { IncrementalSource, MouseInteractions, record } from '@sentry-internal/rrweb';\nimport type { Breadcrumb } from '@sentry/core';\n\nimport { WINDOW } from '../constants';\nimport type {\n RecordingEvent,\n ReplayClickDetector,\n ReplayContainer,\n ReplayMultiClickFrame,\n ReplaySlowClickFrame,\n SlowClickConfig,\n} from '../types';\nimport { ReplayEventTypeIncrementalSnapshot } from '../types';\nimport { timestampToS } from '../util/timestamp';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\nimport { getClosestInteractive } from './util/domUtils';\nimport { onWindowOpen } from './util/onWindowOpen';\n\ntype ClickBreadcrumb = Breadcrumb & {\n timestamp: number;\n};\n\ninterface Click {\n timestamp: number;\n mutationAfter?: number;\n scrollAfter?: number;\n clickBreadcrumb: ClickBreadcrumb;\n clickCount: number;\n node: HTMLElement;\n}\n\ntype IncrementalRecordingEvent = RecordingEvent & {\n type: typeof ReplayEventTypeIncrementalSnapshot;\n data: { source: IncrementalSource };\n};\n\ntype IncrementalMouseInteractionRecordingEvent = IncrementalRecordingEvent & {\n type: typeof ReplayEventTypeIncrementalSnapshot;\n data: { type: MouseInteractions; id: number };\n};\n\n/** Any IncrementalSource for rrweb that we interpret as a kind of mutation. */\nconst IncrementalMutationSources = new Set([\n IncrementalSource.Mutation,\n IncrementalSource.StyleSheetRule,\n IncrementalSource.StyleDeclaration,\n IncrementalSource.AdoptedStyleSheet,\n IncrementalSource.CanvasMutation,\n IncrementalSource.Selection,\n IncrementalSource.MediaInteraction,\n]);\n\n/** Handle a click. */\nexport function handleClick(clickDetector: ReplayClickDetector, clickBreadcrumb: Breadcrumb, node: HTMLElement): void {\n clickDetector.handleClick(clickBreadcrumb, node);\n}\n\n/** A click detector class that can be used to detect slow or rage clicks on elements. */\nexport class ClickDetector implements ReplayClickDetector {\n // protected for testing\n protected _lastMutation: number;\n protected _lastScroll: number;\n\n private _clicks: Click[];\n private _teardown: undefined | (() => void);\n\n private _threshold: number;\n private _scrollTimeout: number;\n private _timeout: number;\n private _ignoreSelector: string;\n\n private _replay: ReplayContainer;\n private _checkClickTimeout?: ReturnType<typeof setTimeout>;\n private _addBreadcrumbEvent: typeof addBreadcrumbEvent;\n\n public constructor(\n replay: ReplayContainer,\n slowClickConfig: SlowClickConfig,\n // Just for easier testing\n _addBreadcrumbEvent = addBreadcrumbEvent,\n ) {\n this._lastMutation = 0;\n this._lastScroll = 0;\n this._clicks = [];\n\n // We want everything in s, but options are in ms\n this._timeout = slowClickConfig.timeout / 1000;\n this._threshold = slowClickConfig.threshold / 1000;\n this._scrollTimeout = slowClickConfig.scrollTimeout / 1000;\n this._replay = replay;\n this._ignoreSelector = slowClickConfig.ignoreSelector;\n this._addBreadcrumbEvent = _addBreadcrumbEvent;\n }\n\n /** Register click detection handlers on mutation or scroll. */\n public addListeners(): void {\n const cleanupWindowOpen = onWindowOpen(() => {\n // Treat window.open as mutation\n this._lastMutation = nowInSeconds();\n });\n\n this._teardown = () => {\n cleanupWindowOpen();\n\n this._clicks = [];\n this._lastMutation = 0;\n this._lastScroll = 0;\n };\n }\n\n /** Clean up listeners. */\n public removeListeners(): void {\n if (this._teardown) {\n this._teardown();\n }\n\n if (this._checkClickTimeout) {\n clearTimeout(this._checkClickTimeout);\n }\n }\n\n /** @inheritDoc */\n public handleClick(breadcrumb: Breadcrumb, node: HTMLElement): void {\n if (ignoreElement(node, this._ignoreSelector) || !isClickBreadcrumb(breadcrumb)) {\n return;\n }\n\n const newClick: Click = {\n timestamp: timestampToS(breadcrumb.timestamp),\n clickBreadcrumb: breadcrumb,\n // Set this to 0 so we know it originates from the click breadcrumb\n clickCount: 0,\n node,\n };\n\n // If there was a click in the last 1s on the same element, ignore it - only keep a single reference per second\n if (\n this._clicks.some(click => click.node === newClick.node && Math.abs(click.timestamp - newClick.timestamp) < 1)\n ) {\n return;\n }\n\n this._clicks.push(newClick);\n\n // If this is the first new click, set a timeout to check for multi clicks\n if (this._clicks.length === 1) {\n this._scheduleCheckClicks();\n }\n }\n\n /** @inheritDoc */\n public registerMutation(timestamp = Date.now()): void {\n this._lastMutation = timestampToS(timestamp);\n }\n\n /** @inheritDoc */\n public registerScroll(timestamp = Date.now()): void {\n this._lastScroll = timestampToS(timestamp);\n }\n\n /** @inheritDoc */\n public registerClick(element: HTMLElement): void {\n const node = getClosestInteractive(element);\n this._handleMultiClick(node as HTMLElement);\n }\n\n /** Count multiple clicks on elements. */\n private _handleMultiClick(node: HTMLElement): void {\n this._getClicks(node).forEach(click => {\n click.clickCount++;\n });\n }\n\n /** Get all pending clicks for a given node. */\n private _getClicks(node: HTMLElement): Click[] {\n return this._clicks.filter(click => click.node === node);\n }\n\n /** Check the clicks that happened. */\n private _checkClicks(): void {\n const timedOutClicks: Click[] = [];\n\n const now = nowInSeconds();\n\n this._clicks.forEach(click => {\n if (!click.mutationAfter && this._lastMutation) {\n click.mutationAfter = click.timestamp <= this._lastMutation ? this._lastMutation - click.timestamp : undefined;\n }\n if (!click.scrollAfter && this._lastScroll) {\n click.scrollAfter = click.timestamp <= this._lastScroll ? this._lastScroll - click.timestamp : undefined;\n }\n\n // All of these are in seconds!\n if (click.timestamp + this._timeout <= now) {\n timedOutClicks.push(click);\n }\n });\n\n // Remove \"old\" clicks\n for (const click of timedOutClicks) {\n const pos = this._clicks.indexOf(click);\n\n if (pos > -1) {\n this._generateBreadcrumbs(click);\n this._clicks.splice(pos, 1);\n }\n }\n\n // Trigger new check, unless no clicks left\n if (this._clicks.length) {\n this._scheduleCheckClicks();\n }\n }\n\n /** Generate matching breadcrumb(s) for the click. */\n private _generateBreadcrumbs(click: Click): void {\n const replay = this._replay;\n const hadScroll = click.scrollAfter && click.scrollAfter <= this._scrollTimeout;\n const hadMutation = click.mutationAfter && click.mutationAfter <= this._threshold;\n\n const isSlowClick = !hadScroll && !hadMutation;\n const { clickCount, clickBreadcrumb } = click;\n\n // Slow click\n if (isSlowClick) {\n // If `mutationAfter` is set, it means a mutation happened after the threshold, but before the timeout\n // If not, it means we just timed out without scroll & mutation\n const timeAfterClickMs = Math.min(click.mutationAfter || this._timeout, this._timeout) * 1000;\n const endReason = timeAfterClickMs < this._timeout * 1000 ? 'mutation' : 'timeout';\n\n const breadcrumb: ReplaySlowClickFrame = {\n type: 'default',\n message: clickBreadcrumb.message,\n timestamp: clickBreadcrumb.timestamp,\n category: 'ui.slowClickDetected',\n data: {\n ...clickBreadcrumb.data,\n url: WINDOW.location.href,\n route: replay.getCurrentRoute(),\n timeAfterClickMs,\n endReason,\n // If clickCount === 0, it means multiClick was not correctly captured here\n // - we still want to send 1 in this case\n clickCount: clickCount || 1,\n },\n };\n\n this._addBreadcrumbEvent(replay, breadcrumb);\n return;\n }\n\n // Multi click\n if (clickCount > 1) {\n const breadcrumb: ReplayMultiClickFrame = {\n type: 'default',\n message: clickBreadcrumb.message,\n timestamp: clickBreadcrumb.timestamp,\n category: 'ui.multiClick',\n data: {\n ...clickBreadcrumb.data,\n url: WINDOW.location.href,\n route: replay.getCurrentRoute(),\n clickCount,\n metric: true,\n },\n };\n\n this._addBreadcrumbEvent(replay, breadcrumb);\n }\n }\n\n /** Schedule to check current clicks. */\n private _scheduleCheckClicks(): void {\n if (this._checkClickTimeout) {\n clearTimeout(this._checkClickTimeout);\n }\n\n this._checkClickTimeout = setTimeout(() => this._checkClicks(), 1000);\n }\n}\n\nconst SLOW_CLICK_TAGS = ['A', 'BUTTON', 'INPUT'];\n\n/** exported for tests only */\nexport function ignoreElement(node: HTMLElement, ignoreSelector: string): boolean {\n if (!SLOW_CLICK_TAGS.includes(node.tagName)) {\n return true;\n }\n\n // If <input> tag, we only want to consider input[type='submit'] & input[type='button']\n if (node.tagName === 'INPUT' && !['submit', 'button'].includes(node.getAttribute('type') || '')) {\n return true;\n }\n\n // If <a> tag, detect special variants that may not lead to an action\n // If target !== _self, we may open the link somewhere else, which would lead to no action\n // Also, when downloading a file, we may not leave the page, but still not trigger an action\n if (\n node.tagName === 'A' &&\n (node.hasAttribute('download') || (node.hasAttribute('target') && node.getAttribute('target') !== '_self'))\n ) {\n return true;\n }\n\n if (ignoreSelector && node.matches(ignoreSelector)) {\n return true;\n }\n\n return false;\n}\n\nfunction isClickBreadcrumb(breadcrumb: Breadcrumb): breadcrumb is ClickBreadcrumb {\n return !!(breadcrumb.data && typeof breadcrumb.data.nodeId === 'number' && breadcrumb.timestamp);\n}\n\n// This is good enough for us, and is easier to test/mock than `timestampInSeconds`\nfunction nowInSeconds(): number {\n return Date.now() / 1000;\n}\n\n/** Update the click detector based on a recording event of rrweb. */\nexport function updateClickDetectorForRecordingEvent(clickDetector: ReplayClickDetector, event: RecordingEvent): void {\n try {\n // note: We only consider incremental snapshots here\n // This means that any full snapshot is ignored for mutation detection - the reason is that we simply cannot know if a mutation happened here.\n // E.g. think that we are buffering, an error happens and we take a full snapshot because we switched to session mode -\n // in this scenario, we would not know if a dead click happened because of the error, which is a key dead click scenario.\n // Instead, by ignoring full snapshots, we have the risk that we generate a false positive\n // (if a mutation _did_ happen but was \"swallowed\" by the full snapshot)\n // But this should be more unlikely as we'd generally capture the incremental snapshot right away\n\n if (!isIncrementalEvent(event)) {\n return;\n }\n\n const { source } = event.data;\n if (IncrementalMutationSources.has(source)) {\n clickDetector.registerMutation(event.timestamp);\n }\n\n if (source === IncrementalSource.Scroll) {\n clickDetector.registerScroll(event.timestamp);\n }\n\n if (isIncrementalMouseInteraction(event)) {\n const { type, id } = event.data;\n const node = record.mirror.getNode(id);\n\n if (node instanceof HTMLElement && type === MouseInteractions.Click) {\n clickDetector.registerClick(node);\n }\n }\n } catch {\n // ignore errors here, e.g. if accessing something that does not exist\n }\n}\n\nfunction isIncrementalEvent(event: RecordingEvent): event is IncrementalRecordingEvent {\n return event.type === ReplayEventTypeIncrementalSnapshot;\n}\n\nfunction isIncrementalMouseInteraction(\n event: IncrementalRecordingEvent,\n): event is IncrementalMouseInteractionRecordingEvent {\n return event.data.source === IncrementalSource.MouseInteraction;\n}\n","type ClassOption = string | RegExp;\n\n/** Duplicate this from @sentry-internal/rrweb so we can export this as well. */\nexport const ReplayEventTypeDomContentLoaded = 0;\nexport const ReplayEventTypeLoad = 1;\nexport const ReplayEventTypeFullSnapshot = 2;\nexport const ReplayEventTypeIncrementalSnapshot = 3;\nexport const ReplayEventTypeMeta = 4;\nexport const ReplayEventTypeCustom = 5;\nexport const ReplayEventTypePlugin = 6;\n\nexport type ReplayEventType =\n | typeof ReplayEventTypeDomContentLoaded\n | typeof ReplayEventTypeLoad\n | typeof ReplayEventTypeFullSnapshot\n | typeof ReplayEventTypeIncrementalSnapshot\n | typeof ReplayEventTypeMeta\n | typeof ReplayEventTypeCustom\n | typeof ReplayEventTypePlugin;\n\n/**\n * This is a partial copy of rrweb's eventWithTime type which only contains the properties\n * we specifically need in the SDK.\n */\nexport type ReplayEventWithTime = {\n type: ReplayEventType;\n data: unknown;\n timestamp: number;\n delay?: number;\n};\n\n/**\n * This is a partial copy of rrweb's recording options which only contains the properties\n * we specifically use in the SDK. Users can specify additional properties, hence we add the\n * Record<string, unknown> union type.\n */\nexport type RrwebRecordOptions = {\n maskAllText?: boolean;\n maskAllInputs?: boolean;\n blockClass?: ClassOption;\n ignoreClass?: string;\n maskTextClass?: ClassOption;\n maskTextSelector?: string;\n blockSelector?: string;\n maskInputOptions?: Record<string, boolean>;\n} & Record<string, unknown>;\n\nexport interface CanvasManagerInterface {\n reset(): void;\n freeze(): void;\n unfreeze(): void;\n lock(): void;\n unlock(): void;\n snapshot(): void;\n addWindow(win: typeof globalThis & Window): void;\n addShadowRoot(shadowRoot: ShadowRoot): void;\n resetShadowRoots(): void;\n}\n\nexport interface CanvasManagerOptions {\n recordCanvas: boolean;\n enableManualSnapshot?: boolean;\n blockClass: string | RegExp;\n blockSelector: string | null;\n unblockSelector: string | null;\n sampling?: 'all' | number;\n dataURLOptions: Partial<{\n type: string;\n quality: number;\n }>;\n mutationCb: (p: any) => void;\n win: typeof globalThis & Window;\n mirror: any;\n}\n","import type { ReplayBreadcrumbFrame } from '../types/replayFrame';\n\n/**\n * Create a breadcrumb for a replay.\n */\nexport function createBreadcrumb(\n breadcrumb: Omit<ReplayBreadcrumbFrame, 'timestamp' | 'type'> & Partial<Pick<ReplayBreadcrumbFrame, 'timestamp'>>,\n): ReplayBreadcrumbFrame {\n return {\n timestamp: Date.now() / 1000,\n type: 'default',\n ...breadcrumb,\n };\n}\n","var NodeType;\r\n(function (NodeType) {\r\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\r\n return n.nodeType === n.ELEMENT_NODE;\r\n}\r\nfunction isShadowRoot(n) {\r\n const host = n?.host;\r\n return Boolean(host?.shadowRoot === n);\r\n}\r\nfunction isNativeShadowDom(shadowRoot) {\r\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\r\n}\r\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\r\n if (cssText.includes(' background-clip: text;') &&\r\n !cssText.includes(' -webkit-background-clip: text;')) {\r\n cssText = cssText.replace(/\\sbackground-clip:\\s*text;/g, ' -webkit-background-clip: text; background-clip: text;');\r\n }\r\n return cssText;\r\n}\r\nfunction escapeImportStatement(rule) {\r\n const { cssText } = rule;\r\n if (cssText.split('\"').length < 3)\r\n return cssText;\r\n const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\r\n if (rule.layerName === '') {\r\n statement.push(`layer`);\r\n }\r\n else if (rule.layerName) {\r\n statement.push(`layer(${rule.layerName})`);\r\n }\r\n if (rule.supportsText) {\r\n statement.push(`supports(${rule.supportsText})`);\r\n }\r\n if (rule.media.length) {\r\n statement.push(rule.media.mediaText);\r\n }\r\n return statement.join(' ') + ';';\r\n}\r\nfunction stringifyStylesheet(s) {\r\n try {\r\n const rules = s.rules || s.cssRules;\r\n return rules\r\n ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules, stringifyRule).join(''))\r\n : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n}\r\nfunction stringifyRule(rule) {\r\n let importStringified;\r\n if (isCSSImportRule(rule)) {\r\n try {\r\n importStringified =\r\n stringifyStylesheet(rule.styleSheet) ||\r\n escapeImportStatement(rule);\r\n }\r\n catch (error) {\r\n }\r\n }\r\n else if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {\r\n return fixSafariColons(rule.cssText);\r\n }\r\n return importStringified || rule.cssText;\r\n}\r\nfunction fixSafariColons(cssStringified) {\r\n const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\r\n return cssStringified.replace(regex, '$1\\\\$2');\r\n}\r\nfunction isCSSImportRule(rule) {\r\n return 'styleSheet' in rule;\r\n}\r\nfunction isCSSStyleRule(rule) {\r\n return 'selectorText' in rule;\r\n}\r\nclass Mirror {\r\n constructor() {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n }\r\n getId(n) {\r\n if (!n)\r\n return -1;\r\n const id = this.getMeta(n)?.id;\r\n return id ?? -1;\r\n }\r\n getNode(id) {\r\n return this.idNodeMap.get(id) || null;\r\n }\r\n getIds() {\r\n return Array.from(this.idNodeMap.keys());\r\n }\r\n getMeta(n) {\r\n return this.nodeMetaMap.get(n) || null;\r\n }\r\n removeNodeFromMap(n) {\r\n const id = this.getId(n);\r\n this.idNodeMap.delete(id);\r\n if (n.childNodes) {\r\n n.childNodes.forEach((childNode) => this.removeNodeFromMap(childNode));\r\n }\r\n }\r\n has(id) {\r\n return this.idNodeMap.has(id);\r\n }\r\n hasNode(node) {\r\n return this.nodeMetaMap.has(node);\r\n }\r\n add(n, meta) {\r\n const id = meta.id;\r\n this.idNodeMap.set(id, n);\r\n this.nodeMetaMap.set(n, meta);\r\n }\r\n replace(id, n) {\r\n const oldNode = this.getNode(id);\r\n if (oldNode) {\r\n const meta = this.nodeMetaMap.get(oldNode);\r\n if (meta)\r\n this.nodeMetaMap.set(n, meta);\r\n }\r\n this.idNodeMap.set(id, n);\r\n }\r\n reset() {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n }\r\n}\r\nfunction createMirror() {\r\n return new Mirror();\r\n}\r\nfunction shouldMaskInput({ maskInputOptions, tagName, type, }) {\r\n if (tagName === 'OPTION') {\r\n tagName = 'SELECT';\r\n }\r\n return Boolean(maskInputOptions[tagName.toLowerCase()] ||\r\n (type && maskInputOptions[type]) ||\r\n type === 'password' ||\r\n (tagName === 'INPUT' && !type && maskInputOptions['text']));\r\n}\r\nfunction maskInputValue({ isMasked, element, value, maskInputFn, }) {\r\n let text = value || '';\r\n if (!isMasked) {\r\n return text;\r\n }\r\n if (maskInputFn) {\r\n text = maskInputFn(text, element);\r\n }\r\n return '*'.repeat(text.length);\r\n}\r\nfunction toLowerCase(str) {\r\n return str.toLowerCase();\r\n}\r\nfunction toUpperCase(str) {\r\n return str.toUpperCase();\r\n}\r\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\r\nfunction is2DCanvasBlank(canvas) {\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx)\r\n return true;\r\n const chunkSize = 50;\r\n for (let x = 0; x < canvas.width; x += chunkSize) {\r\n for (let y = 0; y < canvas.height; y += chunkSize) {\r\n const getImageData = ctx.getImageData;\r\n const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\r\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\r\n : getImageData;\r\n const pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\r\n if (pixelBuffer.some((pixel) => pixel !== 0))\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isNodeMetaEqual(a, b) {\r\n if (!a || !b || a.type !== b.type)\r\n return false;\r\n if (a.type === NodeType.Document)\r\n return a.compatMode === b.compatMode;\r\n else if (a.type === NodeType.DocumentType)\r\n return (a.name === b.name &&\r\n a.publicId === b.publicId &&\r\n a.systemId === b.systemId);\r\n else if (a.type === NodeType.Comment ||\r\n a.type === NodeType.Text ||\r\n a.type === NodeType.CDATA)\r\n return a.textContent === b.textContent;\r\n else if (a.type === NodeType.Element)\r\n return (a.tagName === b.tagName &&\r\n JSON.stringify(a.attributes) ===\r\n JSON.stringify(b.attributes) &&\r\n a.isSVG === b.isSVG &&\r\n a.needBlock === b.needBlock);\r\n return false;\r\n}\r\nfunction getInputType(element) {\r\n const type = element.type;\r\n return element.hasAttribute('data-rr-is-password')\r\n ? 'password'\r\n : type\r\n ?\r\n toLowerCase(type)\r\n : null;\r\n}\r\nfunction getInputValue(el, tagName, type) {\r\n if (tagName === 'INPUT' && (type === 'radio' || type === 'checkbox')) {\r\n return el.getAttribute('value') || '';\r\n }\r\n return el.value;\r\n}\r\nfunction extractFileExtension(path, baseURL) {\r\n let url;\r\n try {\r\n url = new URL(path, baseURL ?? window.location.href);\r\n }\r\n catch (err) {\r\n return null;\r\n }\r\n const regex = /\\.([0-9a-z]+)(?:$)/i;\r\n const match = url.pathname.match(regex);\r\n return match?.[1] ?? null;\r\n}\r\nconst cachedImplementations = {};\r\nfunction getImplementation(name) {\r\n const cached = cachedImplementations[name];\r\n if (cached) {\r\n return cached;\r\n }\r\n const document = window.document;\r\n let impl = window[name];\r\n if (document && typeof document.createElement === 'function') {\r\n try {\r\n const sandbox = document.createElement('iframe');\r\n sandbox.hidden = true;\r\n document.head.appendChild(sandbox);\r\n const contentWindow = sandbox.contentWindow;\r\n if (contentWindow && contentWindow[name]) {\r\n impl =\r\n contentWindow[name];\r\n }\r\n document.head.removeChild(sandbox);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n return (cachedImplementations[name] = impl.bind(window));\r\n}\r\nfunction onRequestAnimationFrame(...rest) {\r\n return getImplementation('requestAnimationFrame')(...rest);\r\n}\r\nfunction setTimeout(...rest) {\r\n return getImplementation('setTimeout')(...rest);\r\n}\r\nfunction clearTimeout(...rest) {\r\n return getImplementation('clearTimeout')(...rest);\r\n}\n\nlet _id = 1;\r\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\r\nconst IGNORED_NODE = -2;\r\nfunction genId() {\r\n return _id++;\r\n}\r\nfunction getValidTagName(element) {\r\n if (element instanceof HTMLFormElement) {\r\n return 'form';\r\n }\r\n const processedTagName = toLowerCase(element.tagName);\r\n if (tagNameRegex.test(processedTagName)) {\r\n return 'div';\r\n }\r\n return processedTagName;\r\n}\r\nfunction extractOrigin(url) {\r\n let origin = '';\r\n if (url.indexOf('//') > -1) {\r\n origin = url.split('/').slice(0, 3).join('/');\r\n }\r\n else {\r\n origin = url.split('/')[0];\r\n }\r\n origin = origin.split('?')[0];\r\n return origin;\r\n}\r\nlet canvasService;\r\nlet canvasCtx;\r\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\r\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\r\nconst URL_WWW_MATCH = /^www\\..*/i;\r\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\r\nfunction absoluteToStylesheet(cssText, href) {\r\n return (cssText || '').replace(URL_IN_CSS_REF, (origin, quote1, path1, quote2, path2, path3) => {\r\n const filePath = path1 || path2 || path3;\r\n const maybeQuote = quote1 || quote2 || '';\r\n if (!filePath) {\r\n return origin;\r\n }\r\n if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\r\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\r\n }\r\n if (DATA_URI.test(filePath)) {\r\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\r\n }\r\n if (filePath[0] === '/') {\r\n return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`;\r\n }\r\n const stack = href.split('/');\r\n const parts = filePath.split('/');\r\n stack.pop();\r\n for (const part of parts) {\r\n if (part === '.') {\r\n continue;\r\n }\r\n else if (part === '..') {\r\n stack.pop();\r\n }\r\n else {\r\n stack.push(part);\r\n }\r\n }\r\n return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\r\n });\r\n}\r\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\r\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n if (attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n let pos = 0;\r\n function collectCharacters(regEx) {\r\n let chars;\r\n const match = regEx.exec(attributeValue.substring(pos));\r\n if (match) {\r\n chars = match[0];\r\n pos += chars.length;\r\n return chars;\r\n }\r\n return '';\r\n }\r\n const output = [];\r\n while (true) {\r\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\r\n if (pos >= attributeValue.length) {\r\n break;\r\n }\r\n let url = collectCharacters(SRCSET_NOT_SPACES);\r\n if (url.slice(-1) === ',') {\r\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\r\n output.push(url);\r\n }\r\n else {\r\n let descriptorsStr = '';\r\n url = absoluteToDoc(doc, url);\r\n let inParens = false;\r\n while (true) {\r\n const c = attributeValue.charAt(pos);\r\n if (c === '') {\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (!inParens) {\r\n if (c === ',') {\r\n pos += 1;\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (c === '(') {\r\n inParens = true;\r\n }\r\n }\r\n else {\r\n if (c === ')') {\r\n inParens = false;\r\n }\r\n }\r\n descriptorsStr += c;\r\n pos += 1;\r\n }\r\n }\r\n }\r\n return output.join(', ');\r\n}\r\nconst cachedDocument = new WeakMap();\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n if (!attributeValue || attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n return getHref(doc, attributeValue);\r\n}\r\nfunction isSVGElement(el) {\r\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\r\n}\r\nfunction getHref(doc, customHref) {\r\n let a = cachedDocument.get(doc);\r\n if (!a) {\r\n a = doc.createElement('a');\r\n cachedDocument.set(doc, a);\r\n }\r\n if (!customHref) {\r\n customHref = '';\r\n }\r\n else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\r\n return customHref;\r\n }\r\n a.setAttribute('href', customHref);\r\n return a.href;\r\n}\r\nfunction transformAttribute(doc, tagName, name, value, element, maskAttributeFn) {\r\n if (!value) {\r\n return value;\r\n }\r\n if (name === 'src' ||\r\n (name === 'href' && !(tagName === 'use' && value[0] === '#'))) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'xlink:href' && value[0] !== '#') {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'background' &&\r\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'srcset') {\r\n return getAbsoluteSrcsetString(doc, value);\r\n }\r\n else if (name === 'style') {\r\n return absoluteToStylesheet(value, getHref(doc));\r\n }\r\n else if (tagName === 'object' && name === 'data') {\r\n return absoluteToDoc(doc, value);\r\n }\r\n if (typeof maskAttributeFn === 'function') {\r\n return maskAttributeFn(name, value, element);\r\n }\r\n return value;\r\n}\r\nfunction ignoreAttribute(tagName, name, _value) {\r\n return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\r\n}\r\nfunction _isBlockedElement(element, blockClass, blockSelector, unblockSelector) {\r\n try {\r\n if (unblockSelector && element.matches(unblockSelector)) {\r\n return false;\r\n }\r\n if (typeof blockClass === 'string') {\r\n if (element.classList.contains(blockClass)) {\r\n return true;\r\n }\r\n }\r\n else {\r\n for (let eIndex = element.classList.length; eIndex--;) {\r\n const className = element.classList[eIndex];\r\n if (blockClass.test(className)) {\r\n return true;\r\n }\r\n }\r\n }\r\n if (blockSelector) {\r\n return element.matches(blockSelector);\r\n }\r\n }\r\n catch (e) {\r\n }\r\n return false;\r\n}\r\nfunction elementClassMatchesRegex(el, regex) {\r\n for (let eIndex = el.classList.length; eIndex--;) {\r\n const className = el.classList[eIndex];\r\n if (regex.test(className)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction classMatchesRegex(node, regex, checkAncestors) {\r\n if (!node)\r\n return false;\r\n if (checkAncestors) {\r\n return (distanceToMatch(node, (node) => elementClassMatchesRegex(node, regex)) >= 0);\r\n }\r\n else if (node.nodeType === node.ELEMENT_NODE) {\r\n return elementClassMatchesRegex(node, regex);\r\n }\r\n return false;\r\n}\r\nfunction distanceToMatch(node, matchPredicate, limit = Infinity, distance = 0) {\r\n if (!node)\r\n return -1;\r\n if (node.nodeType !== node.ELEMENT_NODE)\r\n return -1;\r\n if (distance > limit)\r\n return -1;\r\n if (matchPredicate(node))\r\n return distance;\r\n return distanceToMatch(node.parentNode, matchPredicate, limit, distance + 1);\r\n}\r\nfunction createMatchPredicate(className, selector) {\r\n return (node) => {\r\n const el = node;\r\n if (el === null)\r\n return false;\r\n try {\r\n if (className) {\r\n if (typeof className === 'string') {\r\n if (el.matches(`.${className}`))\r\n return true;\r\n }\r\n else if (elementClassMatchesRegex(el, className)) {\r\n return true;\r\n }\r\n }\r\n if (selector && el.matches(selector))\r\n return true;\r\n return false;\r\n }\r\n catch {\r\n return false;\r\n }\r\n };\r\n}\r\nfunction needMaskingText(node, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText) {\r\n try {\r\n const el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (el === null)\r\n return false;\r\n if (el.tagName === 'INPUT') {\r\n const autocomplete = el.getAttribute('autocomplete');\r\n const disallowedAutocompleteValues = [\r\n 'current-password',\r\n 'new-password',\r\n 'cc-number',\r\n 'cc-exp',\r\n 'cc-exp-month',\r\n 'cc-exp-year',\r\n 'cc-csc',\r\n ];\r\n if (disallowedAutocompleteValues.includes(autocomplete)) {\r\n return true;\r\n }\r\n }\r\n let maskDistance = -1;\r\n let unmaskDistance = -1;\r\n if (maskAllText) {\r\n unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector));\r\n if (unmaskDistance < 0) {\r\n return true;\r\n }\r\n maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector), unmaskDistance >= 0 ? unmaskDistance : Infinity);\r\n }\r\n else {\r\n maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector));\r\n if (maskDistance < 0) {\r\n return false;\r\n }\r\n unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector), maskDistance >= 0 ? maskDistance : Infinity);\r\n }\r\n return maskDistance >= 0\r\n ? unmaskDistance >= 0\r\n ? maskDistance <= unmaskDistance\r\n : true\r\n : unmaskDistance >= 0\r\n ? false\r\n : !!maskAllText;\r\n }\r\n catch (e) {\r\n }\r\n return !!maskAllText;\r\n}\r\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\r\n const win = iframeEl.contentWindow;\r\n if (!win) {\r\n return;\r\n }\r\n let fired = false;\r\n let readyState;\r\n try {\r\n readyState = win.document.readyState;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (readyState !== 'complete') {\r\n const timer = setTimeout(() => {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, iframeLoadTimeout);\r\n iframeEl.addEventListener('load', () => {\r\n clearTimeout(timer);\r\n fired = true;\r\n listener();\r\n });\r\n return;\r\n }\r\n const blankUrl = 'about:blank';\r\n if (win.location.href !== blankUrl ||\r\n iframeEl.src === blankUrl ||\r\n iframeEl.src === '') {\r\n setTimeout(listener, 0);\r\n return iframeEl.addEventListener('load', listener);\r\n }\r\n iframeEl.addEventListener('load', listener);\r\n}\r\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\r\n let fired = false;\r\n let styleSheetLoaded;\r\n try {\r\n styleSheetLoaded = link.sheet;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (styleSheetLoaded)\r\n return;\r\n const timer = setTimeout(() => {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, styleSheetLoadTimeout);\r\n link.addEventListener('load', () => {\r\n clearTimeout(timer);\r\n fired = true;\r\n listener();\r\n });\r\n}\r\nfunction serializeNode(n, options) {\r\n const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskAttributeFn, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, inlineStylesheet, maskInputOptions = {}, maskTextFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, } = options;\r\n const rootId = getRootId(doc, mirror);\r\n switch (n.nodeType) {\r\n case n.DOCUMENT_NODE:\r\n if (n.compatMode !== 'CSS1Compat') {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: [],\r\n compatMode: n.compatMode,\r\n };\r\n }\r\n else {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: [],\r\n };\r\n }\r\n case n.DOCUMENT_TYPE_NODE:\r\n return {\r\n type: NodeType.DocumentType,\r\n name: n.name,\r\n publicId: n.publicId,\r\n systemId: n.systemId,\r\n rootId,\r\n };\r\n case n.ELEMENT_NODE:\r\n return serializeElementNode(n, {\r\n doc,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n inlineStylesheet,\r\n maskAttributeFn,\r\n maskInputOptions,\r\n maskInputFn,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n keepIframeSrcFn,\r\n newlyAddedElement,\r\n rootId,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n });\r\n case n.TEXT_NODE:\r\n return serializeTextNode(n, {\r\n doc,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n maskTextFn,\r\n maskInputOptions,\r\n maskInputFn,\r\n rootId,\r\n });\r\n case n.CDATA_SECTION_NODE:\r\n return {\r\n type: NodeType.CDATA,\r\n textContent: '',\r\n rootId,\r\n };\r\n case n.COMMENT_NODE:\r\n return {\r\n type: NodeType.Comment,\r\n textContent: n.textContent || '',\r\n rootId,\r\n };\r\n default:\r\n return false;\r\n }\r\n}\r\nfunction getRootId(doc, mirror) {\r\n if (!mirror.hasNode(doc))\r\n return undefined;\r\n const docId = mirror.getId(doc);\r\n return docId === 1 ? undefined : docId;\r\n}\r\nfunction serializeTextNode(n, options) {\r\n const { maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, maskTextFn, maskInputOptions, maskInputFn, rootId, } = options;\r\n const parentTagName = n.parentNode && n.parentNode.tagName;\r\n let textContent = n.textContent;\r\n const isStyle = parentTagName === 'STYLE' ? true : undefined;\r\n const isScript = parentTagName === 'SCRIPT' ? true : undefined;\r\n const isTextarea = parentTagName === 'TEXTAREA' ? true : undefined;\r\n if (isStyle && textContent) {\r\n try {\r\n if (n.nextSibling || n.previousSibling) {\r\n }\r\n else if (n.parentNode.sheet?.cssRules) {\r\n textContent = stringifyStylesheet(n.parentNode.sheet);\r\n }\r\n }\r\n catch (err) {\r\n console.warn(`Cannot get CSS styles from text's parentNode. Error: ${err}`, n);\r\n }\r\n textContent = absoluteToStylesheet(textContent, getHref(options.doc));\r\n }\r\n if (isScript) {\r\n textContent = 'SCRIPT_PLACEHOLDER';\r\n }\r\n const forceMask = needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText);\r\n if (!isStyle && !isScript && !isTextarea && textContent && forceMask) {\r\n textContent = maskTextFn\r\n ? maskTextFn(textContent, n.parentElement)\r\n : textContent.replace(/[\\S]/g, '*');\r\n }\r\n if (isTextarea && textContent && (maskInputOptions.textarea || forceMask)) {\r\n textContent = maskInputFn\r\n ? maskInputFn(textContent, n.parentNode)\r\n : textContent.replace(/[\\S]/g, '*');\r\n }\r\n if (parentTagName === 'OPTION' && textContent) {\r\n const isInputMasked = shouldMaskInput({\r\n type: null,\r\n tagName: parentTagName,\r\n maskInputOptions,\r\n });\r\n textContent = maskInputValue({\r\n isMasked: needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked),\r\n element: n,\r\n value: textContent,\r\n maskInputFn,\r\n });\r\n }\r\n return {\r\n type: NodeType.Text,\r\n textContent: textContent || '',\r\n isStyle,\r\n rootId,\r\n };\r\n}\r\nfunction serializeElementNode(n, options) {\r\n const { doc, blockClass, blockSelector, unblockSelector, inlineStylesheet, maskInputOptions = {}, maskAttributeFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, rootId, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, } = options;\r\n const needBlock = _isBlockedElement(n, blockClass, blockSelector, unblockSelector);\r\n const tagName = getValidTagName(n);\r\n let attributes = {};\r\n const len = n.attributes.length;\r\n for (let i = 0; i < len; i++) {\r\n const attr = n.attributes[i];\r\n if (attr.name && !ignoreAttribute(tagName, attr.name, attr.value)) {\r\n attributes[attr.name] = transformAttribute(doc, tagName, toLowerCase(attr.name), attr.value, n, maskAttributeFn);\r\n }\r\n }\r\n if (tagName === 'link' && inlineStylesheet) {\r\n const stylesheet = Array.from(doc.styleSheets).find((s) => {\r\n return s.href === n.href;\r\n });\r\n let cssText = null;\r\n if (stylesheet) {\r\n cssText = stringifyStylesheet(stylesheet);\r\n }\r\n if (cssText) {\r\n delete attributes.rel;\r\n delete attributes.href;\r\n attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n }\r\n }\r\n if (tagName === 'style' &&\r\n n.sheet &&\r\n !(n.innerText || n.textContent || '').trim().length) {\r\n const cssText = stringifyStylesheet(n.sheet);\r\n if (cssText) {\r\n attributes._cssText = absoluteToStylesheet(cssText, getHref(doc));\r\n }\r\n }\r\n if (tagName === 'input' ||\r\n tagName === 'textarea' ||\r\n tagName === 'select' ||\r\n tagName === 'option') {\r\n const el = n;\r\n const type = getInputType(el);\r\n const value = getInputValue(el, toUpperCase(tagName), type);\r\n const checked = el.checked;\r\n if (type !== 'submit' && type !== 'button' && value) {\r\n const forceMask = needMaskingText(el, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, shouldMaskInput({\r\n type,\r\n tagName: toUpperCase(tagName),\r\n maskInputOptions,\r\n }));\r\n attributes.value = maskInputValue({\r\n isMasked: forceMask,\r\n element: el,\r\n value,\r\n maskInputFn,\r\n });\r\n }\r\n if (checked) {\r\n attributes.checked = checked;\r\n }\r\n }\r\n if (tagName === 'option') {\r\n if (n.selected && !maskInputOptions['select']) {\r\n attributes.selected = true;\r\n }\r\n else {\r\n delete attributes.selected;\r\n }\r\n }\r\n if (tagName === 'canvas' && recordCanvas) {\r\n if (n.__context === '2d') {\r\n if (!is2DCanvasBlank(n)) {\r\n attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n }\r\n else if (!('__context' in n)) {\r\n const canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n const blankCanvas = doc.createElement('canvas');\r\n blankCanvas.width = n.width;\r\n blankCanvas.height = n.height;\r\n const blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n if (canvasDataURL !== blankCanvasDataURL) {\r\n attributes.rr_dataURL = canvasDataURL;\r\n }\r\n }\r\n }\r\n if (tagName === 'img' && inlineImages) {\r\n if (!canvasService) {\r\n canvasService = doc.createElement('canvas');\r\n canvasCtx = canvasService.getContext('2d');\r\n }\r\n const image = n;\r\n const imageSrc = image.currentSrc || image.getAttribute('src') || '<unknown-src>';\r\n const priorCrossOrigin = image.crossOrigin;\r\n const recordInlineImage = () => {\r\n image.removeEventListener('load', recordInlineImage);\r\n try {\r\n canvasService.width = image.naturalWidth;\r\n canvasService.height = image.naturalHeight;\r\n canvasCtx.drawImage(image, 0, 0);\r\n attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n catch (err) {\r\n if (image.crossOrigin !== 'anonymous') {\r\n image.crossOrigin = 'anonymous';\r\n if (image.complete && image.naturalWidth !== 0)\r\n recordInlineImage();\r\n else\r\n image.addEventListener('load', recordInlineImage);\r\n return;\r\n }\r\n else {\r\n console.warn(`Cannot inline img src=${imageSrc}! Error: ${err}`);\r\n }\r\n }\r\n if (image.crossOrigin === 'anonymous') {\r\n priorCrossOrigin\r\n ? (attributes.crossOrigin = priorCrossOrigin)\r\n : image.removeAttribute('crossorigin');\r\n }\r\n };\r\n if (image.complete && image.naturalWidth !== 0)\r\n recordInlineImage();\r\n else\r\n image.addEventListener('load', recordInlineImage);\r\n }\r\n if (tagName === 'audio' || tagName === 'video') {\r\n attributes.rr_mediaState = n.paused\r\n ? 'paused'\r\n : 'played';\r\n attributes.rr_mediaCurrentTime = n.currentTime;\r\n }\r\n if (!newlyAddedElement) {\r\n if (n.scrollLeft) {\r\n attributes.rr_scrollLeft = n.scrollLeft;\r\n }\r\n if (n.scrollTop) {\r\n attributes.rr_scrollTop = n.scrollTop;\r\n }\r\n }\r\n if (needBlock) {\r\n const { width, height } = n.getBoundingClientRect();\r\n attributes = {\r\n class: attributes.class,\r\n rr_width: `${width}px`,\r\n rr_height: `${height}px`,\r\n };\r\n }\r\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\r\n if (!needBlock && !n.contentDocument) {\r\n attributes.rr_src = attributes.src;\r\n }\r\n delete attributes.src;\r\n }\r\n let isCustomElement;\r\n try {\r\n if (customElements.get(tagName))\r\n isCustomElement = true;\r\n }\r\n catch (e) {\r\n }\r\n return {\r\n type: NodeType.Element,\r\n tagName,\r\n attributes,\r\n childNodes: [],\r\n isSVG: isSVGElement(n) || undefined,\r\n needBlock,\r\n rootId,\r\n isCustom: isCustomElement,\r\n };\r\n}\r\nfunction lowerIfExists(maybeAttr) {\r\n if (maybeAttr === undefined || maybeAttr === null) {\r\n return '';\r\n }\r\n else {\r\n return maybeAttr.toLowerCase();\r\n }\r\n}\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\r\n return true;\r\n }\r\n else if (sn.type === NodeType.Element) {\r\n if (slimDOMOptions.script &&\r\n (sn.tagName === 'script' ||\r\n (sn.tagName === 'link' &&\r\n (sn.attributes.rel === 'preload' ||\r\n sn.attributes.rel === 'modulepreload') &&\r\n sn.attributes.as === 'script') ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'prefetch' &&\r\n typeof sn.attributes.href === 'string' &&\r\n extractFileExtension(sn.attributes.href) === 'js'))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headFavicon &&\r\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\r\n (sn.tagName === 'meta' &&\r\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\r\n lowerIfExists(sn.attributes.name) === 'application-name' ||\r\n lowerIfExists(sn.attributes.rel) === 'icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\r\n return true;\r\n }\r\n else if (sn.tagName === 'meta') {\r\n if (slimDOMOptions.headMetaDescKeywords &&\r\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaSocial &&\r\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\r\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\r\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaRobots &&\r\n (lowerIfExists(sn.attributes.name) === 'robots' ||\r\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\r\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaHttpEquiv &&\r\n sn.attributes['http-equiv'] !== undefined) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaAuthorship &&\r\n (lowerIfExists(sn.attributes.name) === 'author' ||\r\n lowerIfExists(sn.attributes.name) === 'generator' ||\r\n lowerIfExists(sn.attributes.name) === 'framework' ||\r\n lowerIfExists(sn.attributes.name) === 'publisher' ||\r\n lowerIfExists(sn.attributes.name) === 'progid' ||\r\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\r\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaVerification &&\r\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\r\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\r\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\r\n lowerIfExists(sn.attributes.name) === 'verification' ||\r\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nfunction serializeNodeWithId(n, options) {\r\n const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, skipChild = false, inlineStylesheet = true, maskInputOptions = {}, maskAttributeFn, maskTextFn, maskInputFn, slimDOMOptions, dataURLOptions = {}, inlineImages = false, recordCanvas = false, onSerialize, onIframeLoad, iframeLoadTimeout = 5000, onStylesheetLoad, stylesheetLoadTimeout = 5000, keepIframeSrcFn = () => false, newlyAddedElement = false, } = options;\r\n let { preserveWhiteSpace = true } = options;\r\n const _serializedNode = serializeNode(n, {\r\n doc,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n maskAllText,\r\n unblockSelector,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n keepIframeSrcFn,\r\n newlyAddedElement,\r\n });\r\n if (!_serializedNode) {\r\n console.warn(n, 'not serialized');\r\n return null;\r\n }\r\n let id;\r\n if (mirror.hasNode(n)) {\r\n id = mirror.getId(n);\r\n }\r\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\r\n (!preserveWhiteSpace &&\r\n _serializedNode.type === NodeType.Text &&\r\n !_serializedNode.isStyle &&\r\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\r\n id = IGNORED_NODE;\r\n }\r\n else {\r\n id = genId();\r\n }\r\n const serializedNode = Object.assign(_serializedNode, { id });\r\n mirror.add(n, serializedNode);\r\n if (id === IGNORED_NODE) {\r\n return null;\r\n }\r\n if (onSerialize) {\r\n onSerialize(n);\r\n }\r\n let recordChild = !skipChild;\r\n if (serializedNode.type === NodeType.Element) {\r\n recordChild = recordChild && !serializedNode.needBlock;\r\n delete serializedNode.needBlock;\r\n const shadowRoot = n.shadowRoot;\r\n if (shadowRoot && isNativeShadowDom(shadowRoot))\r\n serializedNode.isShadowHost = true;\r\n }\r\n if ((serializedNode.type === NodeType.Document ||\r\n serializedNode.type === NodeType.Element) &&\r\n recordChild) {\r\n if (slimDOMOptions.headWhitespace &&\r\n serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'head') {\r\n preserveWhiteSpace = false;\r\n }\r\n const bypassOptions = {\r\n doc,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n maskAllText,\r\n unblockSelector,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n skipChild,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n preserveWhiteSpace,\r\n onSerialize,\r\n onIframeLoad,\r\n iframeLoadTimeout,\r\n onStylesheetLoad,\r\n stylesheetLoadTimeout,\r\n keepIframeSrcFn,\r\n };\r\n for (const childN of Array.from(n.childNodes)) {\r\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n if (isElement(n) && n.shadowRoot) {\r\n for (const childN of Array.from(n.shadowRoot.childNodes)) {\r\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n isNativeShadowDom(n.shadowRoot) &&\r\n (serializedChildNode.isShadow = true);\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n }\r\n }\r\n if (n.parentNode &&\r\n isShadowRoot(n.parentNode) &&\r\n isNativeShadowDom(n.parentNode)) {\r\n serializedNode.isShadow = true;\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'iframe') {\r\n onceIframeLoaded(n, () => {\r\n const iframeDoc = n.contentDocument;\r\n if (iframeDoc && onIframeLoad) {\r\n const serializedIframeNode = serializeNodeWithId(iframeDoc, {\r\n doc: iframeDoc,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n preserveWhiteSpace,\r\n onSerialize,\r\n onIframeLoad,\r\n iframeLoadTimeout,\r\n onStylesheetLoad,\r\n stylesheetLoadTimeout,\r\n keepIframeSrcFn,\r\n });\r\n if (serializedIframeNode) {\r\n onIframeLoad(n, serializedIframeNode);\r\n }\r\n }\r\n }, iframeLoadTimeout);\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'link' &&\r\n typeof serializedNode.attributes.rel === 'string' &&\r\n (serializedNode.attributes.rel === 'stylesheet' ||\r\n (serializedNode.attributes.rel === 'preload' &&\r\n typeof serializedNode.attributes.href === 'string' &&\r\n extractFileExtension(serializedNode.attributes.href) === 'css'))) {\r\n onceStylesheetLoaded(n, () => {\r\n if (onStylesheetLoad) {\r\n const serializedLinkNode = serializeNodeWithId(n, {\r\n doc,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n preserveWhiteSpace,\r\n onSerialize,\r\n onIframeLoad,\r\n iframeLoadTimeout,\r\n onStylesheetLoad,\r\n stylesheetLoadTimeout,\r\n keepIframeSrcFn,\r\n });\r\n if (serializedLinkNode) {\r\n onStylesheetLoad(n, serializedLinkNode);\r\n }\r\n }\r\n }, stylesheetLoadTimeout);\r\n }\r\n return serializedNode;\r\n}\r\nfunction snapshot(n, options) {\r\n const { mirror = new Mirror(), blockClass = 'rr-block', blockSelector = null, unblockSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, inlineImages = false, recordCanvas = false, maskAllInputs = false, maskAttributeFn, maskTextFn, maskInputFn, slimDOM = false, dataURLOptions, preserveWhiteSpace, onSerialize, onIframeLoad, iframeLoadTimeout, onStylesheetLoad, stylesheetLoadTimeout, keepIframeSrcFn = () => false, } = options || {};\r\n const maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n }\r\n : maskAllInputs === false\r\n ? {}\r\n : maskAllInputs;\r\n const slimDOMOptions = slimDOM === true || slimDOM === 'all'\r\n ?\r\n {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaDescKeywords: slimDOM === 'all',\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaAuthorship: true,\r\n headMetaVerification: true,\r\n }\r\n : slimDOM === false\r\n ? {}\r\n : slimDOM;\r\n return serializeNodeWithId(n, {\r\n doc: n,\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n unblockSelector,\r\n maskAllText,\r\n maskTextClass,\r\n unmaskTextClass,\r\n maskTextSelector,\r\n unmaskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n maskAttributeFn,\r\n maskTextFn,\r\n maskInputFn,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n inlineImages,\r\n recordCanvas,\r\n preserveWhiteSpace,\r\n onSerialize,\r\n onIframeLoad,\r\n iframeLoadTimeout,\r\n onStylesheetLoad,\r\n stylesheetLoadTimeout,\r\n keepIframeSrcFn,\r\n newlyAddedElement: false,\r\n });\r\n}\r\nfunction visitSnapshot(node, onVisit) {\r\n function walk(current) {\r\n onVisit(current);\r\n if (current.type === NodeType.Document ||\r\n current.type === NodeType.Element) {\r\n current.childNodes.forEach(walk);\r\n }\r\n }\r\n walk(node);\r\n}\r\nfunction cleanupSnapshot() {\r\n _id = 1;\r\n}\n\nconst commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\r\nfunction parse(css, options = {}) {\r\n let lineno = 1;\r\n let column = 1;\r\n function updatePosition(str) {\r\n const lines = str.match(/\\n/g);\r\n if (lines) {\r\n lineno += lines.length;\r\n }\r\n const i = str.lastIndexOf('\\n');\r\n column = i === -1 ? column + str.length : str.length - i;\r\n }\r\n function position() {\r\n const start = { line: lineno, column };\r\n return (node) => {\r\n node.position = new Position(start);\r\n whitespace();\r\n return node;\r\n };\r\n }\r\n class Position {\r\n constructor(start) {\r\n this.start = start;\r\n this.end = { line: lineno, column };\r\n this.source = options.source;\r\n }\r\n }\r\n Position.prototype.content = css;\r\n const errorsList = [];\r\n function error(msg) {\r\n const err = new Error(`${options.source || ''}:${lineno}:${column}: ${msg}`);\r\n err.reason = msg;\r\n err.filename = options.source;\r\n err.line = lineno;\r\n err.column = column;\r\n err.source = css;\r\n if (options.silent) {\r\n errorsList.push(err);\r\n }\r\n else {\r\n throw err;\r\n }\r\n }\r\n function stylesheet() {\r\n const rulesList = rules();\r\n return {\r\n type: 'stylesheet',\r\n stylesheet: {\r\n source: options.source,\r\n rules: rulesList,\r\n parsingErrors: errorsList,\r\n },\r\n };\r\n }\r\n function open() {\r\n return match(/^{\\s*/);\r\n }\r\n function close() {\r\n return match(/^}/);\r\n }\r\n function rules() {\r\n let node;\r\n const rules = [];\r\n whitespace();\r\n comments(rules);\r\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\r\n if (node) {\r\n rules.push(node);\r\n comments(rules);\r\n }\r\n }\r\n return rules;\r\n }\r\n function match(re) {\r\n const m = re.exec(css);\r\n if (!m) {\r\n return;\r\n }\r\n const str = m[0];\r\n updatePosition(str);\r\n css = css.slice(str.length);\r\n return m;\r\n }\r\n function whitespace() {\r\n match(/^\\s*/);\r\n }\r\n function comments(rules = []) {\r\n let c;\r\n while ((c = comment())) {\r\n if (c) {\r\n rules.push(c);\r\n }\r\n c = comment();\r\n }\r\n return rules;\r\n }\r\n function comment() {\r\n const pos = position();\r\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\r\n return;\r\n }\r\n let i = 2;\r\n while ('' !== css.charAt(i) &&\r\n ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\r\n ++i;\r\n }\r\n i += 2;\r\n if ('' === css.charAt(i - 1)) {\r\n return error('End of comment missing');\r\n }\r\n const str = css.slice(2, i - 2);\r\n column += 2;\r\n updatePosition(str);\r\n css = css.slice(i);\r\n column += 2;\r\n return pos({\r\n type: 'comment',\r\n comment: str,\r\n });\r\n }\r\n function selector() {\r\n const m = match(/^([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n const splitSelectors = trim(m[0])\r\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\r\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, (m) => {\r\n return m.replace(/,/g, '\\u200C');\r\n })\r\n .split(/\\s*(?![^(]*\\)),\\s*/);\r\n if (splitSelectors.length <= 1) {\r\n return splitSelectors.map((s) => {\r\n return s.replace(/\\u200C/g, ',');\r\n });\r\n }\r\n let i = 0;\r\n let j = 0;\r\n const len = splitSelectors.length;\r\n const finalSelectors = [];\r\n while (i < len) {\r\n const openingParensCount = (splitSelectors[i].match(/\\(/g) || []).length;\r\n const closingParensCount = (splitSelectors[i].match(/\\)/g) || []).length;\r\n let unbalancedParens = openingParensCount - closingParensCount;\r\n if (unbalancedParens >= 1) {\r\n let foundClosingSelector = false;\r\n j = i + 1;\r\n while (j < len) {\r\n const nextOpeningParensCount = (splitSelectors[j].match(/\\(/g) || [])\r\n .length;\r\n const nextClosingParensCount = (splitSelectors[j].match(/\\)/g) || [])\r\n .length;\r\n const nextUnbalancedParens = nextClosingParensCount - nextOpeningParensCount;\r\n if (nextUnbalancedParens === unbalancedParens) {\r\n finalSelectors.push(splitSelectors.slice(i, j + 1).join(','));\r\n i = j + 1;\r\n foundClosingSelector = true;\r\n break;\r\n }\r\n j++;\r\n unbalancedParens -= nextUnbalancedParens;\r\n }\r\n if (foundClosingSelector) {\r\n continue;\r\n }\r\n splitSelectors\r\n .slice(i, len)\r\n .forEach((selector) => selector && finalSelectors.push(selector));\r\n break;\r\n }\r\n splitSelectors[i] && finalSelectors.push(splitSelectors[i]);\r\n i++;\r\n }\r\n return finalSelectors.map((s) => {\r\n return s.replace(/\\u200C/g, ',');\r\n });\r\n }\r\n function declaration() {\r\n const pos = position();\r\n const propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\r\n if (!propMatch) {\r\n return;\r\n }\r\n const prop = trim(propMatch[0]);\r\n if (!match(/^:\\s*/)) {\r\n return error(`property missing ':'`);\r\n }\r\n const val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\r\n const ret = pos({\r\n type: 'declaration',\r\n property: prop.replace(commentre, ''),\r\n value: val ? trim(val[0]).replace(commentre, '') : '',\r\n });\r\n match(/^[;\\s]*/);\r\n return ret;\r\n }\r\n function declarations() {\r\n const decls = [];\r\n if (!open()) {\r\n return error(`missing '{'`);\r\n }\r\n comments(decls);\r\n let decl;\r\n while ((decl = declaration())) {\r\n if (decl !== false) {\r\n decls.push(decl);\r\n comments(decls);\r\n }\r\n decl = declaration();\r\n }\r\n if (!close()) {\r\n return error(`missing '}'`);\r\n }\r\n return decls;\r\n }\r\n function keyframe() {\r\n let m;\r\n const vals = [];\r\n const pos = position();\r\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\r\n vals.push(m[1]);\r\n match(/^,\\s*/);\r\n }\r\n if (!vals.length) {\r\n return;\r\n }\r\n return pos({\r\n type: 'keyframe',\r\n values: vals,\r\n declarations: declarations(),\r\n });\r\n }\r\n function atkeyframes() {\r\n const pos = position();\r\n let m = match(/^@([-\\w]+)?keyframes\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n const vendor = m[1];\r\n m = match(/^([-\\w]+)\\s*/);\r\n if (!m) {\r\n return error('@keyframes missing name');\r\n }\r\n const name = m[1];\r\n if (!open()) {\r\n return error(`@keyframes missing '{'`);\r\n }\r\n let frame;\r\n let frames = comments();\r\n while ((frame = keyframe())) {\r\n frames.push(frame);\r\n frames = frames.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(`@keyframes missing '}'`);\r\n }\r\n return pos({\r\n type: 'keyframes',\r\n name,\r\n vendor,\r\n keyframes: frames,\r\n });\r\n }\r\n function atsupports() {\r\n const pos = position();\r\n const m = match(/^@supports *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n const supports = trim(m[1]);\r\n if (!open()) {\r\n return error(`@supports missing '{'`);\r\n }\r\n const style = comments().concat(rules());\r\n if (!close()) {\r\n return error(`@supports missing '}'`);\r\n }\r\n return pos({\r\n type: 'supports',\r\n supports,\r\n rules: style,\r\n });\r\n }\r\n function athost() {\r\n const pos = position();\r\n const m = match(/^@host\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(`@host missing '{'`);\r\n }\r\n const style = comments().concat(rules());\r\n if (!close()) {\r\n return error(`@host missing '}'`);\r\n }\r\n return pos({\r\n type: 'host',\r\n rules: style,\r\n });\r\n }\r\n function atmedia() {\r\n const pos = position();\r\n const m = match(/^@media *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n const media = trim(m[1]);\r\n if (!open()) {\r\n return error(`@media missing '{'`);\r\n }\r\n const style = comments().concat(rules());\r\n if (!close()) {\r\n return error(`@media missing '}'`);\r\n }\r\n return pos({\r\n type: 'media',\r\n media,\r\n rules: style,\r\n });\r\n }\r\n function atcustommedia() {\r\n const pos = position();\r\n const m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\r\n if (!m) {\r\n return;\r\n }\r\n return pos({\r\n type: 'custom-media',\r\n name: trim(m[1]),\r\n media: trim(m[2]),\r\n });\r\n }\r\n function atpage() {\r\n const pos = position();\r\n const m = match(/^@page */);\r\n if (!m) {\r\n return;\r\n }\r\n const sel = selector() || [];\r\n if (!open()) {\r\n return error(`@page missing '{'`);\r\n }\r\n let decls = comments();\r\n let decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(`@page missing '}'`);\r\n }\r\n return pos({\r\n type: 'page',\r\n selectors: sel,\r\n declarations: decls,\r\n });\r\n }\r\n function atdocument() {\r\n const pos = position();\r\n const m = match(/^@([-\\w]+)?document *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n const vendor = trim(m[1]);\r\n const doc = trim(m[2]);\r\n if (!open()) {\r\n return error(`@document missing '{'`);\r\n }\r\n const style = comments().concat(rules());\r\n if (!close()) {\r\n return error(`@document missing '}'`);\r\n }\r\n return pos({\r\n type: 'document',\r\n document: doc,\r\n vendor,\r\n rules: style,\r\n });\r\n }\r\n function atfontface() {\r\n const pos = position();\r\n const m = match(/^@font-face\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(`@font-face missing '{'`);\r\n }\r\n let decls = comments();\r\n let decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(`@font-face missing '}'`);\r\n }\r\n return pos({\r\n type: 'font-face',\r\n declarations: decls,\r\n });\r\n }\r\n const atimport = _compileAtrule('import');\r\n const atcharset = _compileAtrule('charset');\r\n const atnamespace = _compileAtrule('namespace');\r\n function _compileAtrule(name) {\r\n const re = new RegExp('^@' +\r\n name +\r\n '\\\\s*((?:' +\r\n [\r\n /[^\\\\]\"(?:\\\\\"|[^\"])*\"/.source,\r\n /[^\\\\]'(?:\\\\'|[^'])*'/.source,\r\n '[^;]',\r\n ].join('|') +\r\n ')+);');\r\n return () => {\r\n const pos = position();\r\n const m = match(re);\r\n if (!m) {\r\n return;\r\n }\r\n const ret = { type: name };\r\n ret[name] = m[1].trim();\r\n return pos(ret);\r\n };\r\n }\r\n function atrule() {\r\n if (css[0] !== '@') {\r\n return;\r\n }\r\n return (atkeyframes() ||\r\n atmedia() ||\r\n atcustommedia() ||\r\n atsupports() ||\r\n atimport() ||\r\n atcharset() ||\r\n atnamespace() ||\r\n atdocument() ||\r\n atpage() ||\r\n athost() ||\r\n atfontface());\r\n }\r\n function rule() {\r\n const pos = position();\r\n const sel = selector();\r\n if (!sel) {\r\n return error('selector missing');\r\n }\r\n comments();\r\n return pos({\r\n type: 'rule',\r\n selectors: sel,\r\n declarations: declarations(),\r\n });\r\n }\r\n return addParent(stylesheet());\r\n}\r\nfunction trim(str) {\r\n return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\r\n}\r\nfunction addParent(obj, parent) {\r\n const isNode = obj && typeof obj.type === 'string';\r\n const childParent = isNode ? obj : parent;\r\n for (const k of Object.keys(obj)) {\r\n const value = obj[k];\r\n if (Array.isArray(value)) {\r\n value.forEach((v) => {\r\n addParent(v, childParent);\r\n });\r\n }\r\n else if (value && typeof value === 'object') {\r\n addParent(value, childParent);\r\n }\r\n }\r\n if (isNode) {\r\n Object.defineProperty(obj, 'parent', {\r\n configurable: true,\r\n writable: true,\r\n enumerable: false,\r\n value: parent || null,\r\n });\r\n }\r\n return obj;\r\n}\n\nconst tagMap = {\r\n script: 'noscript',\r\n altglyph: 'altGlyph',\r\n altglyphdef: 'altGlyphDef',\r\n altglyphitem: 'altGlyphItem',\r\n animatecolor: 'animateColor',\r\n animatemotion: 'animateMotion',\r\n animatetransform: 'animateTransform',\r\n clippath: 'clipPath',\r\n feblend: 'feBlend',\r\n fecolormatrix: 'feColorMatrix',\r\n fecomponenttransfer: 'feComponentTransfer',\r\n fecomposite: 'feComposite',\r\n feconvolvematrix: 'feConvolveMatrix',\r\n fediffuselighting: 'feDiffuseLighting',\r\n fedisplacementmap: 'feDisplacementMap',\r\n fedistantlight: 'feDistantLight',\r\n fedropshadow: 'feDropShadow',\r\n feflood: 'feFlood',\r\n fefunca: 'feFuncA',\r\n fefuncb: 'feFuncB',\r\n fefuncg: 'feFuncG',\r\n fefuncr: 'feFuncR',\r\n fegaussianblur: 'feGaussianBlur',\r\n feimage: 'feImage',\r\n femerge: 'feMerge',\r\n femergenode: 'feMergeNode',\r\n femorphology: 'feMorphology',\r\n feoffset: 'feOffset',\r\n fepointlight: 'fePointLight',\r\n fespecularlighting: 'feSpecularLighting',\r\n fespotlight: 'feSpotLight',\r\n fetile: 'feTile',\r\n feturbulence: 'feTurbulence',\r\n foreignobject: 'foreignObject',\r\n glyphref: 'glyphRef',\r\n lineargradient: 'linearGradient',\r\n radialgradient: 'radialGradient',\r\n};\r\nfunction getTagName(n) {\r\n let tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\r\n if (tagName === 'link' && n.attributes._cssText) {\r\n tagName = 'style';\r\n }\r\n return tagName;\r\n}\r\nfunction escapeRegExp(str) {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\nconst HOVER_SELECTOR = /([^\\\\]):hover/;\r\nconst HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\r\nfunction addHoverClass(cssText, cache) {\r\n const cachedStyle = cache?.stylesWithHoverClass.get(cssText);\r\n if (cachedStyle)\r\n return cachedStyle;\r\n if (cssText.length >= 1000000) {\r\n return cssText;\r\n }\r\n const ast = parse(cssText, {\r\n silent: true,\r\n });\r\n if (!ast.stylesheet) {\r\n return cssText;\r\n }\r\n const selectors = [];\r\n ast.stylesheet.rules.forEach((rule) => {\r\n if ('selectors' in rule) {\r\n (rule.selectors || []).forEach((selector) => {\r\n if (HOVER_SELECTOR.test(selector)) {\r\n selectors.push(selector);\r\n }\r\n });\r\n }\r\n });\r\n if (selectors.length === 0) {\r\n return cssText;\r\n }\r\n const selectorMatcher = new RegExp(selectors\r\n .filter((selector, index) => selectors.indexOf(selector) === index)\r\n .sort((a, b) => b.length - a.length)\r\n .map((selector) => {\r\n return escapeRegExp(selector);\r\n })\r\n .join('|'), 'g');\r\n const result = cssText.replace(selectorMatcher, (selector) => {\r\n const newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\r\n return `${selector}, ${newSelector}`;\r\n });\r\n cache?.stylesWithHoverClass.set(cssText, result);\r\n return result;\r\n}\r\nfunction createCache() {\r\n const stylesWithHoverClass = new Map();\r\n return {\r\n stylesWithHoverClass,\r\n };\r\n}\r\nfunction buildNode(n, options) {\r\n const { doc, hackCss, cache } = options;\r\n switch (n.type) {\r\n case NodeType.Document:\r\n return doc.implementation.createDocument(null, '', null);\r\n case NodeType.DocumentType:\r\n return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\r\n case NodeType.Element: {\r\n const tagName = getTagName(n);\r\n let node;\r\n if (n.isSVG) {\r\n node = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\r\n }\r\n else {\r\n if (n.isCustom &&\r\n doc.defaultView?.customElements &&\r\n !doc.defaultView.customElements.get(n.tagName))\r\n doc.defaultView.customElements.define(n.tagName, class extends doc.defaultView.HTMLElement {\r\n });\r\n node = doc.createElement(tagName);\r\n }\r\n const specialAttributes = {};\r\n for (const name in n.attributes) {\r\n if (!Object.prototype.hasOwnProperty.call(n.attributes, name)) {\r\n continue;\r\n }\r\n let value = n.attributes[name];\r\n if (tagName === 'option' &&\r\n name === 'selected' &&\r\n value === false) {\r\n continue;\r\n }\r\n if (value === null) {\r\n continue;\r\n }\r\n if (value === true)\r\n value = '';\r\n if (name.startsWith('rr_')) {\r\n specialAttributes[name] = value;\r\n continue;\r\n }\r\n const isTextarea = tagName === 'textarea' && name === 'value';\r\n const isRemoteOrDynamicCss = tagName === 'style' && name === '_cssText';\r\n if (isRemoteOrDynamicCss && hackCss && typeof value === 'string') {\r\n value = addHoverClass(value, cache);\r\n }\r\n if ((isTextarea || isRemoteOrDynamicCss) && typeof value === 'string') {\r\n const child = doc.createTextNode(value);\r\n for (const c of Array.from(node.childNodes)) {\r\n if (c.nodeType === node.TEXT_NODE) {\r\n node.removeChild(c);\r\n }\r\n }\r\n node.appendChild(child);\r\n continue;\r\n }\r\n try {\r\n if (n.isSVG && name === 'xlink:href') {\r\n node.setAttributeNS('http://www.w3.org/1999/xlink', name, value.toString());\r\n }\r\n else if (name === 'onload' ||\r\n name === 'onclick' ||\r\n name.substring(0, 7) === 'onmouse') {\r\n node.setAttribute('_' + name, value.toString());\r\n }\r\n else if (tagName === 'meta' &&\r\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\r\n name === 'content') {\r\n node.setAttribute('csp-content', value.toString());\r\n continue;\r\n }\r\n else if (tagName === 'link' &&\r\n (n.attributes.rel === 'preload' ||\r\n n.attributes.rel === 'modulepreload') &&\r\n n.attributes.as === 'script') {\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'prefetch' &&\r\n typeof n.attributes.href === 'string' &&\r\n n.attributes.href.endsWith('.js')) {\r\n }\r\n else if (tagName === 'img' &&\r\n n.attributes.srcset &&\r\n n.attributes.rr_dataURL) {\r\n node.setAttribute('rrweb-original-srcset', n.attributes.srcset);\r\n }\r\n else {\r\n node.setAttribute(name, value.toString());\r\n }\r\n }\r\n catch (error) {\r\n }\r\n }\r\n for (const name in specialAttributes) {\r\n const value = specialAttributes[name];\r\n if (tagName === 'canvas' && name === 'rr_dataURL') {\r\n const image = doc.createElement('img');\r\n image.onload = () => {\r\n const ctx = node.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(image, 0, 0, image.width, image.height);\r\n }\r\n };\r\n image.src = value.toString();\r\n if (node.RRNodeType)\r\n node.rr_dataURL = value.toString();\r\n }\r\n else if (tagName === 'img' && name === 'rr_dataURL') {\r\n const image = node;\r\n if (!image.currentSrc.startsWith('data:')) {\r\n image.setAttribute('rrweb-original-src', n.attributes.src);\r\n image.src = value.toString();\r\n }\r\n }\r\n if (name === 'rr_width') {\r\n node.style.setProperty('width', value.toString());\r\n }\r\n else if (name === 'rr_height') {\r\n node.style.setProperty('height', value.toString());\r\n }\r\n else if (name === 'rr_mediaCurrentTime' &&\r\n typeof value === 'number') {\r\n node.currentTime = value;\r\n }\r\n else if (name === 'rr_mediaState') {\r\n switch (value) {\r\n case 'played':\r\n node\r\n .play()\r\n .catch((e) => console.warn('media playback error', e));\r\n break;\r\n case 'paused':\r\n node.pause();\r\n break;\r\n }\r\n }\r\n }\r\n if (n.isShadowHost) {\r\n if (!node.shadowRoot) {\r\n node.attachShadow({ mode: 'open' });\r\n }\r\n else {\r\n while (node.shadowRoot.firstChild) {\r\n node.shadowRoot.removeChild(node.shadowRoot.firstChild);\r\n }\r\n }\r\n }\r\n return node;\r\n }\r\n case NodeType.Text:\r\n return doc.createTextNode(n.isStyle && hackCss\r\n ? addHoverClass(n.textContent, cache)\r\n : n.textContent);\r\n case NodeType.CDATA:\r\n return doc.createCDATASection(n.textContent);\r\n case NodeType.Comment:\r\n return doc.createComment(n.textContent);\r\n default:\r\n return null;\r\n }\r\n}\r\nfunction buildNodeWithSN(n, options) {\r\n const { doc, mirror, skipChild = false, hackCss = true, afterAppend, cache, } = options;\r\n if (mirror.has(n.id)) {\r\n const nodeInMirror = mirror.getNode(n.id);\r\n const meta = mirror.getMeta(nodeInMirror);\r\n if (isNodeMetaEqual(meta, n))\r\n return mirror.getNode(n.id);\r\n }\r\n let node = buildNode(n, { doc, hackCss, cache });\r\n if (!node) {\r\n return null;\r\n }\r\n if (n.rootId && mirror.getNode(n.rootId) !== doc) {\r\n mirror.replace(n.rootId, doc);\r\n }\r\n if (n.type === NodeType.Document) {\r\n doc.close();\r\n doc.open();\r\n if (n.compatMode === 'BackCompat' &&\r\n n.childNodes &&\r\n n.childNodes[0].type !== NodeType.DocumentType) {\r\n if (n.childNodes[0].type === NodeType.Element &&\r\n 'xmlns' in n.childNodes[0].attributes &&\r\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\r\n }\r\n else {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\r\n }\r\n }\r\n node = doc;\r\n }\r\n mirror.add(node, n);\r\n if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\r\n !skipChild) {\r\n for (const childN of n.childNodes) {\r\n const childNode = buildNodeWithSN(childN, {\r\n doc,\r\n mirror,\r\n skipChild: false,\r\n hackCss,\r\n afterAppend,\r\n cache,\r\n });\r\n if (!childNode) {\r\n console.warn('Failed to rebuild', childN);\r\n continue;\r\n }\r\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\r\n node.shadowRoot.appendChild(childNode);\r\n }\r\n else if (n.type === NodeType.Document &&\r\n childN.type == NodeType.Element) {\r\n const htmlElement = childNode;\r\n let body = null;\r\n htmlElement.childNodes.forEach((child) => {\r\n if (child.nodeName === 'BODY')\r\n body = child;\r\n });\r\n if (body) {\r\n htmlElement.removeChild(body);\r\n node.appendChild(childNode);\r\n htmlElement.appendChild(body);\r\n }\r\n else {\r\n node.appendChild(childNode);\r\n }\r\n }\r\n else {\r\n node.appendChild(childNode);\r\n }\r\n if (afterAppend) {\r\n afterAppend(childNode, childN.id);\r\n }\r\n }\r\n }\r\n return node;\r\n}\r\nfunction visit(mirror, onVisit) {\r\n function walk(node) {\r\n onVisit(node);\r\n }\r\n for (const id of mirror.getIds()) {\r\n if (mirror.has(id)) {\r\n walk(mirror.getNode(id));\r\n }\r\n }\r\n}\r\nfunction handleScroll(node, mirror) {\r\n const n = mirror.getMeta(node);\r\n if (n?.type !== NodeType.Element) {\r\n return;\r\n }\r\n const el = node;\r\n for (const name in n.attributes) {\r\n if (!(Object.prototype.hasOwnProperty.call(n.attributes, name) &&\r\n name.startsWith('rr_'))) {\r\n continue;\r\n }\r\n const value = n.attributes[name];\r\n if (name === 'rr_scrollLeft') {\r\n el.scrollLeft = value;\r\n }\r\n if (name === 'rr_scrollTop') {\r\n el.scrollTop = value;\r\n }\r\n }\r\n}\r\nfunction rebuild(n, options) {\r\n const { doc, onVisit, hackCss = true, afterAppend, cache, mirror = new Mirror(), } = options;\r\n const node = buildNodeWithSN(n, {\r\n doc,\r\n mirror,\r\n skipChild: false,\r\n hackCss,\r\n afterAppend,\r\n cache,\r\n });\r\n visit(mirror, (visitedNode) => {\r\n if (onVisit) {\r\n onVisit(visitedNode);\r\n }\r\n handleScroll(visitedNode, mirror);\r\n });\r\n return node;\r\n}\n\nexport { IGNORED_NODE, Mirror, NodeType, addHoverClass, buildNodeWithSN, classMatchesRegex, cleanupSnapshot, clearTimeout, createCache, createMatchPredicate, createMirror, distanceToMatch, escapeImportStatement, extractFileExtension, fixSafariColons, genId, getInputType, getInputValue, ignoreAttribute, is2DCanvasBlank, isCSSImportRule, isCSSStyleRule, isElement, isNativeShadowDom, isNodeMetaEqual, isShadowRoot, maskInputValue, needMaskingText, onRequestAnimationFrame, rebuild, serializeNodeWithId, setTimeout, shouldMaskInput, snapshot, stringifyRule, stringifyStylesheet, toLowerCase, toUpperCase, transformAttribute, visitSnapshot };\n","// Note that these are the serialized attributes and not attributes directly on\n// the DOM Node. Attributes we are interested in:\nconst ATTRIBUTES_TO_RECORD = new Set([\n 'id',\n 'class',\n 'aria-label',\n 'role',\n 'name',\n 'alt',\n 'title',\n 'data-test-id',\n 'data-testid',\n 'disabled',\n 'aria-disabled',\n 'data-sentry-component',\n]);\n\n/**\n * Inclusion list of attributes that we want to record from the DOM element\n */\nexport function getAttributesToRecord(attributes: Record<string, unknown>): Record<string, unknown> {\n const obj: Record<string, unknown> = {};\n if (!attributes['data-sentry-component'] && attributes['data-sentry-element']) {\n attributes['data-sentry-component'] = attributes['data-sentry-element'];\n }\n for (const key in attributes) {\n if (ATTRIBUTES_TO_RECORD.has(key)) {\n let normalizedKey = key;\n\n if (key === 'data-testid' || key === 'data-test-id') {\n normalizedKey = 'testId';\n }\n\n obj[normalizedKey] = attributes[key];\n }\n }\n\n return obj;\n}\n","import { record } from '@sentry-internal/rrweb';\nimport type { serializedElementNodeWithId, serializedNodeWithId } from '@sentry-internal/rrweb-snapshot';\nimport { NodeType } from '@sentry-internal/rrweb-snapshot';\nimport { htmlTreeAsString } from '@sentry/core';\nimport type { Breadcrumb, HandlerDataDom } from '@sentry/core';\n\nimport type { ReplayContainer } from '../types';\nimport { createBreadcrumb } from '../util/createBreadcrumb';\nimport { handleClick } from './handleClick';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\nimport { getClickTargetNode, getTargetNode } from './util/domUtils';\nimport { getAttributesToRecord } from './util/getAttributesToRecord';\n\nexport const handleDomListener: (replay: ReplayContainer) => (handlerData: HandlerDataDom) => void = (\n replay: ReplayContainer,\n) => {\n return (handlerData: HandlerDataDom): void => {\n if (!replay.isEnabled()) {\n return;\n }\n\n const result = handleDom(handlerData);\n\n if (!result) {\n return;\n }\n\n const isClick = handlerData.name === 'click';\n const event = isClick ? (handlerData.event as PointerEvent) : undefined;\n // Ignore clicks if ctrl/alt/meta/shift keys are held down as they alter behavior of clicks (e.g. open in new tab)\n if (\n isClick &&\n replay.clickDetector &&\n event &&\n event.target &&\n !event.altKey &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey\n ) {\n handleClick(\n replay.clickDetector,\n result as Breadcrumb & { timestamp: number; data: { nodeId: number } },\n getClickTargetNode(handlerData.event as Event) as HTMLElement,\n );\n }\n\n addBreadcrumbEvent(replay, result);\n };\n};\n\n/** Get the base DOM breadcrumb. */\nexport function getBaseDomBreadcrumb(target: Node | null, message: string): Breadcrumb {\n const nodeId = record.mirror.getId(target);\n const node = nodeId && record.mirror.getNode(nodeId);\n const meta = node && record.mirror.getMeta(node);\n const element = meta && isElement(meta) ? meta : null;\n\n return {\n message,\n data: element\n ? {\n nodeId,\n node: {\n id: nodeId,\n tagName: element.tagName,\n textContent: Array.from(element.childNodes)\n .map((node: serializedNodeWithId) => node.type === NodeType.Text && node.textContent)\n .filter(Boolean) // filter out empty values\n .map(text => (text as string).trim())\n .join(''),\n attributes: getAttributesToRecord(element.attributes),\n },\n }\n : {},\n };\n}\n\n/**\n * An event handler to react to DOM events.\n * Exported for tests.\n */\nexport function handleDom(handlerData: HandlerDataDom): Breadcrumb | null {\n const { target, message } = getDomTarget(handlerData);\n\n return createBreadcrumb({\n category: `ui.${handlerData.name}`,\n ...getBaseDomBreadcrumb(target, message),\n });\n}\n\nfunction getDomTarget(handlerData: HandlerDataDom): { target: Node | null; message: string } {\n const isClick = handlerData.name === 'click';\n\n let message: string | undefined;\n let target: Node | null = null;\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = isClick ? getClickTargetNode(handlerData.event as Event) : getTargetNode(handlerData.event as Event);\n message = htmlTreeAsString(target, { maxStringLength: 200 }) || '<unknown>';\n } catch (e) {\n message = '<unknown>';\n }\n\n return { target, message };\n}\n\nfunction isElement(node: serializedNodeWithId): node is serializedElementNodeWithId {\n return node.type === NodeType.Element;\n}\n","import { htmlTreeAsString } from '@sentry/core';\nimport type { Breadcrumb } from '@sentry/core';\n\nimport type { ReplayContainer } from '../types';\nimport { createBreadcrumb } from '../util/createBreadcrumb';\nimport { getBaseDomBreadcrumb } from './handleDom';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\n\n/** Handle keyboard events & create breadcrumbs. */\nexport function handleKeyboardEvent(replay: ReplayContainer, event: KeyboardEvent): void {\n if (!replay.isEnabled()) {\n return;\n }\n\n // Update user activity, but do not restart recording as it can create\n // noisy/low-value replays (e.g. user comes back from idle, hits alt-tab, new\n // session with a single \"keydown\" breadcrumb is created)\n replay.updateUserActivity();\n\n const breadcrumb = getKeyboardBreadcrumb(event);\n\n if (!breadcrumb) {\n return;\n }\n\n addBreadcrumbEvent(replay, breadcrumb);\n}\n\n/** exported only for tests */\nexport function getKeyboardBreadcrumb(event: KeyboardEvent): Breadcrumb | null {\n const { metaKey, shiftKey, ctrlKey, altKey, key, target } = event;\n\n // never capture for input fields\n if (!target || isInputElement(target as HTMLElement) || !key) {\n return null;\n }\n\n // Note: We do not consider shift here, as that means \"uppercase\"\n const hasModifierKey = metaKey || ctrlKey || altKey;\n const isCharacterKey = key.length === 1; // other keys like Escape, Tab, etc have a longer length\n\n // Do not capture breadcrumb if only a word key is pressed\n // This could leak e.g. user input\n if (!hasModifierKey && isCharacterKey) {\n return null;\n }\n\n const message = htmlTreeAsString(target, { maxStringLength: 200 }) || '<unknown>';\n const baseBreadcrumb = getBaseDomBreadcrumb(target as Node, message);\n\n return createBreadcrumb({\n category: 'ui.keyDown',\n message,\n data: {\n ...baseBreadcrumb.data,\n metaKey,\n shiftKey,\n ctrlKey,\n altKey,\n key,\n },\n });\n}\n\nfunction isInputElement(target: HTMLElement): boolean {\n return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n}\n","import { record } from '@sentry-internal/rrweb';\nimport { browserPerformanceTimeOrigin } from '@sentry/core';\n\nimport { WINDOW } from '../constants';\nimport type {\n AllPerformanceEntry,\n AllPerformanceEntryData,\n ExperimentalPerformanceResourceTiming,\n NavigationData,\n PaintData,\n ReplayContainer,\n ReplayPerformanceEntry,\n ResourceData,\n WebVitalData,\n} from '../types';\n\n// Map entryType -> function to normalize data for event\nconst ENTRY_TYPES: Record<\n string,\n (entry: AllPerformanceEntry) => null | ReplayPerformanceEntry<AllPerformanceEntryData>\n> = {\n // @ts-expect-error TODO: entry type does not fit the create* functions entry type\n resource: createResourceEntry,\n paint: createPaintEntry,\n // @ts-expect-error TODO: entry type does not fit the create* functions entry type\n navigation: createNavigationEntry,\n};\n\nexport interface Metric {\n /**\n * The current value of the metric.\n */\n value: number;\n\n /**\n * The rating as to whether the metric value is within the \"good\",\n * \"needs improvement\", or \"poor\" thresholds of the metric.\n */\n rating: 'good' | 'needs-improvement' | 'poor';\n\n /**\n * Any performance entries relevant to the metric value calculation.\n * The array may also be empty if the metric value was not based on any\n * entries (e.g. a CLS value of 0 given no layout shifts).\n */\n entries: PerformanceEntry[] | LayoutShift[];\n}\n\ninterface LayoutShift extends PerformanceEntry {\n value: number;\n sources: LayoutShiftAttribution[];\n hadRecentInput: boolean;\n}\n\ninterface LayoutShiftAttribution {\n node?: Node;\n previousRect: DOMRectReadOnly;\n currentRect: DOMRectReadOnly;\n}\n\n/**\n * Handler creater for web vitals\n */\nexport function webVitalHandler(\n getter: (metric: Metric) => ReplayPerformanceEntry<AllPerformanceEntryData>,\n replay: ReplayContainer,\n): (data: { metric: Metric }) => void {\n return ({ metric }) => void replay.replayPerformanceEntries.push(getter(metric));\n}\n\n/**\n * Create replay performance entries from the browser performance entries.\n */\nexport function createPerformanceEntries(\n entries: AllPerformanceEntry[],\n): ReplayPerformanceEntry<AllPerformanceEntryData>[] {\n return entries.map(createPerformanceEntry).filter(Boolean) as ReplayPerformanceEntry<AllPerformanceEntryData>[];\n}\n\nfunction createPerformanceEntry(entry: AllPerformanceEntry): ReplayPerformanceEntry<AllPerformanceEntryData> | null {\n const entryType = ENTRY_TYPES[entry.entryType];\n if (!entryType) {\n return null;\n }\n\n return entryType(entry);\n}\n\nfunction getAbsoluteTime(time: number): number {\n // browserPerformanceTimeOrigin can be undefined if `performance` or\n // `performance.now` doesn't exist, but this is already checked by this integration\n return ((browserPerformanceTimeOrigin || WINDOW.performance.timeOrigin) + time) / 1000;\n}\n\nfunction createPaintEntry(entry: PerformancePaintTiming): ReplayPerformanceEntry<PaintData> {\n const { duration, entryType, name, startTime } = entry;\n\n const start = getAbsoluteTime(startTime);\n return {\n type: entryType,\n name,\n start,\n end: start + duration,\n data: undefined,\n };\n}\n\nfunction createNavigationEntry(entry: PerformanceNavigationTiming): ReplayPerformanceEntry<NavigationData> | null {\n const {\n entryType,\n name,\n decodedBodySize,\n duration,\n domComplete,\n encodedBodySize,\n domContentLoadedEventStart,\n domContentLoadedEventEnd,\n domInteractive,\n loadEventStart,\n loadEventEnd,\n redirectCount,\n startTime,\n transferSize,\n type,\n } = entry;\n\n // Ignore entries with no duration, they do not seem to be useful and cause dupes\n if (duration === 0) {\n return null;\n }\n\n return {\n type: `${entryType}.${type}`,\n start: getAbsoluteTime(startTime),\n end: getAbsoluteTime(domComplete),\n name,\n data: {\n size: transferSize,\n decodedBodySize,\n encodedBodySize,\n duration,\n domInteractive,\n domContentLoadedEventStart,\n domContentLoadedEventEnd,\n loadEventStart,\n loadEventEnd,\n domComplete,\n redirectCount,\n },\n };\n}\n\nfunction createResourceEntry(\n entry: ExperimentalPerformanceResourceTiming,\n): ReplayPerformanceEntry<ResourceData> | null {\n const {\n entryType,\n initiatorType,\n name,\n responseEnd,\n startTime,\n decodedBodySize,\n encodedBodySize,\n responseStatus,\n transferSize,\n } = entry;\n\n // Core SDK handles these\n if (['fetch', 'xmlhttprequest'].includes(initiatorType)) {\n return null;\n }\n\n return {\n type: `${entryType}.${initiatorType}`,\n start: getAbsoluteTime(startTime),\n end: getAbsoluteTime(responseEnd),\n name,\n data: {\n size: transferSize,\n statusCode: responseStatus,\n decodedBodySize,\n encodedBodySize,\n },\n };\n}\n\n/**\n * Add a LCP event to the replay based on a LCP metric.\n */\nexport function getLargestContentfulPaint(metric: Metric): ReplayPerformanceEntry<WebVitalData> {\n const lastEntry = metric.entries[metric.entries.length - 1] as (PerformanceEntry & { element?: Node }) | undefined;\n const node = lastEntry && lastEntry.element ? [lastEntry.element] : undefined;\n return getWebVital(metric, 'largest-contentful-paint', node);\n}\n\nfunction isLayoutShift(entry: PerformanceEntry): entry is LayoutShift {\n return (entry as LayoutShift).sources !== undefined;\n}\n\n/**\n * Add a CLS event to the replay based on a CLS metric.\n */\nexport function getCumulativeLayoutShift(metric: Metric): ReplayPerformanceEntry<WebVitalData> {\n const layoutShifts: WebVitalData['attributions'] = [];\n const nodes: Node[] = [];\n for (const entry of metric.entries) {\n if (isLayoutShift(entry)) {\n const nodeIds = [];\n for (const source of entry.sources) {\n if (source.node) {\n nodes.push(source.node);\n const nodeId = record.mirror.getId(source.node);\n if (nodeId) {\n nodeIds.push(nodeId);\n }\n }\n }\n layoutShifts.push({ value: entry.value, nodeIds: nodeIds.length ? nodeIds : undefined });\n }\n }\n\n return getWebVital(metric, 'cumulative-layout-shift', nodes, layoutShifts);\n}\n\n/**\n * Add a FID event to the replay based on a FID metric.\n */\nexport function getFirstInputDelay(metric: Metric): ReplayPerformanceEntry<WebVitalData> {\n const lastEntry = metric.entries[metric.entries.length - 1] as (PerformanceEntry & { target?: Node }) | undefined;\n const node = lastEntry && lastEntry.target ? [lastEntry.target] : undefined;\n return getWebVital(metric, 'first-input-delay', node);\n}\n\n/**\n * Add an INP event to the replay based on an INP metric.\n */\nexport function getInteractionToNextPaint(metric: Metric): ReplayPerformanceEntry<WebVitalData> {\n const lastEntry = metric.entries[metric.entries.length - 1] as (PerformanceEntry & { target?: Node }) | undefined;\n const node = lastEntry && lastEntry.target ? [lastEntry.target] : undefined;\n return getWebVital(metric, 'interaction-to-next-paint', node);\n}\n\n/**\n * Add an web vital event to the replay based on the web vital metric.\n */\nfunction getWebVital(\n metric: Metric,\n name: string,\n nodes: Node[] | undefined,\n attributions?: WebVitalData['attributions'],\n): ReplayPerformanceEntry<WebVitalData> {\n const value = metric.value;\n const rating = metric.rating;\n\n const end = getAbsoluteTime(value);\n\n return {\n type: 'web-vital',\n name,\n start: end,\n end,\n data: {\n value,\n size: value,\n rating,\n nodeIds: nodes ? nodes.map(node => record.mirror.getId(node)) : undefined,\n attributions,\n },\n };\n}\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import type { ConsoleLevel, SeverityLevel } from '@sentry/core';\nimport { addBreadcrumb, captureException, logger as coreLogger, severityLevelFromString } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\n\ntype ReplayConsoleLevels = Extract<ConsoleLevel, 'info' | 'warn' | 'error' | 'log'>;\nconst CONSOLE_LEVELS: readonly ReplayConsoleLevels[] = ['info', 'warn', 'error', 'log'] as const;\nconst PREFIX = '[Replay] ';\n\ntype LoggerMethod = (...args: unknown[]) => void;\ntype LoggerConsoleMethods = Record<ReplayConsoleLevels, LoggerMethod>;\n\ninterface LoggerConfig {\n captureExceptions: boolean;\n traceInternals: boolean;\n}\n\ninterface ReplayLogger extends LoggerConsoleMethods {\n /**\n * Calls `logger.info` but saves breadcrumb in the next tick due to race\n * conditions before replay is initialized.\n */\n infoTick: LoggerMethod;\n /**\n * Captures exceptions (`Error`) if \"capture internal exceptions\" is enabled\n */\n exception: LoggerMethod;\n /**\n * Configures the logger with additional debugging behavior\n */\n setConfig(config: LoggerConfig): void;\n}\n\nfunction _addBreadcrumb(message: unknown, level: SeverityLevel = 'info'): void {\n addBreadcrumb(\n {\n category: 'console',\n data: {\n logger: 'replay',\n },\n level,\n message: `${PREFIX}${message}`,\n },\n { level },\n );\n}\n\nfunction makeReplayLogger(): ReplayLogger {\n let _capture = false;\n let _trace = false;\n\n const _logger: Partial<ReplayLogger> = {\n exception: () => undefined,\n infoTick: () => undefined,\n setConfig: (opts: LoggerConfig) => {\n _capture = opts.captureExceptions;\n _trace = opts.traceInternals;\n },\n };\n\n if (DEBUG_BUILD) {\n CONSOLE_LEVELS.forEach(name => {\n _logger[name] = (...args: unknown[]) => {\n coreLogger[name](PREFIX, ...args);\n if (_trace) {\n _addBreadcrumb(args.join(''), severityLevelFromString(name));\n }\n };\n });\n\n _logger.exception = (error: unknown, ...message: unknown[]) => {\n if (message.length && _logger.error) {\n _logger.error(...message);\n }\n\n coreLogger.error(PREFIX, error);\n\n if (_capture) {\n captureException(error);\n } else if (_trace) {\n // No need for a breadcrumb if `_capture` is enabled since it should be\n // captured as an exception\n _addBreadcrumb(error, 'error');\n }\n };\n\n _logger.infoTick = (...args: unknown[]) => {\n coreLogger.info(PREFIX, ...args);\n if (_trace) {\n // Wait a tick here to avoid race conditions for some initial logs\n // which may be added before replay is initialized\n setTimeout(() => _addBreadcrumb(args[0]), 0);\n }\n };\n } else {\n CONSOLE_LEVELS.forEach(name => {\n _logger[name] = () => undefined;\n });\n }\n\n return _logger as ReplayLogger;\n}\n\nexport const logger = makeReplayLogger();\n","import { REPLAY_MAX_EVENT_BUFFER_SIZE } from '../constants';\n\n/** This error indicates that the event buffer size exceeded the limit.. */\nexport class EventBufferSizeExceededError extends Error {\n public constructor() {\n super(`Event buffer exceeded maximum size of ${REPLAY_MAX_EVENT_BUFFER_SIZE}.`);\n }\n}\n","import { REPLAY_MAX_EVENT_BUFFER_SIZE } from '../constants';\nimport type { AddEventResult, EventBuffer, EventBufferType, RecordingEvent } from '../types';\nimport { timestampToMs } from '../util/timestamp';\nimport { EventBufferSizeExceededError } from './error';\n\n/**\n * A basic event buffer that does not do any compression.\n * Used as fallback if the compression worker cannot be loaded or is disabled.\n */\nexport class EventBufferArray implements EventBuffer {\n /** All the events that are buffered to be sent. */\n public events: RecordingEvent[];\n\n /** @inheritdoc */\n public hasCheckout: boolean;\n\n /** @inheritdoc */\n public waitForCheckout: boolean;\n\n private _totalSize: number;\n\n public constructor() {\n this.events = [];\n this._totalSize = 0;\n this.hasCheckout = false;\n this.waitForCheckout = false;\n }\n\n /** @inheritdoc */\n public get hasEvents(): boolean {\n return this.events.length > 0;\n }\n\n /** @inheritdoc */\n public get type(): EventBufferType {\n return 'sync';\n }\n\n /** @inheritdoc */\n public destroy(): void {\n this.events = [];\n }\n\n /** @inheritdoc */\n public async addEvent(event: RecordingEvent): Promise<AddEventResult> {\n const eventSize = JSON.stringify(event).length;\n this._totalSize += eventSize;\n if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) {\n throw new EventBufferSizeExceededError();\n }\n\n this.events.push(event);\n }\n\n /** @inheritdoc */\n public finish(): Promise<string> {\n return new Promise<string>(resolve => {\n // Make a copy of the events array reference and immediately clear the\n // events member so that we do not lose new events while uploading\n // attachment.\n const eventsRet = this.events;\n this.clear();\n resolve(JSON.stringify(eventsRet));\n });\n }\n\n /** @inheritdoc */\n public clear(): void {\n this.events = [];\n this._totalSize = 0;\n this.hasCheckout = false;\n }\n\n /** @inheritdoc */\n public getEarliestTimestamp(): number | null {\n const timestamp = this.events.map(event => event.timestamp).sort()[0];\n\n if (!timestamp) {\n return null;\n }\n\n return timestampToMs(timestamp);\n }\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { WorkerRequest, WorkerResponse } from '../types';\nimport { logger } from '../util/logger';\n\n/**\n * Event buffer that uses a web worker to compress events.\n * Exported only for testing.\n */\nexport class WorkerHandler {\n private _worker: Worker;\n private _id: number;\n private _ensureReadyPromise?: Promise<void>;\n\n public constructor(worker: Worker) {\n this._worker = worker;\n this._id = 0;\n }\n\n /**\n * Ensure the worker is ready (or not).\n * This will either resolve when the worker is ready, or reject if an error occurred.\n */\n public ensureReady(): Promise<void> {\n // Ensure we only check once\n if (this._ensureReadyPromise) {\n return this._ensureReadyPromise;\n }\n\n this._ensureReadyPromise = new Promise((resolve, reject) => {\n this._worker.addEventListener(\n 'message',\n ({ data }: MessageEvent) => {\n if ((data as WorkerResponse).success) {\n resolve();\n } else {\n reject();\n }\n },\n { once: true },\n );\n\n this._worker.addEventListener(\n 'error',\n error => {\n reject(error);\n },\n { once: true },\n );\n });\n\n return this._ensureReadyPromise;\n }\n\n /**\n * Destroy the worker.\n */\n public destroy(): void {\n DEBUG_BUILD && logger.info('Destroying compression worker');\n this._worker.terminate();\n }\n\n /**\n * Post message to worker and wait for response before resolving promise.\n */\n public postMessage<T>(method: WorkerRequest['method'], arg?: WorkerRequest['arg']): Promise<T> {\n const id = this._getAndIncrementId();\n\n return new Promise((resolve, reject) => {\n const listener = ({ data }: MessageEvent): void => {\n const response = data as WorkerResponse;\n if (response.method !== method) {\n return;\n }\n\n // There can be multiple listeners for a single method, the id ensures\n // that the response matches the caller.\n if (response.id !== id) {\n return;\n }\n\n // At this point, we'll always want to remove listener regardless of result status\n this._worker.removeEventListener('message', listener);\n\n if (!response.success) {\n // TODO: Do some error handling, not sure what\n DEBUG_BUILD && logger.error('Error in compression worker: ', response.response);\n\n reject(new Error('Error in compression worker'));\n return;\n }\n\n resolve(response.response as T);\n };\n\n // Note: we can't use `once` option because it's possible it needs to\n // listen to multiple messages\n this._worker.addEventListener('message', listener);\n this._worker.postMessage({ id, method, arg });\n });\n }\n\n /** Get the current ID and increment it for the next call. */\n private _getAndIncrementId(): number {\n return this._id++;\n }\n}\n","import type { ReplayRecordingData } from '@sentry/core';\n\nimport { REPLAY_MAX_EVENT_BUFFER_SIZE } from '../constants';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { AddEventResult, EventBuffer, EventBufferType, RecordingEvent } from '../types';\nimport { logger } from '../util/logger';\nimport { timestampToMs } from '../util/timestamp';\nimport { WorkerHandler } from './WorkerHandler';\nimport { EventBufferSizeExceededError } from './error';\n\n/**\n * Event buffer that uses a web worker to compress events.\n * Exported only for testing.\n */\nexport class EventBufferCompressionWorker implements EventBuffer {\n /** @inheritdoc */\n public hasCheckout: boolean;\n\n /** @inheritdoc */\n public waitForCheckout: boolean;\n\n private _worker: WorkerHandler;\n private _earliestTimestamp: number | null;\n private _totalSize;\n\n public constructor(worker: Worker) {\n this._worker = new WorkerHandler(worker);\n this._earliestTimestamp = null;\n this._totalSize = 0;\n this.hasCheckout = false;\n this.waitForCheckout = false;\n }\n\n /** @inheritdoc */\n public get hasEvents(): boolean {\n return !!this._earliestTimestamp;\n }\n\n /** @inheritdoc */\n public get type(): EventBufferType {\n return 'worker';\n }\n\n /**\n * Ensure the worker is ready (or not).\n * This will either resolve when the worker is ready, or reject if an error occurred.\n */\n public ensureReady(): Promise<void> {\n return this._worker.ensureReady();\n }\n\n /**\n * Destroy the event buffer.\n */\n public destroy(): void {\n this._worker.destroy();\n }\n\n /**\n * Add an event to the event buffer.\n *\n * Returns true if event was successfully received and processed by worker.\n */\n public addEvent(event: RecordingEvent): Promise<AddEventResult> {\n const timestamp = timestampToMs(event.timestamp);\n if (!this._earliestTimestamp || timestamp < this._earliestTimestamp) {\n this._earliestTimestamp = timestamp;\n }\n\n const data = JSON.stringify(event);\n this._totalSize += data.length;\n\n if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) {\n return Promise.reject(new EventBufferSizeExceededError());\n }\n\n return this._sendEventToWorker(data);\n }\n\n /**\n * Finish the event buffer and return the compressed data.\n */\n public finish(): Promise<ReplayRecordingData> {\n return this._finishRequest();\n }\n\n /** @inheritdoc */\n public clear(): void {\n this._earliestTimestamp = null;\n this._totalSize = 0;\n this.hasCheckout = false;\n\n // We do not wait on this, as we assume the order of messages is consistent for the worker\n this._worker.postMessage('clear').then(null, e => {\n DEBUG_BUILD && logger.exception(e, 'Sending \"clear\" message to worker failed', e);\n });\n }\n\n /** @inheritdoc */\n public getEarliestTimestamp(): number | null {\n return this._earliestTimestamp;\n }\n\n /**\n * Send the event to the worker.\n */\n private _sendEventToWorker(data: string): Promise<AddEventResult> {\n return this._worker.postMessage<void>('addEvent', data);\n }\n\n /**\n * Finish the request and return the compressed data from the worker.\n */\n private async _finishRequest(): Promise<Uint8Array> {\n const response = await this._worker.postMessage<Uint8Array>('finish');\n\n this._earliestTimestamp = null;\n this._totalSize = 0;\n\n return response;\n }\n}\n","import type { ReplayRecordingData } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { AddEventResult, EventBuffer, EventBufferType, RecordingEvent } from '../types';\nimport { logger } from '../util/logger';\nimport { EventBufferArray } from './EventBufferArray';\nimport { EventBufferCompressionWorker } from './EventBufferCompressionWorker';\n\n/**\n * This proxy will try to use the compression worker, and fall back to use the simple buffer if an error occurs there.\n * This can happen e.g. if the worker cannot be loaded.\n * Exported only for testing.\n */\nexport class EventBufferProxy implements EventBuffer {\n private _fallback: EventBufferArray;\n private _compression: EventBufferCompressionWorker;\n private _used: EventBuffer;\n private _ensureWorkerIsLoadedPromise: Promise<void>;\n\n public constructor(worker: Worker) {\n this._fallback = new EventBufferArray();\n this._compression = new EventBufferCompressionWorker(worker);\n this._used = this._fallback;\n\n this._ensureWorkerIsLoadedPromise = this._ensureWorkerIsLoaded();\n }\n\n /** @inheritdoc */\n public get waitForCheckout(): boolean {\n return this._used.waitForCheckout;\n }\n\n /** @inheritdoc */\n public get type(): EventBufferType {\n return this._used.type;\n }\n\n /** @inheritDoc */\n public get hasEvents(): boolean {\n return this._used.hasEvents;\n }\n\n /** @inheritdoc */\n public get hasCheckout(): boolean {\n return this._used.hasCheckout;\n }\n /** @inheritdoc */\n public set hasCheckout(value: boolean) {\n this._used.hasCheckout = value;\n }\n\n /** @inheritdoc */\n // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures\n public set waitForCheckout(value: boolean) {\n this._used.waitForCheckout = value;\n }\n\n /** @inheritDoc */\n public destroy(): void {\n this._fallback.destroy();\n this._compression.destroy();\n }\n\n /** @inheritdoc */\n public clear(): void {\n return this._used.clear();\n }\n\n /** @inheritdoc */\n public getEarliestTimestamp(): number | null {\n return this._used.getEarliestTimestamp();\n }\n\n /**\n * Add an event to the event buffer.\n *\n * Returns true if event was successfully added.\n */\n public addEvent(event: RecordingEvent): Promise<AddEventResult> {\n return this._used.addEvent(event);\n }\n\n /** @inheritDoc */\n public async finish(): Promise<ReplayRecordingData> {\n // Ensure the worker is loaded, so the sent event is compressed\n await this.ensureWorkerIsLoaded();\n\n return this._used.finish();\n }\n\n /** Ensure the worker has loaded. */\n public ensureWorkerIsLoaded(): Promise<void> {\n return this._ensureWorkerIsLoadedPromise;\n }\n\n /** Actually check if the worker has been loaded. */\n private async _ensureWorkerIsLoaded(): Promise<void> {\n try {\n await this._compression.ensureReady();\n } catch (error) {\n // If the worker fails to load, we fall back to the simple buffer.\n // Nothing more to do from our side here\n DEBUG_BUILD && logger.exception(error, 'Failed to load the compression worker, falling back to simple buffer');\n return;\n }\n\n // Now we need to switch over the array buffer to the compression worker\n await this._switchToCompressionWorker();\n }\n\n /** Switch the used buffer to the compression worker. */\n private async _switchToCompressionWorker(): Promise<void> {\n const { events, hasCheckout, waitForCheckout } = this._fallback;\n\n const addEventPromises: Promise<void>[] = [];\n for (const event of events) {\n addEventPromises.push(this._compression.addEvent(event));\n }\n\n this._compression.hasCheckout = hasCheckout;\n this._compression.waitForCheckout = waitForCheckout;\n\n // We switch over to the new buffer immediately - any further events will be added\n // after the previously buffered ones\n this._used = this._compression;\n\n // Wait for original events to be re-added before resolving\n try {\n await Promise.all(addEventPromises);\n\n // Can now clear fallback buffer as it's no longer necessary\n this._fallback.clear();\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to add events when switching buffers.');\n }\n }\n}\n","import { getWorkerURL } from '@sentry-internal/replay-worker';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { EventBuffer } from '../types';\nimport { logger } from '../util/logger';\nimport { EventBufferArray } from './EventBufferArray';\nimport { EventBufferProxy } from './EventBufferProxy';\n\ninterface CreateEventBufferParams {\n useCompression: boolean;\n workerUrl?: string;\n}\n\n// Treeshakable guard to remove the code of the included compression worker\ndeclare const __SENTRY_EXCLUDE_REPLAY_WORKER__: boolean;\n\n/**\n * Create an event buffer for replays.\n */\nexport function createEventBuffer({\n useCompression,\n workerUrl: customWorkerUrl,\n}: CreateEventBufferParams): EventBuffer {\n if (\n useCompression &&\n // eslint-disable-next-line no-restricted-globals\n window.Worker\n ) {\n const worker = _loadWorker(customWorkerUrl);\n\n if (worker) {\n return worker;\n }\n }\n\n DEBUG_BUILD && logger.info('Using simple buffer');\n return new EventBufferArray();\n}\n\nfunction _loadWorker(customWorkerUrl?: string): EventBufferProxy | void {\n try {\n const workerUrl = customWorkerUrl || _getWorkerUrl();\n\n if (!workerUrl) {\n return;\n }\n\n DEBUG_BUILD && logger.info(`Using compression worker${customWorkerUrl ? ` from ${customWorkerUrl}` : ''}`);\n const worker = new Worker(workerUrl);\n return new EventBufferProxy(worker);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to create compression worker');\n // Fall back to use simple event buffer array\n }\n}\n\nfunction _getWorkerUrl(): string {\n if (typeof __SENTRY_EXCLUDE_REPLAY_WORKER__ === 'undefined' || !__SENTRY_EXCLUDE_REPLAY_WORKER__) {\n return getWorkerURL();\n }\n\n return '';\n}\n","import r from\"./worker\";function e(){const e=new Blob([r]);return URL.createObjectURL(e)}export{e as getWorkerURL};\n","export default `var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,e){for(var i=new n(31),a=0;a<31;++a)i[a]=e+=1<<t[a-1];var s=new r(i[30]);for(a=1;a<30;++a)for(var o=i[a];o<i[a+1];++o)s[o]=o-i[a]<<5|a;return{b:i,r:s}},o=s(e,2),f=o.b,h=o.r;f[28]=258,h[258]=28;for(var l=s(i,0).r,u=new n(32768),c=0;c<32768;++c){var v=(43690&c)>>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,a=0,s=new n(r);a<i;++a)t[a]&&++s[t[a]-1];var o,f=new n(r);for(a=1;a<r;++a)f[a]=f[a-1]+s[a-1]<<1;if(e){o=new n(1<<r);var h=15-r;for(a=0;a<i;++a)if(t[a])for(var l=a<<4|t[a],c=r-t[a],v=f[t[a]-1]++<<c,d=v|(1<<c)-1;v<=d;++v)o[u[v]>>h]=l}else for(o=new n(i),a=0;a<i;++a)t[a]&&(o[a]=u[f[t[a]-1]++]>>15-t[a]);return o},g=new t(288);for(c=0;c<144;++c)g[c]=8;for(c=144;c<256;++c)g[c]=9;for(c=256;c<280;++c)g[c]=7;for(c=280;c<288;++c)g[c]=8;var w=new t(32);for(c=0;c<32;++c)w[c]=5;var p=d(g,9,0),y=d(w,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},_=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},x=function(r,e){for(var i=[],a=0;a<r.length;++a)r[a]&&i.push({s:a,f:r[a]});var s=i.length,o=i.slice();if(!s)return{t:F,l:0};if(1==s){var f=new t(i[0].s+1);return f[i[0].s]=1,{t:f,l:1}}i.sort((function(t,n){return t.f-n.f})),i.push({s:-1,f:25001});var h=i[0],l=i[1],u=0,c=1,v=2;for(i[0]={s:-1,f:h.f+l.f,l:h,r:l};c!=s-1;)h=i[i[u].f<i[v].f?u++:v++],l=i[u!=c&&i[u].f<i[v].f?u++:v++],i[c++]={s:-1,f:h.f+l.f,l:h,r:l};var d=o[0].s;for(a=1;a<s;++a)o[a].s>d&&(d=o[a].s);var g=new n(d+1),w=A(i[c-1],g,0);if(w>e){a=0;var p=0,y=w-e,m=1<<y;for(o.sort((function(t,n){return g[n.s]-g[t.s]||t.f-n.f}));a<s;++a){var b=o[a].s;if(!(g[b]>e))break;p+=m-(1<<w-g[b]),g[b]=e}for(p>>=y;p>0;){var M=o[a].s;g[M]<e?p-=1<<e-g[M]++-1:++a}for(;a>=0&&p;--a){var E=o[a].s;g[E]==e&&(--g[E],++p)}w=e}return{t:new t(g),l:w}},A=function(t,n,r){return-1==t.s?Math.max(A(t.l,n,r+1),A(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,a=t[0],s=1,o=function(t){e[i++]=t},f=1;f<=r;++f)if(t[f]==a&&f!=r)++s;else{if(!a&&s>2){for(;s>138;s-=138)o(32754);s>2&&(o(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(o(a),--s;s>6;s-=6)o(8304);s>2&&(o(s-3<<5|8208),s=0)}for(;s--;)o(a);s=1,a=t[f]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e<n.length;++e)r+=t[e]*n[e];return r},k=function(t,n,r){var e=r.length,i=m(n+2);t[i]=255&e,t[i+1]=e>>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a<e;++a)t[i+a+4]=r[a];return 8*(i+4+e)},U=function(t,r,s,o,f,h,l,u,c,v,m){z(r,m++,s),++f[256];for(var b=x(f,15),M=b.t,E=b.l,A=x(h,15),U=A.t,C=A.l,F=D(M),I=F.c,S=F.n,L=D(U),O=L.c,j=L.n,q=new n(19),B=0;B<I.length;++B)++q[31&I[B]];for(B=0;B<O.length;++B)++q[31&O[B]];for(var G=x(q,7),H=G.t,J=G.l,K=19;K>4&&!H[a[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(f,g)+T(h,w)+l,X=T(f,M)+T(h,U)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X<W)),m+=2,X<W){N=d(M,E,0),P=M,Q=d(U,C,0),R=U;var Y=d(H,J,0);z(r,m,S-257),z(r,m+5,j-1),z(r,m+10,K-4),m+=14;for(B=0;B<K;++B)z(r,m+3*B,H[a[B]]);m+=3*K;for(var Z=[I,O],$=0;$<2;++$){var tt=Z[$];for(B=0;B<tt.length;++B){var nt=31&tt[B];z(r,m,Y[nt]),m+=H[nt],nt>15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=p,P=g,Q=y,R=w;for(B=0;B<u;++B){var rt=o[B];if(rt>255){_(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;_(r,m,Q[et]),m+=R[et],et>3&&(_(r,m,rt>>5&8191),m+=i[et])}else _(r,m,N[rt]),m+=P[rt]}return _(r,m,N[256]),m+P[256]},C=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e<n.length;++e)r=I[255&r^n[e]]^r>>>8;t=r},d:function(){return~t}}},L=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,a=0|r.length,s=0;s!=a;){for(var o=Math.min(s+2655,a);s<o;++s)i+=e+=r[s];e=(65535&e)+15*(e>>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},O=function(a,s,o,f,u){if(!u&&(u={l:1},s.dictionary)){var c=s.dictionary.subarray(-32768),v=new t(c.length+a.length);v.set(c),v.set(a,c.length),a=v,u.w=c.length}return function(a,s,o,f,u,c){var v=c.z||a.length,d=new t(f+v+5*(1+Math.ceil(v/7e3))+u),g=d.subarray(f,d.length-u),w=c.l,p=7&(c.r||0);if(s){p&&(g[0]=c.r>>3);for(var y=C[s-1],M=y>>13,E=8191&y,z=(1<<o)-1,_=c.p||new n(32768),x=c.h||new n(z+1),A=Math.ceil(o/3),D=2*A,T=function(t){return(a[t]^a[t+1]<<A^a[t+2]<<D)&z},F=new r(25e3),I=new n(288),S=new n(32),L=0,O=0,j=c.i||0,q=0,B=c.w||0,G=0;j+2<v;++j){var H=T(j),J=32767&j,K=x[H];if(_[J]=K,x[H]=J,B<=j){var N=v-j;if((L>7e3||q>24576)&&(N>423||!w)){p=U(a,g,0,F,I,S,O,q,G,j-G,p),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(a[j+Q]==a[j+Q-W]){for(var $=0;$<Z&&a[j+$]==a[j+$-W];++$);if($>Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;P<tt;++P){var rt=j-W+P&32767,et=rt-_[rt]&32767;et>nt&&(nt=et,K=rt)}}}W+=(J=K)-(K=_[J])&32767}if(R){F[q++]=268435456|h[Q]<<18|l[R];var it=31&h[Q],at=31&l[R];O+=e[it]+i[at],++I[257+it],++S[at],B=j+Q,++L}else F[q++]=a[j],++I[a[j]]}}for(j=Math.max(j,B);j<v;++j)F[q++]=a[j],++I[a[j]];p=U(a,g,w,F,I,S,O,q,G,j-G,p),w||(c.r=7&p|g[p/8|0]<<3,p-=7,c.h=x,c.p=_,c.i=j,c.w=B)}else{for(j=c.w||0;j<v+w;j+=65535){var st=j+65535;st>=v&&(g[p/8|0]=w,st=v),p=k(g,p+1,a.subarray(j,st))}c.i=v}return b(d,0,f+m(p)+u)}(a,null==s.level?6:s.level,null==s.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(a.length)))):12+s.mem,o,f,u)},j=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},q=function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&j(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}},B=function(t){return 10+(t.filename?t.filename.length+1:0)},G=function(){function n(n,r){if(\"function\"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(O(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var a=this.b.length-this.s.z;a&&(this.b.set(n.subarray(0,a),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(a),32768),this.s.z=n.length-a+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n}();var H=function(){function t(t,n){this.c=L(),this.v=1,G.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),G.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=O(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=L();i.p(n.dictionary),j(t,2,i.d())}}(r,this.o),this.v=0),n&&j(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),J=\"undefined\"!=typeof TextEncoder&&new TextEncoder,K=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{K.decode(F,{stream:!0})}catch(t){}var N=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(P(t),this.d=n||!1)},t}();function P(n,r){if(J)return J.encode(n);for(var e=n.length,i=new t(n.length+(n.length>>1)),a=0,s=function(t){i[a++]=t},o=0;o<e;++o){if(a+5>i.length){var f=new t(a+8+(e-o<<1));f.set(i),i=f}var h=n.charCodeAt(o);h<128||r?s(h):h<2048?(s(192|h>>6),s(128|63&h)):h>55295&&h<57344?(s(240|(h=65536+(1047552&h)|1023&n.charCodeAt(++o))>>18),s(128|h>>12&63),s(128|h>>6&63),s(128|63&h)):(s(224|h>>12),s(128|h>>6&63),s(128|63&h))}return b(i,0,a)}function Q(t){return function(t,n){n||(n={});var r=S(),e=t.length;r.p(t);var i=O(t,n,B(n),8),a=i.length;return q(i,n),j(i,a-8,r.d()),j(i,a-4,e),i}(P(t))}const R=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error(\"Adding invalid event\");const n=this._hasEvents?\",\":\"\";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push(\"]\",!0);const t=function(t){let n=0;for(const r of t)n+=r.length;const r=new Uint8Array(n);for(let n=0,e=0,i=t.length;n<i;n++){const i=t[n];r.set(i,e),e+=i.length}return r}(this._deflatedData);return this._init(),t}_init(){this._hasEvents=!1,this._deflatedData=[],this.deflate=new H,this.deflate.ondata=(t,n)=>{this._deflatedData.push(t)},this.stream=new N(((t,n)=>{this.deflate.push(t,n)})),this.stream.push(\"[\")}},V={clear:()=>{R.clear()},addEvent:t=>R.addEvent(t),finish:()=>R.finish(),compress:t=>Q(t)};addEventListener(\"message\",(function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in V&&\"function\"==typeof V[n])try{const t=V[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:\"init\",success:!0,response:void 0});`;\n","import { WINDOW } from '../constants';\n\n/** If sessionStorage is available. */\nexport function hasSessionStorage(): boolean {\n try {\n // This can throw, e.g. when being accessed in a sandboxed iframe\n return 'sessionStorage' in WINDOW && !!WINDOW.sessionStorage;\n } catch {\n return false;\n }\n}\n","import { REPLAY_SESSION_KEY, WINDOW } from '../../src/constants';\nimport type { ReplayContainer } from '../../src/types';\nimport { hasSessionStorage } from '../util/hasSessionStorage';\n\n/**\n * Removes the session from Session Storage and unsets session in replay instance\n */\nexport function clearSession(replay: ReplayContainer): void {\n deleteSession();\n replay.session = undefined;\n}\n\n/**\n * Deletes a session from storage\n */\nfunction deleteSession(): void {\n if (!hasSessionStorage()) {\n return;\n }\n\n try {\n WINDOW.sessionStorage.removeItem(REPLAY_SESSION_KEY);\n } catch {\n // Ignore potential SecurityError exceptions\n }\n}\n","/**\n * Given a sample rate, returns true if replay should be sampled.\n *\n * 1.0 = 100% sampling\n * 0.0 = 0% sampling\n */\nexport function isSampled(sampleRate?: number): boolean {\n if (sampleRate === undefined) {\n return false;\n }\n\n // Math.random() returns a number in range of 0 to 1 (inclusive of 0, but not 1)\n return Math.random() < sampleRate;\n}\n","import { uuid4 } from '@sentry/core';\n\nimport type { Sampled, Session } from '../types';\n\n/**\n * Get a session with defaults & applied sampling.\n */\nexport function makeSession(session: Partial<Session> & { sampled: Sampled }): Session {\n const now = Date.now();\n const id = session.id || uuid4();\n // Note that this means we cannot set a started/lastActivity of `0`, but this should not be relevant outside of tests.\n const started = session.started || now;\n const lastActivity = session.lastActivity || now;\n const segmentId = session.segmentId || 0;\n const sampled = session.sampled;\n const previousSessionId = session.previousSessionId;\n\n return {\n id,\n started,\n lastActivity,\n segmentId,\n sampled,\n previousSessionId,\n };\n}\n","import { REPLAY_SESSION_KEY, WINDOW } from '../constants';\nimport type { Session } from '../types';\nimport { hasSessionStorage } from '../util/hasSessionStorage';\n\n/**\n * Save a session to session storage.\n */\nexport function saveSession(session: Session): void {\n if (!hasSessionStorage()) {\n return;\n }\n\n try {\n WINDOW.sessionStorage.setItem(REPLAY_SESSION_KEY, JSON.stringify(session));\n } catch {\n // Ignore potential SecurityError exceptions\n }\n}\n","import type { Sampled, Session, SessionOptions } from '../types';\nimport { isSampled } from '../util/isSampled';\nimport { makeSession } from './Session';\nimport { saveSession } from './saveSession';\n\n/**\n * Get the sampled status for a session based on sample rates & current sampled status.\n */\nexport function getSessionSampleType(sessionSampleRate: number, allowBuffering: boolean): Sampled {\n return isSampled(sessionSampleRate) ? 'session' : allowBuffering ? 'buffer' : false;\n}\n\n/**\n * Create a new session, which in its current implementation is a Sentry event\n * that all replays will be saved to as attachments. Currently, we only expect\n * one of these Sentry events per \"replay session\".\n */\nexport function createSession(\n { sessionSampleRate, allowBuffering, stickySession = false }: SessionOptions,\n { previousSessionId }: { previousSessionId?: string } = {},\n): Session {\n const sampled = getSessionSampleType(sessionSampleRate, allowBuffering);\n const session = makeSession({\n sampled,\n previousSessionId,\n });\n\n if (stickySession) {\n saveSession(session);\n }\n\n return session;\n}\n","/**\n * Given an initial timestamp and an expiry duration, checks to see if current\n * time should be considered as expired.\n */\nexport function isExpired(\n initialTime: null | number,\n expiry: undefined | number,\n targetTime: number = +new Date(),\n): boolean {\n // Always expired if < 0\n if (initialTime === null || expiry === undefined || expiry < 0) {\n return true;\n }\n\n // Never expires if == 0\n if (expiry === 0) {\n return false;\n }\n\n return initialTime + expiry <= targetTime;\n}\n","import type { Session } from '../types';\nimport { isExpired } from './isExpired';\n\n/**\n * Checks to see if session is expired\n */\nexport function isSessionExpired(\n session: Session,\n {\n maxReplayDuration,\n sessionIdleExpire,\n targetTime = Date.now(),\n }: { maxReplayDuration: number; sessionIdleExpire: number; targetTime?: number },\n): boolean {\n return (\n // First, check that maximum session length has not been exceeded\n isExpired(session.started, maxReplayDuration, targetTime) ||\n // check that the idle timeout has not been exceeded (i.e. user has\n // performed an action within the last `sessionIdleExpire` ms)\n isExpired(session.lastActivity, sessionIdleExpire, targetTime)\n );\n}\n","import type { Session } from '../types';\nimport { isSessionExpired } from '../util/isSessionExpired';\n\n/** If the session should be refreshed or not. */\nexport function shouldRefreshSession(\n session: Session,\n { sessionIdleExpire, maxReplayDuration }: { sessionIdleExpire: number; maxReplayDuration: number },\n): boolean {\n // If not expired, all good, just keep the session\n if (!isSessionExpired(session, { sessionIdleExpire, maxReplayDuration })) {\n return false;\n }\n\n // If we are buffering & haven't ever flushed yet, always continue\n if (session.sampled === 'buffer' && session.segmentId === 0) {\n return false;\n }\n\n return true;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { Session, SessionOptions } from '../types';\nimport { logger } from '../util/logger';\nimport { createSession } from './createSession';\nimport { fetchSession } from './fetchSession';\nimport { shouldRefreshSession } from './shouldRefreshSession';\n\n/**\n * Get or create a session, when initializing the replay.\n * Returns a session that may be unsampled.\n */\nexport function loadOrCreateSession(\n {\n sessionIdleExpire,\n maxReplayDuration,\n previousSessionId,\n }: {\n sessionIdleExpire: number;\n maxReplayDuration: number;\n previousSessionId?: string;\n },\n sessionOptions: SessionOptions,\n): Session {\n const existingSession = sessionOptions.stickySession && fetchSession();\n\n // No session exists yet, just create a new one\n if (!existingSession) {\n DEBUG_BUILD && logger.infoTick('Creating new session');\n return createSession(sessionOptions, { previousSessionId });\n }\n\n if (!shouldRefreshSession(existingSession, { sessionIdleExpire, maxReplayDuration })) {\n return existingSession;\n }\n\n DEBUG_BUILD && logger.infoTick('Session in sessionStorage is expired, creating new one...');\n return createSession(sessionOptions, { previousSessionId: existingSession.id });\n}\n","import { REPLAY_SESSION_KEY, WINDOW } from '../constants';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Session } from '../types';\nimport { hasSessionStorage } from '../util/hasSessionStorage';\nimport { logger } from '../util/logger';\nimport { makeSession } from './Session';\n\n/**\n * Fetches a session from storage\n */\nexport function fetchSession(): Session | null {\n if (!hasSessionStorage()) {\n return null;\n }\n\n try {\n // This can throw if cookies are disabled\n const sessionStringFromStorage = WINDOW.sessionStorage.getItem(REPLAY_SESSION_KEY);\n\n if (!sessionStringFromStorage) {\n return null;\n }\n\n const sessionObj = JSON.parse(sessionStringFromStorage) as Session;\n\n DEBUG_BUILD && logger.infoTick('Loading existing session');\n\n return makeSession(sessionObj);\n } catch {\n return null;\n }\n}\n","import { EventType } from '@sentry-internal/rrweb';\nimport { getClient } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { EventBufferSizeExceededError } from '../eventBuffer/error';\nimport type { AddEventResult, RecordingEvent, ReplayContainer, ReplayFrameEvent, ReplayPluginOptions } from '../types';\nimport { logger } from './logger';\nimport { timestampToMs } from './timestamp';\n\nfunction isCustomEvent(event: RecordingEvent): event is ReplayFrameEvent {\n return event.type === EventType.Custom;\n}\n\n/**\n * Add an event to the event buffer.\n * In contrast to `addEvent`, this does not return a promise & does not wait for the adding of the event to succeed/fail.\n * Instead this returns `true` if we tried to add the event, else false.\n * It returns `false` e.g. if we are paused, disabled, or out of the max replay duration.\n *\n * `isCheckout` is true if this is either the very first event, or an event triggered by `checkoutEveryNms`.\n */\nexport function addEventSync(replay: ReplayContainer, event: RecordingEvent, isCheckout?: boolean): boolean {\n if (!shouldAddEvent(replay, event)) {\n return false;\n }\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n _addEvent(replay, event, isCheckout);\n\n return true;\n}\n\n/**\n * Add an event to the event buffer.\n * Resolves to `null` if no event was added, else to `void`.\n *\n * `isCheckout` is true if this is either the very first event, or an event triggered by `checkoutEveryNms`.\n */\nexport function addEvent(\n replay: ReplayContainer,\n event: RecordingEvent,\n isCheckout?: boolean,\n): Promise<AddEventResult | null> {\n if (!shouldAddEvent(replay, event)) {\n return Promise.resolve(null);\n }\n\n return _addEvent(replay, event, isCheckout);\n}\n\nasync function _addEvent(\n replay: ReplayContainer,\n event: RecordingEvent,\n isCheckout?: boolean,\n): Promise<AddEventResult | null> {\n const { eventBuffer } = replay;\n\n if (!eventBuffer || (eventBuffer.waitForCheckout && !isCheckout)) {\n return null;\n }\n\n const isBufferMode = replay.recordingMode === 'buffer';\n\n try {\n if (isCheckout && isBufferMode) {\n eventBuffer.clear();\n }\n\n if (isCheckout) {\n eventBuffer.hasCheckout = true;\n eventBuffer.waitForCheckout = false;\n }\n\n const replayOptions = replay.getOptions();\n\n const eventAfterPossibleCallback = maybeApplyCallback(event, replayOptions.beforeAddRecordingEvent);\n\n if (!eventAfterPossibleCallback) {\n return;\n }\n\n return await eventBuffer.addEvent(eventAfterPossibleCallback);\n } catch (error) {\n const isExceeded = error && error instanceof EventBufferSizeExceededError;\n const reason = isExceeded ? 'addEventSizeExceeded' : 'addEvent';\n\n if (isExceeded && isBufferMode) {\n // Clear buffer and wait for next checkout\n eventBuffer.clear();\n eventBuffer.waitForCheckout = true;\n\n return null;\n }\n\n replay.handleException(error);\n\n await replay.stop({ reason });\n\n const client = getClient();\n\n if (client) {\n client.recordDroppedEvent('internal_sdk_error', 'replay');\n }\n }\n}\n\n/** Exported only for tests. */\nexport function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {\n if (!replay.eventBuffer || replay.isPaused() || !replay.isEnabled()) {\n return false;\n }\n\n const timestampInMs = timestampToMs(event.timestamp);\n\n // Throw out events that happen more than 5 minutes ago. This can happen if\n // page has been left open and idle for a long period of time and user\n // comes back to trigger a new session. The performance entries rely on\n // `performance.timeOrigin`, which is when the page first opened.\n if (timestampInMs + replay.timeouts.sessionIdlePause < Date.now()) {\n return false;\n }\n\n // Throw out events that are +60min from the initial timestamp\n if (timestampInMs > replay.getContext().initialTimestamp + replay.getOptions().maxReplayDuration) {\n DEBUG_BUILD &&\n logger.infoTick(`Skipping event with timestamp ${timestampInMs} because it is after maxReplayDuration`);\n return false;\n }\n\n return true;\n}\n\nfunction maybeApplyCallback(\n event: RecordingEvent,\n callback: ReplayPluginOptions['beforeAddRecordingEvent'],\n): RecordingEvent | null | undefined {\n try {\n if (typeof callback === 'function' && isCustomEvent(event)) {\n return callback(event);\n }\n } catch (error) {\n DEBUG_BUILD &&\n logger.exception(error, 'An error occurred in the `beforeAddRecordingEvent` callback, skipping the event...');\n return null;\n }\n\n return event;\n}\n","import type { ErrorEvent, Event, FeedbackEvent, ReplayEvent, TransactionEvent } from '@sentry/core';\n\n/** If the event is an error event */\nexport function isErrorEvent(event: Event): event is ErrorEvent {\n return !event.type;\n}\n\n/** If the event is a transaction event */\nexport function isTransactionEvent(event: Event): event is TransactionEvent {\n return event.type === 'transaction';\n}\n\n/** If the event is an replay event */\nexport function isReplayEvent(event: Event): event is ReplayEvent {\n return event.type === 'replay_event';\n}\n\n/** If the event is a feedback event */\nexport function isFeedbackEvent(event: Event): event is FeedbackEvent {\n return event.type === 'feedback';\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\nimport type { ErrorEvent, Event, TransactionEvent, TransportMakeRequestResponse } from '@sentry/core';\n\nimport type { ReplayContainer } from '../types';\nimport { isErrorEvent, isTransactionEvent } from '../util/eventUtils';\n\ntype AfterSendEventCallback = (event: Event, sendResponse: TransportMakeRequestResponse) => void;\n\n/**\n * Returns a listener to be added to `client.on('afterSendErrorEvent, listener)`.\n */\nexport function handleAfterSendEvent(replay: ReplayContainer): AfterSendEventCallback {\n return (event: Event, sendResponse: TransportMakeRequestResponse) => {\n if (!replay.isEnabled() || (!isErrorEvent(event) && !isTransactionEvent(event))) {\n return;\n }\n\n const statusCode = sendResponse && sendResponse.statusCode;\n\n // We only want to do stuff on successful error sending, otherwise you get error replays without errors attached\n // If not using the base transport, we allow `undefined` response (as a custom transport may not implement this correctly yet)\n // If we do use the base transport, we skip if we encountered an non-OK status code\n if (!statusCode || statusCode < 200 || statusCode >= 300) {\n return;\n }\n\n if (isTransactionEvent(event)) {\n handleTransactionEvent(replay, event);\n return;\n }\n\n handleErrorEvent(replay, event);\n };\n}\n\nfunction handleTransactionEvent(replay: ReplayContainer, event: TransactionEvent): void {\n const replayContext = replay.getContext();\n\n // Collect traceIds in _context regardless of `recordingMode`\n // In error mode, _context gets cleared on every checkout\n // We limit to max. 100 transactions linked\n if (event.contexts && event.contexts.trace && event.contexts.trace.trace_id && replayContext.traceIds.size < 100) {\n replayContext.traceIds.add(event.contexts.trace.trace_id as string);\n }\n}\n\nfunction handleErrorEvent(replay: ReplayContainer, event: ErrorEvent): void {\n const replayContext = replay.getContext();\n\n // Add error to list of errorIds of replay. This is ok to do even if not\n // sampled because context will get reset at next checkout.\n // XXX: There is also a race condition where it's possible to capture an\n // error to Sentry before Replay SDK has loaded, but response returns after\n // it was loaded, and this gets called.\n // We limit to max. 100 errors linked\n if (event.event_id && replayContext.errorIds.size < 100) {\n replayContext.errorIds.add(event.event_id);\n }\n\n // If error event is tagged with replay id it means it was sampled (when in buffer mode)\n // Need to be very careful that this does not cause an infinite loop\n if (replay.recordingMode !== 'buffer' || !event.tags || !event.tags.replayId) {\n return;\n }\n\n const { beforeErrorSampling } = replay.getOptions();\n if (typeof beforeErrorSampling === 'function' && !beforeErrorSampling(event)) {\n return;\n }\n\n setTimeout(async () => {\n try {\n // Capture current event buffer as new replay\n await replay.sendBufferedReplayOrFlush();\n } catch (err) {\n replay.handleException(err);\n }\n });\n}\n","import { getLocationHref } from '@sentry/core';\nimport type { ErrorEvent, Event } from '@sentry/core';\n\nimport type { ReplayContainer } from '../types';\nimport { createBreadcrumb } from '../util/createBreadcrumb';\nimport { isErrorEvent } from '../util/eventUtils';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\n\ntype BeforeSendEventCallback = (event: Event) => void;\n\n/**\n * Returns a listener to be added to `client.on('afterSendErrorEvent, listener)`.\n */\nexport function handleBeforeSendEvent(replay: ReplayContainer): BeforeSendEventCallback {\n return (event: Event) => {\n if (!replay.isEnabled() || !isErrorEvent(event)) {\n return;\n }\n\n handleHydrationError(replay, event);\n };\n}\n\nfunction handleHydrationError(replay: ReplayContainer, event: ErrorEvent): void {\n const exceptionValue =\n event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].value;\n if (typeof exceptionValue !== 'string') {\n return;\n }\n\n if (\n // Only matches errors in production builds of react-dom\n // Example https://reactjs.org/docs/error-decoder.html?invariant=423\n // With newer React versions, the messages changed to a different website https://react.dev/errors/418\n exceptionValue.match(\n /(reactjs\\.org\\/docs\\/error-decoder\\.html\\?invariant=|react\\.dev\\/errors\\/)(418|419|422|423|425)/,\n ) ||\n // Development builds of react-dom\n // Error 1: Hydration failed because the initial UI does not match what was rendered on the server.\n // Error 2: Text content does not match server-rendered HTML. Warning: Text content did not match.\n exceptionValue.match(/(does not match server-rendered HTML|Hydration failed because)/i)\n ) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.hydrate-error',\n data: {\n url: getLocationHref(),\n },\n });\n addBreadcrumbEvent(replay, breadcrumb);\n }\n}\n","import type { Breadcrumb } from '@sentry/core';\nimport { getClient, normalize } from '@sentry/core';\nimport { CONSOLE_ARG_MAX_SIZE } from '../constants';\nimport type { ReplayContainer } from '../types';\nimport type { ReplayFrame } from '../types/replayFrame';\nimport { createBreadcrumb } from '../util/createBreadcrumb';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\n\ntype BreadcrumbWithCategory = Required<Pick<Breadcrumb, 'category'>>;\n\n/**\n * Handle breadcrumbs that Sentry captures, and make sure to capture relevant breadcrumbs to Replay as well.\n */\nexport function handleBreadcrumbs(replay: ReplayContainer): void {\n const client = getClient();\n\n if (!client) {\n return;\n }\n\n client.on('beforeAddBreadcrumb', breadcrumb => beforeAddBreadcrumb(replay, breadcrumb));\n}\n\nfunction beforeAddBreadcrumb(replay: ReplayContainer, breadcrumb: Breadcrumb): void {\n if (!replay.isEnabled() || !isBreadcrumbWithCategory(breadcrumb)) {\n return;\n }\n\n const result = normalizeBreadcrumb(breadcrumb);\n if (result) {\n addBreadcrumbEvent(replay, result);\n }\n}\n\n/** Exported only for tests. */\nexport function normalizeBreadcrumb(breadcrumb: Breadcrumb): Breadcrumb | null {\n if (\n !isBreadcrumbWithCategory(breadcrumb) ||\n [\n // fetch & xhr are handled separately,in handleNetworkBreadcrumbs\n 'fetch',\n 'xhr',\n // These two are breadcrumbs for emitted sentry events, we don't care about them\n 'sentry.event',\n 'sentry.transaction',\n ].includes(breadcrumb.category) ||\n // We capture UI breadcrumbs separately\n breadcrumb.category.startsWith('ui.')\n ) {\n return null;\n }\n\n if (breadcrumb.category === 'console') {\n return normalizeConsoleBreadcrumb(breadcrumb);\n }\n\n return createBreadcrumb(breadcrumb);\n}\n\n/** exported for tests only */\nexport function normalizeConsoleBreadcrumb(\n breadcrumb: Omit<Breadcrumb, 'category'> & BreadcrumbWithCategory,\n): ReplayFrame {\n const args = breadcrumb.data && breadcrumb.data.arguments;\n\n if (!Array.isArray(args) || args.length === 0) {\n return createBreadcrumb(breadcrumb);\n }\n\n let isTruncated = false;\n\n // Avoid giant args captures\n const normalizedArgs = args.map(arg => {\n if (!arg) {\n return arg;\n }\n if (typeof arg === 'string') {\n if (arg.length > CONSOLE_ARG_MAX_SIZE) {\n isTruncated = true;\n return `${arg.slice(0, CONSOLE_ARG_MAX_SIZE)}…`;\n }\n\n return arg;\n }\n if (typeof arg === 'object') {\n try {\n const normalizedArg = normalize(arg, 7);\n const stringified = JSON.stringify(normalizedArg);\n if (stringified.length > CONSOLE_ARG_MAX_SIZE) {\n isTruncated = true;\n // We use the pretty printed JSON string here as a base\n return `${JSON.stringify(normalizedArg, null, 2).slice(0, CONSOLE_ARG_MAX_SIZE)}…`;\n }\n return normalizedArg;\n } catch {\n // fall back to default\n }\n }\n\n return arg;\n });\n\n return createBreadcrumb({\n ...breadcrumb,\n data: {\n ...breadcrumb.data,\n arguments: normalizedArgs,\n ...(isTruncated ? { _meta: { warnings: ['CONSOLE_ARG_TRUNCATED'] } } : {}),\n },\n });\n}\n\nfunction isBreadcrumbWithCategory(breadcrumb: Breadcrumb): breadcrumb is BreadcrumbWithCategory {\n return !!breadcrumb.category;\n}\n","import { getActiveSpan, getCurrentScope, getDynamicSamplingContextFromSpan } from '@sentry/core';\nimport type { DynamicSamplingContext } from '@sentry/core';\n\n/**\n * Reset the `replay_id` field on the DSC.\n */\nexport function resetReplayIdOnDynamicSamplingContext(): void {\n // Reset DSC on the current scope, if there is one\n const dsc = getCurrentScope().getPropagationContext().dsc;\n if (dsc) {\n delete dsc.replay_id;\n }\n\n // Clear it from frozen DSC on the active span\n const activeSpan = getActiveSpan();\n if (activeSpan) {\n const dsc = getDynamicSamplingContextFromSpan(activeSpan);\n delete (dsc as Partial<DynamicSamplingContext>).replay_id;\n }\n}\n","import type { Event, EventHint } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { ReplayContainer } from '../types';\nimport { isErrorEvent, isFeedbackEvent, isReplayEvent, isTransactionEvent } from '../util/eventUtils';\nimport { isRrwebError } from '../util/isRrwebError';\nimport { logger } from '../util/logger';\nimport { resetReplayIdOnDynamicSamplingContext } from '../util/resetReplayIdOnDynamicSamplingContext';\nimport { addFeedbackBreadcrumb } from './util/addFeedbackBreadcrumb';\nimport { shouldSampleForBufferEvent } from './util/shouldSampleForBufferEvent';\n\n/**\n * Returns a listener to be added to `addEventProcessor(listener)`.\n */\nexport function handleGlobalEventListener(replay: ReplayContainer): (event: Event, hint: EventHint) => Event | null {\n return Object.assign(\n (event: Event, hint: EventHint) => {\n // Do nothing if replay has been disabled or paused\n if (!replay.isEnabled() || replay.isPaused()) {\n return event;\n }\n\n if (isReplayEvent(event)) {\n // Replays have separate set of breadcrumbs, do not include breadcrumbs\n // from core SDK\n delete event.breadcrumbs;\n return event;\n }\n\n // We only want to handle errors, transactions, and feedbacks, nothing else\n if (!isErrorEvent(event) && !isTransactionEvent(event) && !isFeedbackEvent(event)) {\n return event;\n }\n\n // Ensure we do not add replay_id if the session is expired\n const isSessionActive = replay.checkAndHandleExpiredSession();\n if (!isSessionActive) {\n // prevent exceeding replay durations by removing the expired replayId from the DSC\n resetReplayIdOnDynamicSamplingContext();\n return event;\n }\n\n if (isFeedbackEvent(event)) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.flush();\n event.contexts.feedback.replay_id = replay.getSessionId();\n // Add a replay breadcrumb for this piece of feedback\n addFeedbackBreadcrumb(replay, event);\n return event;\n }\n\n // Unless `captureExceptions` is enabled, we want to ignore errors coming from rrweb\n // As there can be a bunch of stuff going wrong in internals there, that we don't want to bubble up to users\n if (isRrwebError(event, hint) && !replay.getOptions()._experiments.captureExceptions) {\n DEBUG_BUILD && logger.log('Ignoring error from rrweb internals', event);\n return null;\n }\n\n // When in buffer mode, we decide to sample here.\n // Later, in `handleAfterSendEvent`, if the replayId is set, we know that we sampled\n // And convert the buffer session to a full session\n const isErrorEventSampled = shouldSampleForBufferEvent(replay, event);\n\n // Tag errors if it has been sampled in buffer mode, or if it is session mode\n // Only tag transactions if in session mode\n const shouldTagReplayId = isErrorEventSampled || replay.recordingMode === 'session';\n\n if (shouldTagReplayId) {\n event.tags = { ...event.tags, replayId: replay.getSessionId() };\n }\n\n return event;\n },\n { id: 'Replay' },\n );\n}\n","import { EventType } from '@sentry-internal/rrweb';\nimport type { FeedbackEvent } from '@sentry/core';\n\nimport type { ReplayBreadcrumbFrameEvent, ReplayContainer } from '../../types';\n\n/**\n * Add a feedback breadcrumb event to replay.\n */\nexport function addFeedbackBreadcrumb(replay: ReplayContainer, event: FeedbackEvent): void {\n replay.triggerUserActivity();\n replay.addUpdate(() => {\n if (!event.timestamp) {\n // Ignore events that don't have timestamps (this shouldn't happen, more of a typing issue)\n // Return true here so that we don't flush\n return true;\n }\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.throttledAddEvent({\n type: EventType.Custom,\n timestamp: event.timestamp * 1000,\n data: {\n tag: 'breadcrumb',\n payload: {\n timestamp: event.timestamp,\n type: 'default',\n category: 'sentry.feedback',\n data: {\n feedbackId: event.event_id,\n },\n },\n },\n } as ReplayBreadcrumbFrameEvent);\n\n return false;\n });\n}\n","import type { Event, EventHint } from '@sentry/core';\n\n/**\n * Returns true if we think the given event is an error originating inside of rrweb.\n */\nexport function isRrwebError(event: Event, hint: EventHint): boolean {\n if (event.type || !event.exception || !event.exception.values || !event.exception.values.length) {\n return false;\n }\n\n // @ts-expect-error this may be set by rrweb when it finds errors\n if (hint.originalException && hint.originalException.__rrweb__) {\n return true;\n }\n\n return false;\n}\n","import type { Event } from '@sentry/core';\n\nimport { UNABLE_TO_SEND_REPLAY } from '../../constants';\nimport type { ReplayContainer } from '../../types';\nimport { isSampled } from '../../util/isSampled';\n\n/**\n * Determine if event should be sampled (only applies in buffer mode).\n * When an event is captured by `handleGlobalEvent`, when in buffer mode\n * we determine if we want to sample the error or not.\n */\nexport function shouldSampleForBufferEvent(replay: ReplayContainer, event: Event): boolean {\n if (replay.recordingMode !== 'buffer') {\n return false;\n }\n\n // ignore this error because otherwise we could loop indefinitely with\n // trying to capture replay and failing\n if (event.message === UNABLE_TO_SEND_REPLAY) {\n return false;\n }\n\n // Require the event to be an error event & to have an exception\n if (!event.exception || event.type) {\n return false;\n }\n\n return isSampled(replay.getOptions().errorSampleRate);\n}\n","import { EventType } from '@sentry-internal/rrweb';\n\nimport type { AddEventResult, AllEntryData, ReplayContainer, ReplayPerformanceEntry } from '../types';\n\n/**\n * Create a \"span\" for each performance entry.\n */\nexport function createPerformanceSpans(\n replay: ReplayContainer,\n entries: ReplayPerformanceEntry<AllEntryData>[],\n): Promise<AddEventResult | null>[] {\n return entries.map(({ type, start, end, name, data }) => {\n const response = replay.throttledAddEvent({\n type: EventType.Custom,\n timestamp: start,\n data: {\n tag: 'performanceSpan',\n payload: {\n op: type,\n description: name,\n startTimestamp: start,\n endTimestamp: end,\n data,\n },\n },\n });\n\n // If response is a string, it means its either THROTTLED or SKIPPED\n return typeof response === 'string' ? Promise.resolve(null) : response;\n });\n}\n","import type { HandlerDataHistory } from '@sentry/core';\n\nimport type { HistoryData, ReplayContainer, ReplayPerformanceEntry } from '../types';\nimport { createPerformanceSpans } from '../util/createPerformanceSpans';\n\nfunction handleHistory(handlerData: HandlerDataHistory): ReplayPerformanceEntry<HistoryData> {\n const { from, to } = handlerData;\n\n const now = Date.now() / 1000;\n\n return {\n type: 'navigation.push',\n start: now,\n end: now,\n name: to,\n data: {\n previous: from,\n },\n };\n}\n\n/**\n * Returns a listener to be added to `addHistoryInstrumentationHandler(listener)`.\n */\nexport function handleHistorySpanListener(replay: ReplayContainer): (handlerData: HandlerDataHistory) => void {\n return (handlerData: HandlerDataHistory) => {\n if (!replay.isEnabled()) {\n return;\n }\n\n const result = handleHistory(handlerData);\n\n if (result === null) {\n return;\n }\n\n // Need to collect visited URLs\n replay.getContext().urls.push(result.name);\n replay.triggerUserActivity();\n\n replay.addUpdate(() => {\n createPerformanceSpans(replay, [result]);\n // Returning false to flush\n return false;\n });\n };\n}\n","import type { NetworkRequestData, ReplayContainer, ReplayPerformanceEntry } from '../../types';\nimport { createPerformanceSpans } from '../../util/createPerformanceSpans';\nimport { shouldFilterRequest } from '../../util/shouldFilterRequest';\n\n/** Add a performance entry breadcrumb */\nexport function addNetworkBreadcrumb(\n replay: ReplayContainer,\n result: ReplayPerformanceEntry<NetworkRequestData> | null,\n): void {\n if (!replay.isEnabled()) {\n return;\n }\n\n if (result === null) {\n return;\n }\n\n if (shouldFilterRequest(replay, result.name)) {\n return;\n }\n\n replay.addUpdate(() => {\n createPerformanceSpans(replay, [result]);\n // Returning true will cause `addUpdate` to not flush\n // We do not want network requests to cause a flush. This will prevent\n // recurring/polling requests from keeping the replay session alive.\n return true;\n });\n}\n","import { getClient, isSentryRequestUrl } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { ReplayContainer } from '../types';\n\n/**\n * Check whether a given request URL should be filtered out. This is so we\n * don't log Sentry ingest requests.\n */\nexport function shouldFilterRequest(replay: ReplayContainer, url: string): boolean {\n // If we enabled the `traceInternals` experiment, we want to trace everything\n if (DEBUG_BUILD && replay.getOptions()._experiments.traceInternals) {\n return false;\n }\n\n return isSentryRequestUrl(url, getClient());\n}\n","import { dropUndefinedKeys, stringMatchesSomePattern } from '@sentry/core';\n\nimport { NETWORK_BODY_MAX_SIZE, WINDOW } from '../../constants';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n NetworkBody,\n NetworkMetaWarning,\n NetworkRequestData,\n ReplayNetworkRequestData,\n ReplayNetworkRequestOrResponse,\n ReplayPerformanceEntry,\n} from '../../types';\nimport { logger } from '../../util/logger';\n\n/** Get the size of a body. */\nexport function getBodySize(body: RequestInit['body']): number | undefined {\n if (!body) {\n return undefined;\n }\n\n const textEncoder = new TextEncoder();\n\n try {\n if (typeof body === 'string') {\n return textEncoder.encode(body).length;\n }\n\n if (body instanceof URLSearchParams) {\n return textEncoder.encode(body.toString()).length;\n }\n\n if (body instanceof FormData) {\n const formDataStr = _serializeFormData(body);\n return textEncoder.encode(formDataStr).length;\n }\n\n if (body instanceof Blob) {\n return body.size;\n }\n\n if (body instanceof ArrayBuffer) {\n return body.byteLength;\n }\n\n // Currently unhandled types: ArrayBufferView, ReadableStream\n } catch {\n // just return undefined\n }\n\n return undefined;\n}\n\n/** Convert a Content-Length header to number/undefined. */\nexport function parseContentLengthHeader(header: string | null | undefined): number | undefined {\n if (!header) {\n return undefined;\n }\n\n const size = parseInt(header, 10);\n return isNaN(size) ? undefined : size;\n}\n\n/** Get the string representation of a body. */\nexport function getBodyString(body: unknown): [string | undefined, NetworkMetaWarning?] {\n try {\n if (typeof body === 'string') {\n return [body];\n }\n\n if (body instanceof URLSearchParams) {\n return [body.toString()];\n }\n\n if (body instanceof FormData) {\n return [_serializeFormData(body)];\n }\n\n if (!body) {\n return [undefined];\n }\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize body', body);\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n DEBUG_BUILD && logger.info('Skipping network body because of body type', body);\n\n return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\n/** Merge a warning into an existing network request/response. */\nexport function mergeWarning(\n info: ReplayNetworkRequestOrResponse | undefined,\n warning: NetworkMetaWarning,\n): ReplayNetworkRequestOrResponse {\n if (!info) {\n return {\n headers: {},\n size: undefined,\n _meta: {\n warnings: [warning],\n },\n };\n }\n\n const newMeta = { ...info._meta };\n const existingWarnings = newMeta.warnings || [];\n newMeta.warnings = [...existingWarnings, warning];\n\n info._meta = newMeta;\n return info;\n}\n\n/** Convert ReplayNetworkRequestData to a PerformanceEntry. */\nexport function makeNetworkReplayBreadcrumb(\n type: string,\n data: ReplayNetworkRequestData | null,\n): ReplayPerformanceEntry<NetworkRequestData> | null {\n if (!data) {\n return null;\n }\n\n const { startTimestamp, endTimestamp, url, method, statusCode, request, response } = data;\n\n const result: ReplayPerformanceEntry<NetworkRequestData> = {\n type,\n start: startTimestamp / 1000,\n end: endTimestamp / 1000,\n name: url,\n data: dropUndefinedKeys({\n method,\n statusCode,\n request,\n response,\n }),\n };\n\n return result;\n}\n\n/** Build the request or response part of a replay network breadcrumb that was skipped. */\nexport function buildSkippedNetworkRequestOrResponse(bodySize: number | undefined): ReplayNetworkRequestOrResponse {\n return {\n headers: {},\n size: bodySize,\n _meta: {\n warnings: ['URL_SKIPPED'],\n },\n };\n}\n\n/** Build the request or response part of a replay network breadcrumb. */\nexport function buildNetworkRequestOrResponse(\n headers: Record<string, string>,\n bodySize: number | undefined,\n body: string | undefined,\n): ReplayNetworkRequestOrResponse | undefined {\n if (!bodySize && Object.keys(headers).length === 0) {\n return undefined;\n }\n\n if (!bodySize) {\n return {\n headers,\n };\n }\n\n if (!body) {\n return {\n headers,\n size: bodySize,\n };\n }\n\n const info: ReplayNetworkRequestOrResponse = {\n headers,\n size: bodySize,\n };\n\n const { body: normalizedBody, warnings } = normalizeNetworkBody(body);\n info.body = normalizedBody;\n if (warnings && warnings.length > 0) {\n info._meta = {\n warnings,\n };\n }\n\n return info;\n}\n\n/** Filter a set of headers */\nexport function getAllowedHeaders(headers: Record<string, string>, allowedHeaders: string[]): Record<string, string> {\n return Object.entries(headers).reduce((filteredHeaders: Record<string, string>, [key, value]) => {\n const normalizedKey = key.toLowerCase();\n // Avoid putting empty strings into the headers\n if (allowedHeaders.includes(normalizedKey) && headers[key]) {\n filteredHeaders[normalizedKey] = value;\n }\n return filteredHeaders;\n }, {});\n}\n\nfunction _serializeFormData(formData: FormData): string {\n // This is a bit simplified, but gives us a decent estimate\n // This converts e.g. { name: 'Anne Smith', age: 13 } to 'name=Anne+Smith&age=13'\n // @ts-expect-error passing FormData to URLSearchParams actually works\n return new URLSearchParams(formData).toString();\n}\n\nfunction normalizeNetworkBody(body: string | undefined): {\n body: NetworkBody | undefined;\n warnings?: NetworkMetaWarning[];\n} {\n if (!body || typeof body !== 'string') {\n return {\n body,\n };\n }\n\n const exceedsSizeLimit = body.length > NETWORK_BODY_MAX_SIZE;\n const isProbablyJson = _strIsProbablyJson(body);\n\n if (exceedsSizeLimit) {\n const truncatedBody = body.slice(0, NETWORK_BODY_MAX_SIZE);\n\n if (isProbablyJson) {\n return {\n body: truncatedBody,\n warnings: ['MAYBE_JSON_TRUNCATED'],\n };\n }\n\n return {\n body: `${truncatedBody}…`,\n warnings: ['TEXT_TRUNCATED'],\n };\n }\n\n if (isProbablyJson) {\n try {\n const jsonBody = JSON.parse(body);\n return {\n body: jsonBody,\n };\n } catch {\n // fall back to just send the body as string\n }\n }\n\n return {\n body,\n };\n}\n\nfunction _strIsProbablyJson(str: string): boolean {\n const first = str[0];\n const last = str[str.length - 1];\n\n // Simple check: If this does not start & end with {} or [], it's not JSON\n return (first === '[' && last === ']') || (first === '{' && last === '}');\n}\n\n/** Match an URL against a list of strings/Regex. */\nexport function urlMatches(url: string, urls: (string | RegExp)[]): boolean {\n const fullUrl = getFullUrl(url);\n\n return stringMatchesSomePattern(fullUrl, urls);\n}\n\n/** exported for tests */\nexport function getFullUrl(url: string, baseURI = WINDOW.document.baseURI): string {\n // Short circuit for common cases:\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith(WINDOW.location.origin)) {\n return url;\n }\n const fixedUrl = new URL(url, baseURI);\n\n // If these do not match, we are not dealing with a relative URL, so just return it\n if (fixedUrl.origin !== new URL(baseURI).origin) {\n return url;\n }\n\n const fullUrl = fixedUrl.href;\n\n // Remove trailing slashes, if they don't match the original URL\n if (!url.endsWith('/') && fullUrl.endsWith('/')) {\n return fullUrl.slice(0, -1);\n }\n\n return fullUrl;\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\nimport type { Breadcrumb, FetchBreadcrumbData } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n FetchHint,\n NetworkMetaWarning,\n ReplayContainer,\n ReplayNetworkOptions,\n ReplayNetworkRequestData,\n ReplayNetworkRequestOrResponse,\n} from '../../types';\nimport { logger } from '../../util/logger';\nimport { addNetworkBreadcrumb } from './addNetworkBreadcrumb';\nimport {\n buildNetworkRequestOrResponse,\n buildSkippedNetworkRequestOrResponse,\n getAllowedHeaders,\n getBodySize,\n getBodyString,\n makeNetworkReplayBreadcrumb,\n mergeWarning,\n parseContentLengthHeader,\n urlMatches,\n} from './networkUtils';\n\n/**\n * Capture a fetch breadcrumb to a replay.\n * This adds additional data (where appropriate).\n */\nexport async function captureFetchBreadcrumbToReplay(\n breadcrumb: Breadcrumb & { data: FetchBreadcrumbData },\n hint: Partial<FetchHint>,\n options: ReplayNetworkOptions & {\n replay: ReplayContainer;\n },\n): Promise<void> {\n try {\n const data = await _prepareFetchData(breadcrumb, hint, options);\n\n // Create a replay performance entry from this breadcrumb\n const result = makeNetworkReplayBreadcrumb('resource.fetch', data);\n addNetworkBreadcrumb(options.replay, result);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to capture fetch breadcrumb');\n }\n}\n\n/**\n * Enrich a breadcrumb with additional data.\n * This has to be sync & mutate the given breadcrumb,\n * as the breadcrumb is afterwards consumed by other handlers.\n */\nexport function enrichFetchBreadcrumb(\n breadcrumb: Breadcrumb & { data: FetchBreadcrumbData },\n hint: Partial<FetchHint>,\n): void {\n const { input, response } = hint;\n\n const body = input ? _getFetchRequestArgBody(input) : undefined;\n const reqSize = getBodySize(body);\n\n const resSize = response ? parseContentLengthHeader(response.headers.get('content-length')) : undefined;\n\n if (reqSize !== undefined) {\n breadcrumb.data.request_body_size = reqSize;\n }\n if (resSize !== undefined) {\n breadcrumb.data.response_body_size = resSize;\n }\n}\n\nasync function _prepareFetchData(\n breadcrumb: Breadcrumb & { data: FetchBreadcrumbData },\n hint: Partial<FetchHint>,\n options: ReplayNetworkOptions,\n): Promise<ReplayNetworkRequestData> {\n const now = Date.now();\n const { startTimestamp = now, endTimestamp = now } = hint;\n\n const {\n url,\n method,\n status_code: statusCode = 0,\n request_body_size: requestBodySize,\n response_body_size: responseBodySize,\n } = breadcrumb.data;\n\n const captureDetails =\n urlMatches(url, options.networkDetailAllowUrls) && !urlMatches(url, options.networkDetailDenyUrls);\n\n const request = captureDetails\n ? _getRequestInfo(options, hint.input, requestBodySize)\n : buildSkippedNetworkRequestOrResponse(requestBodySize);\n const response = await _getResponseInfo(captureDetails, options, hint.response, responseBodySize);\n\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request,\n response,\n };\n}\n\nfunction _getRequestInfo(\n { networkCaptureBodies, networkRequestHeaders }: ReplayNetworkOptions,\n input: FetchHint['input'] | undefined,\n requestBodySize?: number,\n): ReplayNetworkRequestOrResponse | undefined {\n const headers = input ? getRequestHeaders(input, networkRequestHeaders) : {};\n\n if (!networkCaptureBodies) {\n return buildNetworkRequestOrResponse(headers, requestBodySize, undefined);\n }\n\n // We only want to transmit string or string-like bodies\n const requestBody = _getFetchRequestArgBody(input);\n const [bodyStr, warning] = getBodyString(requestBody);\n const data = buildNetworkRequestOrResponse(headers, requestBodySize, bodyStr);\n\n if (warning) {\n return mergeWarning(data, warning);\n }\n\n return data;\n}\n\n/** Exported only for tests. */\nexport async function _getResponseInfo(\n captureDetails: boolean,\n {\n networkCaptureBodies,\n networkResponseHeaders,\n }: Pick<ReplayNetworkOptions, 'networkCaptureBodies' | 'networkResponseHeaders'>,\n response: Response | undefined,\n responseBodySize?: number,\n): Promise<ReplayNetworkRequestOrResponse | undefined> {\n if (!captureDetails && responseBodySize !== undefined) {\n return buildSkippedNetworkRequestOrResponse(responseBodySize);\n }\n\n const headers = response ? getAllHeaders(response.headers, networkResponseHeaders) : {};\n\n if (!response || (!networkCaptureBodies && responseBodySize !== undefined)) {\n return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);\n }\n\n const [bodyText, warning] = await _parseFetchResponseBody(response);\n const result = getResponseData(bodyText, {\n networkCaptureBodies,\n\n responseBodySize,\n captureDetails,\n headers,\n });\n\n if (warning) {\n return mergeWarning(result, warning);\n }\n\n return result;\n}\n\nfunction getResponseData(\n bodyText: string | undefined,\n {\n networkCaptureBodies,\n responseBodySize,\n captureDetails,\n headers,\n }: {\n captureDetails: boolean;\n networkCaptureBodies: boolean;\n responseBodySize: number | undefined;\n headers: Record<string, string>;\n },\n): ReplayNetworkRequestOrResponse | undefined {\n try {\n const size =\n bodyText && bodyText.length && responseBodySize === undefined ? getBodySize(bodyText) : responseBodySize;\n\n if (!captureDetails) {\n return buildSkippedNetworkRequestOrResponse(size);\n }\n\n if (networkCaptureBodies) {\n return buildNetworkRequestOrResponse(headers, size, bodyText);\n }\n\n return buildNetworkRequestOrResponse(headers, size, undefined);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize response body');\n // fallback\n return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);\n }\n}\n\nasync function _parseFetchResponseBody(response: Response): Promise<[string | undefined, NetworkMetaWarning?]> {\n const res = _tryCloneResponse(response);\n\n if (!res) {\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n try {\n const text = await _tryGetResponseText(res);\n return [text];\n } catch (error) {\n if (error instanceof Error && error.message.indexOf('Timeout') > -1) {\n DEBUG_BUILD && logger.warn('Parsing text body from response timed out');\n return [undefined, 'BODY_PARSE_TIMEOUT'];\n }\n\n DEBUG_BUILD && logger.exception(error, 'Failed to get text body from response');\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n}\n\nfunction _getFetchRequestArgBody(fetchArgs: unknown[] = []): RequestInit['body'] | undefined {\n // We only support getting the body from the fetch options\n if (fetchArgs.length !== 2 || typeof fetchArgs[1] !== 'object') {\n return undefined;\n }\n\n return (fetchArgs[1] as RequestInit).body;\n}\n\nfunction getAllHeaders(headers: Headers, allowedHeaders: string[]): Record<string, string> {\n const allHeaders: Record<string, string> = {};\n\n allowedHeaders.forEach(header => {\n if (headers.get(header)) {\n allHeaders[header] = headers.get(header) as string;\n }\n });\n\n return allHeaders;\n}\n\nfunction getRequestHeaders(fetchArgs: unknown[], allowedHeaders: string[]): Record<string, string> {\n if (fetchArgs.length === 1 && typeof fetchArgs[0] !== 'string') {\n return getHeadersFromOptions(fetchArgs[0] as Request | RequestInit, allowedHeaders);\n }\n\n if (fetchArgs.length === 2) {\n return getHeadersFromOptions(fetchArgs[1] as Request | RequestInit, allowedHeaders);\n }\n\n return {};\n}\n\nfunction getHeadersFromOptions(\n input: Request | RequestInit | undefined,\n allowedHeaders: string[],\n): Record<string, string> {\n if (!input) {\n return {};\n }\n\n const headers = input.headers;\n\n if (!headers) {\n return {};\n }\n\n if (headers instanceof Headers) {\n return getAllHeaders(headers, allowedHeaders);\n }\n\n // We do not support this, as it is not really documented (anymore?)\n if (Array.isArray(headers)) {\n return {};\n }\n\n return getAllowedHeaders(headers, allowedHeaders);\n}\n\nfunction _tryCloneResponse(response: Response): Response | void {\n try {\n // We have to clone this, as the body can only be read once\n return response.clone();\n } catch (error) {\n // this can throw if the response was already consumed before\n DEBUG_BUILD && logger.exception(error, 'Failed to clone response body');\n }\n}\n\n/**\n * Get the response body of a fetch request, or timeout after 500ms.\n * Fetch can return a streaming body, that may not resolve (or not for a long time).\n * If that happens, we rather abort after a short time than keep waiting for this.\n */\nfunction _tryGetResponseText(response: Response): Promise<string | undefined> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => reject(new Error('Timeout while trying to read response body')), 500);\n\n _getResponseText(response)\n .then(\n txt => resolve(txt),\n reason => reject(reason),\n )\n .finally(() => clearTimeout(timeout));\n });\n}\n\nasync function _getResponseText(response: Response): Promise<string> {\n // Force this to be a promise, just to be safe\n // eslint-disable-next-line no-return-await\n return await response.text();\n}\n","import { SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport type { Breadcrumb, XhrBreadcrumbData } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n NetworkMetaWarning,\n ReplayContainer,\n ReplayNetworkOptions,\n ReplayNetworkRequestData,\n XhrHint,\n} from '../../types';\nimport { logger } from '../../util/logger';\nimport { addNetworkBreadcrumb } from './addNetworkBreadcrumb';\nimport {\n buildNetworkRequestOrResponse,\n buildSkippedNetworkRequestOrResponse,\n getAllowedHeaders,\n getBodySize,\n getBodyString,\n makeNetworkReplayBreadcrumb,\n mergeWarning,\n parseContentLengthHeader,\n urlMatches,\n} from './networkUtils';\n\n/**\n * Capture an XHR breadcrumb to a replay.\n * This adds additional data (where appropriate).\n */\nexport async function captureXhrBreadcrumbToReplay(\n breadcrumb: Breadcrumb & { data: XhrBreadcrumbData },\n hint: Partial<XhrHint>,\n options: ReplayNetworkOptions & { replay: ReplayContainer },\n): Promise<void> {\n try {\n const data = _prepareXhrData(breadcrumb, hint, options);\n\n // Create a replay performance entry from this breadcrumb\n const result = makeNetworkReplayBreadcrumb('resource.xhr', data);\n addNetworkBreadcrumb(options.replay, result);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to capture xhr breadcrumb');\n }\n}\n\n/**\n * Enrich a breadcrumb with additional data.\n * This has to be sync & mutate the given breadcrumb,\n * as the breadcrumb is afterwards consumed by other handlers.\n */\nexport function enrichXhrBreadcrumb(\n breadcrumb: Breadcrumb & { data: XhrBreadcrumbData },\n hint: Partial<XhrHint>,\n): void {\n const { xhr, input } = hint;\n\n if (!xhr) {\n return;\n }\n\n const reqSize = getBodySize(input);\n const resSize = xhr.getResponseHeader('content-length')\n ? parseContentLengthHeader(xhr.getResponseHeader('content-length'))\n : _getBodySize(xhr.response, xhr.responseType);\n\n if (reqSize !== undefined) {\n breadcrumb.data.request_body_size = reqSize;\n }\n if (resSize !== undefined) {\n breadcrumb.data.response_body_size = resSize;\n }\n}\n\nfunction _prepareXhrData(\n breadcrumb: Breadcrumb & { data: XhrBreadcrumbData },\n hint: Partial<XhrHint>,\n options: ReplayNetworkOptions,\n): ReplayNetworkRequestData | null {\n const now = Date.now();\n const { startTimestamp = now, endTimestamp = now, input, xhr } = hint;\n\n const {\n url,\n method,\n status_code: statusCode = 0,\n request_body_size: requestBodySize,\n response_body_size: responseBodySize,\n } = breadcrumb.data;\n\n if (!url) {\n return null;\n }\n\n if (!xhr || !urlMatches(url, options.networkDetailAllowUrls) || urlMatches(url, options.networkDetailDenyUrls)) {\n const request = buildSkippedNetworkRequestOrResponse(requestBodySize);\n const response = buildSkippedNetworkRequestOrResponse(responseBodySize);\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request,\n response,\n };\n }\n\n const xhrInfo = xhr[SENTRY_XHR_DATA_KEY];\n const networkRequestHeaders = xhrInfo\n ? getAllowedHeaders(xhrInfo.request_headers, options.networkRequestHeaders)\n : {};\n const networkResponseHeaders = getAllowedHeaders(getResponseHeaders(xhr), options.networkResponseHeaders);\n\n const [requestBody, requestWarning] = options.networkCaptureBodies ? getBodyString(input) : [undefined];\n const [responseBody, responseWarning] = options.networkCaptureBodies ? _getXhrResponseBody(xhr) : [undefined];\n\n const request = buildNetworkRequestOrResponse(networkRequestHeaders, requestBodySize, requestBody);\n const response = buildNetworkRequestOrResponse(networkResponseHeaders, responseBodySize, responseBody);\n\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request: requestWarning ? mergeWarning(request, requestWarning) : request,\n response: responseWarning ? mergeWarning(response, responseWarning) : response,\n };\n}\n\nfunction getResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n const headers = xhr.getAllResponseHeaders();\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc: Record<string, string>, line: string) => {\n const [key, value] = line.split(': ') as [string, string | undefined];\n if (value) {\n acc[key.toLowerCase()] = value;\n }\n return acc;\n }, {});\n}\n\nfunction _getXhrResponseBody(xhr: XMLHttpRequest): [string | undefined, NetworkMetaWarning?] {\n // We collect errors that happen, but only log them if we can't get any response body\n const errors: unknown[] = [];\n\n try {\n return [xhr.responseText];\n } catch (e) {\n errors.push(e);\n }\n\n // Try to manually parse the response body, if responseText fails\n try {\n return _parseXhrResponse(xhr.response, xhr.responseType);\n } catch (e) {\n errors.push(e);\n }\n\n DEBUG_BUILD && logger.warn('Failed to get xhr response body', ...errors);\n\n return [undefined];\n}\n\n/**\n * Get the string representation of the XHR response.\n * Based on MDN, these are the possible types of the response:\n * string\n * ArrayBuffer\n * Blob\n * Document\n * POJO\n *\n * Exported only for tests.\n */\nexport function _parseXhrResponse(\n body: XMLHttpRequest['response'],\n responseType: XMLHttpRequest['responseType'],\n): [string | undefined, NetworkMetaWarning?] {\n try {\n if (typeof body === 'string') {\n return [body];\n }\n\n if (body instanceof Document) {\n return [body.body.outerHTML];\n }\n\n if (responseType === 'json' && body && typeof body === 'object') {\n return [JSON.stringify(body)];\n }\n\n if (!body) {\n return [undefined];\n }\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize body', body);\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n DEBUG_BUILD && logger.info('Skipping network body because of body type', body);\n\n return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\nfunction _getBodySize(\n body: XMLHttpRequest['response'],\n responseType: XMLHttpRequest['responseType'],\n): number | undefined {\n try {\n const bodyStr = responseType === 'json' && body && typeof body === 'object' ? JSON.stringify(body) : body;\n return getBodySize(bodyStr);\n } catch {\n return undefined;\n }\n}\n","import { getClient } from '@sentry/core';\nimport type { Breadcrumb, BreadcrumbHint, FetchBreadcrumbData, XhrBreadcrumbData } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { FetchHint, ReplayContainer, ReplayNetworkOptions, XhrHint } from '../types';\nimport { logger } from '../util/logger';\nimport { captureFetchBreadcrumbToReplay, enrichFetchBreadcrumb } from './util/fetchUtils';\nimport { captureXhrBreadcrumbToReplay, enrichXhrBreadcrumb } from './util/xhrUtils';\n\ninterface ExtendedNetworkBreadcrumbsOptions extends ReplayNetworkOptions {\n replay: ReplayContainer;\n}\n\n/**\n * This method does two things:\n * - It enriches the regular XHR/fetch breadcrumbs with request/response size data\n * - It captures the XHR/fetch breadcrumbs to the replay\n * (enriching it with further data that is _not_ added to the regular breadcrumbs)\n */\nexport function handleNetworkBreadcrumbs(replay: ReplayContainer): void {\n const client = getClient();\n\n try {\n const {\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders,\n networkResponseHeaders,\n } = replay.getOptions();\n\n const options: ExtendedNetworkBreadcrumbsOptions = {\n replay,\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders,\n networkResponseHeaders,\n };\n\n if (client) {\n client.on('beforeAddBreadcrumb', (breadcrumb, hint) => beforeAddNetworkBreadcrumb(options, breadcrumb, hint));\n }\n } catch {\n // Do nothing\n }\n}\n\n/** just exported for tests */\nexport function beforeAddNetworkBreadcrumb(\n options: ExtendedNetworkBreadcrumbsOptions,\n breadcrumb: Breadcrumb,\n hint?: BreadcrumbHint,\n): void {\n if (!breadcrumb.data) {\n return;\n }\n\n try {\n if (_isXhrBreadcrumb(breadcrumb) && _isXhrHint(hint)) {\n // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick\n // Because the hook runs synchronously, and the breadcrumb is afterwards passed on\n // So any async mutations to it will not be reflected in the final breadcrumb\n enrichXhrBreadcrumb(breadcrumb, hint);\n\n // This call should not reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n captureXhrBreadcrumbToReplay(breadcrumb, hint, options);\n }\n\n if (_isFetchBreadcrumb(breadcrumb) && _isFetchHint(hint)) {\n // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick\n // Because the hook runs synchronously, and the breadcrumb is afterwards passed on\n // So any async mutations to it will not be reflected in the final breadcrumb\n enrichFetchBreadcrumb(breadcrumb, hint);\n\n // This call should not reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n captureFetchBreadcrumbToReplay(breadcrumb, hint, options);\n }\n } catch (e) {\n DEBUG_BUILD && logger.exception(e, 'Error when enriching network breadcrumb');\n }\n}\n\nfunction _isXhrBreadcrumb(breadcrumb: Breadcrumb): breadcrumb is Breadcrumb & { data: XhrBreadcrumbData } {\n return breadcrumb.category === 'xhr';\n}\n\nfunction _isFetchBreadcrumb(breadcrumb: Breadcrumb): breadcrumb is Breadcrumb & { data: FetchBreadcrumbData } {\n return breadcrumb.category === 'fetch';\n}\n\nfunction _isXhrHint(hint?: BreadcrumbHint): hint is XhrHint {\n return hint && hint.xhr;\n}\n\nfunction _isFetchHint(hint?: BreadcrumbHint): hint is FetchHint {\n return hint && hint.response;\n}\n","import { WINDOW } from '../constants';\nimport type { AddEventResult, MemoryData, ReplayContainer, ReplayPerformanceEntry } from '../types';\nimport { createPerformanceSpans } from './createPerformanceSpans';\n\ntype ReplayMemoryEntry = ReplayPerformanceEntry<MemoryData> & { data: { memory: MemoryInfo } };\n\ninterface MemoryInfo {\n jsHeapSizeLimit: number;\n totalJSHeapSize: number;\n usedJSHeapSize: number;\n}\n\n/**\n * Create a \"span\" for the total amount of memory being used by JS objects\n * (including v8 internal objects).\n */\nexport async function addMemoryEntry(replay: ReplayContainer): Promise<Array<AddEventResult | null>> {\n // window.performance.memory is a non-standard API and doesn't work on all browsers, so we try-catch this\n try {\n return Promise.all(\n createPerformanceSpans(replay, [\n // @ts-expect-error memory doesn't exist on type Performance as the API is non-standard (we check that it exists above)\n createMemoryEntry(WINDOW.performance.memory),\n ]),\n );\n } catch (error) {\n // Do nothing\n return [];\n }\n}\n\nfunction createMemoryEntry(memoryEntry: MemoryInfo): ReplayMemoryEntry {\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = memoryEntry;\n // we don't want to use `getAbsoluteTime` because it adds the event time to the\n // time origin, so we get the current timestamp instead\n const time = Date.now() / 1000;\n return {\n type: 'memory',\n name: 'memory',\n start: time,\n end: time,\n data: {\n memory: {\n jsHeapSizeLimit,\n totalJSHeapSize,\n usedJSHeapSize,\n },\n },\n };\n}\n","import { EventType } from '@sentry-internal/rrweb';\n\nimport { updateClickDetectorForRecordingEvent } from '../coreHandlers/handleClick';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { saveSession } from '../session/saveSession';\nimport type { RecordingEvent, ReplayContainer, ReplayOptionFrameEvent } from '../types';\nimport { addEventSync } from './addEvent';\nimport { logger } from './logger';\n\ntype RecordingEmitCallback = (event: RecordingEvent, isCheckout?: boolean) => void;\n\n/**\n * Handler for recording events.\n *\n * Adds to event buffer, and has varying flushing behaviors if the event was a checkout.\n */\nexport function getHandleRecordingEmit(replay: ReplayContainer): RecordingEmitCallback {\n let hadFirstEvent = false;\n\n return (event: RecordingEvent, _isCheckout?: boolean) => {\n // If this is false, it means session is expired, create and a new session and wait for checkout\n if (!replay.checkAndHandleExpiredSession()) {\n DEBUG_BUILD && logger.warn('Received replay event after session expired.');\n\n return;\n }\n\n // `_isCheckout` is only set when the checkout is due to `checkoutEveryNms`\n // We also want to treat the first event as a checkout, so we handle this specifically here\n const isCheckout = _isCheckout || !hadFirstEvent;\n hadFirstEvent = true;\n\n if (replay.clickDetector) {\n updateClickDetectorForRecordingEvent(replay.clickDetector, event);\n }\n\n // The handler returns `true` if we do not want to trigger debounced flush, `false` if we want to debounce flush.\n replay.addUpdate(() => {\n // The session is always started immediately on pageload/init, but for\n // error-only replays, it should reflect the most recent checkout\n // when an error occurs. Clear any state that happens before this current\n // checkout. This needs to happen before `addEvent()` which updates state\n // dependent on this reset.\n if (replay.recordingMode === 'buffer' && isCheckout) {\n replay.setInitialState();\n }\n\n // If the event is not added (e.g. due to being paused, disabled, or out of the max replay duration),\n // Skip all further steps\n if (!addEventSync(replay, event, isCheckout)) {\n // Return true to skip scheduling a debounced flush\n return true;\n }\n\n // Different behavior for full snapshots (type=2), ignore other event types\n // See https://github.com/rrweb-io/rrweb/blob/d8f9290ca496712aa1e7d472549480c4e7876594/packages/rrweb/src/types.ts#L16\n if (!isCheckout) {\n return false;\n }\n\n const session = replay.session;\n\n // Additionally, create a meta event that will capture certain SDK settings.\n // In order to handle buffer mode, this needs to either be done when we\n // receive checkout events or at flush time. We have an experimental mode\n // to perform multiple checkouts a session (the idea is to improve\n // seeking during playback), so also only include if segmentId is 0\n // (handled in `addSettingsEvent`).\n //\n // `isCheckout` is always true, but want to be explicit that it should\n // only be added for checkouts\n addSettingsEvent(replay, isCheckout);\n\n // When in buffer mode, make sure we adjust the session started date to the current earliest event of the buffer\n // this should usually be the timestamp of the checkout event, but to be safe...\n if (replay.recordingMode === 'buffer' && session && replay.eventBuffer) {\n const earliestEvent = replay.eventBuffer.getEarliestTimestamp();\n if (earliestEvent) {\n DEBUG_BUILD &&\n logger.info(`Updating session start time to earliest event in buffer to ${new Date(earliestEvent)}`);\n\n session.started = earliestEvent;\n\n if (replay.getOptions().stickySession) {\n saveSession(session);\n }\n }\n }\n\n // If there is a previousSessionId after a full snapshot occurs, then\n // the replay session was started due to session expiration. The new session\n // is started before triggering a new checkout and contains the id\n // of the previous session. Do not immediately flush in this case\n // to avoid capturing only the checkout and instead the replay will\n // be captured if they perform any follow-up actions.\n if (session && session.previousSessionId) {\n return true;\n }\n\n if (replay.recordingMode === 'session') {\n // If the full snapshot is due to an initial load, we will not have\n // a previous session ID. In this case, we want to buffer events\n // for a set amount of time before flushing. This can help avoid\n // capturing replays of users that immediately close the window.\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n void replay.flush();\n }\n\n return true;\n });\n };\n}\n\n/**\n * Exported for tests\n */\nexport function createOptionsEvent(replay: ReplayContainer): ReplayOptionFrameEvent {\n const options = replay.getOptions();\n return {\n type: EventType.Custom,\n timestamp: Date.now(),\n data: {\n tag: 'options',\n payload: {\n shouldRecordCanvas: replay.isRecordingCanvas(),\n sessionSampleRate: options.sessionSampleRate,\n errorSampleRate: options.errorSampleRate,\n useCompressionOption: options.useCompression,\n blockAllMedia: options.blockAllMedia,\n maskAllText: options.maskAllText,\n maskAllInputs: options.maskAllInputs,\n useCompression: replay.eventBuffer ? replay.eventBuffer.type === 'worker' : false,\n networkDetailHasUrls: options.networkDetailAllowUrls.length > 0,\n networkCaptureBodies: options.networkCaptureBodies,\n networkRequestHasHeaders: options.networkRequestHeaders.length > 0,\n networkResponseHasHeaders: options.networkResponseHeaders.length > 0,\n },\n },\n };\n}\n\n/**\n * Add a \"meta\" event that contains a simplified view on current configuration\n * options. This should only be included on the first segment of a recording.\n */\nfunction addSettingsEvent(replay: ReplayContainer, isCheckout?: boolean): void {\n // Only need to add this event when sending the first segment\n if (!isCheckout || !replay.session || replay.session.segmentId !== 0) {\n return;\n }\n\n addEventSync(replay, createOptionsEvent(replay), false);\n}\n","import type { RateLimits, ReplayEvent, TransportMakeRequestResponse } from '@sentry/core';\nimport { getClient, getCurrentScope, isRateLimited, resolvedSyncPromise, updateRateLimits } from '@sentry/core';\nimport { REPLAY_EVENT_NAME, UNABLE_TO_SEND_REPLAY } from '../constants';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { SendReplayData } from '../types';\nimport { createReplayEnvelope } from './createReplayEnvelope';\nimport { logger } from './logger';\nimport { prepareRecordingData } from './prepareRecordingData';\nimport { prepareReplayEvent } from './prepareReplayEvent';\n\n/**\n * Send replay attachment using `fetch()`\n */\nexport async function sendReplayRequest({\n recordingData,\n replayId,\n segmentId: segment_id,\n eventContext,\n timestamp,\n session,\n}: SendReplayData): Promise<TransportMakeRequestResponse> {\n const preparedRecordingData = prepareRecordingData({\n recordingData,\n headers: {\n segment_id,\n },\n });\n\n const { urls, errorIds, traceIds, initialTimestamp } = eventContext;\n\n const client = getClient();\n const scope = getCurrentScope();\n const transport = client && client.getTransport();\n const dsn = client && client.getDsn();\n\n if (!client || !transport || !dsn || !session.sampled) {\n return resolvedSyncPromise({});\n }\n\n const baseEvent: ReplayEvent = {\n type: REPLAY_EVENT_NAME,\n replay_start_timestamp: initialTimestamp / 1000,\n timestamp: timestamp / 1000,\n error_ids: errorIds,\n trace_ids: traceIds,\n urls,\n replay_id: replayId,\n segment_id,\n replay_type: session.sampled,\n };\n\n const replayEvent = await prepareReplayEvent({ scope, client, replayId, event: baseEvent });\n\n if (!replayEvent) {\n // Taken from baseclient's `_processEvent` method, where this is handled for errors/transactions\n client.recordDroppedEvent('event_processor', 'replay', baseEvent);\n DEBUG_BUILD && logger.info('An event processor returned `null`, will not send event.');\n return resolvedSyncPromise({});\n }\n\n /*\n For reference, the fully built event looks something like this:\n {\n \"type\": \"replay_event\",\n \"timestamp\": 1670837008.634,\n \"error_ids\": [\n \"errorId\"\n ],\n \"trace_ids\": [\n \"traceId\"\n ],\n \"urls\": [\n \"https://example.com\"\n ],\n \"replay_id\": \"eventId\",\n \"segment_id\": 3,\n \"replay_type\": \"error\",\n \"platform\": \"javascript\",\n \"event_id\": \"eventId\",\n \"environment\": \"production\",\n \"sdk\": {\n \"integrations\": [\n \"BrowserTracing\",\n \"Replay\"\n ],\n \"name\": \"sentry.javascript.browser\",\n \"version\": \"7.25.0\"\n },\n \"sdkProcessingMetadata\": {},\n \"contexts\": {\n },\n }\n */\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete replayEvent.sdkProcessingMetadata;\n\n const envelope = createReplayEnvelope(replayEvent, preparedRecordingData, dsn, client.getOptions().tunnel);\n\n let response: TransportMakeRequestResponse;\n\n try {\n response = await transport.send(envelope);\n } catch (err) {\n const error = new Error(UNABLE_TO_SEND_REPLAY);\n\n try {\n // In case browsers don't allow this property to be writable\n // @ts-expect-error This needs lib es2022 and newer\n error.cause = err;\n } catch {\n // nothing to do\n }\n throw error;\n }\n\n // If the status code is invalid, we want to immediately stop & not retry\n if (typeof response.statusCode === 'number' && (response.statusCode < 200 || response.statusCode >= 300)) {\n throw new TransportStatusCodeError(response.statusCode);\n }\n\n const rateLimits = updateRateLimits({}, response);\n if (isRateLimited(rateLimits, 'replay')) {\n throw new RateLimitError(rateLimits);\n }\n\n return response;\n}\n\n/**\n * This error indicates that the transport returned an invalid status code.\n */\nexport class TransportStatusCodeError extends Error {\n public constructor(statusCode: number) {\n super(`Transport returned status code ${statusCode}`);\n }\n}\n\n/**\n * This error indicates that we hit a rate limit API error.\n */\nexport class RateLimitError extends Error {\n public rateLimits: RateLimits;\n\n public constructor(rateLimits: RateLimits) {\n super('Rate limit hit');\n this.rateLimits = rateLimits;\n }\n}\n","import type { ReplayRecordingData } from '@sentry/core';\n\n/**\n * Prepare the recording data ready to be sent.\n */\nexport function prepareRecordingData({\n recordingData,\n headers,\n}: {\n recordingData: ReplayRecordingData;\n headers: Record<string, unknown>;\n}): ReplayRecordingData {\n let payloadWithSequence;\n\n // XXX: newline is needed to separate sequence id from events\n const replayHeaders = `${JSON.stringify(headers)}\n`;\n\n if (typeof recordingData === 'string') {\n payloadWithSequence = `${replayHeaders}${recordingData}`;\n } else {\n const enc = new TextEncoder();\n // XXX: newline is needed to separate sequence id from events\n const sequence = enc.encode(replayHeaders);\n // Merge the two Uint8Arrays\n payloadWithSequence = new Uint8Array(sequence.length + recordingData.length);\n payloadWithSequence.set(sequence);\n payloadWithSequence.set(recordingData, sequence.length);\n }\n\n return payloadWithSequence;\n}\n","import type { IntegrationIndex } from '@sentry/core';\nimport { getIsolationScope, prepareEvent } from '@sentry/core';\nimport type { Client, EventHint, ReplayEvent, Scope } from '@sentry/core';\n\n/**\n * Prepare a replay event & enrich it with the SDK metadata.\n */\nexport async function prepareReplayEvent({\n client,\n scope,\n replayId: event_id,\n event,\n}: {\n client: Client & { _integrations?: IntegrationIndex };\n scope: Scope;\n replayId: string;\n event: ReplayEvent;\n}): Promise<ReplayEvent | null> {\n const integrations =\n typeof client._integrations === 'object' && client._integrations !== null && !Array.isArray(client._integrations)\n ? Object.keys(client._integrations)\n : undefined;\n\n const eventHint: EventHint = { event_id, integrations };\n\n client.emit('preprocessEvent', event, eventHint);\n\n const preparedEvent = (await prepareEvent(\n client.getOptions(),\n event,\n eventHint,\n scope,\n client,\n getIsolationScope(),\n )) as ReplayEvent | null;\n\n // If e.g. a global event processor returned null\n if (!preparedEvent) {\n return null;\n }\n\n // This normally happens in browser client \"_prepareEvent\"\n // but since we do not use this private method from the client, but rather the plain import\n // we need to do this manually.\n preparedEvent.platform = preparedEvent.platform || 'javascript';\n\n // extract the SDK name because `client._prepareEvent` doesn't add it to the event\n const metadata = client.getSdkMetadata();\n const { name, version } = (metadata && metadata.sdk) || {};\n\n preparedEvent.sdk = {\n ...preparedEvent.sdk,\n name: name || 'sentry.javascript.unknown',\n version: version || '0.0.0',\n };\n\n return preparedEvent;\n}\n","import { createEnvelope, createEventEnvelopeHeaders, getSdkMetadataForEnvelopeHeader } from '@sentry/core';\nimport type { DsnComponents, ReplayEnvelope, ReplayEvent, ReplayRecordingData } from '@sentry/core';\n\n/**\n * Create a replay envelope ready to be sent.\n * This includes both the replay event, as well as the recording data.\n */\nexport function createReplayEnvelope(\n replayEvent: ReplayEvent,\n recordingData: ReplayRecordingData,\n dsn: DsnComponents,\n tunnel?: string,\n): ReplayEnvelope {\n return createEnvelope<ReplayEnvelope>(\n createEventEnvelopeHeaders(replayEvent, getSdkMetadataForEnvelopeHeader(replayEvent), tunnel, dsn),\n [\n [{ type: 'replay_event' }, replayEvent],\n [\n {\n type: 'replay_recording',\n // If string then we need to encode to UTF8, otherwise will have\n // wrong size. TextEncoder has similar browser support to\n // MutationObserver, although it does not accept IE11.\n length:\n typeof recordingData === 'string' ? new TextEncoder().encode(recordingData).length : recordingData.length,\n },\n recordingData,\n ],\n ],\n );\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\nimport { setContext } from '@sentry/core';\n\nimport { RETRY_BASE_INTERVAL, RETRY_MAX_COUNT, UNABLE_TO_SEND_REPLAY } from '../constants';\nimport type { SendReplayData } from '../types';\nimport { RateLimitError, TransportStatusCodeError, sendReplayRequest } from './sendReplayRequest';\n\n/**\n * Finalize and send the current replay event to Sentry\n */\nexport async function sendReplay(\n replayData: SendReplayData,\n retryConfig = {\n count: 0,\n interval: RETRY_BASE_INTERVAL,\n },\n): Promise<unknown> {\n const { recordingData, onError } = replayData;\n\n // short circuit if there's no events to upload (this shouldn't happen as _runFlush makes this check)\n if (!recordingData.length) {\n return;\n }\n\n try {\n await sendReplayRequest(replayData);\n return true;\n } catch (err) {\n if (err instanceof TransportStatusCodeError || err instanceof RateLimitError) {\n throw err;\n }\n\n // Capture error for every failed replay\n setContext('Replays', {\n _retryCount: retryConfig.count,\n });\n\n if (onError) {\n onError(err);\n }\n\n // If an error happened here, it's likely that uploading the attachment\n // failed, we'll can retry with the same events payload\n if (retryConfig.count >= RETRY_MAX_COUNT) {\n const error = new Error(`${UNABLE_TO_SEND_REPLAY} - max retries exceeded`);\n\n try {\n // In case browsers don't allow this property to be writable\n // @ts-expect-error This needs lib es2022 and newer\n error.cause = err;\n } catch {\n // nothing to do\n }\n\n throw error;\n }\n\n // will retry in intervals of 5, 10, 30\n retryConfig.interval *= ++retryConfig.count;\n\n return new Promise((resolve, reject) => {\n setTimeout(async () => {\n try {\n await sendReplay(replayData, retryConfig);\n resolve(true);\n } catch (err) {\n reject(err);\n }\n }, retryConfig.interval);\n });\n }\n}\n","export const THROTTLED = '__THROTTLED';\nexport const SKIPPED = '__SKIPPED';\n\n/**\n * Create a throttled function off a given function.\n * When calling the throttled function, it will call the original function only\n * if it hasn't been called more than `maxCount` times in the last `durationSeconds`.\n *\n * Returns `THROTTLED` if throttled for the first time, after that `SKIPPED`,\n * or else the return value of the original function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function throttle<T extends (...rest: any[]) => any>(\n fn: T,\n maxCount: number,\n durationSeconds: number,\n): (...rest: Parameters<T>) => ReturnType<T> | typeof THROTTLED | typeof SKIPPED {\n const counter = new Map<number, number>();\n\n const _cleanup = (now: number): void => {\n const threshold = now - durationSeconds;\n counter.forEach((_value, key) => {\n if (key < threshold) {\n counter.delete(key);\n }\n });\n };\n\n const _getTotalCount = (): number => {\n return [...counter.values()].reduce((a, b) => a + b, 0);\n };\n\n let isThrottled = false;\n\n return (...rest: Parameters<T>): ReturnType<T> | typeof THROTTLED | typeof SKIPPED => {\n // Date in second-precision, which we use as basis for the throttling\n const now = Math.floor(Date.now() / 1000);\n\n // First, make sure to delete any old entries\n _cleanup(now);\n\n // If already over limit, do nothing\n if (_getTotalCount() >= maxCount) {\n const wasThrottled = isThrottled;\n isThrottled = true;\n return wasThrottled ? SKIPPED : THROTTLED;\n }\n\n isThrottled = false;\n const count = counter.get(now) || 0;\n counter.set(now, count + 1);\n\n return fn(...rest);\n };\n}\n","/* eslint-disable max-lines */ // TODO: We might want to split this file up\nimport { EventType, record } from '@sentry-internal/rrweb';\nimport type { ReplayRecordingMode, Span } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, getActiveSpan, getClient, getRootSpan, spanToJSON } from '@sentry/core';\nimport {\n BUFFER_CHECKOUT_TIME,\n SESSION_IDLE_EXPIRE_DURATION,\n SESSION_IDLE_PAUSE_DURATION,\n SLOW_CLICK_SCROLL_TIMEOUT,\n SLOW_CLICK_THRESHOLD,\n WINDOW,\n} from './constants';\nimport { ClickDetector } from './coreHandlers/handleClick';\nimport { handleKeyboardEvent } from './coreHandlers/handleKeyboardEvent';\nimport { setupPerformanceObserver } from './coreHandlers/performanceObserver';\nimport { DEBUG_BUILD } from './debug-build';\nimport { createEventBuffer } from './eventBuffer';\nimport { clearSession } from './session/clearSession';\nimport { loadOrCreateSession } from './session/loadOrCreateSession';\nimport { saveSession } from './session/saveSession';\nimport { shouldRefreshSession } from './session/shouldRefreshSession';\nimport type {\n AddEventResult,\n AddUpdateCallback,\n AllPerformanceEntry,\n AllPerformanceEntryData,\n EventBuffer,\n InternalEventContext,\n PopEventContext,\n RecordingEvent,\n RecordingOptions,\n ReplayBreadcrumbFrame,\n ReplayCanvasIntegrationOptions,\n ReplayContainer as ReplayContainerInterface,\n ReplayPerformanceEntry,\n ReplayPluginOptions,\n SendBufferedReplayOptions,\n Session,\n SlowClickConfig,\n Timeouts,\n} from './types';\nimport { ReplayEventTypeCustom } from './types';\nimport { addEvent, addEventSync } from './util/addEvent';\nimport { addGlobalListeners } from './util/addGlobalListeners';\nimport { addMemoryEntry } from './util/addMemoryEntry';\nimport { createBreadcrumb } from './util/createBreadcrumb';\nimport { createPerformanceEntries } from './util/createPerformanceEntries';\nimport { createPerformanceSpans } from './util/createPerformanceSpans';\nimport { debounce } from './util/debounce';\nimport { getHandleRecordingEmit } from './util/handleRecordingEmit';\nimport { isExpired } from './util/isExpired';\nimport { isSessionExpired } from './util/isSessionExpired';\nimport { logger } from './util/logger';\nimport { resetReplayIdOnDynamicSamplingContext } from './util/resetReplayIdOnDynamicSamplingContext';\nimport { sendReplay } from './util/sendReplay';\nimport { RateLimitError } from './util/sendReplayRequest';\nimport type { SKIPPED } from './util/throttle';\nimport { THROTTLED, throttle } from './util/throttle';\n\n/**\n * The main replay container class, which holds all the state and methods for recording and sending replays.\n */\nexport class ReplayContainer implements ReplayContainerInterface {\n public eventBuffer: EventBuffer | null;\n\n public performanceEntries: AllPerformanceEntry[];\n\n public replayPerformanceEntries: ReplayPerformanceEntry<AllPerformanceEntryData>[];\n\n public session: Session | undefined;\n\n public clickDetector: ClickDetector | undefined;\n\n /**\n * Recording can happen in one of two modes:\n * - session: Record the whole session, sending it continuously\n * - buffer: Always keep the last 60s of recording, requires:\n * - having replaysOnErrorSampleRate > 0 to capture replay when an error occurs\n * - or calling `flush()` to send the replay\n */\n public recordingMode: ReplayRecordingMode;\n\n /**\n * The current or last active span.\n * This is only available when performance is enabled.\n */\n public lastActiveSpan?: Span;\n\n /**\n * These are here so we can overwrite them in tests etc.\n * @hidden\n */\n public readonly timeouts: Timeouts;\n\n /** The replay has to be manually started, because no sample rate (neither session or error) was provided. */\n private _requiresManualStart: boolean;\n\n private _throttledAddEvent: (\n event: RecordingEvent,\n isCheckout?: boolean,\n ) => typeof THROTTLED | typeof SKIPPED | Promise<AddEventResult | null>;\n\n /**\n * Options to pass to `rrweb.record()`\n */\n private readonly _recordingOptions: RecordingOptions;\n\n private readonly _options: ReplayPluginOptions;\n\n private _performanceCleanupCallback?: () => void;\n\n private _debouncedFlush: ReturnType<typeof debounce>;\n private _flushLock: Promise<unknown> | undefined;\n\n /**\n * Timestamp of the last user activity. This lives across sessions.\n */\n private _lastActivity: number;\n\n /**\n * Is the integration currently active?\n */\n private _isEnabled: boolean;\n\n /**\n * Paused is a state where:\n * - DOM Recording is not listening at all\n * - Nothing will be added to event buffer (e.g. core SDK events)\n */\n private _isPaused: boolean;\n\n /**\n * Have we attached listeners to the core SDK?\n * Note we have to track this as there is no way to remove instrumentation handlers.\n */\n private _hasInitializedCoreListeners: boolean;\n\n /**\n * Function to stop recording\n */\n private _stopRecording: ReturnType<typeof record> | undefined;\n\n private _context: InternalEventContext;\n\n /**\n * Internal use for canvas recording options\n */\n private _canvas: ReplayCanvasIntegrationOptions | undefined;\n\n public constructor({\n options,\n recordingOptions,\n }: {\n options: ReplayPluginOptions;\n recordingOptions: RecordingOptions;\n }) {\n this.eventBuffer = null;\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n this.recordingMode = 'session';\n this.timeouts = {\n sessionIdlePause: SESSION_IDLE_PAUSE_DURATION,\n sessionIdleExpire: SESSION_IDLE_EXPIRE_DURATION,\n } as const;\n this._lastActivity = Date.now();\n this._isEnabled = false;\n this._isPaused = false;\n this._requiresManualStart = false;\n this._hasInitializedCoreListeners = false;\n this._context = {\n errorIds: new Set(),\n traceIds: new Set(),\n urls: [],\n initialTimestamp: Date.now(),\n initialUrl: '',\n };\n\n this._recordingOptions = recordingOptions;\n this._options = options;\n\n this._debouncedFlush = debounce(() => this._flush(), this._options.flushMinDelay, {\n maxWait: this._options.flushMaxDelay,\n });\n\n this._throttledAddEvent = throttle(\n (event: RecordingEvent, isCheckout?: boolean) => addEvent(this, event, isCheckout),\n // Max 300 events...\n 300,\n // ... per 5s\n 5,\n );\n\n const { slowClickTimeout, slowClickIgnoreSelectors } = this.getOptions();\n\n const slowClickConfig: SlowClickConfig | undefined = slowClickTimeout\n ? {\n threshold: Math.min(SLOW_CLICK_THRESHOLD, slowClickTimeout),\n timeout: slowClickTimeout,\n scrollTimeout: SLOW_CLICK_SCROLL_TIMEOUT,\n ignoreSelector: slowClickIgnoreSelectors ? slowClickIgnoreSelectors.join(',') : '',\n }\n : undefined;\n\n if (slowClickConfig) {\n this.clickDetector = new ClickDetector(this, slowClickConfig);\n }\n\n // Configure replay logger w/ experimental options\n if (DEBUG_BUILD) {\n const experiments = options._experiments;\n logger.setConfig({\n captureExceptions: !!experiments.captureExceptions,\n traceInternals: !!experiments.traceInternals,\n });\n }\n }\n\n /** Get the event context. */\n public getContext(): InternalEventContext {\n return this._context;\n }\n\n /** If recording is currently enabled. */\n public isEnabled(): boolean {\n return this._isEnabled;\n }\n\n /** If recording is currently paused. */\n public isPaused(): boolean {\n return this._isPaused;\n }\n\n /**\n * Determine if canvas recording is enabled\n */\n public isRecordingCanvas(): boolean {\n return Boolean(this._canvas);\n }\n\n /** Get the replay integration options. */\n public getOptions(): ReplayPluginOptions {\n return this._options;\n }\n\n /** A wrapper to conditionally capture exceptions. */\n public handleException(error: unknown): void {\n DEBUG_BUILD && logger.exception(error);\n if (this._options.onError) {\n this._options.onError(error);\n }\n }\n\n /**\n * Initializes the plugin based on sampling configuration. Should not be\n * called outside of constructor.\n */\n public initializeSampling(previousSessionId?: string): void {\n const { errorSampleRate, sessionSampleRate } = this._options;\n\n // If neither sample rate is > 0, then do nothing - user will need to call one of\n // `start()` or `startBuffering` themselves.\n const requiresManualStart = errorSampleRate <= 0 && sessionSampleRate <= 0;\n\n this._requiresManualStart = requiresManualStart;\n\n if (requiresManualStart) {\n return;\n }\n\n // Otherwise if there is _any_ sample rate set, try to load an existing\n // session, or create a new one.\n this._initializeSessionForSampling(previousSessionId);\n\n if (!this.session) {\n // This should not happen, something wrong has occurred\n DEBUG_BUILD && logger.exception(new Error('Unable to initialize and create session'));\n return;\n }\n\n if (this.session.sampled === false) {\n // This should only occur if `errorSampleRate` is 0 and was unsampled for\n // session-based replay. In this case there is nothing to do.\n return;\n }\n\n // If segmentId > 0, it means we've previously already captured this session\n // In this case, we still want to continue in `session` recording mode\n this.recordingMode = this.session.sampled === 'buffer' && this.session.segmentId === 0 ? 'buffer' : 'session';\n\n DEBUG_BUILD && logger.infoTick(`Starting replay in ${this.recordingMode} mode`);\n\n this._initializeRecording();\n }\n\n /**\n * Start a replay regardless of sampling rate. Calling this will always\n * create a new session. Will log a message if replay is already in progress.\n *\n * Creates or loads a session, attaches listeners to varying events (DOM,\n * _performanceObserver, Recording, Sentry SDK, etc)\n */\n public start(): void {\n if (this._isEnabled && this.recordingMode === 'session') {\n DEBUG_BUILD && logger.info('Recording is already in progress');\n return;\n }\n\n if (this._isEnabled && this.recordingMode === 'buffer') {\n DEBUG_BUILD && logger.info('Buffering is in progress, call `flush()` to save the replay');\n return;\n }\n\n DEBUG_BUILD && logger.infoTick('Starting replay in session mode');\n\n // Required as user activity is initially set in\n // constructor, so if `start()` is called after\n // session idle expiration, a replay will not be\n // created due to an idle timeout.\n this._updateUserActivity();\n\n const session = loadOrCreateSession(\n {\n maxReplayDuration: this._options.maxReplayDuration,\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n },\n {\n stickySession: this._options.stickySession,\n // This is intentional: create a new session-based replay when calling `start()`\n sessionSampleRate: 1,\n allowBuffering: false,\n },\n );\n\n this.session = session;\n\n this._initializeRecording();\n }\n\n /**\n * Start replay buffering. Buffers until `flush()` is called or, if\n * `replaysOnErrorSampleRate` > 0, an error occurs.\n */\n public startBuffering(): void {\n if (this._isEnabled) {\n DEBUG_BUILD && logger.info('Buffering is in progress, call `flush()` to save the replay');\n return;\n }\n\n DEBUG_BUILD && logger.infoTick('Starting replay in buffer mode');\n\n const session = loadOrCreateSession(\n {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n },\n {\n stickySession: this._options.stickySession,\n sessionSampleRate: 0,\n allowBuffering: true,\n },\n );\n\n this.session = session;\n\n this.recordingMode = 'buffer';\n this._initializeRecording();\n }\n\n /**\n * Start recording.\n *\n * Note that this will cause a new DOM checkout\n */\n public startRecording(): void {\n try {\n const canvasOptions = this._canvas;\n\n this._stopRecording = record({\n ...this._recordingOptions,\n // When running in error sampling mode, we need to overwrite `checkoutEveryNms`\n // Without this, it would record forever, until an error happens, which we don't want\n // instead, we'll always keep the last 60 seconds of replay before an error happened\n ...(this.recordingMode === 'buffer'\n ? { checkoutEveryNms: BUFFER_CHECKOUT_TIME }\n : // Otherwise, use experimental option w/ min checkout time of 6 minutes\n // This is to improve playback seeking as there could potentially be\n // less mutations to process in the worse cases.\n //\n // checkout by \"N\" events is probably ideal, but means we have less\n // control about the number of checkouts we make (which generally\n // increases replay size)\n this._options._experiments.continuousCheckout && {\n // Minimum checkout time is 6 minutes\n checkoutEveryNms: Math.max(360_000, this._options._experiments.continuousCheckout),\n }),\n emit: getHandleRecordingEmit(this),\n onMutation: this._onMutationHandler,\n ...(canvasOptions\n ? {\n recordCanvas: canvasOptions.recordCanvas,\n getCanvasManager: canvasOptions.getCanvasManager,\n sampling: canvasOptions.sampling,\n dataURLOptions: canvasOptions.dataURLOptions,\n }\n : {}),\n });\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Stops the recording, if it was running.\n *\n * Returns true if it was previously stopped, or is now stopped,\n * otherwise false.\n */\n public stopRecording(): boolean {\n try {\n if (this._stopRecording) {\n this._stopRecording();\n this._stopRecording = undefined;\n }\n\n return true;\n } catch (err) {\n this.handleException(err);\n return false;\n }\n }\n\n /**\n * Currently, this needs to be manually called (e.g. for tests). Sentry SDK\n * does not support a teardown\n */\n public async stop({ forceFlush = false, reason }: { forceFlush?: boolean; reason?: string } = {}): Promise<void> {\n if (!this._isEnabled) {\n return;\n }\n\n // We can't move `_isEnabled` after awaiting a flush, otherwise we can\n // enter into an infinite loop when `stop()` is called while flushing.\n this._isEnabled = false;\n\n try {\n DEBUG_BUILD && logger.info(`Stopping Replay${reason ? ` triggered by ${reason}` : ''}`);\n\n resetReplayIdOnDynamicSamplingContext();\n\n this._removeListeners();\n this.stopRecording();\n\n this._debouncedFlush.cancel();\n // See comment above re: `_isEnabled`, we \"force\" a flush, ignoring the\n // `_isEnabled` state of the plugin since it was disabled above.\n if (forceFlush) {\n await this._flush({ force: true });\n }\n\n // After flush, destroy event buffer\n this.eventBuffer && this.eventBuffer.destroy();\n this.eventBuffer = null;\n\n // Clear session from session storage, note this means if a new session\n // is started after, it will not have `previousSessionId`\n clearSession(this);\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Pause some replay functionality. See comments for `_isPaused`.\n * This differs from stop as this only stops DOM recording, it is\n * not as thorough of a shutdown as `stop()`.\n */\n public pause(): void {\n if (this._isPaused) {\n return;\n }\n\n this._isPaused = true;\n this.stopRecording();\n\n DEBUG_BUILD && logger.info('Pausing replay');\n }\n\n /**\n * Resumes recording, see notes for `pause().\n *\n * Note that calling `startRecording()` here will cause a\n * new DOM checkout.`\n */\n public resume(): void {\n if (!this._isPaused || !this._checkSession()) {\n return;\n }\n\n this._isPaused = false;\n this.startRecording();\n\n DEBUG_BUILD && logger.info('Resuming replay');\n }\n\n /**\n * If not in \"session\" recording mode, flush event buffer which will create a new replay.\n * Unless `continueRecording` is false, the replay will continue to record and\n * behave as a \"session\"-based replay.\n *\n * Otherwise, queue up a flush.\n */\n public async sendBufferedReplayOrFlush({ continueRecording = true }: SendBufferedReplayOptions = {}): Promise<void> {\n if (this.recordingMode === 'session') {\n return this.flushImmediate();\n }\n\n const activityTime = Date.now();\n\n DEBUG_BUILD && logger.info('Converting buffer to session');\n\n // Allow flush to complete before resuming as a session recording, otherwise\n // the checkout from `startRecording` may be included in the payload.\n // Prefer to keep the error replay as a separate (and smaller) segment\n // than the session replay.\n await this.flushImmediate();\n\n const hasStoppedRecording = this.stopRecording();\n\n if (!continueRecording || !hasStoppedRecording) {\n return;\n }\n\n // To avoid race conditions where this is called multiple times, we check here again that we are still buffering\n if ((this.recordingMode as ReplayRecordingMode) === 'session') {\n return;\n }\n\n // Re-start recording in session-mode\n this.recordingMode = 'session';\n\n // Once this session ends, we do not want to refresh it\n if (this.session) {\n this._updateUserActivity(activityTime);\n this._updateSessionActivity(activityTime);\n this._maybeSaveSession();\n }\n\n this.startRecording();\n }\n\n /**\n * We want to batch uploads of replay events. Save events only if\n * `<flushMinDelay>` milliseconds have elapsed since the last event\n * *OR* if `<flushMaxDelay>` milliseconds have elapsed.\n *\n * Accepts a callback to perform side-effects and returns true to stop batch\n * processing and hand back control to caller.\n */\n public addUpdate(cb: AddUpdateCallback): void {\n // We need to always run `cb` (e.g. in the case of `this.recordingMode == 'buffer'`)\n const cbResult = cb();\n\n // If this option is turned on then we will only want to call `flush`\n // explicitly\n if (this.recordingMode === 'buffer') {\n return;\n }\n\n // If callback is true, we do not want to continue with flushing -- the\n // caller will need to handle it.\n if (cbResult === true) {\n return;\n }\n\n // addUpdate is called quite frequently - use _debouncedFlush so that it\n // respects the flush delays and does not flush immediately\n this._debouncedFlush();\n }\n\n /**\n * Updates the user activity timestamp and resumes recording. This should be\n * called in an event handler for a user action that we consider as the user\n * being \"active\" (e.g. a mouse click).\n */\n public triggerUserActivity(): void {\n this._updateUserActivity();\n\n // This case means that recording was once stopped due to inactivity.\n // Ensure that recording is resumed.\n if (!this._stopRecording) {\n // Create a new session, otherwise when the user action is flushed, it\n // will get rejected due to an expired session.\n if (!this._checkSession()) {\n return;\n }\n\n // Note: This will cause a new DOM checkout\n this.resume();\n return;\n }\n\n // Otherwise... recording was never suspended, continue as normalish\n this.checkAndHandleExpiredSession();\n\n this._updateSessionActivity();\n }\n\n /**\n * Updates the user activity timestamp *without* resuming\n * recording. Some user events (e.g. keydown) can be create\n * low-value replays that only contain the keypress as a\n * breadcrumb. Instead this would require other events to\n * create a new replay after a session has expired.\n */\n public updateUserActivity(): void {\n this._updateUserActivity();\n this._updateSessionActivity();\n }\n\n /**\n * Only flush if `this.recordingMode === 'session'`\n */\n public conditionalFlush(): Promise<void> {\n if (this.recordingMode === 'buffer') {\n return Promise.resolve();\n }\n\n return this.flushImmediate();\n }\n\n /**\n * Flush using debounce flush\n */\n public flush(): Promise<void> {\n return this._debouncedFlush() as Promise<void>;\n }\n\n /**\n * Always flush via `_debouncedFlush` so that we do not have flushes triggered\n * from calling both `flush` and `_debouncedFlush`. Otherwise, there could be\n * cases of multiple flushes happening closely together.\n */\n public flushImmediate(): Promise<void> {\n this._debouncedFlush();\n // `.flush` is provided by the debounced function, analogously to lodash.debounce\n return this._debouncedFlush.flush() as Promise<void>;\n }\n\n /**\n * Cancels queued up flushes.\n */\n public cancelFlush(): void {\n this._debouncedFlush.cancel();\n }\n\n /** Get the current session (=replay) ID */\n public getSessionId(): string | undefined {\n return this.session && this.session.id;\n }\n\n /**\n * Checks if recording should be stopped due to user inactivity. Otherwise\n * check if session is expired and create a new session if so. Triggers a new\n * full snapshot on new session.\n *\n * Returns true if session is not expired, false otherwise.\n * @hidden\n */\n public checkAndHandleExpiredSession(): boolean | void {\n // Prevent starting a new session if the last user activity is older than\n // SESSION_IDLE_PAUSE_DURATION. Otherwise non-user activity can trigger a new\n // session+recording. This creates noisy replays that do not have much\n // content in them.\n if (\n this._lastActivity &&\n isExpired(this._lastActivity, this.timeouts.sessionIdlePause) &&\n this.session &&\n this.session.sampled === 'session'\n ) {\n // Pause recording only for session-based replays. Otherwise, resuming\n // will create a new replay and will conflict with users who only choose\n // to record error-based replays only. (e.g. the resumed replay will not\n // contain a reference to an error)\n this.pause();\n return;\n }\n\n // --- There is recent user activity --- //\n // This will create a new session if expired, based on expiry length\n if (!this._checkSession()) {\n // Check session handles the refreshing itself\n return false;\n }\n\n return true;\n }\n\n /**\n * Capture some initial state that can change throughout the lifespan of the\n * replay. This is required because otherwise they would be captured at the\n * first flush.\n */\n public setInitialState(): void {\n const urlPath = `${WINDOW.location.pathname}${WINDOW.location.hash}${WINDOW.location.search}`;\n const url = `${WINDOW.location.origin}${urlPath}`;\n\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n\n // Reset _context as well\n this._clearContext();\n\n this._context.initialUrl = url;\n this._context.initialTimestamp = Date.now();\n this._context.urls.push(url);\n }\n\n /**\n * Add a breadcrumb event, that may be throttled.\n * If it was throttled, we add a custom breadcrumb to indicate that.\n */\n public throttledAddEvent(\n event: RecordingEvent,\n isCheckout?: boolean,\n ): typeof THROTTLED | typeof SKIPPED | Promise<AddEventResult | null> {\n const res = this._throttledAddEvent(event, isCheckout);\n\n // If this is THROTTLED, it means we have throttled the event for the first time\n // In this case, we want to add a breadcrumb indicating that something was skipped\n if (res === THROTTLED) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.throttled',\n });\n\n this.addUpdate(() => {\n // Return `false` if the event _was_ added, as that means we schedule a flush\n return !addEventSync(this, {\n type: ReplayEventTypeCustom,\n timestamp: breadcrumb.timestamp || 0,\n data: {\n tag: 'breadcrumb',\n payload: breadcrumb,\n metric: true,\n },\n });\n });\n }\n\n return res;\n }\n\n /**\n * This will get the parametrized route name of the current page.\n * This is only available if performance is enabled, and if an instrumented router is used.\n */\n public getCurrentRoute(): string | undefined {\n const lastActiveSpan = this.lastActiveSpan || getActiveSpan();\n const lastRootSpan = lastActiveSpan && getRootSpan(lastActiveSpan);\n\n const attributes = (lastRootSpan && spanToJSON(lastRootSpan).data) || {};\n const source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (!lastRootSpan || !source || !['route', 'custom'].includes(source)) {\n return undefined;\n }\n\n return spanToJSON(lastRootSpan).description;\n }\n\n /**\n * Initialize and start all listeners to varying events (DOM,\n * Performance Observer, Recording, Sentry SDK, etc)\n */\n private _initializeRecording(): void {\n this.setInitialState();\n\n // this method is generally called on page load or manually - in both cases\n // we should treat it as an activity\n this._updateSessionActivity();\n\n this.eventBuffer = createEventBuffer({\n useCompression: this._options.useCompression,\n workerUrl: this._options.workerUrl,\n });\n\n this._removeListeners();\n this._addListeners();\n\n // Need to set as enabled before we start recording, as `record()` can trigger a flush with a new checkout\n this._isEnabled = true;\n this._isPaused = false;\n\n this.startRecording();\n }\n\n /**\n * Loads (or refreshes) the current session.\n */\n private _initializeSessionForSampling(previousSessionId?: string): void {\n // Whenever there is _any_ error sample rate, we always allow buffering\n // Because we decide on sampling when an error occurs, we need to buffer at all times if sampling for errors\n const allowBuffering = this._options.errorSampleRate > 0;\n\n const session = loadOrCreateSession(\n {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n previousSessionId,\n },\n {\n stickySession: this._options.stickySession,\n sessionSampleRate: this._options.sessionSampleRate,\n allowBuffering,\n },\n );\n\n this.session = session;\n }\n\n /**\n * Checks and potentially refreshes the current session.\n * Returns false if session is not recorded.\n */\n private _checkSession(): boolean {\n // If there is no session yet, we do not want to refresh anything\n // This should generally not happen, but to be safe....\n if (!this.session) {\n return false;\n }\n\n const currentSession = this.session;\n\n if (\n shouldRefreshSession(currentSession, {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n })\n ) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._refreshSession(currentSession);\n return false;\n }\n\n return true;\n }\n\n /**\n * Refresh a session with a new one.\n * This stops the current session (without forcing a flush, as that would never work since we are expired),\n * and then does a new sampling based on the refreshed session.\n */\n private async _refreshSession(session: Session): Promise<void> {\n if (!this._isEnabled) {\n return;\n }\n await this.stop({ reason: 'refresh session' });\n this.initializeSampling(session.id);\n }\n\n /**\n * Adds listeners to record events for the replay\n */\n private _addListeners(): void {\n try {\n WINDOW.document.addEventListener('visibilitychange', this._handleVisibilityChange);\n WINDOW.addEventListener('blur', this._handleWindowBlur);\n WINDOW.addEventListener('focus', this._handleWindowFocus);\n WINDOW.addEventListener('keydown', this._handleKeyboardEvent);\n\n if (this.clickDetector) {\n this.clickDetector.addListeners();\n }\n\n // There is no way to remove these listeners, so ensure they are only added once\n if (!this._hasInitializedCoreListeners) {\n addGlobalListeners(this);\n\n this._hasInitializedCoreListeners = true;\n }\n } catch (err) {\n this.handleException(err);\n }\n\n this._performanceCleanupCallback = setupPerformanceObserver(this);\n }\n\n /**\n * Cleans up listeners that were created in `_addListeners`\n */\n private _removeListeners(): void {\n try {\n WINDOW.document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n\n WINDOW.removeEventListener('blur', this._handleWindowBlur);\n WINDOW.removeEventListener('focus', this._handleWindowFocus);\n WINDOW.removeEventListener('keydown', this._handleKeyboardEvent);\n\n if (this.clickDetector) {\n this.clickDetector.removeListeners();\n }\n\n if (this._performanceCleanupCallback) {\n this._performanceCleanupCallback();\n }\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Handle when visibility of the page content changes. Opening a new tab will\n * cause the state to change to hidden because of content of current page will\n * be hidden. Likewise, moving a different window to cover the contents of the\n * page will also trigger a change to a hidden state.\n */\n private _handleVisibilityChange: () => void = () => {\n if (WINDOW.document.visibilityState === 'visible') {\n this._doChangeToForegroundTasks();\n } else {\n this._doChangeToBackgroundTasks();\n }\n };\n\n /**\n * Handle when page is blurred\n */\n private _handleWindowBlur: () => void = () => {\n const breadcrumb = createBreadcrumb({\n category: 'ui.blur',\n });\n\n // Do not count blur as a user action -- it's part of the process of them\n // leaving the page\n this._doChangeToBackgroundTasks(breadcrumb);\n };\n\n /**\n * Handle when page is focused\n */\n private _handleWindowFocus: () => void = () => {\n const breadcrumb = createBreadcrumb({\n category: 'ui.focus',\n });\n\n // Do not count focus as a user action -- instead wait until they focus and\n // interactive with page\n this._doChangeToForegroundTasks(breadcrumb);\n };\n\n /** Ensure page remains active when a key is pressed. */\n private _handleKeyboardEvent: (event: KeyboardEvent) => void = (event: KeyboardEvent) => {\n handleKeyboardEvent(this, event);\n };\n\n /**\n * Tasks to run when we consider a page to be hidden (via blurring and/or visibility)\n */\n private _doChangeToBackgroundTasks(breadcrumb?: ReplayBreadcrumbFrame): void {\n if (!this.session) {\n return;\n }\n\n const expired = isSessionExpired(this.session, {\n maxReplayDuration: this._options.maxReplayDuration,\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n });\n\n if (expired) {\n return;\n }\n\n if (breadcrumb) {\n this._createCustomBreadcrumb(breadcrumb);\n }\n\n // Send replay when the page/tab becomes hidden. There is no reason to send\n // replay if it becomes visible, since no actions we care about were done\n // while it was hidden\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n void this.conditionalFlush();\n }\n\n /**\n * Tasks to run when we consider a page to be visible (via focus and/or visibility)\n */\n private _doChangeToForegroundTasks(breadcrumb?: ReplayBreadcrumbFrame): void {\n if (!this.session) {\n return;\n }\n\n const isSessionActive = this.checkAndHandleExpiredSession();\n\n if (!isSessionActive) {\n // If the user has come back to the page within SESSION_IDLE_PAUSE_DURATION\n // ms, we will re-use the existing session, otherwise create a new\n // session\n DEBUG_BUILD && logger.info('Document has become active, but session has expired');\n return;\n }\n\n if (breadcrumb) {\n this._createCustomBreadcrumb(breadcrumb);\n }\n }\n\n /**\n * Update user activity (across session lifespans)\n */\n private _updateUserActivity(_lastActivity: number = Date.now()): void {\n this._lastActivity = _lastActivity;\n }\n\n /**\n * Updates the session's last activity timestamp\n */\n private _updateSessionActivity(_lastActivity: number = Date.now()): void {\n if (this.session) {\n this.session.lastActivity = _lastActivity;\n this._maybeSaveSession();\n }\n }\n\n /**\n * Helper to create (and buffer) a replay breadcrumb from a core SDK breadcrumb\n */\n private _createCustomBreadcrumb(breadcrumb: ReplayBreadcrumbFrame): void {\n this.addUpdate(() => {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.throttledAddEvent({\n type: EventType.Custom,\n timestamp: breadcrumb.timestamp || 0,\n data: {\n tag: 'breadcrumb',\n payload: breadcrumb,\n },\n });\n });\n }\n\n /**\n * Observed performance events are added to `this.performanceEntries`. These\n * are included in the replay event before it is finished and sent to Sentry.\n */\n private _addPerformanceEntries(): Promise<Array<AddEventResult | null>> {\n let performanceEntries = createPerformanceEntries(this.performanceEntries).concat(this.replayPerformanceEntries);\n\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n\n // If we are manually starting, we want to ensure we only include performance entries\n // that are after the initial timestamp\n // The reason for this is that we may have performance entries from the page load, but may decide to start\n // the replay later on, in which case we do not want to include these entries.\n // without this, manually started replays can have events long before the actual replay recording starts,\n // which messes with the timeline etc.\n if (this._requiresManualStart) {\n const initialTimestampInSeconds = this._context.initialTimestamp / 1000;\n performanceEntries = performanceEntries.filter(entry => entry.start >= initialTimestampInSeconds);\n }\n\n return Promise.all(createPerformanceSpans(this, performanceEntries));\n }\n\n /**\n * Clear _context\n */\n private _clearContext(): void {\n // XXX: `initialTimestamp` and `initialUrl` do not get cleared\n this._context.errorIds.clear();\n this._context.traceIds.clear();\n this._context.urls = [];\n }\n\n /** Update the initial timestamp based on the buffer content. */\n private _updateInitialTimestampFromEventBuffer(): void {\n const { session, eventBuffer } = this;\n // If replay was started manually (=no sample rate was given),\n // We do not want to back-port the initial timestamp\n if (!session || !eventBuffer || this._requiresManualStart) {\n return;\n }\n\n // we only ever update this on the initial segment\n if (session.segmentId) {\n return;\n }\n\n const earliestEvent = eventBuffer.getEarliestTimestamp();\n if (earliestEvent && earliestEvent < this._context.initialTimestamp) {\n this._context.initialTimestamp = earliestEvent;\n }\n }\n\n /**\n * Return and clear _context\n */\n private _popEventContext(): PopEventContext {\n const _context = {\n initialTimestamp: this._context.initialTimestamp,\n initialUrl: this._context.initialUrl,\n errorIds: Array.from(this._context.errorIds),\n traceIds: Array.from(this._context.traceIds),\n urls: this._context.urls,\n };\n\n this._clearContext();\n\n return _context;\n }\n\n /**\n * Flushes replay event buffer to Sentry.\n *\n * Performance events are only added right before flushing - this is\n * due to the buffered performance observer events.\n *\n * Should never be called directly, only by `flush`\n */\n private async _runFlush(): Promise<void> {\n const replayId = this.getSessionId();\n\n if (!this.session || !this.eventBuffer || !replayId) {\n DEBUG_BUILD && logger.error('No session or eventBuffer found to flush.');\n return;\n }\n\n await this._addPerformanceEntries();\n\n // Check eventBuffer again, as it could have been stopped in the meanwhile\n if (!this.eventBuffer || !this.eventBuffer.hasEvents) {\n return;\n }\n\n // Only attach memory event if eventBuffer is not empty\n await addMemoryEntry(this);\n\n // Check eventBuffer again, as it could have been stopped in the meanwhile\n if (!this.eventBuffer) {\n return;\n }\n\n // if this changed in the meanwhile, e.g. because the session was refreshed or similar, we abort here\n if (replayId !== this.getSessionId()) {\n return;\n }\n\n try {\n // This uses the data from the eventBuffer, so we need to call this before `finish()\n this._updateInitialTimestampFromEventBuffer();\n\n const timestamp = Date.now();\n\n // Check total duration again, to avoid sending outdated stuff\n // We leave 30s wiggle room to accommodate late flushing etc.\n // This _could_ happen when the browser is suspended during flushing, in which case we just want to stop\n if (timestamp - this._context.initialTimestamp > this._options.maxReplayDuration + 30_000) {\n throw new Error('Session is too long, not sending replay');\n }\n\n const eventContext = this._popEventContext();\n // Always increment segmentId regardless of outcome of sending replay\n const segmentId = this.session.segmentId++;\n this._maybeSaveSession();\n\n // Note this empties the event buffer regardless of outcome of sending replay\n const recordingData = await this.eventBuffer.finish();\n\n await sendReplay({\n replayId,\n recordingData,\n segmentId,\n eventContext,\n session: this.session,\n timestamp,\n onError: err => this.handleException(err),\n });\n } catch (err) {\n this.handleException(err);\n\n // This means we retried 3 times and all of them failed,\n // or we ran into a problem we don't want to retry, like rate limiting.\n // In this case, we want to completely stop the replay - otherwise, we may get inconsistent segments\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stop({ reason: 'sendReplay' });\n\n const client = getClient();\n\n if (client) {\n const dropReason = err instanceof RateLimitError ? 'ratelimit_backoff' : 'send_error';\n client.recordDroppedEvent(dropReason, 'replay');\n }\n }\n }\n\n /**\n * Flush recording data to Sentry. Creates a lock so that only a single flush\n * can be active at a time. Do not call this directly.\n */\n private _flush = async ({\n force = false,\n }: {\n /**\n * If true, flush while ignoring the `_isEnabled` state of\n * Replay integration. (By default, flush is noop if integration\n * is stopped).\n */\n force?: boolean;\n } = {}): Promise<void> => {\n if (!this._isEnabled && !force) {\n // This can happen if e.g. the replay was stopped because of exceeding the retry limit\n return;\n }\n\n if (!this.checkAndHandleExpiredSession()) {\n DEBUG_BUILD && logger.error('Attempting to finish replay event after session expired.');\n return;\n }\n\n if (!this.session) {\n // should never happen, as we would have bailed out before\n return;\n }\n\n const start = this.session.started;\n const now = Date.now();\n const duration = now - start;\n\n // A flush is about to happen, cancel any queued flushes\n this._debouncedFlush.cancel();\n\n // If session is too short, or too long (allow some wiggle room over maxReplayDuration), do not send it\n // This _should_ not happen, but it may happen if flush is triggered due to a page activity change or similar\n const tooShort = duration < this._options.minReplayDuration;\n const tooLong = duration > this._options.maxReplayDuration + 5_000;\n if (tooShort || tooLong) {\n DEBUG_BUILD &&\n logger.info(\n `Session duration (${Math.floor(duration / 1000)}s) is too ${\n tooShort ? 'short' : 'long'\n }, not sending replay.`,\n );\n\n if (tooShort) {\n this._debouncedFlush();\n }\n return;\n }\n\n const eventBuffer = this.eventBuffer;\n if (eventBuffer && this.session.segmentId === 0 && !eventBuffer.hasCheckout) {\n DEBUG_BUILD && logger.info('Flushing initial segment without checkout.');\n // TODO FN: Evaluate if we want to stop here, or remove this again?\n }\n\n const _flushInProgress = !!this._flushLock;\n\n // this._flushLock acts as a lock so that future calls to `_flush()` will\n // be blocked until current flush is finished (i.e. this promise resolves)\n if (!this._flushLock) {\n this._flushLock = this._runFlush();\n }\n\n try {\n await this._flushLock;\n } catch (err) {\n this.handleException(err);\n } finally {\n this._flushLock = undefined;\n\n if (_flushInProgress) {\n // Wait for previous flush to finish, then call the debounced\n // `_flush()`. It's possible there are other flush requests queued and\n // waiting for it to resolve. We want to reduce all outstanding\n // requests (as well as any new flush requests that occur within a\n // second of the locked flush completing) into a single flush.\n this._debouncedFlush();\n }\n }\n };\n\n /** Save the session, if it is sticky */\n private _maybeSaveSession(): void {\n if (this.session && this._options.stickySession) {\n saveSession(this.session);\n }\n }\n\n /** Handler for rrweb.record.onMutation */\n private _onMutationHandler = (mutations: unknown[]): boolean => {\n const count = mutations.length;\n\n const mutationLimit = this._options.mutationLimit;\n const mutationBreadcrumbLimit = this._options.mutationBreadcrumbLimit;\n const overMutationLimit = mutationLimit && count > mutationLimit;\n\n // Create a breadcrumb if a lot of mutations happen at the same time\n // We can show this in the UI as an information with potential performance improvements\n if (count > mutationBreadcrumbLimit || overMutationLimit) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.mutations',\n data: {\n count,\n limit: overMutationLimit,\n },\n });\n this._createCustomBreadcrumb(breadcrumb);\n }\n\n // Stop replay if over the mutation limit\n if (overMutationLimit) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stop({ reason: 'mutationLimit', forceFlush: this.recordingMode === 'session' });\n return false;\n }\n\n // `true` means we use the regular mutation handling by rrweb\n return true;\n };\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\n\ntype DebouncedCallback = {\n (): void | unknown;\n flush: () => void | unknown;\n cancel: () => void;\n};\ntype CallbackFunction = () => unknown;\ntype DebounceOptions = { maxWait?: number };\n\n/**\n * Heavily simplified debounce function based on lodash.debounce.\n *\n * This function takes a callback function (@param fun) and delays its invocation\n * by @param wait milliseconds. Optionally, a maxWait can be specified in @param options,\n * which ensures that the callback is invoked at least once after the specified max. wait time.\n *\n * @param func the function whose invocation is to be debounced\n * @param wait the minimum time until the function is invoked after it was called once\n * @param options the options object, which can contain the `maxWait` property\n *\n * @returns the debounced version of the function, which needs to be called at least once to start the\n * debouncing process. Subsequent calls will reset the debouncing timer and, in case @paramfunc\n * was already invoked in the meantime, return @param func's return value.\n * The debounced function has two additional properties:\n * - `flush`: Invokes the debounced function immediately and returns its return value\n * - `cancel`: Cancels the debouncing process and resets the debouncing timer\n */\nexport function debounce(func: CallbackFunction, wait: number, options?: DebounceOptions): DebouncedCallback {\n let callbackReturnValue: unknown;\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let maxTimerId: ReturnType<typeof setTimeout> | undefined;\n\n const maxWait = options && options.maxWait ? Math.max(options.maxWait, wait) : 0;\n\n function invokeFunc(): unknown {\n cancelTimers();\n callbackReturnValue = func();\n return callbackReturnValue;\n }\n\n function cancelTimers(): void {\n timerId !== undefined && clearTimeout(timerId);\n maxTimerId !== undefined && clearTimeout(maxTimerId);\n timerId = maxTimerId = undefined;\n }\n\n function flush(): unknown {\n if (timerId !== undefined || maxTimerId !== undefined) {\n return invokeFunc();\n }\n return callbackReturnValue;\n }\n\n function debounced(): unknown {\n if (timerId) {\n clearTimeout(timerId);\n }\n timerId = setTimeout(invokeFunc, wait);\n\n if (maxWait && maxTimerId === undefined) {\n maxTimerId = setTimeout(invokeFunc, maxWait);\n }\n\n return callbackReturnValue;\n }\n\n debounced.cancel = cancelTimers;\n debounced.flush = flush;\n return debounced;\n}\n","import {\n addClickKeypressInstrumentationHandler,\n addHistoryInstrumentationHandler,\n} from '@sentry-internal/browser-utils';\nimport { addEventProcessor, getClient } from '@sentry/core';\nimport type { DynamicSamplingContext } from '@sentry/core';\n\nimport { handleAfterSendEvent } from '../coreHandlers/handleAfterSendEvent';\nimport { handleBeforeSendEvent } from '../coreHandlers/handleBeforeSendEvent';\nimport { handleBreadcrumbs } from '../coreHandlers/handleBreadcrumbs';\nimport { handleDomListener } from '../coreHandlers/handleDom';\nimport { handleGlobalEventListener } from '../coreHandlers/handleGlobalEvent';\nimport { handleHistorySpanListener } from '../coreHandlers/handleHistory';\nimport { handleNetworkBreadcrumbs } from '../coreHandlers/handleNetworkBreadcrumbs';\nimport type { ReplayContainer } from '../types';\n\n/**\n * Add global listeners that cannot be removed.\n */\nexport function addGlobalListeners(replay: ReplayContainer): void {\n // Listeners from core SDK //\n const client = getClient();\n\n addClickKeypressInstrumentationHandler(handleDomListener(replay));\n addHistoryInstrumentationHandler(handleHistorySpanListener(replay));\n handleBreadcrumbs(replay);\n handleNetworkBreadcrumbs(replay);\n\n // Tag all (non replay) events that get sent to Sentry with the current\n // replay ID so that we can reference them later in the UI\n const eventProcessor = handleGlobalEventListener(replay);\n addEventProcessor(eventProcessor);\n\n // If a custom client has no hooks yet, we continue to use the \"old\" implementation\n if (client) {\n client.on('beforeSendEvent', handleBeforeSendEvent(replay));\n client.on('afterSendEvent', handleAfterSendEvent(replay));\n client.on('createDsc', (dsc: DynamicSamplingContext) => {\n const replayId = replay.getSessionId();\n // We do not want to set the DSC when in buffer mode, as that means the replay has not been sent (yet)\n if (replayId && replay.isEnabled() && replay.recordingMode === 'session') {\n // Ensure to check that the session is still active - it could have expired in the meanwhile\n const isSessionActive = replay.checkAndHandleExpiredSession();\n if (isSessionActive) {\n dsc.replay_id = replayId;\n }\n }\n });\n\n client.on('spanStart', span => {\n replay.lastActiveSpan = span;\n });\n\n // We may be missing the initial spanStart due to timing issues,\n // so we capture it on finish again.\n client.on('spanEnd', span => {\n replay.lastActiveSpan = span;\n });\n\n // We want to flush replay\n client.on('beforeSendFeedback', (feedbackEvent, options) => {\n const replayId = replay.getSessionId();\n if (options && options.includeReplay && replay.isEnabled() && replayId) {\n // This should never reject\n if (feedbackEvent.contexts && feedbackEvent.contexts.feedback) {\n feedbackEvent.contexts.feedback.replay_id = replayId;\n }\n }\n });\n }\n}\n","import {\n addClsInstrumentationHandler,\n addFidInstrumentationHandler,\n addInpInstrumentationHandler,\n addLcpInstrumentationHandler,\n addPerformanceInstrumentationHandler,\n} from '@sentry-internal/browser-utils';\nimport type { ReplayContainer } from '../types';\nimport {\n getCumulativeLayoutShift,\n getFirstInputDelay,\n getInteractionToNextPaint,\n getLargestContentfulPaint,\n webVitalHandler,\n} from '../util/createPerformanceEntries';\n\n/**\n * Sets up a PerformanceObserver to listen to all performance entry types.\n * Returns a callback to stop observing.\n */\nexport function setupPerformanceObserver(replay: ReplayContainer): () => void {\n function addPerformanceEntry(entry: PerformanceEntry): void {\n // It is possible for entries to come up multiple times\n if (!replay.performanceEntries.includes(entry)) {\n replay.performanceEntries.push(entry);\n }\n }\n\n function onEntries({ entries }: { entries: PerformanceEntry[] }): void {\n entries.forEach(addPerformanceEntry);\n }\n\n const clearCallbacks: (() => void)[] = [];\n\n (['navigation', 'paint', 'resource'] as const).forEach(type => {\n clearCallbacks.push(addPerformanceInstrumentationHandler(type, onEntries));\n });\n\n clearCallbacks.push(\n addLcpInstrumentationHandler(webVitalHandler(getLargestContentfulPaint, replay)),\n addClsInstrumentationHandler(webVitalHandler(getCumulativeLayoutShift, replay)),\n addFidInstrumentationHandler(webVitalHandler(getFirstInputDelay, replay)),\n addInpInstrumentationHandler(webVitalHandler(getInteractionToNextPaint, replay)),\n );\n\n // A callback to cleanup all handlers\n return () => {\n clearCallbacks.forEach(clearCallback => clearCallback());\n };\n}\n","import type { ReplayIntegrationPrivacyOptions } from '../types';\n\ntype GetPrivacyOptions = Required<Omit<ReplayIntegrationPrivacyOptions, 'maskFn'>>;\n\ninterface GetPrivacyReturn {\n maskTextSelector: string;\n unmaskTextSelector: string;\n blockSelector: string;\n unblockSelector: string;\n ignoreSelector: string;\n\n blockClass?: RegExp;\n maskTextClass?: RegExp;\n}\n\nfunction getOption(selectors: string[], defaultSelectors: string[]): string {\n return [\n ...selectors,\n // sentry defaults\n ...defaultSelectors,\n ].join(',');\n}\n\n/**\n * Returns privacy related configuration for use in rrweb\n */\nexport function getPrivacyOptions({ mask, unmask, block, unblock, ignore }: GetPrivacyOptions): GetPrivacyReturn {\n const defaultBlockedElements = ['base[href=\"/\"]'];\n\n const maskSelector = getOption(mask, ['.sentry-mask', '[data-sentry-mask]']);\n const unmaskSelector = getOption(unmask, []);\n\n const options: GetPrivacyReturn = {\n // We are making the decision to make text and input selectors the same\n maskTextSelector: maskSelector,\n unmaskTextSelector: unmaskSelector,\n\n blockSelector: getOption(block, ['.sentry-block', '[data-sentry-block]', ...defaultBlockedElements]),\n unblockSelector: getOption(unblock, []),\n ignoreSelector: getOption(ignore, ['.sentry-ignore', '[data-sentry-ignore]', 'input[type=\"file\"]']),\n };\n\n return options;\n}\n","import type { BrowserClientReplayOptions, Client, Integration, IntegrationFn, ReplayRecordingMode } from '@sentry/core';\nimport { consoleSandbox, dropUndefinedKeys, isBrowser, parseSampleRate } from '@sentry/core';\nimport {\n DEFAULT_FLUSH_MAX_DELAY,\n DEFAULT_FLUSH_MIN_DELAY,\n MAX_REPLAY_DURATION,\n MIN_REPLAY_DURATION,\n MIN_REPLAY_DURATION_LIMIT,\n} from './constants';\nimport { ReplayContainer } from './replay';\nimport type {\n InitialReplayPluginOptions,\n RecordingOptions,\n ReplayCanvasIntegrationOptions,\n ReplayConfiguration,\n ReplayPluginOptions,\n SendBufferedReplayOptions,\n} from './types';\nimport { getPrivacyOptions } from './util/getPrivacyOptions';\nimport { maskAttribute } from './util/maskAttribute';\n\nconst MEDIA_SELECTORS =\n 'img,image,svg,video,object,picture,embed,map,audio,link[rel=\"icon\"],link[rel=\"apple-touch-icon\"]';\n\nconst DEFAULT_NETWORK_HEADERS = ['content-length', 'content-type', 'accept'];\n\nlet _initialized = false;\n\n/**\n * Sentry integration for [Session Replay](https://sentry.io/for/session-replay/).\n *\n * See the [Replay documentation](https://docs.sentry.io/platforms/javascript/guides/session-replay/) for more information.\n *\n * @example\n *\n * ```\n * Sentry.init({\n * dsn: '__DSN__',\n * integrations: [Sentry.replayIntegration()],\n * });\n * ```\n */\nexport const replayIntegration = ((options?: ReplayConfiguration) => {\n return new Replay(options);\n}) satisfies IntegrationFn;\n\n/**\n * Replay integration\n *\n * TODO: Rewrite this to be functional integration\n * Exported for tests.\n */\nexport class Replay implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'Replay';\n\n /**\n * @inheritDoc\n */\n public name: string;\n\n /**\n * Options to pass to `rrweb.record()`\n */\n private readonly _recordingOptions: RecordingOptions;\n\n /**\n * Initial options passed to the replay integration, merged with default values.\n * Note: `sessionSampleRate` and `errorSampleRate` are not required here, as they\n * can only be finally set when setupOnce() is called.\n *\n * @private\n */\n private readonly _initialOptions: InitialReplayPluginOptions;\n\n private _replay?: ReplayContainer;\n\n public constructor({\n flushMinDelay = DEFAULT_FLUSH_MIN_DELAY,\n flushMaxDelay = DEFAULT_FLUSH_MAX_DELAY,\n minReplayDuration = MIN_REPLAY_DURATION,\n maxReplayDuration = MAX_REPLAY_DURATION,\n stickySession = true,\n useCompression = true,\n workerUrl,\n _experiments = {},\n maskAllText = true,\n maskAllInputs = true,\n blockAllMedia = true,\n\n mutationBreadcrumbLimit = 750,\n mutationLimit = 10_000,\n\n slowClickTimeout = 7_000,\n slowClickIgnoreSelectors = [],\n\n networkDetailAllowUrls = [],\n networkDetailDenyUrls = [],\n networkCaptureBodies = true,\n networkRequestHeaders = [],\n networkResponseHeaders = [],\n\n mask = [],\n maskAttributes = ['title', 'placeholder'],\n unmask = [],\n block = [],\n unblock = [],\n ignore = [],\n maskFn,\n\n beforeAddRecordingEvent,\n beforeErrorSampling,\n onError,\n }: ReplayConfiguration = {}) {\n this.name = Replay.id;\n\n const privacyOptions = getPrivacyOptions({\n mask,\n unmask,\n block,\n unblock,\n ignore,\n });\n\n this._recordingOptions = {\n maskAllInputs,\n maskAllText,\n maskInputOptions: { password: true },\n maskTextFn: maskFn,\n maskInputFn: maskFn,\n maskAttributeFn: (key: string, value: string, el: HTMLElement): string =>\n maskAttribute({\n maskAttributes,\n maskAllText,\n privacyOptions,\n key,\n value,\n el,\n }),\n\n ...privacyOptions,\n\n // Our defaults\n slimDOMOptions: 'all',\n inlineStylesheet: true,\n // Disable inline images as it will increase segment/replay size\n inlineImages: false,\n // collect fonts, but be aware that `sentry.io` needs to be an allowed\n // origin for playback\n collectFonts: true,\n errorHandler: (err: Error & { __rrweb__?: boolean }) => {\n try {\n err.__rrweb__ = true;\n } catch (error) {\n // ignore errors here\n // this can happen if the error is frozen or does not allow mutation for other reasons\n }\n },\n };\n\n this._initialOptions = {\n flushMinDelay,\n flushMaxDelay,\n minReplayDuration: Math.min(minReplayDuration, MIN_REPLAY_DURATION_LIMIT),\n maxReplayDuration: Math.min(maxReplayDuration, MAX_REPLAY_DURATION),\n stickySession,\n useCompression,\n workerUrl,\n blockAllMedia,\n maskAllInputs,\n maskAllText,\n mutationBreadcrumbLimit,\n mutationLimit,\n slowClickTimeout,\n slowClickIgnoreSelectors,\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders: _getMergedNetworkHeaders(networkRequestHeaders),\n networkResponseHeaders: _getMergedNetworkHeaders(networkResponseHeaders),\n beforeAddRecordingEvent,\n beforeErrorSampling,\n onError,\n\n _experiments,\n };\n\n if (this._initialOptions.blockAllMedia) {\n // `blockAllMedia` is a more user friendly option to configure blocking\n // embedded media elements\n this._recordingOptions.blockSelector = !this._recordingOptions.blockSelector\n ? MEDIA_SELECTORS\n : `${this._recordingOptions.blockSelector},${MEDIA_SELECTORS}`;\n }\n\n if (this._isInitialized && isBrowser()) {\n throw new Error('Multiple Sentry Session Replay instances are not supported');\n }\n\n this._isInitialized = true;\n }\n\n /** If replay has already been initialized */\n protected get _isInitialized(): boolean {\n return _initialized;\n }\n\n /** Update _isInitialized */\n protected set _isInitialized(value: boolean) {\n _initialized = value;\n }\n\n /**\n * Setup and initialize replay container\n */\n public afterAllSetup(client: Client): void {\n if (!isBrowser() || this._replay) {\n return;\n }\n\n this._setup(client);\n this._initialize(client);\n }\n\n /**\n * Start a replay regardless of sampling rate. Calling this will always\n * create a new session. Will log a message if replay is already in progress.\n *\n * Creates or loads a session, attaches listeners to varying events (DOM,\n * PerformanceObserver, Recording, Sentry SDK, etc)\n */\n public start(): void {\n if (!this._replay) {\n return;\n }\n this._replay.start();\n }\n\n /**\n * Start replay buffering. Buffers until `flush()` is called or, if\n * `replaysOnErrorSampleRate` > 0, until an error occurs.\n */\n public startBuffering(): void {\n if (!this._replay) {\n return;\n }\n\n this._replay.startBuffering();\n }\n\n /**\n * Currently, this needs to be manually called (e.g. for tests). Sentry SDK\n * does not support a teardown\n */\n public stop(): Promise<void> {\n if (!this._replay) {\n return Promise.resolve();\n }\n\n return this._replay.stop({ forceFlush: this._replay.recordingMode === 'session' });\n }\n\n /**\n * If not in \"session\" recording mode, flush event buffer which will create a new replay.\n * If replay is not enabled, a new session replay is started.\n * Unless `continueRecording` is false, the replay will continue to record and\n * behave as a \"session\"-based replay.\n *\n * Otherwise, queue up a flush.\n */\n public flush(options?: SendBufferedReplayOptions): Promise<void> {\n if (!this._replay) {\n return Promise.resolve();\n }\n\n // assuming a session should be recorded in this case\n if (!this._replay.isEnabled()) {\n this._replay.start();\n return Promise.resolve();\n }\n\n return this._replay.sendBufferedReplayOrFlush(options);\n }\n\n /**\n * Get the current session ID.\n */\n public getReplayId(): string | undefined {\n if (!this._replay || !this._replay.isEnabled()) {\n return;\n }\n\n return this._replay.getSessionId();\n }\n\n /**\n * Get the current recording mode. This can be either `session` or `buffer`.\n *\n * `session`: Recording the whole session, sending it continuously\n * `buffer`: Always keeping the last 60s of recording, requires:\n * - having replaysOnErrorSampleRate > 0 to capture replay when an error occurs\n * - or calling `flush()` to send the replay\n */\n public getRecordingMode(): ReplayRecordingMode | undefined {\n if (!this._replay || !this._replay.isEnabled()) {\n return;\n }\n\n return this._replay.recordingMode;\n }\n\n /**\n * Initializes replay.\n */\n protected _initialize(client: Client): void {\n if (!this._replay) {\n return;\n }\n\n this._maybeLoadFromReplayCanvasIntegration(client);\n this._replay.initializeSampling();\n }\n\n /** Setup the integration. */\n private _setup(client: Client): void {\n // Client is not available in constructor, so we need to wait until setupOnce\n const finalOptions = loadReplayOptionsFromClient(this._initialOptions, client);\n\n this._replay = new ReplayContainer({\n options: finalOptions,\n recordingOptions: this._recordingOptions,\n });\n }\n\n /** Get canvas options from ReplayCanvas integration, if it is also added. */\n private _maybeLoadFromReplayCanvasIntegration(client: Client): void {\n // To save bundle size, we skip checking for stuff here\n // and instead just try-catch everything - as generally this should all be defined\n /* eslint-disable @typescript-eslint/no-non-null-assertion */\n try {\n const canvasIntegration = client.getIntegrationByName('ReplayCanvas') as Integration & {\n getOptions(): ReplayCanvasIntegrationOptions;\n };\n if (!canvasIntegration) {\n return;\n }\n\n this._replay!['_canvas'] = canvasIntegration.getOptions();\n } catch {\n // ignore errors here\n }\n /* eslint-enable @typescript-eslint/no-non-null-assertion */\n }\n}\n\n/** Parse Replay-related options from SDK options */\nfunction loadReplayOptionsFromClient(initialOptions: InitialReplayPluginOptions, client: Client): ReplayPluginOptions {\n const opt = client.getOptions() as BrowserClientReplayOptions;\n\n const finalOptions: ReplayPluginOptions = {\n sessionSampleRate: 0,\n errorSampleRate: 0,\n ...dropUndefinedKeys(initialOptions),\n };\n\n const replaysSessionSampleRate = parseSampleRate(opt.replaysSessionSampleRate);\n const replaysOnErrorSampleRate = parseSampleRate(opt.replaysOnErrorSampleRate);\n\n if (replaysSessionSampleRate == null && replaysOnErrorSampleRate == null) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n 'Replay is disabled because neither `replaysSessionSampleRate` nor `replaysOnErrorSampleRate` are set.',\n );\n });\n }\n\n if (replaysSessionSampleRate != null) {\n finalOptions.sessionSampleRate = replaysSessionSampleRate;\n }\n\n if (replaysOnErrorSampleRate != null) {\n finalOptions.errorSampleRate = replaysOnErrorSampleRate;\n }\n\n return finalOptions;\n}\n\nfunction _getMergedNetworkHeaders(headers: string[]): string[] {\n return [...DEFAULT_NETWORK_HEADERS, ...headers.map(header => header.toLowerCase())];\n}\n","import type { getPrivacyOptions } from './getPrivacyOptions';\n\ninterface MaskAttributeParams {\n maskAttributes: string[];\n maskAllText: boolean;\n privacyOptions: ReturnType<typeof getPrivacyOptions>;\n key: string;\n value: string;\n el: HTMLElement;\n}\n\n/**\n * Masks an attribute if necessary, otherwise return attribute value as-is.\n */\nexport function maskAttribute({\n el,\n key,\n maskAttributes,\n maskAllText,\n privacyOptions,\n value,\n}: MaskAttributeParams): string {\n // We only mask attributes if `maskAllText` is true\n if (!maskAllText) {\n return value;\n }\n\n // unmaskTextSelector takes precedence\n if (privacyOptions.unmaskTextSelector && el.matches(privacyOptions.unmaskTextSelector)) {\n return value;\n }\n\n if (\n maskAttributes.includes(key) ||\n // Need to mask `value` attribute for `<input>` if it's a button-like\n // type\n (key === 'value' && el.tagName === 'INPUT' && ['submit', 'button'].includes(el.getAttribute('type') || ''))\n ) {\n return value.replace(/[\\S]/g, '*');\n }\n\n return value;\n}\n","import type { Carrier } from './../carrier';\nimport { getMainCarrier, getSentryCarrier } from './../carrier';\nimport { getStackAsyncContextStrategy } from './stackStrategy';\nimport type { AsyncContextStrategy } from './types';\n\n/**\n * @private Private API with no semver guarantees!\n *\n * Sets the global async context strategy\n */\nexport function setAsyncContextStrategy(strategy: AsyncContextStrategy | undefined): void {\n // Get main carrier (global for every environment)\n const registry = getMainCarrier();\n const sentry = getSentryCarrier(registry);\n sentry.acs = strategy;\n}\n\n/**\n * Get the current async context strategy.\n * If none has been setup, the default will be used.\n */\nexport function getAsyncContextStrategy(carrier: Carrier): AsyncContextStrategy {\n const sentry = getSentryCarrier(carrier);\n\n if (sentry.acs) {\n return sentry.acs;\n }\n\n // Otherwise, use the default one (stack)\n return getStackAsyncContextStrategy();\n}\n"],"names":["createThunkMiddleware","extraArgument","_ref","dispatch","getState","next","action","thunk","withExtraArgument","handler","get","target","name","hasOwnProperty","args","window","__tap","Proxy","init","accountId","createOptions","integration","createCallback","detectOptions","detectCallback","t","a","TapfiliateObject","q","push","arguments","script","document","createElement","src","type","async","getElementsByTagName","appendChild","addEventListener","Error","canUseDOM","ExecutionEnvironment","canUseWorkers","Worker","canUseEventListeners","attachEvent","canUseViewport","screen","module","exports","obj","predicate","ret","keys","Object","isArr","Array","isArray","i","length","key","val","indexOf","replace","es","unes","unescape","un","call","cape","m","read","buffer","offset","isLE","mLen","nBytes","e","eLen","eMax","eBias","nBits","d","s","NaN","Infinity","Math","pow","write","value","c","rt","abs","isNaN","floor","log","LN2","toString","arr","stdOnEnd","cb","onload","this","onerror","ieOnEnd","onreadystatechange","readyState","opts","head","charset","attrs","attr","setAttribute","setAttributes","text","map","set","Map","_","Set","baseClone","circulars","clones","nodeType","cloneNode","Date","getTime","RegExp","clone","from","entries","values","create","idx","findIndex","getOwnPropertySymbols","prototype","propIsEnumerable","propertyIsEnumerable","toObject","TypeError","assign","test1","String","getOwnPropertyNames","test2","fromCharCode","n","join","test3","split","forEach","letter","err","shouldUseNative","source","symbols","to","isarray","pathToRegexp","parse","compile","str","options","tokensToFunction","tokensToRegExp","PATH_REGEXP","res","tokens","index","path","defaultDelimiter","delimiter","exec","escaped","slice","prefix","capture","group","modifier","asterisk","pattern","optional","repeat","partial","escapeGroup","escapeString","substr","encodeURIComponentPretty","encodeURI","charCodeAt","toUpperCase","matches","flags","data","encode","pretty","encodeURIComponent","token","segment","JSON","stringify","j","test","attachKeys","re","sensitive","strict","end","route","endsWithDelimiter","groups","match","regexpToRegexp","parts","arrayToRegexp","stringToRegexp","Cache","maxSize","_maxSize","clear","_size","_values","SPLIT_REGEX","DIGIT_REGEX","LEAD_DIGIT_REGEX","SPEC_CHAR_REGEX","CLEAN_QUOTES_REGEX","pathCache","setCache","getCache","normalizePath","part","isQuoted","charAt","shouldBeQuoted","hasLeadingNumber","hasSpecialChars","setter","len","getter","safe","segments","reduce","thisArg","iter","isBracket","strictUriEncode","decodeComponent","splitOnFirst","filterObject","encodeFragmentIdentifier","Symbol","validateArrayFormatSeparator","decode","keysSorter","input","sort","b","Number","removeHash","hashStart","extract","queryStart","parseValue","parseNumbers","trim","parseBooleans","toLowerCase","query","arrayFormat","arrayFormatSeparator","formatter","result","accumulator","undefined","concat","includes","isEncodedArray","newValue","item","arrayValue","parserForArrayFormat","param","k","Boolean","object","shouldFilter","skipNull","skipEmptyString","keyValueSep","encoderForArrayFormat","objectCopy","filter","x","parseUrl","url","url_","hash","parseFragmentIdentifier","fragmentIdentifier","stringifyUrl","queryFromUrl","parsedQueryFromUrl","queryString","getHash","pick","exclude","exclusionFilter","objA","objB","compare","compareContext","keysA","keysB","bHasOwnProperty","bind","valueA","valueB","string","separator","separatorIndex","root","self","g","toposort","nodes","edges","cursor","sorted","visited","outgoingEdges","edge","has","add","makeOutgoingEdges","nodesHash","makeNodesHash","visit","node","predecessors","nodeRep","outgoing","child","delete","uniqueNodes","array","opt","pairs","pairSplitRegExp","dec","pair","eq_idx","tryDecode","enc","fieldContentRegExp","maxAge","isFinite","domain","expires","toUTCString","httpOnly","secure","sameSite","decodeURIComponent","v1","v4","uuid","WINDOW","REPLAY_SESSION_KEY","UNABLE_TO_SEND_REPLAY","NETWORK_BODY_MAX_SIZE","CONSOLE_ARG_MAX_SIZE","REPLAY_MAX_EVENT_BUFFER_SIZE","MAX_REPLAY_DURATION","_nullishCoalesce","_optionalChain","NodeType","isShadowRoot","host","shadowRoot","isNativeShadowDom","stringifyStylesheet","rules","cssRules","cssText","stringifyRule","error","rule","importStringified","isCSSImportRule","styleSheet","statement","href","layerName","supportsText","media","mediaText","escapeImportStatement","isCSSStyleRule","selectorText","Mirror","constructor","idNodeMap","nodeMetaMap","WeakMap","getId","getMeta","id","getNode","getIds","removeNodeFromMap","childNodes","childNode","hasNode","meta","oldNode","reset","shouldMaskInput","maskInputOptions","tagName","maskInputValue","isMasked","element","maskInputFn","ORIGINAL_ATTRIBUTE_NAME","getInputType","hasAttribute","getInputValue","el","getAttribute","extractFileExtension","baseURL","URL","location","pathname","cachedImplementations","getImplementation","cached","impl","sandbox","hidden","contentWindow","removeChild","setTimeout","rest","clearTimeout","_id","tagNameRegex","genId","canvasService","canvasCtx","URL_IN_CSS_REF","URL_PROTOCOL_MATCH","URL_WWW_MATCH","DATA_URI","absoluteToStylesheet","origin","quote1","path1","quote2","path2","path3","filePath","maybeQuote","blockSelector","docId","HTMLFormElement","processedTagName","canvas","ctx","getContext","width","y","height","getImageData","Uint32Array","min","some","pixel","paused","attributes","ELEMENT_NODE","isElement","serializedNode","on","fn","passive","removeEventListener","_mirror","throttle","func","wait","timeout","previous","now","leading","remaining","context","apply","trailing","hookSetter","isRevoked","win","original","getOwnPropertyDescriptor","defineProperty","patch","replacement","wrapped","defineProperties","__rrweb_original__","enumerable","Reflect","prop","receiver","nowTimestamp","getWindowScroll","doc","left","scrollingElement","scrollLeft","pageXOffset","documentElement","body","parentElement","top","scrollTop","pageYOffset","getWindowHeight","innerHeight","clientHeight","getWindowWidth","innerWidth","clientWidth","closestElementOfNode","isBlocked","blockClass","unblockSelector","checkAncestors","blockedPredicate","createMatchPredicate","isUnblocked","blockDistance","distanceToMatch","unblockDistance","isIgnored","mirror","isAncestorRemoved","parentNode","DOCUMENT_NODE","legacy_isTouchEvent","event","changedTouches","isSerializedIframe","nodeName","isSerializedStylesheet","hasShadowRoot","StyleSheetMirror","styleIDMap","idStyleMap","stylesheet","newId","getStyle","generateId","getShadowHost","shadowHost","getRootNode","Node","DOCUMENT_FRAGMENT_NODE","shadowHostInDom","ownerDocument","rootShadowHost","getRootShadowHost","contains","inDom","EventType","EventType2","IncrementalSource","IncrementalSource2","MouseInteractions","MouseInteractions2","PointerTypes","PointerTypes2","isNodeInLinkedList","DoubleLinkedList","tail","position","current","addNode","__ln","previousSibling","nextSibling","removeNode","moveKey","parentId","processMutation","iframe","getNextId","addList","tailNode","needMaskingText","errorHandler","registerErrorHandler","unregisterErrorHandler","callbackWrapper","mutationBuffers","getEventTarget","composedPath","initMutationObserver","rootEl","mutationBuffer","MutationBuffer","mutationObserverCtor","MutationObserver","__rrMutationObserver","angularZoneSymbol","Zone","__symbol__","observer","mutations","onMutation","processMutations","observe","attributeOldValue","characterData","characterDataOldValue","childList","subtree","initMouseInteractionObserver","mouseInteractionCb","sampling","mouseInteraction","disableMap","handlers","currentPointerType","endsWith","eventKey","eventName","pointerType","thisEventKey","Mouse","Touch","Pen","MouseDown","MouseUp","startsWith","Click","clientX","clientY","getHandler","PointerEvent","TouchStart","TouchEnd","h","initScrollObserver","scrollCb","evt","defaultView","scrollLeftTop","scroll","INPUT_TAGS","lastInputValueMap","initInputObserver","inputCb","ignoreClass","ignoreSelector","userTriggeredOnInput","maskTextClass","unmaskTextClass","maskTextSelector","unmaskTextSelector","eventHandler","userTriggered","isTrusted","classList","isChecked","isInputMasked","forceMask","checked","cbWithDedup","querySelectorAll","v","lastInputValue","currentWindow","propertyDescriptor","HTMLInputElement","HTMLSelectElement","HTMLTextAreaElement","HTMLOptionElement","p","getNestedCSSRulePositions","childRule","pos","hasNestedCSSRule","parentRule","CSSGroupingRule","CSSMediaRule","CSSSupportsRule","CSSConditionRule","unshift","parentStyleSheet","recurse","getIdAndStyleId","sheet","styleMirror","styleId","ownerNode","initAdoptedStyleSheetObserver","stylesheetManager","hostId","patchTarget","Document","ShadowRoot","originalPropertyDescriptor","configurable","sheets","adoptStyleSheets","initObservers","o","_hooks","mutationObserver","recordDOM","mousemoveHandler","mousemoveCb","mousemove","threshold","callbackThreshold","mousemoveCallback","timeBaseline","positions","wrappedCb","totalOffset","timeOffset","updatePosition","DragEvent","Drag","MouseEvent","MouseMove","TouchMove","initMoveObserver","mouseInteractionHandler","scrollHandler","viewportResizeHandler","viewportResizeCb","lastH","lastW","initViewportResizeObserver","inputHandler","mediaInteractionHandler","mediaInteractionCb","currentTime","volume","muted","playbackRate","initMediaInteractionObserver","styleSheetObserver","adoptedStyleSheetObserver","styleDeclarationObserver","fontObserver","styleSheetRuleCb","CSSStyleSheet","insertRule","argumentsList","adds","deleteRule","replaceSync","removes","supportedNestedCSSRuleTypes","canMonkeyPatchNestedCSSRule","unmodifiedFunctions","typeKey","initStyleSheetObserver","styleDeclarationCb","ignoreCSSAttributes","setProperty","CSSStyleDeclaration","property","priority","removeProperty","remove","initStyleDeclarationObserver","collectFonts","fontCb","fontMap","originalFontFace","FontFace","family","descriptors","fontFace","fontSource","Uint8Array","restoreHandler","fonts","initFontObserver","selectionObserver","selectionCb","collapsed","updateSelection","selection","getSelection","isCollapsed","ranges","count","rangeCount","range","getRangeAt","startContainer","startOffset","endContainer","endOffset","start","initSelectionObserver","customElementObserver","customElementCb","customElements","define","initCustomElementObserver","pluginHandlers","plugin","plugins","callback","disconnect","CrossOriginIframeMirror","generateIdFn","iframeIdToRemoteIdMap","iframeRemoteIdToIdMap","remoteId","idToRemoteMap","remoteToIdMap","idToRemoteIdMap","getIdToRemoteIdMap","remoteIdToIdMap","getRemoteIdToIdMap","getRemoteId","getRemoteIds","ids","IframeManagerNoop","crossOriginIframeMirror","crossOriginIframeRootIdMap","addIframe","addLoadListener","attachIframe","IframeManager","iframes","crossOriginIframeMap","mutationCb","wrappedEmit","recordCrossOriginIframes","crossOriginIframeStyleMirror","handleMessage","iframeEl","loadListener","childSn","nextId","texts","isAttachIframe","contentDocument","adoptedStyleSheets","message","crossOriginMessageEvent","transformedEvent","transformCrossOriginEvent","isCheckout","FullSnapshot","replaceIdOnNode","rootId","patchRootIdOnNode","timestamp","IncrementalSnapshot","Mutation","Meta","Load","DomContentLoaded","Plugin","Custom","replaceIds","payload","ViewportResize","MediaInteraction","MouseInteraction","Scroll","CanvasMutation","Input","StyleSheetRule","StyleDeclaration","replaceStyleIds","Font","Selection","AdoptedStyleSheet","styles","style","iframeMirror","ShadowDomManagerNoop","addShadowRoot","observeAttachShadow","ShadowDomManager","shadowDoms","WeakSet","restoreHandlers","bypassOptions","patchAttachShadow","Element","canvasManager","shadowDomManager","iframeElement","manager","option","resetShadowRoots","CanvasManagerNoop","freeze","unfreeze","lock","unlock","snapshot","addWindow","StylesheetManager","trackedLinkElements","adoptedStyleSheetCb","attachLinkElement","linkEl","trackLinkElement","trackStylesheetInLinkElement","adoptedStyleSheetData","styleIds","CSSRule","r","ProcessedNodeManager","nodeMap","active","inOtherBuffer","thisBuffer","buffers","onRequestAnimationFrame","destroy","_takeFullSnapshot","cleanFrame","record","emit","checkoutEveryNms","checkoutEveryNth","maskAllText","inlineStylesheet","maskAllInputs","_maskInputOptions","slimDOMOptions","_slimDOMOptions","maskAttributeFn","maskTextFn","maxCanvasSize","packFn","dataURLOptions","mousemoveWait","recordCanvas","recordAfter","inlineImages","keepIframeSrcFn","getCanvasManager","inEmittingFrame","parent","passEmitsToParent","color","date","email","month","number","search","tel","time","week","textarea","select","radio","checkbox","comment","headFavicon","headWhitespace","headMetaSocial","headMetaRobots","headMetaHttpEquiv","headMetaVerification","headMetaAuthorship","headMetaDescKeywords","lastFullSnapshotEvent","NodeList","DOMTokenList","polyfill","incrementalSnapshotCount","eventProcessor","isFrozen","buf","postMessage","exceedTime","takeFullSnapshot","wrappedMutationEmit","wrappedScrollEmit","wrappedCanvasMutationEmit","iframeManager","__RRWEB_EXCLUDE_IFRAME__","getMirror","nodeMirror","processedNodeManager","getCanvasManagerFn","_getCanvasManager","__RRWEB_EXCLUDE_SHADOW_DOM__","slimDOM","onSerialize","onIframeLoad","onStylesheetLoad","initialOffset","canvasMutationCb","CustomElement","timestampToMs","timestampToS","addBreadcrumbEvent","replay","breadcrumb","category","triggerUserActivity","checkAndHandleExpiredSession","addUpdate","throttledAddEvent","tag","getClosestInteractive","closest","getClickTargetNode","getTargetNode","isEventWithTarget","onWindowOpen","originalWindowOpen","splice","IncrementalMutationSources","ClickDetector","slowClickConfig","_addBreadcrumbEvent","_lastMutation","_lastScroll","_clicks","_timeout","_threshold","_scrollTimeout","scrollTimeout","_replay","_ignoreSelector","addListeners","cleanupWindowOpen","nowInSeconds","_teardown","removeListeners","_checkClickTimeout","handleClick","SLOW_CLICK_TAGS","ignoreElement","nodeId","isClickBreadcrumb","newClick","clickBreadcrumb","clickCount","click","_scheduleCheckClicks","registerMutation","registerScroll","registerClick","_handleMultiClick","_getClicks","_checkClicks","timedOutClicks","mutationAfter","scrollAfter","_generateBreadcrumbs","isSlowClick","timeAfterClickMs","endReason","getCurrentRoute","metric","updateClickDetectorForRecordingEvent","clickDetector","isIncrementalEvent","isIncrementalMouseInteraction","HTMLElement","createBreadcrumb","ATTRIBUTES_TO_RECORD","getAttributesToRecord","normalizedKey","handleDomListener","handlerData","isEnabled","getDomTarget","handleDom","isClick","altKey","metaKey","ctrlKey","shiftKey","getBaseDomBreadcrumb","textContent","Text","handleKeyboardEvent","updateUserActivity","isContentEditable","isInputElement","isCharacterKey","maxStringLength","baseBreadcrumb","getKeyboardBreadcrumb","ENTRY_TYPES","resource","getAbsoluteTime","paint","entry","duration","entryType","startTime","navigation","decodedBodySize","domComplete","encodedBodySize","domContentLoadedEventStart","domContentLoadedEventEnd","domInteractive","loadEventStart","loadEventEnd","redirectCount","transferSize","webVitalHandler","replayPerformanceEntries","createPerformanceEntry","performance","timeOrigin","DEBUG_BUILD","CONSOLE_LEVELS","PREFIX","_addBreadcrumb","level","logger","coreLogger","EventBufferSizeExceededError","super","EventBufferArray","events","_totalSize","hasCheckout","waitForCheckout","hasEvents","eventSize","finish","Promise","resolve","eventsRet","getEarliestTimestamp","WorkerHandler","worker","_worker","ensureReady","_ensureReadyPromise","reject","success","once","info","terminate","method","arg","_getAndIncrementId","listener","response","EventBufferCompressionWorker","_earliestTimestamp","addEvent","_sendEventToWorker","_finishRequest","then","exception","EventBufferProxy","_fallback","_compression","_used","_ensureWorkerIsLoadedPromise","_ensureWorkerIsLoaded","ensureWorkerIsLoaded","_switchToCompressionWorker","addEventPromises","all","createEventBuffer","useCompression","workerUrl","customWorkerUrl","Blob","createObjectURL","getWorkerURL","_getWorkerUrl","_loadWorker","hasSessionStorage","sessionStorage","clearSession","removeItem","deleteSession","session","isSampled","sampleRate","random","makeSession","started","lastActivity","segmentId","sampled","previousSessionId","saveSession","setItem","createSession","sessionSampleRate","allowBuffering","stickySession","getSessionSampleType","isExpired","initialTime","expiry","targetTime","isSessionExpired","maxReplayDuration","sessionIdleExpire","shouldRefreshSession","loadOrCreateSession","sessionOptions","existingSession","sessionStringFromStorage","getItem","sessionObj","infoTick","fetchSession","addEventSync","shouldAddEvent","_addEvent","eventBuffer","isBufferMode","recordingMode","eventAfterPossibleCallback","isCustomEvent","maybeApplyCallback","getOptions","beforeAddRecordingEvent","isExceeded","reason","handleException","stop","client","recordDroppedEvent","isPaused","timestampInMs","timeouts","sessionIdlePause","initialTimestamp","isErrorEvent","isTransactionEvent","isFeedbackEvent","handleAfterSendEvent","sendResponse","statusCode","replayContext","contexts","trace","trace_id","traceIds","size","handleTransactionEvent","event_id","errorIds","tags","replayId","beforeErrorSampling","sendBufferedReplayOrFlush","handleErrorEvent","handleBeforeSendEvent","exceptionValue","handleHydrationError","handleBreadcrumbs","isBreadcrumbWithCategory","isTruncated","normalizedArgs","normalizeConsoleBreadcrumb","normalizeBreadcrumb","beforeAddBreadcrumb","resetReplayIdOnDynamicSamplingContext","dsc","getPropagationContext","replay_id","activeSpan","handleGlobalEventListener","hint","isReplayEvent","breadcrumbs","flush","feedback","getSessionId","feedbackId","addFeedbackBreadcrumb","originalException","__rrweb__","isRrwebError","_experiments","captureExceptions","isErrorEventSampled","errorSampleRate","shouldSampleForBufferEvent","createPerformanceSpans","op","description","startTimestamp","endTimestamp","handleHistorySpanListener","handleHistory","urls","addNetworkBreadcrumb","traceInternals","shouldFilterRequest","getBodySize","textEncoder","TextEncoder","URLSearchParams","FormData","formDataStr","_serializeFormData","ArrayBuffer","byteLength","parseContentLengthHeader","header","parseInt","getBodyString","mergeWarning","warning","headers","_meta","warnings","newMeta","makeNetworkReplayBreadcrumb","request","buildSkippedNetworkRequestOrResponse","bodySize","buildNetworkRequestOrResponse","normalizedBody","exceedsSizeLimit","isProbablyJson","_strIsProbablyJson","truncatedBody","normalizeNetworkBody","getAllowedHeaders","allowedHeaders","filteredHeaders","formData","captureFetchBreadcrumbToReplay","status_code","request_body_size","requestBodySize","response_body_size","responseBodySize","captureDetails","urlMatches","networkDetailAllowUrls","networkDetailDenyUrls","networkCaptureBodies","networkRequestHeaders","fetchArgs","getHeadersFromOptions","getRequestHeaders","requestBody","_getFetchRequestArgBody","bodyStr","_getRequestInfo","networkResponseHeaders","getAllHeaders","bodyText","_tryCloneResponse","_getResponseText","txt","finally","_tryGetResponseText","warn","_parseFetchResponseBody","getResponseData","_getResponseInfo","_prepareFetchData","allHeaders","Headers","captureXhrBreadcrumbToReplay","xhr","xhrInfo","request_headers","getAllResponseHeaders","acc","line","getResponseHeaders","requestWarning","responseBody","responseWarning","errors","responseText","responseType","outerHTML","_parseXhrResponse","_getXhrResponseBody","_prepareXhrData","enrichXhrBreadcrumb","reqSize","resSize","getResponseHeader","_getBodySize","handleNetworkBreadcrumbs","_isXhrBreadcrumb","_isXhrHint","_isFetchBreadcrumb","_isFetchHint","enrichFetchBreadcrumb","beforeAddNetworkBreadcrumb","createMemoryEntry","memoryEntry","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","memory","getHandleRecordingEmit","hadFirstEvent","_isCheckout","setInitialState","addSettingsEvent","earliestEvent","sendReplayRequest","recordingData","segment_id","eventContext","preparedRecordingData","payloadWithSequence","replayHeaders","prepareRecordingData","scope","transport","getTransport","dsn","getDsn","baseEvent","replay_start_timestamp","error_ids","trace_ids","replay_type","replayEvent","eventHint","integrations","_integrations","preparedEvent","platform","metadata","getSdkMetadata","version","sdk","prepareReplayEvent","sdkProcessingMetadata","envelope","tunnel","createReplayEnvelope","send","cause","TransportStatusCodeError","rateLimits","RateLimitError","sendReplay","replayData","retryConfig","interval","onError","_retryCount","THROTTLED","maxCount","durationSeconds","counter","isThrottled","_value","_cleanup","wasThrottled","ReplayContainer","recordingOptions","performanceEntries","_lastActivity","_isEnabled","_isPaused","_requiresManualStart","_hasInitializedCoreListeners","_context","initialUrl","_recordingOptions","_options","_debouncedFlush","callbackReturnValue","timerId","maxTimerId","maxWait","max","invokeFunc","cancelTimers","debounced","cancel","debounce","_flush","flushMinDelay","flushMaxDelay","_throttledAddEvent","slowClickTimeout","slowClickIgnoreSelectors","experiments","setConfig","isRecordingCanvas","_canvas","initializeSampling","requiresManualStart","_initializeSessionForSampling","_initializeRecording","_updateUserActivity","startBuffering","startRecording","canvasOptions","_stopRecording","continuousCheckout","_onMutationHandler","stopRecording","forceFlush","span","lastActiveSpan","feedbackEvent","includeReplay","addPerformanceEntry","onEntries","clearCallbacks","getLargestContentfulPaint","getCumulativeLayoutShift","getFirstInputDelay","getInteractionToNextPaint","clearCallback","getOption","selectors","defaultSelectors","MEDIA_SELECTORS","DEFAULT_NETWORK_HEADERS","_initialized","replayIntegration","Replay","static","minReplayDuration","blockAllMedia","mutationBreadcrumbLimit","mutationLimit","mask","maskAttributes","unmask","block","unblock","ignore","maskFn","privacyOptions","getPrivacyOptions","password","maskAttribute","_initialOptions","_getMergedNetworkHeaders","canvasIntegration","getAsyncContextStrategy","carrier","sentry","acs"],"sourceRoot":""}