@openmrs/esm-app-shell 8.0.1-pre.3783 → 8.0.1-pre.3786

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.turbo/turbo-build.log +9 -9
  2. package/dist/1aae2824ab4cfb18.js.map +1 -0
  3. package/dist/3a53ffcc01189e32.js.map +1 -0
  4. package/dist/6424d3e282801be1.js.map +1 -0
  5. package/dist/ce6b7df8d10e9ce8.js.map +1 -0
  6. package/dist/index.html +1 -1
  7. package/dist/{openmrs.9d2c16ca3f8dd751.js → openmrs.6e296921eb685274.js} +1 -1
  8. package/dist/{openmrs.9d2c16ca3f8dd751.js.map → openmrs.6e296921eb685274.js.map} +1 -1
  9. package/dist/service-worker.js +1 -1
  10. package/lib/{f6407c15881d934e.js → 5eb49ace081ba40a.js} +29 -29
  11. package/lib/{f6511157fbbd5327.js → a2ed1505d14f2a59.js} +1 -1
  12. package/lib/{3638c8e3f0e987f1.js → d9f2f67efb776126.js} +12 -12
  13. package/lib/esm-help-menu-app/460.js.map +1 -1
  14. package/lib/esm-help-menu-app/main.js +1 -1
  15. package/lib/esm-help-menu-app/openmrs-esm-help-menu-app.js +1 -1
  16. package/lib/esm-help-menu-app/openmrs-esm-help-menu-app.js.buildmanifest.json +5 -5
  17. package/lib/esm-help-menu-app/routes.json +1 -1
  18. package/lib/esm-implementer-tools-app/5460.js.map +1 -1
  19. package/lib/esm-implementer-tools-app/main.js +1 -1
  20. package/lib/esm-implementer-tools-app/openmrs-esm-implementer-tools-app.js +1 -1
  21. package/lib/esm-implementer-tools-app/openmrs-esm-implementer-tools-app.js.buildmanifest.json +5 -5
  22. package/lib/esm-implementer-tools-app/routes.json +1 -1
  23. package/lib/esm-login-app/14.js.map +1 -1
  24. package/lib/esm-login-app/main.js +1 -1
  25. package/lib/esm-login-app/openmrs-esm-login-app.js +1 -1
  26. package/lib/esm-login-app/openmrs-esm-login-app.js.buildmanifest.json +5 -5
  27. package/lib/esm-login-app/routes.json +1 -1
  28. package/lib/esm-offline-tools-app/5460.js.map +1 -1
  29. package/lib/esm-offline-tools-app/main.js +1 -1
  30. package/lib/esm-offline-tools-app/openmrs-esm-offline-tools-app.js +1 -1
  31. package/lib/esm-offline-tools-app/openmrs-esm-offline-tools-app.js.buildmanifest.json +5 -5
  32. package/lib/esm-offline-tools-app/routes.json +1 -1
  33. package/lib/esm-primary-navigation-app/5460.js.map +1 -1
  34. package/lib/esm-primary-navigation-app/main.js +1 -1
  35. package/lib/esm-primary-navigation-app/openmrs-esm-primary-navigation-app.js +1 -1
  36. package/lib/esm-primary-navigation-app/openmrs-esm-primary-navigation-app.js.buildmanifest.json +5 -5
  37. package/lib/esm-primary-navigation-app/routes.json +1 -1
  38. package/lib/{abbcede00223b828.js → fa464755b8e8e50b.js} +3 -3
  39. package/lib/index.html +1 -1
  40. package/lib/openmrs.js +9 -9
  41. package/lib/service-worker.js +1 -1
  42. package/package.json +3 -3
  43. package/dist/1d1bdf194ce3de30.js.map +0 -1
  44. package/dist/22d92f2e1d413f13.js.map +0 -1
  45. package/dist/5916e32850548842.js.map +0 -1
  46. package/dist/cab43002f9e725ab.js.map +0 -1
  47. /package/dist/{1d1bdf194ce3de30.js → 1aae2824ab4cfb18.js} +0 -0
  48. /package/dist/{cab43002f9e725ab.js → 3a53ffcc01189e32.js} +0 -0
  49. /package/dist/{22d92f2e1d413f13.js → 6424d3e282801be1.js} +0 -0
  50. /package/dist/{5916e32850548842.js → ce6b7df8d10e9ce8.js} +0 -0
@@ -25,7 +25,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
25
25
  \****************************************************/
26
26
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
27
27
 
28
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearCurrentUser: () => (/* binding */ clearCurrentUser),\n/* harmony export */ getCurrentUser: () => (/* binding */ getCurrentUser),\n/* harmony export */ getLoggedInUser: () => (/* binding */ getLoggedInUser),\n/* harmony export */ getSessionLocation: () => (/* binding */ getSessionLocation),\n/* harmony export */ getSessionStore: () => (/* binding */ getSessionStore),\n/* harmony export */ refetchCurrentUser: () => (/* binding */ refetchCurrentUser),\n/* harmony export */ sessionStore: () => (/* binding */ sessionStore),\n/* harmony export */ setSessionLocation: () => (/* binding */ setSessionLocation),\n/* harmony export */ setUserLanguage: () => (/* binding */ setUserLanguage),\n/* harmony export */ setUserProperties: () => (/* binding */ setUserProperties),\n/* harmony export */ userHasAccess: () => (/* binding */ userHasAccess)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_error_handling__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-error-handling */ \"../../framework/esm-error-handling/dist/index.js\");\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isUndefined.js\");\n/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs */ \"webpack/sharing/consume/default/rxjs/rxjs\");\n/* harmony import */ var _openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./openmrs-fetch.js */ \"../../framework/esm-api/dist/openmrs-fetch.js\");\n/** @module @category API */ \n\n\n\n\n/** @internal */ const sessionStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.createGlobalStore)('session', {\n loaded: false,\n session: null\n});\nlet lastFetchTimeMillis = 0;\nfunction getCurrentUser(opts = {\n includeAuthStatus: true\n}) {\n if (lastFetchTimeMillis < Date.now() - 1000 * 60 || !sessionStore.getState().loaded) {\n refetchCurrentUser();\n }\n return new rxjs__WEBPACK_IMPORTED_MODULE_2__.Observable((subscriber)=>{\n const handler = (state)=>{\n if (state.loaded) {\n if (opts.includeAuthStatus) {\n subscriber.next(state.session);\n } else {\n subscriber.next(state.session?.user);\n }\n }\n };\n handler(sessionStore.getState());\n // The observable subscribe function should return an unsubscribe function,\n // which happens to be exactly what `subscribe` returns.\n return sessionStore.subscribe(handler);\n });\n}\n\nfunction getSessionStore() {\n if (lastFetchTimeMillis < Date.now() - 1000 * 60 || !sessionStore.getState().loaded) {\n refetchCurrentUser();\n }\n return sessionStore;\n}\n// NB locale is string only if this returns true\nfunction isValidLocale(locale) {\n if (locale === undefined || typeof locale !== 'string') {\n return false;\n }\n try {\n new Intl.Locale(locale);\n } catch (e) {\n return false;\n }\n return true;\n}\nfunction setUserLanguage(data) {\n let locale = data.locale ?? data.user?.userProperties?.defaultLocale;\n if (locale && locale.includes('_')) {\n locale = locale.replaceAll('_', '-');\n }\n if (isValidLocale(locale) && locale !== document.documentElement.getAttribute('lang')) {\n document.documentElement.setAttribute('lang', locale);\n }\n}\nsessionStore.subscribe((state)=>{\n if (state.loaded && state.session) {\n setUserLanguage(state.session);\n }\n});\nfunction userHasPrivilege(requiredPrivilege, user) {\n if (typeof requiredPrivilege === 'string') {\n return !(0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(user.privileges.find((p)=>requiredPrivilege === p.display));\n } else if (Array.isArray(requiredPrivilege)) {\n return requiredPrivilege.every((rp)=>!(0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(user.privileges.find((p)=>rp === p.display)));\n } else if (!(0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(requiredPrivilege)) {\n console.error(`Could not understand privileges \"${requiredPrivilege}\"`);\n }\n return true;\n}\nfunction isSuperUser(user) {\n return !(0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(user.roles.find((role)=>role.display === 'System Developer'));\n}\n/**\n * The `refetchCurrentUser` function causes a network request to redownload\n * the user. All subscribers to the current user will be notified of the\n * new users once the new version of the user object is downloaded.\n *\n * @returns The same observable as returned by [[getCurrentUser]].\n *\n * #### Example\n * ```js\n * import { refetchCurrentUser } from '@openmrs/esm-api'\n * refetchCurrentUser()\n * ```\n */ function refetchCurrentUser(username, password) {\n lastFetchTimeMillis = Date.now();\n let headers = {};\n if (username && password) {\n headers['Authorization'] = `Basic ${window.btoa(`${username}:${password}`)}`;\n }\n return handleSessionResponse((0,_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.openmrsFetch)(_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.sessionEndpoint, {\n headers\n }));\n}\nfunction clearCurrentUser() {\n sessionStore.setState({\n loaded: true,\n session: {\n authenticated: false,\n sessionId: ''\n }\n });\n}\nfunction userHasAccess(requiredPrivilege, user) {\n if (user === undefined) {\n // if the user hasn't been loaded, then return false iff there is a required privilege\n return !Boolean(requiredPrivilege);\n }\n if (!Boolean(requiredPrivilege)) {\n // if user exists but no requiredPrivilege is defined\n return true;\n }\n return userHasPrivilege(requiredPrivilege, user) || isSuperUser(user);\n}\nfunction getLoggedInUser() {\n let user;\n let unsubscribe;\n return new Promise((res)=>{\n const handler = (state)=>{\n if (state.loaded && state.session.user) {\n user = state.session.user;\n res(state.session.user);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n handler(sessionStore.getState());\n if (!user) {\n unsubscribe = sessionStore.subscribe(handler);\n }\n });\n}\nfunction getSessionLocation() {\n return new Promise((res, rej)=>{\n const sub = getCurrentUser().subscribe((session)=>{\n res(session.sessionLocation);\n }, rej);\n sub.unsubscribe();\n });\n}\nasync function setSessionLocation(locationUuid, abortController) {\n return handleSessionResponse((0,_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.openmrsFetch)(_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.sessionEndpoint, {\n method: 'POST',\n body: {\n sessionLocation: locationUuid\n },\n headers: {\n 'Content-Type': 'application/json'\n },\n signal: abortController.signal\n }));\n}\nasync function setUserProperties(userUuid, userProperties, abortController) {\n if (!abortController) {\n abortController = new AbortController();\n }\n await (0,_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.openmrsFetch)(`${_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.restBaseUrl}/user/${userUuid}`, {\n method: 'POST',\n body: {\n userProperties\n },\n headers: {\n 'Content-Type': 'application/json'\n },\n signal: abortController.signal\n });\n return refetchCurrentUser();\n}\nfunction handleSessionResponse(result) {\n return new Promise((resolve, reject)=>{\n result.then((res)=>{\n let nextState;\n if (typeof res?.data === 'object') {\n nextState = {\n loaded: true,\n session: res.data\n };\n sessionStore.setState(nextState);\n resolve(nextState);\n } else {\n nextState = {\n loaded: false,\n session: null\n };\n sessionStore.setState(nextState);\n reject(nextState);\n }\n }).catch((err)=>{\n (0,_openmrs_esm_error_handling__WEBPACK_IMPORTED_MODULE_0__.reportError)(`Failed to fetch new session information: ${err}`);\n const nextState = {\n loaded: false,\n session: null\n };\n sessionStore.setState(nextState);\n reject(nextState);\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9jdXJyZW50LXVzZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBCQUEwQixHQUE2RDtBQUNoQztBQUNmO0FBQ047QUFDOEM7QUFDaEYsY0FBYyxHQUFVLE1BQU1PLGVBQWVOLHFFQUFpQkEsQ0FBQyxXQUFXO0lBQ3RFTyxRQUFRO0lBQ1JDLFNBQVM7QUFDYixHQUFHO0FBQ0gsSUFBSUMsc0JBQXNCO0FBQzFCLFNBQVNDLGVBQWVDLE9BQU87SUFDM0JDLG1CQUFtQjtBQUN2QixDQUFDO0lBQ0csSUFBSUgsc0JBQXNCSSxLQUFLQyxHQUFHLEtBQUssT0FBTyxNQUFNLENBQUNSLGFBQWFTLFFBQVEsR0FBR1IsTUFBTSxFQUFFO1FBQ2pGUztJQUNKO0lBQ0EsT0FBTyxJQUFJZCw0Q0FBVUEsQ0FBQyxDQUFDZTtRQUNuQixNQUFNQyxVQUFVLENBQUNDO1lBQ2IsSUFBSUEsTUFBTVosTUFBTSxFQUFFO2dCQUNkLElBQUlJLEtBQUtDLGlCQUFpQixFQUFFO29CQUN4QkssV0FBV0csSUFBSSxDQUFDRCxNQUFNWCxPQUFPO2dCQUNqQyxPQUFPO29CQUNIUyxXQUFXRyxJQUFJLENBQUNELE1BQU1YLE9BQU8sRUFBRWE7Z0JBQ25DO1lBQ0o7UUFDSjtRQUNBSCxRQUFRWixhQUFhUyxRQUFRO1FBQzdCLDJFQUEyRTtRQUMzRSx3REFBd0Q7UUFDeEQsT0FBT1QsYUFBYWdCLFNBQVMsQ0FBQ0o7SUFDbEM7QUFDSjtBQUMwQjtBQUNuQixTQUFTSztJQUNaLElBQUlkLHNCQUFzQkksS0FBS0MsR0FBRyxLQUFLLE9BQU8sTUFBTSxDQUFDUixhQUFhUyxRQUFRLEdBQUdSLE1BQU0sRUFBRTtRQUNqRlM7SUFDSjtJQUNBLE9BQU9WO0FBQ1g7QUFDQSxnREFBZ0Q7QUFDaEQsU0FBU2tCLGNBQWNDLE1BQU07SUFDekIsSUFBSUEsV0FBV0MsYUFBYSxPQUFPRCxXQUFXLFVBQVU7UUFDcEQsT0FBTztJQUNYO0lB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Q2pCO1lBQ1QsSUFBSWtCO1lBQ0osSUFBSSxPQUFPbEIsS0FBS3ZDLFNBQVMsVUFBVTtnQkFDL0J5RCxZQUFZO29CQUNSakYsUUFBUTtvQkFDUkMsU0FBUzhELElBQUl2QyxJQUFJO2dCQUNyQjtnQkFDQXpCLGFBQWF3RCxRQUFRLENBQUMwQjtnQkFDdEJILFFBQVFHO1lBQ1osT0FBTztnQkFDSEEsWUFBWTtvQkFDUmpGLFFBQVE7b0JBQ1JDLFNBQVM7Z0JBQ2I7Z0JBQ0FGLGFBQWF3RCxRQUFRLENBQUMwQjtnQkFDdEJGLE9BQU9FO1lBQ1g7UUFDSixHQUFHQyxLQUFLLENBQUMsQ0FBQ0M7WUFDTjNGLHdFQUFXQSxDQUFDLENBQUMseUNBQXlDLEVBQUUyRixLQUFLO1lBQzdELE1BQU1GLFlBQVk7Z0JBQ2RqRixRQUFRO2dCQUNSQyxTQUFTO1lBQ2I7WUFDQUYsYUFBYXdELFFBQVEsQ0FBQzBCO1lBQ3RCRixPQUFPRTtRQUNYO0lBQ0o7QUFDSiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9jdXJyZW50LXVzZXIuanM/YzAwZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGltcG9ydCB7IHJlcG9ydEVycm9yIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1lcnJvci1oYW5kbGluZ1wiO1xuaW1wb3J0IHsgY3JlYXRlR2xvYmFsU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXN0YXRlXCI7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgb3Blbm1yc0ZldGNoLCByZXN0QmFzZVVybCwgc2Vzc2lvbkVuZHBvaW50IH0gZnJvbSBcIi4vb3Blbm1ycy1mZXRjaC5qc1wiO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3Qgc2Vzc2lvblN0b3JlID0gY3JlYXRlR2xvYmFsU3RvcmUoJ3Nlc3Npb24nLCB7XG4gICAgbG9hZGVkOiBmYWxzZSxcbiAgICBzZXNzaW9uOiBudWxsXG59KTtcbmxldCBsYXN0RmV0Y2hUaW1lTWlsbGlzID0gMDtcbmZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyKG9wdHMgPSB7XG4gICAgaW5jbHVkZUF1dGhTdGF0dXM6IHRydWVcbn0pIHtcbiAgICBpZiAobGFzdEZldGNoVGltZU1pbGxpcyA8IERhdGUubm93KCkgLSAxMDAwICogNjAgfHwgIXNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpLmxvYWRlZCkge1xuICAgICAgICByZWZldGNoQ3VycmVudFVzZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKT0+e1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKHN0YXRlKT0+e1xuICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmluY2x1ZGVBdXRoU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChzdGF0ZS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoc3RhdGUuc2Vzc2lvbj8udXNlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBoYW5kbGVyKHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgLy8gVGhlIG9ic2VydmFibGUgc3Vic2NyaWJlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gdW5zdWJzY3JpYmUgZnVuY3Rpb24sXG4gICAgICAgIC8vIHdoaWNoIGhhcHBlbnMgdG8gYmUgZXhhY3RseSB3aGF0IGBzdWJzY3JpYmVgIHJldHVybnMuXG4gICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmUuc3Vic2NyaWJlKGhhbmRsZXIpO1xuICAgIH0pO1xufVxuZXhwb3J0IHsgZ2V0Q3VycmVudFVzZXIgfTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXNzaW9uU3RvcmUoKSB7XG4gICAgaWYgKGxhc3RGZXRjaFRpbWVNaWxsaXMgPCBEYXRlLm5vdygpIC0gMTAwMCAqIDYwIHx8ICFzZXNzaW9uU3RvcmUuZ2V0U3RhdGUoKS5sb2FkZWQpIHtcbiAgICAgICAgcmVmZXRjaEN1cnJlbnRVc2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBzZXNzaW9uU3RvcmU7XG59XG4vLyBOQiBsb2NhbGUgaXMgc3RyaW5nIG9ubHkgaWYgdGhpcyByZXR1cm5zIHRydWVcbmZ1bmN0aW9uIGlzVmFsaWRMb2NhbGUobG9jYWxlKSB7XG4gICAgaWYgKGxvY2FsZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBsb2NhbGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbmV3IEludGwuTG9jYWxlKGxvY2FsZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldFVzZXJMYW5ndWFnZShkYXRhKSB7XG4gICAgbGV0IGxvY2FsZSA9IGRhdGEubG9jYWxlID8/IGRhdGEudXNlcj8udXNlclByb3BlcnRpZXM/LmRlZmF1bHRMb2NhbGU7XG4gICAgaWYgKGxvY2FsZSAmJiBsb2NhbGUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgICBsb2NhbGUgPSBsb2NhbGUucmVwbGFjZUFsbCgnXycsICctJyk7XG4gICAgfVxuICAgIGlmIChpc1ZhbGlkTG9jYWxlKGxvY2FsZSkgJiYgbG9jYWxlICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsYW5nJykpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnbGFuZycsIGxvY2FsZSk7XG4gICAgfVxufVxuc2Vzc2lvblN0b3JlLnN1YnNjcmliZSgoc3RhdGUpPT57XG4gICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5zZXNzaW9uKSB7XG4gICAgICAgIHNldFVzZXJMYW5ndWFnZShzdGF0ZS5zZXNzaW9uKTtcbiAgICB9XG59KTtcbmZ1bmN0aW9uIHVzZXJIYXNQcml2aWxlZ2UocmVxdWlyZWRQcml2aWxlZ2UsIHVzZXIpIHtcbiAgICBpZiAodHlwZW9mIHJlcXVpcmVkUHJpdmlsZWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gIWlzVW5kZWZpbmVkKHVzZXIucHJpdmlsZWdlcy5maW5kKChwKT0+cmVxdWlyZWRQcml2aWxlZ2UgPT09IHAuZGlzcGxheSkpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXF1aXJlZFByaXZpbGVnZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVkUHJpdmlsZWdlLmV2ZXJ5KChycCk9PiFpc1VuZGVmaW5lZCh1c2VyLnByaXZpbGVnZXMuZmluZCgocCk9PnJwID09PSBwLmRpc3BsYXkpKSk7XG4gICAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQocmVxdWlyZWRQcml2aWxlZ2UpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCB1bmRlcnN0YW5kIHByaXZpbGVnZXMgXCIke3JlcXVpcmVkUHJpdmlsZWdlfVwiYCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaXNTdXBlclVzZXIodXNlcikge1xuICAgIHJldHVybiAhaXNVbmRlZmluZWQodXNlci5yb2xlcy5maW5kKChyb2xlKT0+cm9sZS5kaXNwbGF5ID09PSAnU3lzdGVtIERldmVsb3BlcicpKTtcbn1cbi8qKlxuICogVGhlIGByZWZldGNoQ3VycmVudFVzZXJgIGZ1bmN0aW9uIGNhdXNlcyBhIG5ldHdvcmsgcmVxdWVzdCB0byByZWRvd25sb2FkXG4gKiB0aGUgdXNlci4gQWxsIHN1YnNjcmliZXJzIHRvIHRoZSBjdXJyZW50IHVzZXIgd2lsbCBiZSBub3RpZmllZCBvZiB0aGVcbiAqIG5ldyB1c2VycyBvbmNlIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgdXNlciBvYmplY3QgaXMgZG93bmxvYWRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2FtZSBvYnNlcnZhYmxlIGFzIHJldHVybmVkIGJ5IFtbZ2V0Q3VycmVudFVzZXJdXS5cbiAqXG4gKiAjIyMjIEV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyByZWZldGNoQ3VycmVudFVzZXIgfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJ1xuICogcmVmZXRjaEN1cnJlbnRVc2VyKClcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiByZWZldGNoQ3VycmVudFVzZXIodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgbGFzdEZldGNoVGltZU1pbGxpcyA9IERhdGUubm93KCk7XG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAodXNlcm5hbWUgJiYgcGFzc3dvcmQpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7d2luZG93LmJ0b2EoYCR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YCl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZVNlc3Npb25SZXNwb25zZShvcGVubXJzRmV0Y2goc2Vzc2lvbkVuZHBvaW50LCB7XG4gICAgICAgIGhlYWRlcnNcbiAgICB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDdXJyZW50VXNlcigpIHtcbiAgICBzZXNzaW9uU3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbklkOiAnJ1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdXNlckhhc0FjY2VzcyhyZXF1aXJlZFByaXZpbGVnZSwgdXNlcikge1xuICAgIGlmICh1c2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzbid0IGJlZW4gbG9hZGVkLCB0aGVuIHJldHVybiBmYWxzZSBpZmYgdGhlcmUgaXMgYSByZXF1aXJlZCBwcml2aWxlZ2VcbiAgICAgICAgcmV0dXJuICFCb29sZWFuKHJlcXVpcmVkUHJpdmlsZWdlKTtcbiAgICB9XG4gICAgaWYgKCFCb29sZWFuKHJlcXVpcmVkUHJpdmlsZWdlKSkge1xuICAgICAgICAvLyBpZiB1c2VyIGV4aXN0cyBidXQgbm8gcmVxdWlyZWRQcml2aWxlZ2UgaXMgZGVmaW5lZFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJIYXNQcml2aWxlZ2UocmVxdWlyZWRQcml2aWxlZ2UsIHVzZXIpIHx8IGlzU3VwZXJVc2VyKHVzZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlZEluVXNlcigpIHtcbiAgICBsZXQgdXNlcjtcbiAgICBsZXQgdW5zdWJzY3JpYmU7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMpPT57XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoc3RhdGUpPT57XG4gICAgICAgICAgICBpZiAoc3RhdGUubG9hZGVkICYmIHN0YXRlLnNlc3Npb24udXNlcikge1xuICAgICAgICAgICAgICAgIHVzZXIgPSBzdGF0ZS5zZXNzaW9uLnVzZXI7XG4gICAgICAgICAgICAgICAgcmVzKHN0YXRlLnNlc3Npb24udXNlcik7XG4gICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBoYW5kbGVyKHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZSA9IHNlc3Npb25TdG9yZS5zdWJzY3JpYmUoaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXNzaW9uTG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaik9PntcbiAgICAgICAgY29uc3Qgc3ViID0gZ2V0Q3VycmVudFVzZXIoKS5zdWJzY3JpYmUoKHNlc3Npb24pPT57XG4gICAgICAgICAgICByZXMoc2Vzc2lvbi5zZXNzaW9uTG9jYXRpb24pO1xuICAgICAgICB9LCByZWopO1xuICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRTZXNzaW9uTG9jYXRpb24obG9jYXRpb25VdWlkLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gaGFuZGxlU2Vzc2lvblJlc3BvbnNlKG9wZW5tcnNGZXRjaChzZXNzaW9uRW5kcG9pbnQsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIHNlc3Npb25Mb2NhdGlvbjogbG9jYXRpb25VdWlkXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICAgfSkpO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFVzZXJQcm9wZXJ0aWVzKHVzZXJVdWlkLCB1c2VyUHJvcGVydGllcywgYWJvcnRDb250cm9sbGVyKSB7XG4gICAgaWYgKCFhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIH1cbiAgICBhd2FpdCBvcGVubXJzRmV0Y2goYCR7cmVzdEJhc2VVcmx9L3VzZXIvJHt1c2VyVXVpZH1gLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICB1c2VyUHJvcGVydGllc1xuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH0sXG4gICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgIH0pO1xuICAgIHJldHVybiByZWZldGNoQ3VycmVudFVzZXIoKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVNlc3Npb25SZXNwb25zZShyZXN1bHQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk9PntcbiAgICAgICAgcmVzdWx0LnRoZW4oKHJlcyk9PntcbiAgICAgICAgICAgIGxldCBuZXh0U3RhdGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcz8uZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjogcmVzLmRhdGFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yZS5zZXRTdGF0ZShuZXh0U3RhdGUpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV4dFN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV4dFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiBudWxsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmUuc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV4dFN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKGVycik9PntcbiAgICAgICAgICAgIHJlcG9ydEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggbmV3IHNlc3Npb24gaW5mb3JtYXRpb246ICR7ZXJyfWApO1xuICAgICAgICAgICAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgICAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbjogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNlc3Npb25TdG9yZS5zZXRTdGF0ZShuZXh0U3RhdGUpO1xuICAgICAgICAgICAgcmVqZWN0KG5leHRTdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuIl0sIm5hbWVzIjpbInJlcG9ydEVycm9yIiwiY3JlYXRlR2xvYmFsU3RvcmUiLCJpc1VuZGVmaW5lZCIsIk9ic2VydmFibGUiLCJvcGVubXJzRmV0Y2giLCJyZXN0QmFzZVVybCIsInNlc3Npb25FbmRwb2ludCIsInNlc3Npb25TdG9yZSIsImxvYWRlZCIsInNlc3Npb24iLCJsYXN0RmV0Y2hUaW1lTWlsbGlzIiwiZ2V0Q3VycmVudFVzZXIiLCJvcHRzIiwiaW5jbHVkZUF1dGhTdGF0dXMiLCJEYXRlIiwibm93IiwiZ2V0U3RhdGUiLCJyZWZldGNoQ3VycmVudFVzZXIiLCJzdWJzY3JpYmVyIiwiaGFuZGxlciIsInN0YXRlIiwibmV4dCIsInVzZXIiLCJzdWJzY3JpYmUiLCJnZXRTZXNzaW9uU3RvcmUiLCJpc1ZhbGlkTG9jYWxlIiwibG9jYWxlIiwidW5kZWZpbmVkIiwiSW50bCIsIkxvY2FsZSIsImUiLCJzZXRVc2VyTGFuZ3VhZ2UiLCJkYXRhIiwidXNlclByb3BlcnRpZXMiLCJkZWZhdWx0TG9jYWxlIiwiaW5jbHVkZXMiLCJyZXBsYWNlQWxsIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJ1c2VySGFzUHJpdmlsZWdlIiwicmVxdWlyZWRQcml2aWxlZ2UiLCJwcml2aWxlZ2VzIiwiZmluZCIsInAiLCJkaXNwbGF5IiwiQXJyYXkiLCJpc0FycmF5IiwiZXZlcnkiLCJycCIsImNvbnNvbGUiLCJlcnJvciIsImlzU3VwZXJVc2VyIiwicm9sZXMiLCJyb2xlIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImhlYWRlcnMiLCJ3aW5kb3ciLCJidG9hIiwiaGFuZGxlU2Vzc2lvblJlc3BvbnNlIiwiY2xlYXJDdXJyZW50VXNlciIsInNldFN0YXRlIiwiYXV0aGVudGljYXRlZCIsInNlc3Npb25JZCIsInVzZXJIYXNBY2Nlc3MiLCJCb29sZWFuIiwiZ2V0TG9nZ2VkSW5Vc2VyIiwidW5zdWJzY3JpYmUiLCJQcm9taXNlIiwicmVzIiwiZ2V0U2Vzc2lvbkxvY2F0aW9uIiwicmVqIiwic3ViIiwic2Vzc2lvbkxvY2F0aW9uIiwic2V0U2Vzc2lvbkxvY2F0aW9uIiwibG9jYXRpb25VdWlkIiwiYWJvcnRDb250cm9sbGVyIiwibWV0aG9kIiwiYm9keSIsInNpZ25hbCIsInNldFVzZXJQcm9wZXJ0aWVzIiwidXNlclV1aWQiLCJBYm9ydENvbnRyb2xsZXIiLCJyZXN1bHQiLCJyZXNvbHZlIiwicmVqZWN0IiwidGhlbiIsIm5leHRTdGF0ZSIsImNhdGNoIiwiZXJyIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-api/dist/current-user.js\n");
28
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearCurrentUser: () => (/* binding */ clearCurrentUser),\n/* harmony export */ getCurrentUser: () => (/* binding */ getCurrentUser),\n/* harmony export */ getLoggedInUser: () => (/* binding */ getLoggedInUser),\n/* harmony export */ getSessionLocation: () => (/* binding */ getSessionLocation),\n/* harmony export */ getSessionStore: () => (/* binding */ getSessionStore),\n/* harmony export */ refetchCurrentUser: () => (/* binding */ refetchCurrentUser),\n/* harmony export */ sessionStore: () => (/* binding */ sessionStore),\n/* harmony export */ setSessionLocation: () => (/* binding */ setSessionLocation),\n/* harmony export */ setUserLanguage: () => (/* binding */ setUserLanguage),\n/* harmony export */ setUserProperties: () => (/* binding */ setUserProperties),\n/* harmony export */ userHasAccess: () => (/* binding */ userHasAccess)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_error_handling__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-error-handling */ \"../../framework/esm-error-handling/dist/index.js\");\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isUndefined.js\");\n/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs */ \"webpack/sharing/consume/default/rxjs/rxjs\");\n/* harmony import */ var _openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./openmrs-fetch.js */ \"../../framework/esm-api/dist/openmrs-fetch.js\");\n/** @module @category API */ \n\n\n\n\n/** @internal */ const sessionStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.createGlobalStore)('session', {\n loaded: false,\n session: null\n});\nlet lastFetchTimeMillis = 0;\nfunction getCurrentUser(opts = {\n includeAuthStatus: true\n}) {\n if (lastFetchTimeMillis < Date.now() - 1000 * 60 || !sessionStore.getState().loaded) {\n refetchCurrentUser();\n }\n return new rxjs__WEBPACK_IMPORTED_MODULE_2__.Observable((subscriber)=>{\n const handler = (state)=>{\n if (state.loaded) {\n if (opts.includeAuthStatus) {\n subscriber.next(state.session);\n } else {\n subscriber.next(state.session?.user);\n }\n }\n };\n handler(sessionStore.getState());\n // The observable subscribe function should return an unsubscribe function,\n // which happens to be exactly what `subscribe` returns.\n return sessionStore.subscribe(handler);\n });\n}\n\n/**\n * Returns the global session store containing the current user's session information.\n * If the session data is stale (older than 1 minute) or not yet loaded, this function\n * will trigger a refetch of the current user's session.\n *\n * @returns The global session store that can be subscribed to for session updates.\n *\n * @example\n * ```ts\n * import { getSessionStore } from '@openmrs/esm-api';\n * const store = getSessionStore();\n * const unsubscribe = store.subscribe((state) => {\n * if (state.loaded) {\n * console.log('Session:', state.session);\n * }\n * });\n * ```\n */ function getSessionStore() {\n if (lastFetchTimeMillis < Date.now() - 1000 * 60 || !sessionStore.getState().loaded) {\n refetchCurrentUser();\n }\n return sessionStore;\n}\n// NB locale is string only if this returns true\nfunction isValidLocale(locale) {\n if (locale === undefined || typeof locale !== 'string') {\n return false;\n }\n try {\n new Intl.Locale(locale);\n } catch (e) {\n return false;\n }\n return true;\n}\n/**\n * Sets the document's language attribute based on the user's locale preference\n * from the session data. This affects the HTML `lang` attribute which is used\n * for accessibility and internationalization.\n *\n * The locale is determined from either the session's locale or the user's\n * default locale property. Underscores in the locale are converted to hyphens\n * to match BCP 47 language tag format.\n *\n * @param data The session object containing locale information.\n */ function setUserLanguage(data) {\n let locale = data.locale ?? data.user?.userProperties?.defaultLocale;\n if (locale && locale.includes('_')) {\n locale = locale.replaceAll('_', '-');\n }\n if (isValidLocale(locale) && locale !== document.documentElement.getAttribute('lang')) {\n document.documentElement.setAttribute('lang', locale);\n }\n}\nsessionStore.subscribe((state)=>{\n if (state.loaded && state.session) {\n setUserLanguage(state.session);\n }\n});\nfunction userHasPrivilege(requiredPrivilege, user) {\n if (typeof requiredPrivilege === 'string') {\n return !(0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(user.privileges.find((p)=>requiredPrivilege === p.display));\n } else if (Array.isArray(requiredPrivilege)) {\n return requiredPrivilege.every((rp)=>!(0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(user.privileges.find((p)=>rp === p.display)));\n } else if (!(0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(requiredPrivilege)) {\n console.error(`Could not understand privileges \"${requiredPrivilege}\"`);\n }\n return true;\n}\nfunction isSuperUser(user) {\n return !(0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(user.roles.find((role)=>role.display === 'System Developer'));\n}\n/**\n * The `refetchCurrentUser` function causes a network request to redownload\n * the user. All subscribers to the current user will be notified of the\n * new users once the new version of the user object is downloaded.\n *\n * @returns The same observable as returned by {@link getCurrentUser}.\n *\n * @example\n * ```js\n * import { refetchCurrentUser } from '@openmrs/esm-api'\n * refetchCurrentUser()\n * ```\n */ function refetchCurrentUser(username, password) {\n lastFetchTimeMillis = Date.now();\n let headers = {};\n if (username && password) {\n headers['Authorization'] = `Basic ${window.btoa(`${username}:${password}`)}`;\n }\n return handleSessionResponse((0,_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.openmrsFetch)(_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.sessionEndpoint, {\n headers\n }));\n}\n/**\n * Clears the current user session from the session store, setting the session\n * to an unauthenticated state. This is typically called during logout to reset\n * the application's authentication state.\n *\n * @example\n * ```ts\n * import { clearCurrentUser } from '@openmrs/esm-api';\n * // During logout\n * clearCurrentUser();\n * ```\n */ function clearCurrentUser() {\n sessionStore.setState({\n loaded: true,\n session: {\n authenticated: false,\n sessionId: ''\n }\n });\n}\n/**\n * Checks whether the given user has access based on the required privilege(s).\n * A user has access if they have the required privilege(s) or if they are a\n * \"System Developer\" (super user). If no privilege is required, access is granted.\n *\n * @param requiredPrivilege A single privilege string or an array of privilege strings\n * that the user must have. If an array is provided, the user must have ALL privileges.\n * @param user The user object containing their privileges and roles.\n * @returns `true` if the user has access, `false` otherwise. Returns `true` if no\n * privilege is required, and `false` if the user is undefined but a privilege is required.\n *\n * @example\n * ```ts\n * import { userHasAccess } from '@openmrs/esm-api';\n * const hasAccess = userHasAccess('View Patients', currentUser);\n * const hasMultipleAccess = userHasAccess(['View Patients', 'Edit Patients'], currentUser);\n * ```\n */ function userHasAccess(requiredPrivilege, user) {\n if (user === undefined) {\n // if the user hasn't been loaded, then return false iff there is a required privilege\n return !Boolean(requiredPrivilege);\n }\n if (!Boolean(requiredPrivilege)) {\n // if user exists but no requiredPrivilege is defined\n return true;\n }\n return userHasPrivilege(requiredPrivilege, user) || isSuperUser(user);\n}\n/**\n * Returns a Promise that resolves with the currently logged-in user object.\n * If the user is already loaded in the session store, the Promise resolves immediately.\n * Otherwise, it subscribes to the session store and resolves when a logged-in user\n * becomes available.\n *\n * @returns A Promise that resolves with the LoggedInUser object once available.\n *\n * @example\n * ```ts\n * import { getLoggedInUser } from '@openmrs/esm-api';\n * const user = await getLoggedInUser();\n * console.log('Logged in as:', user.display);\n * ```\n */ function getLoggedInUser() {\n let user;\n let unsubscribe;\n return new Promise((res)=>{\n const handler = (state)=>{\n if (state.loaded && state.session.user) {\n user = state.session.user;\n res(state.session.user);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n handler(sessionStore.getState());\n if (!user) {\n unsubscribe = sessionStore.subscribe(handler);\n }\n });\n}\n/**\n * Returns a Promise that resolves with the current session location, if one is set.\n * The session location represents the physical location where the user is currently\n * working (e.g., a clinic or ward).\n *\n * @returns A Promise that resolves with the SessionLocation object, or `undefined`\n * if no session location is set.\n *\n * @example\n * ```ts\n * import { getSessionLocation } from '@openmrs/esm-api';\n * const location = await getSessionLocation();\n * if (location) {\n * console.log('Current location:', location.display);\n * }\n * ```\n */ function getSessionLocation() {\n return new Promise((res, rej)=>{\n const sub = getCurrentUser().subscribe((session)=>{\n res(session.sessionLocation);\n }, rej);\n sub.unsubscribe();\n });\n}\n/**\n * Sets the session location for the current user. The session location represents\n * the physical location where the user is working (e.g., a clinic or ward).\n * This triggers a server request to update the session and refreshes the local\n * session store.\n *\n * @param locationUuid The UUID of the location to set as the session location.\n * @param abortController An AbortController to allow cancellation of the request.\n * @returns A Promise that resolves with the updated SessionStore.\n *\n * @example\n * ```ts\n * import { setSessionLocation } from '@openmrs/esm-api';\n * const abortController = new AbortController();\n * await setSessionLocation('location-uuid-here', abortController);\n * ```\n */ async function setSessionLocation(locationUuid, abortController) {\n return handleSessionResponse((0,_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.openmrsFetch)(_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.sessionEndpoint, {\n method: 'POST',\n body: {\n sessionLocation: locationUuid\n },\n headers: {\n 'Content-Type': 'application/json'\n },\n signal: abortController.signal\n }));\n}\n/**\n * Updates the user properties for a specific user. User properties are key-value\n * pairs that store user-specific settings and preferences. After updating the\n * properties on the server, the current user session is refetched to reflect\n * the changes.\n *\n * @param userUuid The UUID of the user whose properties should be updated.\n * @param userProperties An object containing the properties to set or update.\n * @param abortController Optional AbortController to allow cancellation of the request.\n * If not provided, a new AbortController is created.\n * @returns A Promise that resolves with the updated SessionStore after refetching\n * the current user.\n *\n * @example\n * ```ts\n * import { getLoggedInUser, setUserProperties } from '@openmrs/esm-api';\n * const user = await getLoggedInUser();\n * await setUserProperties(user.uuid, {\n * defaultLocale: 'en_GB',\n * customSetting: 'value'\n * });\n * ```\n */ async function setUserProperties(userUuid, userProperties, abortController) {\n if (!abortController) {\n abortController = new AbortController();\n }\n await (0,_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.openmrsFetch)(`${_openmrs_fetch_js__WEBPACK_IMPORTED_MODULE_3__.restBaseUrl}/user/${userUuid}`, {\n method: 'POST',\n body: {\n userProperties\n },\n headers: {\n 'Content-Type': 'application/json'\n },\n signal: abortController.signal\n });\n return refetchCurrentUser();\n}\nfunction handleSessionResponse(result) {\n return new Promise((resolve, reject)=>{\n result.then((res)=>{\n let nextState;\n if (typeof res?.data === 'object') {\n nextState = {\n loaded: true,\n session: res.data\n };\n sessionStore.setState(nextState);\n resolve(nextState);\n } else {\n nextState = {\n loaded: false,\n session: null\n };\n sessionStore.setState(nextState);\n reject(nextState);\n }\n }).catch((err)=>{\n (0,_openmrs_esm_error_handling__WEBPACK_IMPORTED_MODULE_0__.reportError)(`Failed to fetch new session information: ${err}`);\n const nextState = {\n loaded: false,\n session: null\n };\n sessionStore.setState(nextState);\n reject(nextState);\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9jdXJyZW50LXVzZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBCQUEwQixHQUE2RDtBQUNoQztBQUNmO0FBQ047QUFDOEM7QUFDaEYsY0FBYyxHQUFVLE1BQU1PLGVBQWVOLHFFQUFpQkEsQ0FBQyxXQUFXO0lBQ3RFTyxRQUFRO0lBQ1JDLFNBQVM7QUFDYixHQUFHO0FBQ0gsSUFBSUMsc0JBQXNCO0FBQzFCLFNBQVNDLGVBQWVDLE9BQU87SUFDM0JDLG1CQUFtQjtBQUN2QixDQUFDO0lBQ0csSUFBSUgsc0JBQXNCSSxLQUFLQyxHQUFHLEtBQUssT0FBTyxNQUFNLENBQUNSLGFBQWFTLFFBQVEsR0FBR1IsTUFBTSxFQUFFO1FBQ2pGUztJQUNKO0lBQ0EsT0FBTyxJQUFJZCw0Q0FBVUEsQ0FBQyxDQUFDZTtRQUNuQixNQUFNQyxVQUFVLENBQUNDO1lBQ2IsSUFBSUEsTUFBTVosTUFBTSxFQUFFO2dCQUNkLElBQUlJLEtBQUtDLGlCQUFpQixFQUFFO29CQUN4QkssV0FBV0csSUFBSSxDQUFDRCxNQUFNWCxPQUFPO2dCQUNqQyxPQUFPO29CQUNIUyxXQUFXRyxJQUFJLENBQUNELE1BQU1YLE9BQU8sRUFBRWE7Z0JBQ25DO1lBQ0o7UUFDSjtRQUNBSCxRQUFRWixhQUFhUyxRQUFRO1FBQzdCLDJFQUEyRTtRQUMzRSx3REFBd0Q7UUFDeEQsT0FBT1QsYUFBYWdCLFNBQVMsQ0FBQ0o7SUFDbEM7QUFDSjtBQUMwQjtBQUMxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FpQkMsR0FBVSxTQUFTSztJQUNoQixJQUFJZCxzQkFBc0JJLEtBQUtDLEdBQUcsS0FBSyxPQUFPLE1BQU0sQ0FBQ1IsYUFBYVMsUUFBUSxHQUFHUixNQUFNLEVBQUU7UUFDakZTO0lBQ0o7SUFDQSxPQUFPVjtBQUNYO0FBQ0EsZ0RBQWdEO0FBQ2hELFNBQVNrQixjQUFjQyxNQUFNO0lBQ3pCLElBQUlBLFdBQVdDLGFBQWEsT0FBT0Qs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QUU7UUFDbERKLFFBQVE7UUFDUkMsTUFBTTtZQUNGL0M7UUFDSjtRQUNBeUIsU0FBUztZQUNMLGdCQUFnQjtRQUNwQjtRQUNBdUIsUUFBUUgsZ0JBQWdCRyxNQUFNO0lBQ2xDO0lBQ0EsT0FBT2hFO0FBQ1g7QUFDQSxTQUFTNEMsc0JBQXNCd0IsTUFBTTtJQUNqQyxPQUFPLElBQUlmLFFBQVEsQ0FBQ2dCLFNBQVNDO1FBQ3pCRixPQUFPRyxJQUFJLENBQUMsQ0FBQ2pCO1lBQ1QsSUFBSWtCO1lBQ0osSUFBSSxPQUFPbEIsS0FBS3ZDLFNBQVMsVUFBVTtnQkFDL0J5RCxZQUFZO29CQUNSakYsUUFBUTtvQkFDUkMsU0FBUzhELElBQUl2QyxJQUFJO2dCQUNyQjtnQkFDQXpCLGFBQWF3RCxRQUFRLENBQUMwQjtnQkFDdEJILFFBQVFHO1lBQ1osT0FBTztnQkFDSEEsWUFBWTtvQkFDUmpGLFFBQVE7b0JBQ1JDLFNBQVM7Z0JBQ2I7Z0JBQ0FGLGFBQWF3RCxRQUFRLENBQUMwQjtnQkFDdEJGLE9BQU9FO1lBQ1g7UUFDSixHQUFHQyxLQUFLLENBQUMsQ0FBQ0M7WUFDTjNGLHdFQUFXQSxDQUFDLENBQUMseUNBQXlDLEVBQUUyRixLQUFLO1lBQzdELE1BQU1GLFlBQVk7Z0JBQ2RqRixRQUFRO2dCQUNSQyxTQUFTO1lBQ2I7WUFDQUYsYUFBYXdELFFBQVEsQ0FBQzBCO1lBQ3RCRixPQUFPRTtRQUNYO0lBQ0o7QUFDSiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9jdXJyZW50LXVzZXIuanM/YzAwZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGltcG9ydCB7IHJlcG9ydEVycm9yIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1lcnJvci1oYW5kbGluZ1wiO1xuaW1wb3J0IHsgY3JlYXRlR2xvYmFsU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXN0YXRlXCI7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgb3Blbm1yc0ZldGNoLCByZXN0QmFzZVVybCwgc2Vzc2lvbkVuZHBvaW50IH0gZnJvbSBcIi4vb3Blbm1ycy1mZXRjaC5qc1wiO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3Qgc2Vzc2lvblN0b3JlID0gY3JlYXRlR2xvYmFsU3RvcmUoJ3Nlc3Npb24nLCB7XG4gICAgbG9hZGVkOiBmYWxzZSxcbiAgICBzZXNzaW9uOiBudWxsXG59KTtcbmxldCBsYXN0RmV0Y2hUaW1lTWlsbGlzID0gMDtcbmZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyKG9wdHMgPSB7XG4gICAgaW5jbHVkZUF1dGhTdGF0dXM6IHRydWVcbn0pIHtcbiAgICBpZiAobGFzdEZldGNoVGltZU1pbGxpcyA8IERhdGUubm93KCkgLSAxMDAwICogNjAgfHwgIXNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpLmxvYWRlZCkge1xuICAgICAgICByZWZldGNoQ3VycmVudFVzZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKT0+e1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKHN0YXRlKT0+e1xuICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmluY2x1ZGVBdXRoU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChzdGF0ZS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoc3RhdGUuc2Vzc2lvbj8udXNlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBoYW5kbGVyKHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgLy8gVGhlIG9ic2VydmFibGUgc3Vic2NyaWJlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gdW5zdWJzY3JpYmUgZnVuY3Rpb24sXG4gICAgICAgIC8vIHdoaWNoIGhhcHBlbnMgdG8gYmUgZXhhY3RseSB3aGF0IGBzdWJzY3JpYmVgIHJldHVybnMuXG4gICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmUuc3Vic2NyaWJlKGhhbmRsZXIpO1xuICAgIH0pO1xufVxuZXhwb3J0IHsgZ2V0Q3VycmVudFVzZXIgfTtcbi8qKlxuICogUmV0dXJucyB0aGUgZ2xvYmFsIHNlc3Npb24gc3RvcmUgY29udGFpbmluZyB0aGUgY3VycmVudCB1c2VyJ3Mgc2Vzc2lvbiBpbmZvcm1hdGlvbi5cbiAqIElmIHRoZSBzZXNzaW9uIGRhdGEgaXMgc3RhbGUgKG9sZGVyIHRoYW4gMSBtaW51dGUpIG9yIG5vdCB5ZXQgbG9hZGVkLCB0aGlzIGZ1bmN0aW9uXG4gKiB3aWxsIHRyaWdnZXIgYSByZWZldGNoIG9mIHRoZSBjdXJyZW50IHVzZXIncyBzZXNzaW9uLlxuICpcbiAqIEByZXR1cm5zIFRoZSBnbG9iYWwgc2Vzc2lvbiBzdG9yZSB0aGF0IGNhbiBiZSBzdWJzY3JpYmVkIHRvIGZvciBzZXNzaW9uIHVwZGF0ZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBnZXRTZXNzaW9uU3RvcmUgfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJztcbiAqIGNvbnN0IHN0b3JlID0gZ2V0U2Vzc2lvblN0b3JlKCk7XG4gKiBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAqICAgaWYgKHN0YXRlLmxvYWRlZCkge1xuICogICAgIGNvbnNvbGUubG9nKCdTZXNzaW9uOicsIHN0YXRlLnNlc3Npb24pO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRTZXNzaW9uU3RvcmUoKSB7XG4gICAgaWYgKGxhc3RGZXRjaFRpbWVNaWxsaXMgPCBEYXRlLm5vdygpIC0gMTAwMCAqIDYwIHx8ICFzZXNzaW9uU3RvcmUuZ2V0U3RhdGUoKS5sb2FkZWQpIHtcbiAgICAgICAgcmVmZXRjaEN1cnJlbnRVc2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBzZXNzaW9uU3RvcmU7XG59XG4vLyBOQiBsb2NhbGUgaXMgc3RyaW5nIG9ubHkgaWYgdGhpcyByZXR1cm5zIHRydWVcbmZ1bmN0aW9uIGlzVmFsaWRMb2NhbGUobG9jYWxlKSB7XG4gICAgaWYgKGxvY2FsZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBsb2NhbGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbmV3IEludGwuTG9jYWxlKGxvY2FsZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgdXNlcidzIGxvY2FsZSBwcmVmZXJlbmNlXG4gKiBmcm9tIHRoZSBzZXNzaW9uIGRhdGEuIFRoaXMgYWZmZWN0cyB0aGUgSFRNTCBgbGFuZ2AgYXR0cmlidXRlIHdoaWNoIGlzIHVzZWRcbiAqIGZvciBhY2Nlc3NpYmlsaXR5IGFuZCBpbnRlcm5hdGlvbmFsaXphdGlvbi5cbiAqXG4gKiBUaGUgbG9jYWxlIGlzIGRldGVybWluZWQgZnJvbSBlaXRoZXIgdGhlIHNlc3Npb24ncyBsb2NhbGUgb3IgdGhlIHVzZXInc1xuICogZGVmYXVsdCBsb2NhbGUgcHJvcGVydHkuIFVuZGVyc2NvcmVzIGluIHRoZSBsb2NhbGUgYXJlIGNvbnZlcnRlZCB0byBoeXBoZW5zXG4gKiB0byBtYXRjaCBCQ1AgNDcgbGFuZ3VhZ2UgdGFnIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgc2Vzc2lvbiBvYmplY3QgY29udGFpbmluZyBsb2NhbGUgaW5mb3JtYXRpb24uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHNldFVzZXJMYW5ndWFnZShkYXRhKSB7XG4gICAgbGV0IGxvY2FsZSA9IGRhdGEubG9jYWxlID8/IGRhdGEudXNlcj8udXNlclByb3BlcnRpZXM/LmRlZmF1bHRMb2NhbGU7XG4gICAgaWYgKGxvY2FsZSAmJiBsb2NhbGUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgICBsb2NhbGUgPSBsb2NhbGUucmVwbGFjZUFsbCgnXycsICctJyk7XG4gICAgfVxuICAgIGlmIChpc1ZhbGlkTG9jYWxlKGxvY2FsZSkgJiYgbG9jYWxlICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsYW5nJykpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnbGFuZycsIGxvY2FsZSk7XG4gICAgfVxufVxuc2Vzc2lvblN0b3JlLnN1YnNjcmliZSgoc3RhdGUpPT57XG4gICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5zZXNzaW9uKSB7XG4gICAgICAgIHNldFVzZXJMYW5ndWFnZShzdGF0ZS5zZXNzaW9uKTtcbiAgICB9XG59KTtcbmZ1bmN0aW9uIHVzZXJIYXNQcml2aWxlZ2UocmVxdWlyZWRQcml2aWxlZ2UsIHVzZXIpIHtcbiAgICBpZiAodHlwZW9mIHJlcXVpcmVkUHJpdmlsZWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gIWlzVW5kZWZpbmVkKHVzZXIucHJpdmlsZWdlcy5maW5kKChwKT0+cmVxdWlyZWRQcml2aWxlZ2UgPT09IHAuZGlzcGxheSkpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXF1aXJlZFByaXZpbGVnZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVkUHJpdmlsZWdlLmV2ZXJ5KChycCk9PiFpc1VuZGVmaW5lZCh1c2VyLnByaXZpbGVnZXMuZmluZCgocCk9PnJwID09PSBwLmRpc3BsYXkpKSk7XG4gICAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQocmVxdWlyZWRQcml2aWxlZ2UpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCB1bmRlcnN0YW5kIHByaXZpbGVnZXMgXCIke3JlcXVpcmVkUHJpdmlsZWdlfVwiYCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaXNTdXBlclVzZXIodXNlcikge1xuICAgIHJldHVybiAhaXNVbmRlZmluZWQodXNlci5yb2xlcy5maW5kKChyb2xlKT0+cm9sZS5kaXNwbGF5ID09PSAnU3lzdGVtIERldmVsb3BlcicpKTtcbn1cbi8qKlxuICogVGhlIGByZWZldGNoQ3VycmVudFVzZXJgIGZ1bmN0aW9uIGNhdXNlcyBhIG5ldHdvcmsgcmVxdWVzdCB0byByZWRvd25sb2FkXG4gKiB0aGUgdXNlci4gQWxsIHN1YnNjcmliZXJzIHRvIHRoZSBjdXJyZW50IHVzZXIgd2lsbCBiZSBub3RpZmllZCBvZiB0aGVcbiAqIG5ldyB1c2VycyBvbmNlIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgdXNlciBvYmplY3QgaXMgZG93bmxvYWRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2FtZSBvYnNlcnZhYmxlIGFzIHJldHVybmVkIGJ5IHtAbGluayBnZXRDdXJyZW50VXNlcn0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyByZWZldGNoQ3VycmVudFVzZXIgfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJ1xuICogcmVmZXRjaEN1cnJlbnRVc2VyKClcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiByZWZldGNoQ3VycmVudFVzZXIodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgbGFzdEZldGNoVGltZU1pbGxpcyA9IERhdGUubm93KCk7XG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAodXNlcm5hbWUgJiYgcGFzc3dvcmQpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7d2luZG93LmJ0b2EoYCR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YCl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZVNlc3Npb25SZXNwb25zZShvcGVubXJzRmV0Y2goc2Vzc2lvbkVuZHBvaW50LCB7XG4gICAgICAgIGhlYWRlcnNcbiAgICB9KSk7XG59XG4vKipcbiAqIENsZWFycyB0aGUgY3VycmVudCB1c2VyIHNlc3Npb24gZnJvbSB0aGUgc2Vzc2lvbiBzdG9yZSwgc2V0dGluZyB0aGUgc2Vzc2lvblxuICogdG8gYW4gdW5hdXRoZW50aWNhdGVkIHN0YXRlLiBUaGlzIGlzIHR5cGljYWxseSBjYWxsZWQgZHVyaW5nIGxvZ291dCB0byByZXNldFxuICogdGhlIGFwcGxpY2F0aW9uJ3MgYXV0aGVudGljYXRpb24gc3RhdGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjbGVhckN1cnJlbnRVc2VyIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWFwaSc7XG4gKiAvLyBEdXJpbmcgbG9nb3V0XG4gKiBjbGVhckN1cnJlbnRVc2VyKCk7XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gY2xlYXJDdXJyZW50VXNlcigpIHtcbiAgICBzZXNzaW9uU3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbklkOiAnJ1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGhhcyBhY2Nlc3MgYmFzZWQgb24gdGhlIHJlcXVpcmVkIHByaXZpbGVnZShzKS5cbiAqIEEgdXNlciBoYXMgYWNjZXNzIGlmIHRoZXkgaGF2ZSB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlKHMpIG9yIGlmIHRoZXkgYXJlIGFcbiAqIFwiU3lzdGVtIERldmVsb3BlclwiIChzdXBlciB1c2VyKS4gSWYgbm8gcHJpdmlsZWdlIGlzIHJlcXVpcmVkLCBhY2Nlc3MgaXMgZ3JhbnRlZC5cbiAqXG4gKiBAcGFyYW0gcmVxdWlyZWRQcml2aWxlZ2UgQSBzaW5nbGUgcHJpdmlsZWdlIHN0cmluZyBvciBhbiBhcnJheSBvZiBwcml2aWxlZ2Ugc3RyaW5nc1xuICogICB0aGF0IHRoZSB1c2VyIG11c3QgaGF2ZS4gSWYgYW4gYXJyYXkgaXMgcHJvdmlkZWQsIHRoZSB1c2VyIG11c3QgaGF2ZSBBTEwgcHJpdmlsZWdlcy5cbiAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIG9iamVjdCBjb250YWluaW5nIHRoZWlyIHByaXZpbGVnZXMgYW5kIHJvbGVzLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB1c2VyIGhhcyBhY2Nlc3MsIGBmYWxzZWAgb3RoZXJ3aXNlLiBSZXR1cm5zIGB0cnVlYCBpZiBub1xuICogICBwcml2aWxlZ2UgaXMgcmVxdWlyZWQsIGFuZCBgZmFsc2VgIGlmIHRoZSB1c2VyIGlzIHVuZGVmaW5lZCBidXQgYSBwcml2aWxlZ2UgaXMgcmVxdWlyZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyB1c2VySGFzQWNjZXNzIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWFwaSc7XG4gKiBjb25zdCBoYXNBY2Nlc3MgPSB1c2VySGFzQWNjZXNzKCdWaWV3IFBhdGllbnRzJywgY3VycmVudFVzZXIpO1xuICogY29uc3QgaGFzTXVsdGlwbGVBY2Nlc3MgPSB1c2VySGFzQWNjZXNzKFsnVmlldyBQYXRpZW50cycsICdFZGl0IFBhdGllbnRzJ10sIGN1cnJlbnRVc2VyKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB1c2VySGFzQWNjZXNzKHJlcXVpcmVkUHJpdmlsZWdlLCB1c2VyKSB7XG4gICAgaWYgKHVzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXNuJ3QgYmVlbiBsb2FkZWQsIHRoZW4gcmV0dXJuIGZhbHNlIGlmZiB0aGVyZSBpcyBhIHJlcXVpcmVkIHByaXZpbGVnZVxuICAgICAgICByZXR1cm4gIUJvb2xlYW4ocmVxdWlyZWRQcml2aWxlZ2UpO1xuICAgIH1cbiAgICBpZiAoIUJvb2xlYW4ocmVxdWlyZWRQcml2aWxlZ2UpKSB7XG4gICAgICAgIC8vIGlmIHVzZXIgZXhpc3RzIGJ1dCBubyByZXF1aXJlZFByaXZpbGVnZSBpcyBkZWZpbmVkXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdXNlckhhc1ByaXZpbGVnZShyZXF1aXJlZFByaXZpbGVnZSwgdXNlcikgfHwgaXNTdXBlclVzZXIodXNlcik7XG59XG4vKipcbiAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3VycmVudGx5IGxvZ2dlZC1pbiB1c2VyIG9iamVjdC5cbiAqIElmIHRoZSB1c2VyIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBzZXNzaW9uIHN0b3JlLCB0aGUgUHJvbWlzZSByZXNvbHZlcyBpbW1lZGlhdGVseS5cbiAqIE90aGVyd2lzZSwgaXQgc3Vic2NyaWJlcyB0byB0aGUgc2Vzc2lvbiBzdG9yZSBhbmQgcmVzb2x2ZXMgd2hlbiBhIGxvZ2dlZC1pbiB1c2VyXG4gKiBiZWNvbWVzIGF2YWlsYWJsZS5cbiAqXG4gKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBMb2dnZWRJblVzZXIgb2JqZWN0IG9uY2UgYXZhaWxhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZ2V0TG9nZ2VkSW5Vc2VyIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWFwaSc7XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgZ2V0TG9nZ2VkSW5Vc2VyKCk7XG4gKiBjb25zb2xlLmxvZygnTG9nZ2VkIGluIGFzOicsIHVzZXIuZGlzcGxheSk7XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VkSW5Vc2VyKCkge1xuICAgIGxldCB1c2VyO1xuICAgIGxldCB1bnN1YnNjcmliZTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcyk9PntcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IChzdGF0ZSk9PntcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sb2FkZWQgJiYgc3RhdGUuc2Vzc2lvbi51c2VyKSB7XG4gICAgICAgICAgICAgICAgdXNlciA9IHN0YXRlLnNlc3Npb24udXNlcjtcbiAgICAgICAgICAgICAgICByZXMoc3RhdGUuc2Vzc2lvbi51c2VyKTtcbiAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGhhbmRsZXIoc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gc2Vzc2lvblN0b3JlLnN1YnNjcmliZShoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGN1cnJlbnQgc2Vzc2lvbiBsb2NhdGlvbiwgaWYgb25lIGlzIHNldC5cbiAqIFRoZSBzZXNzaW9uIGxvY2F0aW9uIHJlcHJlc2VudHMgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIHdoZXJlIHRoZSB1c2VyIGlzIGN1cnJlbnRseVxuICogd29ya2luZyAoZS5nLiwgYSBjbGluaWMgb3Igd2FyZCkuXG4gKlxuICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgU2Vzc2lvbkxvY2F0aW9uIG9iamVjdCwgb3IgYHVuZGVmaW5lZGBcbiAqICAgaWYgbm8gc2Vzc2lvbiBsb2NhdGlvbiBpcyBzZXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBnZXRTZXNzaW9uTG9jYXRpb24gfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJztcbiAqIGNvbnN0IGxvY2F0aW9uID0gYXdhaXQgZ2V0U2Vzc2lvbkxvY2F0aW9uKCk7XG4gKiBpZiAobG9jYXRpb24pIHtcbiAqICAgY29uc29sZS5sb2coJ0N1cnJlbnQgbG9jYXRpb246JywgbG9jYXRpb24uZGlzcGxheSk7XG4gKiB9XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0U2Vzc2lvbkxvY2F0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopPT57XG4gICAgICAgIGNvbnN0IHN1YiA9IGdldEN1cnJlbnRVc2VyKCkuc3Vic2NyaWJlKChzZXNzaW9uKT0+e1xuICAgICAgICAgICAgcmVzKHNlc3Npb24uc2Vzc2lvbkxvY2F0aW9uKTtcbiAgICAgICAgfSwgcmVqKTtcbiAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG59XG4vKipcbiAqIFNldHMgdGhlIHNlc3Npb24gbG9jYXRpb24gZm9yIHRoZSBjdXJyZW50IHVzZXIuIFRoZSBzZXNzaW9uIGxvY2F0aW9uIHJlcHJlc2VudHNcbiAqIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSB0aGUgdXNlciBpcyB3b3JraW5nIChlLmcuLCBhIGNsaW5pYyBvciB3YXJkKS5cbiAqIFRoaXMgdHJpZ2dlcnMgYSBzZXJ2ZXIgcmVxdWVzdCB0byB1cGRhdGUgdGhlIHNlc3Npb24gYW5kIHJlZnJlc2hlcyB0aGUgbG9jYWxcbiAqIHNlc3Npb24gc3RvcmUuXG4gKlxuICogQHBhcmFtIGxvY2F0aW9uVXVpZCBUaGUgVVVJRCBvZiB0aGUgbG9jYXRpb24gdG8gc2V0IGFzIHRoZSBzZXNzaW9uIGxvY2F0aW9uLlxuICogQHBhcmFtIGFib3J0Q29udHJvbGxlciBBbiBBYm9ydENvbnRyb2xsZXIgdG8gYWxsb3cgY2FuY2VsbGF0aW9uIG9mIHRoZSByZXF1ZXN0LlxuICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdXBkYXRlZCBTZXNzaW9uU3RvcmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzZXRTZXNzaW9uTG9jYXRpb24gfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJztcbiAqIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAqIGF3YWl0IHNldFNlc3Npb25Mb2NhdGlvbignbG9jYXRpb24tdXVpZC1oZXJlJywgYWJvcnRDb250cm9sbGVyKTtcbiAqIGBgYFxuICovIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRTZXNzaW9uTG9jYXRpb24obG9jYXRpb25VdWlkLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gaGFuZGxlU2Vzc2lvblJlc3BvbnNlKG9wZW5tcnNGZXRjaChzZXNzaW9uRW5kcG9pbnQsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIHNlc3Npb25Mb2NhdGlvbjogbG9jYXRpb25VdWlkXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICAgfSkpO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSB1c2VyIHByb3BlcnRpZXMgZm9yIGEgc3BlY2lmaWMgdXNlci4gVXNlciBwcm9wZXJ0aWVzIGFyZSBrZXktdmFsdWVcbiAqIHBhaXJzIHRoYXQgc3RvcmUgdXNlci1zcGVjaWZpYyBzZXR0aW5ncyBhbmQgcHJlZmVyZW5jZXMuIEFmdGVyIHVwZGF0aW5nIHRoZVxuICogcHJvcGVydGllcyBvbiB0aGUgc2VydmVyLCB0aGUgY3VycmVudCB1c2VyIHNlc3Npb24gaXMgcmVmZXRjaGVkIHRvIHJlZmxlY3RcbiAqIHRoZSBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB1c2VyVXVpZCBUaGUgVVVJRCBvZiB0aGUgdXNlciB3aG9zZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSB1cGRhdGVkLlxuICogQHBhcmFtIHVzZXJQcm9wZXJ0aWVzIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIHNldCBvciB1cGRhdGUuXG4gKiBAcGFyYW0gYWJvcnRDb250cm9sbGVyIE9wdGlvbmFsIEFib3J0Q29udHJvbGxlciB0byBhbGxvdyBjYW5jZWxsYXRpb24gb2YgdGhlIHJlcXVlc3QuXG4gKiAgIElmIG5vdCBwcm92aWRlZCwgYSBuZXcgQWJvcnRDb250cm9sbGVyIGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB1cGRhdGVkIFNlc3Npb25TdG9yZSBhZnRlciByZWZldGNoaW5nXG4gKiAgIHRoZSBjdXJyZW50IHVzZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBnZXRMb2dnZWRJblVzZXIsIHNldFVzZXJQcm9wZXJ0aWVzIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWFwaSc7XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgZ2V0TG9nZ2VkSW5Vc2VyKCk7XG4gKiBhd2FpdCBzZXRVc2VyUHJvcGVydGllcyh1c2VyLnV1aWQsIHtcbiAqICAgZGVmYXVsdExvY2FsZTogJ2VuX0dCJyxcbiAqICAgY3VzdG9tU2V0dGluZzogJ3ZhbHVlJ1xuICogfSk7XG4gKiBgYGBcbiAqLyBleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VXNlclByb3BlcnRpZXModXNlclV1aWQsIHVzZXJQcm9wZXJ0aWVzLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICBpZiAoIWFib3J0Q29udHJvbGxlcikge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxuICAgIGF3YWl0IG9wZW5tcnNGZXRjaChgJHtyZXN0QmFzZVVybH0vdXNlci8ke3VzZXJVdWlkfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIHVzZXJQcm9wZXJ0aWVzXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlZmV0Y2hDdXJyZW50VXNlcigpO1xufVxuZnVuY3Rpb24gaGFuZGxlU2Vzc2lvblJlc3BvbnNlKHJlc3VsdCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+e1xuICAgICAgICByZXN1bHQudGhlbigocmVzKT0+e1xuICAgICAgICAgICAgbGV0IG5leHRTdGF0ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzPy5kYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiByZXMuZGF0YVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JlLnNldFN0YXRlKG5leHRTdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXh0U3RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb246IG51bGxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yZS5zZXRTdGF0ZShuZXh0U3RhdGUpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXh0U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgoZXJyKT0+e1xuICAgICAgICAgICAgcmVwb3J0RXJyb3IoYEZhaWxlZCB0byBmZXRjaCBuZXcgc2Vzc2lvbiBpbmZvcm1hdGlvbjogJHtlcnJ9YCk7XG4gICAgICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2Vzc2lvblN0b3JlLnNldFN0YXRlKG5leHRTdGF0ZSk7XG4gICAgICAgICAgICByZWplY3QobmV4dFN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOlsicmVwb3J0RXJyb3IiLCJjcmVhdGVHbG9iYWxTdG9yZSIsImlzVW5kZWZpbmVkIiwiT2JzZXJ2YWJsZSIsIm9wZW5tcnNGZXRjaCIsInJlc3RCYXNlVXJsIiwic2Vzc2lvbkVuZHBvaW50Iiwic2Vzc2lvblN0b3JlIiwibG9hZGVkIiwic2Vzc2lvbiIsImxhc3RGZXRjaFRpbWVNaWxsaXMiLCJnZXRDdXJyZW50VXNlciIsIm9wdHMiLCJpbmNsdWRlQXV0aFN0YXR1cyIsIkRhdGUiLCJub3ciLCJnZXRTdGF0ZSIsInJlZmV0Y2hDdXJyZW50VXNlciIsInN1YnNjcmliZXIiLCJoYW5kbGVyIiwic3RhdGUiLCJuZXh0IiwidXNlciIsInN1YnNjcmliZSIsImdldFNlc3Npb25TdG9yZSIsImlzVmFsaWRMb2NhbGUiLCJsb2NhbGUiLCJ1bmRlZmluZWQiLCJJbnRsIiwiTG9jYWxlIiwiZSIsInNldFVzZXJMYW5ndWFnZSIsImRhdGEiLCJ1c2VyUHJvcGVydGllcyIsImRlZmF1bHRMb2NhbGUiLCJpbmNsdWRlcyIsInJlcGxhY2VBbGwiLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsImdldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInVzZXJIYXNQcml2aWxlZ2UiLCJyZXF1aXJlZFByaXZpbGVnZSIsInByaXZpbGVnZXMiLCJmaW5kIiwicCIsImRpc3BsYXkiLCJBcnJheSIsImlzQXJyYXkiLCJldmVyeSIsInJwIiwiY29uc29sZSIsImVycm9yIiwiaXNTdXBlclVzZXIiLCJyb2xlcyIsInJvbGUiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiaGVhZGVycyIsIndpbmRvdyIsImJ0b2EiLCJoYW5kbGVTZXNzaW9uUmVzcG9uc2UiLCJjbGVhckN1cnJlbnRVc2VyIiwic2V0U3RhdGUiLCJhdXRoZW50aWNhdGVkIiwic2Vzc2lvbklkIiwidXNlckhhc0FjY2VzcyIsIkJvb2xlYW4iLCJnZXRMb2dnZWRJblVzZXIiLCJ1bnN1YnNjcmliZSIsIlByb21pc2UiLCJyZXMiLCJnZXRTZXNzaW9uTG9jYXRpb24iLCJyZWoiLCJzdWIiLCJzZXNzaW9uTG9jYXRpb24iLCJzZXRTZXNzaW9uTG9jYXRpb24iLCJsb2NhdGlvblV1aWQiLCJhYm9ydENvbnRyb2xsZXIiLCJtZXRob2QiLCJib2R5Iiwic2lnbmFsIiwic2V0VXNlclByb3BlcnRpZXMiLCJ1c2VyVXVpZCIsIkFib3J0Q29udHJvbGxlciIsInJlc3VsdCIsInJlc29sdmUiLCJyZWplY3QiLCJ0aGVuIiwibmV4dFN0YXRlIiwiY2F0Y2giLCJlcnIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-api/dist/current-user.js\n");
29
29
 
30
30
  /***/ }),
31
31
 
@@ -55,7 +55,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
55
55
  \********************************************************************/
56
56
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
57
57
 
58
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ backendDependencies: () => (/* binding */ backendDependencies)\n/* harmony export */ });\nconst backendDependencies = {\n 'webservices.rest': '2.24.0',\n fhir2: '1.0.0-SNAPSHOT'\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9vcGVubXJzLWJhY2tlbmQtZGVwZW5kZW5jaWVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBTyxNQUFNQSxzQkFBc0I7SUFDL0Isb0JBQW9CO0lBQ3BCQyxPQUFPO0FBQ1gsRUFBRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9vcGVubXJzLWJhY2tlbmQtZGVwZW5kZW5jaWVzLmpzPzU2MWIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGJhY2tlbmREZXBlbmRlbmNpZXMgPSB7XG4gICAgJ3dlYnNlcnZpY2VzLnJlc3QnOiAnMi4yNC4wJyxcbiAgICBmaGlyMjogJzEuMC4wLVNOQVBTSE9UJ1xufTtcbiJdLCJuYW1lcyI6WyJiYWNrZW5kRGVwZW5kZW5jaWVzIiwiZmhpcjIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-api/dist/openmrs-backend-dependencies.js\n");
58
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ backendDependencies: () => (/* binding */ backendDependencies)\n/* harmony export */ });\n/**\n * Defines the minimum required versions of OpenMRS backend modules that the\n * frontend framework depends on. These versions are checked at startup to ensure\n * compatibility between the frontend and backend.\n */ const backendDependencies = {\n 'webservices.rest': '2.24.0',\n fhir2: '1.0.0-SNAPSHOT'\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9vcGVubXJzLWJhY2tlbmQtZGVwZW5kZW5jaWVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7OztDQUlDLEdBQVUsTUFBTUEsc0JBQXNCO0lBQ25DLG9CQUFvQjtJQUNwQkMsT0FBTztBQUNYLEVBQUUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tYXBpL2Rpc3Qvb3Blbm1ycy1iYWNrZW5kLWRlcGVuZGVuY2llcy5qcz81NjFiIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmaW5lcyB0aGUgbWluaW11bSByZXF1aXJlZCB2ZXJzaW9ucyBvZiBPcGVuTVJTIGJhY2tlbmQgbW9kdWxlcyB0aGF0IHRoZVxuICogZnJvbnRlbmQgZnJhbWV3b3JrIGRlcGVuZHMgb24uIFRoZXNlIHZlcnNpb25zIGFyZSBjaGVja2VkIGF0IHN0YXJ0dXAgdG8gZW5zdXJlXG4gKiBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIGZyb250ZW5kIGFuZCBiYWNrZW5kLlxuICovIGV4cG9ydCBjb25zdCBiYWNrZW5kRGVwZW5kZW5jaWVzID0ge1xuICAgICd3ZWJzZXJ2aWNlcy5yZXN0JzogJzIuMjQuMCcsXG4gICAgZmhpcjI6ICcxLjAuMC1TTkFQU0hPVCdcbn07XG4iXSwibmFtZXMiOlsiYmFja2VuZERlcGVuZGVuY2llcyIsImZoaXIyIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-api/dist/openmrs-backend-dependencies.js\n");
59
59
 
60
60
  /***/ }),
61
61
 
@@ -65,7 +65,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
65
65
  \*****************************************************/
66
66
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
67
67
 
68
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OpenmrsFetchError: () => (/* binding */ OpenmrsFetchError),\n/* harmony export */ fhirBaseUrl: () => (/* binding */ fhirBaseUrl),\n/* harmony export */ makeUrl: () => (/* binding */ makeUrl),\n/* harmony export */ openmrsFetch: () => (/* binding */ openmrsFetch),\n/* harmony export */ openmrsObservableFetch: () => (/* binding */ openmrsObservableFetch),\n/* harmony export */ restBaseUrl: () => (/* binding */ restBaseUrl),\n/* harmony export */ sessionEndpoint: () => (/* binding */ sessionEndpoint)\n/* harmony export */ });\n/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rxjs */ \"webpack/sharing/consume/default/rxjs/rxjs\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isPlainObject.js\");\n/* harmony import */ var _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-config */ \"../../framework/esm-config/dist/index.js\");\n/* harmony import */ var _openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-navigation */ \"../../framework/esm-navigation/dist/index.js\");\n/* harmony import */ var _config_schema_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./config-schema.js */ \"../../framework/esm-api/dist/config-schema.js\");\n/** @module @category API */ function _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\n\n\n\n\n\nconst restBaseUrl = '/ws/rest/v1';\nconst fhirBaseUrl = '/ws/fhir2/R4';\nconst sessionEndpoint = `${restBaseUrl}/session`;\n/**\n * Append `path` to the OpenMRS SPA base.\n *\n * #### Example\n *\n * ```ts\n * makeUrl('/foo/bar');\n * // => '/openmrs/foo/bar'\n * ```\n */ function makeUrl(path) {\n if (path && path.startsWith('http')) {\n return path;\n } else if (path[0] !== '/') {\n // ensure path starts with /\n path = '/' + path;\n }\n return window.openmrsBase + path;\n}\n/**\n * The openmrsFetch function is a wrapper around the\n * [browser's built-in fetch function](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch),\n * with extra handling for OpenMRS-specific API behaviors, such as\n * request headers, authentication, authorization, and the API urls.\n *\n * @param path A string url to make the request to. Note that the\n * openmrs base url (by default `/openmrs`) will be automatically\n * prepended to the URL, so there is no need to include it.\n * @param fetchInit A [fetch init object](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Syntax).\n * Note that the `body` property does not need to be `JSON.stringify()`ed\n * because openmrsFetch will do that for you.\n * @returns A [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)\n * that resolves with a [Response object](https://developer.mozilla.org/en-US/docs/Web/API/Response).\n * Note that the openmrs version of the Response object has already\n * downloaded the HTTP response body as json, and has an additional\n * `data` property with the HTTP response json as a javascript object.\n *\n * #### Example\n * ```js\n * import { openmrsFetch } from '@openmrs/esm-api'\n * const abortController = new AbortController();\n * openmrsFetch(`${restBaseUrl}/session', {signal: abortController.signal})\n * .then(response => {\n * console.log(response.data.authenticated)\n * })\n * .catch(err => {\n * console.error(err.status);\n * })\n * abortController.abort();\n * openmrsFetch(`${restBaseUrl}/session', {\n * method: 'POST',\n * body: {\n * username: 'hi',\n * password: 'there',\n * }\n * })\n * ```\n *\n * #### Cancellation\n *\n * To cancel a network request, use an\n * [AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort).\n * It is best practice to cancel your network requests when the user\n * navigates away from a page while the request is pending request, to\n * free up memory and network resources and to prevent race conditions.\n *\n * @category API\n */ function openmrsFetch(path, fetchInit = {}) {\n if (typeof path !== 'string') {\n throw Error(\"The first argument to @openmrs/api's openmrsFetch function must be a url string\");\n }\n if (typeof fetchInit !== 'object') {\n throw Error(\"The second argument to @openmrs/api's openmrsFetch function must be a plain object.\");\n }\n if (!window.openmrsBase) {\n throw Error(\"@openmrs/api is running in a browser that doesn't have window.openmrsBase, which is provided by openmrs-module-spa's HTML file.\");\n }\n // Prefix the url with the openmrs spa base\n let url = makeUrl(path);\n // We're going to need some headers\n if (!fetchInit.headers) {\n fetchInit.headers = {};\n }\n /* Automatically stringify javascript objects being sent in the\n * request body.\n */ if ((0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(fetchInit.body)) {\n fetchInit.body = JSON.stringify(fetchInit.body);\n }\n /* Add a request header to tell the server to respond with json,\n * since frontend code almost always wants json and the OpenMRS\n * server won't give you json unless you explicitly ask for it.\n * If a different Accept header is preferred, pass it into the fetchInit.\n * If no Accept header is desired, pass it in explicitly as null.\n */ if (typeof fetchInit.headers.Accept === 'undefined') {\n fetchInit.headers.Accept = 'application/json';\n }\n if (fetchInit.headers.Accept === null) {\n delete fetchInit.headers.Accept;\n }\n /* This tells the OpenMRS REST API not to return a WWW-Authenticate\n * header. Returning that header is useful when using the API, but\n * not from a UI.\n */ if (path.startsWith(restBaseUrl) && typeof fetchInit.headers['Disable-WWW-Authenticate'] === 'undefined') {\n fetchInit.headers['Disable-WWW-Authenticate'] = 'true';\n }\n if (path.startsWith(fhirBaseUrl)) {\n const urlUrl = new URL(url, window.location.toString());\n if (!urlUrl.searchParams.has('_summary')) {\n urlUrl.searchParams.set('_summary', 'data');\n url = urlUrl.toString();\n }\n }\n /* We capture the stacktrace before making the request, so that if an error occurs we can\n * log a full stacktrace that includes the code that made the request and handled the response\n * Otherwise, we could run into situations where the stacktrace doesn't even show which code\n * called @openmrs/api.\n */ const requestStacktrace = Error();\n return window.fetch(url, fetchInit).then(async (r)=>{\n const response = r;\n const { redirectAuthFailure, followRedirects } = await (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getConfig)('@openmrs/esm-api');\n if (response.ok) {\n if (response.status === 204) {\n if (followRedirects && response.headers.has('location')) {\n const location = response.headers.get('location');\n if (location) {\n (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_2__.navigate)({\n to: location\n });\n }\n }\n /* HTTP 204 - No Content\n * We should not try to download the empty response as json. Instead,\n * we return null since there is no response body.\n */ response.data = null;\n return response;\n } else {\n // HTTP 200s - The request succeeded\n return response.clone().text().then((responseText)=>{\n try {\n if (responseText) {\n response.data = JSON.parse(responseText);\n }\n } catch (err) {\n // Server didn't respond with json\n }\n return response;\n });\n }\n } else {\n /* HTTP response status is not in 200s. Usually this will mean\n * either HTTP 400s (bad request from browser) or HTTP 500s (server error)\n * Our goal is to come up with best possible stacktrace and error message\n * to help developers understand the problem and debug\n */ /*\n * Redirect to given url when redirect on auth failure is enabled\n */ if (url === makeUrl(sessionEndpoint) && response.status === 403 || redirectAuthFailure.enabled && redirectAuthFailure.errors.includes(response.status)) {\n (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_2__.clearHistory)();\n // by default, redirect to the url specified in the config.\n // If blank, use the location header from the response.\n // If that is also blank, use the default redirect url.\n const location = redirectAuthFailure.url || response.headers.get('location') || _config_schema_js__WEBPACK_IMPORTED_MODULE_3__.defaultRedirectAuthFailureUrl;\n (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_2__.navigate)({\n to: location\n });\n /* We sometimes don't really want this promise to resolve since there's no response data,\n * nor do we want it to reject because that would trigger error handling. We instead\n * want it to remain in pending status while the navigation occurs.\n */ return redirectAuthFailure.resolvePromise ? Promise.resolve() : new Promise(()=>{});\n } else {\n // Attempt to download a response body, if it has one\n return response.clone().text().then((responseText)=>{\n let responseBody = responseText;\n try {\n responseBody = JSON.parse(responseText);\n } catch (err) {\n // Server didn't respond with json, so just go with the response text string\n }\n /* Make the fetch promise go into \"rejected\" status, with the best\n * possible stacktrace and error message.\n */ throw new OpenmrsFetchError(url, response, responseBody, requestStacktrace);\n }, (err)=>{\n /* We weren't able to download a response body for this error.\n * Time to just give the best possible stacktrace and error message.\n */ throw new OpenmrsFetchError(url, response, null, requestStacktrace);\n });\n }\n }\n });\n}\n/**\n * The openmrsObservableFetch function is a wrapper around openmrsFetch\n * that returns an [Observable](https://rxjs-dev.firebaseapp.com/guide/observable)\n * instead of a promise. It exists in case using an Observable is\n * preferred or more convenient than a promise.\n *\n * @param url See [[openmrsFetch]]\n * @param fetchInit See [[openmrsFetch]]\n * @returns An Observable that produces exactly one Response object.\n * The response object is exactly the same as for [[openmrsFetch]].\n *\n * #### Example\n *\n * ```js\n * import { openmrsObservableFetch } from '@openmrs/esm-api'\n * const subscription = openmrsObservableFetch(`${restBaseUrl}/session').subscribe(\n * response => console.log(response.data),\n * err => {throw err},\n * () => console.log('finished')\n * )\n * subscription.unsubscribe()\n * ```\n *\n * #### Cancellation\n *\n * To cancel the network request, simply call `subscription.unsubscribe();`\n *\n * @category API\n */ function openmrsObservableFetch(url, fetchInit = {}) {\n if (typeof fetchInit !== 'object') {\n throw Error('The second argument to openmrsObservableFetch must be either omitted or an object');\n }\n const abortController = new AbortController();\n fetchInit.signal = abortController.signal;\n return new rxjs__WEBPACK_IMPORTED_MODULE_0__.Observable((observer)=>{\n let hasResponse = false;\n openmrsFetch(url, fetchInit).then((response)=>{\n hasResponse = true;\n observer.next(response);\n observer.complete();\n }, (err)=>{\n hasResponse = true;\n observer.error(err);\n });\n return ()=>{\n if (!hasResponse) {\n abortController.abort();\n }\n };\n });\n}\nclass OpenmrsFetchError extends Error {\n constructor(url, response, responseBody, requestStacktrace){\n super(), _define_property(this, \"response\", void 0), _define_property(this, \"responseBody\", void 0);\n this.message = `Server responded with ${response.status} (${response.statusText}) for url ${url}. Check err.responseBody or network tab in dev tools for more info`;\n requestStacktrace.message = this.message;\n this.responseBody = responseBody;\n this.response = response;\n this.stack = `Stacktrace for outgoing request:\\n${requestStacktrace.stack}\\nStacktrace for incoming response:\\n${this.stack}`;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9vcGVubXJzLWZldGNoLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBCQUEwQixHQUFHLFNBQVNBLGlCQUFpQkMsR0FBRyxFQUFFQyxHQUFHLEVBQUVDLEtBQUs7SUFDbEUsSUFBSUQsT0FBT0QsS0FBSztRQUNaRyxPQUFPQyxjQUFjLENBQUNKLEtBQUtDLEtBQUs7WUFDNUJDLE9BQU9BO1lBQ1BHLFlBQVk7WUFDWkMsY0FBYztZQUNkQyxVQUFVO1FBQ2Q7SUFDSixPQUFPO1FBQ0hQLEdBQUcsQ0FBQ0MsSUFBSSxHQUFHQztJQUNmO0lBQ0EsT0FBT0Y7QUFDWDtBQUNrQztBQUNRO0FBQ007QUFDaUI7QUFDRTtBQUM1RCxNQUFNYyxjQUFjLGNBQWM7QUFDbEMsTUFBTUMsY0FBYyxlQUFlO0FBQ25DLE1BQU1DLGtCQUFrQixHQUFHRixZQUFZLFFBQVEsQ0FBQyxDQUFDO0FBQ3hEOzs7Ozs7Ozs7Q0FTQyxHQUFVLFNBQVNHLFFBQVFDLElBQUk7SUFDNUIsSUFBSUEsUUFBUUEsS0FBS0MsVUFBVSxDQUFDLFNBQVM7UUFDakMsT0FBT0Q7SUFDWCxPQUFPLElBQUlBLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSztRQUN4Qiw0QkFBNEI7UUFDNUJBLE9BQU8sTUFBTUE7SUFDakI7SUFDQSxPQUFPRSxPQUFPQyxXQUFXLEdBQUdIO0FBQ2hDO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWdEQyxHQUFVLFNBQVNJLGFBQWFKLElBQUksRUFBRUssWUFBWSxDQUFDLENBQUM7SUFDakQsSUFBSSxPQUFPTCxTQUFTLFVBQVU7UUFDMUIsTUFBTU0sTUFBTTtJQUNoQjtJQUNBLElBQUksT0FBT0QsY0FBYyxVQUFVO1FBQy9CLE1BQU1DLE1BQU07SUFDaEI7SUFDQSxJQUFJLENBQUNKLE9BQU9DLFdBQVcsRUFBRTtRQUNyQixNQUFNRyxNQUFNO0lBQ2hCO0lBQ0Es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LEVBQUVpQixRQUFRLEVBQUVtQixZQUFZLEVBQUV2QixpQkFBaUIsQ0FBQztRQUN2RCxLQUFLLElBQUl2QyxpQkFBaUIsSUFBSSxFQUFFLFlBQVksS0FBSyxJQUFJQSxpQkFBaUIsSUFBSSxFQUFFLGdCQUFnQixLQUFLO1FBQ2pHLElBQUksQ0FBQzBFLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixFQUFFL0IsU0FBU0ksTUFBTSxDQUFDLEVBQUUsRUFBRUosU0FBU2dDLFVBQVUsQ0FBQyxVQUFVLEVBQUVqRCxJQUFJLGtFQUFrRSxDQUFDO1FBQ25LYSxrQkFBa0JtQyxPQUFPLEdBQUcsSUFBSSxDQUFDQSxPQUFPO1FBQ3hDLElBQUksQ0FBQ1osWUFBWSxHQUFHQTtRQUNwQixJQUFJLENBQUNuQixRQUFRLEdBQUdBO1FBQ2hCLElBQUksQ0FBQ2lDLEtBQUssR0FBRyxDQUFDLGtDQUFrQyxFQUFFckMsa0JBQWtCcUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFLElBQUksQ0FBQ0EsS0FBSyxFQUFFO0lBQ2pJO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tYXBpL2Rpc3Qvb3Blbm1ycy1mZXRjaC5qcz9mZTE5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBBUEkgKi8gZnVuY3Rpb24gX2RlZmluZV9wcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1jb25maWdcIjtcbmltcG9ydCB7IGNsZWFySGlzdG9yeSwgbmF2aWdhdGUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLW5hdmlnYXRpb25cIjtcbmltcG9ydCB7IGRlZmF1bHRSZWRpcmVjdEF1dGhGYWlsdXJlVXJsIH0gZnJvbSBcIi4vY29uZmlnLXNjaGVtYS5qc1wiO1xuZXhwb3J0IGNvbnN0IHJlc3RCYXNlVXJsID0gJy93cy9yZXN0L3YxJztcbmV4cG9ydCBjb25zdCBmaGlyQmFzZVVybCA9ICcvd3MvZmhpcjIvUjQnO1xuZXhwb3J0IGNvbnN0IHNlc3Npb25FbmRwb2ludCA9IGAke3Jlc3RCYXNlVXJsfS9zZXNzaW9uYDtcbi8qKlxuICogQXBwZW5kIGBwYXRoYCB0byB0aGUgT3Blbk1SUyBTUEEgYmFzZS5cbiAqXG4gKiAjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogbWFrZVVybCgnL2Zvby9iYXInKTtcbiAqIC8vID0+ICcvb3Blbm1ycy9mb28vYmFyJ1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIG1ha2VVcmwocGF0aCkge1xuICAgIGlmIChwYXRoICYmIHBhdGguc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH0gZWxzZSBpZiAocGF0aFswXSAhPT0gJy8nKSB7XG4gICAgICAgIC8vIGVuc3VyZSBwYXRoIHN0YXJ0cyB3aXRoIC9cbiAgICAgICAgcGF0aCA9ICcvJyArIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3cub3Blbm1yc0Jhc2UgKyBwYXRoO1xufVxuLyoqXG4gKiBUaGUgb3Blbm1yc0ZldGNoIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlXG4gKiBbYnJvd3NlcidzIGJ1aWx0LWluIGZldGNoIGZ1bmN0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJL1VzaW5nX0ZldGNoKSxcbiAqIHdpdGggZXh0cmEgaGFuZGxpbmcgZm9yIE9wZW5NUlMtc3BlY2lmaWMgQVBJIGJlaGF2aW9ycywgc3VjaCBhc1xuICogcmVxdWVzdCBoZWFkZXJzLCBhdXRoZW50aWNhdGlvbiwgYXV0aG9yaXphdGlvbiwgYW5kIHRoZSBBUEkgdXJscy5cbiAqXG4gKiBAcGFyYW0gcGF0aCBBIHN0cmluZyB1cmwgdG8gbWFrZSB0aGUgcmVxdWVzdCB0by4gTm90ZSB0aGF0IHRoZVxuICogICBvcGVubXJzIGJhc2UgdXJsIChieSBkZWZhdWx0IGAvb3Blbm1yc2ApIHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogICBwcmVwZW5kZWQgdG8gdGhlIFVSTCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlIGl0LlxuICogQHBhcmFtIGZldGNoSW5pdCBBIFtmZXRjaCBpbml0IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUvZmV0Y2gjU3ludGF4KS5cbiAqICAgTm90ZSB0aGF0IHRoZSBgYm9keWAgcHJvcGVydHkgZG9lcyBub3QgbmVlZCB0byBiZSBgSlNPTi5zdHJpbmdpZnkoKWBlZFxuICogICBiZWNhdXNlIG9wZW5tcnNGZXRjaCB3aWxsIGRvIHRoYXQgZm9yIHlvdS5cbiAqIEByZXR1cm5zIEEgW1Byb21pc2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2UpXG4gKiAgIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIFtSZXNwb25zZSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXNwb25zZSkuXG4gKiAgIE5vdGUgdGhhdCB0aGUgb3Blbm1ycyB2ZXJzaW9uIG9mIHRoZSBSZXNwb25zZSBvYmplY3QgaGFzIGFscmVhZHlcbiAqICAgZG93bmxvYWRlZCB0aGUgSFRUUCByZXNwb25zZSBib2R5IGFzIGpzb24sIGFuZCBoYXMgYW4gYWRkaXRpb25hbFxuICogICBgZGF0YWAgcHJvcGVydHkgd2l0aCB0aGUgSFRUUCByZXNwb25zZSBqc29uIGFzIGEgamF2YXNjcmlwdCBvYmplY3QuXG4gKlxuICogIyMjIyBFeGFtcGxlXG4gKiBgYGBqc1xuICogaW1wb3J0IHsgb3Blbm1yc0ZldGNoIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWFwaSdcbiAqIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAqIG9wZW5tcnNGZXRjaChgJHtyZXN0QmFzZVVybH0vc2Vzc2lvbicsIHtzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWx9KVxuICogICAudGhlbihyZXNwb25zZSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YS5hdXRoZW50aWNhdGVkKVxuICogICB9KVxuICogICAuY2F0Y2goZXJyID0+IHtcbiAqICAgICBjb25zb2xlLmVycm9yKGVyci5zdGF0dXMpO1xuICogICB9KVxuICogYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gKiBvcGVubXJzRmV0Y2goYCR7cmVzdEJhc2VVcmx9L3Nlc3Npb24nLCB7XG4gKiAgIG1ldGhvZDogJ1BPU1QnLFxuICogICBib2R5OiB7XG4gKiAgICAgdXNlcm5hbWU6ICdoaScsXG4gKiAgICAgcGFzc3dvcmQ6ICd0aGVyZScsXG4gKiAgIH1cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiAjIyMjIENhbmNlbGxhdGlvblxuICpcbiAqIFRvIGNhbmNlbCBhIG5ldHdvcmsgcmVxdWVzdCwgdXNlIGFuXG4gKiBbQWJvcnRDb250cm9sbGVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyL2Fib3J0KS5cbiAqIEl0IGlzIGJlc3QgcHJhY3RpY2UgdG8gY2FuY2VsIHlvdXIgbmV0d29yayByZXF1ZXN0cyB3aGVuIHRoZSB1c2VyXG4gKiBuYXZpZ2F0ZXMgYXdheSBmcm9tIGEgcGFnZSB3aGlsZSB0aGUgcmVxdWVzdCBpcyBwZW5kaW5nIHJlcXVlc3QsIHRvXG4gKiBmcmVlIHVwIG1lbW9yeSBhbmQgbmV0d29yayByZXNvdXJjZXMgYW5kIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zLlxuICpcbiAqIEBjYXRlZ29yeSBBUElcbiAqLyBleHBvcnQgZnVuY3Rpb24gb3Blbm1yc0ZldGNoKHBhdGgsIGZldGNoSW5pdCA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBFcnJvcihcIlRoZSBmaXJzdCBhcmd1bWVudCB0byBAb3Blbm1ycy9hcGkncyBvcGVubXJzRmV0Y2ggZnVuY3Rpb24gbXVzdCBiZSBhIHVybCBzdHJpbmdcIik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZmV0Y2hJbml0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBFcnJvcihcIlRoZSBzZWNvbmQgYXJndW1lbnQgdG8gQG9wZW5tcnMvYXBpJ3Mgb3Blbm1yc0ZldGNoIGZ1bmN0aW9uIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuXCIpO1xuICAgIH1cbiAgICBpZiAoIXdpbmRvdy5vcGVubXJzQmFzZSkge1xuICAgICAgICB0aHJvdyBFcnJvcihcIkBvcGVubXJzL2FwaSBpcyBydW5uaW5nIGluIGEgYnJvd3NlciB0aGF0IGRvZXNuJ3QgaGF2ZSB3aW5kb3cub3Blbm1yc0Jhc2UsIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IG9wZW5tcnMtbW9kdWxlLXNwYSdzIEhUTUwgZmlsZS5cIik7XG4gICAgfVxuICAgIC8vIFByZWZpeCB0aGUgdXJsIHdpdGggdGhlIG9wZW5tcnMgc3BhIGJhc2VcbiAgICBsZXQgdXJsID0gbWFrZVVybChwYXRoKTtcbiAgICAvLyBXZSdyZSBnb2luZyB0byBuZWVkIHNvbWUgaGVhZGVyc1xuICAgIGlmICghZmV0Y2hJbml0LmhlYWRlcnMpIHtcbiAgICAgICAgZmV0Y2hJbml0LmhlYWRlcnMgPSB7fTtcbiAgICB9XG4gICAgLyogQXV0b21hdGljYWxseSBzdHJpbmdpZnkgamF2YXNjcmlwdCBvYmplY3RzIGJlaW5nIHNlbnQgaW4gdGhlXG4gICAqIHJlcXVlc3QgYm9keS5cbiAgICovIGlmIChpc1BsYWluT2JqZWN0KGZldGNoSW5pdC5ib2R5KSkge1xuICAgICAgICBmZXRjaEluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KGZldGNoSW5pdC5ib2R5KTtcbiAgICB9XG4gICAgLyogQWRkIGEgcmVxdWVzdCBoZWFkZXIgdG8gdGVsbCB0aGUgc2VydmVyIHRvIHJlc3BvbmQgd2l0aCBqc29uLFxuICAgKiBzaW5jZSBmcm9udGVuZCBjb2RlIGFsbW9zdCBhbHdheXMgd2FudHMganNvbiBhbmQgdGhlIE9wZW5NUlNcbiAgICogc2VydmVyIHdvbid0IGdpdmUgeW91IGpzb24gdW5sZXNzIHlvdSBleHBsaWNpdGx5IGFzayBmb3IgaXQuXG4gICAqIElmIGEgZGlmZmVyZW50IEFjY2VwdCBoZWFkZXIgaXMgcHJlZmVycmVkLCBwYXNzIGl0IGludG8gdGhlIGZldGNoSW5pdC5cbiAgICogSWYgbm8gQWNjZXB0IGhlYWRlciBpcyBkZXNpcmVkLCBwYXNzIGl0IGluIGV4cGxpY2l0bHkgYXMgbnVsbC5cbiAgICovIGlmICh0eXBlb2YgZmV0Y2hJbml0LmhlYWRlcnMuQWNjZXB0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmZXRjaEluaXQuaGVhZGVycy5BY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgfVxuICAgIGlmIChmZXRjaEluaXQuaGVhZGVycy5BY2NlcHQgPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIGZldGNoSW5pdC5oZWFkZXJzLkFjY2VwdDtcbiAgICB9XG4gICAgLyogVGhpcyB0ZWxscyB0aGUgT3Blbk1SUyBSRVNUIEFQSSBub3QgdG8gcmV0dXJuIGEgV1dXLUF1dGhlbnRpY2F0ZVxuICAgKiBoZWFkZXIuIFJldHVybmluZyB0aGF0IGhlYWRlciBpcyB1c2VmdWwgd2hlbiB1c2luZyB0aGUgQVBJLCBidXRcbiAgICogbm90IGZyb20gYSBVSS5cbiAgICovIGlmIChwYXRoLnN0YXJ0c1dpdGgocmVzdEJhc2VVcmwpICYmIHR5cGVvZiBmZXRjaEluaXQuaGVhZGVyc1snRGlzYWJsZS1XV1ctQXV0aGVudGljYXRlJ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZldGNoSW5pdC5oZWFkZXJzWydEaXNhYmxlLVdXVy1BdXRoZW50aWNhdGUnXSA9ICd0cnVlJztcbiAgICB9XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChmaGlyQmFzZVVybCkpIHtcbiAgICAgICAgY29uc3QgdXJsVXJsID0gbmV3IFVSTCh1cmwsIHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKCF1cmxVcmwuc2VhcmNoUGFyYW1zLmhhcygnX3N1bW1hcnknKSkge1xuICAgICAgICAgICAgdXJsVXJsLnNlYXJjaFBhcmFtcy5zZXQoJ19zdW1tYXJ5JywgJ2RhdGEnKTtcbiAgICAgICAgICAgIHVybCA9IHVybFVybC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qIFdlIGNhcHR1cmUgdGhlIHN0YWNrdHJhY2UgYmVmb3JlIG1ha2luZyB0aGUgcmVxdWVzdCwgc28gdGhhdCBpZiBhbiBlcnJvciBvY2N1cnMgd2UgY2FuXG4gICAqIGxvZyBhIGZ1bGwgc3RhY2t0cmFjZSB0aGF0IGluY2x1ZGVzIHRoZSBjb2RlIHRoYXQgbWFkZSB0aGUgcmVxdWVzdCBhbmQgaGFuZGxlZCB0aGUgcmVzcG9uc2VcbiAgICogT3RoZXJ3aXNlLCB3ZSBjb3VsZCBydW4gaW50byBzaXR1YXRpb25zIHdoZXJlIHRoZSBzdGFja3RyYWNlIGRvZXNuJ3QgZXZlbiBzaG93IHdoaWNoIGNvZGVcbiAgICogY2FsbGVkIEBvcGVubXJzL2FwaS5cbiAgICovIGNvbnN0IHJlcXVlc3RTdGFja3RyYWNlID0gRXJyb3IoKTtcbiAgICByZXR1cm4gd2luZG93LmZldGNoKHVybCwgZmV0Y2hJbml0KS50aGVuKGFzeW5jIChyKT0+e1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHI7XG4gICAgICAgIGNvbnN0IHsgcmVkaXJlY3RBdXRoRmFpbHVyZSwgZm9sbG93UmVkaXJlY3RzIH0gPSBhd2FpdCBnZXRDb25maWcoJ0BvcGVubXJzL2VzbS1hcGknKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm9sbG93UmVkaXJlY3RzICYmIHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdsb2NhdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2xvY2F0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBsb2NhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogSFRUUCAyMDQgLSBObyBDb250ZW50XG4gICAgICAgICAqIFdlIHNob3VsZCBub3QgdHJ5IHRvIGRvd25sb2FkIHRoZSBlbXB0eSByZXNwb25zZSBhcyBqc29uLiBJbnN0ZWFkLFxuICAgICAgICAgKiB3ZSByZXR1cm4gbnVsbCBzaW5jZSB0aGVyZSBpcyBubyByZXNwb25zZSBib2R5LlxuICAgICAgICAgKi8gcmVzcG9uc2UuZGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBIVFRQIDIwMHMgLSBUaGUgcmVxdWVzdCBzdWNjZWVkZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuY2xvbmUoKS50ZXh0KCkudGhlbigocmVzcG9uc2VUZXh0KT0+e1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgZGlkbid0IHJlc3BvbmQgd2l0aCBqc29uXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogSFRUUCByZXNwb25zZSBzdGF0dXMgaXMgbm90IGluIDIwMHMuIFVzdWFsbHkgdGhpcyB3aWxsIG1lYW5cbiAgICAgICAqIGVpdGhlciBIVFRQIDQwMHMgKGJhZCByZXF1ZXN0IGZyb20gYnJvd3Nlcikgb3IgSFRUUCA1MDBzIChzZXJ2ZXIgZXJyb3IpXG4gICAgICAgKiBPdXIgZ29hbCBpcyB0byBjb21lIHVwIHdpdGggYmVzdCBwb3NzaWJsZSBzdGFja3RyYWNlIGFuZCBlcnJvciBtZXNzYWdlXG4gICAgICAgKiB0byBoZWxwIGRldmVsb3BlcnMgdW5kZXJzdGFuZCB0aGUgcHJvYmxlbSBhbmQgZGVidWdcbiAgICAgICAqLyAvKlxuICAgICAgICogUmVkaXJlY3QgdG8gZ2l2ZW4gdXJsIHdoZW4gcmVkaXJlY3Qgb24gYXV0aCBmYWlsdXJlIGlzIGVuYWJsZWRcbiAgICAgICAqLyBpZiAodXJsID09PSBtYWtlVXJsKHNlc3Npb25FbmRwb2ludCkgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDMgfHwgcmVkaXJlY3RBdXRoRmFpbHVyZS5lbmFibGVkICYmIHJlZGlyZWN0QXV0aEZhaWx1cmUuZXJyb3JzLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgICBjbGVhckhpc3RvcnkoKTtcbiAgICAgICAgICAgICAgICAvLyBieSBkZWZhdWx0LCByZWRpcmVjdCB0byB0aGUgdXJsIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnLlxuICAgICAgICAgICAgICAgIC8vIElmIGJsYW5rLCB1c2UgdGhlIGxvY2F0aW9uIGhlYWRlciBmcm9tIHRoZSByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGF0IGlzIGFsc28gYmxhbmssIHVzZSB0aGUgZGVmYXVsdCByZWRpcmVjdCB1cmwuXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSByZWRpcmVjdEF1dGhGYWlsdXJlLnVybCB8fCByZXNwb25zZS5oZWFkZXJzLmdldCgnbG9jYXRpb24nKSB8fCBkZWZhdWx0UmVkaXJlY3RBdXRoRmFpbHVyZVVybDtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRvOiBsb2NhdGlvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8qIFdlIHNvbWV0aW1lcyBkb24ndCByZWFsbHkgd2FudCB0aGlzIHByb21pc2UgdG8gcmVzb2x2ZSBzaW5jZSB0aGVyZSdzIG5vIHJlc3BvbnNlIGRhdGEsXG4gICAgICAgICAqIG5vciBkbyB3ZSB3YW50IGl0IHRvIHJlamVjdCBiZWNhdXNlIHRoYXQgd291bGQgdHJpZ2dlciBlcnJvciBoYW5kbGluZy4gV2UgaW5zdGVhZFxuICAgICAgICAgKiB3YW50IGl0IHRvIHJlbWFpbiBpbiBwZW5kaW5nIHN0YXR1cyB3aGlsZSB0aGUgbmF2aWdhdGlvbiBvY2N1cnMuXG4gICAgICAgICAqLyByZXR1cm4gcmVkaXJlY3RBdXRoRmFpbHVyZS5yZXNvbHZlUHJvbWlzZSA/IFByb21pc2UucmVzb2x2ZSgpIDogbmV3IFByb21pc2UoKCk9Pnt9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBkb3dubG9hZCBhIHJlc3BvbnNlIGJvZHksIGlmIGl0IGhhcyBvbmVcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuY2xvbmUoKS50ZXh0KCkudGhlbigocmVzcG9uc2VUZXh0KT0+e1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VCb2R5ID0gcmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5ID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGRpZG4ndCByZXNwb25kIHdpdGgganNvbiwgc28ganVzdCBnbyB3aXRoIHRoZSByZXNwb25zZSB0ZXh0IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgdGhlIGZldGNoIHByb21pc2UgZ28gaW50byBcInJlamVjdGVkXCIgc3RhdHVzLCB3aXRoIHRoZSBiZXN0XG4gICAgICAgICAgICAgICAqIHBvc3NpYmxlIHN0YWNrdHJhY2UgYW5kIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAqLyB0aHJvdyBuZXcgT3Blbm1yc0ZldGNoRXJyb3IodXJsLCByZXNwb25zZSwgcmVzcG9uc2VCb2R5LCByZXF1ZXN0U3RhY2t0cmFjZSk7XG4gICAgICAgICAgICAgICAgfSwgKGVycik9PntcbiAgICAgICAgICAgICAgICAgICAgLyogV2Ugd2VyZW4ndCBhYmxlIHRvIGRvd25sb2FkIGEgcmVzcG9uc2UgYm9keSBmb3IgdGhpcyBlcnJvci5cbiAgICAgICAgICAgICAgICogVGltZSB0byBqdXN0IGdpdmUgdGhlIGJlc3QgcG9zc2libGUgc3RhY2t0cmFjZSBhbmQgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICovIHRocm93IG5ldyBPcGVubXJzRmV0Y2hFcnJvcih1cmwsIHJlc3BvbnNlLCBudWxsLCByZXF1ZXN0U3RhY2t0cmFjZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogVGhlIG9wZW5tcnNPYnNlcnZhYmxlRmV0Y2ggZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCBvcGVubXJzRmV0Y2hcbiAqIHRoYXQgcmV0dXJucyBhbiBbT2JzZXJ2YWJsZV0oaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vZ3VpZGUvb2JzZXJ2YWJsZSlcbiAqIGluc3RlYWQgb2YgYSBwcm9taXNlLiBJdCBleGlzdHMgaW4gY2FzZSB1c2luZyBhbiBPYnNlcnZhYmxlIGlzXG4gKiBwcmVmZXJyZWQgb3IgbW9yZSBjb252ZW5pZW50IHRoYW4gYSBwcm9taXNlLlxuICpcbiAqIEBwYXJhbSB1cmwgU2VlIFtbb3Blbm1yc0ZldGNoXV1cbiAqIEBwYXJhbSBmZXRjaEluaXQgU2VlIFtbb3Blbm1yc0ZldGNoXV1cbiAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBwcm9kdWNlcyBleGFjdGx5IG9uZSBSZXNwb25zZSBvYmplY3QuXG4gKiBUaGUgcmVzcG9uc2Ugb2JqZWN0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yIFtbb3Blbm1yc0ZldGNoXV0uXG4gKlxuICogIyMjIyBFeGFtcGxlXG4gKlxuICogYGBganNcbiAqIGltcG9ydCB7IG9wZW5tcnNPYnNlcnZhYmxlRmV0Y2ggfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJ1xuICogY29uc3Qgc3Vic2NyaXB0aW9uID0gb3Blbm1yc09ic2VydmFibGVGZXRjaChgJHtyZXN0QmFzZVVybH0vc2Vzc2lvbicpLnN1YnNjcmliZShcbiAqICAgcmVzcG9uc2UgPT4gY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YSksXG4gKiAgIGVyciA9PiB7dGhyb3cgZXJyfSxcbiAqICAgKCkgPT4gY29uc29sZS5sb2coJ2ZpbmlzaGVkJylcbiAqIClcbiAqIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gKiBgYGBcbiAqXG4gKiAjIyMjIENhbmNlbGxhdGlvblxuICpcbiAqIFRvIGNhbmNlbCB0aGUgbmV0d29yayByZXF1ZXN0LCBzaW1wbHkgY2FsbCBgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7YFxuICpcbiAqIEBjYXRlZ29yeSBBUElcbiAqLyBleHBvcnQgZnVuY3Rpb24gb3Blbm1yc09ic2VydmFibGVGZXRjaCh1cmwsIGZldGNoSW5pdCA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBmZXRjaEluaXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIG9wZW5tcnNPYnNlcnZhYmxlRmV0Y2ggbXVzdCBiZSBlaXRoZXIgb21pdHRlZCBvciBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGZldGNoSW5pdC5zaWduYWwgPSBhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpPT57XG4gICAgICAgIGxldCBoYXNSZXNwb25zZSA9IGZhbHNlO1xuICAgICAgICBvcGVubXJzRmV0Y2godXJsLCBmZXRjaEluaXQpLnRoZW4oKHJlc3BvbnNlKT0+e1xuICAgICAgICAgICAgaGFzUmVzcG9uc2UgPSB0cnVlO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwb25zZSk7XG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9LCAoZXJyKT0+e1xuICAgICAgICAgICAgaGFzUmVzcG9uc2UgPSB0cnVlO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgaWYgKCFoYXNSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0IGNsYXNzIE9wZW5tcnNGZXRjaEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHVybCwgcmVzcG9uc2UsIHJlc3BvbnNlQm9keSwgcmVxdWVzdFN0YWNrdHJhY2Upe1xuICAgICAgICBzdXBlcigpLCBfZGVmaW5lX3Byb3BlcnR5KHRoaXMsIFwicmVzcG9uc2VcIiwgdm9pZCAwKSwgX2RlZmluZV9wcm9wZXJ0eSh0aGlzLCBcInJlc3BvbnNlQm9keVwiLCB2b2lkIDApO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBgU2VydmVyIHJlc3BvbmRlZCB3aXRoICR7cmVzcG9uc2Uuc3RhdHVzfSAoJHtyZXNwb25zZS5zdGF0dXNUZXh0fSkgZm9yIHVybCAke3VybH0uIENoZWNrIGVyci5yZXNwb25zZUJvZHkgb3IgbmV0d29yayB0YWIgaW4gZGV2IHRvb2xzIGZvciBtb3JlIGluZm9gO1xuICAgICAgICByZXF1ZXN0U3RhY2t0cmFjZS5tZXNzYWdlID0gdGhpcy5tZXNzYWdlO1xuICAgICAgICB0aGlzLnJlc3BvbnNlQm9keSA9IHJlc3BvbnNlQm9keTtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnN0YWNrID0gYFN0YWNrdHJhY2UgZm9yIG91dGdvaW5nIHJlcXVlc3Q6XFxuJHtyZXF1ZXN0U3RhY2t0cmFjZS5zdGFja31cXG5TdGFja3RyYWNlIGZvciBpbmNvbWluZyByZXNwb25zZTpcXG4ke3RoaXMuc3RhY2t9YDtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiX2RlZmluZV9wcm9wZXJ0eSIsIm9iaiIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYnNlcnZhYmxlIiwiaXNQbGFpbk9iamVjdCIsImdldENvbmZpZyIsImNsZWFySGlzdG9yeSIsIm5hdmlnYXRlIiwiZGVmYXVsdFJlZGlyZWN0QXV0aEZhaWx1cmVVcmwiLCJyZXN0QmFzZVVybCIsImZoaXJCYXNlVXJsIiwic2Vzc2lvbkVuZHBvaW50IiwibWFrZVVybCIsInBhdGgiLCJzdGFydHNXaXRoIiwid2luZG93Iiwib3Blbm1yc0Jhc2UiLCJvcGVubXJzRmV0Y2giLCJmZXRjaEluaXQiLCJFcnJvciIsInVybCIsImhlYWRlcnMiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIkFjY2VwdCIsInVybFVybCIsIlVSTCIsImxvY2F0aW9uIiwidG9TdHJpbmciLCJzZWFyY2hQYXJhbXMiLCJoYXMiLCJzZXQiLCJyZXF1ZXN0U3RhY2t0cmFjZSIsImZldGNoIiwidGhlbiIsInIiLCJyZXNwb25zZSIsInJlZGlyZWN0QXV0aEZhaWx1cmUiLCJmb2xsb3dSZWRpcmVjdHMiLCJvayIsInN0YXR1cyIsImdldCIsInRvIiwiZGF0YSIsImNsb25lIiwidGV4dCIsInJlc3BvbnNlVGV4dCIsInBhcnNlIiwiZXJyIiwiZW5hYmxlZCIsImVycm9ycyIsImluY2x1ZGVzIiwicmVzb2x2ZVByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlc3BvbnNlQm9keSIsIk9wZW5tcnNGZXRjaEVycm9yIiwib3Blbm1yc09ic2VydmFibGVGZXRjaCIsImFib3J0Q29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsInNpZ25hbCIsIm9ic2VydmVyIiwiaGFzUmVzcG9uc2UiLCJuZXh0IiwiY29tcGxldGUiLCJlcnJvciIsImFib3J0IiwibWVzc2FnZSIsInN0YXR1c1RleHQiLCJzdGFjayJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-api/dist/openmrs-fetch.js\n");
68
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OpenmrsFetchError: () => (/* binding */ OpenmrsFetchError),\n/* harmony export */ fhirBaseUrl: () => (/* binding */ fhirBaseUrl),\n/* harmony export */ makeUrl: () => (/* binding */ makeUrl),\n/* harmony export */ openmrsFetch: () => (/* binding */ openmrsFetch),\n/* harmony export */ openmrsObservableFetch: () => (/* binding */ openmrsObservableFetch),\n/* harmony export */ restBaseUrl: () => (/* binding */ restBaseUrl),\n/* harmony export */ sessionEndpoint: () => (/* binding */ sessionEndpoint)\n/* harmony export */ });\n/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rxjs */ \"webpack/sharing/consume/default/rxjs/rxjs\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isPlainObject.js\");\n/* harmony import */ var _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-config */ \"../../framework/esm-config/dist/index.js\");\n/* harmony import */ var _openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-navigation */ \"../../framework/esm-navigation/dist/index.js\");\n/* harmony import */ var _config_schema_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./config-schema.js */ \"../../framework/esm-api/dist/config-schema.js\");\n/** @module @category API */ function _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\n\n\n\n\n\n/** The base URL for the OpenMRS REST API (e.g., '/ws/rest/v1'). */ const restBaseUrl = '/ws/rest/v1';\n/** The base URL for the OpenMRS FHIR R4 API (e.g., '/ws/fhir2/R4'). */ const fhirBaseUrl = '/ws/fhir2/R4';\n/** The endpoint for session management operations. */ const sessionEndpoint = `${restBaseUrl}/session`;\n/**\n * Append `path` to the OpenMRS SPA base.\n *\n * @param path The path to append to the OpenMRS base URL.\n * @returns The full URL with the OpenMRS base prepended. If the path is already\n * an absolute URL (starting with 'http'), it is returned unchanged.\n *\n * @example\n *\n * ```ts\n * makeUrl('/foo/bar');\n * // => '/openmrs/foo/bar'\n * ```\n */ function makeUrl(path) {\n if (path && path.startsWith('http')) {\n return path;\n } else if (path[0] !== '/') {\n // ensure path starts with /\n path = '/' + path;\n }\n return window.openmrsBase + path;\n}\n/**\n * The openmrsFetch function is a wrapper around the\n * [browser's built-in fetch function](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch),\n * with extra handling for OpenMRS-specific API behaviors, such as\n * request headers, authentication, authorization, and the API urls.\n *\n * @param path A string url to make the request to. Note that the\n * openmrs base url (by default `/openmrs`) will be automatically\n * prepended to the URL, so there is no need to include it.\n * @param fetchInit A [fetch init object](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Syntax).\n * Note that the `body` property does not need to be `JSON.stringify()`ed\n * because openmrsFetch will do that for you.\n * @returns A [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)\n * that resolves with a [Response object](https://developer.mozilla.org/en-US/docs/Web/API/Response).\n * Note that the openmrs version of the Response object has already\n * downloaded the HTTP response body as json, and has an additional\n * `data` property with the HTTP response json as a javascript object.\n *\n * @example\n * ```js\n * import { openmrsFetch } from '@openmrs/esm-api'\n * const abortController = new AbortController();\n * openmrsFetch(`${restBaseUrl}/session', {signal: abortController.signal})\n * .then(response => {\n * console.log(response.data.authenticated)\n * })\n * .catch(err => {\n * console.error(err.status);\n * })\n * abortController.abort();\n * openmrsFetch(`${restBaseUrl}/session', {\n * method: 'POST',\n * body: {\n * username: 'hi',\n * password: 'there',\n * }\n * })\n * ```\n *\n * #### Cancellation\n *\n * To cancel a network request, use an\n * [AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort).\n * It is best practice to cancel your network requests when the user\n * navigates away from a page while the request is pending request, to\n * free up memory and network resources and to prevent race conditions.\n *\n * @category API\n */ function openmrsFetch(path, fetchInit = {}) {\n if (typeof path !== 'string') {\n throw Error(\"The first argument to @openmrs/api's openmrsFetch function must be a url string\");\n }\n if (typeof fetchInit !== 'object') {\n throw Error(\"The second argument to @openmrs/api's openmrsFetch function must be a plain object.\");\n }\n if (!window.openmrsBase) {\n throw Error(\"@openmrs/api is running in a browser that doesn't have window.openmrsBase, which is provided by openmrs-module-spa's HTML file.\");\n }\n // Prefix the url with the openmrs spa base\n let url = makeUrl(path);\n // We're going to need some headers\n if (!fetchInit.headers) {\n fetchInit.headers = {};\n }\n /* Automatically stringify javascript objects being sent in the\n * request body.\n */ if ((0,lodash_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(fetchInit.body)) {\n fetchInit.body = JSON.stringify(fetchInit.body);\n }\n /* Add a request header to tell the server to respond with json,\n * since frontend code almost always wants json and the OpenMRS\n * server won't give you json unless you explicitly ask for it.\n * If a different Accept header is preferred, pass it into the fetchInit.\n * If no Accept header is desired, pass it in explicitly as null.\n */ if (typeof fetchInit.headers.Accept === 'undefined') {\n fetchInit.headers.Accept = 'application/json';\n }\n if (fetchInit.headers.Accept === null) {\n delete fetchInit.headers.Accept;\n }\n /* This tells the OpenMRS REST API not to return a WWW-Authenticate\n * header. Returning that header is useful when using the API, but\n * not from a UI.\n */ if (path.startsWith(restBaseUrl) && typeof fetchInit.headers['Disable-WWW-Authenticate'] === 'undefined') {\n fetchInit.headers['Disable-WWW-Authenticate'] = 'true';\n }\n if (path.startsWith(fhirBaseUrl)) {\n const urlUrl = new URL(url, window.location.toString());\n if (!urlUrl.searchParams.has('_summary')) {\n urlUrl.searchParams.set('_summary', 'data');\n url = urlUrl.toString();\n }\n }\n /* We capture the stacktrace before making the request, so that if an error occurs we can\n * log a full stacktrace that includes the code that made the request and handled the response\n * Otherwise, we could run into situations where the stacktrace doesn't even show which code\n * called @openmrs/api.\n */ const requestStacktrace = Error();\n return window.fetch(url, fetchInit).then(async (r)=>{\n const response = r;\n const { redirectAuthFailure, followRedirects } = await (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getConfig)('@openmrs/esm-api');\n if (response.ok) {\n if (response.status === 204) {\n if (followRedirects && response.headers.has('location')) {\n const location = response.headers.get('location');\n if (location) {\n (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_2__.navigate)({\n to: location\n });\n }\n }\n /* HTTP 204 - No Content\n * We should not try to download the empty response as json. Instead,\n * we return null since there is no response body.\n */ response.data = null;\n return response;\n } else {\n // HTTP 200s - The request succeeded\n return response.clone().text().then((responseText)=>{\n try {\n if (responseText) {\n response.data = JSON.parse(responseText);\n }\n } catch (err) {\n // Server didn't respond with json\n }\n return response;\n });\n }\n } else {\n /* HTTP response status is not in 200s. Usually this will mean\n * either HTTP 400s (bad request from browser) or HTTP 500s (server error)\n * Our goal is to come up with best possible stacktrace and error message\n * to help developers understand the problem and debug\n */ /*\n * Redirect to given url when redirect on auth failure is enabled\n */ if (url === makeUrl(sessionEndpoint) && response.status === 403 || redirectAuthFailure.enabled && redirectAuthFailure.errors.includes(response.status)) {\n (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_2__.clearHistory)();\n // by default, redirect to the url specified in the config.\n // If blank, use the location header from the response.\n // If that is also blank, use the default redirect url.\n const location = redirectAuthFailure.url || response.headers.get('location') || _config_schema_js__WEBPACK_IMPORTED_MODULE_3__.defaultRedirectAuthFailureUrl;\n (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_2__.navigate)({\n to: location\n });\n /* We sometimes don't really want this promise to resolve since there's no response data,\n * nor do we want it to reject because that would trigger error handling. We instead\n * want it to remain in pending status while the navigation occurs.\n */ return redirectAuthFailure.resolvePromise ? Promise.resolve() : new Promise(()=>{});\n } else {\n // Attempt to download a response body, if it has one\n return response.clone().text().then((responseText)=>{\n let responseBody = responseText;\n try {\n responseBody = JSON.parse(responseText);\n } catch (err) {\n // Server didn't respond with json, so just go with the response text string\n }\n /* Make the fetch promise go into \"rejected\" status, with the best\n * possible stacktrace and error message.\n */ throw new OpenmrsFetchError(url, response, responseBody, requestStacktrace);\n }, (err)=>{\n /* We weren't able to download a response body for this error.\n * Time to just give the best possible stacktrace and error message.\n */ throw new OpenmrsFetchError(url, response, null, requestStacktrace);\n });\n }\n }\n });\n}\n/**\n * The openmrsObservableFetch function is a wrapper around openmrsFetch\n * that returns an [Observable](https://rxjs-dev.firebaseapp.com/guide/observable)\n * instead of a promise. It exists in case using an Observable is\n * preferred or more convenient than a promise.\n *\n * @param url See [[openmrsFetch]]\n * @param fetchInit See [[openmrsFetch]]\n * @returns An Observable that produces exactly one Response object.\n * The response object is exactly the same as for [[openmrsFetch]].\n *\n * @example\n *\n * ```js\n * import { openmrsObservableFetch } from '@openmrs/esm-api'\n * const subscription = openmrsObservableFetch(`${restBaseUrl}/session').subscribe(\n * response => console.log(response.data),\n * err => {throw err},\n * () => console.log('finished')\n * )\n * subscription.unsubscribe()\n * ```\n *\n * #### Cancellation\n *\n * To cancel the network request, simply call `subscription.unsubscribe();`\n *\n * @category API\n */ function openmrsObservableFetch(url, fetchInit = {}) {\n if (typeof fetchInit !== 'object') {\n throw Error('The second argument to openmrsObservableFetch must be either omitted or an object');\n }\n const abortController = new AbortController();\n fetchInit.signal = abortController.signal;\n return new rxjs__WEBPACK_IMPORTED_MODULE_0__.Observable((observer)=>{\n let hasResponse = false;\n openmrsFetch(url, fetchInit).then((response)=>{\n hasResponse = true;\n observer.next(response);\n observer.complete();\n }, (err)=>{\n hasResponse = true;\n observer.error(err);\n });\n return ()=>{\n if (!hasResponse) {\n abortController.abort();\n }\n };\n });\n}\nclass OpenmrsFetchError extends Error {\n constructor(url, response, responseBody, requestStacktrace){\n super(), _define_property(this, \"response\", void 0), _define_property(this, \"responseBody\", void 0);\n this.message = `Server responded with ${response.status} (${response.statusText}) for url ${url}. Check err.responseBody or network tab in dev tools for more info`;\n requestStacktrace.message = this.message;\n this.responseBody = responseBody;\n this.response = response;\n this.stack = `Stacktrace for outgoing request:\\n${requestStacktrace.stack}\\nStacktrace for incoming response:\\n${this.stack}`;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9vcGVubXJzLWZldGNoLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBCQUEwQixHQUFHLFNBQVNBLGlCQUFpQkMsR0FBRyxFQUFFQyxHQUFHLEVBQUVDLEtBQUs7SUFDbEUsSUFBSUQsT0FBT0QsS0FBSztRQUNaRyxPQUFPQyxjQUFjLENBQUNKLEtBQUtDLEtBQUs7WUFDNUJDLE9BQU9BO1lBQ1BHLFlBQVk7WUFDWkMsY0FBYztZQUNkQyxVQUFVO1FBQ2Q7SUFDSixPQUFPO1FBQ0hQLEdBQUcsQ0FBQ0MsSUFBSSxHQUFHQztJQUNmO0lBQ0EsT0FBT0Y7QUFDWDtBQUNrQztBQUNRO0FBQ007QUFDaUI7QUFDRTtBQUNuRSxpRUFBaUUsR0FBVSxNQUFNYyxjQUFjLGNBQWM7QUFDN0cscUVBQXFFLEdBQVUsTUFBTUMsY0FBYyxlQUFlO0FBQ2xILG9EQUFvRCxHQUFVLE1BQU1DLGtCQUFrQixHQUFHRixZQUFZLFFBQVEsQ0FBQyxDQUFDO0FBQy9HOzs7Ozs7Ozs7Ozs7O0NBYUMsR0FBVSxTQUFTRyxRQUFRQyxJQUFJO0lBQzVCLElBQUlBLFFBQVFBLEtBQUtDLFVBQVUsQ0FBQyxTQUFTO1FBQ2pDLE9BQU9EO0lBQ1gsT0FBTyxJQUFJQSxJQUFJLENBQUMsRUFBRSxLQUFLLEtBQUs7UUFDeEIsNEJBQTRCO1FBQzVCQSxPQUFPLE1BQU1BO0lBQ2pCO0lBQ0EsT0FBT0UsT0FBT0MsV0FBVyxHQUFHSDtBQUNoQztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnREMsR0FBVSxTQUFTSSxhQUFhSixJQUFJLEVBQUVLLFlBQVksQ0FBQyxDQUFDO0lBQ2pELElBQUksT0FBT0wsU0FBUyxVQUFVO1FBQzFCLE1BQU1NLE1BQU07SUFDaEI7SUFDQSxJQUFJLE9BQU9ELGNBQWMsVUFBVTtRQUMvQixNQUFNQyxNQUFNO0lBQ2hCO0lBQ0EsSUFBSSxDQUFDSixPQUFP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QUNKO0FBQ08sTUFBTVYsMEJBQTBCdEM7SUFDbkMsWUFBWUMsR0FBRyxFQUFFaUIsUUFBUSxFQUFFbUIsWUFBWSxFQUFFdkIsaUJBQWlCLENBQUM7UUFDdkQsS0FBSyxJQUFJdkMsaUJBQWlCLElBQUksRUFBRSxZQUFZLEtBQUssSUFBSUEsaUJBQWlCLElBQUksRUFBRSxnQkFBZ0IsS0FBSztRQUNqRyxJQUFJLENBQUMwRSxPQUFPLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRS9CLFNBQVNJLE1BQU0sQ0FBQyxFQUFFLEVBQUVKLFNBQVNnQyxVQUFVLENBQUMsVUFBVSxFQUFFakQsSUFBSSxrRUFBa0UsQ0FBQztRQUNuS2Esa0JBQWtCbUMsT0FBTyxHQUFHLElBQUksQ0FBQ0EsT0FBTztRQUN4QyxJQUFJLENBQUNaLFlBQVksR0FBR0E7UUFDcEIsSUFBSSxDQUFDbkIsUUFBUSxHQUFHQTtRQUNoQixJQUFJLENBQUNpQyxLQUFLLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRXJDLGtCQUFrQnFDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRSxJQUFJLENBQUNBLEtBQUssRUFBRTtJQUNqSTtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWFwaS9kaXN0L29wZW5tcnMtZmV0Y2guanM/ZmUxOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGZ1bmN0aW9uIF9kZWZpbmVfcHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gXCJAb3Blbm1ycy9lc20tY29uZmlnXCI7XG5pbXBvcnQgeyBjbGVhckhpc3RvcnksIG5hdmlnYXRlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBkZWZhdWx0UmVkaXJlY3RBdXRoRmFpbHVyZVVybCB9IGZyb20gXCIuL2NvbmZpZy1zY2hlbWEuanNcIjtcbi8qKiBUaGUgYmFzZSBVUkwgZm9yIHRoZSBPcGVuTVJTIFJFU1QgQVBJIChlLmcuLCAnL3dzL3Jlc3QvdjEnKS4gKi8gZXhwb3J0IGNvbnN0IHJlc3RCYXNlVXJsID0gJy93cy9yZXN0L3YxJztcbi8qKiBUaGUgYmFzZSBVUkwgZm9yIHRoZSBPcGVuTVJTIEZISVIgUjQgQVBJIChlLmcuLCAnL3dzL2ZoaXIyL1I0JykuICovIGV4cG9ydCBjb25zdCBmaGlyQmFzZVVybCA9ICcvd3MvZmhpcjIvUjQnO1xuLyoqIFRoZSBlbmRwb2ludCBmb3Igc2Vzc2lvbiBtYW5hZ2VtZW50IG9wZXJhdGlvbnMuICovIGV4cG9ydCBjb25zdCBzZXNzaW9uRW5kcG9pbnQgPSBgJHtyZXN0QmFzZVVybH0vc2Vzc2lvbmA7XG4vKipcbiAqIEFwcGVuZCBgcGF0aGAgdG8gdGhlIE9wZW5NUlMgU1BBIGJhc2UuXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gYXBwZW5kIHRvIHRoZSBPcGVuTVJTIGJhc2UgVVJMLlxuICogQHJldHVybnMgVGhlIGZ1bGwgVVJMIHdpdGggdGhlIE9wZW5NUlMgYmFzZSBwcmVwZW5kZWQuIElmIHRoZSBwYXRoIGlzIGFscmVhZHlcbiAqICAgYW4gYWJzb2x1dGUgVVJMIChzdGFydGluZyB3aXRoICdodHRwJyksIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBtYWtlVXJsKCcvZm9vL2JhcicpO1xuICogLy8gPT4gJy9vcGVubXJzL2Zvby9iYXInXG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gbWFrZVVybChwYXRoKSB7XG4gICAgaWYgKHBhdGggJiYgcGF0aC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSBlbHNlIGlmIChwYXRoWzBdICE9PSAnLycpIHtcbiAgICAgICAgLy8gZW5zdXJlIHBhdGggc3RhcnRzIHdpdGggL1xuICAgICAgICBwYXRoID0gJy8nICsgcGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHdpbmRvdy5vcGVubXJzQmFzZSArIHBhdGg7XG59XG4vKipcbiAqIFRoZSBvcGVubXJzRmV0Y2ggZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGVcbiAqIFticm93c2VyJ3MgYnVpbHQtaW4gZmV0Y2ggZnVuY3Rpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkvVXNpbmdfRmV0Y2gpLFxuICogd2l0aCBleHRyYSBoYW5kbGluZyBmb3IgT3Blbk1SUy1zcGVjaWZpYyBBUEkgYmVoYXZpb3JzLCBzdWNoIGFzXG4gKiByZXF1ZXN0IGhlYWRlcnMsIGF1dGhlbnRpY2F0aW9uLCBhdXRob3JpemF0aW9uLCBhbmQgdGhlIEFQSSB1cmxzLlxuICpcbiAqIEBwYXJhbSBwYXRoIEEgc3RyaW5nIHVybCB0byBtYWtlIHRoZSByZXF1ZXN0IHRvLiBOb3RlIHRoYXQgdGhlXG4gKiAgIG9wZW5tcnMgYmFzZSB1cmwgKGJ5IGRlZmF1bHQgYC9vcGVubXJzYCkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gKiAgIHByZXBlbmRlZCB0byB0aGUgVVJMLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGluY2x1ZGUgaXQuXG4gKiBAcGFyYW0gZmV0Y2hJbml0IEEgW2ZldGNoIGluaXQgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93T3JXb3JrZXJHbG9iYWxTY29wZS9mZXRjaCNTeW50YXgpLlxuICogICBOb3RlIHRoYXQgdGhlIGBib2R5YCBwcm9wZXJ0eSBkb2VzIG5vdCBuZWVkIHRvIGJlIGBKU09OLnN0cmluZ2lmeSgpYGVkXG4gKiAgIGJlY2F1c2Ugb3Blbm1yc0ZldGNoIHdpbGwgZG8gdGhhdCBmb3IgeW91LlxuICogQHJldHVybnMgQSBbUHJvbWlzZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZSlcbiAqICAgdGhhdCByZXNvbHZlcyB3aXRoIGEgW1Jlc3BvbnNlIG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Jlc3BvbnNlKS5cbiAqICAgTm90ZSB0aGF0IHRoZSBvcGVubXJzIHZlcnNpb24gb2YgdGhlIFJlc3BvbnNlIG9iamVjdCBoYXMgYWxyZWFkeVxuICogICBkb3dubG9hZGVkIHRoZSBIVFRQIHJlc3BvbnNlIGJvZHkgYXMganNvbiwgYW5kIGhhcyBhbiBhZGRpdGlvbmFsXG4gKiAgIGBkYXRhYCBwcm9wZXJ0eSB3aXRoIHRoZSBIVFRQIHJlc3BvbnNlIGpzb24gYXMgYSBqYXZhc2NyaXB0IG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGltcG9ydCB7IG9wZW5tcnNGZXRjaCB9IGZyb20gJ0BvcGVubXJzL2VzbS1hcGknXG4gKiBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKiBvcGVubXJzRmV0Y2goYCR7cmVzdEJhc2VVcmx9L3Nlc3Npb24nLCB7c2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsfSlcbiAqICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLmRhdGEuYXV0aGVudGljYXRlZClcbiAqICAgfSlcbiAqICAgLmNhdGNoKGVyciA9PiB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhdHVzKTtcbiAqICAgfSlcbiAqIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICogb3Blbm1yc0ZldGNoKGAke3Jlc3RCYXNlVXJsfS9zZXNzaW9uJywge1xuICogICBtZXRob2Q6ICdQT1NUJyxcbiAqICAgYm9keToge1xuICogICAgIHVzZXJuYW1lOiAnaGknLFxuICogICAgIHBhc3N3b3JkOiAndGhlcmUnLFxuICogICB9XG4gKiB9KVxuICogYGBgXG4gKlxuICogIyMjIyBDYW5jZWxsYXRpb25cbiAqXG4gKiBUbyBjYW5jZWwgYSBuZXR3b3JrIHJlcXVlc3QsIHVzZSBhblxuICogW0Fib3J0Q29udHJvbGxlcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlci9hYm9ydCkuXG4gKiBJdCBpcyBiZXN0IHByYWN0aWNlIHRvIGNhbmNlbCB5b3VyIG5ldHdvcmsgcmVxdWVzdHMgd2hlbiB0aGUgdXNlclxuICogbmF2aWdhdGVzIGF3YXkgZnJvbSBhIHBhZ2Ugd2hpbGUgdGhlIHJlcXVlc3QgaXMgcGVuZGluZyByZXF1ZXN0LCB0b1xuICogZnJlZSB1cCBtZW1vcnkgYW5kIG5ldHdvcmsgcmVzb3VyY2VzIGFuZCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucy5cbiAqXG4gKiBAY2F0ZWdvcnkgQVBJXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIG9wZW5tcnNGZXRjaChwYXRoLCBmZXRjaEluaXQgPSB7fSkge1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgdG8gQG9wZW5tcnMvYXBpJ3Mgb3Blbm1yc0ZldGNoIGZ1bmN0aW9uIG11c3QgYmUgYSB1cmwgc3RyaW5nXCIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZldGNoSW5pdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIEBvcGVubXJzL2FwaSdzIG9wZW5tcnNGZXRjaCBmdW5jdGlvbiBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LlwiKTtcbiAgICB9XG4gICAgaWYgKCF3aW5kb3cub3Blbm1yc0Jhc2UpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJAb3Blbm1ycy9hcGkgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIgdGhhdCBkb2Vzbid0IGhhdmUgd2luZG93Lm9wZW5tcnNCYXNlLCB3aGljaCBpcyBwcm92aWRlZCBieSBvcGVubXJzLW1vZHVsZS1zcGEncyBIVE1MIGZpbGUuXCIpO1xuICAgIH1cbiAgICAvLyBQcmVmaXggdGhlIHVybCB3aXRoIHRoZSBvcGVubXJzIHNwYSBiYXNlXG4gICAgbGV0IHVybCA9IG1ha2VVcmwocGF0aCk7XG4gICAgLy8gV2UncmUgZ29pbmcgdG8gbmVlZCBzb21lIGhlYWRlcnNcbiAgICBpZiAoIWZldGNoSW5pdC5oZWFkZXJzKSB7XG4gICAgICAgIGZldGNoSW5pdC5oZWFkZXJzID0ge307XG4gICAgfVxuICAgIC8qIEF1dG9tYXRpY2FsbHkgc3RyaW5naWZ5IGphdmFzY3JpcHQgb2JqZWN0cyBiZWluZyBzZW50IGluIHRoZVxuICAgKiByZXF1ZXN0IGJvZHkuXG4gICAqLyBpZiAoaXNQbGFpbk9iamVjdChmZXRjaEluaXQuYm9keSkpIHtcbiAgICAgICAgZmV0Y2hJbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShmZXRjaEluaXQuYm9keSk7XG4gICAgfVxuICAgIC8qIEFkZCBhIHJlcXVlc3QgaGVhZGVyIHRvIHRlbGwgdGhlIHNlcnZlciB0byByZXNwb25kIHdpdGgganNvbixcbiAgICogc2luY2UgZnJvbnRlbmQgY29kZSBhbG1vc3QgYWx3YXlzIHdhbnRzIGpzb24gYW5kIHRoZSBPcGVuTVJTXG4gICAqIHNlcnZlciB3b24ndCBnaXZlIHlvdSBqc29uIHVubGVzcyB5b3UgZXhwbGljaXRseSBhc2sgZm9yIGl0LlxuICAgKiBJZiBhIGRpZmZlcmVudCBBY2NlcHQgaGVhZGVyIGlzIHByZWZlcnJlZCwgcGFzcyBpdCBpbnRvIHRoZSBmZXRjaEluaXQuXG4gICAqIElmIG5vIEFjY2VwdCBoZWFkZXIgaXMgZGVzaXJlZCwgcGFzcyBpdCBpbiBleHBsaWNpdGx5IGFzIG51bGwuXG4gICAqLyBpZiAodHlwZW9mIGZldGNoSW5pdC5oZWFkZXJzLkFjY2VwdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZmV0Y2hJbml0LmhlYWRlcnMuQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgIH1cbiAgICBpZiAoZmV0Y2hJbml0LmhlYWRlcnMuQWNjZXB0ID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBmZXRjaEluaXQuaGVhZGVycy5BY2NlcHQ7XG4gICAgfVxuICAgIC8qIFRoaXMgdGVsbHMgdGhlIE9wZW5NUlMgUkVTVCBBUEkgbm90IHRvIHJldHVybiBhIFdXVy1BdXRoZW50aWNhdGVcbiAgICogaGVhZGVyLiBSZXR1cm5pbmcgdGhhdCBoZWFkZXIgaXMgdXNlZnVsIHdoZW4gdXNpbmcgdGhlIEFQSSwgYnV0XG4gICAqIG5vdCBmcm9tIGEgVUkuXG4gICAqLyBpZiAocGF0aC5zdGFydHNXaXRoKHJlc3RCYXNlVXJsKSAmJiB0eXBlb2YgZmV0Y2hJbml0LmhlYWRlcnNbJ0Rpc2FibGUtV1dXLUF1dGhlbnRpY2F0ZSddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmZXRjaEluaXQuaGVhZGVyc1snRGlzYWJsZS1XV1ctQXV0aGVudGljYXRlJ10gPSAndHJ1ZSc7XG4gICAgfVxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoZmhpckJhc2VVcmwpKSB7XG4gICAgICAgIGNvbnN0IHVybFVybCA9IG5ldyBVUkwodXJsLCB3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICghdXJsVXJsLnNlYXJjaFBhcmFtcy5oYXMoJ19zdW1tYXJ5JykpIHtcbiAgICAgICAgICAgIHVybFVybC5zZWFyY2hQYXJhbXMuc2V0KCdfc3VtbWFyeScsICdkYXRhJyk7XG4gICAgICAgICAgICB1cmwgPSB1cmxVcmwudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiBXZSBjYXB0dXJlIHRoZSBzdGFja3RyYWNlIGJlZm9yZSBtYWtpbmcgdGhlIHJlcXVlc3QsIHNvIHRoYXQgaWYgYW4gZXJyb3Igb2NjdXJzIHdlIGNhblxuICAgKiBsb2cgYSBmdWxsIHN0YWNrdHJhY2UgdGhhdCBpbmNsdWRlcyB0aGUgY29kZSB0aGF0IG1hZGUgdGhlIHJlcXVlc3QgYW5kIGhhbmRsZWQgdGhlIHJlc3BvbnNlXG4gICAqIE90aGVyd2lzZSwgd2UgY291bGQgcnVuIGludG8gc2l0dWF0aW9ucyB3aGVyZSB0aGUgc3RhY2t0cmFjZSBkb2Vzbid0IGV2ZW4gc2hvdyB3aGljaCBjb2RlXG4gICAqIGNhbGxlZCBAb3Blbm1ycy9hcGkuXG4gICAqLyBjb25zdCByZXF1ZXN0U3RhY2t0cmFjZSA9IEVycm9yKCk7XG4gICAgcmV0dXJuIHdpbmRvdy5mZXRjaCh1cmwsIGZldGNoSW5pdCkudGhlbihhc3luYyAocik9PntcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByO1xuICAgICAgICBjb25zdCB7IHJlZGlyZWN0QXV0aEZhaWx1cmUsIGZvbGxvd1JlZGlyZWN0cyB9ID0gYXdhaXQgZ2V0Q29uZmlnKCdAb3Blbm1ycy9lc20tYXBpJyk7XG4gICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvbGxvd1JlZGlyZWN0cyAmJiByZXNwb25zZS5oZWFkZXJzLmhhcygnbG9jYXRpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdsb2NhdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bzogbG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIEhUVFAgMjA0IC0gTm8gQ29udGVudFxuICAgICAgICAgKiBXZSBzaG91bGQgbm90IHRyeSB0byBkb3dubG9hZCB0aGUgZW1wdHkgcmVzcG9uc2UgYXMganNvbi4gSW5zdGVhZCxcbiAgICAgICAgICogd2UgcmV0dXJuIG51bGwgc2luY2UgdGhlcmUgaXMgbm8gcmVzcG9uc2UgYm9keS5cbiAgICAgICAgICovIHJlc3BvbnNlLmRhdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSFRUUCAyMDBzIC0gVGhlIHJlcXVlc3Qgc3VjY2VlZGVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmNsb25lKCkudGV4dCgpLnRoZW4oKHJlc3BvbnNlVGV4dCk9PntcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGRpZG4ndCByZXNwb25kIHdpdGgganNvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGlzIG5vdCBpbiAyMDBzLiBVc3VhbGx5IHRoaXMgd2lsbCBtZWFuXG4gICAgICAgKiBlaXRoZXIgSFRUUCA0MDBzIChiYWQgcmVxdWVzdCBmcm9tIGJyb3dzZXIpIG9yIEhUVFAgNTAwcyAoc2VydmVyIGVycm9yKVxuICAgICAgICogT3VyIGdvYWwgaXMgdG8gY29tZSB1cCB3aXRoIGJlc3QgcG9zc2libGUgc3RhY2t0cmFjZSBhbmQgZXJyb3IgbWVzc2FnZVxuICAgICAgICogdG8gaGVscCBkZXZlbG9wZXJzIHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gYW5kIGRlYnVnXG4gICAgICAgKi8gLypcbiAgICAgICAqIFJlZGlyZWN0IHRvIGdpdmVuIHVybCB3aGVuIHJlZGlyZWN0IG9uIGF1dGggZmFpbHVyZSBpcyBlbmFibGVkXG4gICAgICAgKi8gaWYgKHVybCA9PT0gbWFrZVVybChzZXNzaW9uRW5kcG9pbnQpICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzIHx8IHJlZGlyZWN0QXV0aEZhaWx1cmUuZW5hYmxlZCAmJiByZWRpcmVjdEF1dGhGYWlsdXJlLmVycm9ycy5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJIaXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgcmVkaXJlY3QgdG8gdGhlIHVybCBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZy5cbiAgICAgICAgICAgICAgICAvLyBJZiBibGFuaywgdXNlIHRoZSBsb2NhdGlvbiBoZWFkZXIgZnJvbSB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhhdCBpcyBhbHNvIGJsYW5rLCB1c2UgdGhlIGRlZmF1bHQgcmVkaXJlY3QgdXJsLlxuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcmVkaXJlY3RBdXRoRmFpbHVyZS51cmwgfHwgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2xvY2F0aW9uJykgfHwgZGVmYXVsdFJlZGlyZWN0QXV0aEZhaWx1cmVVcmw7XG4gICAgICAgICAgICAgICAgbmF2aWdhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0bzogbG9jYXRpb25cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvKiBXZSBzb21ldGltZXMgZG9uJ3QgcmVhbGx5IHdhbnQgdGhpcyBwcm9taXNlIHRvIHJlc29sdmUgc2luY2UgdGhlcmUncyBubyByZXNwb25zZSBkYXRhLFxuICAgICAgICAgKiBub3IgZG8gd2Ugd2FudCBpdCB0byByZWplY3QgYmVjYXVzZSB0aGF0IHdvdWxkIHRyaWdnZXIgZXJyb3IgaGFuZGxpbmcuIFdlIGluc3RlYWRcbiAgICAgICAgICogd2FudCBpdCB0byByZW1haW4gaW4gcGVuZGluZyBzdGF0dXMgd2hpbGUgdGhlIG5hdmlnYXRpb24gb2NjdXJzLlxuICAgICAgICAgKi8gcmV0dXJuIHJlZGlyZWN0QXV0aEZhaWx1cmUucmVzb2x2ZVByb21pc2UgPyBQcm9taXNlLnJlc29sdmUoKSA6IG5ldyBQcm9taXNlKCgpPT57fSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZG93bmxvYWQgYSByZXNwb25zZSBib2R5LCBpZiBpdCBoYXMgb25lXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmNsb25lKCkudGV4dCgpLnRoZW4oKHJlc3BvbnNlVGV4dCk9PntcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBkaWRuJ3QgcmVzcG9uZCB3aXRoIGpzb24sIHNvIGp1c3QgZ28gd2l0aCB0aGUgcmVzcG9uc2UgdGV4dCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHRoZSBmZXRjaCBwcm9taXNlIGdvIGludG8gXCJyZWplY3RlZFwiIHN0YXR1cywgd2l0aCB0aGUgYmVzdFxuICAgICAgICAgICAgICAgKiBwb3NzaWJsZSBzdGFja3RyYWNlIGFuZCBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgICAgICAgKi8gdGhyb3cgbmV3IE9wZW5tcnNGZXRjaEVycm9yKHVybCwgcmVzcG9uc2UsIHJlc3BvbnNlQm9keSwgcmVxdWVzdFN0YWNrdHJhY2UpO1xuICAgICAgICAgICAgICAgIH0sIChlcnIpPT57XG4gICAgICAgICAgICAgICAgICAgIC8qIFdlIHdlcmVuJ3QgYWJsZSB0byBkb3dubG9hZCBhIHJlc3BvbnNlIGJvZHkgZm9yIHRoaXMgZXJyb3IuXG4gICAgICAgICAgICAgICAqIFRpbWUgdG8ganVzdCBnaXZlIHRoZSBiZXN0IHBvc3NpYmxlIHN0YWNrdHJhY2UgYW5kIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAqLyB0aHJvdyBuZXcgT3Blbm1yc0ZldGNoRXJyb3IodXJsLCByZXNwb25zZSwgbnVsbCwgcmVxdWVzdFN0YWNrdHJhY2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIFRoZSBvcGVubXJzT2JzZXJ2YWJsZUZldGNoIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgb3Blbm1yc0ZldGNoXG4gKiB0aGF0IHJldHVybnMgYW4gW09ic2VydmFibGVdKGh0dHBzOi8vcnhqcy1kZXYuZmlyZWJhc2VhcHAuY29tL2d1aWRlL29ic2VydmFibGUpXG4gKiBpbnN0ZWFkIG9mIGEgcHJvbWlzZS4gSXQgZXhpc3RzIGluIGNhc2UgdXNpbmcgYW4gT2JzZXJ2YWJsZSBpc1xuICogcHJlZmVycmVkIG9yIG1vcmUgY29udmVuaWVudCB0aGFuIGEgcHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0gdXJsIFNlZSBbW29wZW5tcnNGZXRjaF1dXG4gKiBAcGFyYW0gZmV0Y2hJbml0IFNlZSBbW29wZW5tcnNGZXRjaF1dXG4gKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIHRoYXQgcHJvZHVjZXMgZXhhY3RseSBvbmUgUmVzcG9uc2Ugb2JqZWN0LlxuICogVGhlIHJlc3BvbnNlIG9iamVjdCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciBbW29wZW5tcnNGZXRjaF1dLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBganNcbiAqIGltcG9ydCB7IG9wZW5tcnNPYnNlcnZhYmxlRmV0Y2ggfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJ1xuICogY29uc3Qgc3Vic2NyaXB0aW9uID0gb3Blbm1yc09ic2VydmFibGVGZXRjaChgJHtyZXN0QmFzZVVybH0vc2Vzc2lvbicpLnN1YnNjcmliZShcbiAqICAgcmVzcG9uc2UgPT4gY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YSksXG4gKiAgIGVyciA9PiB7dGhyb3cgZXJyfSxcbiAqICAgKCkgPT4gY29uc29sZS5sb2coJ2ZpbmlzaGVkJylcbiAqIClcbiAqIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gKiBgYGBcbiAqXG4gKiAjIyMjIENhbmNlbGxhdGlvblxuICpcbiAqIFRvIGNhbmNlbCB0aGUgbmV0d29yayByZXF1ZXN0LCBzaW1wbHkgY2FsbCBgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7YFxuICpcbiAqIEBjYXRlZ29yeSBBUElcbiAqLyBleHBvcnQgZnVuY3Rpb24gb3Blbm1yc09ic2VydmFibGVGZXRjaCh1cmwsIGZldGNoSW5pdCA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBmZXRjaEluaXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIG9wZW5tcnNPYnNlcnZhYmxlRmV0Y2ggbXVzdCBiZSBlaXRoZXIgb21pdHRlZCBvciBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGZldGNoSW5pdC5zaWduYWwgPSBhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpPT57XG4gICAgICAgIGxldCBoYXNSZXNwb25zZSA9IGZhbHNlO1xuICAgICAgICBvcGVubXJzRmV0Y2godXJsLCBmZXRjaEluaXQpLnRoZW4oKHJlc3BvbnNlKT0+e1xuICAgICAgICAgICAgaGFzUmVzcG9uc2UgPSB0cnVlO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwb25zZSk7XG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9LCAoZXJyKT0+e1xuICAgICAgICAgICAgaGFzUmVzcG9uc2UgPSB0cnVlO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgaWYgKCFoYXNSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0IGNsYXNzIE9wZW5tcnNGZXRjaEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHVybCwgcmVzcG9uc2UsIHJlc3BvbnNlQm9keSwgcmVxdWVzdFN0YWNrdHJhY2Upe1xuICAgICAgICBzdXBlcigpLCBfZGVmaW5lX3Byb3BlcnR5KHRoaXMsIFwicmVzcG9uc2VcIiwgdm9pZCAwKSwgX2RlZmluZV9wcm9wZXJ0eSh0aGlzLCBcInJlc3BvbnNlQm9keVwiLCB2b2lkIDApO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBgU2VydmVyIHJlc3BvbmRlZCB3aXRoICR7cmVzcG9uc2Uuc3RhdHVzfSAoJHtyZXNwb25zZS5zdGF0dXNUZXh0fSkgZm9yIHVybCAke3VybH0uIENoZWNrIGVyci5yZXNwb25zZUJvZHkgb3IgbmV0d29yayB0YWIgaW4gZGV2IHRvb2xzIGZvciBtb3JlIGluZm9gO1xuICAgICAgICByZXF1ZXN0U3RhY2t0cmFjZS5tZXNzYWdlID0gdGhpcy5tZXNzYWdlO1xuICAgICAgICB0aGlzLnJlc3BvbnNlQm9keSA9IHJlc3BvbnNlQm9keTtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnN0YWNrID0gYFN0YWNrdHJhY2UgZm9yIG91dGdvaW5nIHJlcXVlc3Q6XFxuJHtyZXF1ZXN0U3RhY2t0cmFjZS5zdGFja31cXG5TdGFja3RyYWNlIGZvciBpbmNvbWluZyByZXNwb25zZTpcXG4ke3RoaXMuc3RhY2t9YDtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiX2RlZmluZV9wcm9wZXJ0eSIsIm9iaiIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYnNlcnZhYmxlIiwiaXNQbGFpbk9iamVjdCIsImdldENvbmZpZyIsImNsZWFySGlzdG9yeSIsIm5hdmlnYXRlIiwiZGVmYXVsdFJlZGlyZWN0QXV0aEZhaWx1cmVVcmwiLCJyZXN0QmFzZVVybCIsImZoaXJCYXNlVXJsIiwic2Vzc2lvbkVuZHBvaW50IiwibWFrZVVybCIsInBhdGgiLCJzdGFydHNXaXRoIiwid2luZG93Iiwib3Blbm1yc0Jhc2UiLCJvcGVubXJzRmV0Y2giLCJmZXRjaEluaXQiLCJFcnJvciIsInVybCIsImhlYWRlcnMiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIkFjY2VwdCIsInVybFVybCIsIlVSTCIsImxvY2F0aW9uIiwidG9TdHJpbmciLCJzZWFyY2hQYXJhbXMiLCJoYXMiLCJzZXQiLCJyZXF1ZXN0U3RhY2t0cmFjZSIsImZldGNoIiwidGhlbiIsInIiLCJyZXNwb25zZSIsInJlZGlyZWN0QXV0aEZhaWx1cmUiLCJmb2xsb3dSZWRpcmVjdHMiLCJvayIsInN0YXR1cyIsImdldCIsInRvIiwiZGF0YSIsImNsb25lIiwidGV4dCIsInJlc3BvbnNlVGV4dCIsInBhcnNlIiwiZXJyIiwiZW5hYmxlZCIsImVycm9ycyIsImluY2x1ZGVzIiwicmVzb2x2ZVByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlc3BvbnNlQm9keSIsIk9wZW5tcnNGZXRjaEVycm9yIiwib3Blbm1yc09ic2VydmFibGVGZXRjaCIsImFib3J0Q29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsInNpZ25hbCIsIm9ic2VydmVyIiwiaGFzUmVzcG9uc2UiLCJuZXh0IiwiY29tcGxldGUiLCJlcnJvciIsImFib3J0IiwibWVzc2FnZSIsInN0YXR1c1RleHQiLCJzdGFjayJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-api/dist/openmrs-fetch.js\n");
69
69
 
70
70
  /***/ }),
71
71
 
@@ -155,7 +155,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
155
155
  \**********************************************************************/
156
156
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
157
157
 
158
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearConfigErrors: () => (/* binding */ clearConfigErrors),\n/* harmony export */ defineConfigSchema: () => (/* binding */ defineConfigSchema),\n/* harmony export */ defineExtensionConfigSchema: () => (/* binding */ defineExtensionConfigSchema),\n/* harmony export */ getConfig: () => (/* binding */ getConfig),\n/* harmony export */ getTranslationOverrides: () => (/* binding */ getTranslationOverrides),\n/* harmony export */ processConfig: () => (/* binding */ processConfig),\n/* harmony export */ provide: () => (/* binding */ provide),\n/* harmony export */ registerModuleLoad: () => (/* binding */ registerModuleLoad),\n/* harmony export */ registerModuleWithConfigSystem: () => (/* binding */ registerModuleWithConfigSystem),\n/* harmony export */ registerTranslationNamespace: () => (/* binding */ registerTranslationNamespace),\n/* harmony export */ resetConfigSystem: () => (/* binding */ resetConfigSystem)\n/* harmony export */ });\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/equals.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/mergeDeepRight.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/omit.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/clone.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/reduce.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types.js */ \"../../framework/esm-config/dist/types.js\");\n/* harmony import */ var _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../validators/type-validators.js */ \"../../framework/esm-config/dist/validators/type-validators.js\");\n/* harmony import */ var _validators_validator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../validators/validator.js */ \"../../framework/esm-config/dist/validators/validator.js\");\n/* harmony import */ var _state_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./state.js */ \"../../framework/esm-config/dist/module-config/state.js\");\n/** @module @category Config */ \n\n\n\n\n/**\n * Store setup\n *\n *\n * Set up stores and subscriptions so that inputs get processed appropriately.\n *\n * There are *input* stores and *output* stores. The *input* stores\n * are configInternalStore, temporaryConfigStore, and configExtensionStore. The\n * output stores are set in the `compute...` functions. They are the module\n * config stores, the extension slot config stores (by module), the extension\n * config stores, and the implementer tools config store.\n *\n * This code sets up the subscriptions so that when an input store changes,\n * the correct set of output stores are updated.\n *\n * All `compute...` functions except `computeExtensionConfigs` are pure\n * (or are supposed to be), other than the fact that they all `setState`\n * store values at the end. `computeExtensionConfigs` calls `getGlobalStore`,\n * which creates stores.\n */ // Store unsubscribe functions to allow cleanup (e.g., in tests or hot module reloading)\nconst configSubscriptions = [];\n/**\n * Recomputes all configuration derived stores based on current state of input stores.\n * Called whenever any input store (configInternalStore, temporaryConfigStore, configExtensionStore) changes.\n */ function recomputeAllConfigs() {\n const configState = _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState();\n const tempConfigState = _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState();\n const extensionState = _state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.getState();\n computeModuleConfig(configState, tempConfigState);\n computeImplementerToolsConfig(configState, tempConfigState);\n computeExtensionSlotConfigs(configState, tempConfigState);\n computeExtensionConfigs(configState, extensionState, tempConfigState);\n}\nfunction setupConfigSubscriptions() {\n // Initial computation\n recomputeAllConfigs();\n // Subscribe to all input stores with a single handler\n // This ensures we only recompute once even if multiple stores change simultaneously\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.subscribe(recomputeAllConfigs));\n}\n// Set up subscriptions at module load time\nsetupConfigSubscriptions();\nfunction computeModuleConfig(state, tempState) {\n for (let moduleName of Object.keys(state.schemas)){\n // At this point the schema could be either just the implicit schema or the actually\n // defined schema. We run with just the implicit schema because we want to populate\n // the config store with the translation overrides as soon as possible. In fact, the\n // translation system will throw for Suspense until the translation overrides are\n // available, which as of this writing blocks the schema definition from occurring\n // for modules loaded based on their extensions.\n const moduleStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n let newState;\n if (state.moduleLoaded[moduleName]) {\n const config = getConfigForModule(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: true,\n config\n };\n } else {\n const config = getConfigForModuleImplicitSchema(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: false,\n config\n };\n }\n moduleStore.setState(newState);\n }\n}\nfunction computeExtensionSlotConfigs(state, tempState) {\n const slotConfigs = getExtensionSlotConfigs(state, tempState);\n const newSlotStoreEntries = Object.fromEntries(Object.entries(slotConfigs).map(([slotName, config])=>[\n slotName,\n {\n loaded: true,\n config\n }\n ]));\n const slotStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionSlotsConfigStore)();\n const oldState = slotStore.getState();\n const newState = {\n slots: {\n ...oldState.slots,\n ...newSlotStoreEntries\n }\n };\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.slots, newState.slots)) {\n slotStore.setState(newState);\n }\n}\nfunction computeImplementerToolsConfig(state, tempConfigState) {\n const oldState = _state_js__WEBPACK_IMPORTED_MODULE_3__.implementerToolsConfigStore.getState();\n const config = getImplementerToolsConfig(state, tempConfigState);\n const newState = {\n config\n };\n // Use deep equality on the actual config content, not the wrapper object\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.config, newState.config)) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.implementerToolsConfigStore.setState(newState);\n }\n}\nfunction computeExtensionConfigs(configState, extensionState, tempConfigState) {\n const configs = {};\n // We assume that the module schema has already been defined, since the extension\n // it contains is mounted.\n for (let extension of extensionState.mountedExtensions){\n const config = computeExtensionConfig(extension.slotModuleName, extension.extensionModuleName, extension.slotName, extension.extensionId, configState, tempConfigState);\n if (!configs[extension.slotName]) {\n configs[extension.slotName] = {};\n }\n configs[extension.slotName][extension.extensionId] = {\n config,\n loaded: true\n };\n }\n const extensionsConfigStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionsConfigStore)();\n const oldState = extensionsConfigStore.getState();\n const newState = {\n configs\n };\n // Use deep equality to only update if configs actually changed\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.configs, newState.configs)) {\n extensionsConfigStore.setState(newState);\n }\n}\n/*\n * API\n *\n */ /**\n * This defines a configuration schema for a module. The schema tells the\n * configuration system how the module can be configured. It specifies\n * what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param moduleName Name of the module the schema is being defined for. Generally\n * should be the one in which the `defineConfigSchema` call takes place.\n * @param schema The config schema for the module\n */ function defineConfigSchema(moduleName, schema) {\n validateConfigSchema(moduleName, schema);\n const enhancedSchema = (0,ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(schema, implicitConfigSchema);\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [moduleName]: enhancedSchema\n },\n moduleLoaded: {\n ...state.moduleLoaded,\n [moduleName]: true\n }\n }));\n}\n/**\n * This alerts the configuration system that a module exists. This allows config to be\n * processed, while still allowing the extension system to know whether the module has\n * actually had its front bundle executed yet.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleWithConfigSystem(moduleName) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [moduleName]: implicitConfigSchema\n }\n }));\n}\n/**\n * This alerts the configuration system that a module has been loaded.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleLoad(moduleName) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n moduleLoaded: {\n ...state.moduleLoaded,\n [moduleName]: true\n }\n }));\n}\n/**\n * This allows the config system to support translation overrides for namespaces that\n * do not correspond to modules.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param namespace\n */ function registerTranslationNamespace(namespace) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [namespace]: translationOverridesSchema\n }\n }));\n}\n/**\n * This defines a configuration schema for an extension. When a schema is defined\n * for an extension, that extension will receive the configuration corresponding\n * to that schema, rather than the configuration corresponding to the module\n * in which it is defined.\n *\n * The schema tells the configuration system how the module can be configured.\n * It specifies what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param extensionName Name of the extension the schema is being defined for.\n * Should match the `name` of one of the `extensions` entries defined in\n * the app's `routes.json` file.\n * @param schema The config schema for the extension\n */ function defineExtensionConfigSchema(extensionName, schema) {\n validateConfigSchema(extensionName, schema);\n const enhancedSchema = (0,ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(schema, implicitConfigSchema);\n const state = _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState();\n if (state.schemas[extensionName]) {\n console.error(`Config schema for extension ${extensionName} already exists. If there are multiple extensions with this same name, one will probably crash.`);\n }\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [extensionName]: enhancedSchema\n }\n }));\n}\nfunction provide(config, sourceName = 'provided') {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n providedConfigs: [\n ...state.providedConfigs,\n {\n source: sourceName,\n config\n }\n ]\n }));\n}\n/**\n * A promise-based way to access the config as soon as it is fully loaded.\n * If it is already loaded, resolves the config in its present state.\n *\n * This is a useful function if you need to get the config in the course\n * of the execution of a function.\n *\n * @param moduleName The name of the module for which to look up the config\n */ function getConfig(moduleName) {\n return new Promise((resolve)=>{\n const store = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n function update(state) {\n if (state.loaded && state.config) {\n const config = (0,ramda__WEBPACK_IMPORTED_MODULE_6__[\"default\"])([\n 'Display conditions',\n 'Translation overrides'\n ], state.config);\n resolve(config);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(store.getState());\n const unsubscribe = store.subscribe(update);\n });\n}\n/** @internal */ function getTranslationOverrides(moduleName, slotName, extensionId) {\n const promises = [\n new Promise((resolve)=>{\n const configStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n function update(state) {\n if (state.translationOverridesLoaded && state.config) {\n const translationOverrides = state.config['Translation overrides'] ?? {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(configStore.getState());\n const unsubscribe = configStore.subscribe(update);\n })\n ];\n if (slotName && extensionId) {\n promises.push(new Promise((resolve)=>{\n const configStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionConfig)(slotName, extensionId);\n function update(state) {\n if (state.loaded && state.config) {\n const translationOverrides = state.config['Translation overrides'] ?? {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(configStore.getState());\n const unsubscribe = configStore.subscribe(update);\n }));\n }\n return Promise.all(promises);\n}\n/**\n * Validate and interpolate defaults for `providedConfig` according to `schema`\n *\n * @param schema a configuration schema\n * @param providedConfig an object of config values (without the top-level module name)\n * @param keyPathContext a dot-deparated string which helps the user figure out where\n * the provided config came from\n * @internal\n */ function processConfig(schema, providedConfig, keyPathContext) {\n validateStructure(schema, providedConfig, keyPathContext);\n const config = setDefaults(schema, providedConfig);\n runAllValidatorsInConfigTree(schema, config, keyPathContext);\n return config;\n}\n/*\n * Helper functions\n *\n */ /**\n * Returns the configuration for an extension. This configuration is specific\n * to the slot in which it is mounted, and its ID within that slot.\n *\n * The schema for that configuration is the extension schema. If no extension\n * schema has been provided, the schema used is the schema of the module in\n * which the extension is defined.\n *\n * @param slotModuleName The name of the module which defines the extension slot\n * @param extensionModuleName The name of the module which defines the extension (and therefore the config schema)\n * @param slotName The name of the extension slot where the extension is mounted\n * @param extensionId The ID of the extension in its slot\n */ function computeExtensionConfig(slotModuleName, extensionModuleName, slotName, extensionId, configState, tempConfigState) {\n const extensionName = getExtensionNameFromId(extensionId);\n const extensionConfigSchema = configState.schemas[extensionName];\n const nameOfSchemaSource = extensionConfigSchema ? extensionName : extensionModuleName;\n const providedConfigs = getProvidedConfigs(configState, tempConfigState);\n const slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n const configOverride = slotModuleConfig?.extensionSlots?.[slotName]?.configure?.[extensionId] ?? {};\n const extensionConfig = mergeConfigsFor(nameOfSchemaSource, providedConfigs);\n const combinedConfig = mergeConfigs([\n extensionConfig,\n configOverride\n ]);\n const schema = extensionConfigSchema ?? configState.schemas[extensionModuleName];\n validateStructure(schema, combinedConfig, nameOfSchemaSource);\n const config = setDefaults(schema, combinedConfig);\n runAllValidatorsInConfigTree(schema, config, nameOfSchemaSource);\n delete config.extensionSlots;\n return config;\n}\nfunction getImplementerToolsConfig(configState, tempConfigState) {\n let result = getSchemaWithValuesAndSources((0,ramda__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(configState.schemas));\n const configsAndSources = [\n ...configState.providedConfigs.map((c)=>[\n c.config,\n c.source\n ]),\n [\n tempConfigState.config,\n 'temporary config'\n ]\n ];\n for (let [config, source] of configsAndSources){\n result = mergeConfigs([\n result,\n createValuesAndSourcesTree(config, source)\n ]);\n }\n return result;\n}\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty('_default')) {\n return {\n ...schema,\n _value: schema._default,\n _source: 'default'\n };\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce((obj, key)=>{\n obj[key] = getSchemaWithValuesAndSources(schema[key]);\n return obj;\n }, {});\n } else {\n // at this point, the schema is bad and an error will have been logged during schema validation\n return {};\n }\n}\nfunction createValuesAndSourcesTree(config, source) {\n if (isOrdinaryObject(config)) {\n return Object.keys(config).reduce((obj, key)=>{\n obj[key] = createValuesAndSourcesTree(config[key], source);\n return obj;\n }, {});\n } else {\n return {\n _value: config,\n _source: source\n };\n }\n}\nfunction getExtensionSlotConfigs(configState, tempConfigState) {\n const allConfigs = mergeConfigs(getProvidedConfigs(configState, tempConfigState));\n const slotConfigPerModule = Object.keys(allConfigs).reduce((obj, key)=>{\n if (allConfigs[key]?.extensionSlots) {\n obj[key] = allConfigs[key]?.extensionSlots;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n const slotConfigs = Object.keys(slotConfigPerModule).reduce((obj, key)=>{\n obj = {\n ...obj,\n ...slotConfigPerModule[key]\n };\n return obj;\n }, {});\n return slotConfigs;\n}\nfunction validateAllExtensionSlotConfigs(slotConfigPerModule) {\n for (let [moduleName, configBySlotName] of Object.entries(slotConfigPerModule)){\n for (let [slotName, config] of Object.entries(configBySlotName)){\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n }\n}\nfunction validateExtensionSlotConfig(config, moduleName, slotName) {\n const keyPath = `${moduleName}.extensionSlots.${slotName}`;\n const errorPrefix = `Extension slot config '${keyPath}'`;\n const invalidKeys = Object.keys(config).filter((k)=>![\n 'add',\n 'remove',\n 'order',\n 'configure'\n ].includes(k));\n if (invalidKeys.length) {\n logError(keyPath, errorPrefix + `' contains invalid keys '${invalidKeys.join(\"', '\")}'`);\n }\n if (config.add) {\n if (!Array.isArray(config.add) || !config.add.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.add' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.remove) {\n if (!Array.isArray(config.remove) || !config.remove.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.remove' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.order) {\n if (!Array.isArray(config.order) || !config.order.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.order' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.configure) {\n if (!isOrdinaryObject(config.configure)) {\n logError(keyPath, errorPrefix + `.configure' is invalid. Must be an object with extension IDs for keys`);\n }\n }\n}\nfunction getProvidedConfigs(configState, tempConfigState) {\n return [\n ...configState.providedConfigs.map((c)=>c.config),\n tempConfigState.config\n ];\n}\n/**\n * Validates the config schema for a module. Since problems identified here are programming errors\n * that hopefully will be caught during development, this function logs errors to the console directly;\n * it's fine if we spam the user with these errors.\n */ function validateConfigSchema(moduleName, schema, keyPath = '') {\n const updateMessage = `Please verify that you are running the latest version and, if so, alert the maintainer.`;\n for (const key of Object.keys(schema).filter((k)=>!k.startsWith('_'))){\n const thisKeyPath = keyPath + (keyPath && '.') + key;\n const schemaPart = schema[key];\n if (thisKeyPath === 'Display conditions') {\n console.error(`${moduleName} declares a configuration option called \"Display conditions\"; the \"Display conditions\" option is a reserved name. ${updateMessage}`);\n }\n if (thisKeyPath === 'Translation overrides') {\n console.error(`${moduleName} declares a configuration option called \"Translation overrides\"; the \"Translation overrides\" option is a reserved name. ${updateMessage}`);\n }\n if (!isOrdinaryObject(schemaPart)) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}`);\n continue;\n }\n if (!schemaPart.hasOwnProperty('_default')) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n const elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + '._elements');\n }\n if (schemaPart._validators) {\n for (let validator of schemaPart._validators){\n if (typeof validator !== 'function') {\n console.error(`${moduleName} has invalid validator for key '${thisKeyPath}' ${updateMessage}.` + `\\n\\nIf you're the maintainer: validators must be functions that return either ` + `undefined or an error string. Received ${validator}.`);\n }\n }\n }\n const valueType = schemaPart._type;\n if (valueType && !Object.values(_types_js__WEBPACK_IMPORTED_MODULE_0__.Type).includes(valueType)) {\n console.error(`${moduleName} has invalid type for key '${thisKeyPath}' ${updateMessage}.` + `\\n\\nIf you're the maintainer: the allowed types are ${Object.values(_types_js__WEBPACK_IMPORTED_MODULE_0__.Type).join(', ')}. ` + `Received '${valueType}'`);\n }\n if (Object.keys(schemaPart).every((k)=>[\n '_description',\n '_validators',\n '_elements',\n '_type'\n ].includes(k)) && !keyPath.includes('._elements')) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` + `\\n\\nIf you're the maintainer: all config elements must have a default. ` + `Received ${JSON.stringify(schemaPart)}`);\n }\n if (elements && valueType && ![\n _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array,\n _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object\n ].includes(valueType)) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` + `\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. ` + `Received ${JSON.stringify(valueType)}`);\n }\n }\n}\nfunction getConfigForModule(moduleName, configState, tempConfigState) {\n const schema = configState.schemas[moduleName];\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n validateStructure(schema, inputConfig, moduleName);\n const config = setDefaults(schema, inputConfig);\n runAllValidatorsInConfigTree(schema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction getConfigForModuleImplicitSchema(moduleName, configState, tempConfigState) {\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n const config = setDefaults(implicitConfigSchema, inputConfig);\n runAllValidatorsInConfigTree(implicitConfigSchema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction mergeConfigsFor(moduleName, allConfigs) {\n const allConfigsForModule = allConfigs.map(({ [moduleName]: c })=>c).filter((c)=>!!c);\n return mergeConfigs(allConfigsForModule);\n}\nfunction mergeConfigs(configs) {\n const mergeDeepAll = (0,ramda__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n return mergeDeepAll({}, configs);\n}\n/**\n * Recursively check the provided config tree to make sure that all\n * of the provided properties exist in the schema, and that types are\n * correct. Does not run validators yet, since those will be run on\n * the config with the defaults filled in.\n */ function validateStructure(schema, config, keyPath = '') {\n // validate each constituent element\n for (const key of Object.keys(config)){\n const value = config[key];\n const thisKeyPath = keyPath + '.' + key;\n const schemaPart = schema[key];\n if (!schema.hasOwnProperty(key)) {\n if (!(key === 'extensionSlots' && keyPath !== '')) {\n logError(thisKeyPath, `Unknown config key '${thisKeyPath}' provided. Ignoring.`);\n }\n continue;\n }\n validateBranchStructure(schemaPart, value, thisKeyPath);\n }\n}\nfunction validateBranchStructure(schemaPart, value, keyPath) {\n checkType(keyPath, schemaPart._type, value);\n if (isOrdinaryObject(value)) {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object) {\n // validate as freeform object\n validateFreeformObjectStructure(schemaPart, value, keyPath);\n } else if (!(schemaPart.hasOwnProperty('_default') || schemaPart.hasOwnProperty('_type'))) {\n // validate as normal nested config\n validateStructure(schemaPart, value, keyPath);\n }\n } else {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array) {\n validateArrayStructure(schemaPart, value, keyPath);\n }\n }\n}\nfunction validateFreeformObjectStructure(freeformObjectSchema, config, keyPath) {\n if (freeformObjectSchema._elements) {\n for (const key of Object.keys(config)){\n const value = config[key];\n validateBranchStructure(freeformObjectSchema._elements, value, `${keyPath}.${key}`);\n }\n }\n}\nfunction validateArrayStructure(arraySchema, value, keyPath) {\n const validatedAsArray = checkType(keyPath, _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array, value);\n if (!validatedAsArray) {\n return;\n }\n // if there is an array element object schema, verify that elements match it\n if (hasObjectSchema(arraySchema._elements)) {\n for(let i = 0; i < value.length; i++){\n validateBranchStructure(arraySchema._elements, value[i], `${keyPath}[${i}]`);\n }\n }\n for(let i = 0; i < value.length; i++){\n checkType(`${keyPath}[${i}]`, arraySchema._elements?._type, value[i]);\n }\n}\n/**\n * Run all the validators in the config tree. This should be run\n * on the config object after it has been filled in with all the defaults, since\n * higher-level validators may refer to default values.\n */ function runAllValidatorsInConfigTree(schema, config, keyPath = '') {\n // If `!schema`, there should have been a structural validation error printed already.\n if (schema) {\n if (config !== schema._default) {\n runValidators(keyPath, schema._validators, config);\n }\n if (isOrdinaryObject(config)) {\n for (const key of Object.keys(config)){\n const value = config[key];\n const thisKeyPath = keyPath + '.' + key;\n const schemaPart = schema[key];\n if (schema._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object && schema._elements) {\n runAllValidatorsInConfigTree(schema._elements, value, thisKeyPath);\n } else {\n runAllValidatorsInConfigTree(schemaPart, value, thisKeyPath);\n }\n }\n } else if (Array.isArray(config) && schema._elements) {\n for(let i = 0; i < config.length; i++){\n runAllValidatorsInConfigTree(schema._elements, config[i], `${keyPath}[${i}]`);\n }\n }\n }\n}\n/**\n * Run type validation for the value, logging any errors.\n * @returns true if validation passes, false otherwise\n */ function checkType(keyPath, _type, value) {\n if (_type) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n const validator = {\n Array: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isArray,\n Boolean: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean,\n ConceptUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n Number: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isNumber,\n Object: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isObject,\n String: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isString,\n UUID: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n PersonAttributeTypeUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n PatientIdentifierTypeUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid\n };\n return runValidators(keyPath, [\n validator[_type]\n ], value);\n }\n return true;\n}\n/**\n * Runs validators, logging errors.\n * @returns true if all pass, false otherwise.\n */ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction runValidators(keyPath, validators, value) {\n let returnValue = true;\n if (validators) {\n try {\n for (let validator of validators){\n const validatorResult = validator(value);\n if (typeof validatorResult === 'string') {\n const message = typeof value === 'object' ? `Invalid configuration for ${keyPath}: ${validatorResult}` : `Invalid configuration value ${value} for ${keyPath}: ${validatorResult}`;\n logError(keyPath, message);\n returnValue = false;\n }\n }\n } catch (e) {\n console.error(`Skipping invalid validator at \"${keyPath}\". Encountered error\\n\\t${e}`);\n }\n }\n return returnValue;\n}\n// Recursively fill in the config with values from the schema.\nconst setDefaults = (schema, inputConfig)=>{\n const config = (0,ramda__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(inputConfig);\n if (!schema) {\n return config;\n }\n for (const key of Object.keys(schema)){\n const configPart = config[key];\n const schemaPart = schema[key];\n // The `schemaPart &&` clause of this `if` statement will only fail\n // if the schema is very invalid. It is there to prevent the app from\n // crashing completely, though it will produce unexpected behavior.\n // If this happens, there should be legible errors in the console from\n // the schema validator.\n if (schemaPart && (schemaPart.hasOwnProperty('_type') || schemaPart.hasOwnProperty('_default'))) {\n // We assume that schemaPart defines a config value, since it has\n // a property `_type` or `_default`.\n if (!config.hasOwnProperty(key)) {\n config[key] = schemaPart['_default'];\n }\n // We also check if it is an object or array with object elements, in which case we recurse\n const elements = schemaPart._elements;\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array && Array.isArray(configPart)) {\n const configWithDefaults = configPart.map((conf)=>setDefaults(elements, conf));\n config[key] = configWithDefaults;\n } else if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object) {\n for (let objectKey of Object.keys(configPart)){\n configPart[objectKey] = setDefaults(elements, configPart[objectKey]);\n }\n }\n }\n } else if (isOrdinaryObject(schemaPart)) {\n // Since schemaPart has no property \"_type\", if it's an ordinary object\n // (unlike, importantly, the validators array), we assume it is a parent config property.\n // We recurse to config[key] and schema[key]. Default config[key] to {}.\n const selectedConfigPart = configPart ?? {};\n // There will have been a validation error already if configPart is not a plain object.\n if (isOrdinaryObject(selectedConfigPart)) {\n config[key] = setDefaults(schemaPart, selectedConfigPart);\n }\n }\n }\n return config;\n};\nfunction hasObjectSchema(elementsSchema) {\n return !!elementsSchema && Object.keys(elementsSchema).filter((e)=>![\n '_default',\n '_validators'\n ].includes(e)).length > 0;\n}\nfunction isOrdinaryObject(value) {\n return typeof value === 'object' && !Array.isArray(value) && value !== null;\n}\n/** Keep track of which validation errors we have displayed. Each one should only be displayed once. */ let displayedValidationMessages = new Set();\nfunction logError(keyPath, message) {\n const key = `${keyPath}:::${message}`;\n // technically, this should not be possible, but because of how things wind-up transpiled, this isn't impossible\n if (!displayedValidationMessages) {\n displayedValidationMessages = new Set();\n }\n if (!displayedValidationMessages.has(key)) {\n console.error(message);\n displayedValidationMessages.add(key);\n }\n}\n/**\n * Normally, configuration errors are only displayed once. This function clears the list of\n * displayed errors, so that they will be displayed again.\n *\n * @internal\n */ function clearConfigErrors(keyPath) {\n if (keyPath) {\n displayedValidationMessages.forEach((key)=>{\n if (key.startsWith(keyPath)) {\n displayedValidationMessages.delete(key);\n }\n });\n } else {\n displayedValidationMessages.clear();\n }\n}\n/**\n * Cleans up all config store subscriptions and re-establishes them. This is primarily\n * useful for testing, where subscriptions set up at module load time need to be cleared\n * between tests to prevent infinite update loops. After clearing, subscriptions are\n * re-established so the config system continues to work normally.\n *\n * @internal\n */ function resetConfigSystem() {\n configSubscriptions.forEach((unsubscribe)=>unsubscribe());\n configSubscriptions.length = 0;\n setupConfigSubscriptions();\n}\n/**\n * Copied over from esm-extensions. It rightly belongs to that module, but esm-config\n * cannot depend on esm-extensions.\n */ function getExtensionNameFromId(extensionId) {\n const [extensionName] = extensionId.split('#');\n return extensionName;\n}\n/**\n * The translation overrides schema is used in the implicit schema given to every module;\n * plus any additional translation namespaces (at time of writing, this is just 'core').\n */ const translationOverridesSchema = {\n 'Translation overrides': {\n _description: 'Per-language overrides for frontend translations should be keyed by language code and each language dictionary contains the translation key and the display value',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object,\n _default: {},\n _validators: [\n (0,_validators_validator_js__WEBPACK_IMPORTED_MODULE_2__.validator)((o)=>Object.keys(o).every((k)=>/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k)), (o)=>{\n const badKeys = Object.keys(o).filter((k)=>!/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k));\n return `The 'Translation overrides' object should have language codes for keys. Language codes must be in the form of a two-to-three letter language code optionally followed by a hyphen and a two-to-three letter country code. The following keys do not conform: ${badKeys.join(', ')}.`;\n })\n ]\n }\n};\n/**\n * The implicitConfigSchema is implicitly included in every configuration schema\n */ const implicitConfigSchema = {\n 'Display conditions': {\n privileges: {\n _description: 'The privilege(s) the user must have to use this extension',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array,\n _default: []\n },\n expression: {\n _description: 'The expression that determines whether the extension is displayed',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.String,\n _default: undefined\n }\n },\n ...translationOverridesSchema\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2QkFBNkIsR0FBdUU7QUFDakU7QUFDeUU7QUFDckQ7QUFDK0o7QUFDdE47Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQkMsR0FBRyx3RkFBd0Y7QUFDNUYsTUFBTXFCLHNCQUFzQixFQUFFO0FBQzlCOzs7Q0FHQyxHQUFHLFNBQVNDO0lBQ1QsTUFBTUMsY0FBY1QsMERBQW1CQSxDQUFDVSxRQUFRO0lBQ2hELE1BQU1DLGtCQUFrQkwsMkRBQW9CQSxDQUFDSSxRQUFRO0lBQ3JELE1BQU1FLGlCQUFpQmIsMkRBQW9CQSxDQUFDVyxRQUFRO0lBQ3BERyxvQkFBb0JKLGFBQWFFO0lBQ2pDRyw4QkFBOEJMLGFBQWFFO0lBQzNDSSw0QkFBNEJOLGFBQWFFO0lBQ3pDSyx3QkFBd0JQLGFBQWFHLGdCQUFnQkQ7QUFDekQ7QUFDQSxTQUFTTTtJQUNMLHNCQUFzQjtJQUN0QlQ7SUFDQSxzREFBc0Q7SUFDdEQsb0ZBQW9GO0lBQ3BGRCxvQkFBb0JXLElBQUksQ0FBQ2xCLDBEQUFtQkEsQ0FBQ21CLFNBQVMsQ0FBQ1g7SUFDdkRELG9CQUFvQlcsSUFBSSxDQUFDWiwyREFBb0JBLENBQUNhLFNBQVMsQ0FBQ1g7SUFDeERELG9CQUFvQlcsSUFBSSxDQUFDbkIsMkRBQW9CQSxDQUFDb0IsU0FBUyxDQUFDWDtBQUM1RDtBQUNBLDJDQUEyQztBQUMzQ1M7QUFDQSxTQUFTSixvQkFBb0JPLEtBQUssRUFBRUMsU0FBUztJQUN6QyxLQUFLLElBQUlDLGNBQWNDLE9BQU9DLElBQUksQ0FBQ0osTUFBTUssT0FBTyxFQUFFO1FBQzlDLG9GQUFvRjtRQUNwRixtRkFBbUY7UUFDbkYsb0ZBQW9GO1FBQ3BGLGlGQUFpRjtRQUNqRixrRkFBa0Y7UUFDbEYsZ0RBQWdEO1FBQ2hELE1BQU1DLGNBQWN6Qix5REFBY0EsQ0FB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QUFTQSxDQUFDLENBQUM2TCxJQUFJcEssT0FBT0MsSUFBSSxDQUFDbUssR0FBRzFELEtBQUssQ0FBQyxDQUFDUCxJQUFJLDZCQUE2QmtFLElBQUksQ0FBQ2xFLEtBQUssQ0FBQ2lFO2dCQUM3RSxNQUFNRSxVQUFVdEssT0FBT0MsSUFBSSxDQUFDbUssR0FBR2xFLE1BQU0sQ0FBQyxDQUFDQyxJQUFJLENBQUMsNkJBQTZCa0UsSUFBSSxDQUFDbEU7Z0JBQzlFLE9BQU8sQ0FBQyw2UEFBNlAsRUFBRW1FLFFBQVEvRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaFM7U0FDSDtJQUNMO0FBQ0o7QUFDQTs7Q0FFQyxHQUFHLE1BQU1wRSx1QkFBdUI7SUFDN0Isc0JBQXNCO1FBQ2xCb0ksWUFBWTtZQUNSSixjQUFjO1lBQ2Q1QyxPQUFPdkosMkNBQUlBLENBQUN5SSxLQUFLO1lBQ2pCcEIsVUFBVSxFQUFFO1FBQ2hCO1FBQ0FtRixZQUFZO1lBQ1JMLGNBQWM7WUFDZDVDLE9BQU92SiwyQ0FBSUEsQ0FBQzJLLE1BQU07WUFDbEJ0RCxVQUFVb0Y7UUFDZDtJQUNKO0lBQ0EsR0FBR2pJLDBCQUEwQjtBQUNqQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanM/OGRmZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQ29uZmlnICovIGltcG9ydCB7IGNsb25lLCBlcXVhbHMsIHJlZHVjZSwgbWVyZ2VEZWVwUmlnaHQsIG9taXQgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IFR5cGUgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzQm9vbGVhbiwgaXNVdWlkLCBpc051bWJlciwgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdHlwZS12YWxpZGF0b3JzLmpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi4vdmFsaWRhdG9ycy92YWxpZGF0b3IuanNcIjtcbmltcG9ydCB7IGNvbmZpZ0V4dGVuc2lvblN0b3JlLCBjb25maWdJbnRlcm5hbFN0b3JlLCBnZXRDb25maWdTdG9yZSwgZ2V0RXh0ZW5zaW9uQ29uZmlnLCBnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlLCBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUsIGltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUgfSBmcm9tIFwiLi9zdGF0ZS5qc1wiO1xuLyoqXG4gKiBTdG9yZSBzZXR1cFxuICpcbiAqXG4gKiBTZXQgdXAgc3RvcmVzIGFuZCBzdWJzY3JpcHRpb25zIHNvIHRoYXQgaW5wdXRzIGdldCBwcm9jZXNzZWQgYXBwcm9wcmlhdGVseS5cbiAqXG4gKiBUaGVyZSBhcmUgKmlucHV0KiBzdG9yZXMgYW5kICpvdXRwdXQqIHN0b3Jlcy4gVGhlICppbnB1dCogc3RvcmVzXG4gKiBhcmUgY29uZmlnSW50ZXJuYWxTdG9yZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUsIGFuZCBjb25maWdFeHRlbnNpb25TdG9yZS4gVGhlXG4gKiBvdXRwdXQgc3RvcmVzIGFyZSBzZXQgaW4gdGhlIGBjb21wdXRlLi4uYCBmdW5jdGlvbnMuIFRoZXkgYXJlIHRoZSBtb2R1bGVcbiAqIGNvbmZpZyBzdG9yZXMsIHRoZSBleHRlbnNpb24gc2xvdCBjb25maWcgc3RvcmVzIChieSBtb2R1bGUpLCB0aGUgZXh0ZW5zaW9uXG4gKiBjb25maWcgc3RvcmVzLCBhbmQgdGhlIGltcGxlbWVudGVyIHRvb2xzIGNvbmZpZyBzdG9yZS5cbiAqXG4gKiBUaGlzIGNvZGUgc2V0cyB1cCB0aGUgc3Vic2NyaXB0aW9ucyBzbyB0aGF0IHdoZW4gYW4gaW5wdXQgc3RvcmUgY2hhbmdlcyxcbiAqIHRoZSBjb3JyZWN0IHNldCBvZiBvdXRwdXQgc3RvcmVzIGFyZSB1cGRhdGVkLlxuICpcbiAqIEFsbCBgY29tcHV0ZS4uLmAgZnVuY3Rpb25zIGV4Y2VwdCBgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3NgIGFyZSBwdXJlXG4gKiAob3IgYXJlIHN1cHBvc2VkIHRvIGJlKSwgb3RoZXIgdGhhbiB0aGUgZmFjdCB0aGF0IHRoZXkgYWxsIGBzZXRTdGF0ZWBcbiAqIHN0b3JlIHZhbHVlcyBhdCB0aGUgZW5kLiBgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3NgIGNhbGxzIGBnZXRHbG9iYWxTdG9yZWAsXG4gKiB3aGljaCBjcmVhdGVzIHN0b3Jlcy5cbiAqLyAvLyBTdG9yZSB1bnN1YnNjcmliZSBmdW5jdGlvbnMgdG8gYWxsb3cgY2xlYW51cCAoZS5nLiwgaW4gdGVzdHMgb3IgaG90IG1vZHVsZSByZWxvYWRpbmcpXG5jb25zdCBjb25maWdTdWJzY3JpcHRpb25zID0gW107XG4vKipcbiAqIFJlY29tcHV0ZXMgYWxsIGNvbmZpZ3VyYXRpb24gZGVyaXZlZCBzdG9yZXMgYmFzZWQgb24gY3VycmVudCBzdGF0ZSBvZiBpbnB1dCBzdG9yZXMuXG4gKiBDYWxsZWQgd2hlbmV2ZXIgYW55IGlucHV0IHN0b3JlIChjb25maWdJbnRlcm5hbFN0b3JlLCB0ZW1wb3JhcnlDb25maWdTdG9yZSwgY29uZmlnRXh0ZW5zaW9uU3RvcmUpIGNoYW5nZXMuXG4gKi8gZnVuY3Rpb24gcmVjb21wdXRlQWxsQ29uZmlncygpIHtcbiAgICBjb25zdCBjb25maWdTdGF0ZSA9IGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCB0ZW1wQ29uZmlnU3RhdGUgPSB0ZW1wb3JhcnlDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGV4dGVuc2lvblN0YXRlID0gY29uZmlnRXh0ZW5zaW9uU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb21wdXRlTW9kdWxlQ29uZmlnKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlRXh0ZW5zaW9uQ29uZmlncyhjb25maWdTdGF0ZSwgZXh0ZW5zaW9uU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG59XG5mdW5jdGlvbiBzZXR1cENvbmZpZ1N1YnNjcmlwdGlvbnMoKSB7XG4gICAgLy8gSW5pdGlhbCBjb21wdXRhdGlvblxuICAgIHJlY29tcHV0ZUFsbENvbmZpZ3MoKTtcbiAgICAvLyBTdWJzY3JpYmUgdG8gYWxsIGlucHV0IHN0b3JlcyB3aXRoIGEgc2luZ2xlIGhhbmRsZXJcbiAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugb25seSByZWNvbXB1dGUgb25jZSBldmVuIGlmIG11bHRpcGxlIHN0b3JlcyBjaGFuZ2Ugc2ltdWx0YW5lb3VzbHlcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2goY29uZmlnSW50ZXJuYWxTdG9yZS5zdWJzY3JpYmUocmVjb21wdXRlQWxsQ29uZmlncykpO1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMucHVzaCh0ZW1wb3JhcnlDb25maWdTdG9yZS5zdWJzY3JpYmUocmVjb21wdXRlQWxsQ29uZmlncykpO1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMucHVzaChjb25maWdFeHRlbnNpb25TdG9yZS5zdWJzY3JpYmUocmVjb21wdXRlQWxsQ29uZmlncykpO1xufVxuLy8gU2V0IHVwIHN1YnNjcmlwdGlvbnMgYXQgbW9kdWxlIGxvYWQgdGltZVxuc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCk7XG5mdW5jdGlvbiBjb21wdXRlTW9kdWxlQ29uZmlnKHN0YXRlLCB0ZW1wU3RhdGUpIHtcbiAgICBmb3IgKGxldCBtb2R1bGVOYW1lIG9mIE9iamVjdC5rZXlzKHN0YXRlLnNjaGVtYXMpKXtcbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgc2NoZW1hIGNvdWxkIGJlIGVpdGhlciBqdXN0IHRoZSBpbXBsaWNpdCBzY2hlbWEgb3IgdGhlIGFjdHVhbGx5XG4gICAgICAgIC8vIGRlZmluZWQgc2NoZW1hLiBXZSBydW4gd2l0aCBqdXN0IHRoZSBpbXBsaWNpdCBzY2hlbWEgYmVjYXVzZSB3ZSB3YW50IHRvIHBvcHVsYXRlXG4gICAgICAgIC8vIHRoZSBjb25maWcgc3RvcmUgd2l0aCB0aGUgdHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFzIHNvb24gYXMgcG9zc2libGUuIEluIGZhY3QsIHRoZVxuICAgICAgICAvLyB0cmFuc2xhdGlvbiBzeXN0ZW0gd2lsbCB0aHJvdyBmb3IgU3VzcGVuc2UgdW50aWwgdGhlIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBhcmVcbiAgICAgICAgLy8gYXZhaWxhYmxlLCB3aGljaCBhcyBvZiB0aGlzIHdyaXRpbmcgYmxvY2tzIHRoZSBzY2hlbWEgZGVmaW5pdGlvbiBmcm9tIG9jY3VycmluZ1xuICAgICAgICAvLyBmb3IgbW9kdWxlcyBsb2FkZWQgYmFzZWQgb24gdGhlaXIgZXh0ZW5zaW9ucy5cbiAgICAgICAgY29uc3QgbW9kdWxlU3RvcmUgPSBnZXRDb25maWdTdG9yZShtb2R1bGVOYW1lKTtcbiAgICAgICAgbGV0IG5ld1N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUubW9kdWxlTG9hZGVkW21vZHVsZU5hbWVdKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGb3JNb2R1bGUobW9kdWxlTmFtZSwgc3RhdGUsIHRlbXBTdGF0ZSk7XG4gICAgICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEobW9kdWxlTmFtZSwgc3RhdGUsIHRlbXBTdGF0ZSk7XG4gICAgICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBtb2R1bGVTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvblNsb3RDb25maWdzKHN0YXRlLCB0ZW1wU3RhdGUpIHtcbiAgICBjb25zdCBzbG90Q29uZmlncyA9IGdldEV4dGVuc2lvblNsb3RDb25maWdzKHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgIGNvbnN0IG5ld1Nsb3RTdG9yZUVudHJpZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoc2xvdENvbmZpZ3MpLm1hcCgoW3Nsb3ROYW1lLCBjb25maWddKT0+W1xuICAgICAgICAgICAgc2xvdE5hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfVxuICAgICAgICBdKSk7XG4gICAgY29uc3Qgc2xvdFN0b3JlID0gZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSgpO1xuICAgIGNvbnN0IG9sZFN0YXRlID0gc2xvdFN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAuLi5vbGRTdGF0ZS5zbG90cyxcbiAgICAgICAgICAgIC4uLm5ld1Nsb3RTdG9yZUVudHJpZXNcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFlcXVhbHMob2xkU3RhdGUuc2xvdHMsIG5ld1N0YXRlLnNsb3RzKSkge1xuICAgICAgICBzbG90U3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnKHN0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IGltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIGNvbmZpZ1xuICAgIH07XG4gICAgLy8gVXNlIGRlZXAgZXF1YWxpdHkgb24gdGhlIGFjdHVhbCBjb25maWcgY29udGVudCwgbm90IHRoZSB3cmFwcGVyIG9iamVjdFxuICAgIGlmICghZXF1YWxzKG9sZFN0YXRlLmNvbmZpZywgbmV3U3RhdGUuY29uZmlnKSkge1xuICAgICAgICBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ1N0YXRlLCBleHRlbnNpb25TdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBtb2R1bGUgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgc2luY2UgdGhlIGV4dGVuc2lvblxuICAgIC8vIGl0IGNvbnRhaW5zIGlzIG1vdW50ZWQuXG4gICAgZm9yIChsZXQgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvblN0YXRlLm1vdW50ZWRFeHRlbnNpb25zKXtcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhleHRlbnNpb24uc2xvdE1vZHVsZU5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25Nb2R1bGVOYW1lLCBleHRlbnNpb24uc2xvdE5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25JZCwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgICAgIGlmICghY29uZmlnc1tleHRlbnNpb24uc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV1bZXh0ZW5zaW9uLmV4dGVuc2lvbklkXSA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zQ29uZmlnU3RvcmUgPSBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBjb25maWdzXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSB0byBvbmx5IHVwZGF0ZSBpZiBjb25maWdzIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAoIWVxdWFscyhvbGRTdGF0ZS5jb25maWdzLCBuZXdTdGF0ZS5jb25maWdzKSkge1xuICAgICAgICBleHRlbnNpb25zQ29uZmlnU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbi8qXG4gKiBBUElcbiAqXG4gKi8gLyoqXG4gKiBUaGlzIGRlZmluZXMgYSBjb25maWd1cmF0aW9uIHNjaGVtYSBmb3IgYSBtb2R1bGUuIFRoZSBzY2hlbWEgdGVsbHMgdGhlXG4gKiBjb25maWd1cmF0aW9uIHN5c3RlbSBob3cgdGhlIG1vZHVsZSBjYW4gYmUgY29uZmlndXJlZC4gSXQgc3BlY2lmaWVzXG4gKiB3aGF0IG1ha2VzIGNvbmZpZ3VyYXRpb24gdmFsaWQgb3IgaW52YWxpZC5cbiAqXG4gKiBTZWUgW0NvbmZpZ3VyYXRpb24gU3lzdGVtXShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZG9jcy9jb25maWd1cmF0aW9uLXN5c3RlbSlcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlZmluaW5nIGEgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBOYW1lIG9mIHRoZSBtb2R1bGUgdGhlIHNjaGVtYSBpcyBiZWluZyBkZWZpbmVkIGZvci4gR2VuZXJhbGx5XG4gKiAgIHNob3VsZCBiZSB0aGUgb25lIGluIHdoaWNoIHRoZSBgZGVmaW5lQ29uZmlnU2NoZW1hYCBjYWxsIHRha2VzIHBsYWNlLlxuICogQHBhcmFtIHNjaGVtYSBUaGUgY29uZmlnIHNjaGVtYSBmb3IgdGhlIG1vZHVsZVxuICovIGV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hKSB7XG4gICAgdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hKTtcbiAgICBjb25zdCBlbmhhbmNlZFNjaGVtYSA9IG1lcmdlRGVlcFJpZ2h0KHNjaGVtYSwgaW1wbGljaXRDb25maWdTY2hlbWEpO1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsZXJ0cyB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gdGhhdCBhIG1vZHVsZSBleGlzdHMuIFRoaXMgYWxsb3dzIGNvbmZpZyB0byBiZVxuICogcHJvY2Vzc2VkLCB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgZXh0ZW5zaW9uIHN5c3RlbSB0byBrbm93IHdoZXRoZXIgdGhlIG1vZHVsZSBoYXNcbiAqIGFjdHVhbGx5IGhhZCBpdHMgZnJvbnQgYnVuZGxlIGV4ZWN1dGVkIHlldC5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gZXNtLWFwcC1zaGVsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSBtb2R1bGVOYW1lXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlV2l0aENvbmZpZ1N5c3RlbShtb2R1bGVOYW1lKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2NoZW1hcyxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IGltcGxpY2l0Q29uZmlnU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBhbGVydHMgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIHRoYXQgYSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG1vZHVsZU5hbWVcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVMb2FkKG1vZHVsZU5hbWUpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsbG93cyB0aGUgY29uZmlnIHN5c3RlbSB0byBzdXBwb3J0IHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgbmFtZXNwYWNlcyB0aGF0XG4gKiBkbyBub3QgY29ycmVzcG9uZCB0byBtb2R1bGVzLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG5hbWVzcGFjZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlKG5hbWVzcGFjZSkge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW25hbWVzcGFjZV06IHRyYW5zbGF0aW9uT3ZlcnJpZGVzU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGFuIGV4dGVuc2lvbi4gV2hlbiBhIHNjaGVtYSBpcyBkZWZpbmVkXG4gKiBmb3IgYW4gZXh0ZW5zaW9uLCB0aGF0IGV4dGVuc2lvbiB3aWxsIHJlY2VpdmUgdGhlIGNvbmZpZ3VyYXRpb24gY29ycmVzcG9uZGluZ1xuICogdG8gdGhhdCBzY2hlbWEsIHJhdGhlciB0aGFuIHRoZSBjb25maWd1cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZVxuICogaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC5cbiAqXG4gKiBUaGUgc2NoZW1hIHRlbGxzIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBob3cgdGhlIG1vZHVsZSBjYW4gYmUgY29uZmlndXJlZC5cbiAqIEl0IHNwZWNpZmllcyB3aGF0IG1ha2VzIGNvbmZpZ3VyYXRpb24gdmFsaWQgb3IgaW52YWxpZC5cbiAqXG4gKiBTZWUgW0NvbmZpZ3VyYXRpb24gU3lzdGVtXShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZG9jcy9jb25maWd1cmF0aW9uLXN5c3RlbSlcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlZmluaW5nIGEgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBOYW1lIG9mIHRoZSBleHRlbnNpb24gdGhlIHNjaGVtYSBpcyBiZWluZyBkZWZpbmVkIGZvci5cbiAqICAgU2hvdWxkIG1hdGNoIHRoZSBgbmFtZWAgb2Ygb25lIG9mIHRoZSBgZXh0ZW5zaW9uc2AgZW50cmllcyBkZWZpbmVkIGluXG4gKiAgIHRoZSBhcHAncyBgcm91dGVzLmpzb25gIGZpbGUuXG4gKiBAcGFyYW0gc2NoZW1hIFRoZSBjb25maWcgc2NoZW1hIGZvciB0aGUgZXh0ZW5zaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbkNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpO1xuICAgIGNvbnN0IGVuaGFuY2VkU2NoZW1hID0gbWVyZ2VEZWVwUmlnaHQoc2NoZW1hLCBpbXBsaWNpdENvbmZpZ1NjaGVtYSk7XG4gICAgY29uc3Qgc3RhdGUgPSBjb25maWdJbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgaWYgKHN0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ29uZmlnIHNjaGVtYSBmb3IgZXh0ZW5zaW9uICR7ZXh0ZW5zaW9uTmFtZX0gYWxyZWFkeSBleGlzdHMuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBleHRlbnNpb25zIHdpdGggdGhpcyBzYW1lIG5hbWUsIG9uZSB3aWxsIHByb2JhYmx5IGNyYXNoLmApO1xuICAgIH1cbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHNjaGVtYXM6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zY2hlbWFzLFxuICAgICAgICAgICAgICAgIFtleHRlbnNpb25OYW1lXTogZW5oYW5jZWRTY2hlbWFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGUoY29uZmlnLCBzb3VyY2VOYW1lID0gJ3Byb3ZpZGVkJykge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgcHJvdmlkZWRDb25maWdzOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUucHJvdmlkZWRDb25maWdzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogQSBwcm9taXNlLWJhc2VkIHdheSB0byBhY2Nlc3MgdGhlIGNvbmZpZyBhcyBzb29uIGFzIGl0IGlzIGZ1bGx5IGxvYWRlZC5cbiAqIElmIGl0IGlzIGFscmVhZHkgbG9hZGVkLCByZXNvbHZlcyB0aGUgY29uZmlnIGluIGl0cyBwcmVzZW50IHN0YXRlLlxuICpcbiAqIFRoaXMgaXMgYSB1c2VmdWwgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZ2V0IHRoZSBjb25maWcgaW4gdGhlIGNvdXJzZVxuICogb2YgdGhlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgZm9yIHdoaWNoIHRvIGxvb2sgdXAgdGhlIGNvbmZpZ1xuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcobW9kdWxlTmFtZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PntcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBnZXRDb25maWdTdG9yZShtb2R1bGVOYW1lKTtcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUubG9hZGVkICYmIHN0YXRlLmNvbmZpZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IG9taXQoW1xuICAgICAgICAgICAgICAgICAgICAnRGlzcGxheSBjb25kaXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcydcbiAgICAgICAgICAgICAgICBdLCBzdGF0ZS5jb25maWcpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHN0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSh1cGRhdGUpO1xuICAgIH0pO1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25PdmVycmlkZXMobW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKT0+e1xuICAgICAgICAgICAgY29uc3QgY29uZmlnU3RvcmUgPSBnZXRDb25maWdTdG9yZShtb2R1bGVOYW1lKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS50cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXMgPSBzdGF0ZS5jb25maWdbJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyddID8/IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRyYW5zbGF0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlKGNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb25maWdTdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICAgICAgfSlcbiAgICBdO1xuICAgIGlmIChzbG90TmFtZSAmJiBleHRlbnNpb25JZCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlKT0+e1xuICAgICAgICAgICAgY29uc3QgY29uZmlnU3RvcmUgPSBnZXRFeHRlbnNpb25Db25maWcoc2xvdE5hbWUsIGV4dGVuc2lvbklkKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5sb2FkZWQgJiYgc3RhdGUuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uT3ZlcnJpZGVzID0gc3RhdGUuY29uZmlnWydUcmFuc2xhdGlvbiBvdmVycmlkZXMnXSA/PyB7fTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cmFuc2xhdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZShjb25maWdTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gY29uZmlnU3RvcmUuc3Vic2NyaWJlKHVwZGF0ZSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cbi8qKlxuICogVmFsaWRhdGUgYW5kIGludGVycG9sYXRlIGRlZmF1bHRzIGZvciBgcHJvdmlkZWRDb25maWdgIGFjY29yZGluZyB0byBgc2NoZW1hYFxuICpcbiAqIEBwYXJhbSBzY2hlbWEgIGEgY29uZmlndXJhdGlvbiBzY2hlbWFcbiAqIEBwYXJhbSBwcm92aWRlZENvbmZpZyAgYW4gb2JqZWN0IG9mIGNvbmZpZyB2YWx1ZXMgKHdpdGhvdXQgdGhlIHRvcC1sZXZlbCBtb2R1bGUgbmFtZSlcbiAqIEBwYXJhbSBrZXlQYXRoQ29udGV4dCAgYSBkb3QtZGVwYXJhdGVkIHN0cmluZyB3aGljaCBoZWxwcyB0aGUgdXNlciBmaWd1cmUgb3V0IHdoZXJlXG4gKiAgICAgdGhlIHByb3ZpZGVkIGNvbmZpZyBjYW1lIGZyb21cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uZmlnKHNjaGVtYSwgcHJvdmlkZWRDb25maWcsIGtleVBhdGhDb250ZXh0KSB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBwcm92aWRlZENvbmZpZywga2V5UGF0aENvbnRleHQpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgcHJvdmlkZWRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIGtleVBhdGhDb250ZXh0KTtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqXG4gKi8gLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZvciBhbiBleHRlbnNpb24uIFRoaXMgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpY1xuICogdG8gdGhlIHNsb3QgaW4gd2hpY2ggaXQgaXMgbW91bnRlZCwgYW5kIGl0cyBJRCB3aXRoaW4gdGhhdCBzbG90LlxuICpcbiAqIFRoZSBzY2hlbWEgZm9yIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGUgZXh0ZW5zaW9uIHNjaGVtYS4gSWYgbm8gZXh0ZW5zaW9uXG4gKiBzY2hlbWEgaGFzIGJlZW4gcHJvdmlkZWQsIHRoZSBzY2hlbWEgdXNlZCBpcyB0aGUgc2NoZW1hIG9mIHRoZSBtb2R1bGUgaW5cbiAqIHdoaWNoIHRoZSBleHRlbnNpb24gaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gc2xvdE1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbk1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gKGFuZCB0aGVyZWZvcmUgdGhlIGNvbmZpZyBzY2hlbWEpXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBzbG90IHdoZXJlIHRoZSBleHRlbnNpb24gaXMgbW91bnRlZFxuICogQHBhcmFtIGV4dGVuc2lvbklkIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIGluIGl0cyBzbG90XG4gKi8gZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhzbG90TW9kdWxlTmFtZSwgZXh0ZW5zaW9uTW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZ1NjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV07XG4gICAgY29uc3QgbmFtZU9mU2NoZW1hU291cmNlID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8gZXh0ZW5zaW9uTmFtZSA6IGV4dGVuc2lvbk1vZHVsZU5hbWU7XG4gICAgY29uc3QgcHJvdmlkZWRDb25maWdzID0gZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbnN0IHNsb3RNb2R1bGVDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3Ioc2xvdE1vZHVsZU5hbWUsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29uZmlnT3ZlcnJpZGUgPSBzbG90TW9kdWxlQ29uZmlnPy5leHRlbnNpb25TbG90cz8uW3Nsb3ROYW1lXT8uY29uZmlndXJlPy5bZXh0ZW5zaW9uSWRdID8/IHt9O1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IG1lcmdlQ29uZmlnc0ZvcihuYW1lT2ZTY2hlbWFTb3VyY2UsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29tYmluZWRDb25maWcgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICBleHRlbnNpb25Db25maWcsXG4gICAgICAgIGNvbmZpZ092ZXJyaWRlXG4gICAgXSk7XG4gICAgY29uc3Qgc2NoZW1hID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8/IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTW9kdWxlTmFtZV07XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb21iaW5lZENvbmZpZywgbmFtZU9mU2NoZW1hU291cmNlKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGNvbWJpbmVkQ29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBuYW1lT2ZTY2hlbWFTb3VyY2UpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGxldCByZXN1bHQgPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhjbG9uZShjb25maWdTdGF0ZS5zY2hlbWFzKSk7XG4gICAgY29uc3QgY29uZmlnc0FuZFNvdXJjZXMgPSBbXG4gICAgICAgIC4uLmNvbmZpZ1N0YXRlLnByb3ZpZGVkQ29uZmlncy5tYXAoKGMpPT5bXG4gICAgICAgICAgICAgICAgYy5jb25maWcsXG4gICAgICAgICAgICAgICAgYy5zb3VyY2VcbiAgICAgICAgICAgIF0pLFxuICAgICAgICBbXG4gICAgICAgICAgICB0ZW1wQ29uZmlnU3RhdGUuY29uZmlnLFxuICAgICAgICAgICAgJ3RlbXBvcmFyeSBjb25maWcnXG4gICAgICAgIF1cbiAgICBdO1xuICAgIGZvciAobGV0IFtjb25maWcsIHNvdXJjZV0gb2YgY29uZmlnc0FuZFNvdXJjZXMpe1xuICAgICAgICByZXN1bHQgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUoY29uZmlnLCBzb3VyY2UpXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMoc2NoZW1hKSB7XG4gICAgaWYgKHNjaGVtYS5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc2NoZW1hLFxuICAgICAgICAgICAgX3ZhbHVlOiBzY2hlbWEuX2RlZmF1bHQsXG4gICAgICAgICAgICBfc291cmNlOiAnZGVmYXVsdCdcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzT3JkaW5hcnlPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICAgICAgb2JqW2tleV0gPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhzY2hlbWFba2V5XSk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgdGhlIHNjaGVtYSBpcyBiYWQgYW5kIGFuIGVycm9yIHdpbGwgaGF2ZSBiZWVuIGxvZ2dlZCBkdXJpbmcgc2NoZW1hIHZhbGlkYXRpb25cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlKGNvbmZpZywgc291cmNlKSB7XG4gICAgaWYgKGlzT3JkaW5hcnlPYmplY3QoY29uZmlnKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICAgICAgb2JqW2tleV0gPSBjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZShjb25maWdba2V5XSwgc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX3ZhbHVlOiBjb25maWcsXG4gICAgICAgICAgICBfc291cmNlOiBzb3VyY2VcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb25TbG90Q29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgYWxsQ29uZmlncyA9IG1lcmdlQ29uZmlncyhnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkpO1xuICAgIGNvbnN0IHNsb3RDb25maWdQZXJNb2R1bGUgPSBPYmplY3Qua2V5cyhhbGxDb25maWdzKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICBpZiAoYWxsQ29uZmlnc1trZXldPy5leHRlbnNpb25TbG90cykge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBhbGxDb25maWdzW2tleV0/LmV4dGVuc2lvblNsb3RzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30pO1xuICAgIHZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc2xvdENvbmZpZ1Blck1vZHVsZSk7XG4gICAgY29uc3Qgc2xvdENvbmZpZ3MgPSBPYmplY3Qua2V5cyhzbG90Q29uZmlnUGVyTW9kdWxlKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICBvYmogPSB7XG4gICAgICAgICAgICAuLi5vYmosXG4gICAgICAgICAgICAuLi5zbG90Q29uZmlnUGVyTW9kdWxlW2tleV1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuIHNsb3RDb25maWdzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVBbGxFeHRlbnNpb25TbG90Q29uZmlncyhzbG90Q29uZmlnUGVyTW9kdWxlKSB7XG4gICAgZm9yIChsZXQgW21vZHVsZU5hbWUsIGNvbmZpZ0J5U2xvdE5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHNsb3RDb25maWdQZXJNb2R1bGUpKXtcbiAgICAgICAgZm9yIChsZXQgW3Nsb3ROYW1lLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ0J5U2xvdE5hbWUpKXtcbiAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyhjb25maWcsIG1vZHVsZU5hbWUsIHNsb3ROYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyhjb25maWcsIG1vZHVsZU5hbWUsIHNsb3ROYW1lKSB7XG4gICAgY29uc3Qga2V5UGF0aCA9IGAke21vZHVsZU5hbWV9LmV4dGVuc2lvblNsb3RzLiR7c2xvdE5hbWV9YDtcbiAgICBjb25zdCBlcnJvclByZWZpeCA9IGBFeHRlbnNpb24gc2xvdCBjb25maWcgJyR7a2V5UGF0aH0nYDtcbiAgICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKGNvbmZpZykuZmlsdGVyKChrKT0+IVtcbiAgICAgICAgICAgICdhZGQnLFxuICAgICAgICAgICAgJ3JlbW92ZScsXG4gICAgICAgICAgICAnb3JkZXInLFxuICAgICAgICAgICAgJ2NvbmZpZ3VyZSdcbiAgICAgICAgXS5pbmNsdWRlcyhrKSk7XG4gICAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCkge1xuICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAnIGNvbnRhaW5zIGludmFsaWQga2V5cyAnJHtpbnZhbGlkS2V5cy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGlmIChjb25maWcuYWRkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcuYWRkKSB8fCAhY29uZmlnLmFkZC5ldmVyeSgobik9PnR5cGVvZiBuID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5hZGQnIGlzIGludmFsaWQuIE11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyAoZXh0ZW5zaW9uIElEcylgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlbW92ZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLnJlbW92ZSkgfHwgIWNvbmZpZy5yZW1vdmUuZXZlcnkoKG4pPT50eXBlb2YgbiA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAucmVtb3ZlJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5vcmRlcikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLm9yZGVyKSB8fCAhY29uZmlnLm9yZGVyLmV2ZXJ5KChuKT0+dHlwZW9mIG4gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLm9yZGVyJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5jb25maWd1cmUpIHtcbiAgICAgICAgaWYgKCFpc09yZGluYXJ5T2JqZWN0KGNvbmZpZy5jb25maWd1cmUpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAuY29uZmlndXJlJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIG9iamVjdCB3aXRoIGV4dGVuc2lvbiBJRHMgZm9yIGtleXNgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgLi4uY29uZmlnU3RhdGUucHJvdmlkZWRDb25maWdzLm1hcCgoYyk9PmMuY29uZmlnKSxcbiAgICAgICAgdGVtcENvbmZpZ1N0YXRlLmNvbmZpZ1xuICAgIF07XG59XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgY29uZmlnIHNjaGVtYSBmb3IgYSBtb2R1bGUuIFNpbmNlIHByb2JsZW1zIGlkZW50aWZpZWQgaGVyZSBhcmUgcHJvZ3JhbW1pbmcgZXJyb3JzXG4gKiB0aGF0IGhvcGVmdWxseSB3aWxsIGJlIGNhdWdodCBkdXJpbmcgZGV2ZWxvcG1lbnQsIHRoaXMgZnVuY3Rpb24gbG9ncyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUgZGlyZWN0bHk7XG4gKiBpdCdzIGZpbmUgaWYgd2Ugc3BhbSB0aGUgdXNlciB3aXRoIHRoZXNlIGVycm9ycy5cbiAqLyBmdW5jdGlvbiB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBzY2hlbWEsIGtleVBhdGggPSAnJykge1xuICAgIGNvbnN0IHVwZGF0ZU1lc3NhZ2UgPSBgUGxlYXNlIHZlcmlmeSB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kLCBpZiBzbywgYWxlcnQgdGhlIG1haW50YWluZXIuYDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoayk9PiFrLnN0YXJ0c1dpdGgoJ18nKSkpe1xuICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAoa2V5UGF0aCAmJiAnLicpICsga2V5O1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIGlmICh0aGlzS2V5UGF0aCA9PT0gJ0Rpc3BsYXkgY29uZGl0aW9ucycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gZGVjbGFyZXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBjYWxsZWQgXCJEaXNwbGF5IGNvbmRpdGlvbnNcIjsgdGhlIFwiRGlzcGxheSBjb25kaXRpb25zXCIgb3B0aW9uIGlzIGEgcmVzZXJ2ZWQgbmFtZS4gJHt1cGRhdGVNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzS2V5UGF0aCA9PT0gJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gZGVjbGFyZXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBjYWxsZWQgXCJUcmFuc2xhdGlvbiBvdmVycmlkZXNcIjsgdGhlIFwiVHJhbnNsYXRpb24gb3ZlcnJpZGVzXCIgb3B0aW9uIGlzIGEgcmVzZXJ2ZWQgbmFtZS4gJHt1cGRhdGVNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNPcmRpbmFyeU9iamVjdChzY2hlbWFQYXJ0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgYmFkIGNvbmZpZyBzY2hlbWEgZGVmaW5pdGlvbiBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkge1xuICAgICAgICAgICAgLy8gcmVjdXJzZSBmb3IgbmVzdGVkIGNvbmZpZyBrZXlzXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBzY2hlbWFQYXJ0LCB0aGlzS2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBzY2hlbWFQYXJ0Ll9lbGVtZW50cztcbiAgICAgICAgaWYgKGhhc09iamVjdFNjaGVtYShlbGVtZW50cykpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIGVsZW1lbnRzLCB0aGlzS2V5UGF0aCArICcuX2VsZW1lbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3ZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHZhbGlkYXRvciBvZiBzY2hlbWFQYXJ0Ll92YWxpZGF0b3JzKXtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBpbnZhbGlkIHZhbGlkYXRvciBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScgJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdmFsaWRhdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBlaXRoZXIgYCArIGB1bmRlZmluZWQgb3IgYW4gZXJyb3Igc3RyaW5nLiBSZWNlaXZlZCAke3ZhbGlkYXRvcn0uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHNjaGVtYVBhcnQuX3R5cGU7XG4gICAgICAgIGlmICh2YWx1ZVR5cGUgJiYgIU9iamVjdC52YWx1ZXMoVHlwZSkuaW5jbHVkZXModmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgaW52YWxpZCB0eXBlIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9JyAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiB0aGUgYWxsb3dlZCB0eXBlcyBhcmUgJHtPYmplY3QudmFsdWVzKFR5cGUpLmpvaW4oJywgJyl9LiBgICsgYFJlY2VpdmVkICcke3ZhbHVlVHlwZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYVBhcnQpLmV2ZXJ5KChrKT0+W1xuICAgICAgICAgICAgICAgICdfZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICdfdmFsaWRhdG9ycycsXG4gICAgICAgICAgICAgICAgJ19lbGVtZW50cycsXG4gICAgICAgICAgICAgICAgJ190eXBlJ1xuICAgICAgICAgICAgXS5pbmNsdWRlcyhrKSkgJiYgIWtleVBhdGguaW5jbHVkZXMoJy5fZWxlbWVudHMnKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgYmFkIGNvbmZpZyBzY2hlbWEgZGVmaW5pdGlvbiBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScuICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IGFsbCBjb25maWcgZWxlbWVudHMgbXVzdCBoYXZlIGEgZGVmYXVsdC4gYCArIGBSZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KHNjaGVtYVBhcnQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50cyAmJiB2YWx1ZVR5cGUgJiYgIVtcbiAgICAgICAgICAgIFR5cGUuQXJyYXksXG4gICAgICAgICAgICBUeXBlLk9iamVjdFxuICAgICAgICBdLmluY2x1ZGVzKHZhbHVlVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiB0aGUgJ2VsZW1lbnRzJyBrZXkgb25seSB3b3JrcyB3aXRoICdfdHlwZScgZXF1YWwgdG8gJ0FycmF5JyBvciAnT2JqZWN0Jy4gYCArIGBSZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KHZhbHVlVHlwZSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRDb25maWdGb3JNb2R1bGUobW9kdWxlTmFtZSwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbbW9kdWxlTmFtZV07XG4gICAgY29uc3QgaW5wdXRDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3IobW9kdWxlTmFtZSwgZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGlucHV0Q29uZmlnLCBtb2R1bGVOYW1lKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGlucHV0Q29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBtb2R1bGVOYW1lKTtcbiAgICBkZWxldGUgY29uZmlnLmV4dGVuc2lvblNsb3RzO1xuICAgIHJldHVybiBjb25maWc7XG59XG5mdW5jdGlvbiBnZXRDb25maWdGb3JNb2R1bGVJbXBsaWNpdFNjaGVtYShtb2R1bGVOYW1lLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgaW5wdXRDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3IobW9kdWxlTmFtZSwgZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhpbXBsaWNpdENvbmZpZ1NjaGVtYSwgaW5wdXRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoaW1wbGljaXRDb25maWdTY2hlbWEsIGNvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgZGVsZXRlIGNvbmZpZy5leHRlbnNpb25TbG90cztcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGFsbENvbmZpZ3MpIHtcbiAgICBjb25zdCBhbGxDb25maWdzRm9yTW9kdWxlID0gYWxsQ29uZmlncy5tYXAoKHsgW21vZHVsZU5hbWVdOiBjIH0pPT5jKS5maWx0ZXIoKGMpPT4hIWMpO1xuICAgIHJldHVybiBtZXJnZUNvbmZpZ3MoYWxsQ29uZmlnc0Zvck1vZHVsZSk7XG59XG5mdW5jdGlvbiBtZXJnZUNvbmZpZ3MoY29uZmlncykge1xuICAgIGNvbnN0IG1lcmdlRGVlcEFsbCA9IHJlZHVjZShtZXJnZURlZXBSaWdodCk7XG4gICAgcmV0dXJuIG1lcmdlRGVlcEFsbCh7fSwgY29uZmlncyk7XG59XG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWcgdHJlZSB0byBtYWtlIHN1cmUgdGhhdCBhbGxcbiAqIG9mIHRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIGV4aXN0IGluIHRoZSBzY2hlbWEsIGFuZCB0aGF0IHR5cGVzIGFyZVxuICogY29ycmVjdC4gRG9lcyBub3QgcnVuIHZhbGlkYXRvcnMgeWV0LCBzaW5jZSB0aG9zZSB3aWxsIGJlIHJ1biBvblxuICogdGhlIGNvbmZpZyB3aXRoIHRoZSBkZWZhdWx0cyBmaWxsZWQgaW4uXG4gKi8gZnVuY3Rpb24gdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb25maWcsIGtleVBhdGggPSAnJykge1xuICAgIC8vIHZhbGlkYXRlIGVhY2ggY29uc3RpdHVlbnQgZWxlbWVudFxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpe1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAnLicgKyBrZXk7XG4gICAgICAgIGNvbnN0IHNjaGVtYVBhcnQgPSBzY2hlbWFba2V5XTtcbiAgICAgICAgaWYgKCFzY2hlbWEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgaWYgKCEoa2V5ID09PSAnZXh0ZW5zaW9uU2xvdHMnICYmIGtleVBhdGggIT09ICcnKSkge1xuICAgICAgICAgICAgICAgIGxvZ0Vycm9yKHRoaXNLZXlQYXRoLCBgVW5rbm93biBjb25maWcga2V5ICcke3RoaXNLZXlQYXRofScgcHJvdmlkZWQuIElnbm9yaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUoc2NoZW1hUGFydCwgdmFsdWUsIHRoaXNLZXlQYXRoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCkge1xuICAgIGNoZWNrVHlwZShrZXlQYXRoLCBzY2hlbWFQYXJ0Ll90eXBlLCB2YWx1ZSk7XG4gICAgaWYgKGlzT3JkaW5hcnlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLk9iamVjdCkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgYXMgZnJlZWZvcm0gb2JqZWN0XG4gICAgICAgICAgICB2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICghKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX3R5cGUnKSkpIHtcbiAgICAgICAgICAgIC8vIHZhbGlkYXRlIGFzIG5vcm1hbCBuZXN0ZWQgY29uZmlnXG4gICAgICAgICAgICB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2NoZW1hUGFydC5fdHlwZSA9PT0gVHlwZS5BcnJheSkge1xuICAgICAgICAgICAgdmFsaWRhdGVBcnJheVN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlKGZyZWVmb3JtT2JqZWN0U2NoZW1hLCBjb25maWcsIGtleVBhdGgpIHtcbiAgICBpZiAoZnJlZWZvcm1PYmplY3RTY2hlbWEuX2VsZW1lbnRzKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdba2V5XTtcbiAgICAgICAgICAgIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKGZyZWVmb3JtT2JqZWN0U2NoZW1hLl9lbGVtZW50cywgdmFsdWUsIGAke2tleVBhdGh9LiR7a2V5fWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVBcnJheVN0cnVjdHVyZShhcnJheVNjaGVtYSwgdmFsdWUsIGtleVBhdGgpIHtcbiAgICBjb25zdCB2YWxpZGF0ZWRBc0FycmF5ID0gY2hlY2tUeXBlKGtleVBhdGgsIFR5cGUuQXJyYXksIHZhbHVlKTtcbiAgICBpZiAoIXZhbGlkYXRlZEFzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBhcnJheSBlbGVtZW50IG9iamVjdCBzY2hlbWEsIHZlcmlmeSB0aGF0IGVsZW1lbnRzIG1hdGNoIGl0XG4gICAgaWYgKGhhc09iamVjdFNjaGVtYShhcnJheVNjaGVtYS5fZWxlbWVudHMpKSB7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShhcnJheVNjaGVtYS5fZWxlbWVudHMsIHZhbHVlW2ldLCBgJHtrZXlQYXRofVske2l9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNoZWNrVHlwZShgJHtrZXlQYXRofVske2l9XWAsIGFycmF5U2NoZW1hLl9lbGVtZW50cz8uX3R5cGUsIHZhbHVlW2ldKTtcbiAgICB9XG59XG4vKipcbiAqIFJ1biBhbGwgdGhlIHZhbGlkYXRvcnMgaW4gdGhlIGNvbmZpZyB0cmVlLiBUaGlzIHNob3VsZCBiZSBydW5cbiAqIG9uIHRoZSBjb25maWcgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIGZpbGxlZCBpbiB3aXRoIGFsbCB0aGUgZGVmYXVsdHMsIHNpbmNlXG4gKiBoaWdoZXItbGV2ZWwgdmFsaWRhdG9ycyBtYXkgcmVmZXIgdG8gZGVmYXVsdCB2YWx1ZXMuXG4gKi8gZnVuY3Rpb24gcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aCA9ICcnKSB7XG4gICAgLy8gSWYgYCFzY2hlbWFgLCB0aGVyZSBzaG91bGQgaGF2ZSBiZWVuIGEgc3RydWN0dXJhbCB2YWxpZGF0aW9uIGVycm9yIHByaW50ZWQgYWxyZWFkeS5cbiAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgIGlmIChjb25maWcgIT09IHNjaGVtYS5fZGVmYXVsdCkge1xuICAgICAgICAgICAgcnVuVmFsaWRhdG9ycyhrZXlQYXRoLCBzY2hlbWEuX3ZhbGlkYXRvcnMsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT3JkaW5hcnlPYmplY3QoY29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAnLicgKyBrZXk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWEuX3R5cGUgPT09IFR5cGUuT2JqZWN0ICYmIHNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEuX2VsZW1lbnRzLCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hUGFydCwgdmFsdWUsIHRoaXNLZXlQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb25maWcpICYmIHNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjb25maWcubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLl9lbGVtZW50cywgY29uZmlnW2ldLCBgJHtrZXlQYXRofVske2l9XWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBSdW4gdHlwZSB2YWxpZGF0aW9uIGZvciB0aGUgdmFsdWUsIGxvZ2dpbmcgYW55IGVycm9ycy5cbiAqIEByZXR1cm5zIHRydWUgaWYgdmFsaWRhdGlvbiBwYXNzZXMsIGZhbHNlIG90aGVyd2lzZVxuICovIGZ1bmN0aW9uIGNoZWNrVHlwZShrZXlQYXRoLCBfdHlwZSwgdmFsdWUpIHtcbiAgICBpZiAoX3R5cGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB7XG4gICAgICAgICAgICBBcnJheTogaXNBcnJheSxcbiAgICAgICAgICAgIEJvb2xlYW46IGlzQm9vbGVhbixcbiAgICAgICAgICAgIENvbmNlcHRVdWlkOiBpc1V1aWQsXG4gICAgICAgICAgICBOdW1iZXI6IGlzTnVtYmVyLFxuICAgICAgICAgICAgT2JqZWN0OiBpc09iamVjdCxcbiAgICAgICAgICAgIFN0cmluZzogaXNTdHJpbmcsXG4gICAgICAgICAgICBVVUlEOiBpc1V1aWQsXG4gICAgICAgICAgICBQZXJzb25BdHRyaWJ1dGVUeXBlVXVpZDogaXNVdWlkLFxuICAgICAgICAgICAgUGF0aWVudElkZW50aWZpZXJUeXBlVXVpZDogaXNVdWlkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBydW5WYWxpZGF0b3JzKGtleVBhdGgsIFtcbiAgICAgICAgICAgIHZhbGlkYXRvcltfdHlwZV1cbiAgICAgICAgXSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogUnVucyB2YWxpZGF0b3JzLCBsb2dnaW5nIGVycm9ycy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYWxsIHBhc3MsIGZhbHNlIG90aGVyd2lzZS5cbiAqLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG5mdW5jdGlvbiBydW5WYWxpZGF0b3JzKGtleVBhdGgsIHZhbGlkYXRvcnMsIHZhbHVlKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gdHJ1ZTtcbiAgICBpZiAodmFsaWRhdG9ycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpe1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvclJlc3VsdCA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3JSZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gYEludmFsaWQgY29uZmlndXJhdGlvbiBmb3IgJHtrZXlQYXRofTogJHt2YWxpZGF0b3JSZXN1bHR9YCA6IGBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gdmFsdWUgJHt2YWx1ZX0gZm9yICR7a2V5UGF0aH06ICR7dmFsaWRhdG9yUmVzdWx0fWA7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU2tpcHBpbmcgaW52YWxpZCB2YWxpZGF0b3IgYXQgXCIke2tleVBhdGh9XCIuIEVuY291bnRlcmVkIGVycm9yXFxuXFx0JHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbi8vIFJlY3Vyc2l2ZWx5IGZpbGwgaW4gdGhlIGNvbmZpZyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBzY2hlbWEuXG5jb25zdCBzZXREZWZhdWx0cyA9IChzY2hlbWEsIGlucHV0Q29uZmlnKT0+e1xuICAgIGNvbnN0IGNvbmZpZyA9IGNsb25lKGlucHV0Q29uZmlnKTtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKXtcbiAgICAgICAgY29uc3QgY29uZmlnUGFydCA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIC8vIFRoZSBgc2NoZW1hUGFydCAmJmAgY2xhdXNlIG9mIHRoaXMgYGlmYCBzdGF0ZW1lbnQgd2lsbCBvbmx5IGZhaWxcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2ZXJ5IGludmFsaWQuIEl0IGlzIHRoZXJlIHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tXG4gICAgICAgIC8vIGNyYXNoaW5nIGNvbXBsZXRlbHksIHRob3VnaCBpdCB3aWxsIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB0aGVyZSBzaG91bGQgYmUgbGVnaWJsZSBlcnJvcnMgaW4gdGhlIGNvbnNvbGUgZnJvbVxuICAgICAgICAvLyB0aGUgc2NoZW1hIHZhbGlkYXRvci5cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQgJiYgKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ190eXBlJykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHNjaGVtYVBhcnQgZGVmaW5lcyBhIGNvbmZpZyB2YWx1ZSwgc2luY2UgaXQgaGFzXG4gICAgICAgICAgICAvLyBhIHByb3BlcnR5IGBfdHlwZWAgb3IgYF9kZWZhdWx0YC5cbiAgICAgICAgICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHNjaGVtYVBhcnRbJ19kZWZhdWx0J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIGl0IGlzIGFuIG9iamVjdCBvciBhcnJheSB3aXRoIG9iamVjdCBlbGVtZW50cywgaW4gd2hpY2ggY2FzZSB3ZSByZWN1cnNlXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNjaGVtYVBhcnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhcnQgJiYgaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5ICYmIEFycmF5LmlzQXJyYXkoY29uZmlnUGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnV2l0aERlZmF1bHRzID0gY29uZmlnUGFydC5tYXAoKGNvbmYpPT5zZXREZWZhdWx0cyhlbGVtZW50cywgY29uZikpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IGNvbmZpZ1dpdGhEZWZhdWx0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyhjb25maWdQYXJ0KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdQYXJ0W29iamVjdEtleV0gPSBzZXREZWZhdWx0cyhlbGVtZW50cywgY29uZmlnUGFydFtvYmplY3RLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYVBhcnQpKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBzY2hlbWFQYXJ0IGhhcyBubyBwcm9wZXJ0eSBcIl90eXBlXCIsIGlmIGl0J3MgYW4gb3JkaW5hcnkgb2JqZWN0XG4gICAgICAgICAgICAvLyAodW5saWtlLCBpbXBvcnRhbnRseSwgdGhlIHZhbGlkYXRvcnMgYXJyYXkpLCB3ZSBhc3N1bWUgaXQgaXMgYSBwYXJlbnQgY29uZmlnIHByb3BlcnR5LlxuICAgICAgICAgICAgLy8gV2UgcmVjdXJzZSB0byBjb25maWdba2V5XSBhbmQgc2NoZW1hW2tleV0uIERlZmF1bHQgY29uZmlnW2tleV0gdG8ge30uXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbmZpZ1BhcnQgPSBjb25maWdQYXJ0ID8/IHt9O1xuICAgICAgICAgICAgLy8gVGhlcmUgd2lsbCBoYXZlIGJlZW4gYSB2YWxpZGF0aW9uIGVycm9yIGFscmVhZHkgaWYgY29uZmlnUGFydCBpcyBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChzZWxlY3RlZENvbmZpZ1BhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSBzZXREZWZhdWx0cyhzY2hlbWFQYXJ0LCBzZWxlY3RlZENvbmZpZ1BhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuZnVuY3Rpb24gaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzU2NoZW1hKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudHNTY2hlbWEgJiYgT2JqZWN0LmtleXMoZWxlbWVudHNTY2hlbWEpLmZpbHRlcigoZSk9PiFbXG4gICAgICAgICAgICAnX2RlZmF1bHQnLFxuICAgICAgICAgICAgJ192YWxpZGF0b3JzJ1xuICAgICAgICBdLmluY2x1ZGVzKGUpKS5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbi8qKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHZhbGlkYXRpb24gZXJyb3JzIHdlIGhhdmUgZGlzcGxheWVkLiBFYWNoIG9uZSBzaG91bGQgb25seSBiZSBkaXNwbGF5ZWQgb25jZS4gKi8gbGV0IGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtrZXlQYXRofTo6OiR7bWVzc2FnZX1gO1xuICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUsIGJ1dCBiZWNhdXNlIG9mIGhvdyB0aGluZ3Mgd2luZC11cCB0cmFuc3BpbGVkLCB0aGlzIGlzbid0IGltcG9zc2libGVcbiAgICBpZiAoIWRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcykge1xuICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIGlmICghZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5hZGQoa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIE5vcm1hbGx5LCBjb25maWd1cmF0aW9uIGVycm9ycyBhcmUgb25seSBkaXNwbGF5ZWQgb25jZS4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGxpc3Qgb2ZcbiAqIGRpc3BsYXllZCBlcnJvcnMsIHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpc3BsYXllZCBhZ2Fpbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWdFcnJvcnMoa2V5UGF0aCkge1xuICAgIGlmIChrZXlQYXRoKSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQ2xlYW5zIHVwIGFsbCBjb25maWcgc3RvcmUgc3Vic2NyaXB0aW9ucyBhbmQgcmUtZXN0YWJsaXNoZXMgdGhlbS4gVGhpcyBpcyBwcmltYXJpbHlcbiAqIHVzZWZ1bCBmb3IgdGVzdGluZywgd2hlcmUgc3Vic2NyaXB0aW9ucyBzZXQgdXAgYXQgbW9kdWxlIGxvYWQgdGltZSBuZWVkIHRvIGJlIGNsZWFyZWRcbiAqIGJldHdlZW4gdGVzdHMgdG8gcHJldmVudCBpbmZpbml0ZSB1cGRhdGUgbG9vcHMuIEFmdGVyIGNsZWFyaW5nLCBzdWJzY3JpcHRpb25zIGFyZVxuICogcmUtZXN0YWJsaXNoZWQgc28gdGhlIGNvbmZpZyBzeXN0ZW0gY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkuXG4gKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q29uZmlnU3lzdGVtKCkge1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpPT51bnN1YnNjcmliZSgpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLmxlbmd0aCA9IDA7XG4gICAgc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCk7XG59XG4vKipcbiAqIENvcGllZCBvdmVyIGZyb20gZXNtLWV4dGVuc2lvbnMuIEl0IHJpZ2h0bHkgYmVsb25ncyB0byB0aGF0IG1vZHVsZSwgYnV0IGVzbS1jb25maWdcbiAqIGNhbm5vdCBkZXBlbmQgb24gZXNtLWV4dGVuc2lvbnMuXG4gKi8gZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG4vKipcbiAqIFRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgc2NoZW1hIGlzIHVzZWQgaW4gdGhlIGltcGxpY2l0IHNjaGVtYSBnaXZlbiB0byBldmVyeSBtb2R1bGU7XG4gKiBwbHVzIGFueSBhZGRpdGlvbmFsIHRyYW5zbGF0aW9uIG5hbWVzcGFjZXMgKGF0IHRpbWUgb2Ygd3JpdGluZywgdGhpcyBpcyBqdXN0ICdjb3JlJykuXG4gKi8gY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEgPSB7XG4gICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyc6IHtcbiAgICAgICAgX2Rlc2NyaXB0aW9uOiAnUGVyLWxhbmd1YWdlIG92ZXJyaWRlcyBmb3IgZnJvbnRlbmQgdHJhbnNsYXRpb25zIHNob3VsZCBiZSBrZXllZCBieSBsYW5ndWFnZSBjb2RlIGFuZCBlYWNoIGxhbmd1YWdlIGRpY3Rpb25hcnkgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGtleSBhbmQgdGhlIGRpc3BsYXkgdmFsdWUnLFxuICAgICAgICBfdHlwZTogVHlwZS5PYmplY3QsXG4gICAgICAgIF9kZWZhdWx0OiB7fSxcbiAgICAgICAgX3ZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgIHZhbGlkYXRvcigobyk9Pk9iamVjdC5rZXlzKG8pLmV2ZXJ5KChrKT0+L15bYS16XXsyLDN9KC1bQS1aXXsyLDN9KT8kLy50ZXN0KGspKSwgKG8pPT57XG4gICAgICAgICAgICAgICAgY29uc3QgYmFkS2V5cyA9IE9iamVjdC5rZXlzKG8pLmZpbHRlcigoayk9PiEvXlthLXpdezIsM30oLVtBLVpdezIsM30pPyQvLnRlc3QoaykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgVGhlICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnIG9iamVjdCBzaG91bGQgaGF2ZSBsYW5ndWFnZSBjb2RlcyBmb3Iga2V5cy4gTGFuZ3VhZ2UgY29kZXMgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhIHR3by10by10aHJlZSBsZXR0ZXIgbGFuZ3VhZ2UgY29kZSBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgaHlwaGVuIGFuZCBhIHR3by10by10aHJlZSBsZXR0ZXIgY291bnRyeSBjb2RlLiBUaGUgZm9sbG93aW5nIGtleXMgZG8gbm90IGNvbmZvcm06ICR7YmFkS2V5cy5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgIH1cbn07XG4vKipcbiAqIFRoZSBpbXBsaWNpdENvbmZpZ1NjaGVtYSBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluIGV2ZXJ5IGNvbmZpZ3VyYXRpb24gc2NoZW1hXG4gKi8gY29uc3QgaW1wbGljaXRDb25maWdTY2hlbWEgPSB7XG4gICAgJ0Rpc3BsYXkgY29uZGl0aW9ucyc6IHtcbiAgICAgICAgcHJpdmlsZWdlczoge1xuICAgICAgICAgICAgX2Rlc2NyaXB0aW9uOiAnVGhlIHByaXZpbGVnZShzKSB0aGUgdXNlciBtdXN0IGhhdmUgdG8gdXNlIHRoaXMgZXh0ZW5zaW9uJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLkFycmF5LFxuICAgICAgICAgICAgX2RlZmF1bHQ6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIF9kZXNjcmlwdGlvbjogJ1RoZSBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBleHRlbnNpb24gaXMgZGlzcGxheWVkJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIF9kZWZhdWx0OiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLi4udHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWFcbn07XG4iXSwibmFtZXMiOlsiY2xvbmUiLCJlcXVhbHMiLCJyZWR1Y2UiLCJtZXJnZURlZXBSaWdodCIsIm9taXQiLCJUeXBlIiwiaXNBcnJheSIsImlzQm9vbGVhbiIsImlzVXVpZCIsImlzTnVtYmVyIiwiaXNPYmplY3QiLCJpc1N0cmluZyIsInZhbGlkYXRvciIsImNvbmZpZ0V4dGVuc2lvblN0b3JlIiwiY29uZmlnSW50ZXJuYWxTdG9yZSIsImdldENvbmZpZ1N0b3JlIiwiZ2V0RXh0ZW5zaW9uQ29uZmlnIiwiZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSIsImdldEV4dGVuc2lvbnNDb25maWdTdG9yZSIsImltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZSIsInRlbXBvcmFyeUNvbmZpZ1N0b3JlIiwiY29uZmlnU3Vic2NyaXB0aW9ucyIsInJlY29tcHV0ZUFsbENvbmZpZ3MiLCJjb25maWdTdGF0ZSIsImdldFN0YXRlIiwidGVtcENvbmZpZ1N0YXRlIiwiZXh0ZW5zaW9uU3RhdGUiLCJjb21wdXRlTW9kdWxlQ29uZmlnIiwiY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWciLCJjb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3MiLCJjb21wdXRlRXh0ZW5zaW9uQ29uZmlncyIsInNldHVwQ29uZmlnU3Vic2NyaXB0aW9ucyIsInB1c2giLCJzdWJzY3JpYmUiLCJzdGF0ZSIsInRlbXBTdGF0ZSIsIm1vZHVsZU5hbWUiLCJPYmplY3QiLCJrZXlzIiwic2NoZW1hcyIsIm1vZHVsZVN0b3JlIiwibmV3U3RhdGUiLCJtb2R1bGVMb2FkZWQiLCJjb25maWciLCJnZXRDb25maWdGb3JNb2R1bGUiLCJ0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZCIsImxvYWRlZCIsImdldENvbmZpZ0Zvck1vZHVsZUltcGxpY2l0U2NoZW1hIiwic2V0U3RhdGUiLCJzbG90Q29uZmlncyIsImdldEV4dGVuc2lvblNsb3RDb25maWdzIiwibmV3U2xvdFN0b3JlRW50cmllcyIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsIm1hcCIsInNsb3ROYW1lIiwic2xvdFN0b3JlIiwib2xkU3RhdGUiLCJzbG90cyIsImdldEltcGxlbWVudGVyVG9vbHNDb25maWciLCJjb25maWdzIiwiZXh0ZW5zaW9uIiwibW91bnRlZEV4dGVuc2lvbnMiLCJjb21wdXRlRXh0ZW5zaW9uQ29uZmlnIiwic2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25Nb2R1bGVOYW1lIiwiZXh0ZW5zaW9uSWQiLCJleHRlbnNpb25zQ29uZmlnU3RvcmUiLCJkZWZpbmVDb25maWdTY2hlbWEiLCJzY2hlbWEiLCJ2YWxpZGF0ZUNvbmZpZ1NjaGVtYSIsImVuaGFuY2VkU2NoZW1hIiwiaW1wbGljaXRDb25maWdTY2hlbWEiLCJyZWdpc3Rlck1vZHVsZVdpdGhDb25maWdTeXN0ZW0iLCJyZWdpc3Rlck1vZHVsZUxvYWQiLCJyZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlIiwibmFtZXNwYWNlIiwidHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEiLCJkZWZpbmVFeHRlbnNpb25Db25maWdTY2hlbWEiLCJleHRlbnNpb25OYW1lIiwiY29uc29sZSIsImVycm9yIiwicHJvdmlkZSIsInNvdXJjZU5hbWUiLCJwcm92aWRlZENvbmZpZ3MiLCJzb3VyY2UiLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInN0b3JlIiwidXBkYXRlIiwidW5zdWJzY3JpYmUiLCJnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyIsInByb21pc2VzIiwiY29uZmlnU3RvcmUiLCJ0cmFuc2xhdGlvbk92ZXJyaWRlcyIsImFsbCIsInByb2Nlc3NDb25maWciLCJwcm92aWRlZENvbmZpZyIsImtleVBhdGhDb250ZXh0IiwidmFsaWRhdGVTdHJ1Y3R1cmUiLCJzZXREZWZhdWx0cyIsInJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUiLCJnZXRFeHRlbnNpb25OYW1lRnJvbUlkIiwiZXh0ZW5zaW9uQ29uZmlnU2NoZW1hIiwibmFtZU9mU2NoZW1hU291cmNlIiwiZ2V0UHJvdmlkZWRDb25maWdzIiwic2xvdE1vZHVsZUNvbmZpZyIsIm1lcmdlQ29uZmlnc0ZvciIsImNvbmZpZ092ZXJyaWRlIiwiZXh0ZW5zaW9uU2xvdHMiLCJjb25maWd1cmUiLCJleHRlbnNpb25Db25maWciLCJjb21iaW5lZENvbmZpZyIsIm1lcmdlQ29uZmlncyIsInJlc3VsdCIsImdldFNjaGVtYVdpdGhWYWx1ZXNBbmRTb3VyY2VzIiwiY29uZmlnc0FuZFNvdXJjZXMiLCJjIiwiY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUiLCJoYXNPd25Qcm9wZXJ0eSIsIl92YWx1ZSIsIl9kZWZhdWx0IiwiX3NvdXJjZSIsImlzT3JkaW5hcnlPYmplY3QiLCJvYmoiLCJrZXkiLCJhbGxDb25maWdzIiwic2xvdENvbmZpZ1Blck1vZHVsZSIsInZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3MiLCJjb25maWdCeVNsb3ROYW1lIiwidmFsaWRhdGVFeHRlbnNpb25TbG90Q29uZmlnIiwia2V5UGF0aCIsImVycm9yUHJlZml4IiwiaW52YWxpZEtleXMiLCJmaWx0ZXIiLCJrIiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJsb2dFcnJvciIsImpvaW4iLCJhZGQiLCJBcnJheSIsImV2ZXJ5IiwibiIsInJlbW92ZSIsIm9yZGVyIiwidXBkYXRlTWVzc2FnZSIsInN0YXJ0c1dpdGgiLCJ0aGlzS2V5UGF0aCIsInNjaGVtYVBhcnQiLCJlbGVtZW50cyIsIl9lbGVtZW50cyIsImhhc09iamVjdFNjaGVtYSIsIl92YWxpZGF0b3JzIiwidmFsdWVUeXBlIiwiX3R5cGUiLCJ2YWx1ZXMiLCJKU09OIiwic3RyaW5naWZ5IiwiaW5wdXRDb25maWciLCJhbGxDb25maWdzRm9yTW9kdWxlIiwibWVyZ2VEZWVwQWxsIiwidmFsdWUiLCJ2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZSIsImNoZWNrVHlwZSIsInZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUiLCJ2YWxpZGF0ZUFycmF5U3RydWN0dXJlIiwiZnJlZWZvcm1PYmplY3RTY2hlbWEiLCJhcnJheVNjaGVtYSIsInZhbGlkYXRlZEFzQXJyYXkiLCJpIiwicnVuVmFsaWRhdG9ycyIsIkJvb2xlYW4iLCJDb25jZXB0VXVpZCIsIk51bWJlciIsIlN0cmluZyIsIlVVSUQiLCJQZXJzb25BdHRyaWJ1dGVUeXBlVXVpZCIsIlBhdGllbnRJZGVudGlmaWVyVHlwZVV1aWQiLCJ2YWxpZGF0b3JzIiwicmV0dXJuVmFsdWUiLCJ2YWxpZGF0b3JSZXN1bHQiLCJtZXNzYWdlIiwiZSIsImNvbmZpZ1BhcnQiLCJjb25maWdXaXRoRGVmYXVsdHMiLCJjb25mIiwib2JqZWN0S2V5Iiwic2VsZWN0ZWRDb25maWdQYXJ0IiwiZWxlbWVudHNTY2hlbWEiLCJkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMiLCJTZXQiLCJoYXMiLCJjbGVhckNvbmZpZ0Vycm9ycyIsImZvckVhY2giLCJkZWxldGUiLCJjbGVhciIsInJlc2V0Q29uZmlnU3lzdGVtIiwic3BsaXQiLCJfZGVzY3JpcHRpb24iLCJvIiwidGVzdCIsImJhZEtleXMiLCJwcml2aWxlZ2VzIiwiZXhwcmVzc2lvbiIsInVuZGVmaW5lZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/module-config.js\n");
158
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearConfigErrors: () => (/* binding */ clearConfigErrors),\n/* harmony export */ defineConfigSchema: () => (/* binding */ defineConfigSchema),\n/* harmony export */ defineExtensionConfigSchema: () => (/* binding */ defineExtensionConfigSchema),\n/* harmony export */ getConfig: () => (/* binding */ getConfig),\n/* harmony export */ getTranslationOverrides: () => (/* binding */ getTranslationOverrides),\n/* harmony export */ processConfig: () => (/* binding */ processConfig),\n/* harmony export */ provide: () => (/* binding */ provide),\n/* harmony export */ registerModuleLoad: () => (/* binding */ registerModuleLoad),\n/* harmony export */ registerModuleWithConfigSystem: () => (/* binding */ registerModuleWithConfigSystem),\n/* harmony export */ registerTranslationNamespace: () => (/* binding */ registerTranslationNamespace),\n/* harmony export */ resetConfigSystem: () => (/* binding */ resetConfigSystem)\n/* harmony export */ });\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/equals.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/mergeDeepRight.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/omit.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/clone.js\");\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ \"../../../node_modules/ramda/es/reduce.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types.js */ \"../../framework/esm-config/dist/types.js\");\n/* harmony import */ var _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../validators/type-validators.js */ \"../../framework/esm-config/dist/validators/type-validators.js\");\n/* harmony import */ var _validators_validator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../validators/validator.js */ \"../../framework/esm-config/dist/validators/validator.js\");\n/* harmony import */ var _state_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./state.js */ \"../../framework/esm-config/dist/module-config/state.js\");\n/** @module @category Config */ \n\n\n\n\n/**\n * Store setup\n *\n *\n * Set up stores and subscriptions so that inputs get processed appropriately.\n *\n * There are *input* stores and *output* stores. The *input* stores\n * are configInternalStore, temporaryConfigStore, and configExtensionStore. The\n * output stores are set in the `compute...` functions. They are the module\n * config stores, the extension slot config stores (by module), the extension\n * config stores, and the implementer tools config store.\n *\n * This code sets up the subscriptions so that when an input store changes,\n * the correct set of output stores are updated.\n *\n * All `compute...` functions except `computeExtensionConfigs` are pure\n * (or are supposed to be), other than the fact that they all `setState`\n * store values at the end. `computeExtensionConfigs` calls `getGlobalStore`,\n * which creates stores.\n */ // Store unsubscribe functions to allow cleanup (e.g., in tests or hot module reloading)\nconst configSubscriptions = [];\n/**\n * Recomputes all configuration derived stores based on current state of input stores.\n * Called whenever any input store (configInternalStore, temporaryConfigStore, configExtensionStore) changes.\n */ function recomputeAllConfigs() {\n const configState = _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState();\n const tempConfigState = _state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.getState();\n const extensionState = _state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.getState();\n computeModuleConfig(configState, tempConfigState);\n computeImplementerToolsConfig(configState, tempConfigState);\n computeExtensionSlotConfigs(configState, tempConfigState);\n computeExtensionConfigs(configState, extensionState, tempConfigState);\n}\nfunction setupConfigSubscriptions() {\n // Initial computation\n recomputeAllConfigs();\n // Subscribe to all input stores with a single handler\n // This ensures we only recompute once even if multiple stores change simultaneously\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.temporaryConfigStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__WEBPACK_IMPORTED_MODULE_3__.configExtensionStore.subscribe(recomputeAllConfigs));\n}\n// Set up subscriptions at module load time\nsetupConfigSubscriptions();\nfunction computeModuleConfig(state, tempState) {\n for (let moduleName of Object.keys(state.schemas)){\n // At this point the schema could be either just the implicit schema or the actually\n // defined schema. We run with just the implicit schema because we want to populate\n // the config store with the translation overrides as soon as possible. In fact, the\n // translation system will throw for Suspense until the translation overrides are\n // available, which as of this writing blocks the schema definition from occurring\n // for modules loaded based on their extensions.\n const moduleStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n let newState;\n if (state.moduleLoaded[moduleName]) {\n const config = getConfigForModule(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: true,\n config\n };\n } else {\n const config = getConfigForModuleImplicitSchema(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: false,\n config\n };\n }\n moduleStore.setState(newState);\n }\n}\nfunction computeExtensionSlotConfigs(state, tempState) {\n const slotConfigs = getExtensionSlotConfigs(state, tempState);\n const newSlotStoreEntries = Object.fromEntries(Object.entries(slotConfigs).map(([slotName, config])=>[\n slotName,\n {\n loaded: true,\n config\n }\n ]));\n const slotStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionSlotsConfigStore)();\n const oldState = slotStore.getState();\n const newState = {\n slots: {\n ...oldState.slots,\n ...newSlotStoreEntries\n }\n };\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.slots, newState.slots)) {\n slotStore.setState(newState);\n }\n}\nfunction computeImplementerToolsConfig(state, tempConfigState) {\n const oldState = _state_js__WEBPACK_IMPORTED_MODULE_3__.implementerToolsConfigStore.getState();\n const config = getImplementerToolsConfig(state, tempConfigState);\n const newState = {\n config\n };\n // Use deep equality on the actual config content, not the wrapper object\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.config, newState.config)) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.implementerToolsConfigStore.setState(newState);\n }\n}\nfunction computeExtensionConfigs(configState, extensionState, tempConfigState) {\n const configs = {};\n // We assume that the module schema has already been defined, since the extension\n // it contains is mounted.\n for (let extension of extensionState.mountedExtensions){\n const config = computeExtensionConfig(extension.slotModuleName, extension.extensionModuleName, extension.slotName, extension.extensionId, configState, tempConfigState);\n if (!configs[extension.slotName]) {\n configs[extension.slotName] = {};\n }\n configs[extension.slotName][extension.extensionId] = {\n config,\n loaded: true\n };\n }\n const extensionsConfigStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionsConfigStore)();\n const oldState = extensionsConfigStore.getState();\n const newState = {\n configs\n };\n // Use deep equality to only update if configs actually changed\n if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(oldState.configs, newState.configs)) {\n extensionsConfigStore.setState(newState);\n }\n}\n/*\n * API\n *\n */ /**\n * This defines a configuration schema for a module. The schema tells the\n * configuration system how the module can be configured. It specifies\n * what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param moduleName Name of the module the schema is being defined for. Generally\n * should be the one in which the `defineConfigSchema` call takes place.\n * @param schema The config schema for the module\n */ function defineConfigSchema(moduleName, schema) {\n validateConfigSchema(moduleName, schema);\n const enhancedSchema = (0,ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(schema, implicitConfigSchema);\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [moduleName]: enhancedSchema\n },\n moduleLoaded: {\n ...state.moduleLoaded,\n [moduleName]: true\n }\n }));\n}\n/**\n * This alerts the configuration system that a module exists. This allows config to be\n * processed, while still allowing the extension system to know whether the module has\n * actually had its front bundle executed yet.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleWithConfigSystem(moduleName) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [moduleName]: implicitConfigSchema\n }\n }));\n}\n/**\n * This alerts the configuration system that a module has been loaded.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleLoad(moduleName) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n moduleLoaded: {\n ...state.moduleLoaded,\n [moduleName]: true\n }\n }));\n}\n/**\n * This allows the config system to support translation overrides for namespaces that\n * do not correspond to modules.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param namespace\n */ function registerTranslationNamespace(namespace) {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [namespace]: translationOverridesSchema\n }\n }));\n}\n/**\n * This defines a configuration schema for an extension. When a schema is defined\n * for an extension, that extension will receive the configuration corresponding\n * to that schema, rather than the configuration corresponding to the module\n * in which it is defined.\n *\n * The schema tells the configuration system how the module can be configured.\n * It specifies what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param extensionName Name of the extension the schema is being defined for.\n * Should match the `name` of one of the `extensions` entries defined in\n * the app's `routes.json` file.\n * @param schema The config schema for the extension\n */ function defineExtensionConfigSchema(extensionName, schema) {\n validateConfigSchema(extensionName, schema);\n const enhancedSchema = (0,ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(schema, implicitConfigSchema);\n const state = _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.getState();\n if (state.schemas[extensionName]) {\n console.error(`Config schema for extension ${extensionName} already exists. If there are multiple extensions with this same name, one will probably crash.`);\n }\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n schemas: {\n ...state.schemas,\n [extensionName]: enhancedSchema\n }\n }));\n}\n/**\n * Provides configuration values programmatically. This is an alternative to\n * providing configuration through the config-file. Configuration provided this\n * way will be merged with configuration from other sources.\n *\n * @param config A configuration object to merge into the existing configuration.\n * @param sourceName An optional name to identify the source of this configuration,\n * used for debugging purposes. Defaults to 'provided'.\n */ function provide(config, sourceName = 'provided') {\n _state_js__WEBPACK_IMPORTED_MODULE_3__.configInternalStore.setState((state)=>({\n ...state,\n providedConfigs: [\n ...state.providedConfigs,\n {\n source: sourceName,\n config\n }\n ]\n }));\n}\n/**\n * A promise-based way to access the config as soon as it is fully loaded.\n * If it is already loaded, resolves the config in its present state.\n *\n * This is a useful function if you need to get the config in the course\n * of the execution of a function.\n *\n * @param moduleName The name of the module for which to look up the config\n */ function getConfig(moduleName) {\n return new Promise((resolve)=>{\n const store = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n function update(state) {\n if (state.loaded && state.config) {\n const config = (0,ramda__WEBPACK_IMPORTED_MODULE_6__[\"default\"])([\n 'Display conditions',\n 'Translation overrides'\n ], state.config);\n resolve(config);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(store.getState());\n const unsubscribe = store.subscribe(update);\n });\n}\n/**\n * Retrieves translation overrides for an extension, optionally scoped to a specific\n * extension slot. When called with only a module name, retrieves module-level overrides.\n * Translation overrides allow customizing translated strings without modifying the\n * original translation files.\n *\n * @param moduleName The name of the module providing the translation context.\n * @param slotName Optional extension slot name to include slot-specific overrides.\n * @param extensionId Optional extension ID to include extension-specific overrides.\n * @returns A Promise resolving to an array of translation override objects.\n *\n * @internal\n */ function getTranslationOverrides(moduleName, slotName, extensionId) {\n const promises = [\n new Promise((resolve)=>{\n const configStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getConfigStore)(moduleName);\n function update(state) {\n if (state.translationOverridesLoaded && state.config) {\n const translationOverrides = state.config['Translation overrides'] ?? {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(configStore.getState());\n const unsubscribe = configStore.subscribe(update);\n })\n ];\n if (slotName && extensionId) {\n promises.push(new Promise((resolve)=>{\n const configStore = (0,_state_js__WEBPACK_IMPORTED_MODULE_3__.getExtensionConfig)(slotName, extensionId);\n function update(state) {\n if (state.loaded && state.config) {\n const translationOverrides = state.config['Translation overrides'] ?? {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n }\n update(configStore.getState());\n const unsubscribe = configStore.subscribe(update);\n }));\n }\n return Promise.all(promises);\n}\n/**\n * Validate and interpolate defaults for `providedConfig` according to `schema`\n *\n * @param schema a configuration schema\n * @param providedConfig an object of config values (without the top-level module name)\n * @param keyPathContext a dot-separated string which helps the user figure out where\n * the provided config came from\n * @returns The validated and processed configuration object with defaults applied.\n * @internal\n */ function processConfig(schema, providedConfig, keyPathContext) {\n validateStructure(schema, providedConfig, keyPathContext);\n const config = setDefaults(schema, providedConfig);\n runAllValidatorsInConfigTree(schema, config, keyPathContext);\n return config;\n}\n/*\n * Helper functions\n *\n */ /**\n * Returns the configuration for an extension. This configuration is specific\n * to the slot in which it is mounted, and its ID within that slot.\n *\n * The schema for that configuration is the extension schema. If no extension\n * schema has been provided, the schema used is the schema of the module in\n * which the extension is defined.\n *\n * @param slotModuleName The name of the module which defines the extension slot\n * @param extensionModuleName The name of the module which defines the extension (and therefore the config schema)\n * @param slotName The name of the extension slot where the extension is mounted\n * @param extensionId The ID of the extension in its slot\n */ function computeExtensionConfig(slotModuleName, extensionModuleName, slotName, extensionId, configState, tempConfigState) {\n const extensionName = getExtensionNameFromId(extensionId);\n const extensionConfigSchema = configState.schemas[extensionName];\n const nameOfSchemaSource = extensionConfigSchema ? extensionName : extensionModuleName;\n const providedConfigs = getProvidedConfigs(configState, tempConfigState);\n const slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n const configOverride = slotModuleConfig?.extensionSlots?.[slotName]?.configure?.[extensionId] ?? {};\n const extensionConfig = mergeConfigsFor(nameOfSchemaSource, providedConfigs);\n const combinedConfig = mergeConfigs([\n extensionConfig,\n configOverride\n ]);\n const schema = extensionConfigSchema ?? configState.schemas[extensionModuleName];\n validateStructure(schema, combinedConfig, nameOfSchemaSource);\n const config = setDefaults(schema, combinedConfig);\n runAllValidatorsInConfigTree(schema, config, nameOfSchemaSource);\n delete config.extensionSlots;\n return config;\n}\nfunction getImplementerToolsConfig(configState, tempConfigState) {\n let result = getSchemaWithValuesAndSources((0,ramda__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(configState.schemas));\n const configsAndSources = [\n ...configState.providedConfigs.map((c)=>[\n c.config,\n c.source\n ]),\n [\n tempConfigState.config,\n 'temporary config'\n ]\n ];\n for (let [config, source] of configsAndSources){\n result = mergeConfigs([\n result,\n createValuesAndSourcesTree(config, source)\n ]);\n }\n return result;\n}\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty('_default')) {\n return {\n ...schema,\n _value: schema._default,\n _source: 'default'\n };\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce((obj, key)=>{\n obj[key] = getSchemaWithValuesAndSources(schema[key]);\n return obj;\n }, {});\n } else {\n // at this point, the schema is bad and an error will have been logged during schema validation\n return {};\n }\n}\nfunction createValuesAndSourcesTree(config, source) {\n if (isOrdinaryObject(config)) {\n return Object.keys(config).reduce((obj, key)=>{\n obj[key] = createValuesAndSourcesTree(config[key], source);\n return obj;\n }, {});\n } else {\n return {\n _value: config,\n _source: source\n };\n }\n}\nfunction getExtensionSlotConfigs(configState, tempConfigState) {\n const allConfigs = mergeConfigs(getProvidedConfigs(configState, tempConfigState));\n const slotConfigPerModule = Object.keys(allConfigs).reduce((obj, key)=>{\n if (allConfigs[key]?.extensionSlots) {\n obj[key] = allConfigs[key]?.extensionSlots;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n const slotConfigs = Object.keys(slotConfigPerModule).reduce((obj, key)=>{\n obj = {\n ...obj,\n ...slotConfigPerModule[key]\n };\n return obj;\n }, {});\n return slotConfigs;\n}\nfunction validateAllExtensionSlotConfigs(slotConfigPerModule) {\n for (let [moduleName, configBySlotName] of Object.entries(slotConfigPerModule)){\n for (let [slotName, config] of Object.entries(configBySlotName)){\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n }\n}\nfunction validateExtensionSlotConfig(config, moduleName, slotName) {\n const keyPath = `${moduleName}.extensionSlots.${slotName}`;\n const errorPrefix = `Extension slot config '${keyPath}'`;\n const invalidKeys = Object.keys(config).filter((k)=>![\n 'add',\n 'remove',\n 'order',\n 'configure'\n ].includes(k));\n if (invalidKeys.length) {\n logError(keyPath, errorPrefix + `' contains invalid keys '${invalidKeys.join(\"', '\")}'`);\n }\n if (config.add) {\n if (!Array.isArray(config.add) || !config.add.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.add' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.remove) {\n if (!Array.isArray(config.remove) || !config.remove.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.remove' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.order) {\n if (!Array.isArray(config.order) || !config.order.every((n)=>typeof n === 'string')) {\n logError(keyPath, errorPrefix + `.order' is invalid. Must be an array of strings (extension IDs)`);\n }\n }\n if (config.configure) {\n if (!isOrdinaryObject(config.configure)) {\n logError(keyPath, errorPrefix + `.configure' is invalid. Must be an object with extension IDs for keys`);\n }\n }\n}\nfunction getProvidedConfigs(configState, tempConfigState) {\n return [\n ...configState.providedConfigs.map((c)=>c.config),\n tempConfigState.config\n ];\n}\n/**\n * Validates the config schema for a module. Since problems identified here are programming errors\n * that hopefully will be caught during development, this function logs errors to the console directly;\n * it's fine if we spam the user with these errors.\n */ function validateConfigSchema(moduleName, schema, keyPath = '') {\n const updateMessage = `Please verify that you are running the latest version and, if so, alert the maintainer.`;\n for (const key of Object.keys(schema).filter((k)=>!k.startsWith('_'))){\n const thisKeyPath = keyPath + (keyPath && '.') + key;\n const schemaPart = schema[key];\n if (thisKeyPath === 'Display conditions') {\n console.error(`${moduleName} declares a configuration option called \"Display conditions\"; the \"Display conditions\" option is a reserved name. ${updateMessage}`);\n }\n if (thisKeyPath === 'Translation overrides') {\n console.error(`${moduleName} declares a configuration option called \"Translation overrides\"; the \"Translation overrides\" option is a reserved name. ${updateMessage}`);\n }\n if (!isOrdinaryObject(schemaPart)) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}`);\n continue;\n }\n if (!schemaPart.hasOwnProperty('_default')) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n const elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + '._elements');\n }\n if (schemaPart._validators) {\n for (let validator of schemaPart._validators){\n if (typeof validator !== 'function') {\n console.error(`${moduleName} has invalid validator for key '${thisKeyPath}' ${updateMessage}.` + `\\n\\nIf you're the maintainer: validators must be functions that return either ` + `undefined or an error string. Received ${validator}.`);\n }\n }\n }\n const valueType = schemaPart._type;\n if (valueType && !Object.values(_types_js__WEBPACK_IMPORTED_MODULE_0__.Type).includes(valueType)) {\n console.error(`${moduleName} has invalid type for key '${thisKeyPath}' ${updateMessage}.` + `\\n\\nIf you're the maintainer: the allowed types are ${Object.values(_types_js__WEBPACK_IMPORTED_MODULE_0__.Type).join(', ')}. ` + `Received '${valueType}'`);\n }\n if (Object.keys(schemaPart).every((k)=>[\n '_description',\n '_validators',\n '_elements',\n '_type'\n ].includes(k)) && !keyPath.includes('._elements')) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` + `\\n\\nIf you're the maintainer: all config elements must have a default. ` + `Received ${JSON.stringify(schemaPart)}`);\n }\n if (elements && valueType && ![\n _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array,\n _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object\n ].includes(valueType)) {\n console.error(`${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` + `\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. ` + `Received ${JSON.stringify(valueType)}`);\n }\n }\n}\nfunction getConfigForModule(moduleName, configState, tempConfigState) {\n const schema = configState.schemas[moduleName];\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n validateStructure(schema, inputConfig, moduleName);\n const config = setDefaults(schema, inputConfig);\n runAllValidatorsInConfigTree(schema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction getConfigForModuleImplicitSchema(moduleName, configState, tempConfigState) {\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n const config = setDefaults(implicitConfigSchema, inputConfig);\n runAllValidatorsInConfigTree(implicitConfigSchema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction mergeConfigsFor(moduleName, allConfigs) {\n const allConfigsForModule = allConfigs.map(({ [moduleName]: c })=>c).filter((c)=>!!c);\n return mergeConfigs(allConfigsForModule);\n}\nfunction mergeConfigs(configs) {\n const mergeDeepAll = (0,ramda__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(ramda__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n return mergeDeepAll({}, configs);\n}\n/**\n * Recursively check the provided config tree to make sure that all\n * of the provided properties exist in the schema, and that types are\n * correct. Does not run validators yet, since those will be run on\n * the config with the defaults filled in.\n */ function validateStructure(schema, config, keyPath = '') {\n // validate each constituent element\n for (const key of Object.keys(config)){\n const value = config[key];\n const thisKeyPath = keyPath + '.' + key;\n const schemaPart = schema[key];\n if (!schema.hasOwnProperty(key)) {\n if (!(key === 'extensionSlots' && keyPath !== '')) {\n logError(thisKeyPath, `Unknown config key '${thisKeyPath}' provided. Ignoring.`);\n }\n continue;\n }\n validateBranchStructure(schemaPart, value, thisKeyPath);\n }\n}\nfunction validateBranchStructure(schemaPart, value, keyPath) {\n checkType(keyPath, schemaPart._type, value);\n if (isOrdinaryObject(value)) {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object) {\n // validate as freeform object\n validateFreeformObjectStructure(schemaPart, value, keyPath);\n } else if (!(schemaPart.hasOwnProperty('_default') || schemaPart.hasOwnProperty('_type'))) {\n // validate as normal nested config\n validateStructure(schemaPart, value, keyPath);\n }\n } else {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array) {\n validateArrayStructure(schemaPart, value, keyPath);\n }\n }\n}\nfunction validateFreeformObjectStructure(freeformObjectSchema, config, keyPath) {\n if (freeformObjectSchema._elements) {\n for (const key of Object.keys(config)){\n const value = config[key];\n validateBranchStructure(freeformObjectSchema._elements, value, `${keyPath}.${key}`);\n }\n }\n}\nfunction validateArrayStructure(arraySchema, value, keyPath) {\n const validatedAsArray = checkType(keyPath, _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array, value);\n if (!validatedAsArray) {\n return;\n }\n // if there is an array element object schema, verify that elements match it\n if (hasObjectSchema(arraySchema._elements)) {\n for(let i = 0; i < value.length; i++){\n validateBranchStructure(arraySchema._elements, value[i], `${keyPath}[${i}]`);\n }\n }\n for(let i = 0; i < value.length; i++){\n checkType(`${keyPath}[${i}]`, arraySchema._elements?._type, value[i]);\n }\n}\n/**\n * Run all the validators in the config tree. This should be run\n * on the config object after it has been filled in with all the defaults, since\n * higher-level validators may refer to default values.\n */ function runAllValidatorsInConfigTree(schema, config, keyPath = '') {\n // If `!schema`, there should have been a structural validation error printed already.\n if (schema) {\n if (config !== schema._default) {\n runValidators(keyPath, schema._validators, config);\n }\n if (isOrdinaryObject(config)) {\n for (const key of Object.keys(config)){\n const value = config[key];\n const thisKeyPath = keyPath + '.' + key;\n const schemaPart = schema[key];\n if (schema._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object && schema._elements) {\n runAllValidatorsInConfigTree(schema._elements, value, thisKeyPath);\n } else {\n runAllValidatorsInConfigTree(schemaPart, value, thisKeyPath);\n }\n }\n } else if (Array.isArray(config) && schema._elements) {\n for(let i = 0; i < config.length; i++){\n runAllValidatorsInConfigTree(schema._elements, config[i], `${keyPath}[${i}]`);\n }\n }\n }\n}\n/**\n * Run type validation for the value, logging any errors.\n * @returns true if validation passes, false otherwise\n */ function checkType(keyPath, _type, value) {\n if (_type) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n const validator = {\n Array: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isArray,\n Boolean: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean,\n ConceptUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n Number: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isNumber,\n Object: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isObject,\n String: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isString,\n UUID: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n PersonAttributeTypeUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid,\n PatientIdentifierTypeUuid: _validators_type_validators_js__WEBPACK_IMPORTED_MODULE_1__.isUuid\n };\n return runValidators(keyPath, [\n validator[_type]\n ], value);\n }\n return true;\n}\n/**\n * Runs validators, logging errors.\n * @returns true if all pass, false otherwise.\n */ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction runValidators(keyPath, validators, value) {\n let returnValue = true;\n if (validators) {\n try {\n for (let validator of validators){\n const validatorResult = validator(value);\n if (typeof validatorResult === 'string') {\n const message = typeof value === 'object' ? `Invalid configuration for ${keyPath}: ${validatorResult}` : `Invalid configuration value ${value} for ${keyPath}: ${validatorResult}`;\n logError(keyPath, message);\n returnValue = false;\n }\n }\n } catch (e) {\n console.error(`Skipping invalid validator at \"${keyPath}\". Encountered error\\n\\t${e}`);\n }\n }\n return returnValue;\n}\n// Recursively fill in the config with values from the schema.\nconst setDefaults = (schema, inputConfig)=>{\n const config = (0,ramda__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(inputConfig);\n if (!schema) {\n return config;\n }\n for (const key of Object.keys(schema)){\n const configPart = config[key];\n const schemaPart = schema[key];\n // The `schemaPart &&` clause of this `if` statement will only fail\n // if the schema is very invalid. It is there to prevent the app from\n // crashing completely, though it will produce unexpected behavior.\n // If this happens, there should be legible errors in the console from\n // the schema validator.\n if (schemaPart && (schemaPart.hasOwnProperty('_type') || schemaPart.hasOwnProperty('_default'))) {\n // We assume that schemaPart defines a config value, since it has\n // a property `_type` or `_default`.\n if (!config.hasOwnProperty(key)) {\n config[key] = schemaPart['_default'];\n }\n // We also check if it is an object or array with object elements, in which case we recurse\n const elements = schemaPart._elements;\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array && Array.isArray(configPart)) {\n const configWithDefaults = configPart.map((conf)=>setDefaults(elements, conf));\n config[key] = configWithDefaults;\n } else if (schemaPart._type === _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object) {\n for (let objectKey of Object.keys(configPart)){\n configPart[objectKey] = setDefaults(elements, configPart[objectKey]);\n }\n }\n }\n } else if (isOrdinaryObject(schemaPart)) {\n // Since schemaPart has no property \"_type\", if it's an ordinary object\n // (unlike, importantly, the validators array), we assume it is a parent config property.\n // We recurse to config[key] and schema[key]. Default config[key] to {}.\n const selectedConfigPart = configPart ?? {};\n // There will have been a validation error already if configPart is not a plain object.\n if (isOrdinaryObject(selectedConfigPart)) {\n config[key] = setDefaults(schemaPart, selectedConfigPart);\n }\n }\n }\n return config;\n};\nfunction hasObjectSchema(elementsSchema) {\n return !!elementsSchema && Object.keys(elementsSchema).filter((e)=>![\n '_default',\n '_validators'\n ].includes(e)).length > 0;\n}\nfunction isOrdinaryObject(value) {\n return typeof value === 'object' && !Array.isArray(value) && value !== null;\n}\n/** Keep track of which validation errors we have displayed. Each one should only be displayed once. */ let displayedValidationMessages = new Set();\nfunction logError(keyPath, message) {\n const key = `${keyPath}:::${message}`;\n // technically, this should not be possible, but because of how things wind-up transpiled, this isn't impossible\n if (!displayedValidationMessages) {\n displayedValidationMessages = new Set();\n }\n if (!displayedValidationMessages.has(key)) {\n console.error(message);\n displayedValidationMessages.add(key);\n }\n}\n/**\n * Normally, configuration errors are only displayed once. This function clears the list of\n * displayed errors, so that they will be displayed again.\n *\n * @internal\n */ function clearConfigErrors(keyPath) {\n if (keyPath) {\n displayedValidationMessages.forEach((key)=>{\n if (key.startsWith(keyPath)) {\n displayedValidationMessages.delete(key);\n }\n });\n } else {\n displayedValidationMessages.clear();\n }\n}\n/**\n * Cleans up all config store subscriptions and re-establishes them. This is primarily\n * useful for testing, where subscriptions set up at module load time need to be cleared\n * between tests to prevent infinite update loops. After clearing, subscriptions are\n * re-established so the config system continues to work normally.\n *\n * @internal\n */ function resetConfigSystem() {\n configSubscriptions.forEach((unsubscribe)=>unsubscribe());\n configSubscriptions.length = 0;\n setupConfigSubscriptions();\n}\n/**\n * Copied over from esm-extensions. It rightly belongs to that module, but esm-config\n * cannot depend on esm-extensions.\n */ function getExtensionNameFromId(extensionId) {\n const [extensionName] = extensionId.split('#');\n return extensionName;\n}\n/**\n * The translation overrides schema is used in the implicit schema given to every module;\n * plus any additional translation namespaces (at time of writing, this is just 'core').\n */ const translationOverridesSchema = {\n 'Translation overrides': {\n _description: 'Per-language overrides for frontend translations should be keyed by language code and each language dictionary contains the translation key and the display value',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Object,\n _default: {},\n _validators: [\n (0,_validators_validator_js__WEBPACK_IMPORTED_MODULE_2__.validator)((o)=>Object.keys(o).every((k)=>/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k)), (o)=>{\n const badKeys = Object.keys(o).filter((k)=>!/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k));\n return `The 'Translation overrides' object should have language codes for keys. Language codes must be in the form of a two-to-three letter language code optionally followed by a hyphen and a two-to-three letter country code. The following keys do not conform: ${badKeys.join(', ')}.`;\n })\n ]\n }\n};\n/**\n * The implicitConfigSchema is implicitly included in every configuration schema\n */ const implicitConfigSchema = {\n 'Display conditions': {\n privileges: {\n _description: 'The privilege(s) the user must have to use this extension',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.Array,\n _default: []\n },\n expression: {\n _description: 'The expression that determines whether the extension is displayed',\n _type: _types_js__WEBPACK_IMPORTED_MODULE_0__.Type.String,\n _default: undefined\n }\n },\n ...translationOverridesSchema\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2QkFBNkIsR0FBdUU7QUFDakU7QUFDeUU7QUFDckQ7QUFDK0o7QUFDdE47Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQkMsR0FBRyx3RkFBd0Y7QUFDNUYsTUFBTXFCLHNCQUFzQixFQUFFO0FBQzlCOzs7Q0FHQyxHQUFHLFNBQVNDO0lBQ1QsTUFBTUMsY0FBY1QsMERBQW1CQSxDQUFDVSxRQUFRO0lBQ2hELE1BQU1DLGtCQUFrQkwsMkRBQW9CQSxDQUFDSSxRQUFRO0lBQ3JELE1BQU1FLGlCQUFpQmIsMkRBQW9CQSxDQUFDVyxRQUFRO0lBQ3BERyxvQkFBb0JKLGFBQWFFO0lBQ2pDRyw4QkFBOEJMLGFBQWFFO0lBQzNDSSw0QkFBNEJOLGFBQWFFO0lBQ3pDSyx3QkFBd0JQLGFBQWFHLGdCQUFnQkQ7QUFDekQ7QUFDQSxTQUFTTTtJQUNMLHNCQUFzQjtJQUN0QlQ7SUFDQSxzREFBc0Q7SUFDdEQsb0ZBQW9GO0lBQ3BGRCxvQkFBb0JXLElBQUksQ0FBQ2xCLDBEQUFtQkEsQ0FBQ21CLFNBQVMsQ0FBQ1g7SUFDdkRELG9CQUFvQlcsSUFBSSxDQUFDWiwyREFBb0JBLENBQUNhLFNBQVMsQ0FBQ1g7SUFDeERELG9CQUFvQlcsSUFBSSxDQUFDbkIsMkRBQW9CQSxDQUFDb0IsU0FBUyxDQUFDWDtBQUM1RDtBQUNBLDJDQUEyQztBQUMzQ1M7QUFDQSxTQUFTSixvQkFBb0JPLEtBQUssRUFBRUMsU0FBUztJQUN6QyxLQUFLLElBQUlDLGNBQWNDLE9BQU9DLElBQUksQ0FBQ0osTUFBTUssT0FBTyxFQUFFO1FBQzlDLG9GQUFvRjtRQUNwRixtRkFBbUY7UUFDbkYsb0ZBQW9GO1FBQ3BGLGlGQUFpRjtRQUNqRixrRkFBa0Y7UUFDbEYsZ0RBQWdEO1FBQ2hELE1BQU1DLGNBQWN6Qix5REFBY0EsQ0FB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QVUsQ0FBQztRQUNYZ0MsYUFBYTtZQUNUOUksbUVBQVNBLENBQUMsQ0FBQzZMLElBQUlwSyxPQUFPQyxJQUFJLENBQUNtSyxHQUFHMUQsS0FBSyxDQUFDLENBQUNQLElBQUksNkJBQTZCa0UsSUFBSSxDQUFDbEUsS0FBSyxDQUFDaUU7Z0JBQzdFLE1BQU1FLFVBQVV0SyxPQUFPQyxJQUFJLENBQUNtSyxHQUFHbEUsTUFBTSxDQUFDLENBQUNDLElBQUksQ0FBQyw2QkFBNkJrRSxJQUFJLENBQUNsRTtnQkFDOUUsT0FBTyxDQUFDLDZQQUE2UCxFQUFFbUUsUUFBUS9ELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoUztTQUNIO0lBQ0w7QUFDSjtBQUNBOztDQUVDLEdBQUcsTUFBTXBFLHVCQUF1QjtJQUM3QixzQkFBc0I7UUFDbEJvSSxZQUFZO1lBQ1JKLGNBQWM7WUFDZDVDLE9BQU92SiwyQ0FBSUEsQ0FBQ3lJLEtBQUs7WUFDakJwQixVQUFVLEVBQUU7UUFDaEI7UUFDQW1GLFlBQVk7WUFDUkwsY0FBYztZQUNkNUMsT0FBT3ZKLDJDQUFJQSxDQUFDMkssTUFBTTtZQUNsQnRELFVBQVVvRjtRQUNkO0lBQ0o7SUFDQSxHQUFHakksMEJBQTBCO0FBQ2pDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvbW9kdWxlLWNvbmZpZy5qcz84ZGZlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBDb25maWcgKi8gaW1wb3J0IHsgY2xvbmUsIGVxdWFscywgcmVkdWNlLCBtZXJnZURlZXBSaWdodCwgb21pdCB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gXCIuLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNCb29sZWFuLCBpc1V1aWQsIGlzTnVtYmVyLCBpc09iamVjdCwgaXNTdHJpbmcgfSBmcm9tIFwiLi4vdmFsaWRhdG9ycy90eXBlLXZhbGlkYXRvcnMuanNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuLi92YWxpZGF0b3JzL3ZhbGlkYXRvci5qc1wiO1xuaW1wb3J0IHsgY29uZmlnRXh0ZW5zaW9uU3RvcmUsIGNvbmZpZ0ludGVybmFsU3RvcmUsIGdldENvbmZpZ1N0b3JlLCBnZXRFeHRlbnNpb25Db25maWcsIGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUsIGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSwgaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlLCB0ZW1wb3JhcnlDb25maWdTdG9yZSB9IGZyb20gXCIuL3N0YXRlLmpzXCI7XG4vKipcbiAqIFN0b3JlIHNldHVwXG4gKlxuICpcbiAqIFNldCB1cCBzdG9yZXMgYW5kIHN1YnNjcmlwdGlvbnMgc28gdGhhdCBpbnB1dHMgZ2V0IHByb2Nlc3NlZCBhcHByb3ByaWF0ZWx5LlxuICpcbiAqIFRoZXJlIGFyZSAqaW5wdXQqIHN0b3JlcyBhbmQgKm91dHB1dCogc3RvcmVzLiBUaGUgKmlucHV0KiBzdG9yZXNcbiAqIGFyZSBjb25maWdJbnRlcm5hbFN0b3JlLCB0ZW1wb3JhcnlDb25maWdTdG9yZSwgYW5kIGNvbmZpZ0V4dGVuc2lvblN0b3JlLiBUaGVcbiAqIG91dHB1dCBzdG9yZXMgYXJlIHNldCBpbiB0aGUgYGNvbXB1dGUuLi5gIGZ1bmN0aW9ucy4gVGhleSBhcmUgdGhlIG1vZHVsZVxuICogY29uZmlnIHN0b3JlcywgdGhlIGV4dGVuc2lvbiBzbG90IGNvbmZpZyBzdG9yZXMgKGJ5IG1vZHVsZSksIHRoZSBleHRlbnNpb25cbiAqIGNvbmZpZyBzdG9yZXMsIGFuZCB0aGUgaW1wbGVtZW50ZXIgdG9vbHMgY29uZmlnIHN0b3JlLlxuICpcbiAqIFRoaXMgY29kZSBzZXRzIHVwIHRoZSBzdWJzY3JpcHRpb25zIHNvIHRoYXQgd2hlbiBhbiBpbnB1dCBzdG9yZSBjaGFuZ2VzLFxuICogdGhlIGNvcnJlY3Qgc2V0IG9mIG91dHB1dCBzdG9yZXMgYXJlIHVwZGF0ZWQuXG4gKlxuICogQWxsIGBjb21wdXRlLi4uYCBmdW5jdGlvbnMgZXhjZXB0IGBjb21wdXRlRXh0ZW5zaW9uQ29uZmlnc2AgYXJlIHB1cmVcbiAqIChvciBhcmUgc3VwcG9zZWQgdG8gYmUpLCBvdGhlciB0aGFuIHRoZSBmYWN0IHRoYXQgdGhleSBhbGwgYHNldFN0YXRlYFxuICogc3RvcmUgdmFsdWVzIGF0IHRoZSBlbmQuIGBjb21wdXRlRXh0ZW5zaW9uQ29uZmlnc2AgY2FsbHMgYGdldEdsb2JhbFN0b3JlYCxcbiAqIHdoaWNoIGNyZWF0ZXMgc3RvcmVzLlxuICovIC8vIFN0b3JlIHVuc3Vic2NyaWJlIGZ1bmN0aW9ucyB0byBhbGxvdyBjbGVhbnVwIChlLmcuLCBpbiB0ZXN0cyBvciBob3QgbW9kdWxlIHJlbG9hZGluZylcbmNvbnN0IGNvbmZpZ1N1YnNjcmlwdGlvbnMgPSBbXTtcbi8qKlxuICogUmVjb21wdXRlcyBhbGwgY29uZmlndXJhdGlvbiBkZXJpdmVkIHN0b3JlcyBiYXNlZCBvbiBjdXJyZW50IHN0YXRlIG9mIGlucHV0IHN0b3Jlcy5cbiAqIENhbGxlZCB3aGVuZXZlciBhbnkgaW5wdXQgc3RvcmUgKGNvbmZpZ0ludGVybmFsU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlLCBjb25maWdFeHRlbnNpb25TdG9yZSkgY2hhbmdlcy5cbiAqLyBmdW5jdGlvbiByZWNvbXB1dGVBbGxDb25maWdzKCkge1xuICAgIGNvbnN0IGNvbmZpZ1N0YXRlID0gY29uZmlnSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHRlbXBDb25maWdTdGF0ZSA9IHRlbXBvcmFyeUNvbmZpZ1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgZXh0ZW5zaW9uU3RhdGUgPSBjb25maWdFeHRlbnNpb25TdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbXB1dGVNb2R1bGVDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29tcHV0ZUV4dGVuc2lvblNsb3RDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ1N0YXRlLCBleHRlbnNpb25TdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbn1cbmZ1bmN0aW9uIHNldHVwQ29uZmlnU3Vic2NyaXB0aW9ucygpIHtcbiAgICAvLyBJbml0aWFsIGNvbXB1dGF0aW9uXG4gICAgcmVjb21wdXRlQWxsQ29uZmlncygpO1xuICAgIC8vIFN1YnNjcmliZSB0byBhbGwgaW5wdXQgc3RvcmVzIHdpdGggYSBzaW5nbGUgaGFuZGxlclxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBvbmx5IHJlY29tcHV0ZSBvbmNlIGV2ZW4gaWYgbXVsdGlwbGUgc3RvcmVzIGNoYW5nZSBzaW11bHRhbmVvdXNseVxuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMucHVzaChjb25maWdJbnRlcm5hbFN0b3JlLnN1YnNjcmliZShyZWNvbXB1dGVBbGxDb25maWdzKSk7XG4gICAgY29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKHRlbXBvcmFyeUNvbmZpZ1N0b3JlLnN1YnNjcmliZShyZWNvbXB1dGVBbGxDb25maWdzKSk7XG4gICAgY29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKGNvbmZpZ0V4dGVuc2lvblN0b3JlLnN1YnNjcmliZShyZWNvbXB1dGVBbGxDb25maWdzKSk7XG59XG4vLyBTZXQgdXAgc3Vic2NyaXB0aW9ucyBhdCBtb2R1bGUgbG9hZCB0aW1lXG5zZXR1cENvbmZpZ1N1YnNjcmlwdGlvbnMoKTtcbmZ1bmN0aW9uIGNvbXB1dGVNb2R1bGVDb25maWcoc3RhdGUsIHRlbXBTdGF0ZSkge1xuICAgIGZvciAobGV0IG1vZHVsZU5hbWUgb2YgT2JqZWN0LmtleXMoc3RhdGUuc2NoZW1hcykpe1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzY2hlbWEgY291bGQgYmUgZWl0aGVyIGp1c3QgdGhlIGltcGxpY2l0IHNjaGVtYSBvciB0aGUgYWN0dWFsbHlcbiAgICAgICAgLy8gZGVmaW5lZCBzY2hlbWEuIFdlIHJ1biB3aXRoIGp1c3QgdGhlIGltcGxpY2l0IHNjaGVtYSBiZWNhdXNlIHdlIHdhbnQgdG8gcG9wdWxhdGVcbiAgICAgICAgLy8gdGhlIGNvbmZpZyBzdG9yZSB3aXRoIHRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgYXMgc29vbiBhcyBwb3NzaWJsZS4gSW4gZmFjdCwgdGhlXG4gICAgICAgIC8vIHRyYW5zbGF0aW9uIHN5c3RlbSB3aWxsIHRocm93IGZvciBTdXNwZW5zZSB1bnRpbCB0aGUgdHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFyZVxuICAgICAgICAvLyBhdmFpbGFibGUsIHdoaWNoIGFzIG9mIHRoaXMgd3JpdGluZyBibG9ja3MgdGhlIHNjaGVtYSBkZWZpbml0aW9uIGZyb20gb2NjdXJyaW5nXG4gICAgICAgIC8vIGZvciBtb2R1bGVzIGxvYWRlZCBiYXNlZCBvbiB0aGVpciBleHRlbnNpb25zLlxuICAgICAgICBjb25zdCBtb2R1bGVTdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICBsZXQgbmV3U3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZS5tb2R1bGVMb2FkZWRbbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zvck1vZHVsZShtb2R1bGVOYW1lLCBzdGF0ZSwgdGVtcFN0YXRlKTtcbiAgICAgICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGb3JNb2R1bGVJbXBsaWNpdFNjaGVtYShtb2R1bGVOYW1lLCBzdGF0ZSwgdGVtcFN0YXRlKTtcbiAgICAgICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG1vZHVsZVN0b3JlLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc3RhdGUsIHRlbXBTdGF0ZSkge1xuICAgIGNvbnN0IHNsb3RDb25maWdzID0gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ3Moc3RhdGUsIHRlbXBTdGF0ZSk7XG4gICAgY29uc3QgbmV3U2xvdFN0b3JlRW50cmllcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhzbG90Q29uZmlncykubWFwKChbc2xvdE5hbWUsIGNvbmZpZ10pPT5bXG4gICAgICAgICAgICBzbG90TmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICB9XG4gICAgICAgIF0pKTtcbiAgICBjb25zdCBzbG90U3RvcmUgPSBnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlKCk7XG4gICAgY29uc3Qgb2xkU3RhdGUgPSBzbG90U3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgIC4uLm9sZFN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgLi4ubmV3U2xvdFN0b3JlRW50cmllc1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoIWVxdWFscyhvbGRTdGF0ZS5zbG90cywgbmV3U3RhdGUuc2xvdHMpKSB7XG4gICAgICAgIHNsb3RTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0SW1wbGVtZW50ZXJUb29sc0NvbmZpZyhzdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgY29uZmlnXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSBvbiB0aGUgYWN0dWFsIGNvbmZpZyBjb250ZW50LCBub3QgdGhlIHdyYXBwZXIgb2JqZWN0XG4gICAgaWYgKCFlcXVhbHMob2xkU3RhdGUuY29uZmlnLCBuZXdTdGF0ZS5jb25maWcpKSB7XG4gICAgICAgIGltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MoY29uZmlnU3RhdGUsIGV4dGVuc2lvblN0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBjb25maWdzID0ge307XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIG1vZHVsZSBzY2hlbWEgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLCBzaW5jZSB0aGUgZXh0ZW5zaW9uXG4gICAgLy8gaXQgY29udGFpbnMgaXMgbW91bnRlZC5cbiAgICBmb3IgKGxldCBleHRlbnNpb24gb2YgZXh0ZW5zaW9uU3RhdGUubW91bnRlZEV4dGVuc2lvbnMpe1xuICAgICAgICBjb25zdCBjb25maWcgPSBjb21wdXRlRXh0ZW5zaW9uQ29uZmlnKGV4dGVuc2lvbi5zbG90TW9kdWxlTmFtZSwgZXh0ZW5zaW9uLmV4dGVuc2lvbk1vZHVsZU5hbWUsIGV4dGVuc2lvbi5zbG90TmFtZSwgZXh0ZW5zaW9uLmV4dGVuc2lvbklkLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICAgICAgaWYgKCFjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0pIHtcbiAgICAgICAgICAgIGNvbmZpZ3NbZXh0ZW5zaW9uLnNsb3ROYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZ3NbZXh0ZW5zaW9uLnNsb3ROYW1lXVtleHRlbnNpb24uZXh0ZW5zaW9uSWRdID0ge1xuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgbG9hZGVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSgpO1xuICAgIGNvbnN0IG9sZFN0YXRlID0gZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIGNvbmZpZ3NcbiAgICB9O1xuICAgIC8vIFVzZSBkZWVwIGVxdWFsaXR5IHRvIG9ubHkgdXBkYXRlIGlmIGNvbmZpZ3MgYWN0dWFsbHkgY2hhbmdlZFxuICAgIGlmICghZXF1YWxzKG9sZFN0YXRlLmNvbmZpZ3MsIG5ld1N0YXRlLmNvbmZpZ3MpKSB7XG4gICAgICAgIGV4dGVuc2lvbnNDb25maWdTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuLypcbiAqIEFQSVxuICpcbiAqLyAvKipcbiAqIFRoaXMgZGVmaW5lcyBhIGNvbmZpZ3VyYXRpb24gc2NoZW1hIGZvciBhIG1vZHVsZS4gVGhlIHNjaGVtYSB0ZWxscyB0aGVcbiAqIGNvbmZpZ3VyYXRpb24gc3lzdGVtIGhvdyB0aGUgbW9kdWxlIGNhbiBiZSBjb25maWd1cmVkLiBJdCBzcGVjaWZpZXNcbiAqIHdoYXQgbWFrZXMgY29uZmlndXJhdGlvbiB2YWxpZCBvciBpbnZhbGlkLlxuICpcbiAqIFNlZSBbQ29uZmlndXJhdGlvbiBTeXN0ZW1dKGh0dHBzOi8vbzMtZG9jcy5vcGVubXJzLm9yZy9kb2NzL2NvbmZpZ3VyYXRpb24tc3lzdGVtKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGVmaW5pbmcgYSBjb25maWcgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIE5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgc2NoZW1hIGlzIGJlaW5nIGRlZmluZWQgZm9yLiBHZW5lcmFsbHlcbiAqICAgc2hvdWxkIGJlIHRoZSBvbmUgaW4gd2hpY2ggdGhlIGBkZWZpbmVDb25maWdTY2hlbWFgIGNhbGwgdGFrZXMgcGxhY2UuXG4gKiBAcGFyYW0gc2NoZW1hIFRoZSBjb25maWcgc2NoZW1hIGZvciB0aGUgbW9kdWxlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBzY2hlbWEpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBzY2hlbWEpO1xuICAgIGNvbnN0IGVuaGFuY2VkU2NoZW1hID0gbWVyZ2VEZWVwUmlnaHQoc2NoZW1hLCBpbXBsaWNpdENvbmZpZ1NjaGVtYSk7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2NoZW1hcyxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IGVuaGFuY2VkU2NoZW1hXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW9kdWxlTG9hZGVkOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUubW9kdWxlTG9hZGVkLFxuICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFRoaXMgYWxlcnRzIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSB0aGF0IGEgbW9kdWxlIGV4aXN0cy4gVGhpcyBhbGxvd3MgY29uZmlnIHRvIGJlXG4gKiBwcm9jZXNzZWQsIHdoaWxlIHN0aWxsIGFsbG93aW5nIHRoZSBleHRlbnNpb24gc3lzdGVtIHRvIGtub3cgd2hldGhlciB0aGUgbW9kdWxlIGhhc1xuICogYWN0dWFsbHkgaGFkIGl0cyBmcm9udCBidW5kbGUgZXhlY3V0ZWQgeWV0LlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG1vZHVsZU5hbWVcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVXaXRoQ29uZmlnU3lzdGVtKG1vZHVsZU5hbWUpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHNjaGVtYXM6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zY2hlbWFzLFxuICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXTogaW1wbGljaXRDb25maWdTY2hlbWFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsZXJ0cyB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gdGhhdCBhIG1vZHVsZSBoYXMgYmVlbiBsb2FkZWQuXG4gKlxuICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIGVzbS1hcHAtc2hlbGwuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0gbW9kdWxlTmFtZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vZHVsZUxvYWQobW9kdWxlTmFtZSkge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgbW9kdWxlTG9hZGVkOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUubW9kdWxlTG9hZGVkLFxuICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFRoaXMgYWxsb3dzIHRoZSBjb25maWcgc3lzdGVtIHRvIHN1cHBvcnQgdHJhbnNsYXRpb24gb3ZlcnJpZGVzIGZvciBuYW1lc3BhY2VzIHRoYXRcbiAqIGRvIG5vdCBjb3JyZXNwb25kIHRvIG1vZHVsZXMuXG4gKlxuICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIGVzbS1hcHAtc2hlbGwuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0gbmFtZXNwYWNlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVHJhbnNsYXRpb25OYW1lc3BhY2UobmFtZXNwYWNlKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2NoZW1hcyxcbiAgICAgICAgICAgICAgICBbbmFtZXNwYWNlXTogdHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGRlZmluZXMgYSBjb25maWd1cmF0aW9uIHNjaGVtYSBmb3IgYW4gZXh0ZW5zaW9uLiBXaGVuIGEgc2NoZW1hIGlzIGRlZmluZWRcbiAqIGZvciBhbiBleHRlbnNpb24sIHRoYXQgZXh0ZW5zaW9uIHdpbGwgcmVjZWl2ZSB0aGUgY29uZmlndXJhdGlvbiBjb3JyZXNwb25kaW5nXG4gKiB0byB0aGF0IHNjaGVtYSwgcmF0aGVyIHRoYW4gdGhlIGNvbmZpZ3VyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbW9kdWxlXG4gKiBpbiB3aGljaCBpdCBpcyBkZWZpbmVkLlxuICpcbiAqIFRoZSBzY2hlbWEgdGVsbHMgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIGhvdyB0aGUgbW9kdWxlIGNhbiBiZSBjb25maWd1cmVkLlxuICogSXQgc3BlY2lmaWVzIHdoYXQgbWFrZXMgY29uZmlndXJhdGlvbiB2YWxpZCBvciBpbnZhbGlkLlxuICpcbiAqIFNlZSBbQ29uZmlndXJhdGlvbiBTeXN0ZW1dKGh0dHBzOi8vbzMtZG9jcy5vcGVubXJzLm9yZy9kb2NzL2NvbmZpZ3VyYXRpb24tc3lzdGVtKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGVmaW5pbmcgYSBjb25maWcgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSBleHRlbnNpb25OYW1lIE5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0aGUgc2NoZW1hIGlzIGJlaW5nIGRlZmluZWQgZm9yLlxuICogICBTaG91bGQgbWF0Y2ggdGhlIGBuYW1lYCBvZiBvbmUgb2YgdGhlIGBleHRlbnNpb25zYCBlbnRyaWVzIGRlZmluZWQgaW5cbiAqICAgdGhlIGFwcCdzIGByb3V0ZXMuanNvbmAgZmlsZS5cbiAqIEBwYXJhbSBzY2hlbWEgVGhlIGNvbmZpZyBzY2hlbWEgZm9yIHRoZSBleHRlbnNpb25cbiAqLyBleHBvcnQgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uQ29uZmlnU2NoZW1hKGV4dGVuc2lvbk5hbWUsIHNjaGVtYSkge1xuICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKGV4dGVuc2lvbk5hbWUsIHNjaGVtYSk7XG4gICAgY29uc3QgZW5oYW5jZWRTY2hlbWEgPSBtZXJnZURlZXBSaWdodChzY2hlbWEsIGltcGxpY2l0Q29uZmlnU2NoZW1hKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBpZiAoc3RhdGUuc2NoZW1hc1tleHRlbnNpb25OYW1lXSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb25maWcgc2NoZW1hIGZvciBleHRlbnNpb24gJHtleHRlbnNpb25OYW1lfSBhbHJlYWR5IGV4aXN0cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGV4dGVuc2lvbnMgd2l0aCB0aGlzIHNhbWUgbmFtZSwgb25lIHdpbGwgcHJvYmFibHkgY3Jhc2guYCk7XG4gICAgfVxuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW2V4dGVuc2lvbk5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb2dyYW1tYXRpY2FsbHkuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG9cbiAqIHByb3ZpZGluZyBjb25maWd1cmF0aW9uIHRocm91Z2ggdGhlIGNvbmZpZy1maWxlLiBDb25maWd1cmF0aW9uIHByb3ZpZGVkIHRoaXNcbiAqIHdheSB3aWxsIGJlIG1lcmdlZCB3aXRoIGNvbmZpZ3VyYXRpb24gZnJvbSBvdGhlciBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgQSBjb25maWd1cmF0aW9uIG9iamVjdCB0byBtZXJnZSBpbnRvIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZU5hbWUgQW4gb3B0aW9uYWwgbmFtZSB0byBpZGVudGlmeSB0aGUgc291cmNlIG9mIHRoaXMgY29uZmlndXJhdGlvbixcbiAqICAgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBEZWZhdWx0cyB0byAncHJvdmlkZWQnLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm92aWRlKGNvbmZpZywgc291cmNlTmFtZSA9ICdwcm92aWRlZCcpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHByb3ZpZGVkQ29uZmlnczogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnByb3ZpZGVkQ29uZmlncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEEgcHJvbWlzZS1iYXNlZCB3YXkgdG8gYWNjZXNzIHRoZSBjb25maWcgYXMgc29vbiBhcyBpdCBpcyBmdWxseSBsb2FkZWQuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGxvYWRlZCwgcmVzb2x2ZXMgdGhlIGNvbmZpZyBpbiBpdHMgcHJlc2VudCBzdGF0ZS5cbiAqXG4gKiBUaGlzIGlzIGEgdXNlZnVsIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgY29uZmlnIGluIHRoZSBjb3Vyc2VcbiAqIG9mIHRoZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZvciB3aGljaCB0byBsb29rIHVwIHRoZSBjb25maWdcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKG1vZHVsZU5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgIGNvbnN0IHN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBvbWl0KFtcbiAgICAgICAgICAgICAgICAgICAgJ0Rpc3BsYXkgY29uZGl0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnXG4gICAgICAgICAgICAgICAgXSwgc3RhdGUuY29uZmlnKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgYW4gZXh0ZW5zaW9uLCBvcHRpb25hbGx5IHNjb3BlZCB0byBhIHNwZWNpZmljXG4gKiBleHRlbnNpb24gc2xvdC4gV2hlbiBjYWxsZWQgd2l0aCBvbmx5IGEgbW9kdWxlIG5hbWUsIHJldHJpZXZlcyBtb2R1bGUtbGV2ZWwgb3ZlcnJpZGVzLlxuICogVHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFsbG93IGN1c3RvbWl6aW5nIHRyYW5zbGF0ZWQgc3RyaW5ncyB3aXRob3V0IG1vZGlmeWluZyB0aGVcbiAqIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgcHJvdmlkaW5nIHRoZSB0cmFuc2xhdGlvbiBjb250ZXh0LlxuICogQHBhcmFtIHNsb3ROYW1lIE9wdGlvbmFsIGV4dGVuc2lvbiBzbG90IG5hbWUgdG8gaW5jbHVkZSBzbG90LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSBleHRlbnNpb25JZCBPcHRpb25hbCBleHRlbnNpb24gSUQgdG8gaW5jbHVkZSBleHRlbnNpb24tc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbiBvdmVycmlkZSBvYmplY3RzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyhtb2R1bGVOYW1lLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkICYmIHN0YXRlLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbk92ZXJyaWRlcyA9IHN0YXRlLmNvbmZpZ1snVHJhbnNsYXRpb24gb3ZlcnJpZGVzJ10gPz8ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJhbnNsYXRpb25PdmVycmlkZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGUoY29uZmlnU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbmZpZ1N0b3JlLnN1YnNjcmliZSh1cGRhdGUpO1xuICAgICAgICB9KVxuICAgIF07XG4gICAgaWYgKHNsb3ROYW1lICYmIGV4dGVuc2lvbklkKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbkNvbmZpZyhzbG90TmFtZSwgZXh0ZW5zaW9uSWQpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXMgPSBzdGF0ZS5jb25maWdbJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyddID8/IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRyYW5zbGF0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlKGNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb25maWdTdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgaW50ZXJwb2xhdGUgZGVmYXVsdHMgZm9yIGBwcm92aWRlZENvbmZpZ2AgYWNjb3JkaW5nIHRvIGBzY2hlbWFgXG4gKlxuICogQHBhcmFtIHNjaGVtYSAgYSBjb25maWd1cmF0aW9uIHNjaGVtYVxuICogQHBhcmFtIHByb3ZpZGVkQ29uZmlnICBhbiBvYmplY3Qgb2YgY29uZmlnIHZhbHVlcyAod2l0aG91dCB0aGUgdG9wLWxldmVsIG1vZHVsZSBuYW1lKVxuICogQHBhcmFtIGtleVBhdGhDb250ZXh0ICBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHdoaWNoIGhlbHBzIHRoZSB1c2VyIGZpZ3VyZSBvdXQgd2hlcmVcbiAqICAgICB0aGUgcHJvdmlkZWQgY29uZmlnIGNhbWUgZnJvbVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBhbmQgcHJvY2Vzc2VkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggZGVmYXVsdHMgYXBwbGllZC5cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uZmlnKHNjaGVtYSwgcHJvdmlkZWRDb25maWcsIGtleVBhdGhDb250ZXh0KSB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBwcm92aWRlZENvbmZpZywga2V5UGF0aENvbnRleHQpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgcHJvdmlkZWRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIGtleVBhdGhDb250ZXh0KTtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqXG4gKi8gLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZvciBhbiBleHRlbnNpb24uIFRoaXMgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpY1xuICogdG8gdGhlIHNsb3QgaW4gd2hpY2ggaXQgaXMgbW91bnRlZCwgYW5kIGl0cyBJRCB3aXRoaW4gdGhhdCBzbG90LlxuICpcbiAqIFRoZSBzY2hlbWEgZm9yIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGUgZXh0ZW5zaW9uIHNjaGVtYS4gSWYgbm8gZXh0ZW5zaW9uXG4gKiBzY2hlbWEgaGFzIGJlZW4gcHJvdmlkZWQsIHRoZSBzY2hlbWEgdXNlZCBpcyB0aGUgc2NoZW1hIG9mIHRoZSBtb2R1bGUgaW5cbiAqIHdoaWNoIHRoZSBleHRlbnNpb24gaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gc2xvdE1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbk1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gKGFuZCB0aGVyZWZvcmUgdGhlIGNvbmZpZyBzY2hlbWEpXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBzbG90IHdoZXJlIHRoZSBleHRlbnNpb24gaXMgbW91bnRlZFxuICogQHBhcmFtIGV4dGVuc2lvbklkIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIGluIGl0cyBzbG90XG4gKi8gZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhzbG90TW9kdWxlTmFtZSwgZXh0ZW5zaW9uTW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZ1NjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV07XG4gICAgY29uc3QgbmFtZU9mU2NoZW1hU291cmNlID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8gZXh0ZW5zaW9uTmFtZSA6IGV4dGVuc2lvbk1vZHVsZU5hbWU7XG4gICAgY29uc3QgcHJvdmlkZWRDb25maWdzID0gZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbnN0IHNsb3RNb2R1bGVDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3Ioc2xvdE1vZHVsZU5hbWUsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29uZmlnT3ZlcnJpZGUgPSBzbG90TW9kdWxlQ29uZmlnPy5leHRlbnNpb25TbG90cz8uW3Nsb3ROYW1lXT8uY29uZmlndXJlPy5bZXh0ZW5zaW9uSWRdID8/IHt9O1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IG1lcmdlQ29uZmlnc0ZvcihuYW1lT2ZTY2hlbWFTb3VyY2UsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29tYmluZWRDb25maWcgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICBleHRlbnNpb25Db25maWcsXG4gICAgICAgIGNvbmZpZ092ZXJyaWRlXG4gICAgXSk7XG4gICAgY29uc3Qgc2NoZW1hID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8/IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTW9kdWxlTmFtZV07XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb21iaW5lZENvbmZpZywgbmFtZU9mU2NoZW1hU291cmNlKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGNvbWJpbmVkQ29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBuYW1lT2ZTY2hlbWFTb3VyY2UpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGxldCByZXN1bHQgPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhjbG9uZShjb25maWdTdGF0ZS5zY2hlbWFzKSk7XG4gICAgY29uc3QgY29uZmlnc0FuZFNvdXJjZXMgPSBbXG4gICAgICAgIC4uLmNvbmZpZ1N0YXRlLnByb3ZpZGVkQ29uZmlncy5tYXAoKGMpPT5bXG4gICAgICAgICAgICAgICAgYy5jb25maWcsXG4gICAgICAgICAgICAgICAgYy5zb3VyY2VcbiAgICAgICAgICAgIF0pLFxuICAgICAgICBbXG4gICAgICAgICAgICB0ZW1wQ29uZmlnU3RhdGUuY29uZmlnLFxuICAgICAgICAgICAgJ3RlbXBvcmFyeSBjb25maWcnXG4gICAgICAgIF1cbiAgICBdO1xuICAgIGZvciAobGV0IFtjb25maWcsIHNvdXJjZV0gb2YgY29uZmlnc0FuZFNvdXJjZXMpe1xuICAgICAgICByZXN1bHQgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUoY29uZmlnLCBzb3VyY2UpXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMoc2NoZW1hKSB7XG4gICAgaWYgKHNjaGVtYS5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc2NoZW1hLFxuICAgICAgICAgICAgX3ZhbHVlOiBzY2hlbWEuX2RlZmF1bHQsXG4gICAgICAgICAgICBfc291cmNlOiAnZGVmYXVsdCdcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzT3JkaW5hcnlPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICAgICAgb2JqW2tleV0gPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhzY2hlbWFba2V5XSk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgdGhlIHNjaGVtYSBpcyBiYWQgYW5kIGFuIGVycm9yIHdpbGwgaGF2ZSBiZWVuIGxvZ2dlZCBkdXJpbmcgc2NoZW1hIHZhbGlkYXRpb25cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlKGNvbmZpZywgc291cmNlKSB7XG4gICAgaWYgKGlzT3JkaW5hcnlPYmplY3QoY29uZmlnKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICAgICAgb2JqW2tleV0gPSBjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZShjb25maWdba2V5XSwgc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX3ZhbHVlOiBjb25maWcsXG4gICAgICAgICAgICBfc291cmNlOiBzb3VyY2VcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb25TbG90Q29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgYWxsQ29uZmlncyA9IG1lcmdlQ29uZmlncyhnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkpO1xuICAgIGNvbnN0IHNsb3RDb25maWdQZXJNb2R1bGUgPSBPYmplY3Qua2V5cyhhbGxDb25maWdzKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICBpZiAoYWxsQ29uZmlnc1trZXldPy5leHRlbnNpb25TbG90cykge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBhbGxDb25maWdzW2tleV0/LmV4dGVuc2lvblNsb3RzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30pO1xuICAgIHZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc2xvdENvbmZpZ1Blck1vZHVsZSk7XG4gICAgY29uc3Qgc2xvdENvbmZpZ3MgPSBPYmplY3Qua2V5cyhzbG90Q29uZmlnUGVyTW9kdWxlKS5yZWR1Y2UoKG9iaiwga2V5KT0+e1xuICAgICAgICBvYmogPSB7XG4gICAgICAgICAgICAuLi5vYmosXG4gICAgICAgICAgICAuLi5zbG90Q29uZmlnUGVyTW9kdWxlW2tleV1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuIHNsb3RDb25maWdzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVBbGxFeHRlbnNpb25TbG90Q29uZmlncyhzbG90Q29uZmlnUGVyTW9kdWxlKSB7XG4gICAgZm9yIChsZXQgW21vZHVsZU5hbWUsIGNvbmZpZ0J5U2xvdE5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHNsb3RDb25maWdQZXJNb2R1bGUpKXtcbiAgICAgICAgZm9yIChsZXQgW3Nsb3ROYW1lLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ0J5U2xvdE5hbWUpKXtcbiAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyhjb25maWcsIG1vZHVsZU5hbWUsIHNsb3ROYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyhjb25maWcsIG1vZHVsZU5hbWUsIHNsb3ROYW1lKSB7XG4gICAgY29uc3Qga2V5UGF0aCA9IGAke21vZHVsZU5hbWV9LmV4dGVuc2lvblNsb3RzLiR7c2xvdE5hbWV9YDtcbiAgICBjb25zdCBlcnJvclByZWZpeCA9IGBFeHRlbnNpb24gc2xvdCBjb25maWcgJyR7a2V5UGF0aH0nYDtcbiAgICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKGNvbmZpZykuZmlsdGVyKChrKT0+IVtcbiAgICAgICAgICAgICdhZGQnLFxuICAgICAgICAgICAgJ3JlbW92ZScsXG4gICAgICAgICAgICAnb3JkZXInLFxuICAgICAgICAgICAgJ2NvbmZpZ3VyZSdcbiAgICAgICAgXS5pbmNsdWRlcyhrKSk7XG4gICAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCkge1xuICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAnIGNvbnRhaW5zIGludmFsaWQga2V5cyAnJHtpbnZhbGlkS2V5cy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGlmIChjb25maWcuYWRkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcuYWRkKSB8fCAhY29uZmlnLmFkZC5ldmVyeSgobik9PnR5cGVvZiBuID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5hZGQnIGlzIGludmFsaWQuIE11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyAoZXh0ZW5zaW9uIElEcylgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlbW92ZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLnJlbW92ZSkgfHwgIWNvbmZpZy5yZW1vdmUuZXZlcnkoKG4pPT50eXBlb2YgbiA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAucmVtb3ZlJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5vcmRlcikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLm9yZGVyKSB8fCAhY29uZmlnLm9yZGVyLmV2ZXJ5KChuKT0+dHlwZW9mIG4gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLm9yZGVyJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5jb25maWd1cmUpIHtcbiAgICAgICAgaWYgKCFpc09yZGluYXJ5T2JqZWN0KGNvbmZpZy5jb25maWd1cmUpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAuY29uZmlndXJlJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIG9iamVjdCB3aXRoIGV4dGVuc2lvbiBJRHMgZm9yIGtleXNgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgLi4uY29uZmlnU3RhdGUucHJvdmlkZWRDb25maWdzLm1hcCgoYyk9PmMuY29uZmlnKSxcbiAgICAgICAgdGVtcENvbmZpZ1N0YXRlLmNvbmZpZ1xuICAgIF07XG59XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgY29uZmlnIHNjaGVtYSBmb3IgYSBtb2R1bGUuIFNpbmNlIHByb2JsZW1zIGlkZW50aWZpZWQgaGVyZSBhcmUgcHJvZ3JhbW1pbmcgZXJyb3JzXG4gKiB0aGF0IGhvcGVmdWxseSB3aWxsIGJlIGNhdWdodCBkdXJpbmcgZGV2ZWxvcG1lbnQsIHRoaXMgZnVuY3Rpb24gbG9ncyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUgZGlyZWN0bHk7XG4gKiBpdCdzIGZpbmUgaWYgd2Ugc3BhbSB0aGUgdXNlciB3aXRoIHRoZXNlIGVycm9ycy5cbiAqLyBmdW5jdGlvbiB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBzY2hlbWEsIGtleVBhdGggPSAnJykge1xuICAgIGNvbnN0IHVwZGF0ZU1lc3NhZ2UgPSBgUGxlYXNlIHZlcmlmeSB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kLCBpZiBzbywgYWxlcnQgdGhlIG1haW50YWluZXIuYDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoayk9PiFrLnN0YXJ0c1dpdGgoJ18nKSkpe1xuICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAoa2V5UGF0aCAmJiAnLicpICsga2V5O1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIGlmICh0aGlzS2V5UGF0aCA9PT0gJ0Rpc3BsYXkgY29uZGl0aW9ucycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gZGVjbGFyZXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBjYWxsZWQgXCJEaXNwbGF5IGNvbmRpdGlvbnNcIjsgdGhlIFwiRGlzcGxheSBjb25kaXRpb25zXCIgb3B0aW9uIGlzIGEgcmVzZXJ2ZWQgbmFtZS4gJHt1cGRhdGVNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzS2V5UGF0aCA9PT0gJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gZGVjbGFyZXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBjYWxsZWQgXCJUcmFuc2xhdGlvbiBvdmVycmlkZXNcIjsgdGhlIFwiVHJhbnNsYXRpb24gb3ZlcnJpZGVzXCIgb3B0aW9uIGlzIGEgcmVzZXJ2ZWQgbmFtZS4gJHt1cGRhdGVNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNPcmRpbmFyeU9iamVjdChzY2hlbWFQYXJ0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgYmFkIGNvbmZpZyBzY2hlbWEgZGVmaW5pdGlvbiBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkge1xuICAgICAgICAgICAgLy8gcmVjdXJzZSBmb3IgbmVzdGVkIGNvbmZpZyBrZXlzXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBzY2hlbWFQYXJ0LCB0aGlzS2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBzY2hlbWFQYXJ0Ll9lbGVtZW50cztcbiAgICAgICAgaWYgKGhhc09iamVjdFNjaGVtYShlbGVtZW50cykpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIGVsZW1lbnRzLCB0aGlzS2V5UGF0aCArICcuX2VsZW1lbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3ZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHZhbGlkYXRvciBvZiBzY2hlbWFQYXJ0Ll92YWxpZGF0b3JzKXtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBpbnZhbGlkIHZhbGlkYXRvciBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScgJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdmFsaWRhdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBlaXRoZXIgYCArIGB1bmRlZmluZWQgb3IgYW4gZXJyb3Igc3RyaW5nLiBSZWNlaXZlZCAke3ZhbGlkYXRvcn0uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHNjaGVtYVBhcnQuX3R5cGU7XG4gICAgICAgIGlmICh2YWx1ZVR5cGUgJiYgIU9iamVjdC52YWx1ZXMoVHlwZSkuaW5jbHVkZXModmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgaW52YWxpZCB0eXBlIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9JyAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiB0aGUgYWxsb3dlZCB0eXBlcyBhcmUgJHtPYmplY3QudmFsdWVzKFR5cGUpLmpvaW4oJywgJyl9LiBgICsgYFJlY2VpdmVkICcke3ZhbHVlVHlwZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYVBhcnQpLmV2ZXJ5KChrKT0+W1xuICAgICAgICAgICAgICAgICdfZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICdfdmFsaWRhdG9ycycsXG4gICAgICAgICAgICAgICAgJ19lbGVtZW50cycsXG4gICAgICAgICAgICAgICAgJ190eXBlJ1xuICAgICAgICAgICAgXS5pbmNsdWRlcyhrKSkgJiYgIWtleVBhdGguaW5jbHVkZXMoJy5fZWxlbWVudHMnKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgYmFkIGNvbmZpZyBzY2hlbWEgZGVmaW5pdGlvbiBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScuICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IGFsbCBjb25maWcgZWxlbWVudHMgbXVzdCBoYXZlIGEgZGVmYXVsdC4gYCArIGBSZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KHNjaGVtYVBhcnQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50cyAmJiB2YWx1ZVR5cGUgJiYgIVtcbiAgICAgICAgICAgIFR5cGUuQXJyYXksXG4gICAgICAgICAgICBUeXBlLk9iamVjdFxuICAgICAgICBdLmluY2x1ZGVzKHZhbHVlVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiB0aGUgJ2VsZW1lbnRzJyBrZXkgb25seSB3b3JrcyB3aXRoICdfdHlwZScgZXF1YWwgdG8gJ0FycmF5JyBvciAnT2JqZWN0Jy4gYCArIGBSZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KHZhbHVlVHlwZSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRDb25maWdGb3JNb2R1bGUobW9kdWxlTmFtZSwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbbW9kdWxlTmFtZV07XG4gICAgY29uc3QgaW5wdXRDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3IobW9kdWxlTmFtZSwgZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGlucHV0Q29uZmlnLCBtb2R1bGVOYW1lKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGlucHV0Q29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBtb2R1bGVOYW1lKTtcbiAgICBkZWxldGUgY29uZmlnLmV4dGVuc2lvblNsb3RzO1xuICAgIHJldHVybiBjb25maWc7XG59XG5mdW5jdGlvbiBnZXRDb25maWdGb3JNb2R1bGVJbXBsaWNpdFNjaGVtYShtb2R1bGVOYW1lLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgaW5wdXRDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3IobW9kdWxlTmFtZSwgZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhpbXBsaWNpdENvbmZpZ1NjaGVtYSwgaW5wdXRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoaW1wbGljaXRDb25maWdTY2hlbWEsIGNvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgZGVsZXRlIGNvbmZpZy5leHRlbnNpb25TbG90cztcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGFsbENvbmZpZ3MpIHtcbiAgICBjb25zdCBhbGxDb25maWdzRm9yTW9kdWxlID0gYWxsQ29uZmlncy5tYXAoKHsgW21vZHVsZU5hbWVdOiBjIH0pPT5jKS5maWx0ZXIoKGMpPT4hIWMpO1xuICAgIHJldHVybiBtZXJnZUNvbmZpZ3MoYWxsQ29uZmlnc0Zvck1vZHVsZSk7XG59XG5mdW5jdGlvbiBtZXJnZUNvbmZpZ3MoY29uZmlncykge1xuICAgIGNvbnN0IG1lcmdlRGVlcEFsbCA9IHJlZHVjZShtZXJnZURlZXBSaWdodCk7XG4gICAgcmV0dXJuIG1lcmdlRGVlcEFsbCh7fSwgY29uZmlncyk7XG59XG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWcgdHJlZSB0byBtYWtlIHN1cmUgdGhhdCBhbGxcbiAqIG9mIHRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIGV4aXN0IGluIHRoZSBzY2hlbWEsIGFuZCB0aGF0IHR5cGVzIGFyZVxuICogY29ycmVjdC4gRG9lcyBub3QgcnVuIHZhbGlkYXRvcnMgeWV0LCBzaW5jZSB0aG9zZSB3aWxsIGJlIHJ1biBvblxuICogdGhlIGNvbmZpZyB3aXRoIHRoZSBkZWZhdWx0cyBmaWxsZWQgaW4uXG4gKi8gZnVuY3Rpb24gdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb25maWcsIGtleVBhdGggPSAnJykge1xuICAgIC8vIHZhbGlkYXRlIGVhY2ggY29uc3RpdHVlbnQgZWxlbWVudFxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpe1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAnLicgKyBrZXk7XG4gICAgICAgIGNvbnN0IHNjaGVtYVBhcnQgPSBzY2hlbWFba2V5XTtcbiAgICAgICAgaWYgKCFzY2hlbWEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgaWYgKCEoa2V5ID09PSAnZXh0ZW5zaW9uU2xvdHMnICYmIGtleVBhdGggIT09ICcnKSkge1xuICAgICAgICAgICAgICAgIGxvZ0Vycm9yKHRoaXNLZXlQYXRoLCBgVW5rbm93biBjb25maWcga2V5ICcke3RoaXNLZXlQYXRofScgcHJvdmlkZWQuIElnbm9yaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUoc2NoZW1hUGFydCwgdmFsdWUsIHRoaXNLZXlQYXRoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCkge1xuICAgIGNoZWNrVHlwZShrZXlQYXRoLCBzY2hlbWFQYXJ0Ll90eXBlLCB2YWx1ZSk7XG4gICAgaWYgKGlzT3JkaW5hcnlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLk9iamVjdCkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgYXMgZnJlZWZvcm0gb2JqZWN0XG4gICAgICAgICAgICB2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICghKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX3R5cGUnKSkpIHtcbiAgICAgICAgICAgIC8vIHZhbGlkYXRlIGFzIG5vcm1hbCBuZXN0ZWQgY29uZmlnXG4gICAgICAgICAgICB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2NoZW1hUGFydC5fdHlwZSA9PT0gVHlwZS5BcnJheSkge1xuICAgICAgICAgICAgdmFsaWRhdGVBcnJheVN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwga2V5UGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlKGZyZWVmb3JtT2JqZWN0U2NoZW1hLCBjb25maWcsIGtleVBhdGgpIHtcbiAgICBpZiAoZnJlZWZvcm1PYmplY3RTY2hlbWEuX2VsZW1lbnRzKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdba2V5XTtcbiAgICAgICAgICAgIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKGZyZWVmb3JtT2JqZWN0U2NoZW1hLl9lbGVtZW50cywgdmFsdWUsIGAke2tleVBhdGh9LiR7a2V5fWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVBcnJheVN0cnVjdHVyZShhcnJheVNjaGVtYSwgdmFsdWUsIGtleVBhdGgpIHtcbiAgICBjb25zdCB2YWxpZGF0ZWRBc0FycmF5ID0gY2hlY2tUeXBlKGtleVBhdGgsIFR5cGUuQXJyYXksIHZhbHVlKTtcbiAgICBpZiAoIXZhbGlkYXRlZEFzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBhcnJheSBlbGVtZW50IG9iamVjdCBzY2hlbWEsIHZlcmlmeSB0aGF0IGVsZW1lbnRzIG1hdGNoIGl0XG4gICAgaWYgKGhhc09iamVjdFNjaGVtYShhcnJheVNjaGVtYS5fZWxlbWVudHMpKSB7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShhcnJheVNjaGVtYS5fZWxlbWVudHMsIHZhbHVlW2ldLCBgJHtrZXlQYXRofVske2l9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNoZWNrVHlwZShgJHtrZXlQYXRofVske2l9XWAsIGFycmF5U2NoZW1hLl9lbGVtZW50cz8uX3R5cGUsIHZhbHVlW2ldKTtcbiAgICB9XG59XG4vKipcbiAqIFJ1biBhbGwgdGhlIHZhbGlkYXRvcnMgaW4gdGhlIGNvbmZpZyB0cmVlLiBUaGlzIHNob3VsZCBiZSBydW5cbiAqIG9uIHRoZSBjb25maWcgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIGZpbGxlZCBpbiB3aXRoIGFsbCB0aGUgZGVmYXVsdHMsIHNpbmNlXG4gKiBoaWdoZXItbGV2ZWwgdmFsaWRhdG9ycyBtYXkgcmVmZXIgdG8gZGVmYXVsdCB2YWx1ZXMuXG4gKi8gZnVuY3Rpb24gcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aCA9ICcnKSB7XG4gICAgLy8gSWYgYCFzY2hlbWFgLCB0aGVyZSBzaG91bGQgaGF2ZSBiZWVuIGEgc3RydWN0dXJhbCB2YWxpZGF0aW9uIGVycm9yIHByaW50ZWQgYWxyZWFkeS5cbiAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgIGlmIChjb25maWcgIT09IHNjaGVtYS5fZGVmYXVsdCkge1xuICAgICAgICAgICAgcnVuVmFsaWRhdG9ycyhrZXlQYXRoLCBzY2hlbWEuX3ZhbGlkYXRvcnMsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT3JkaW5hcnlPYmplY3QoY29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aGlzS2V5UGF0aCA9IGtleVBhdGggKyAnLicgKyBrZXk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWEuX3R5cGUgPT09IFR5cGUuT2JqZWN0ICYmIHNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEuX2VsZW1lbnRzLCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hUGFydCwgdmFsdWUsIHRoaXNLZXlQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb25maWcpICYmIHNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjb25maWcubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLl9lbGVtZW50cywgY29uZmlnW2ldLCBgJHtrZXlQYXRofVske2l9XWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBSdW4gdHlwZSB2YWxpZGF0aW9uIGZvciB0aGUgdmFsdWUsIGxvZ2dpbmcgYW55IGVycm9ycy5cbiAqIEByZXR1cm5zIHRydWUgaWYgdmFsaWRhdGlvbiBwYXNzZXMsIGZhbHNlIG90aGVyd2lzZVxuICovIGZ1bmN0aW9uIGNoZWNrVHlwZShrZXlQYXRoLCBfdHlwZSwgdmFsdWUpIHtcbiAgICBpZiAoX3R5cGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB7XG4gICAgICAgICAgICBBcnJheTogaXNBcnJheSxcbiAgICAgICAgICAgIEJvb2xlYW46IGlzQm9vbGVhbixcbiAgICAgICAgICAgIENvbmNlcHRVdWlkOiBpc1V1aWQsXG4gICAgICAgICAgICBOdW1iZXI6IGlzTnVtYmVyLFxuICAgICAgICAgICAgT2JqZWN0OiBpc09iamVjdCxcbiAgICAgICAgICAgIFN0cmluZzogaXNTdHJpbmcsXG4gICAgICAgICAgICBVVUlEOiBpc1V1aWQsXG4gICAgICAgICAgICBQZXJzb25BdHRyaWJ1dGVUeXBlVXVpZDogaXNVdWlkLFxuICAgICAgICAgICAgUGF0aWVudElkZW50aWZpZXJUeXBlVXVpZDogaXNVdWlkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBydW5WYWxpZGF0b3JzKGtleVBhdGgsIFtcbiAgICAgICAgICAgIHZhbGlkYXRvcltfdHlwZV1cbiAgICAgICAgXSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogUnVucyB2YWxpZGF0b3JzLCBsb2dnaW5nIGVycm9ycy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYWxsIHBhc3MsIGZhbHNlIG90aGVyd2lzZS5cbiAqLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG5mdW5jdGlvbiBydW5WYWxpZGF0b3JzKGtleVBhdGgsIHZhbGlkYXRvcnMsIHZhbHVlKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gdHJ1ZTtcbiAgICBpZiAodmFsaWRhdG9ycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpe1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvclJlc3VsdCA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3JSZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gYEludmFsaWQgY29uZmlndXJhdGlvbiBmb3IgJHtrZXlQYXRofTogJHt2YWxpZGF0b3JSZXN1bHR9YCA6IGBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gdmFsdWUgJHt2YWx1ZX0gZm9yICR7a2V5UGF0aH06ICR7dmFsaWRhdG9yUmVzdWx0fWA7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU2tpcHBpbmcgaW52YWxpZCB2YWxpZGF0b3IgYXQgXCIke2tleVBhdGh9XCIuIEVuY291bnRlcmVkIGVycm9yXFxuXFx0JHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbi8vIFJlY3Vyc2l2ZWx5IGZpbGwgaW4gdGhlIGNvbmZpZyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBzY2hlbWEuXG5jb25zdCBzZXREZWZhdWx0cyA9IChzY2hlbWEsIGlucHV0Q29uZmlnKT0+e1xuICAgIGNvbnN0IGNvbmZpZyA9IGNsb25lKGlucHV0Q29uZmlnKTtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKXtcbiAgICAgICAgY29uc3QgY29uZmlnUGFydCA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIC8vIFRoZSBgc2NoZW1hUGFydCAmJmAgY2xhdXNlIG9mIHRoaXMgYGlmYCBzdGF0ZW1lbnQgd2lsbCBvbmx5IGZhaWxcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2ZXJ5IGludmFsaWQuIEl0IGlzIHRoZXJlIHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tXG4gICAgICAgIC8vIGNyYXNoaW5nIGNvbXBsZXRlbHksIHRob3VnaCBpdCB3aWxsIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB0aGVyZSBzaG91bGQgYmUgbGVnaWJsZSBlcnJvcnMgaW4gdGhlIGNvbnNvbGUgZnJvbVxuICAgICAgICAvLyB0aGUgc2NoZW1hIHZhbGlkYXRvci5cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQgJiYgKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ190eXBlJykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHNjaGVtYVBhcnQgZGVmaW5lcyBhIGNvbmZpZyB2YWx1ZSwgc2luY2UgaXQgaGFzXG4gICAgICAgICAgICAvLyBhIHByb3BlcnR5IGBfdHlwZWAgb3IgYF9kZWZhdWx0YC5cbiAgICAgICAgICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHNjaGVtYVBhcnRbJ19kZWZhdWx0J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIGl0IGlzIGFuIG9iamVjdCBvciBhcnJheSB3aXRoIG9iamVjdCBlbGVtZW50cywgaW4gd2hpY2ggY2FzZSB3ZSByZWN1cnNlXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNjaGVtYVBhcnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhcnQgJiYgaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5ICYmIEFycmF5LmlzQXJyYXkoY29uZmlnUGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnV2l0aERlZmF1bHRzID0gY29uZmlnUGFydC5tYXAoKGNvbmYpPT5zZXREZWZhdWx0cyhlbGVtZW50cywgY29uZikpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IGNvbmZpZ1dpdGhEZWZhdWx0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyhjb25maWdQYXJ0KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdQYXJ0W29iamVjdEtleV0gPSBzZXREZWZhdWx0cyhlbGVtZW50cywgY29uZmlnUGFydFtvYmplY3RLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYVBhcnQpKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBzY2hlbWFQYXJ0IGhhcyBubyBwcm9wZXJ0eSBcIl90eXBlXCIsIGlmIGl0J3MgYW4gb3JkaW5hcnkgb2JqZWN0XG4gICAgICAgICAgICAvLyAodW5saWtlLCBpbXBvcnRhbnRseSwgdGhlIHZhbGlkYXRvcnMgYXJyYXkpLCB3ZSBhc3N1bWUgaXQgaXMgYSBwYXJlbnQgY29uZmlnIHByb3BlcnR5LlxuICAgICAgICAgICAgLy8gV2UgcmVjdXJzZSB0byBjb25maWdba2V5XSBhbmQgc2NoZW1hW2tleV0uIERlZmF1bHQgY29uZmlnW2tleV0gdG8ge30uXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbmZpZ1BhcnQgPSBjb25maWdQYXJ0ID8/IHt9O1xuICAgICAgICAgICAgLy8gVGhlcmUgd2lsbCBoYXZlIGJlZW4gYSB2YWxpZGF0aW9uIGVycm9yIGFscmVhZHkgaWYgY29uZmlnUGFydCBpcyBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChzZWxlY3RlZENvbmZpZ1BhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSBzZXREZWZhdWx0cyhzY2hlbWFQYXJ0LCBzZWxlY3RlZENvbmZpZ1BhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuZnVuY3Rpb24gaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzU2NoZW1hKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudHNTY2hlbWEgJiYgT2JqZWN0LmtleXMoZWxlbWVudHNTY2hlbWEpLmZpbHRlcigoZSk9PiFbXG4gICAgICAgICAgICAnX2RlZmF1bHQnLFxuICAgICAgICAgICAgJ192YWxpZGF0b3JzJ1xuICAgICAgICBdLmluY2x1ZGVzKGUpKS5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbi8qKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHZhbGlkYXRpb24gZXJyb3JzIHdlIGhhdmUgZGlzcGxheWVkLiBFYWNoIG9uZSBzaG91bGQgb25seSBiZSBkaXNwbGF5ZWQgb25jZS4gKi8gbGV0IGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtrZXlQYXRofTo6OiR7bWVzc2FnZX1gO1xuICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUsIGJ1dCBiZWNhdXNlIG9mIGhvdyB0aGluZ3Mgd2luZC11cCB0cmFuc3BpbGVkLCB0aGlzIGlzbid0IGltcG9zc2libGVcbiAgICBpZiAoIWRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcykge1xuICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIGlmICghZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5hZGQoa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIE5vcm1hbGx5LCBjb25maWd1cmF0aW9uIGVycm9ycyBhcmUgb25seSBkaXNwbGF5ZWQgb25jZS4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGxpc3Qgb2ZcbiAqIGRpc3BsYXllZCBlcnJvcnMsIHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpc3BsYXllZCBhZ2Fpbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWdFcnJvcnMoa2V5UGF0aCkge1xuICAgIGlmIChrZXlQYXRoKSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQ2xlYW5zIHVwIGFsbCBjb25maWcgc3RvcmUgc3Vic2NyaXB0aW9ucyBhbmQgcmUtZXN0YWJsaXNoZXMgdGhlbS4gVGhpcyBpcyBwcmltYXJpbHlcbiAqIHVzZWZ1bCBmb3IgdGVzdGluZywgd2hlcmUgc3Vic2NyaXB0aW9ucyBzZXQgdXAgYXQgbW9kdWxlIGxvYWQgdGltZSBuZWVkIHRvIGJlIGNsZWFyZWRcbiAqIGJldHdlZW4gdGVzdHMgdG8gcHJldmVudCBpbmZpbml0ZSB1cGRhdGUgbG9vcHMuIEFmdGVyIGNsZWFyaW5nLCBzdWJzY3JpcHRpb25zIGFyZVxuICogcmUtZXN0YWJsaXNoZWQgc28gdGhlIGNvbmZpZyBzeXN0ZW0gY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkuXG4gKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q29uZmlnU3lzdGVtKCkge1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpPT51bnN1YnNjcmliZSgpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLmxlbmd0aCA9IDA7XG4gICAgc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCk7XG59XG4vKipcbiAqIENvcGllZCBvdmVyIGZyb20gZXNtLWV4dGVuc2lvbnMuIEl0IHJpZ2h0bHkgYmVsb25ncyB0byB0aGF0IG1vZHVsZSwgYnV0IGVzbS1jb25maWdcbiAqIGNhbm5vdCBkZXBlbmQgb24gZXNtLWV4dGVuc2lvbnMuXG4gKi8gZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG4vKipcbiAqIFRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgc2NoZW1hIGlzIHVzZWQgaW4gdGhlIGltcGxpY2l0IHNjaGVtYSBnaXZlbiB0byBldmVyeSBtb2R1bGU7XG4gKiBwbHVzIGFueSBhZGRpdGlvbmFsIHRyYW5zbGF0aW9uIG5hbWVzcGFjZXMgKGF0IHRpbWUgb2Ygd3JpdGluZywgdGhpcyBpcyBqdXN0ICdjb3JlJykuXG4gKi8gY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEgPSB7XG4gICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyc6IHtcbiAgICAgICAgX2Rlc2NyaXB0aW9uOiAnUGVyLWxhbmd1YWdlIG92ZXJyaWRlcyBmb3IgZnJvbnRlbmQgdHJhbnNsYXRpb25zIHNob3VsZCBiZSBrZXllZCBieSBsYW5ndWFnZSBjb2RlIGFuZCBlYWNoIGxhbmd1YWdlIGRpY3Rpb25hcnkgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGtleSBhbmQgdGhlIGRpc3BsYXkgdmFsdWUnLFxuICAgICAgICBfdHlwZTogVHlwZS5PYmplY3QsXG4gICAgICAgIF9kZWZhdWx0OiB7fSxcbiAgICAgICAgX3ZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgIHZhbGlkYXRvcigobyk9Pk9iamVjdC5rZXlzKG8pLmV2ZXJ5KChrKT0+L15bYS16XXsyLDN9KC1bQS1aXXsyLDN9KT8kLy50ZXN0KGspKSwgKG8pPT57XG4gICAgICAgICAgICAgICAgY29uc3QgYmFkS2V5cyA9IE9iamVjdC5rZXlzKG8pLmZpbHRlcigoayk9PiEvXlthLXpdezIsM30oLVtBLVpdezIsM30pPyQvLnRlc3QoaykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgVGhlICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnIG9iamVjdCBzaG91bGQgaGF2ZSBsYW5ndWFnZSBjb2RlcyBmb3Iga2V5cy4gTGFuZ3VhZ2UgY29kZXMgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhIHR3by10by10aHJlZSBsZXR0ZXIgbGFuZ3VhZ2UgY29kZSBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgaHlwaGVuIGFuZCBhIHR3by10by10aHJlZSBsZXR0ZXIgY291bnRyeSBjb2RlLiBUaGUgZm9sbG93aW5nIGtleXMgZG8gbm90IGNvbmZvcm06ICR7YmFkS2V5cy5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgIH1cbn07XG4vKipcbiAqIFRoZSBpbXBsaWNpdENvbmZpZ1NjaGVtYSBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluIGV2ZXJ5IGNvbmZpZ3VyYXRpb24gc2NoZW1hXG4gKi8gY29uc3QgaW1wbGljaXRDb25maWdTY2hlbWEgPSB7XG4gICAgJ0Rpc3BsYXkgY29uZGl0aW9ucyc6IHtcbiAgICAgICAgcHJpdmlsZWdlczoge1xuICAgICAgICAgICAgX2Rlc2NyaXB0aW9uOiAnVGhlIHByaXZpbGVnZShzKSB0aGUgdXNlciBtdXN0IGhhdmUgdG8gdXNlIHRoaXMgZXh0ZW5zaW9uJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLkFycmF5LFxuICAgICAgICAgICAgX2RlZmF1bHQ6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIF9kZXNjcmlwdGlvbjogJ1RoZSBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBleHRlbnNpb24gaXMgZGlzcGxheWVkJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIF9kZWZhdWx0OiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLi4udHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWFcbn07XG4iXSwibmFtZXMiOlsiY2xvbmUiLCJlcXVhbHMiLCJyZWR1Y2UiLCJtZXJnZURlZXBSaWdodCIsIm9taXQiLCJUeXBlIiwiaXNBcnJheSIsImlzQm9vbGVhbiIsImlzVXVpZCIsImlzTnVtYmVyIiwiaXNPYmplY3QiLCJpc1N0cmluZyIsInZhbGlkYXRvciIsImNvbmZpZ0V4dGVuc2lvblN0b3JlIiwiY29uZmlnSW50ZXJuYWxTdG9yZSIsImdldENvbmZpZ1N0b3JlIiwiZ2V0RXh0ZW5zaW9uQ29uZmlnIiwiZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSIsImdldEV4dGVuc2lvbnNDb25maWdTdG9yZSIsImltcGxlbWVudGVyVG9vbHNDb25maWdTdG9yZSIsInRlbXBvcmFyeUNvbmZpZ1N0b3JlIiwiY29uZmlnU3Vic2NyaXB0aW9ucyIsInJlY29tcHV0ZUFsbENvbmZpZ3MiLCJjb25maWdTdGF0ZSIsImdldFN0YXRlIiwidGVtcENvbmZpZ1N0YXRlIiwiZXh0ZW5zaW9uU3RhdGUiLCJjb21wdXRlTW9kdWxlQ29uZmlnIiwiY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWciLCJjb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3MiLCJjb21wdXRlRXh0ZW5zaW9uQ29uZmlncyIsInNldHVwQ29uZmlnU3Vic2NyaXB0aW9ucyIsInB1c2giLCJzdWJzY3JpYmUiLCJzdGF0ZSIsInRlbXBTdGF0ZSIsIm1vZHVsZU5hbWUiLCJPYmplY3QiLCJrZXlzIiwic2NoZW1hcyIsIm1vZHVsZVN0b3JlIiwibmV3U3RhdGUiLCJtb2R1bGVMb2FkZWQiLCJjb25maWciLCJnZXRDb25maWdGb3JNb2R1bGUiLCJ0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZCIsImxvYWRlZCIsImdldENvbmZpZ0Zvck1vZHVsZUltcGxpY2l0U2NoZW1hIiwic2V0U3RhdGUiLCJzbG90Q29uZmlncyIsImdldEV4dGVuc2lvblNsb3RDb25maWdzIiwibmV3U2xvdFN0b3JlRW50cmllcyIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsIm1hcCIsInNsb3ROYW1lIiwic2xvdFN0b3JlIiwib2xkU3RhdGUiLCJzbG90cyIsImdldEltcGxlbWVudGVyVG9vbHNDb25maWciLCJjb25maWdzIiwiZXh0ZW5zaW9uIiwibW91bnRlZEV4dGVuc2lvbnMiLCJjb21wdXRlRXh0ZW5zaW9uQ29uZmlnIiwic2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25Nb2R1bGVOYW1lIiwiZXh0ZW5zaW9uSWQiLCJleHRlbnNpb25zQ29uZmlnU3RvcmUiLCJkZWZpbmVDb25maWdTY2hlbWEiLCJzY2hlbWEiLCJ2YWxpZGF0ZUNvbmZpZ1NjaGVtYSIsImVuaGFuY2VkU2NoZW1hIiwiaW1wbGljaXRDb25maWdTY2hlbWEiLCJyZWdpc3Rlck1vZHVsZVdpdGhDb25maWdTeXN0ZW0iLCJyZWdpc3Rlck1vZHVsZUxvYWQiLCJyZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlIiwibmFtZXNwYWNlIiwidHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEiLCJkZWZpbmVFeHRlbnNpb25Db25maWdTY2hlbWEiLCJleHRlbnNpb25OYW1lIiwiY29uc29sZSIsImVycm9yIiwicHJvdmlkZSIsInNvdXJjZU5hbWUiLCJwcm92aWRlZENvbmZpZ3MiLCJzb3VyY2UiLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInN0b3JlIiwidXBkYXRlIiwidW5zdWJzY3JpYmUiLCJnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyIsInByb21pc2VzIiwiY29uZmlnU3RvcmUiLCJ0cmFuc2xhdGlvbk92ZXJyaWRlcyIsImFsbCIsInByb2Nlc3NDb25maWciLCJwcm92aWRlZENvbmZpZyIsImtleVBhdGhDb250ZXh0IiwidmFsaWRhdGVTdHJ1Y3R1cmUiLCJzZXREZWZhdWx0cyIsInJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUiLCJnZXRFeHRlbnNpb25OYW1lRnJvbUlkIiwiZXh0ZW5zaW9uQ29uZmlnU2NoZW1hIiwibmFtZU9mU2NoZW1hU291cmNlIiwiZ2V0UHJvdmlkZWRDb25maWdzIiwic2xvdE1vZHVsZUNvbmZpZyIsIm1lcmdlQ29uZmlnc0ZvciIsImNvbmZpZ092ZXJyaWRlIiwiZXh0ZW5zaW9uU2xvdHMiLCJjb25maWd1cmUiLCJleHRlbnNpb25Db25maWciLCJjb21iaW5lZENvbmZpZyIsIm1lcmdlQ29uZmlncyIsInJlc3VsdCIsImdldFNjaGVtYVdpdGhWYWx1ZXNBbmRTb3VyY2VzIiwiY29uZmlnc0FuZFNvdXJjZXMiLCJjIiwiY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUiLCJoYXNPd25Qcm9wZXJ0eSIsIl92YWx1ZSIsIl9kZWZhdWx0IiwiX3NvdXJjZSIsImlzT3JkaW5hcnlPYmplY3QiLCJvYmoiLCJrZXkiLCJhbGxDb25maWdzIiwic2xvdENvbmZpZ1Blck1vZHVsZSIsInZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3MiLCJjb25maWdCeVNsb3ROYW1lIiwidmFsaWRhdGVFeHRlbnNpb25TbG90Q29uZmlnIiwia2V5UGF0aCIsImVycm9yUHJlZml4IiwiaW52YWxpZEtleXMiLCJmaWx0ZXIiLCJrIiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJsb2dFcnJvciIsImpvaW4iLCJhZGQiLCJBcnJheSIsImV2ZXJ5IiwibiIsInJlbW92ZSIsIm9yZGVyIiwidXBkYXRlTWVzc2FnZSIsInN0YXJ0c1dpdGgiLCJ0aGlzS2V5UGF0aCIsInNjaGVtYVBhcnQiLCJlbGVtZW50cyIsIl9lbGVtZW50cyIsImhhc09iamVjdFNjaGVtYSIsIl92YWxpZGF0b3JzIiwidmFsdWVUeXBlIiwiX3R5cGUiLCJ2YWx1ZXMiLCJKU09OIiwic3RyaW5naWZ5IiwiaW5wdXRDb25maWciLCJhbGxDb25maWdzRm9yTW9kdWxlIiwibWVyZ2VEZWVwQWxsIiwidmFsdWUiLCJ2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZSIsImNoZWNrVHlwZSIsInZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUiLCJ2YWxpZGF0ZUFycmF5U3RydWN0dXJlIiwiZnJlZWZvcm1PYmplY3RTY2hlbWEiLCJhcnJheVNjaGVtYSIsInZhbGlkYXRlZEFzQXJyYXkiLCJpIiwicnVuVmFsaWRhdG9ycyIsIkJvb2xlYW4iLCJDb25jZXB0VXVpZCIsIk51bWJlciIsIlN0cmluZyIsIlVVSUQiLCJQZXJzb25BdHRyaWJ1dGVUeXBlVXVpZCIsIlBhdGllbnRJZGVudGlmaWVyVHlwZVV1aWQiLCJ2YWxpZGF0b3JzIiwicmV0dXJuVmFsdWUiLCJ2YWxpZGF0b3JSZXN1bHQiLCJtZXNzYWdlIiwiZSIsImNvbmZpZ1BhcnQiLCJjb25maWdXaXRoRGVmYXVsdHMiLCJjb25mIiwib2JqZWN0S2V5Iiwic2VsZWN0ZWRDb25maWdQYXJ0IiwiZWxlbWVudHNTY2hlbWEiLCJkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMiLCJTZXQiLCJoYXMiLCJjbGVhckNvbmZpZ0Vycm9ycyIsImZvckVhY2giLCJkZWxldGUiLCJjbGVhciIsInJlc2V0Q29uZmlnU3lzdGVtIiwic3BsaXQiLCJfZGVzY3JpcHRpb24iLCJvIiwidGVzdCIsImJhZEtleXMiLCJwcml2aWxlZ2VzIiwiZXhwcmVzc2lvbiIsInVuZGVmaW5lZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/module-config.js\n");
159
159
 
160
160
  /***/ }),
161
161
 
@@ -165,7 +165,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
165
165
  \**************************************************************/
166
166
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
167
167
 
168
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ configExtensionStore: () => (/* binding */ configExtensionStore),\n/* harmony export */ configInternalStore: () => (/* binding */ configInternalStore),\n/* harmony export */ getConfigStore: () => (/* binding */ getConfigStore),\n/* harmony export */ getExtensionConfig: () => (/* binding */ getExtensionConfig),\n/* harmony export */ getExtensionConfigFromExtensionSlotStore: () => (/* binding */ getExtensionConfigFromExtensionSlotStore),\n/* harmony export */ getExtensionConfigFromStore: () => (/* binding */ getExtensionConfigFromStore),\n/* harmony export */ getExtensionSlotConfig: () => (/* binding */ getExtensionSlotConfig),\n/* harmony export */ getExtensionSlotConfigFromStore: () => (/* binding */ getExtensionSlotConfigFromStore),\n/* harmony export */ getExtensionSlotsConfigStore: () => (/* binding */ getExtensionSlotsConfigStore),\n/* harmony export */ getExtensionsConfigStore: () => (/* binding */ getExtensionsConfigStore),\n/* harmony export */ implementerToolsConfigStore: () => (/* binding */ implementerToolsConfigStore),\n/* harmony export */ temporaryConfigStore: () => (/* binding */ temporaryConfigStore)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/shallowEqual.js\");\n\n\nconst configInternalStoreInitialValue = {\n providedConfigs: [],\n schemas: {},\n moduleLoaded: {}\n};\n/**\n * @internal\n */ const configInternalStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-internal', configInternalStoreInitialValue);\n/** @internal */ const temporaryConfigStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('temporary-config', {\n config: getTemporaryConfig()\n});\ntemporaryConfigStore.subscribe((state)=>{\n setTemporaryConfig(state.config);\n});\nfunction setTemporaryConfig(value) {\n localStorage.setItem('openmrs:temporaryConfig', JSON.stringify(value));\n}\nfunction getTemporaryConfig() {\n try {\n return JSON.parse(localStorage.getItem('openmrs:temporaryConfig') || '{}');\n } catch (e) {\n return {};\n }\n}\n/** @internal */ const configExtensionStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-store-of-extension-state', {\n mountedExtensions: []\n});\nfunction initializeConfigStore() {\n return {\n config: null,\n loaded: false,\n translationOverridesLoaded: false\n };\n}\n/** @internal */ function getConfigStore(moduleName) {\n // We use a store for each module's config, named `config-module-${moduleName}`\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-module-${moduleName}`, initializeConfigStore());\n}\n/** @internal */ function getExtensionSlotsConfigStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-extension-slots`, {\n slots: {}\n });\n}\n/** @internal */ function getExtensionSlotConfig(slotName) {\n return getExtensionSlotConfigFromStore(getExtensionSlotsConfigStore().getState(), slotName);\n}\n/** @internal */ function getExtensionSlotConfigFromStore(state, slotName) {\n const slotConfig = state.slots[slotName];\n return slotConfig ?? {\n loaded: false,\n config: {}\n };\n}\n/**\n * One store for all the extensions\n * @internal\n */ function getExtensionsConfigStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-extensions`, {\n configs: {}\n });\n}\n/** @internal */ function getExtensionConfig(slotName, extensionId) {\n if (typeof slotName !== 'string' || typeof extensionId !== 'string' || slotName === '__proto__' || extensionId === '__proto__' || slotName === 'constructor' || extensionId === 'constructor' || slotName === 'prototype' || extensionId === 'prototype') {\n throw new Error('Attempted to call `getExtensionConfig()` with invalid argument');\n }\n const extensionConfigStore = getExtensionsConfigStore();\n const selector = (configStore)=>configStore.configs[slotName]?.[extensionId];\n return {\n getInitialState () {\n return selector(extensionConfigStore.getInitialState());\n },\n getState () {\n return selector(extensionConfigStore.getState()) ?? {\n loaded: false,\n config: null\n };\n },\n setState (partial, replace = false) {\n extensionConfigStore.setState((state)=>{\n if (!state.configs[slotName]) {\n state.configs[slotName] = {};\n }\n const newState = typeof partial === 'function' ? partial(state.configs.slotName[extensionId]) : partial;\n if (replace) {\n state.configs[slotName][extensionId] = Object.assign({}, newState);\n } else {\n state.configs[slotName][extensionId] = Object.assign({}, state.configs[slotName][extensionId], newState);\n }\n return state;\n });\n },\n subscribe (listener) {\n return extensionConfigStore.subscribe((state, prevState)=>{\n const newState = selector(state);\n const oldState = selector(prevState);\n if (!(0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__.shallowEqual)(newState, oldState)) {\n listener(newState, oldState);\n }\n });\n },\n destroy () {\n /* this is a no-op */ }\n };\n}\n/** @internal */ function getExtensionConfigFromStore(state, slotName, extensionId) {\n const extensionConfig = state.configs[slotName]?.[extensionId];\n return extensionConfig ?? {\n loaded: false,\n config: null\n };\n}\n/** @internal */ function getExtensionConfigFromExtensionSlotStore(state, slotName, extensionId) {\n const extensionConfig = state.configure?.[extensionId];\n return extensionConfig ?? null;\n}\n/** @internal */ const implementerToolsConfigStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-implementer-tools', {\n config: {}\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL3N0YXRlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXVFO0FBQ3JCO0FBQ2xELE1BQU1HLGtDQUFrQztJQUNwQ0MsaUJBQWlCLEVBQUU7SUFDbkJDLFNBQVMsQ0FBQztJQUNWQyxjQUFjLENBQUM7QUFDbkI7QUFDQTs7Q0FFQyxHQUFVLE1BQU1DLHNCQUFzQlAscUVBQWlCQSxDQUFDLG1CQUFtQkcsaUNBQWlDO0FBQzdHLGNBQWMsR0FBVSxNQUFNSyx1QkFBdUJSLHFFQUFpQkEsQ0FBQyxvQkFBb0I7SUFDdkZTLFFBQVFDO0FBQ1osR0FBRztBQUNIRixxQkFBcUJHLFNBQVMsQ0FBQyxDQUFDQztJQUM1QkMsbUJBQW1CRCxNQUFNSCxNQUFNO0FBQ25DO0FBQ0EsU0FBU0ksbUJBQW1CQyxLQUFLO0lBQzdCQyxhQUFhQyxPQUFPLENBQUMsMkJBQTJCQyxLQUFLQyxTQUFTLENBQUNKO0FBQ25FO0FBQ0EsU0FBU0o7SUFDTCxJQUFJO1FBQ0EsT0FBT08sS0FBS0UsS0FBSyxDQUFDSixhQUFhSyxPQUFPLENBQUMsOEJBQThCO0lBQ3pFLEVBQUUsT0FBT0MsR0FBRztRQUNSLE9BQU8sQ0FBQztJQUNaO0FBQ0o7QUFDQSxjQUFjLEdBQVUsTUFBTUMsdUJBQXVCdEIscUVBQWlCQSxDQUFDLG1DQUFtQztJQUN0R3VCLG1CQUFtQixFQUFFO0FBQ3pCLEdBQUc7QUFDSCxTQUFTQztJQUNMLE9BQU87UUFDSGYsUUFBUTtRQUNSZ0IsUUFBUTtRQUNSQyw0QkFBNEI7SUFDaEM7QUFDSjtBQUNBLGNBQWMsR0FBVSxTQUFTQyxlQUFlQyxVQUFVO0lBQ3RELCtFQUErRTtJQUMvRSxPQUFPM0Isa0VBQWNBLENBQUMsQ0FBQyxjQUFjLEVBQUUyQixZQUFZLEVBQUVKO0FBQ3pEO0FBQ0EsY0FBYyxHQUFVLFNBQVNLO0lBQzdCLE9BQU81QixrRUFBY0EsQ0FBQyxDQUFDLHNCQUFzQixDQUFD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QUNBLGNBQWMsR0FBVSxNQUFNRyw4QkFBOEIzRCxxRUFBaUJBLENBQUMsNEJBQTRCO0lBQ3RHUyxRQUFRLENBQUM7QUFDYixHQUFHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvc3RhdGUuanM/ZTkwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVHbG9iYWxTdG9yZSwgZ2V0R2xvYmFsU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXN0YXRlXCI7XG5pbXBvcnQgeyBzaGFsbG93RXF1YWwgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXV0aWxzXCI7XG5jb25zdCBjb25maWdJbnRlcm5hbFN0b3JlSW5pdGlhbFZhbHVlID0ge1xuICAgIHByb3ZpZGVkQ29uZmlnczogW10sXG4gICAgc2NoZW1hczoge30sXG4gICAgbW9kdWxlTG9hZGVkOiB7fVxufTtcbi8qKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGNvbnN0IGNvbmZpZ0ludGVybmFsU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnY29uZmlnLWludGVybmFsJywgY29uZmlnSW50ZXJuYWxTdG9yZUluaXRpYWxWYWx1ZSk7XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCB0ZW1wb3JhcnlDb25maWdTdG9yZSA9IGNyZWF0ZUdsb2JhbFN0b3JlKCd0ZW1wb3JhcnktY29uZmlnJywge1xuICAgIGNvbmZpZzogZ2V0VGVtcG9yYXJ5Q29uZmlnKClcbn0pO1xudGVtcG9yYXJ5Q29uZmlnU3RvcmUuc3Vic2NyaWJlKChzdGF0ZSk9PntcbiAgICBzZXRUZW1wb3JhcnlDb25maWcoc3RhdGUuY29uZmlnKTtcbn0pO1xuZnVuY3Rpb24gc2V0VGVtcG9yYXJ5Q29uZmlnKHZhbHVlKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ29wZW5tcnM6dGVtcG9yYXJ5Q29uZmlnJywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGdldFRlbXBvcmFyeUNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnb3Blbm1yczp0ZW1wb3JhcnlDb25maWcnKSB8fCAne30nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCBjb25maWdFeHRlbnNpb25TdG9yZSA9IGNyZWF0ZUdsb2JhbFN0b3JlKCdjb25maWctc3RvcmUtb2YtZXh0ZW5zaW9uLXN0YXRlJywge1xuICAgIG1vdW50ZWRFeHRlbnNpb25zOiBbXVxufSk7XG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnU3RvcmUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29uZmlnOiBudWxsLFxuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICB0cmFuc2xhdGlvbk92ZXJyaWRlc0xvYWRlZDogZmFsc2VcbiAgICB9O1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSkge1xuICAgIC8vIFdlIHVzZSBhIHN0b3JlIGZvciBlYWNoIG1vZHVsZSdzIGNvbmZpZywgbmFtZWQgYGNvbmZpZy1tb2R1bGUtJHttb2R1bGVOYW1lfWBcbiAgICByZXR1cm4gZ2V0R2xvYmFsU3RvcmUoYGNvbmZpZy1tb2R1bGUtJHttb2R1bGVOYW1lfWAsIGluaXRpYWxpemVDb25maWdTdG9yZSgpKTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKSB7XG4gICAgcmV0dXJuIGdldEdsb2JhbFN0b3JlKGBjb25maWctZXh0ZW5zaW9uLXNsb3RzYCwge1xuICAgICAgICBzbG90czoge31cbiAgICB9KTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvblNsb3RDb25maWcoc2xvdE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ0Zyb21TdG9yZShnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlKCkuZ2V0U3RhdGUoKSwgc2xvdE5hbWUpO1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ0Zyb21TdG9yZShzdGF0ZSwgc2xvdE5hbWUpIHtcbiAgICBjb25zdCBzbG90Q29uZmlnID0gc3RhdGUuc2xvdHNbc2xvdE5hbWVdO1xuICAgIHJldHVybiBzbG90Q29uZmlnID8/IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgY29uZmlnOiB7fVxuICAgIH07XG59XG4vKipcbiAqIE9uZSBzdG9yZSBmb3IgYWxsIHRoZSBleHRlbnNpb25zXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlKCkge1xuICAgIHJldHVybiBnZXRHbG9iYWxTdG9yZShgY29uZmlnLWV4dGVuc2lvbnNgLCB7XG4gICAgICAgIGNvbmZpZ3M6IHt9XG4gICAgfSk7XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbnNpb25Db25maWcoc2xvdE5hbWUsIGV4dGVuc2lvbklkKSB7XG4gICAgaWYgKHR5cGVvZiBzbG90TmFtZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGV4dGVuc2lvbklkICE9PSAnc3RyaW5nJyB8fCBzbG90TmFtZSA9PT0gJ19fcHJvdG9fXycgfHwgZXh0ZW5zaW9uSWQgPT09ICdfX3Byb3RvX18nIHx8IHNsb3ROYW1lID09PSAnY29uc3RydWN0b3InIHx8IGV4dGVuc2lvbklkID09PSAnY29uc3RydWN0b3InIHx8IHNsb3ROYW1lID09PSAncHJvdG90eXBlJyB8fCBleHRlbnNpb25JZCA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgZ2V0RXh0ZW5zaW9uQ29uZmlnKClgIHdpdGggaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25Db25maWdTdG9yZSA9IGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSgpO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gKGNvbmZpZ1N0b3JlKT0+Y29uZmlnU3RvcmUuY29uZmlnc1tzbG90TmFtZV0/LltleHRlbnNpb25JZF07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0SW5pdGlhbFN0YXRlICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RvcihleHRlbnNpb25Db25maWdTdG9yZS5nZXRJbml0aWFsU3RhdGUoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFN0YXRlICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RvcihleHRlbnNpb25Db25maWdTdG9yZS5nZXRTdGF0ZSgpKSA/PyB7XG4gICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWc6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldFN0YXRlIChwYXJ0aWFsLCByZXBsYWNlID0gZmFsc2UpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbkNvbmZpZ1N0b3JlLnNldFN0YXRlKChzdGF0ZSk9PntcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gdHlwZW9mIHBhcnRpYWwgPT09ICdmdW5jdGlvbicgPyBwYXJ0aWFsKHN0YXRlLmNvbmZpZ3Muc2xvdE5hbWVbZXh0ZW5zaW9uSWRdKSA6IHBhcnRpYWw7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY29uZmlnc1tzbG90TmFtZV1bZXh0ZW5zaW9uSWRdID0gT2JqZWN0LmFzc2lnbih7fSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdW2V4dGVuc2lvbklkXSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdW2V4dGVuc2lvbklkXSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc3Vic2NyaWJlIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNvbmZpZ1N0b3JlLnN1YnNjcmliZSgoc3RhdGUsIHByZXZTdGF0ZSk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHNlbGVjdG9yKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRTdGF0ZSA9IHNlbGVjdG9yKHByZXZTdGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzaGFsbG93RXF1YWwobmV3U3RhdGUsIG9sZFN0YXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcihuZXdTdGF0ZSwgb2xkU3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXN0cm95ICgpIHtcbiAgICAgICAgLyogdGhpcyBpcyBhIG5vLW9wICovIH1cbiAgICB9O1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlKHN0YXRlLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBleHRlbnNpb25Db25maWcgPSBzdGF0ZS5jb25maWdzW3Nsb3ROYW1lXT8uW2V4dGVuc2lvbklkXTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uQ29uZmlnID8/IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgY29uZmlnOiBudWxsXG4gICAgfTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUoc3RhdGUsIHNsb3ROYW1lLCBleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IHN0YXRlLmNvbmZpZ3VyZT8uW2V4dGVuc2lvbklkXTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uQ29uZmlnID8/IG51bGw7XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnY29uZmlnLWltcGxlbWVudGVyLXRvb2xzJywge1xuICAgIGNvbmZpZzoge31cbn0pO1xuIl0sIm5hbWVzIjpbImNyZWF0ZUdsb2JhbFN0b3JlIiwiZ2V0R2xvYmFsU3RvcmUiLCJzaGFsbG93RXF1YWwiLCJjb25maWdJbnRlcm5hbFN0b3JlSW5pdGlhbFZhbHVlIiwicHJvdmlkZWRDb25maWdzIiwic2NoZW1hcyIsIm1vZHVsZUxvYWRlZCIsImNvbmZpZ0ludGVybmFsU3RvcmUiLCJ0ZW1wb3JhcnlDb25maWdTdG9yZSIsImNvbmZpZyIsImdldFRlbXBvcmFyeUNvbmZpZyIsInN1YnNjcmliZSIsInN0YXRlIiwic2V0VGVtcG9yYXJ5Q29uZmlnIiwidmFsdWUiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlIiwiZ2V0SXRlbSIsImUiLCJjb25maWdFeHRlbnNpb25TdG9yZSIsIm1vdW50ZWRFeHRlbnNpb25zIiwiaW5pdGlhbGl6ZUNvbmZpZ1N0b3JlIiwibG9hZGVkIiwidHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQiLCJnZXRDb25maWdTdG9yZSIsIm1vZHVsZU5hbWUiLCJnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlIiwic2xvdHMiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnIiwic2xvdE5hbWUiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlIiwiZ2V0U3RhdGUiLCJzbG90Q29uZmlnIiwiZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlIiwiY29uZmlncyIsImdldEV4dGVuc2lvbkNvbmZpZyIsImV4dGVuc2lvbklkIiwiRXJyb3IiLCJleHRlbnNpb25Db25maWdTdG9yZSIsInNlbGVjdG9yIiwiY29uZmlnU3RvcmUiLCJnZXRJbml0aWFsU3RhdGUiLCJzZXRTdGF0ZSIsInBhcnRpYWwiLCJyZXBsYWNlIiwibmV3U3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJsaXN0ZW5lciIsInByZXZTdGF0ZSIsIm9sZFN0YXRlIiwiZGVzdHJveSIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21TdG9yZSIsImV4dGVuc2lvbkNvbmZpZyIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUiLCJjb25maWd1cmUiLCJpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/state.js\n");
168
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ configExtensionStore: () => (/* binding */ configExtensionStore),\n/* harmony export */ configInternalStore: () => (/* binding */ configInternalStore),\n/* harmony export */ getConfigStore: () => (/* binding */ getConfigStore),\n/* harmony export */ getExtensionConfig: () => (/* binding */ getExtensionConfig),\n/* harmony export */ getExtensionConfigFromExtensionSlotStore: () => (/* binding */ getExtensionConfigFromExtensionSlotStore),\n/* harmony export */ getExtensionConfigFromStore: () => (/* binding */ getExtensionConfigFromStore),\n/* harmony export */ getExtensionSlotConfig: () => (/* binding */ getExtensionSlotConfig),\n/* harmony export */ getExtensionSlotConfigFromStore: () => (/* binding */ getExtensionSlotConfigFromStore),\n/* harmony export */ getExtensionSlotsConfigStore: () => (/* binding */ getExtensionSlotsConfigStore),\n/* harmony export */ getExtensionsConfigStore: () => (/* binding */ getExtensionsConfigStore),\n/* harmony export */ implementerToolsConfigStore: () => (/* binding */ implementerToolsConfigStore),\n/* harmony export */ temporaryConfigStore: () => (/* binding */ temporaryConfigStore)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/shallowEqual.js\");\n\n\nconst configInternalStoreInitialValue = {\n providedConfigs: [],\n schemas: {},\n moduleLoaded: {}\n};\n/**\n * @internal\n */ const configInternalStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-internal', configInternalStoreInitialValue);\n/** @internal */ const temporaryConfigStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('temporary-config', {\n config: getTemporaryConfig()\n});\ntemporaryConfigStore.subscribe((state)=>{\n setTemporaryConfig(state.config);\n});\nfunction setTemporaryConfig(value) {\n localStorage.setItem('openmrs:temporaryConfig', JSON.stringify(value));\n}\nfunction getTemporaryConfig() {\n try {\n return JSON.parse(localStorage.getItem('openmrs:temporaryConfig') || '{}');\n } catch (e) {\n return {};\n }\n}\n/** @internal */ const configExtensionStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-store-of-extension-state', {\n mountedExtensions: []\n});\nfunction initializeConfigStore() {\n return {\n config: null,\n loaded: false,\n translationOverridesLoaded: false\n };\n}\n/**\n * Returns the configuration store for a specific module. Each module has its\n * own store that tracks the loading state and resolved configuration values.\n *\n * @param moduleName The name of the module whose config store to retrieve.\n * @returns A Zustand store containing the module's configuration state.\n *\n * @internal\n */ function getConfigStore(moduleName) {\n // We use a store for each module's config, named `config-module-${moduleName}`\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-module-${moduleName}`, initializeConfigStore());\n}\n/** @internal */ function getExtensionSlotsConfigStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-extension-slots`, {\n slots: {}\n });\n}\n/** @internal */ function getExtensionSlotConfig(slotName) {\n return getExtensionSlotConfigFromStore(getExtensionSlotsConfigStore().getState(), slotName);\n}\n/** @internal */ function getExtensionSlotConfigFromStore(state, slotName) {\n const slotConfig = state.slots[slotName];\n return slotConfig ?? {\n loaded: false,\n config: {}\n };\n}\n/**\n * One store for all the extensions\n * @internal\n */ function getExtensionsConfigStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)(`config-extensions`, {\n configs: {}\n });\n}\n/** @internal */ function getExtensionConfig(slotName, extensionId) {\n if (typeof slotName !== 'string' || typeof extensionId !== 'string' || slotName === '__proto__' || extensionId === '__proto__' || slotName === 'constructor' || extensionId === 'constructor' || slotName === 'prototype' || extensionId === 'prototype') {\n throw new Error('Attempted to call `getExtensionConfig()` with invalid argument');\n }\n const extensionConfigStore = getExtensionsConfigStore();\n const selector = (configStore)=>configStore.configs[slotName]?.[extensionId];\n return {\n getInitialState () {\n return selector(extensionConfigStore.getInitialState());\n },\n getState () {\n return selector(extensionConfigStore.getState()) ?? {\n loaded: false,\n config: null\n };\n },\n setState (partial, replace = false) {\n extensionConfigStore.setState((state)=>{\n if (!state.configs[slotName]) {\n state.configs[slotName] = {};\n }\n const newState = typeof partial === 'function' ? partial(state.configs.slotName[extensionId]) : partial;\n if (replace) {\n state.configs[slotName][extensionId] = Object.assign({}, newState);\n } else {\n state.configs[slotName][extensionId] = Object.assign({}, state.configs[slotName][extensionId], newState);\n }\n return state;\n });\n },\n subscribe (listener) {\n return extensionConfigStore.subscribe((state, prevState)=>{\n const newState = selector(state);\n const oldState = selector(prevState);\n if (!(0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_1__.shallowEqual)(newState, oldState)) {\n listener(newState, oldState);\n }\n });\n },\n destroy () {\n /* this is a no-op */ }\n };\n}\n/** @internal */ function getExtensionConfigFromStore(state, slotName, extensionId) {\n const extensionConfig = state.configs[slotName]?.[extensionId];\n return extensionConfig ?? {\n loaded: false,\n config: null\n };\n}\n/** @internal */ function getExtensionConfigFromExtensionSlotStore(state, slotName, extensionId) {\n const extensionConfig = state.configure?.[extensionId];\n return extensionConfig ?? null;\n}\n/** @internal */ const implementerToolsConfigStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.createGlobalStore)('config-implementer-tools', {\n config: {}\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL3N0YXRlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXVFO0FBQ3JCO0FBQ2xELE1BQU1HLGtDQUFrQztJQUNwQ0MsaUJBQWlCLEVBQUU7SUFDbkJDLFNBQVMsQ0FBQztJQUNWQyxjQUFjLENBQUM7QUFDbkI7QUFDQTs7Q0FFQyxHQUFVLE1BQU1DLHNCQUFzQlAscUVBQWlCQSxDQUFDLG1CQUFtQkcsaUNBQWlDO0FBQzdHLGNBQWMsR0FBVSxNQUFNSyx1QkFBdUJSLHFFQUFpQkEsQ0FBQyxvQkFBb0I7SUFDdkZTLFFBQVFDO0FBQ1osR0FBRztBQUNIRixxQkFBcUJHLFNBQVMsQ0FBQyxDQUFDQztJQUM1QkMsbUJBQW1CRCxNQUFNSCxNQUFNO0FBQ25DO0FBQ0EsU0FBU0ksbUJBQW1CQyxLQUFLO0lBQzdCQyxhQUFhQyxPQUFPLENBQUMsMkJBQTJCQyxLQUFLQyxTQUFTLENBQUNKO0FBQ25FO0FBQ0EsU0FBU0o7SUFDTCxJQUFJO1FBQ0EsT0FBT08sS0FBS0UsS0FBSyxDQUFDSixhQUFhSyxPQUFPLENBQUMsOEJBQThCO0lBQ3pFLEVBQUUsT0FBT0MsR0FBRztRQUNSLE9BQU8sQ0FBQztJQUNaO0FBQ0o7QUFDQSxjQUFjLEdBQVUsTUFBTUMsdUJBQXVCdEIscUVBQWlCQSxDQUFDLG1DQUFtQztJQUN0R3VCLG1CQUFtQixFQUFFO0FBQ3pCLEdBQUc7QUFDSCxTQUFTQztJQUNMLE9BQU87UUFDSGYsUUFBUTtRQUNSZ0IsUUFBUTtRQUNSQyw0QkFBNEI7SUFDaEM7QUFDSjtBQUNBOzs7Ozs7OztDQVFDLEdBQVUsU0FBU0MsZUFBZUMsVUFBVTtJQUN6QywrRUFBK0U7SUFDL0UsT0FBTzNCLGtFQUFjQSxDQUFDLENBQUMsY0FBYyxFQUFFMkIsWUFBWSxFQUFFSjtBQUN6RDtBQUNBLGNBQWMsR0FBVSxTQUFTSztJQUM3QixPQUFPNUIsa0VBQWNBLENBQUMsQ0FBQyxzQkFB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QUFDOUI7QUFDQSxjQUFjLEdBQVUsTUFBTUcsOEJBQThCM0QscUVBQWlCQSxDQUFDLDRCQUE0QjtJQUN0R1MsUUFBUSxDQUFDO0FBQ2IsR0FBRyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL3N0YXRlLmpzP2U5MDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlR2xvYmFsU3RvcmUsIGdldEdsb2JhbFN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1zdGF0ZVwiO1xuaW1wb3J0IHsgc2hhbGxvd0VxdWFsIH0gZnJvbSBcIkBvcGVubXJzL2VzbS11dGlsc1wiO1xuY29uc3QgY29uZmlnSW50ZXJuYWxTdG9yZUluaXRpYWxWYWx1ZSA9IHtcbiAgICBwcm92aWRlZENvbmZpZ3M6IFtdLFxuICAgIHNjaGVtYXM6IHt9LFxuICAgIG1vZHVsZUxvYWRlZDoge31cbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBjb25zdCBjb25maWdJbnRlcm5hbFN0b3JlID0gY3JlYXRlR2xvYmFsU3RvcmUoJ2NvbmZpZy1pbnRlcm5hbCcsIGNvbmZpZ0ludGVybmFsU3RvcmVJbml0aWFsVmFsdWUpO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3QgdGVtcG9yYXJ5Q29uZmlnU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgndGVtcG9yYXJ5LWNvbmZpZycsIHtcbiAgICBjb25maWc6IGdldFRlbXBvcmFyeUNvbmZpZygpXG59KTtcbnRlbXBvcmFyeUNvbmZpZ1N0b3JlLnN1YnNjcmliZSgoc3RhdGUpPT57XG4gICAgc2V0VGVtcG9yYXJ5Q29uZmlnKHN0YXRlLmNvbmZpZyk7XG59KTtcbmZ1bmN0aW9uIHNldFRlbXBvcmFyeUNvbmZpZyh2YWx1ZSkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdvcGVubXJzOnRlbXBvcmFyeUNvbmZpZycsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG59XG5mdW5jdGlvbiBnZXRUZW1wb3JhcnlDb25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ29wZW5tcnM6dGVtcG9yYXJ5Q29uZmlnJykgfHwgJ3t9Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3QgY29uZmlnRXh0ZW5zaW9uU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnY29uZmlnLXN0b3JlLW9mLWV4dGVuc2lvbi1zdGF0ZScsIHtcbiAgICBtb3VudGVkRXh0ZW5zaW9uczogW11cbn0pO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZ1N0b3JlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbmZpZzogbnVsbCxcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IGZhbHNlXG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBzdG9yZSBmb3IgYSBzcGVjaWZpYyBtb2R1bGUuIEVhY2ggbW9kdWxlIGhhcyBpdHNcbiAqIG93biBzdG9yZSB0aGF0IHRyYWNrcyB0aGUgbG9hZGluZyBzdGF0ZSBhbmQgcmVzb2x2ZWQgY29uZmlndXJhdGlvbiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aG9zZSBjb25maWcgc3RvcmUgdG8gcmV0cmlldmUuXG4gKiBAcmV0dXJucyBBIFp1c3RhbmQgc3RvcmUgY29udGFpbmluZyB0aGUgbW9kdWxlJ3MgY29uZmlndXJhdGlvbiBzdGF0ZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSkge1xuICAgIC8vIFdlIHVzZSBhIHN0b3JlIGZvciBlYWNoIG1vZHVsZSdzIGNvbmZpZywgbmFtZWQgYGNvbmZpZy1tb2R1bGUtJHttb2R1bGVOYW1lfWBcbiAgICByZXR1cm4gZ2V0R2xvYmFsU3RvcmUoYGNvbmZpZy1tb2R1bGUtJHttb2R1bGVOYW1lfWAsIGluaXRpYWxpemVDb25maWdTdG9yZSgpKTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKSB7XG4gICAgcmV0dXJuIGdldEdsb2JhbFN0b3JlKGBjb25maWctZXh0ZW5zaW9uLXNsb3RzYCwge1xuICAgICAgICBzbG90czoge31cbiAgICB9KTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvblNsb3RDb25maWcoc2xvdE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ0Zyb21TdG9yZShnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlKCkuZ2V0U3RhdGUoKSwgc2xvdE5hbWUpO1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ0Zyb21TdG9yZShzdGF0ZSwgc2xvdE5hbWUpIHtcbiAgICBjb25zdCBzbG90Q29uZmlnID0gc3RhdGUuc2xvdHNbc2xvdE5hbWVdO1xuICAgIHJldHVybiBzbG90Q29uZmlnID8/IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgY29uZmlnOiB7fVxuICAgIH07XG59XG4vKipcbiAqIE9uZSBzdG9yZSBmb3IgYWxsIHRoZSBleHRlbnNpb25zXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlKCkge1xuICAgIHJldHVybiBnZXRHbG9iYWxTdG9yZShgY29uZmlnLWV4dGVuc2lvbnNgLCB7XG4gICAgICAgIGNvbmZpZ3M6IHt9XG4gICAgfSk7XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbnNpb25Db25maWcoc2xvdE5hbWUsIGV4dGVuc2lvbklkKSB7XG4gICAgaWYgKHR5cGVvZiBzbG90TmFtZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGV4dGVuc2lvbklkICE9PSAnc3RyaW5nJyB8fCBzbG90TmFtZSA9PT0gJ19fcHJvdG9fXycgfHwgZXh0ZW5zaW9uSWQgPT09ICdfX3Byb3RvX18nIHx8IHNsb3ROYW1lID09PSAnY29uc3RydWN0b3InIHx8IGV4dGVuc2lvbklkID09PSAnY29uc3RydWN0b3InIHx8IHNsb3ROYW1lID09PSAncHJvdG90eXBlJyB8fCBleHRlbnNpb25JZCA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gY2FsbCBgZ2V0RXh0ZW5zaW9uQ29uZmlnKClgIHdpdGggaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25Db25maWdTdG9yZSA9IGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSgpO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gKGNvbmZpZ1N0b3JlKT0+Y29uZmlnU3RvcmUuY29uZmlnc1tzbG90TmFtZV0/LltleHRlbnNpb25JZF07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0SW5pdGlhbFN0YXRlICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RvcihleHRlbnNpb25Db25maWdTdG9yZS5nZXRJbml0aWFsU3RhdGUoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFN0YXRlICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RvcihleHRlbnNpb25Db25maWdTdG9yZS5nZXRTdGF0ZSgpKSA/PyB7XG4gICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWc6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldFN0YXRlIChwYXJ0aWFsLCByZXBsYWNlID0gZmFsc2UpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbkNvbmZpZ1N0b3JlLnNldFN0YXRlKChzdGF0ZSk9PntcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gdHlwZW9mIHBhcnRpYWwgPT09ICdmdW5jdGlvbicgPyBwYXJ0aWFsKHN0YXRlLmNvbmZpZ3Muc2xvdE5hbWVbZXh0ZW5zaW9uSWRdKSA6IHBhcnRpYWw7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY29uZmlnc1tzbG90TmFtZV1bZXh0ZW5zaW9uSWRdID0gT2JqZWN0LmFzc2lnbih7fSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdW2V4dGVuc2lvbklkXSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmNvbmZpZ3Nbc2xvdE5hbWVdW2V4dGVuc2lvbklkXSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc3Vic2NyaWJlIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNvbmZpZ1N0b3JlLnN1YnNjcmliZSgoc3RhdGUsIHByZXZTdGF0ZSk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHNlbGVjdG9yKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRTdGF0ZSA9IHNlbGVjdG9yKHByZXZTdGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzaGFsbG93RXF1YWwobmV3U3RhdGUsIG9sZFN0YXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcihuZXdTdGF0ZSwgb2xkU3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXN0cm95ICgpIHtcbiAgICAgICAgLyogdGhpcyBpcyBhIG5vLW9wICovIH1cbiAgICB9O1xufVxuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlKHN0YXRlLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBleHRlbnNpb25Db25maWcgPSBzdGF0ZS5jb25maWdzW3Nsb3ROYW1lXT8uW2V4dGVuc2lvbklkXTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uQ29uZmlnID8/IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgY29uZmlnOiBudWxsXG4gICAgfTtcbn1cbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUoc3RhdGUsIHNsb3ROYW1lLCBleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IHN0YXRlLmNvbmZpZ3VyZT8uW2V4dGVuc2lvbklkXTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uQ29uZmlnID8/IG51bGw7XG59XG4vKiogQGludGVybmFsICovIGV4cG9ydCBjb25zdCBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUgPSBjcmVhdGVHbG9iYWxTdG9yZSgnY29uZmlnLWltcGxlbWVudGVyLXRvb2xzJywge1xuICAgIGNvbmZpZzoge31cbn0pO1xuIl0sIm5hbWVzIjpbImNyZWF0ZUdsb2JhbFN0b3JlIiwiZ2V0R2xvYmFsU3RvcmUiLCJzaGFsbG93RXF1YWwiLCJjb25maWdJbnRlcm5hbFN0b3JlSW5pdGlhbFZhbHVlIiwicHJvdmlkZWRDb25maWdzIiwic2NoZW1hcyIsIm1vZHVsZUxvYWRlZCIsImNvbmZpZ0ludGVybmFsU3RvcmUiLCJ0ZW1wb3JhcnlDb25maWdTdG9yZSIsImNvbmZpZyIsImdldFRlbXBvcmFyeUNvbmZpZyIsInN1YnNjcmliZSIsInN0YXRlIiwic2V0VGVtcG9yYXJ5Q29uZmlnIiwidmFsdWUiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlIiwiZ2V0SXRlbSIsImUiLCJjb25maWdFeHRlbnNpb25TdG9yZSIsIm1vdW50ZWRFeHRlbnNpb25zIiwiaW5pdGlhbGl6ZUNvbmZpZ1N0b3JlIiwibG9hZGVkIiwidHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQiLCJnZXRDb25maWdTdG9yZSIsIm1vZHVsZU5hbWUiLCJnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlIiwic2xvdHMiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnIiwic2xvdE5hbWUiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlIiwiZ2V0U3RhdGUiLCJzbG90Q29uZmlnIiwiZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlIiwiY29uZmlncyIsImdldEV4dGVuc2lvbkNvbmZpZyIsImV4dGVuc2lvbklkIiwiRXJyb3IiLCJleHRlbnNpb25Db25maWdTdG9yZSIsInNlbGVjdG9yIiwiY29uZmlnU3RvcmUiLCJnZXRJbml0aWFsU3RhdGUiLCJzZXRTdGF0ZSIsInBhcnRpYWwiLCJyZXBsYWNlIiwibmV3U3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJsaXN0ZW5lciIsInByZXZTdGF0ZSIsIm9sZFN0YXRlIiwiZGVzdHJveSIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21TdG9yZSIsImV4dGVuc2lvbkNvbmZpZyIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUiLCJjb25maWd1cmUiLCJpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/state.js\n");
169
169
 
170
170
  /***/ }),
171
171
 
@@ -205,7 +205,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
205
205
  \****************************************************************/
206
206
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
207
207
 
208
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ inRange: () => (/* binding */ inRange),\n/* harmony export */ isUrl: () => (/* binding */ isUrl),\n/* harmony export */ isUrlWithTemplateParameters: () => (/* binding */ isUrlWithTemplateParameters),\n/* harmony export */ oneOf: () => (/* binding */ oneOf),\n/* harmony export */ validators: () => (/* binding */ validators)\n/* harmony export */ });\n/* harmony import */ var _validator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validator.js */ \"../../framework/esm-config/dist/validators/validator.js\");\n/** @module @category Config Validation */ \n/**\n * Verifies that the value is between the provided minimum and maximum\n *\n * @param min Minimum acceptable value\n * @param max Maximum acceptable value\n */ const inRange = (min, max)=>{\n return (0,_validator_js__WEBPACK_IMPORTED_MODULE_0__.validator)((val)=>min <= val && val <= max, `must be between ${min} and ${max}`);\n};\n/**\n * Verifies that a string contains only the default URL template\n * parameters, plus any specified in `allowedTemplateParameters`.\n *\n * @param allowedTemplateParameters To be added to `openmrsBase` and `openmrsSpaBase`\n * @category Navigation\n */ const isUrlWithTemplateParameters = (allowedTemplateParameters)=>{\n const allowedParams = allowedTemplateParameters.concat([\n 'openmrsBase',\n 'openmrsSpaBase'\n ]);\n return (0,_validator_js__WEBPACK_IMPORTED_MODULE_0__.validator)((val)=>{\n if (!val || typeof val != 'string') {\n return false;\n }\n const rx = /\\${(.*?)}/g;\n let match = rx.exec(val);\n while(match){\n if (!allowedParams.includes(match[1])) {\n return false;\n }\n match = rx.exec(val);\n }\n return true;\n }, 'Should be a URL or path. The allowed template parameters are ' + allowedParams.map((p)=>'${' + p + '}').join(', '));\n};\n/**\n * Verifies that a string contains only the default URL template parameters.\n *\n * @category Navigation\n */ const isUrl = isUrlWithTemplateParameters([]);\n/**\n * Verifies that the value is one of the allowed options.\n * @param allowedValues The list of allowable values\n */ const oneOf = (allowedValues)=>{\n return (0,_validator_js__WEBPACK_IMPORTED_MODULE_0__.validator)((val)=>allowedValues.includes(val), `Must be one of the following: '${allowedValues.join(\"', '\")}'.`);\n};\nconst validators = {\n inRange,\n isUrl,\n isUrlWithTemplateParameters,\n oneOf\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC92YWxpZGF0b3JzL3ZhbGlkYXRvcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsd0NBQXdDLEdBQThDO0FBQ3RGOzs7OztDQUtDLEdBQVUsTUFBTUMsVUFBVSxDQUFDQyxLQUFLQztJQUM3QixPQUFPSCx3REFBU0EsQ0FBQyxDQUFDSSxNQUFNRixPQUFPRSxPQUFPQSxPQUFPRCxLQUFLLENBQUMsZ0JBQWdCLEVBQUVELElBQUksS0FBSyxFQUFFQyxLQUFLO0FBQ3pGLEVBQUU7QUFDRjs7Ozs7O0NBTUMsR0FBVSxNQUFNRSw4QkFBOEIsQ0FBQ0M7SUFDNUMsTUFBTUMsZ0JBQWdCRCwwQkFBMEJFLE1BQU0sQ0FBQztRQUNuRDtRQUNBO0tBQ0g7SUFDRCxPQUFPUix3REFBU0EsQ0FBQyxDQUFDSTtRQUNkLElBQUksQ0FBQ0EsT0FBTyxPQUFPQSxPQUFPLFVBQVU7WUFDaEMsT0FBTztRQUNYO1FBQ0EsTUFBTUssS0FBSztRQUNYLElBQUlDLFFBQVFELEdBQUdFLElBQUksQ0FBQ1A7UUFDcEIsTUFBTU0sTUFBTTtZQUNSLElBQUksQ0FBQ0gsY0FBY0ssUUFBUSxDQUFDRixLQUFLLENBQUMsRUFBRSxHQUFHO2dCQUNuQyxPQUFPO1lBQ1g7WUFDQUEsUUFBUUQsR0FBR0UsSUFBSSxDQUFDUDtRQUNwQjtRQUNBLE9BQU87SUFDWCxHQUFHLGtFQUFrRUcsY0FBY00sR0FBRyxDQUFDLENBQUNDLElBQUksT0FBT0EsSUFBSSxLQUFLQyxJQUFJLENBQUM7QUFDckgsRUFBRTtBQUNGOzs7O0NBSUMsR0FBVSxNQUFNQyxRQUFRWCw0QkFBNEIsRUFBRSxFQUFFO0FBQ3pEOzs7Q0FHQyxHQUFVLE1BQU1ZLFFBQVEsQ0FBQ0M7SUFDdEIsT0FBT2xCLHdEQUFTQSxDQUFDLENBQUNJLE1BQU1jLGNBQWNOLFFBQVEsQ0FBQ1IsTUFBTSxDQUFDLCtCQUErQixFQUFFYyxjQUFjSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDekgsRUFBRTtBQUNLLE1BQU1JLGFBQWE7SUFDdEJsQjtJQUNBZTtJQUNBWDtJQUNBWTtBQUNKLEVBQUUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tY29uZmlnL2Rpc3QvdmFsaWRhdG9ycy92YWxpZGF0b3JzLmpzPzJmYjAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IENvbmZpZyBWYWxpZGF0aW9uICovIGltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvci5qc1wiO1xuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBpcyBiZXR3ZWVuIHRoZSBwcm92aWRlZCBtaW5pbXVtIGFuZCBtYXhpbXVtXG4gKlxuICogQHBhcmFtIG1pbiBNaW5pbXVtIGFjY2VwdGFibGUgdmFsdWVcbiAqIEBwYXJhbSBtYXggTWF4aW11bSBhY2NlcHRhYmxlIHZhbHVlXG4gKi8gZXhwb3J0IGNvbnN0IGluUmFuZ2UgPSAobWluLCBtYXgpPT57XG4gICAgcmV0dXJuIHZhbGlkYXRvcigodmFsKT0+bWluIDw9IHZhbCAmJiB2YWwgPD0gbWF4LCBgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9YCk7XG59O1xuLyoqXG4gKiBWZXJpZmllcyB0aGF0IGEgc3RyaW5nIGNvbnRhaW5zIG9ubHkgdGhlIGRlZmF1bHQgVVJMIHRlbXBsYXRlXG4gKiBwYXJhbWV0ZXJzLCBwbHVzIGFueSBzcGVjaWZpZWQgaW4gYGFsbG93ZWRUZW1wbGF0ZVBhcmFtZXRlcnNgLlxuICpcbiAqIEBwYXJhbSBhbGxvd2VkVGVtcGxhdGVQYXJhbWV0ZXJzIFRvIGJlIGFkZGVkIHRvIGBvcGVubXJzQmFzZWAgYW5kIGBvcGVubXJzU3BhQmFzZWBcbiAqIEBjYXRlZ29yeSBOYXZpZ2F0aW9uXG4gKi8gZXhwb3J0IGNvbnN0IGlzVXJsV2l0aFRlbXBsYXRlUGFyYW1ldGVycyA9IChhbGxvd2VkVGVtcGxhdGVQYXJhbWV0ZXJzKT0+e1xuICAgIGNvbnN0IGFsbG93ZWRQYXJhbXMgPSBhbGxvd2VkVGVtcGxhdGVQYXJhbWV0ZXJzLmNvbmNhdChbXG4gICAgICAgICdvcGVubXJzQmFzZScsXG4gICAgICAgICdvcGVubXJzU3BhQmFzZSdcbiAgICBdKTtcbiAgICByZXR1cm4gdmFsaWRhdG9yKCh2YWwpPT57XG4gICAgICAgIGlmICghdmFsIHx8IHR5cGVvZiB2YWwgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByeCA9IC9cXCR7KC4qPyl9L2c7XG4gICAgICAgIGxldCBtYXRjaCA9IHJ4LmV4ZWModmFsKTtcbiAgICAgICAgd2hpbGUobWF0Y2gpe1xuICAgICAgICAgICAgaWYgKCFhbGxvd2VkUGFyYW1zLmluY2x1ZGVzKG1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hdGNoID0gcnguZXhlYyh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sICdTaG91bGQgYmUgYSBVUkwgb3IgcGF0aC4gVGhlIGFsbG93ZWQgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgJyArIGFsbG93ZWRQYXJhbXMubWFwKChwKT0+JyR7JyArIHAgKyAnfScpLmpvaW4oJywgJykpO1xufTtcbi8qKlxuICogVmVyaWZpZXMgdGhhdCBhIHN0cmluZyBjb250YWlucyBvbmx5IHRoZSBkZWZhdWx0IFVSTCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBjYXRlZ29yeSBOYXZpZ2F0aW9uXG4gKi8gZXhwb3J0IGNvbnN0IGlzVXJsID0gaXNVcmxXaXRoVGVtcGxhdGVQYXJhbWV0ZXJzKFtdKTtcbi8qKlxuICogVmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIHRoZSBhbGxvd2VkIG9wdGlvbnMuXG4gKiBAcGFyYW0gYWxsb3dlZFZhbHVlcyBUaGUgbGlzdCBvZiBhbGxvd2FibGUgdmFsdWVzXG4gKi8gZXhwb3J0IGNvbnN0IG9uZU9mID0gKGFsbG93ZWRWYWx1ZXMpPT57XG4gICAgcmV0dXJuIHZhbGlkYXRvcigodmFsKT0+YWxsb3dlZFZhbHVlcy5pbmNsdWRlcyh2YWwpLCBgTXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogJyR7YWxsb3dlZFZhbHVlcy5qb2luKFwiJywgJ1wiKX0nLmApO1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0b3JzID0ge1xuICAgIGluUmFuZ2UsXG4gICAgaXNVcmwsXG4gICAgaXNVcmxXaXRoVGVtcGxhdGVQYXJhbWV0ZXJzLFxuICAgIG9uZU9mXG59O1xuIl0sIm5hbWVzIjpbInZhbGlkYXRvciIsImluUmFuZ2UiLCJtaW4iLCJtYXgiLCJ2YWwiLCJpc1VybFdpdGhUZW1wbGF0ZVBhcmFtZXRlcnMiLCJhbGxvd2VkVGVtcGxhdGVQYXJhbWV0ZXJzIiwiYWxsb3dlZFBhcmFtcyIsImNvbmNhdCIsInJ4IiwibWF0Y2giLCJleGVjIiwiaW5jbHVkZXMiLCJtYXAiLCJwIiwiam9pbiIsImlzVXJsIiwib25lT2YiLCJhbGxvd2VkVmFsdWVzIiwidmFsaWRhdG9ycyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/validators/validators.js\n");
208
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ inRange: () => (/* binding */ inRange),\n/* harmony export */ isUrl: () => (/* binding */ isUrl),\n/* harmony export */ isUrlWithTemplateParameters: () => (/* binding */ isUrlWithTemplateParameters),\n/* harmony export */ oneOf: () => (/* binding */ oneOf),\n/* harmony export */ validators: () => (/* binding */ validators)\n/* harmony export */ });\n/* harmony import */ var _validator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validator.js */ \"../../framework/esm-config/dist/validators/validator.js\");\n/** @module @category Config Validation */ \n/**\n * Verifies that the value is between the provided minimum and maximum\n *\n * @param min Minimum acceptable value\n * @param max Maximum acceptable value\n * @returns A validator function that checks if a value is within the specified range.\n */ const inRange = (min, max)=>{\n return (0,_validator_js__WEBPACK_IMPORTED_MODULE_0__.validator)((val)=>min <= val && val <= max, `must be between ${min} and ${max}`);\n};\n/**\n * Verifies that a string contains only the default URL template\n * parameters, plus any specified in `allowedTemplateParameters`.\n *\n * @param allowedTemplateParameters To be added to `openmrsBase` and `openmrsSpaBase`\n * @returns A validator function that checks if a URL contains only allowed template parameters.\n * @category Navigation\n */ const isUrlWithTemplateParameters = (allowedTemplateParameters)=>{\n const allowedParams = allowedTemplateParameters.concat([\n 'openmrsBase',\n 'openmrsSpaBase'\n ]);\n return (0,_validator_js__WEBPACK_IMPORTED_MODULE_0__.validator)((val)=>{\n if (!val || typeof val != 'string') {\n return false;\n }\n const rx = /\\${(.*?)}/g;\n let match = rx.exec(val);\n while(match){\n if (!allowedParams.includes(match[1])) {\n return false;\n }\n match = rx.exec(val);\n }\n return true;\n }, 'Should be a URL or path. The allowed template parameters are ' + allowedParams.map((p)=>'${' + p + '}').join(', '));\n};\n/**\n * Verifies that a string contains only the default URL template parameters.\n *\n * @category Navigation\n */ const isUrl = isUrlWithTemplateParameters([]);\n/**\n * Verifies that the value is one of the allowed options.\n *\n * @param allowedValues The list of allowable values\n * @returns A validator function that checks if a value is in the allowed list.\n */ const oneOf = (allowedValues)=>{\n return (0,_validator_js__WEBPACK_IMPORTED_MODULE_0__.validator)((val)=>allowedValues.includes(val), `Must be one of the following: '${allowedValues.join(\"', '\")}'.`);\n};\nconst validators = {\n inRange,\n isUrl,\n isUrlWithTemplateParameters,\n oneOf\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC92YWxpZGF0b3JzL3ZhbGlkYXRvcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsd0NBQXdDLEdBQThDO0FBQ3RGOzs7Ozs7Q0FNQyxHQUFVLE1BQU1DLFVBQVUsQ0FBQ0MsS0FBS0M7SUFDN0IsT0FBT0gsd0RBQVNBLENBQUMsQ0FBQ0ksTUFBTUYsT0FBT0UsT0FBT0EsT0FBT0QsS0FBSyxDQUFDLGdCQUFnQixFQUFFRCxJQUFJLEtBQUssRUFBRUMsS0FBSztBQUN6RixFQUFFO0FBQ0Y7Ozs7Ozs7Q0FPQyxHQUFVLE1BQU1FLDhCQUE4QixDQUFDQztJQUM1QyxNQUFNQyxnQkFBZ0JELDBCQUEwQkUsTUFBTSxDQUFDO1FBQ25EO1FBQ0E7S0FDSDtJQUNELE9BQU9SLHdEQUFTQSxDQUFDLENBQUNJO1FBQ2QsSUFBSSxDQUFDQSxPQUFPLE9BQU9BLE9BQU8sVUFBVTtZQUNoQyxPQUFPO1FBQ1g7UUFDQSxNQUFNSyxLQUFLO1FBQ1gsSUFBSUMsUUFBUUQsR0FBR0UsSUFBSSxDQUFDUDtRQUNwQixNQUFNTSxNQUFNO1lBQ1IsSUFBSSxDQUFDSCxjQUFjSyxRQUFRLENBQUNGLEtBQUssQ0FBQyxFQUFFLEdBQUc7Z0JBQ25DLE9BQU87WUFDWDtZQUNBQSxRQUFRRCxHQUFHRSxJQUFJLENBQUNQO1FBQ3BCO1FBQ0EsT0FBTztJQUNYLEdBQUcsa0VBQWtFRyxjQUFjTSxHQUFHLENBQUMsQ0FBQ0MsSUFBSSxPQUFPQSxJQUFJLEtBQUtDLElBQUksQ0FBQztBQUNySCxFQUFFO0FBQ0Y7Ozs7Q0FJQyxHQUFVLE1BQU1DLFFBQVFYLDRCQUE0QixFQUFFLEVBQUU7QUFDekQ7Ozs7O0NBS0MsR0FBVSxNQUFNWSxRQUFRLENBQUNDO0lBQ3RCLE9BQU9sQix3REFBU0EsQ0FBQyxDQUFDSSxNQUFNYyxjQUFjTixRQUFRLENBQUNSLE1BQU0sQ0FBQywrQkFBK0IsRUFBRWMsY0FBY0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3pILEVBQUU7QUFDSyxNQUFNSSxhQUFhO0lBQ3RCbEI7SUFDQWU7SUFDQVg7SUFDQVk7QUFDSixFQUFFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L3ZhbGlkYXRvcnMvdmFsaWRhdG9ycy5qcz8yZmIwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBDb25maWcgVmFsaWRhdGlvbiAqLyBpbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi92YWxpZGF0b3IuanNcIjtcbi8qKlxuICogVmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgaXMgYmV0d2VlbiB0aGUgcHJvdmlkZWQgbWluaW11bSBhbmQgbWF4aW11bVxuICpcbiAqIEBwYXJhbSBtaW4gTWluaW11bSBhY2NlcHRhYmxlIHZhbHVlXG4gKiBAcGFyYW0gbWF4IE1heGltdW0gYWNjZXB0YWJsZSB2YWx1ZVxuICogQHJldHVybnMgQSB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSB2YWx1ZSBpcyB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZS5cbiAqLyBleHBvcnQgY29uc3QgaW5SYW5nZSA9IChtaW4sIG1heCk9PntcbiAgICByZXR1cm4gdmFsaWRhdG9yKCh2YWwpPT5taW4gPD0gdmFsICYmIHZhbCA8PSBtYXgsIGBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH1gKTtcbn07XG4vKipcbiAqIFZlcmlmaWVzIHRoYXQgYSBzdHJpbmcgY29udGFpbnMgb25seSB0aGUgZGVmYXVsdCBVUkwgdGVtcGxhdGVcbiAqIHBhcmFtZXRlcnMsIHBsdXMgYW55IHNwZWNpZmllZCBpbiBgYWxsb3dlZFRlbXBsYXRlUGFyYW1ldGVyc2AuXG4gKlxuICogQHBhcmFtIGFsbG93ZWRUZW1wbGF0ZVBhcmFtZXRlcnMgVG8gYmUgYWRkZWQgdG8gYG9wZW5tcnNCYXNlYCBhbmQgYG9wZW5tcnNTcGFCYXNlYFxuICogQHJldHVybnMgQSB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSBVUkwgY29udGFpbnMgb25seSBhbGxvd2VkIHRlbXBsYXRlIHBhcmFtZXRlcnMuXG4gKiBAY2F0ZWdvcnkgTmF2aWdhdGlvblxuICovIGV4cG9ydCBjb25zdCBpc1VybFdpdGhUZW1wbGF0ZVBhcmFtZXRlcnMgPSAoYWxsb3dlZFRlbXBsYXRlUGFyYW1ldGVycyk9PntcbiAgICBjb25zdCBhbGxvd2VkUGFyYW1zID0gYWxsb3dlZFRlbXBsYXRlUGFyYW1ldGVycy5jb25jYXQoW1xuICAgICAgICAnb3Blbm1yc0Jhc2UnLFxuICAgICAgICAnb3Blbm1yc1NwYUJhc2UnXG4gICAgXSk7XG4gICAgcmV0dXJuIHZhbGlkYXRvcigodmFsKT0+e1xuICAgICAgICBpZiAoIXZhbCB8fCB0eXBlb2YgdmFsICE9ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnggPSAvXFwkeyguKj8pfS9nO1xuICAgICAgICBsZXQgbWF0Y2ggPSByeC5leGVjKHZhbCk7XG4gICAgICAgIHdoaWxlKG1hdGNoKXtcbiAgICAgICAgICAgIGlmICghYWxsb3dlZFBhcmFtcy5pbmNsdWRlcyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXRjaCA9IHJ4LmV4ZWModmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LCAnU2hvdWxkIGJlIGEgVVJMIG9yIHBhdGguIFRoZSBhbGxvd2VkIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlICcgKyBhbGxvd2VkUGFyYW1zLm1hcCgocCk9PickeycgKyBwICsgJ30nKS5qb2luKCcsICcpKTtcbn07XG4vKipcbiAqIFZlcmlmaWVzIHRoYXQgYSBzdHJpbmcgY29udGFpbnMgb25seSB0aGUgZGVmYXVsdCBVUkwgdGVtcGxhdGUgcGFyYW1ldGVycy5cbiAqXG4gKiBAY2F0ZWdvcnkgTmF2aWdhdGlvblxuICovIGV4cG9ydCBjb25zdCBpc1VybCA9IGlzVXJsV2l0aFRlbXBsYXRlUGFyYW1ldGVycyhbXSk7XG4vKipcbiAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiB0aGUgYWxsb3dlZCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBhbGxvd2VkVmFsdWVzIFRoZSBsaXN0IG9mIGFsbG93YWJsZSB2YWx1ZXNcbiAqIEByZXR1cm5zIEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIGEgdmFsdWUgaXMgaW4gdGhlIGFsbG93ZWQgbGlzdC5cbiAqLyBleHBvcnQgY29uc3Qgb25lT2YgPSAoYWxsb3dlZFZhbHVlcyk9PntcbiAgICByZXR1cm4gdmFsaWRhdG9yKCh2YWwpPT5hbGxvd2VkVmFsdWVzLmluY2x1ZGVzKHZhbCksIGBNdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAnJHthbGxvd2VkVmFsdWVzLmpvaW4oXCInLCAnXCIpfScuYCk7XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRvcnMgPSB7XG4gICAgaW5SYW5nZSxcbiAgICBpc1VybCxcbiAgICBpc1VybFdpdGhUZW1wbGF0ZVBhcmFtZXRlcnMsXG4gICAgb25lT2Zcbn07XG4iXSwibmFtZXMiOlsidmFsaWRhdG9yIiwiaW5SYW5nZSIsIm1pbiIsIm1heCIsInZhbCIsImlzVXJsV2l0aFRlbXBsYXRlUGFyYW1ldGVycyIsImFsbG93ZWRUZW1wbGF0ZVBhcmFtZXRlcnMiLCJhbGxvd2VkUGFyYW1zIiwiY29uY2F0IiwicngiLCJtYXRjaCIsImV4ZWMiLCJpbmNsdWRlcyIsIm1hcCIsInAiLCJqb2luIiwiaXNVcmwiLCJvbmVPZiIsImFsbG93ZWRWYWx1ZXMiLCJ2YWxpZGF0b3JzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/validators/validators.js\n");
209
209
 
210
210
  /***/ }),
211
211
 
@@ -215,7 +215,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
215
215
  \***************************************************/
216
216
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
217
217
 
218
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ contextStore: () => (/* binding */ contextStore),\n/* harmony export */ getContext: () => (/* binding */ getContext),\n/* harmony export */ registerContext: () => (/* binding */ registerContext),\n/* harmony export */ subscribeToContext: () => (/* binding */ subscribeToContext),\n/* harmony export */ unregisterContext: () => (/* binding */ unregisterContext),\n/* harmony export */ updateContext: () => (/* binding */ updateContext)\n/* harmony export */ });\n/* harmony import */ var zustand_vanilla__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zustand/vanilla */ \"../../../node_modules/zustand/esm/vanilla.mjs\");\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/** @module @category Context */ \n\n\n/**\n * @internal\n *\n * The application context store, using immer to potentially simplify updates\n */ const contextStore = (0,zustand_vanilla__WEBPACK_IMPORTED_MODULE_1__.createStore)()(()=>({}));\n(0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.registerGlobalStore)('openmrs-app-context', contextStore);\nconst nothing = Object();\n/**\n * Used by callers to register a new namespace in the application context. Attempting to register\n * an already-registered namespace will display a warning and make no modifications to the state.\n *\n * @param namespace the namespace to register\n * @param initialValue the initial value of the namespace\n */ function registerContext(namespace, initialValue = nothing) {\n contextStore.setState((state)=>{\n if (namespace in state) {\n throw new Error(`Attempted to re-register namespace ${namespace} in the app context. Each namespace must be unregistered before the name can be registered again.`);\n }\n return Object.assign({}, state, {\n [namespace]: initialValue === nothing ? {} : initialValue\n });\n });\n}\n/**\n * Used by caller to unregister a namespace in the application context. Unregistering a namespace\n * will remove the namespace and all associated data.\n */ function unregisterContext(namespace) {\n contextStore.setState((state)=>{\n if (namespace in state) {\n delete state[namespace];\n }\n return state;\n });\n}\n/**\n * Returns an _immutable_ version of the state of the namespace as it is currently\n *\n * @typeParam T The type of the value stored in the namespace\n * @typeParam U The return type of this hook which is mostly relevant when using a selector\n * @param namespace The namespace to load properties from\n * @param selector An optional function which extracts the relevant part of the state\n */ function getContext(namespace, selector = (state)=>state) {\n const state = contextStore.getState();\n if (namespace in state) {\n return Object.freeze(Object.assign({}, selector ? selector(state[namespace]) : state[namespace]));\n }\n return null;\n}\n/**\n * Updates a namespace in the global context. If the namespace does not exist, it is registered.\n */ function updateContext(namespace, update) {\n contextStore.setState((state)=>{\n if (!(namespace in state)) {\n state[namespace] = {};\n }\n state[namespace] = update(state[namespace]);\n return Object.assign({}, state);\n });\n}\n/**\n * Subscribes to updates of a given namespace. Note that the returned object is immutable.\n *\n * @param namespace the namespace to subscribe to\n * @param callback a function invoked with the current context whenever\n * @returns A function to unsubscribe from the context\n */ function subscribeToContext(namespace, callback) {\n let previous = getContext(namespace);\n // set initial value\n callback(Object.freeze(Object.assign({}, previous)));\n return contextStore.subscribe((state)=>{\n let current = namespace in state ? state[namespace] : null;\n if (current !== previous) {\n previous = current;\n callback(Object.freeze(Object.assign({}, current)));\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb250ZXh0L2Rpc3QvY29udGV4dC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLDhCQUE4QixHQUFnQjtBQUNBO0FBQ1c7QUFDekQ7Ozs7Q0FJQyxHQUFVLE1BQU1FLGVBQWVGLDREQUFXQSxHQUFHLElBQUssRUFBQyxJQUFJO0FBQ3hEQyx1RUFBbUJBLENBQUMsdUJBQXVCQztBQUMzQyxNQUFNQyxVQUFVQztBQUNoQjs7Ozs7O0NBTUMsR0FBVSxTQUFTQyxnQkFBZ0JDLFNBQVMsRUFBRUMsZUFBZUosT0FBTztJQUNqRUQsYUFBYU0sUUFBUSxDQUFDLENBQUNDO1FBQ25CLElBQUlILGFBQWFHLE9BQU87WUFDcEIsTUFBTSxJQUFJQyxNQUFNLENBQUMsbUNBQW1DLEVBQUVKLFVBQVUsaUdBQWlHLENBQUM7UUFDdEs7UUFDQSxPQUFPRixPQUFPTyxNQUFNLENBQUMsQ0FBQyxHQUFHRixPQUFPO1lBQzVCLENBQUNILFVBQVUsRUFBRUMsaUJBQWlCSixVQUFVLENBQUMsSUFBSUk7UUFDakQ7SUFDSjtBQUNKO0FBQ0E7OztDQUdDLEdBQVUsU0FBU0ssa0JBQWtCTixTQUFTO0lBQzNDSixhQUFhTSxRQUFRLENBQUMsQ0FBQ0M7UUFDbkIsSUFBSUgsYUFBYUcsT0FBTztZQUNwQixPQUFPQSxLQUFLLENBQUNILFVBQVU7UUFDM0I7UUFDQSxPQUFPRztJQUNYO0FBQ0o7QUFDQTs7Ozs7OztDQU9DLEdBQVUsU0FBU0ksV0FBV1AsU0FBUyxFQUFFUSxXQUFXLENBQUNMLFFBQVFBLEtBQUs7SUFDL0QsTUFBTUEsUUFBUVAsYUFBYWEsUUFBUTtJQUNuQyxJQUFJVCxhQUFhRyxPQUFPO1FBQ3BCLE9BQU9MLE9BQU9ZLE1BQU0sQ0FBQ1osT0FBT08sTUFBTSxDQUFDLENBQUMsR0FBR0csV0FBV0EsU0FBU0wsS0FBSyxDQUFDSCxVQUFVLElBQUlHLEtBQUssQ0FBQ0gsVUFBVTtJQUNuRztJQUNBLE9BQU87QUFDWDtBQUNBOztDQUVDLEdBQVUsU0FBU1csY0FBY1gsU0FBUyxFQUFFWSxNQUFNO0lBQy9DaEIsYUFBYU0sUUFBUSxDQUFDLENBQUNDO1FBQ25CLElBQUksQ0FBRUgsQ0FBQUEsYUFBYUcsS0FBSSxHQUFJO1lBQ3ZCQSxLQUFLLENBQUNILFVBQVUsR0FBRyxDQUFDO1FBQ3hCO1FBQ0FHLEtBQUssQ0FBQ0gsVUFBVSxHQUFHWSxPQUFPVCxLQUFLLENBQUNILFVBQVU7UUFDMUMsT0FBT0YsT0FBT08sTUFBTSxDQUFDLENBQUMsR0FBR0Y7SUFDN0I7QUFDSjtBQUNBOzs7Ozs7Q0FNQyxHQUFVLFNBQVNVLG1CQUFtQmIsU0FBUyxFQUFFYyxRQUFRO0lBQ3RELElBQUlDLFdBQVdSLFdBQVdQO0lBQzFCLG9CQUFvQjtJQUNwQmMsU0FBU2hCLE9BQU9ZLE1BQU0sQ0FBQ1osT0FBT08sTUFBTSxDQUFDLENBQUMsR0FBR1U7SUFDekMsT0FBT25CLGFBQWFvQixTQUFTLENBQUMsQ0FBQ2I7UUFDM0IsSUFBSWMsVUFBVWpCLGFBQWFHLFFBQVFBLEtBQUssQ0FBQ0gsVUFBVSxHQUFHO1FBQ3RELElBQUlpQixZQUFZRixVQUFVO1lBQ3RCQSxXQUFXRTtZQUNYSCxTQUFTaEIsT0FBT1ksTUFBTSxDQUFDWixPQUFPTyxNQUFNLENBQUMsQ0FBQyxHQUFHWTtRQUM3QztJQUNKO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tY29udGV4dC9kaXN0L2NvbnRleHQuanM/ZWViOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQ29udGV4dCAqLyAndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gXCJ6dXN0YW5kL3ZhbmlsbGFcIjtcbmltcG9ydCB7IHJlZ2lzdGVyR2xvYmFsU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXN0YXRlXCI7XG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIFRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IHN0b3JlLCB1c2luZyBpbW1lciB0byBwb3RlbnRpYWxseSBzaW1wbGlmeSB1cGRhdGVzXG4gKi8gZXhwb3J0IGNvbnN0IGNvbnRleHRTdG9yZSA9IGNyZWF0ZVN0b3JlKCkoKCk9Pih7fSkpO1xucmVnaXN0ZXJHbG9iYWxTdG9yZSgnb3Blbm1ycy1hcHAtY29udGV4dCcsIGNvbnRleHRTdG9yZSk7XG5jb25zdCBub3RoaW5nID0gT2JqZWN0KCk7XG4vKipcbiAqIFVzZWQgYnkgY2FsbGVycyB0byByZWdpc3RlciBhIG5ldyBuYW1lc3BhY2UgaW4gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuIEF0dGVtcHRpbmcgdG8gcmVnaXN0ZXJcbiAqIGFuIGFscmVhZHktcmVnaXN0ZXJlZCBuYW1lc3BhY2Ugd2lsbCBkaXNwbGF5IGEgd2FybmluZyBhbmQgbWFrZSBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgdG8gcmVnaXN0ZXJcbiAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIG5hbWVzcGFjZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbnRleHQobmFtZXNwYWNlLCBpbml0aWFsVmFsdWUgPSBub3RoaW5nKSB7XG4gICAgY29udGV4dFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9PntcbiAgICAgICAgaWYgKG5hbWVzcGFjZSBpbiBzdGF0ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0ZWQgdG8gcmUtcmVnaXN0ZXIgbmFtZXNwYWNlICR7bmFtZXNwYWNlfSBpbiB0aGUgYXBwIGNvbnRleHQuIEVhY2ggbmFtZXNwYWNlIG11c3QgYmUgdW5yZWdpc3RlcmVkIGJlZm9yZSB0aGUgbmFtZSBjYW4gYmUgcmVnaXN0ZXJlZCBhZ2Fpbi5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgIFtuYW1lc3BhY2VdOiBpbml0aWFsVmFsdWUgPT09IG5vdGhpbmcgPyB7fSA6IGluaXRpYWxWYWx1ZVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8qKlxuICogVXNlZCBieSBjYWxsZXIgdG8gdW5yZWdpc3RlciBhIG5hbWVzcGFjZSBpbiB0aGUgYXBwbGljYXRpb24gY29udGV4dC4gVW5yZWdpc3RlcmluZyBhIG5hbWVzcGFjZVxuICogd2lsbCByZW1vdmUgdGhlIG5hbWVzcGFjZSBhbmQgYWxsIGFzc29jaWF0ZWQgZGF0YS5cbiAqLyBleHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckNvbnRleHQobmFtZXNwYWNlKSB7XG4gICAgY29udGV4dFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9PntcbiAgICAgICAgaWYgKG5hbWVzcGFjZSBpbiBzdGF0ZSkge1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlW25hbWVzcGFjZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0pO1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIF9pbW11dGFibGVfIHZlcnNpb24gb2YgdGhlIHN0YXRlIG9mIHRoZSBuYW1lc3BhY2UgYXMgaXQgaXMgY3VycmVudGx5XG4gKlxuICogQHR5cGVQYXJhbSBUIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIG5hbWVzcGFjZVxuICogQHR5cGVQYXJhbSBVIFRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIGhvb2sgd2hpY2ggaXMgbW9zdGx5IHJlbGV2YW50IHdoZW4gdXNpbmcgYSBzZWxlY3RvclxuICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRvIGxvYWQgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0gc2VsZWN0b3IgQW4gb3B0aW9uYWwgZnVuY3Rpb24gd2hpY2ggZXh0cmFjdHMgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIHN0YXRlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRleHQobmFtZXNwYWNlLCBzZWxlY3RvciA9IChzdGF0ZSk9PnN0YXRlKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250ZXh0U3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBpZiAobmFtZXNwYWNlIGluIHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdG9yID8gc2VsZWN0b3Ioc3RhdGVbbmFtZXNwYWNlXSkgOiBzdGF0ZVtuYW1lc3BhY2VdKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBVcGRhdGVzIGEgbmFtZXNwYWNlIGluIHRoZSBnbG9iYWwgY29udGV4dC4gSWYgdGhlIG5hbWVzcGFjZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgcmVnaXN0ZXJlZC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gdXBkYXRlQ29udGV4dChuYW1lc3BhY2UsIHVwZGF0ZSkge1xuICAgIGNvbnRleHRTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT57XG4gICAgICAgIGlmICghKG5hbWVzcGFjZSBpbiBzdGF0ZSkpIHtcbiAgICAgICAgICAgIHN0YXRlW25hbWVzcGFjZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZVtuYW1lc3BhY2VdID0gdXBkYXRlKHN0YXRlW25hbWVzcGFjZV0pO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIHVwZGF0ZXMgb2YgYSBnaXZlbiBuYW1lc3BhY2UuIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGltbXV0YWJsZS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgdG8gc3Vic2NyaWJlIHRvXG4gKiBAcGFyYW0gY2FsbGJhY2sgYSBmdW5jdGlvbiBpbnZva2VkIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dCB3aGVuZXZlclxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0byB1bnN1YnNjcmliZSBmcm9tIHRoZSBjb250ZXh0XG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHN1YnNjcmliZVRvQ29udGV4dChuYW1lc3BhY2UsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHByZXZpb3VzID0gZ2V0Q29udGV4dChuYW1lc3BhY2UpO1xuICAgIC8vIHNldCBpbml0aWFsIHZhbHVlXG4gICAgY2FsbGJhY2soT2JqZWN0LmZyZWV6ZShPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91cykpKTtcbiAgICByZXR1cm4gY29udGV4dFN0b3JlLnN1YnNjcmliZSgoc3RhdGUpPT57XG4gICAgICAgIGxldCBjdXJyZW50ID0gbmFtZXNwYWNlIGluIHN0YXRlID8gc3RhdGVbbmFtZXNwYWNlXSA6IG51bGw7XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgICAgICAgICAgY2FsbGJhY2soT2JqZWN0LmZyZWV6ZShPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50KSkpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlU3RvcmUiLCJyZWdpc3Rlckdsb2JhbFN0b3JlIiwiY29udGV4dFN0b3JlIiwibm90aGluZyIsIk9iamVjdCIsInJlZ2lzdGVyQ29udGV4dCIsIm5hbWVzcGFjZSIsImluaXRpYWxWYWx1ZSIsInNldFN0YXRlIiwic3RhdGUiLCJFcnJvciIsImFzc2lnbiIsInVucmVnaXN0ZXJDb250ZXh0IiwiZ2V0Q29udGV4dCIsInNlbGVjdG9yIiwiZ2V0U3RhdGUiLCJmcmVlemUiLCJ1cGRhdGVDb250ZXh0IiwidXBkYXRlIiwic3Vic2NyaWJlVG9Db250ZXh0IiwiY2FsbGJhY2siLCJwcmV2aW91cyIsInN1YnNjcmliZSIsImN1cnJlbnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-context/dist/context.js\n");
218
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ contextStore: () => (/* binding */ contextStore),\n/* harmony export */ getContext: () => (/* binding */ getContext),\n/* harmony export */ registerContext: () => (/* binding */ registerContext),\n/* harmony export */ subscribeToContext: () => (/* binding */ subscribeToContext),\n/* harmony export */ unregisterContext: () => (/* binding */ unregisterContext),\n/* harmony export */ updateContext: () => (/* binding */ updateContext)\n/* harmony export */ });\n/* harmony import */ var zustand_vanilla__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zustand/vanilla */ \"../../../node_modules/zustand/esm/vanilla.mjs\");\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/** @module @category Context */ \n\n\n/**\n * @internal\n *\n * The application context store, using immer to potentially simplify updates\n */ const contextStore = (0,zustand_vanilla__WEBPACK_IMPORTED_MODULE_1__.createStore)()(()=>({}));\n(0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.registerGlobalStore)('openmrs-app-context', contextStore);\nconst nothing = Object();\n/**\n * Used by callers to register a new namespace in the application context. Attempting to register\n * an already-registered namespace will display a warning and make no modifications to the state.\n *\n * @param namespace the namespace to register\n * @param initialValue the initial value of the namespace\n */ function registerContext(namespace, initialValue = nothing) {\n contextStore.setState((state)=>{\n if (namespace in state) {\n throw new Error(`Attempted to re-register namespace ${namespace} in the app context. Each namespace must be unregistered before the name can be registered again.`);\n }\n return Object.assign({}, state, {\n [namespace]: initialValue === nothing ? {} : initialValue\n });\n });\n}\n/**\n * Used by caller to unregister a namespace in the application context. Unregistering a namespace\n * will remove the namespace and all associated data.\n */ function unregisterContext(namespace) {\n contextStore.setState((state)=>{\n if (namespace in state) {\n delete state[namespace];\n }\n return state;\n });\n}\n/**\n * Returns an _immutable_ version of the state of the namespace as it is currently\n *\n * @typeParam T The type of the value stored in the namespace\n * @typeParam U The return type of this hook which is mostly relevant when using a selector\n * @param namespace The namespace to load properties from\n * @param selector An optional function which extracts the relevant part of the state\n * @returns The immutable state (or selected portion) of the namespace, or `null` if the namespace is not registered.\n */ function getContext(namespace, selector = (state)=>state) {\n const state = contextStore.getState();\n if (namespace in state) {\n return Object.freeze(Object.assign({}, selector ? selector(state[namespace]) : state[namespace]));\n }\n return null;\n}\n/**\n * Updates a namespace in the global context. If the namespace does not exist, it is registered.\n */ function updateContext(namespace, update) {\n contextStore.setState((state)=>{\n if (!(namespace in state)) {\n state[namespace] = {};\n }\n state[namespace] = update(state[namespace]);\n return Object.assign({}, state);\n });\n}\n/**\n * Subscribes to updates of a given namespace. Note that the returned object is immutable.\n *\n * @param namespace the namespace to subscribe to\n * @param callback a function invoked with the current context whenever\n * @returns A function to unsubscribe from the context\n */ function subscribeToContext(namespace, callback) {\n let previous = getContext(namespace);\n // set initial value\n callback(Object.freeze(Object.assign({}, previous)));\n return contextStore.subscribe((state)=>{\n let current = namespace in state ? state[namespace] : null;\n if (current !== previous) {\n previous = current;\n callback(Object.freeze(Object.assign({}, current)));\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1jb250ZXh0L2Rpc3QvY29udGV4dC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLDhCQUE4QixHQUFnQjtBQUNBO0FBQ1c7QUFDekQ7Ozs7Q0FJQyxHQUFVLE1BQU1FLGVBQWVGLDREQUFXQSxHQUFHLElBQUssRUFBQyxJQUFJO0FBQ3hEQyx1RUFBbUJBLENBQUMsdUJBQXVCQztBQUMzQyxNQUFNQyxVQUFVQztBQUNoQjs7Ozs7O0NBTUMsR0FBVSxTQUFTQyxnQkFBZ0JDLFNBQVMsRUFBRUMsZUFBZUosT0FBTztJQUNqRUQsYUFBYU0sUUFBUSxDQUFDLENBQUNDO1FBQ25CLElBQUlILGFBQWFHLE9BQU87WUFDcEIsTUFBTSxJQUFJQyxNQUFNLENBQUMsbUNBQW1DLEVBQUVKLFVBQVUsaUdBQWlHLENBQUM7UUFDdEs7UUFDQSxPQUFPRixPQUFPTyxNQUFNLENBQUMsQ0FBQyxHQUFHRixPQUFPO1lBQzVCLENBQUNILFVBQVUsRUFBRUMsaUJBQWlCSixVQUFVLENBQUMsSUFBSUk7UUFDakQ7SUFDSjtBQUNKO0FBQ0E7OztDQUdDLEdBQVUsU0FBU0ssa0JBQWtCTixTQUFTO0lBQzNDSixhQUFhTSxRQUFRLENBQUMsQ0FBQ0M7UUFDbkIsSUFBSUgsYUFBYUcsT0FBTztZQUNwQixPQUFPQSxLQUFLLENBQUNILFVBQVU7UUFDM0I7UUFDQSxPQUFPRztJQUNYO0FBQ0o7QUFDQTs7Ozs7Ozs7Q0FRQyxHQUFVLFNBQVNJLFdBQVdQLFNBQVMsRUFBRVEsV0FBVyxDQUFDTCxRQUFRQSxLQUFLO0lBQy9ELE1BQU1BLFFBQVFQLGFBQWFhLFFBQVE7SUFDbkMsSUFBSVQsYUFBYUcsT0FBTztRQUNwQixPQUFPTCxPQUFPWSxNQUFNLENBQUNaLE9BQU9PLE1BQU0sQ0FBQyxDQUFDLEdBQUdHLFdBQVdBLFNBQVNMLEtBQUssQ0FBQ0gsVUFBVSxJQUFJRyxLQUFLLENBQUNILFVBQVU7SUFDbkc7SUFDQSxPQUFPO0FBQ1g7QUFDQTs7Q0FFQyxHQUFVLFNBQVNXLGNBQWNYLFNBQVMsRUFBRVksTUFBTTtJQUMvQ2hCLGFBQWFNLFFBQVEsQ0FBQyxDQUFDQztRQUNuQixJQUFJLENBQUVILENBQUFBLGFBQWFHLEtBQUksR0FBSTtZQUN2QkEsS0FBSyxDQUFDSCxVQUFVLEdBQUcsQ0FBQztRQUN4QjtRQUNBRyxLQUFLLENBQUNILFVBQVUsR0FBR1ksT0FBT1QsS0FBSyxDQUFDSCxVQUFVO1FBQzFDLE9BQU9GLE9BQU9PLE1BQU0sQ0FBQyxDQUFDLEdBQUdGO0lBQzdCO0FBQ0o7QUFDQTs7Ozs7O0NBTUMsR0FBVSxTQUFTVSxtQkFBbUJiLFNBQVMsRUFBRWMsUUFBUTtJQUN0RCxJQUFJQyxXQUFXUixXQUFXUDtJQUMxQixvQkFBb0I7SUFDcEJjLFNBQVNoQixPQUFPWSxNQUFNLENBQUNaLE9BQU9PLE1BQU0sQ0FBQyxDQUFDLEdBQUdVO0lBQ3pDLE9BQU9uQixhQUFhb0IsU0FBUyxDQUFDLENBQUNiO1FBQzNCLElBQUljLFVBQVVqQixhQUFhRyxRQUFRQSxLQUFLLENBQUNILFVBQVUsR0FBRztRQUN0RCxJQUFJaUIsWUFBWUYsVUFBVTtZQUN0QkEsV0FBV0U7WUFDWEgsU0FBU2hCLE9BQU9ZLE1BQU0sQ0FBQ1osT0FBT08sTUFBTSxDQUFDLENBQUMsR0FBR1k7UUFDN0M7SUFDSjtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWNvbnRleHQvZGlzdC9jb250ZXh0LmpzP2VlYjkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IENvbnRleHQgKi8gJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tIFwienVzdGFuZC92YW5pbGxhXCI7XG5pbXBvcnQgeyByZWdpc3Rlckdsb2JhbFN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1zdGF0ZVwiO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBUaGUgYXBwbGljYXRpb24gY29udGV4dCBzdG9yZSwgdXNpbmcgaW1tZXIgdG8gcG90ZW50aWFsbHkgc2ltcGxpZnkgdXBkYXRlc1xuICovIGV4cG9ydCBjb25zdCBjb250ZXh0U3RvcmUgPSBjcmVhdGVTdG9yZSgpKCgpPT4oe30pKTtcbnJlZ2lzdGVyR2xvYmFsU3RvcmUoJ29wZW5tcnMtYXBwLWNvbnRleHQnLCBjb250ZXh0U3RvcmUpO1xuY29uc3Qgbm90aGluZyA9IE9iamVjdCgpO1xuLyoqXG4gKiBVc2VkIGJ5IGNhbGxlcnMgdG8gcmVnaXN0ZXIgYSBuZXcgbmFtZXNwYWNlIGluIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LiBBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyXG4gKiBhbiBhbHJlYWR5LXJlZ2lzdGVyZWQgbmFtZXNwYWNlIHdpbGwgZGlzcGxheSBhIHdhcm5pbmcgYW5kIG1ha2Ugbm8gbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIHRvIHJlZ2lzdGVyXG4gKiBAcGFyYW0gaW5pdGlhbFZhbHVlIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBuYW1lc3BhY2VcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb250ZXh0KG5hbWVzcGFjZSwgaW5pdGlhbFZhbHVlID0gbm90aGluZykge1xuICAgIGNvbnRleHRTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT57XG4gICAgICAgIGlmIChuYW1lc3BhY2UgaW4gc3RhdGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdGVkIHRvIHJlLXJlZ2lzdGVyIG5hbWVzcGFjZSAke25hbWVzcGFjZX0gaW4gdGhlIGFwcCBjb250ZXh0LiBFYWNoIG5hbWVzcGFjZSBtdXN0IGJlIHVucmVnaXN0ZXJlZCBiZWZvcmUgdGhlIG5hbWUgY2FuIGJlIHJlZ2lzdGVyZWQgYWdhaW4uYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgICAgICBbbmFtZXNwYWNlXTogaW5pdGlhbFZhbHVlID09PSBub3RoaW5nID8ge30gOiBpbml0aWFsVmFsdWVcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4vKipcbiAqIFVzZWQgYnkgY2FsbGVyIHRvIHVucmVnaXN0ZXIgYSBuYW1lc3BhY2UgaW4gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuIFVucmVnaXN0ZXJpbmcgYSBuYW1lc3BhY2VcbiAqIHdpbGwgcmVtb3ZlIHRoZSBuYW1lc3BhY2UgYW5kIGFsbCBhc3NvY2lhdGVkIGRhdGEuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJDb250ZXh0KG5hbWVzcGFjZSkge1xuICAgIGNvbnRleHRTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT57XG4gICAgICAgIGlmIChuYW1lc3BhY2UgaW4gc3RhdGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZVtuYW1lc3BhY2VdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBfaW1tdXRhYmxlXyB2ZXJzaW9uIG9mIHRoZSBzdGF0ZSBvZiB0aGUgbmFtZXNwYWNlIGFzIGl0IGlzIGN1cnJlbnRseVxuICpcbiAqIEB0eXBlUGFyYW0gVCBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBuYW1lc3BhY2VcbiAqIEB0eXBlUGFyYW0gVSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBob29rIHdoaWNoIGlzIG1vc3RseSByZWxldmFudCB3aGVuIHVzaW5nIGEgc2VsZWN0b3JcbiAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB0byBsb2FkIHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHNlbGVjdG9yIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHdoaWNoIGV4dHJhY3RzIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBzdGF0ZVxuICogQHJldHVybnMgVGhlIGltbXV0YWJsZSBzdGF0ZSAob3Igc2VsZWN0ZWQgcG9ydGlvbikgb2YgdGhlIG5hbWVzcGFjZSwgb3IgYG51bGxgIGlmIHRoZSBuYW1lc3BhY2UgaXMgbm90IHJlZ2lzdGVyZWQuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRleHQobmFtZXNwYWNlLCBzZWxlY3RvciA9IChzdGF0ZSk9PnN0YXRlKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250ZXh0U3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBpZiAobmFtZXNwYWNlIGluIHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdG9yID8gc2VsZWN0b3Ioc3RhdGVbbmFtZXNwYWNlXSkgOiBzdGF0ZVtuYW1lc3BhY2VdKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBVcGRhdGVzIGEgbmFtZXNwYWNlIGluIHRoZSBnbG9iYWwgY29udGV4dC4gSWYgdGhlIG5hbWVzcGFjZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgcmVnaXN0ZXJlZC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gdXBkYXRlQ29udGV4dChuYW1lc3BhY2UsIHVwZGF0ZSkge1xuICAgIGNvbnRleHRTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT57XG4gICAgICAgIGlmICghKG5hbWVzcGFjZSBpbiBzdGF0ZSkpIHtcbiAgICAgICAgICAgIHN0YXRlW25hbWVzcGFjZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZVtuYW1lc3BhY2VdID0gdXBkYXRlKHN0YXRlW25hbWVzcGFjZV0pO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIHVwZGF0ZXMgb2YgYSBnaXZlbiBuYW1lc3BhY2UuIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGltbXV0YWJsZS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgdG8gc3Vic2NyaWJlIHRvXG4gKiBAcGFyYW0gY2FsbGJhY2sgYSBmdW5jdGlvbiBpbnZva2VkIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dCB3aGVuZXZlclxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0byB1bnN1YnNjcmliZSBmcm9tIHRoZSBjb250ZXh0XG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHN1YnNjcmliZVRvQ29udGV4dChuYW1lc3BhY2UsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHByZXZpb3VzID0gZ2V0Q29udGV4dChuYW1lc3BhY2UpO1xuICAgIC8vIHNldCBpbml0aWFsIHZhbHVlXG4gICAgY2FsbGJhY2soT2JqZWN0LmZyZWV6ZShPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91cykpKTtcbiAgICByZXR1cm4gY29udGV4dFN0b3JlLnN1YnNjcmliZSgoc3RhdGUpPT57XG4gICAgICAgIGxldCBjdXJyZW50ID0gbmFtZXNwYWNlIGluIHN0YXRlID8gc3RhdGVbbmFtZXNwYWNlXSA6IG51bGw7XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgICAgICAgICAgY2FsbGJhY2soT2JqZWN0LmZyZWV6ZShPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50KSkpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlU3RvcmUiLCJyZWdpc3Rlckdsb2JhbFN0b3JlIiwiY29udGV4dFN0b3JlIiwibm90aGluZyIsIk9iamVjdCIsInJlZ2lzdGVyQ29udGV4dCIsIm5hbWVzcGFjZSIsImluaXRpYWxWYWx1ZSIsInNldFN0YXRlIiwic3RhdGUiLCJFcnJvciIsImFzc2lnbiIsInVucmVnaXN0ZXJDb250ZXh0IiwiZ2V0Q29udGV4dCIsInNlbGVjdG9yIiwiZ2V0U3RhdGUiLCJmcmVlemUiLCJ1cGRhdGVDb250ZXh0IiwidXBkYXRlIiwic3Vic2NyaWJlVG9Db250ZXh0IiwiY2FsbGJhY2siLCJwcmV2aW91cyIsInN1YnNjcmliZSIsImN1cnJlbnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-context/dist/context.js\n");
219
219
 
220
220
  /***/ }),
221
221
 
@@ -225,7 +225,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
225
225
  \*******************************************************/
226
226
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
227
227
 
228
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ attachmentUrl: () => (/* binding */ attachmentUrl),\n/* harmony export */ createAttachment: () => (/* binding */ createAttachment),\n/* harmony export */ deleteAttachmentPermanently: () => (/* binding */ deleteAttachmentPermanently),\n/* harmony export */ getAttachmentByUuid: () => (/* binding */ getAttachmentByUuid),\n/* harmony export */ getAttachments: () => (/* binding */ getAttachments)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/** @module @category API */ \nconst attachmentUrl = `${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/attachment`;\nfunction getAttachmentByUuid(attachmentUuid, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${attachmentUrl}/${attachmentUuid}`, {\n signal: abortController.signal\n });\n}\nfunction getAttachments(patientUuid, includeEncounterless, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${attachmentUrl}?patient=${patientUuid}&includeEncounterless=${includeEncounterless}`, {\n signal: abortController.signal\n });\n}\nasync function createAttachment(patientUuid, fileToUpload) {\n const formData = new FormData();\n formData.append('fileCaption', fileToUpload.fileDescription);\n formData.append('patient', patientUuid);\n if (fileToUpload.file) {\n formData.append('file', fileToUpload.file, fileToUpload.fileName);\n } else {\n formData.append('file', new File([\n ''\n ], fileToUpload.fileName), fileToUpload.fileName);\n formData.append('base64Content', fileToUpload.base64Content);\n }\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${attachmentUrl}`, {\n method: 'POST',\n body: formData\n });\n}\nfunction deleteAttachmentPermanently(attachmentUuid, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${attachmentUrl}/${attachmentUuid}`, {\n method: 'DELETE',\n signal: abortController.signal\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvYXR0YWNobWVudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsMEJBQTBCLEdBQWdFO0FBQ25GLE1BQU1FLGdCQUFnQixHQUFHRCx5REFBV0EsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNsRCxTQUFTRSxvQkFBb0JDLGNBQWMsRUFBRUMsZUFBZTtJQUMvRCxPQUFPTCw4REFBWUEsQ0FBQyxHQUFHRSxjQUFjLENBQUMsRUFBRUUsZ0JBQWdCLEVBQUU7UUFDdERFLFFBQVFELGdCQUFnQkMsTUFBTTtJQUNsQztBQUNKO0FBQ08sU0FBU0MsZUFBZUMsV0FBVyxFQUFFQyxvQkFBb0IsRUFBRUosZUFBZTtJQUM3RSxPQUFPTCw4REFBWUEsQ0FBQyxHQUFHRSxjQUFjLFNBQVMsRUFBRU0sWUFBWSxzQkFBc0IsRUFBRUMsc0JBQXNCLEVBQUU7UUFDeEdILFFBQVFELGdCQUFnQkMsTUFBTTtJQUNsQztBQUNKO0FBQ08sZUFBZUksaUJBQWlCRixXQUFXLEVBQUVHLFlBQVk7SUFDNUQsTUFBTUMsV0FBVyxJQUFJQztJQUNyQkQsU0FBU0UsTUFBTSxDQUFDLGVBQWVILGFBQWFJLGVBQWU7SUFDM0RILFNBQVNFLE1BQU0sQ0FBQyxXQUFXTjtJQUMzQixJQUFJRyxhQUFhSyxJQUFJLEVBQUU7UUFDbkJKLFNBQVNFLE1BQU0sQ0FBQyxRQUFRSCxhQUFhSyxJQUFJLEVBQUVMLGFBQWFNLFFBQVE7SUFDcEUsT0FBTztRQUNITCxTQUFTRSxNQUFNLENBQUMsUUFBUSxJQUFJSSxLQUFLO1lBQzdCO1NBQ0gsRUFBRVAsYUFBYU0sUUFBUSxHQUFHTixhQUFhTSxRQUFRO1FBQ2hETCxTQUFTRSxNQUFNLENBQUMsaUJBQWlCSCxhQUFhUSxhQUFhO0lBQy9EO0lBQ0EsT0FBT25CLDhEQUFZQSxDQUFDLEdBQUdFLGVBQWUsRUFBRTtRQUNwQ2tCLFFBQVE7UUFDUkMsTUFBTVQ7SUFDVjtBQUNKO0FBQ08sU0FBU1UsNEJBQTRCbEIsY0FBYyxFQUFFQyxlQUFlO0lBQ3ZFLE9BQU9MLDhEQUFZQSxDQUFDLEdBQUdFLGNBQWMsQ0FBQyxFQUFFRSxnQkFBZ0IsRUFBRTtRQUN0RGdCLFFBQVE7UUFDUmQsUUFBUUQsZ0JBQWdCQyxNQUFNO0lBQ2xDO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tZW1yLWFwaS9kaXN0L2F0dGFjaG1lbnRzLmpzPzY0NWMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyBvcGVubXJzRmV0Y2gsIHJlc3RCYXNlVXJsIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1hcGlcIjtcbmV4cG9ydCBjb25zdCBhdHRhY2htZW50VXJsID0gYCR7cmVzdEJhc2VVcmx9L2F0dGFjaG1lbnRgO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRCeVV1aWQoYXR0YWNobWVudFV1aWQsIGFib3J0Q29udHJvbGxlcikge1xuICAgIHJldHVybiBvcGVubXJzRmV0Y2goYCR7YXR0YWNobWVudFVybH0vJHthdHRhY2htZW50VXVpZH1gLCB7XG4gICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRzKHBhdGllbnRVdWlkLCBpbmNsdWRlRW5jb3VudGVybGVzcywgYWJvcnRDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIG9wZW5tcnNGZXRjaChgJHthdHRhY2htZW50VXJsfT9wYXRpZW50PSR7cGF0aWVudFV1aWR9JmluY2x1ZGVFbmNvdW50ZXJsZXNzPSR7aW5jbHVkZUVuY291bnRlcmxlc3N9YCwge1xuICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBdHRhY2htZW50KHBhdGllbnRVdWlkLCBmaWxlVG9VcGxvYWQpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZUNhcHRpb24nLCBmaWxlVG9VcGxvYWQuZmlsZURlc2NyaXB0aW9uKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3BhdGllbnQnLCBwYXRpZW50VXVpZCk7XG4gICAgaWYgKGZpbGVUb1VwbG9hZC5maWxlKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVUb1VwbG9hZC5maWxlLCBmaWxlVG9VcGxvYWQuZmlsZU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIG5ldyBGaWxlKFtcbiAgICAgICAgICAgICcnXG4gICAgICAgIF0sIGZpbGVUb1VwbG9hZC5maWxlTmFtZSksIGZpbGVUb1VwbG9hZC5maWxlTmFtZSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnYmFzZTY0Q29udGVudCcsIGZpbGVUb1VwbG9hZC5iYXNlNjRDb250ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG9wZW5tcnNGZXRjaChgJHthdHRhY2htZW50VXJsfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IGZvcm1EYXRhXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlQXR0YWNobWVudFBlcm1hbmVudGx5KGF0dGFjaG1lbnRVdWlkLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gb3Blbm1yc0ZldGNoKGAke2F0dGFjaG1lbnRVcmx9LyR7YXR0YWNobWVudFV1aWR9YCwge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJvcGVubXJzRmV0Y2giLCJyZXN0QmFzZVVybCIsImF0dGFjaG1lbnRVcmwiLCJnZXRBdHRhY2htZW50QnlVdWlkIiwiYXR0YWNobWVudFV1aWQiLCJhYm9ydENvbnRyb2xsZXIiLCJzaWduYWwiLCJnZXRBdHRhY2htZW50cyIsInBhdGllbnRVdWlkIiwiaW5jbHVkZUVuY291bnRlcmxlc3MiLCJjcmVhdGVBdHRhY2htZW50IiwiZmlsZVRvVXBsb2FkIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImFwcGVuZCIsImZpbGVEZXNjcmlwdGlvbiIsImZpbGUiLCJmaWxlTmFtZSIsIkZpbGUiLCJiYXNlNjRDb250ZW50IiwibWV0aG9kIiwiYm9keSIsImRlbGV0ZUF0dGFjaG1lbnRQZXJtYW5lbnRseSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-emr-api/dist/attachments.js\n");
228
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ attachmentUrl: () => (/* binding */ attachmentUrl),\n/* harmony export */ createAttachment: () => (/* binding */ createAttachment),\n/* harmony export */ deleteAttachmentPermanently: () => (/* binding */ deleteAttachmentPermanently),\n/* harmony export */ getAttachmentByUuid: () => (/* binding */ getAttachmentByUuid),\n/* harmony export */ getAttachments: () => (/* binding */ getAttachments)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/** @module @category API */ \n/** Base URL for the attachment REST API endpoint. */ const attachmentUrl = `${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/attachment`;\n/**\n * Fetches a single attachment by its UUID from the OpenMRS server.\n *\n * @param attachmentUuid The UUID of the attachment to fetch.\n * @param abortController An AbortController to allow cancellation of the request.\n * @returns A Promise that resolves with the FetchResponse containing the attachment data.\n *\n * @example\n * ```ts\n * import { getAttachmentByUuid } from '@openmrs/esm-framework';\n * const abortController = new AbortController();\n * const response = await getAttachmentByUuid('attachment-uuid', abortController);\n * console.log(response.data);\n * ```\n */ function getAttachmentByUuid(attachmentUuid, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${attachmentUrl}/${attachmentUuid}`, {\n signal: abortController.signal\n });\n}\n/**\n * Fetches all attachments for a specific patient from the OpenMRS server.\n *\n * @param patientUuid The UUID of the patient whose attachments should be fetched.\n * @param includeEncounterless Whether to include attachments that are not associated\n * with any encounter.\n * @param abortController An AbortController to allow cancellation of the request.\n * @returns A Promise that resolves with the FetchResponse containing an array of attachments.\n *\n * @example\n * ```ts\n * import { getAttachments } from '@openmrs/esm-framework';\n * const abortController = new AbortController();\n * const response = await getAttachments('patient-uuid', true, abortController);\n * console.log(response.data.results);\n * ```\n */ function getAttachments(patientUuid, includeEncounterless, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${attachmentUrl}?patient=${patientUuid}&includeEncounterless=${includeEncounterless}`, {\n signal: abortController.signal\n });\n}\n/**\n * Creates a new attachment for a patient by uploading a file to the OpenMRS server.\n * The file can be provided either as a File object or as base64-encoded content.\n *\n * @param patientUuid The UUID of the patient to associate the attachment with.\n * @param fileToUpload An object containing the file data and metadata to upload.\n * Should include `file` (File object) or `base64Content`, plus `fileName` and\n * `fileDescription`.\n * @returns A Promise that resolves with the FetchResponse containing the created\n * attachment data.\n *\n * @example\n * ```ts\n * import { createAttachment } from '@openmrs/esm-framework';\n * const response = await createAttachment('patient-uuid', {\n * file: selectedFile,\n * fileName: 'document.pdf',\n * fileDescription: 'Patient consent form'\n * });\n * ```\n */ async function createAttachment(patientUuid, fileToUpload) {\n const formData = new FormData();\n formData.append('fileCaption', fileToUpload.fileDescription);\n formData.append('patient', patientUuid);\n if (fileToUpload.file) {\n formData.append('file', fileToUpload.file, fileToUpload.fileName);\n } else {\n formData.append('file', new File([\n ''\n ], fileToUpload.fileName), fileToUpload.fileName);\n formData.append('base64Content', fileToUpload.base64Content);\n }\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${attachmentUrl}`, {\n method: 'POST',\n body: formData\n });\n}\n/**\n * Permanently deletes an attachment from the OpenMRS server. This action cannot\n * be undone.\n *\n * @param attachmentUuid The UUID of the attachment to delete.\n * @param abortController An AbortController to allow cancellation of the request.\n * @returns A Promise that resolves with the FetchResponse confirming deletion.\n *\n * @example\n * ```ts\n * import { deleteAttachmentPermanently } from '@openmrs/esm-framework';\n * const abortController = new AbortController();\n * await deleteAttachmentPermanently('attachment-uuid', abortController);\n * ```\n */ function deleteAttachmentPermanently(attachmentUuid, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${attachmentUrl}/${attachmentUuid}`, {\n method: 'DELETE',\n signal: abortController.signal\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvYXR0YWNobWVudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsMEJBQTBCLEdBQWdFO0FBQzFGLG1EQUFtRCxHQUFVLE1BQU1FLGdCQUFnQixHQUFHRCx5REFBV0EsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMvRzs7Ozs7Ozs7Ozs7Ozs7Q0FjQyxHQUFVLFNBQVNFLG9CQUFvQkMsY0FBYyxFQUFFQyxlQUFlO0lBQ25FLE9BQU9MLDhEQUFZQSxDQUFDLEdBQUdFLGNBQWMsQ0FBQyxFQUFFRSxnQkFBZ0IsRUFBRTtRQUN0REUsUUFBUUQsZ0JBQWdCQyxNQUFNO0lBQ2xDO0FBQ0o7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztDQWdCQyxHQUFVLFNBQVNDLGVBQWVDLFdBQVcsRUFBRUMsb0JBQW9CLEVBQUVKLGVBQWU7SUFDakYsT0FBT0wsOERBQVlBLENBQUMsR0FBR0UsY0FBYyxTQUFTLEVBQUVNLFlBQVksc0JBQXNCLEVBQUVDLHNCQUFzQixFQUFFO1FBQ3hHSCxRQUFRRCxnQkFBZ0JDLE1BQU07SUFDbEM7QUFDSjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW9CQyxHQUFVLGVBQWVJLGlCQUFpQkYsV0FBVyxFQUFFRyxZQUFZO0lBQ2hFLE1BQU1DLFdBQVcsSUFBSUM7SUFDckJELFNBQVNFLE1BQU0sQ0FBQyxlQUFlSCxhQUFhSSxlQUFlO0lBQzNESCxTQUFTRSxNQUFNLENBQUMsV0FBV047SUFDM0IsSUFBSUcsYUFBYUssSUFBSSxFQUFFO1FBQ25CSixTQUFTRSxNQUFNLENBQUMsUUFBUUgsYUFBYUssSUFBSSxFQUFFTCxhQUFhTSxRQUFRO0lBQ3BFLE9BQU87UUFDSEwsU0FBU0UsTUFBTSxDQUFDLFFBQVEsSUFBSUksS0FBSztZQUM3QjtTQUNILEVBQUVQLGFBQWFNLFFBQVEsR0FBR04sYUFBYU0sUUFBUTtRQUNoREwsU0FBU0UsTUFBTSxDQUFDLGlCQUFpQkgsYUFBYVEsYUFBYTtJQUMvRDtJQUNBLE9BQU9uQiw4REFBWUEsQ0FBQyxHQUFHRSxlQUFlLEVBQUU7UUFDcENrQixRQUFRO1FBQ1JDLE1BQU1UO0lBQ1Y7QUFDSjtBQUNBOzs7Ozs7Ozs7Ozs7OztDQWNDLEdBQVUsU0FBU1UsNEJBQTRCbEIsY0FBYyxFQUFFQyxlQUFlO0lBQzNFLE9BQU9MLDhEQUFZQSxDQUFDLEdBQUdFLGNBQWMsQ0FBQyxFQUFFRSxnQkFBZ0IsRUFBRTtRQUN0RGdCLFFBQVE7UUFDUmQsUUFBUUQsZ0JBQWdCQyxNQUFNO0lBQ2xDO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tZW1yLWFwaS9kaXN0L2F0dGFjaG1lbnRzLmpzPzY0NWMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyBvcGVubXJzRmV0Y2gsIHJlc3RCYXNlVXJsIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1hcGlcIjtcbi8qKiBCYXNlIFVSTCBmb3IgdGhlIGF0dGFjaG1lbnQgUkVTVCBBUEkgZW5kcG9pbnQuICovIGV4cG9ydCBjb25zdCBhdHRhY2htZW50VXJsID0gYCR7cmVzdEJhc2VVcmx9L2F0dGFjaG1lbnRgO1xuLyoqXG4gKiBGZXRjaGVzIGEgc2luZ2xlIGF0dGFjaG1lbnQgYnkgaXRzIFVVSUQgZnJvbSB0aGUgT3Blbk1SUyBzZXJ2ZXIuXG4gKlxuICogQHBhcmFtIGF0dGFjaG1lbnRVdWlkIFRoZSBVVUlEIG9mIHRoZSBhdHRhY2htZW50IHRvIGZldGNoLlxuICogQHBhcmFtIGFib3J0Q29udHJvbGxlciBBbiBBYm9ydENvbnRyb2xsZXIgdG8gYWxsb3cgY2FuY2VsbGF0aW9uIG9mIHRoZSByZXF1ZXN0LlxuICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgRmV0Y2hSZXNwb25zZSBjb250YWluaW5nIHRoZSBhdHRhY2htZW50IGRhdGEuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBnZXRBdHRhY2htZW50QnlVdWlkIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldEF0dGFjaG1lbnRCeVV1aWQoJ2F0dGFjaG1lbnQtdXVpZCcsIGFib3J0Q29udHJvbGxlcik7XG4gKiBjb25zb2xlLmxvZyhyZXNwb25zZS5kYXRhKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRBdHRhY2htZW50QnlVdWlkKGF0dGFjaG1lbnRVdWlkLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gb3Blbm1yc0ZldGNoKGAke2F0dGFjaG1lbnRVcmx9LyR7YXR0YWNobWVudFV1aWR9YCwge1xuICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICB9KTtcbn1cbi8qKlxuICogRmV0Y2hlcyBhbGwgYXR0YWNobWVudHMgZm9yIGEgc3BlY2lmaWMgcGF0aWVudCBmcm9tIHRoZSBPcGVuTVJTIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0gcGF0aWVudFV1aWQgVGhlIFVVSUQgb2YgdGhlIHBhdGllbnQgd2hvc2UgYXR0YWNobWVudHMgc2hvdWxkIGJlIGZldGNoZWQuXG4gKiBAcGFyYW0gaW5jbHVkZUVuY291bnRlcmxlc3MgV2hldGhlciB0byBpbmNsdWRlIGF0dGFjaG1lbnRzIHRoYXQgYXJlIG5vdCBhc3NvY2lhdGVkXG4gKiAgIHdpdGggYW55IGVuY291bnRlci5cbiAqIEBwYXJhbSBhYm9ydENvbnRyb2xsZXIgQW4gQWJvcnRDb250cm9sbGVyIHRvIGFsbG93IGNhbmNlbGxhdGlvbiBvZiB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEZldGNoUmVzcG9uc2UgY29udGFpbmluZyBhbiBhcnJheSBvZiBhdHRhY2htZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGdldEF0dGFjaG1lbnRzIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldEF0dGFjaG1lbnRzKCdwYXRpZW50LXV1aWQnLCB0cnVlLCBhYm9ydENvbnRyb2xsZXIpO1xuICogY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YS5yZXN1bHRzKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRBdHRhY2htZW50cyhwYXRpZW50VXVpZCwgaW5jbHVkZUVuY291bnRlcmxlc3MsIGFib3J0Q29udHJvbGxlcikge1xuICAgIHJldHVybiBvcGVubXJzRmV0Y2goYCR7YXR0YWNobWVudFVybH0/cGF0aWVudD0ke3BhdGllbnRVdWlkfSZpbmNsdWRlRW5jb3VudGVybGVzcz0ke2luY2x1ZGVFbmNvdW50ZXJsZXNzfWAsIHtcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICAgfSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYXR0YWNobWVudCBmb3IgYSBwYXRpZW50IGJ5IHVwbG9hZGluZyBhIGZpbGUgdG8gdGhlIE9wZW5NUlMgc2VydmVyLlxuICogVGhlIGZpbGUgY2FuIGJlIHByb3ZpZGVkIGVpdGhlciBhcyBhIEZpbGUgb2JqZWN0IG9yIGFzIGJhc2U2NC1lbmNvZGVkIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHBhdGllbnRVdWlkIFRoZSBVVUlEIG9mIHRoZSBwYXRpZW50IHRvIGFzc29jaWF0ZSB0aGUgYXR0YWNobWVudCB3aXRoLlxuICogQHBhcmFtIGZpbGVUb1VwbG9hZCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZmlsZSBkYXRhIGFuZCBtZXRhZGF0YSB0byB1cGxvYWQuXG4gKiAgIFNob3VsZCBpbmNsdWRlIGBmaWxlYCAoRmlsZSBvYmplY3QpIG9yIGBiYXNlNjRDb250ZW50YCwgcGx1cyBgZmlsZU5hbWVgIGFuZFxuICogICBgZmlsZURlc2NyaXB0aW9uYC5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEZldGNoUmVzcG9uc2UgY29udGFpbmluZyB0aGUgY3JlYXRlZFxuICogICBhdHRhY2htZW50IGRhdGEuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBdHRhY2htZW50IH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNyZWF0ZUF0dGFjaG1lbnQoJ3BhdGllbnQtdXVpZCcsIHtcbiAqICAgZmlsZTogc2VsZWN0ZWRGaWxlLFxuICogICBmaWxlTmFtZTogJ2RvY3VtZW50LnBkZicsXG4gKiAgIGZpbGVEZXNjcmlwdGlvbjogJ1BhdGllbnQgY29uc2VudCBmb3JtJ1xuICogfSk7XG4gKiBgYGBcbiAqLyBleHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXR0YWNobWVudChwYXRpZW50VXVpZCwgZmlsZVRvVXBsb2FkKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGVDYXB0aW9uJywgZmlsZVRvVXBsb2FkLmZpbGVEZXNjcmlwdGlvbik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdwYXRpZW50JywgcGF0aWVudFV1aWQpO1xuICAgIGlmIChmaWxlVG9VcGxvYWQuZmlsZSkge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlVG9VcGxvYWQuZmlsZSwgZmlsZVRvVXBsb2FkLmZpbGVOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBuZXcgRmlsZShbXG4gICAgICAgICAgICAnJ1xuICAgICAgICBdLCBmaWxlVG9VcGxvYWQuZmlsZU5hbWUpLCBmaWxlVG9VcGxvYWQuZmlsZU5hbWUpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2Jhc2U2NENvbnRlbnQnLCBmaWxlVG9VcGxvYWQuYmFzZTY0Q29udGVudCk7XG4gICAgfVxuICAgIHJldHVybiBvcGVubXJzRmV0Y2goYCR7YXR0YWNobWVudFVybH1gLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBmb3JtRGF0YVxuICAgIH0pO1xufVxuLyoqXG4gKiBQZXJtYW5lbnRseSBkZWxldGVzIGFuIGF0dGFjaG1lbnQgZnJvbSB0aGUgT3Blbk1SUyBzZXJ2ZXIuIFRoaXMgYWN0aW9uIGNhbm5vdFxuICogYmUgdW5kb25lLlxuICpcbiAqIEBwYXJhbSBhdHRhY2htZW50VXVpZCBUaGUgVVVJRCBvZiB0aGUgYXR0YWNobWVudCB0byBkZWxldGUuXG4gKiBAcGFyYW0gYWJvcnRDb250cm9sbGVyIEFuIEFib3J0Q29udHJvbGxlciB0byBhbGxvdyBjYW5jZWxsYXRpb24gb2YgdGhlIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBGZXRjaFJlc3BvbnNlIGNvbmZpcm1pbmcgZGVsZXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBkZWxldGVBdHRhY2htZW50UGVybWFuZW50bHkgfSBmcm9tICdAb3Blbm1ycy9lc20tZnJhbWV3b3JrJztcbiAqIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAqIGF3YWl0IGRlbGV0ZUF0dGFjaG1lbnRQZXJtYW5lbnRseSgnYXR0YWNobWVudC11dWlkJywgYWJvcnRDb250cm9sbGVyKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBkZWxldGVBdHRhY2htZW50UGVybWFuZW50bHkoYXR0YWNobWVudFV1aWQsIGFib3J0Q29udHJvbGxlcikge1xuICAgIHJldHVybiBvcGVubXJzRmV0Y2goYCR7YXR0YWNobWVudFVybH0vJHthdHRhY2htZW50VXVpZH1gLCB7XG4gICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgIH0pO1xufVxuIl0sIm5hbWVzIjpbIm9wZW5tcnNGZXRjaCIsInJlc3RCYXNlVXJsIiwiYXR0YWNobWVudFVybCIsImdldEF0dGFjaG1lbnRCeVV1aWQiLCJhdHRhY2htZW50VXVpZCIsImFib3J0Q29udHJvbGxlciIsInNpZ25hbCIsImdldEF0dGFjaG1lbnRzIiwicGF0aWVudFV1aWQiLCJpbmNsdWRlRW5jb3VudGVybGVzcyIsImNyZWF0ZUF0dGFjaG1lbnQiLCJmaWxlVG9VcGxvYWQiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiZmlsZURlc2NyaXB0aW9uIiwiZmlsZSIsImZpbGVOYW1lIiwiRmlsZSIsImJhc2U2NENvbnRlbnQiLCJtZXRob2QiLCJib2R5IiwiZGVsZXRlQXR0YWNobWVudFBlcm1hbmVudGx5Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-emr-api/dist/attachments.js\n");
229
229
 
230
230
  /***/ }),
231
231
 
@@ -235,7 +235,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
235
235
  \***********************************************************/
236
236
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
237
237
 
238
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ fetchCurrentPatient: () => (/* binding */ fetchCurrentPatient)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_offline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-offline */ \"../../framework/esm-offline/dist/index.js\");\n/** @module @category API */ \n\nasync function fetchCurrentPatient(patientUuid, fetchInit, includeOfflinePatients = true) {\n if (patientUuid) {\n let err = null;\n const [onlinePatient, offlinePatient] = await Promise.all([\n (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.fhirBaseUrl}/Patient/${patientUuid}`, fetchInit).catch((e)=>err = e),\n includeOfflinePatients ? getOfflineRegisteredPatientAsFhirPatient(patientUuid) : Promise.resolve(null)\n ]);\n if (onlinePatient.ok) {\n return onlinePatient.data;\n }\n if (offlinePatient) {\n return offlinePatient;\n }\n if (err) {\n throw err;\n }\n }\n return null;\n}\nasync function getOfflineRegisteredPatientAsFhirPatient(patientUuid) {\n const patientRegistrationSyncItems = await (0,_openmrs_esm_offline__WEBPACK_IMPORTED_MODULE_1__.getSynchronizationItems)('patient-registration');\n const patientSyncItem = patientRegistrationSyncItems.find((item)=>item.fhirPatient.id === patientUuid);\n return patientSyncItem?.fhirPatient ?? null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvY3VycmVudC1wYXRpZW50LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBCQUEwQixHQUFnRTtBQUMzQjtBQUN4RCxlQUFlRyxvQkFBb0JDLFdBQVcsRUFBRUMsU0FBUyxFQUFFQyx5QkFBeUIsSUFBSTtJQUMzRixJQUFJRixhQUFhO1FBQ2IsSUFBSUcsTUFBTTtRQUNWLE1BQU0sQ0FBQ0MsZUFBZUMsZUFBZSxHQUFHLE1BQU1DLFFBQVFDLEdBQUcsQ0FBQztZQUN0RFYsOERBQVlBLENBQUMsR0FBR0QseURBQVdBLENBQUMsU0FBUyxFQUFFSSxhQUFhLEVBQUVDLFdBQVdPLEtBQUssQ0FBQyxDQUFDQyxJQUFJTixNQUFNTTtZQUNsRlAseUJBQXlCUSx5Q0FBeUNWLGVBQWVNLFFBQVFLLE9BQU8sQ0FBQztTQUNwRztRQUNELElBQUlQLGNBQWNRLEVBQUUsRUFBRTtZQUNsQixPQUFPUixjQUFjUyxJQUFJO1FBQzdCO1FBQ0EsSUFBSVIsZ0JBQWdCO1lBQ2hCLE9BQU9BO1FBQ1g7UUFDQSxJQUFJRixLQUFLO1lBQ0wsTUFBTUE7UUFDVjtJQUNKO0lBQ0EsT0FBTztBQUNYO0FBQ0EsZUFBZU8seUNBQXlDVixXQUFXO0lBQy9ELE1BQU1jLCtCQUErQixNQUFNaEIsNkVBQXVCQSxDQUFDO0lBQ25FLE1BQU1pQixrQkFBa0JELDZCQUE2QkUsSUFBSSxDQUFDLENBQUNDLE9BQU9BLEtBQUtDLFdBQVcsQ0FBQ0MsRUFBRSxLQUFLbkI7SUFDMUYsT0FBT2UsaUJBQWlCRyxlQUFlO0FBQzNDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWVtci1hcGkvZGlzdC9jdXJyZW50LXBhdGllbnQuanM/YzE1MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGltcG9ydCB7IGZoaXJCYXNlVXJsLCBvcGVubXJzRmV0Y2ggfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWFwaVwiO1xuaW1wb3J0IHsgZ2V0U3luY2hyb25pemF0aW9uSXRlbXMgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLW9mZmxpbmVcIjtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEN1cnJlbnRQYXRpZW50KHBhdGllbnRVdWlkLCBmZXRjaEluaXQsIGluY2x1ZGVPZmZsaW5lUGF0aWVudHMgPSB0cnVlKSB7XG4gICAgaWYgKHBhdGllbnRVdWlkKSB7XG4gICAgICAgIGxldCBlcnIgPSBudWxsO1xuICAgICAgICBjb25zdCBbb25saW5lUGF0aWVudCwgb2ZmbGluZVBhdGllbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgb3Blbm1yc0ZldGNoKGAke2ZoaXJCYXNlVXJsfS9QYXRpZW50LyR7cGF0aWVudFV1aWR9YCwgZmV0Y2hJbml0KS5jYXRjaCgoZSk9PmVyciA9IGUpLFxuICAgICAgICAgICAgaW5jbHVkZU9mZmxpbmVQYXRpZW50cyA/IGdldE9mZmxpbmVSZWdpc3RlcmVkUGF0aWVudEFzRmhpclBhdGllbnQocGF0aWVudFV1aWQpIDogUHJvbWlzZS5yZXNvbHZlKG51bGwpXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAob25saW5lUGF0aWVudC5vaykge1xuICAgICAgICAgICAgcmV0dXJuIG9ubGluZVBhdGllbnQuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2ZmbGluZVBhdGllbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZmZsaW5lUGF0aWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRPZmZsaW5lUmVnaXN0ZXJlZFBhdGllbnRBc0ZoaXJQYXRpZW50KHBhdGllbnRVdWlkKSB7XG4gICAgY29uc3QgcGF0aWVudFJlZ2lzdHJhdGlvblN5bmNJdGVtcyA9IGF3YWl0IGdldFN5bmNocm9uaXphdGlvbkl0ZW1zKCdwYXRpZW50LXJlZ2lzdHJhdGlvbicpO1xuICAgIGNvbnN0IHBhdGllbnRTeW5jSXRlbSA9IHBhdGllbnRSZWdpc3RyYXRpb25TeW5jSXRlbXMuZmluZCgoaXRlbSk9Pml0ZW0uZmhpclBhdGllbnQuaWQgPT09IHBhdGllbnRVdWlkKTtcbiAgICByZXR1cm4gcGF0aWVudFN5bmNJdGVtPy5maGlyUGF0aWVudCA/PyBudWxsO1xufVxuIl0sIm5hbWVzIjpbImZoaXJCYXNlVXJsIiwib3Blbm1yc0ZldGNoIiwiZ2V0U3luY2hyb25pemF0aW9uSXRlbXMiLCJmZXRjaEN1cnJlbnRQYXRpZW50IiwicGF0aWVudFV1aWQiLCJmZXRjaEluaXQiLCJpbmNsdWRlT2ZmbGluZVBhdGllbnRzIiwiZXJyIiwib25saW5lUGF0aWVudCIsIm9mZmxpbmVQYXRpZW50IiwiUHJvbWlzZSIsImFsbCIsImNhdGNoIiwiZSIsImdldE9mZmxpbmVSZWdpc3RlcmVkUGF0aWVudEFzRmhpclBhdGllbnQiLCJyZXNvbHZlIiwib2siLCJkYXRhIiwicGF0aWVudFJlZ2lzdHJhdGlvblN5bmNJdGVtcyIsInBhdGllbnRTeW5jSXRlbSIsImZpbmQiLCJpdGVtIiwiZmhpclBhdGllbnQiLCJpZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-emr-api/dist/current-patient.js\n");
238
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ fetchCurrentPatient: () => (/* binding */ fetchCurrentPatient)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_offline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-offline */ \"../../framework/esm-offline/dist/index.js\");\n/** @module @category API */ \n\n/**\n * Fetches a patient by their UUID from the FHIR API. This function first attempts\n * to fetch the patient from the server. If the server request fails and offline\n * patients are included, it will check for a matching patient in the offline\n * patient registration sync queue.\n *\n * @param patientUuid The UUID of the patient to fetch, or `null`.\n * @param fetchInit Optional fetch configuration options to pass to the request.\n * @param includeOfflinePatients Whether to include patients from the offline\n * registration queue if the server request fails. Defaults to `true`.\n * @returns A Promise that resolves with the FHIR Patient object, or `null` if\n * the patient UUID is null or the patient is not found.\n * @throws Rethrows any error from the server request if no offline patient is found.\n *\n * @example\n * ```ts\n * import { fetchCurrentPatient } from '@openmrs/esm-framework';\n * const patient = await fetchCurrentPatient('patient-uuid');\n * if (patient) {\n * console.log('Patient name:', patient.name?.[0]?.text);\n * }\n * ```\n */ async function fetchCurrentPatient(patientUuid, fetchInit, includeOfflinePatients = true) {\n if (patientUuid) {\n let err = null;\n const [onlinePatient, offlinePatient] = await Promise.all([\n (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.fhirBaseUrl}/Patient/${patientUuid}`, fetchInit).catch((e)=>err = e),\n includeOfflinePatients ? getOfflineRegisteredPatientAsFhirPatient(patientUuid) : Promise.resolve(null)\n ]);\n if (onlinePatient.ok) {\n return onlinePatient.data;\n }\n if (offlinePatient) {\n return offlinePatient;\n }\n if (err) {\n throw err;\n }\n }\n return null;\n}\nasync function getOfflineRegisteredPatientAsFhirPatient(patientUuid) {\n const patientRegistrationSyncItems = await (0,_openmrs_esm_offline__WEBPACK_IMPORTED_MODULE_1__.getSynchronizationItems)('patient-registration');\n const patientSyncItem = patientRegistrationSyncItems.find((item)=>item.fhirPatient.id === patientUuid);\n return patientSyncItem?.fhirPatient ?? null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvY3VycmVudC1wYXRpZW50LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBCQUEwQixHQUFnRTtBQUMzQjtBQUMvRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXNCQyxHQUFVLGVBQWVHLG9CQUFvQkMsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLHlCQUF5QixJQUFJO0lBQy9GLElBQUlGLGFBQWE7UUFDYixJQUFJRyxNQUFNO1FBQ1YsTUFBTSxDQUFDQyxlQUFlQyxlQUFlLEdBQUcsTUFBTUMsUUFBUUMsR0FBRyxDQUFDO1lBQ3REViw4REFBWUEsQ0FBQyxHQUFHRCx5REFBV0EsQ0FBQyxTQUFTLEVBQUVJLGFBQWEsRUFBRUMsV0FBV08sS0FBSyxDQUFDLENBQUNDLElBQUlOLE1BQU1NO1lBQ2xGUCx5QkFBeUJRLHlDQUF5Q1YsZUFBZU0sUUFBUUssT0FBTyxDQUFDO1NBQ3BHO1FBQ0QsSUFBSVAsY0FBY1EsRUFBRSxFQUFFO1lBQ2xCLE9BQU9SLGNBQWNTLElBQUk7UUFDN0I7UUFDQSxJQUFJUixnQkFBZ0I7WUFDaEIsT0FBT0E7UUFDWDtRQUNBLElBQUlGLEtBQUs7WUFDTCxNQUFNQTtRQUNWO0lBQ0o7SUFDQSxPQUFPO0FBQ1g7QUFDQSxlQUFlTyx5Q0FBeUNWLFdBQVc7SUFDL0QsTUFBTWMsK0JBQStCLE1BQU1oQiw2RUFBdUJBLENBQUM7SUFDbkUsTUFBTWlCLGtCQUFrQkQsNkJBQTZCRSxJQUFJLENBQUMsQ0FBQ0MsT0FBT0EsS0FBS0MsV0FBVyxDQUFDQyxFQUFFLEtBQUtuQjtJQUMxRixPQUFPZSxpQkFBaUJHLGVBQWU7QUFDM0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tZW1yLWFwaS9kaXN0L2N1cnJlbnQtcGF0aWVudC5qcz9jMTUzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBBUEkgKi8gaW1wb3J0IHsgZmhpckJhc2VVcmwsIG9wZW5tcnNGZXRjaCB9IGZyb20gXCJAb3Blbm1ycy9lc20tYXBpXCI7XG5pbXBvcnQgeyBnZXRTeW5jaHJvbml6YXRpb25JdGVtcyB9IGZyb20gXCJAb3Blbm1ycy9lc20tb2ZmbGluZVwiO1xuLyoqXG4gKiBGZXRjaGVzIGEgcGF0aWVudCBieSB0aGVpciBVVUlEIGZyb20gdGhlIEZISVIgQVBJLiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGF0dGVtcHRzXG4gKiB0byBmZXRjaCB0aGUgcGF0aWVudCBmcm9tIHRoZSBzZXJ2ZXIuIElmIHRoZSBzZXJ2ZXIgcmVxdWVzdCBmYWlscyBhbmQgb2ZmbGluZVxuICogcGF0aWVudHMgYXJlIGluY2x1ZGVkLCBpdCB3aWxsIGNoZWNrIGZvciBhIG1hdGNoaW5nIHBhdGllbnQgaW4gdGhlIG9mZmxpbmVcbiAqIHBhdGllbnQgcmVnaXN0cmF0aW9uIHN5bmMgcXVldWUuXG4gKlxuICogQHBhcmFtIHBhdGllbnRVdWlkIFRoZSBVVUlEIG9mIHRoZSBwYXRpZW50IHRvIGZldGNoLCBvciBgbnVsbGAuXG4gKiBAcGFyYW0gZmV0Y2hJbml0IE9wdGlvbmFsIGZldGNoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBwYXNzIHRvIHRoZSByZXF1ZXN0LlxuICogQHBhcmFtIGluY2x1ZGVPZmZsaW5lUGF0aWVudHMgV2hldGhlciB0byBpbmNsdWRlIHBhdGllbnRzIGZyb20gdGhlIG9mZmxpbmVcbiAqICAgcmVnaXN0cmF0aW9uIHF1ZXVlIGlmIHRoZSBzZXJ2ZXIgcmVxdWVzdCBmYWlscy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgRkhJUiBQYXRpZW50IG9iamVjdCwgb3IgYG51bGxgIGlmXG4gKiAgIHRoZSBwYXRpZW50IFVVSUQgaXMgbnVsbCBvciB0aGUgcGF0aWVudCBpcyBub3QgZm91bmQuXG4gKiBAdGhyb3dzIFJldGhyb3dzIGFueSBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIgcmVxdWVzdCBpZiBubyBvZmZsaW5lIHBhdGllbnQgaXMgZm91bmQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBmZXRjaEN1cnJlbnRQYXRpZW50IH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBjb25zdCBwYXRpZW50ID0gYXdhaXQgZmV0Y2hDdXJyZW50UGF0aWVudCgncGF0aWVudC11dWlkJyk7XG4gKiBpZiAocGF0aWVudCkge1xuICogICBjb25zb2xlLmxvZygnUGF0aWVudCBuYW1lOicsIHBhdGllbnQubmFtZT8uWzBdPy50ZXh0KTtcbiAqIH1cbiAqIGBgYFxuICovIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEN1cnJlbnRQYXRpZW50KHBhdGllbnRVdWlkLCBmZXRjaEluaXQsIGluY2x1ZGVPZmZsaW5lUGF0aWVudHMgPSB0cnVlKSB7XG4gICAgaWYgKHBhdGllbnRVdWlkKSB7XG4gICAgICAgIGxldCBlcnIgPSBudWxsO1xuICAgICAgICBjb25zdCBbb25saW5lUGF0aWVudCwgb2ZmbGluZVBhdGllbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgb3Blbm1yc0ZldGNoKGAke2ZoaXJCYXNlVXJsfS9QYXRpZW50LyR7cGF0aWVudFV1aWR9YCwgZmV0Y2hJbml0KS5jYXRjaCgoZSk9PmVyciA9IGUpLFxuICAgICAgICAgICAgaW5jbHVkZU9mZmxpbmVQYXRpZW50cyA/IGdldE9mZmxpbmVSZWdpc3RlcmVkUGF0aWVudEFzRmhpclBhdGllbnQocGF0aWVudFV1aWQpIDogUHJvbWlzZS5yZXNvbHZlKG51bGwpXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAob25saW5lUGF0aWVudC5vaykge1xuICAgICAgICAgICAgcmV0dXJuIG9ubGluZVBhdGllbnQuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2ZmbGluZVBhdGllbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZmZsaW5lUGF0aWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRPZmZsaW5lUmVnaXN0ZXJlZFBhdGllbnRBc0ZoaXJQYXRpZW50KHBhdGllbnRVdWlkKSB7XG4gICAgY29uc3QgcGF0aWVudFJlZ2lzdHJhdGlvblN5bmNJdGVtcyA9IGF3YWl0IGdldFN5bmNocm9uaXphdGlvbkl0ZW1zKCdwYXRpZW50LXJlZ2lzdHJhdGlvbicpO1xuICAgIGNvbnN0IHBhdGllbnRTeW5jSXRlbSA9IHBhdGllbnRSZWdpc3RyYXRpb25TeW5jSXRlbXMuZmluZCgoaXRlbSk9Pml0ZW0uZmhpclBhdGllbnQuaWQgPT09IHBhdGllbnRVdWlkKTtcbiAgICByZXR1cm4gcGF0aWVudFN5bmNJdGVtPy5maGlyUGF0aWVudCA/PyBudWxsO1xufVxuIl0sIm5hbWVzIjpbImZoaXJCYXNlVXJsIiwib3Blbm1yc0ZldGNoIiwiZ2V0U3luY2hyb25pemF0aW9uSXRlbXMiLCJmZXRjaEN1cnJlbnRQYXRpZW50IiwicGF0aWVudFV1aWQiLCJmZXRjaEluaXQiLCJpbmNsdWRlT2ZmbGluZVBhdGllbnRzIiwiZXJyIiwib25saW5lUGF0aWVudCIsIm9mZmxpbmVQYXRpZW50IiwiUHJvbWlzZSIsImFsbCIsImNhdGNoIiwiZSIsImdldE9mZmxpbmVSZWdpc3RlcmVkUGF0aWVudEFzRmhpclBhdGllbnQiLCJyZXNvbHZlIiwib2siLCJkYXRhIiwicGF0aWVudFJlZ2lzdHJhdGlvblN5bmNJdGVtcyIsInBhdGllbnRTeW5jSXRlbSIsImZpbmQiLCJpdGVtIiwiZmhpclBhdGllbnQiLCJpZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-emr-api/dist/current-patient.js\n");
239
239
 
240
240
  /***/ }),
241
241
 
@@ -395,7 +395,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//#
395
395
  \******************************************************/
396
396
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
397
397
 
398
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getVisitTypes: () => (/* binding */ getVisitTypes),\n/* harmony export */ toVisitTypeObject: () => (/* binding */ toVisitTypeObject)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var rxjs_operators_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! rxjs/operators/index.js */ \"../../../node_modules/rxjs/operators/index.js\");\n/** @module @category API */ \n\nfunction toVisitTypeObject(openmrsRestForm) {\n return {\n uuid: openmrsRestForm.uuid,\n display: openmrsRestForm.display,\n name: openmrsRestForm.name\n };\n}\nfunction getVisitTypes() {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsObservableFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/visittype`).pipe((0,rxjs_operators_index_js__WEBPACK_IMPORTED_MODULE_1__.map)((results)=>{\n const visitTypes = results.data.results.map(toVisitTypeObject);\n return visitTypes;\n })).pipe((0,rxjs_operators_index_js__WEBPACK_IMPORTED_MODULE_1__.take)(1));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvdmlzaXQtdHlwZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsMEJBQTBCLEdBQTBFO0FBQ2hEO0FBQzdDLFNBQVNJLGtCQUFrQkMsZUFBZTtJQUM3QyxPQUFPO1FBQ0hDLE1BQU1ELGdCQUFnQkMsSUFBSTtRQUMxQkMsU0FBU0YsZ0JBQWdCRSxPQUFPO1FBQ2hDQyxNQUFNSCxnQkFBZ0JHLElBQUk7SUFDOUI7QUFDSjtBQUNPLFNBQVNDO0lBQ1osT0FBT1Qsd0VBQXNCQSxDQUFDLEdBQUdDLHlEQUFXQSxDQUFDLFVBQVUsQ0FBQyxFQUFFUyxJQUFJLENBQUNSLDREQUFHQSxDQUFDLENBQUNTO1FBQ2hFLE1BQU1DLGFBQWFELFFBQVFFLElBQUksQ0FBQ0YsT0FBTyxDQUFDVCxHQUFHLENBQUNFO1FBQzVDLE9BQU9RO0lBQ1gsSUFBSUYsSUFBSSxDQUFDUCw2REFBSUEsQ0FBQztBQUNsQiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvdmlzaXQtdHlwZS5qcz9lMjU1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBBUEkgKi8gaW1wb3J0IHsgb3Blbm1yc09ic2VydmFibGVGZXRjaCwgcmVzdEJhc2VVcmwgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWFwaVwiO1xuaW1wb3J0IHsgbWFwLCB0YWtlIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzL2luZGV4LmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gdG9WaXNpdFR5cGVPYmplY3Qob3Blbm1yc1Jlc3RGb3JtKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXVpZDogb3Blbm1yc1Jlc3RGb3JtLnV1aWQsXG4gICAgICAgIGRpc3BsYXk6IG9wZW5tcnNSZXN0Rm9ybS5kaXNwbGF5LFxuICAgICAgICBuYW1lOiBvcGVubXJzUmVzdEZvcm0ubmFtZVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmlzaXRUeXBlcygpIHtcbiAgICByZXR1cm4gb3Blbm1yc09ic2VydmFibGVGZXRjaChgJHtyZXN0QmFzZVVybH0vdmlzaXR0eXBlYCkucGlwZShtYXAoKHJlc3VsdHMpPT57XG4gICAgICAgIGNvbnN0IHZpc2l0VHlwZXMgPSByZXN1bHRzLmRhdGEucmVzdWx0cy5tYXAodG9WaXNpdFR5cGVPYmplY3QpO1xuICAgICAgICByZXR1cm4gdmlzaXRUeXBlcztcbiAgICB9KSkucGlwZSh0YWtlKDEpKTtcbn1cbiJdLCJuYW1lcyI6WyJvcGVubXJzT2JzZXJ2YWJsZUZldGNoIiwicmVzdEJhc2VVcmwiLCJtYXAiLCJ0YWtlIiwidG9WaXNpdFR5cGVPYmplY3QiLCJvcGVubXJzUmVzdEZvcm0iLCJ1dWlkIiwiZGlzcGxheSIsIm5hbWUiLCJnZXRWaXNpdFR5cGVzIiwicGlwZSIsInJlc3VsdHMiLCJ2aXNpdFR5cGVzIiwiZGF0YSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-emr-api/dist/visit-type.js\n");
398
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getVisitTypes: () => (/* binding */ getVisitTypes),\n/* harmony export */ toVisitTypeObject: () => (/* binding */ toVisitTypeObject)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var rxjs_operators_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! rxjs/operators/index.js */ \"../../../node_modules/rxjs/operators/index.js\");\n/** @module @category API */ \n\nfunction toVisitTypeObject(openmrsRestForm) {\n return {\n uuid: openmrsRestForm.uuid,\n display: openmrsRestForm.display,\n name: openmrsRestForm.name\n };\n}\n/**\n * Fetches all available visit types from the OpenMRS REST API.\n *\n * @returns An Observable that emits an array of VisitType objects and then completes.\n * The Observable will emit exactly one value containing all visit types.\n *\n * @example\n * ```ts\n * import { getVisitTypes } from '@openmrs/esm-framework';\n * getVisitTypes().subscribe((visitTypes) => {\n * console.log('Available visit types:', visitTypes);\n * });\n * ```\n */ function getVisitTypes() {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsObservableFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/visittype`).pipe((0,rxjs_operators_index_js__WEBPACK_IMPORTED_MODULE_1__.map)((results)=>{\n const visitTypes = results.data.results.map(toVisitTypeObject);\n return visitTypes;\n })).pipe((0,rxjs_operators_index_js__WEBPACK_IMPORTED_MODULE_1__.take)(1));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvdmlzaXQtdHlwZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsMEJBQTBCLEdBQTBFO0FBQ2hEO0FBQzdDLFNBQVNJLGtCQUFrQkMsZUFBZTtJQUM3QyxPQUFPO1FBQ0hDLE1BQU1ELGdCQUFnQkMsSUFBSTtRQUMxQkMsU0FBU0YsZ0JBQWdCRSxPQUFPO1FBQ2hDQyxNQUFNSCxnQkFBZ0JHLElBQUk7SUFDOUI7QUFDSjtBQUNBOzs7Ozs7Ozs7Ozs7O0NBYUMsR0FBVSxTQUFTQztJQUNoQixPQUFPVCx3RUFBc0JBLENBQUMsR0FBR0MseURBQVdBLENBQUMsVUFBVSxDQUFDLEVBQUVTLElBQUksQ0FBQ1IsNERBQUdBLENBQUMsQ0FBQ1M7UUFDaEUsTUFBTUMsYUFBYUQsUUFBUUUsSUFBSSxDQUFDRixPQUFPLENBQUNULEdBQUcsQ0FBQ0U7UUFDNUMsT0FBT1E7SUFDWCxJQUFJRixJQUFJLENBQUNQLDZEQUFJQSxDQUFDO0FBQ2xCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWVtci1hcGkvZGlzdC92aXNpdC10eXBlLmpzP2UyNTUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyBvcGVubXJzT2JzZXJ2YWJsZUZldGNoLCByZXN0QmFzZVVybCB9IGZyb20gXCJAb3Blbm1ycy9lc20tYXBpXCI7XG5pbXBvcnQgeyBtYXAsIHRha2UgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnMvaW5kZXguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB0b1Zpc2l0VHlwZU9iamVjdChvcGVubXJzUmVzdEZvcm0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB1dWlkOiBvcGVubXJzUmVzdEZvcm0udXVpZCxcbiAgICAgICAgZGlzcGxheTogb3Blbm1yc1Jlc3RGb3JtLmRpc3BsYXksXG4gICAgICAgIG5hbWU6IG9wZW5tcnNSZXN0Rm9ybS5uYW1lXG4gICAgfTtcbn1cbi8qKlxuICogRmV0Y2hlcyBhbGwgYXZhaWxhYmxlIHZpc2l0IHR5cGVzIGZyb20gdGhlIE9wZW5NUlMgUkVTVCBBUEkuXG4gKlxuICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGFycmF5IG9mIFZpc2l0VHlwZSBvYmplY3RzIGFuZCB0aGVuIGNvbXBsZXRlcy5cbiAqICAgVGhlIE9ic2VydmFibGUgd2lsbCBlbWl0IGV4YWN0bHkgb25lIHZhbHVlIGNvbnRhaW5pbmcgYWxsIHZpc2l0IHR5cGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZ2V0VmlzaXRUeXBlcyB9IGZyb20gJ0BvcGVubXJzL2VzbS1mcmFtZXdvcmsnO1xuICogZ2V0VmlzaXRUeXBlcygpLnN1YnNjcmliZSgodmlzaXRUeXBlcykgPT4ge1xuICogICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIHZpc2l0IHR5cGVzOicsIHZpc2l0VHlwZXMpO1xuICogfSk7XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0VmlzaXRUeXBlcygpIHtcbiAgICByZXR1cm4gb3Blbm1yc09ic2VydmFibGVGZXRjaChgJHtyZXN0QmFzZVVybH0vdmlzaXR0eXBlYCkucGlwZShtYXAoKHJlc3VsdHMpPT57XG4gICAgICAgIGNvbnN0IHZpc2l0VHlwZXMgPSByZXN1bHRzLmRhdGEucmVzdWx0cy5tYXAodG9WaXNpdFR5cGVPYmplY3QpO1xuICAgICAgICByZXR1cm4gdmlzaXRUeXBlcztcbiAgICB9KSkucGlwZSh0YWtlKDEpKTtcbn1cbiJdLCJuYW1lcyI6WyJvcGVubXJzT2JzZXJ2YWJsZUZldGNoIiwicmVzdEJhc2VVcmwiLCJtYXAiLCJ0YWtlIiwidG9WaXNpdFR5cGVPYmplY3QiLCJvcGVubXJzUmVzdEZvcm0iLCJ1dWlkIiwiZGlzcGxheSIsIm5hbWUiLCJnZXRWaXNpdFR5cGVzIiwicGlwZSIsInJlc3VsdHMiLCJ2aXNpdFR5cGVzIiwiZGF0YSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-emr-api/dist/visit-type.js\n");
399
399
 
400
400
  /***/ }),
401
401
 
@@ -405,7 +405,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
405
405
  \*******************************************************/
406
406
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
407
407
 
408
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VisitMode: () => (/* binding */ VisitMode),\n/* harmony export */ VisitStatus: () => (/* binding */ VisitStatus),\n/* harmony export */ defaultVisitCustomRepresentation: () => (/* binding */ defaultVisitCustomRepresentation),\n/* harmony export */ getStartedVisit: () => (/* binding */ getStartedVisit),\n/* harmony export */ getVisitStore: () => (/* binding */ getVisitStore),\n/* harmony export */ getVisitsForPatient: () => (/* binding */ getVisitsForPatient),\n/* harmony export */ saveVisit: () => (/* binding */ saveVisit),\n/* harmony export */ setCurrentVisit: () => (/* binding */ setCurrentVisit),\n/* harmony export */ updateVisit: () => (/* binding */ updateVisit)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs */ \"webpack/sharing/consume/default/rxjs/rxjs\");\n/** @module @category API */ \n\n\nvar VisitMode = /*#__PURE__*/ function(VisitMode) {\n VisitMode[\"NEWVISIT\"] = \"startVisit\";\n VisitMode[\"EDITVISIT\"] = \"editVisit\";\n VisitMode[\"LOADING\"] = \"loadingVisit\";\n return VisitMode;\n}({});\nvar VisitStatus = /*#__PURE__*/ function(VisitStatus) {\n VisitStatus[\"NOTSTARTED\"] = \"notStarted\";\n VisitStatus[\"ONGOING\"] = \"ongoing\";\n return VisitStatus;\n}({});\nconst defaultVisitCustomRepresentation = 'custom:(uuid,display,voided,indication,startDatetime,stopDatetime,' + 'encounters:(uuid,display,encounterDatetime,' + 'form:(uuid,name),location:ref,' + 'encounterType:ref,' + 'encounterProviders:(uuid,display,' + 'provider:(uuid,display))),' + 'patient:(uuid,display),' + 'visitType:(uuid,name,display),' + 'attributes:(uuid,display,attributeType:(name,datatypeClassname,uuid),value),' + 'location:(uuid,name,display))';\nconst initialState = getVisitSessionStorage() || {\n patientUuid: null,\n manuallySetVisitUuid: null,\n mutateVisitCallbacks: {}\n};\nfunction getVisitStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.getGlobalStore)('visit', initialState);\n}\nfunction setCurrentVisit(patientUuid, visitUuid) {\n getVisitStore().setState({\n patientUuid,\n manuallySetVisitUuid: visitUuid\n });\n}\ngetVisitStore().subscribe((state)=>{\n setVisitSessionStorage(state);\n});\nfunction setVisitSessionStorage(value) {\n sessionStorage.setItem('openmrs:visitStoreState', JSON.stringify(value));\n}\nfunction getVisitSessionStorage() {\n try {\n return JSON.parse(sessionStorage.getItem('openmrs:visitStoreState') || 'null');\n } catch (e) {\n return null;\n }\n}\nfunction saveVisit(payload, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/visit`, {\n signal: abortController.signal,\n method: 'POST',\n headers: {\n 'Content-type': 'application/json'\n },\n body: payload\n });\n}\nfunction updateVisit(uuid, payload, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/visit/${uuid}`, {\n signal: abortController.signal,\n method: 'POST',\n headers: {\n 'Content-type': 'application/json'\n },\n body: payload\n });\n}\n/**\n * @deprecated Use the `useVisit` hook instead.\n */ function getVisitsForPatient(patientUuid, abortController, v) {\n const custom = v ?? defaultVisitCustomRepresentation;\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/visit?patient=${patientUuid}&v=${custom}`, {\n signal: abortController.signal,\n method: 'GET',\n headers: {\n 'Content-type': 'application/json'\n }\n });\n}\n/** @deprecated */ const getStartedVisit = new rxjs__WEBPACK_IMPORTED_MODULE_2__.BehaviorSubject(null);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvdmlzaXQtdXRpbHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMEJBQTBCLEdBQWdFO0FBQ3RDO0FBQ2I7QUFDaEMsSUFBSUksWUFBWSxXQUFXLEdBQUcsU0FBU0EsU0FBUztJQUNuREEsU0FBUyxDQUFDLFdBQVcsR0FBRztJQUN4QkEsU0FBUyxDQUFDLFlBQVksR0FBRztJQUN6QkEsU0FBUyxDQUFDLFVBQVUsR0FBRztJQUN2QixPQUFPQTtBQUNYLEVBQUUsQ0FBQyxHQUFHO0FBQ0MsSUFBSUMsY0FBYyxXQUFXLEdBQUcsU0FBU0EsV0FBVztJQUN2REEsV0FBVyxDQUFDLGFBQWEsR0FBRztJQUM1QkEsV0FBVyxDQUFDLFVBQVUsR0FBRztJQUN6QixPQUFPQTtBQUNYLEVBQUUsQ0FBQyxHQUFHO0FBQ0MsTUFBTUMsbUNBQW1DLHVFQUF1RSxnREFBZ0QsbUNBQW1DLHVCQUF1QixzQ0FBc0MsK0JBQStCLDRCQUE0QixtQ0FBbUMsaUZBQWlGLGdDQUFnQztBQUN0ZCxNQUFNQyxlQUFlQyw0QkFBNEI7SUFDN0NDLGFBQWE7SUFDYkMsc0JBQXNCO0lBQ3RCQyxzQkFBc0IsQ0FBQztBQUMzQjtBQUNPLFNBQVNDO0lBQ1osT0FBT1Ysa0VBQWNBLENBQUMsU0FBU0s7QUFDbkM7QUFDTyxTQUFTTSxnQkFBZ0JKLFdBQVcsRUFBRUssU0FBUztJQUNsREYsZ0JBQWdCRyxRQUFRLENBQUM7UUFDckJOO1FBQ0FDLHNCQUFzQkk7SUFDMUI7QUFDSjtBQUNBRixnQkFBZ0JJLFNBQVMsQ0FBQyxDQUFDQztJQUN2QkMsdUJBQXVCRDtBQUMzQjtBQUNBLFNBQVNDLHVCQUF1QkMsS0FBSztJQUNqQ0MsZUFBZUMsT0FBTyxDQUFDLDJCQUEyQkMsS0FBS0MsU0FBUyxDQUFDSjtBQUNyRTtBQUNBLFNBQVNYO0lBQ0wsSUFBSTtRQUNBLE9BQU9jLEtBQUtFLEtBQUssQ0FBQ0osZUFBZUssT0FBTyxDQUFDLDhCQUE4QjtJQUMzRSxFQUFFLE9BQU9DLEdBQUc7UUFDUixPQUFPO0lBQ1g7QUFDSjtBQUNPLFNBQVNDLFVBQVVDLE9BQU8sRUFBRUMsZUFBZTtJQUM5QyxPQUFPN0IsOERBQVlBLENBQUMsR0FBR0MseURBQVdBLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDeEM2QixRQUFRRCxnQkFBZ0JDLE1BQU07UUFDOUJDLFFBQVE7UUFDUkMsU0FBUztZQUNMLGdCQUFnQjtRQUNwQjtRQUNBQyxNQUFNTDtJQUNWO0FBQ0o7QUFDTyxTQUFTTSxZQUFZQyxJQUFJLEVBQUVQLE9BQU8sRUFBRUMsZUFBZTtJQUN0RCxPQUFPN0IsOERBQVlBLENBQUMsR0FBR0MseURBQVdBLENBQUMsT0FBTyxFQUFFa0MsTUFBTSxFQUFFO1FBQ2hETCxRQUFRRCxnQkFBZ0JDLE1BQU07UUFDOUJDLFFBQVE7UUFDUkMsU0FBUztZQUNMLGdCQUFnQjtRQUNwQjtRQUNBQyxNQUFNTDtJQUNWO0FBQ0o7QUFDQTs7Q0FFQyxHQUFVLFNBQVNRLG9CQUFvQjNCLFdBQVcsRUFBRW9CLGVBQWUsRUFBRVEsQ0FBQztJQUNuRSxNQUFNQyxTQUFTRCxLQUFLL0I7SUFDcEIsT0FBT04sOERBQVlBLENBQUMsR0FBR0MseURBQVdBLENBQUMsZUFBZSxFQUFFUSxZQUFZLEdBQUcsRUFBRTZCLFFBQVEsRUFBRTtRQUMzRVIsUUFBUUQsZ0JBQWdCQyxNQUFNO1FBQzlCQyxRQUFRO1FBQ1JDLFNBQVM7WUFDTCxnQkFBZ0I7UUFDcEI7SUFDSjtBQUNKO0FBQ0EsZ0JBQWdCLEdBQVUsTUFBTU8sa0JBQWtCLElBQUlwQyxpREFBZUEsQ0FBQyxNQUFNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWVtci1hcGkvZGlzdC92aXNpdC11dGlscy5qcz82ZGU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBBUEkgKi8gaW1wb3J0IHsgb3Blbm1yc0ZldGNoLCByZXN0QmFzZVVybCB9IGZyb20gXCJAb3Blbm1ycy9lc20tYXBpXCI7XG5pbXBvcnQgeyBnZXRHbG9iYWxTdG9yZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tc3RhdGVcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5leHBvcnQgdmFyIFZpc2l0TW9kZSA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24oVmlzaXRNb2RlKSB7XG4gICAgVmlzaXRNb2RlW1wiTkVXVklTSVRcIl0gPSBcInN0YXJ0VmlzaXRcIjtcbiAgICBWaXNpdE1vZGVbXCJFRElUVklTSVRcIl0gPSBcImVkaXRWaXNpdFwiO1xuICAgIFZpc2l0TW9kZVtcIkxPQURJTkdcIl0gPSBcImxvYWRpbmdWaXNpdFwiO1xuICAgIHJldHVybiBWaXNpdE1vZGU7XG59KHt9KTtcbmV4cG9ydCB2YXIgVmlzaXRTdGF0dXMgPSAvKiNfX1BVUkVfXyovIGZ1bmN0aW9uKFZpc2l0U3RhdHVzKSB7XG4gICAgVmlzaXRTdGF0dXNbXCJOT1RTVEFSVEVEXCJdID0gXCJub3RTdGFydGVkXCI7XG4gICAgVmlzaXRTdGF0dXNbXCJPTkdPSU5HXCJdID0gXCJvbmdvaW5nXCI7XG4gICAgcmV0dXJuIFZpc2l0U3RhdHVzO1xufSh7fSk7XG5leHBvcnQgY29uc3QgZGVmYXVsdFZpc2l0Q3VzdG9tUmVwcmVzZW50YXRpb24gPSAnY3VzdG9tOih1dWlkLGRpc3BsYXksdm9pZGVkLGluZGljYXRpb24sc3RhcnREYXRldGltZSxzdG9wRGF0ZXRpbWUsJyArICdlbmNvdW50ZXJzOih1dWlkLGRpc3BsYXksZW5jb3VudGVyRGF0ZXRpbWUsJyArICdmb3JtOih1dWlkLG5hbWUpLGxvY2F0aW9uOnJlZiwnICsgJ2VuY291bnRlclR5cGU6cmVmLCcgKyAnZW5jb3VudGVyUHJvdmlkZXJzOih1dWlkLGRpc3BsYXksJyArICdwcm92aWRlcjoodXVpZCxkaXNwbGF5KSkpLCcgKyAncGF0aWVudDoodXVpZCxkaXNwbGF5KSwnICsgJ3Zpc2l0VHlwZToodXVpZCxuYW1lLGRpc3BsYXkpLCcgKyAnYXR0cmlidXRlczoodXVpZCxkaXNwbGF5LGF0dHJpYnV0ZVR5cGU6KG5hbWUsZGF0YXR5cGVDbGFzc25hbWUsdXVpZCksdmFsdWUpLCcgKyAnbG9jYXRpb246KHV1aWQsbmFtZSxkaXNwbGF5KSknO1xuY29uc3QgaW5pdGlhbFN0YXRlID0gZ2V0VmlzaXRTZXNzaW9uU3RvcmFnZSgpIHx8IHtcbiAgICBwYXRpZW50VXVpZDogbnVsbCxcbiAgICBtYW51YWxseVNldFZpc2l0VXVpZDogbnVsbCxcbiAgICBtdXRhdGVWaXNpdENhbGxiYWNrczoge31cbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmlzaXRTdG9yZSgpIHtcbiAgICByZXR1cm4gZ2V0R2xvYmFsU3RvcmUoJ3Zpc2l0JywgaW5pdGlhbFN0YXRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRDdXJyZW50VmlzaXQocGF0aWVudFV1aWQsIHZpc2l0VXVpZCkge1xuICAgIGdldFZpc2l0U3RvcmUoKS5zZXRTdGF0ZSh7XG4gICAgICAgIHBhdGllbnRVdWlkLFxuICAgICAgICBtYW51YWxseVNldFZpc2l0VXVpZDogdmlzaXRVdWlkXG4gICAgfSk7XG59XG5nZXRWaXNpdFN0b3JlKCkuc3Vic2NyaWJlKChzdGF0ZSk9PntcbiAgICBzZXRWaXNpdFNlc3Npb25TdG9yYWdlKHN0YXRlKTtcbn0pO1xuZnVuY3Rpb24gc2V0VmlzaXRTZXNzaW9uU3RvcmFnZSh2YWx1ZSkge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ29wZW5tcnM6dmlzaXRTdG9yZVN0YXRlJywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGdldFZpc2l0U2Vzc2lvblN0b3JhZ2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnb3Blbm1yczp2aXNpdFN0b3JlU3RhdGUnKSB8fCAnbnVsbCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVWaXNpdChwYXlsb2FkLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gb3Blbm1yc0ZldGNoKGAke3Jlc3RCYXNlVXJsfS92aXNpdGAsIHtcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBwYXlsb2FkXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmlzaXQodXVpZCwgcGF5bG9hZCwgYWJvcnRDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIG9wZW5tcnNGZXRjaChgJHtyZXN0QmFzZVVybH0vdmlzaXQvJHt1dWlkfWAsIHtcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBwYXlsb2FkXG4gICAgfSk7XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgYHVzZVZpc2l0YCBob29rIGluc3RlYWQuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldFZpc2l0c0ZvclBhdGllbnQocGF0aWVudFV1aWQsIGFib3J0Q29udHJvbGxlciwgdikge1xuICAgIGNvbnN0IGN1c3RvbSA9IHYgPz8gZGVmYXVsdFZpc2l0Q3VzdG9tUmVwcmVzZW50YXRpb247XG4gICAgcmV0dXJuIG9wZW5tcnNGZXRjaChgJHtyZXN0QmFzZVVybH0vdmlzaXQ/cGF0aWVudD0ke3BhdGllbnRVdWlkfSZ2PSR7Y3VzdG9tfWAsIHtcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCAqLyBleHBvcnQgY29uc3QgZ2V0U3RhcnRlZFZpc2l0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiJdLCJuYW1lcyI6WyJvcGVubXJzRmV0Y2giLCJyZXN0QmFzZVVybCIsImdldEdsb2JhbFN0b3JlIiwiQmVoYXZpb3JTdWJqZWN0IiwiVmlzaXRNb2RlIiwiVmlzaXRTdGF0dXMiLCJkZWZhdWx0VmlzaXRDdXN0b21SZXByZXNlbnRhdGlvbiIsImluaXRpYWxTdGF0ZSIsImdldFZpc2l0U2Vzc2lvblN0b3JhZ2UiLCJwYXRpZW50VXVpZCIsIm1hbnVhbGx5U2V0VmlzaXRVdWlkIiwibXV0YXRlVmlzaXRDYWxsYmFja3MiLCJnZXRWaXNpdFN0b3JlIiwic2V0Q3VycmVudFZpc2l0IiwidmlzaXRVdWlkIiwic2V0U3RhdGUiLCJzdWJzY3JpYmUiLCJzdGF0ZSIsInNldFZpc2l0U2Vzc2lvblN0b3JhZ2UiLCJ2YWx1ZSIsInNlc3Npb25TdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZSIsImdldEl0ZW0iLCJlIiwic2F2ZVZpc2l0IiwicGF5bG9hZCIsImFib3J0Q29udHJvbGxlciIsInNpZ25hbCIsIm1ldGhvZCIsImhlYWRlcnMiLCJib2R5IiwidXBkYXRlVmlzaXQiLCJ1dWlkIiwiZ2V0VmlzaXRzRm9yUGF0aWVudCIsInYiLCJjdXN0b20iLCJnZXRTdGFydGVkVmlzaXQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-emr-api/dist/visit-utils.js\n");
408
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VisitMode: () => (/* binding */ VisitMode),\n/* harmony export */ VisitStatus: () => (/* binding */ VisitStatus),\n/* harmony export */ defaultVisitCustomRepresentation: () => (/* binding */ defaultVisitCustomRepresentation),\n/* harmony export */ getStartedVisit: () => (/* binding */ getStartedVisit),\n/* harmony export */ getVisitStore: () => (/* binding */ getVisitStore),\n/* harmony export */ getVisitsForPatient: () => (/* binding */ getVisitsForPatient),\n/* harmony export */ saveVisit: () => (/* binding */ saveVisit),\n/* harmony export */ setCurrentVisit: () => (/* binding */ setCurrentVisit),\n/* harmony export */ updateVisit: () => (/* binding */ updateVisit)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs */ \"webpack/sharing/consume/default/rxjs/rxjs\");\n/** @module @category API */ \n\n\nvar VisitMode = /*#__PURE__*/ function(VisitMode) {\n VisitMode[\"NEWVISIT\"] = \"startVisit\";\n VisitMode[\"EDITVISIT\"] = \"editVisit\";\n VisitMode[\"LOADING\"] = \"loadingVisit\";\n return VisitMode;\n}({});\nvar VisitStatus = /*#__PURE__*/ function(VisitStatus) {\n VisitStatus[\"NOTSTARTED\"] = \"notStarted\";\n VisitStatus[\"ONGOING\"] = \"ongoing\";\n return VisitStatus;\n}({});\n/**\n * The default custom representation string for fetching visit data from the REST API.\n * This representation includes comprehensive visit details such as encounters, patient,\n * visit type, attributes, and location information.\n */ const defaultVisitCustomRepresentation = 'custom:(uuid,display,voided,indication,startDatetime,stopDatetime,' + 'encounters:(uuid,display,encounterDatetime,' + 'form:(uuid,name),location:ref,' + 'encounterType:ref,' + 'encounterProviders:(uuid,display,' + 'provider:(uuid,display))),' + 'patient:(uuid,display),' + 'visitType:(uuid,name,display),' + 'attributes:(uuid,display,attributeType:(name,datatypeClassname,uuid),value),' + 'location:(uuid,name,display))';\nconst initialState = getVisitSessionStorage() || {\n patientUuid: null,\n manuallySetVisitUuid: null,\n mutateVisitCallbacks: {}\n};\n/**\n * Returns the global visit store that manages the current visit state. The store\n * contains information about the current patient's visit and provides methods\n * for subscribing to visit state changes.\n *\n * @returns The global visit store instance.\n *\n * @example\n * ```ts\n * import { getVisitStore } from '@openmrs/esm-framework';\n * const store = getVisitStore();\n * const unsubscribe = store.subscribe((state) => {\n * console.log('Current patient:', state.patientUuid);\n * });\n * ```\n */ function getVisitStore() {\n return (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_1__.getGlobalStore)('visit', initialState);\n}\n/**\n * Sets the current visit for a patient in the global visit store. This is used\n * to manually specify which visit should be considered \"active\" for the given patient.\n *\n * @param patientUuid The UUID of the patient.\n * @param visitUuid The UUID of the visit to set as the current visit.\n *\n * @example\n * ```ts\n * import { setCurrentVisit } from '@openmrs/esm-framework';\n * setCurrentVisit('patient-uuid', 'visit-uuid');\n * ```\n */ function setCurrentVisit(patientUuid, visitUuid) {\n getVisitStore().setState({\n patientUuid,\n manuallySetVisitUuid: visitUuid\n });\n}\ngetVisitStore().subscribe((state)=>{\n setVisitSessionStorage(state);\n});\nfunction setVisitSessionStorage(value) {\n sessionStorage.setItem('openmrs:visitStoreState', JSON.stringify(value));\n}\nfunction getVisitSessionStorage() {\n try {\n return JSON.parse(sessionStorage.getItem('openmrs:visitStoreState') || 'null');\n } catch (e) {\n return null;\n }\n}\n/**\n * Creates a new visit by sending a POST request to the OpenMRS REST API.\n *\n * @param payload The visit data to create, including patient UUID, visit type,\n * start datetime, and other visit attributes.\n * @param abortController An AbortController to allow cancellation of the request.\n * @returns A Promise that resolves with the FetchResponse containing the created Visit.\n *\n * @example\n * ```ts\n * import { saveVisit } from '@openmrs/esm-framework';\n * const abortController = new AbortController();\n * const response = await saveVisit({\n * patient: 'patient-uuid',\n * visitType: 'visit-type-uuid',\n * startDatetime: new Date().toISOString()\n * }, abortController);\n * ```\n */ function saveVisit(payload, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/visit`, {\n signal: abortController.signal,\n method: 'POST',\n headers: {\n 'Content-type': 'application/json'\n },\n body: payload\n });\n}\n/**\n * Updates an existing visit by sending a POST request to the OpenMRS REST API.\n *\n * @param uuid The UUID of the visit to update.\n * @param payload The visit data to update, such as stop datetime or attributes.\n * @param abortController An AbortController to allow cancellation of the request.\n * @returns A Promise that resolves with the FetchResponse containing the updated Visit.\n *\n * @example\n * ```ts\n * import { updateVisit } from '@openmrs/esm-framework';\n * const abortController = new AbortController();\n * const response = await updateVisit('visit-uuid', {\n * stopDatetime: new Date().toISOString()\n * }, abortController);\n * ```\n */ function updateVisit(uuid, payload, abortController) {\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/visit/${uuid}`, {\n signal: abortController.signal,\n method: 'POST',\n headers: {\n 'Content-type': 'application/json'\n },\n body: payload\n });\n}\n/**\n * @deprecated Use the `useVisit` hook instead.\n */ function getVisitsForPatient(patientUuid, abortController, v) {\n const custom = v ?? defaultVisitCustomRepresentation;\n return (0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.openmrsFetch)(`${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.restBaseUrl}/visit?patient=${patientUuid}&v=${custom}`, {\n signal: abortController.signal,\n method: 'GET',\n headers: {\n 'Content-type': 'application/json'\n }\n });\n}\n/** @deprecated */ const getStartedVisit = new rxjs__WEBPACK_IMPORTED_MODULE_2__.BehaviorSubject(null);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lbXItYXBpL2Rpc3QvdmlzaXQtdXRpbHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMEJBQTBCLEdBQWdFO0FBQ3RDO0FBQ2I7QUFDaEMsSUFBSUksWUFBWSxXQUFXLEdBQUcsU0FBU0EsU0FBUztJQUNuREEsU0FBUyxDQUFDLFdBQVcsR0FBRztJQUN4QkEsU0FBUyxDQUFDLFlBQVksR0FBRztJQUN6QkEsU0FBUyxDQUFDLFVBQVUsR0FBRztJQUN2QixPQUFPQTtBQUNYLEVBQUUsQ0FBQyxHQUFHO0FBQ0MsSUFBSUMsY0FBYyxXQUFXLEdBQUcsU0FBU0EsV0FBVztJQUN2REEsV0FBVyxDQUFDLGFBQWEsR0FBRztJQUM1QkEsV0FBVyxDQUFDLFVBQVUsR0FBRztJQUN6QixPQUFPQTtBQUNYLEVBQUUsQ0FBQyxHQUFHO0FBQ047Ozs7Q0FJQyxHQUFVLE1BQU1DLG1DQUFtQyx1RUFBdUUsZ0RBQWdELG1DQUFtQyx1QkFBdUIsc0NBQXNDLCtCQUErQiw0QkFBNEIsbUNBQW1DLGlGQUFpRixnQ0FBZ0M7QUFDMWQsTUFBTUMsZUFBZUMsNEJBQTRCO0lBQzdDQyxhQUFhO0lBQ2JDLHNCQUFzQjtJQUN0QkMsc0JBQXNCLENBQUM7QUFDM0I7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0NBZUMsR0FBVSxTQUFTQztJQUNoQixPQUFPVixrRUFBY0EsQ0FBQyxTQUFTSztBQUNuQztBQUNBOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUFVLFNBQVNNLGdCQUFnQkosV0FBVyxFQUFFSyxTQUFTO0lBQ3RERixnQkFBZ0JHLFFBQVEsQ0FBQztRQUNyQk47UUFDQUMsc0JBQXNCSTtJQUMxQjtBQUNKO0FBQ0FGLGdCQUFnQkksU0FBUyxDQUFDLENBQUNDO0lBQ3ZCQyx1QkFBdUJEO0FBQzNCO0FBQ0EsU0FBU0MsdUJBQXVCQyxLQUFLO0lBQ2pDQyxlQUFlQyxPQUFPLENBQUMsMkJBQTJCQyxLQUFLQyxTQUFTLENBQUNKO0FBQ3JFO0FBQ0EsU0FBU1g7SUFDTCxJQUFJO1FBQ0EsT0FBT2MsS0FBS0UsS0FBSyxDQUFDSixlQUFlSyxPQUFPLENBQUMsOEJBQThCO0lBQzNFLEVBQUUsT0FBT0MsR0FBRztRQUNSLE9BQU87SUFDWDtBQUNKO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtCQyxHQUFVLFNBQVNDLFVBQVVDLE9BQU8sRUFBRUMsZUFBZTtJQUNsRCxPQUFPN0IsOERBQVlBLENBQUMsR0FBR0MseURBQVdBLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDeEM2QixRQUFRRCxnQkFBZ0JDLE1BQU07UUFDOUJDLFFBQVE7UUFDUkMsU0FBUztZQUNMLGdCQUFnQjtRQUNwQjtRQUNBQyxNQUFNTDtJQUNWO0FBQ0o7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztDQWdCQyxHQUFVLFNBQVNNLFlBQVlDLElBQUksRUFBRVAsT0FBTyxFQUFFQyxlQUFlO0lBQzFELE9BQU83Qiw4REFBWUEsQ0FBQyxHQUFHQyx5REFBV0EsQ0FBQyxPQUFPLEVBQUVrQyxNQUFNLEVBQUU7UUFDaERMLFFBQVFELGdCQUFnQkMsTUFBTTtRQUM5QkMsUUFBUTtRQUNSQyxTQUFTO1lBQ0wsZ0JBQWdCO1FBQ3BCO1FBQ0FDLE1BQU1MO0lBQ1Y7QUFDSjtBQUNBOztDQUVDLEdBQVUsU0FBU1Esb0JBQW9CM0IsV0FBVyxFQUFFb0IsZUFBZSxFQUFFUSxDQUFDO0lBQ25FLE1BQU1DLFNBQVNELEtBQUsvQjtJQUNwQixPQUFPTiw4REFBWUEsQ0FBQyxHQUFHQyx5REFBV0EsQ0FBQyxlQUFlLEVBQUVRLFlBQVksR0FBRyxFQUFFNkIsUUFBUSxFQUFFO1FBQzNFUixRQUFRRCxnQkFBZ0JDLE1BQU07UUFDOUJDLFFBQVE7UUFDUkMsU0FBUztZQUNMLGdCQUFnQjtRQUNwQjtJQUNKO0FBQ0o7QUFDQSxnQkFBZ0IsR0FBVSxNQUFNTyxrQkFBa0IsSUFBSXBDLGlEQUFlQSxDQUFDLE1BQU0iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tZW1yLWFwaS9kaXN0L3Zpc2l0LXV0aWxzLmpzPzZkZTgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyBvcGVubXJzRmV0Y2gsIHJlc3RCYXNlVXJsIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1hcGlcIjtcbmltcG9ydCB7IGdldEdsb2JhbFN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1zdGF0ZVwiO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmV4cG9ydCB2YXIgVmlzaXRNb2RlID0gLyojX19QVVJFX18qLyBmdW5jdGlvbihWaXNpdE1vZGUpIHtcbiAgICBWaXNpdE1vZGVbXCJORVdWSVNJVFwiXSA9IFwic3RhcnRWaXNpdFwiO1xuICAgIFZpc2l0TW9kZVtcIkVESVRWSVNJVFwiXSA9IFwiZWRpdFZpc2l0XCI7XG4gICAgVmlzaXRNb2RlW1wiTE9BRElOR1wiXSA9IFwibG9hZGluZ1Zpc2l0XCI7XG4gICAgcmV0dXJuIFZpc2l0TW9kZTtcbn0oe30pO1xuZXhwb3J0IHZhciBWaXNpdFN0YXR1cyA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24oVmlzaXRTdGF0dXMpIHtcbiAgICBWaXNpdFN0YXR1c1tcIk5PVFNUQVJURURcIl0gPSBcIm5vdFN0YXJ0ZWRcIjtcbiAgICBWaXNpdFN0YXR1c1tcIk9OR09JTkdcIl0gPSBcIm9uZ29pbmdcIjtcbiAgICByZXR1cm4gVmlzaXRTdGF0dXM7XG59KHt9KTtcbi8qKlxuICogVGhlIGRlZmF1bHQgY3VzdG9tIHJlcHJlc2VudGF0aW9uIHN0cmluZyBmb3IgZmV0Y2hpbmcgdmlzaXQgZGF0YSBmcm9tIHRoZSBSRVNUIEFQSS5cbiAqIFRoaXMgcmVwcmVzZW50YXRpb24gaW5jbHVkZXMgY29tcHJlaGVuc2l2ZSB2aXNpdCBkZXRhaWxzIHN1Y2ggYXMgZW5jb3VudGVycywgcGF0aWVudCxcbiAqIHZpc2l0IHR5cGUsIGF0dHJpYnV0ZXMsIGFuZCBsb2NhdGlvbiBpbmZvcm1hdGlvbi5cbiAqLyBleHBvcnQgY29uc3QgZGVmYXVsdFZpc2l0Q3VzdG9tUmVwcmVzZW50YXRpb24gPSAnY3VzdG9tOih1dWlkLGRpc3BsYXksdm9pZGVkLGluZGljYXRpb24sc3RhcnREYXRldGltZSxzdG9wRGF0ZXRpbWUsJyArICdlbmNvdW50ZXJzOih1dWlkLGRpc3BsYXksZW5jb3VudGVyRGF0ZXRpbWUsJyArICdmb3JtOih1dWlkLG5hbWUpLGxvY2F0aW9uOnJlZiwnICsgJ2VuY291bnRlclR5cGU6cmVmLCcgKyAnZW5jb3VudGVyUHJvdmlkZXJzOih1dWlkLGRpc3BsYXksJyArICdwcm92aWRlcjoodXVpZCxkaXNwbGF5KSkpLCcgKyAncGF0aWVudDoodXVpZCxkaXNwbGF5KSwnICsgJ3Zpc2l0VHlwZToodXVpZCxuYW1lLGRpc3BsYXkpLCcgKyAnYXR0cmlidXRlczoodXVpZCxkaXNwbGF5LGF0dHJpYnV0ZVR5cGU6KG5hbWUsZGF0YXR5cGVDbGFzc25hbWUsdXVpZCksdmFsdWUpLCcgKyAnbG9jYXRpb246KHV1aWQsbmFtZSxkaXNwbGF5KSknO1xuY29uc3QgaW5pdGlhbFN0YXRlID0gZ2V0VmlzaXRTZXNzaW9uU3RvcmFnZSgpIHx8IHtcbiAgICBwYXRpZW50VXVpZDogbnVsbCxcbiAgICBtYW51YWxseVNldFZpc2l0VXVpZDogbnVsbCxcbiAgICBtdXRhdGVWaXNpdENhbGxiYWNrczoge31cbn07XG4vKipcbiAqIFJldHVybnMgdGhlIGdsb2JhbCB2aXNpdCBzdG9yZSB0aGF0IG1hbmFnZXMgdGhlIGN1cnJlbnQgdmlzaXQgc3RhdGUuIFRoZSBzdG9yZVxuICogY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGF0aWVudCdzIHZpc2l0IGFuZCBwcm92aWRlcyBtZXRob2RzXG4gKiBmb3Igc3Vic2NyaWJpbmcgdG8gdmlzaXQgc3RhdGUgY2hhbmdlcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZ2xvYmFsIHZpc2l0IHN0b3JlIGluc3RhbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZ2V0VmlzaXRTdG9yZSB9IGZyb20gJ0BvcGVubXJzL2VzbS1mcmFtZXdvcmsnO1xuICogY29uc3Qgc3RvcmUgPSBnZXRWaXNpdFN0b3JlKCk7XG4gKiBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ0N1cnJlbnQgcGF0aWVudDonLCBzdGF0ZS5wYXRpZW50VXVpZCk7XG4gKiB9KTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRWaXNpdFN0b3JlKCkge1xuICAgIHJldHVybiBnZXRHbG9iYWxTdG9yZSgndmlzaXQnLCBpbml0aWFsU3RhdGUpO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBjdXJyZW50IHZpc2l0IGZvciBhIHBhdGllbnQgaW4gdGhlIGdsb2JhbCB2aXNpdCBzdG9yZS4gVGhpcyBpcyB1c2VkXG4gKiB0byBtYW51YWxseSBzcGVjaWZ5IHdoaWNoIHZpc2l0IHNob3VsZCBiZSBjb25zaWRlcmVkIFwiYWN0aXZlXCIgZm9yIHRoZSBnaXZlbiBwYXRpZW50LlxuICpcbiAqIEBwYXJhbSBwYXRpZW50VXVpZCBUaGUgVVVJRCBvZiB0aGUgcGF0aWVudC5cbiAqIEBwYXJhbSB2aXNpdFV1aWQgVGhlIFVVSUQgb2YgdGhlIHZpc2l0IHRvIHNldCBhcyB0aGUgY3VycmVudCB2aXNpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNldEN1cnJlbnRWaXNpdCB9IGZyb20gJ0BvcGVubXJzL2VzbS1mcmFtZXdvcmsnO1xuICogc2V0Q3VycmVudFZpc2l0KCdwYXRpZW50LXV1aWQnLCAndmlzaXQtdXVpZCcpO1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHNldEN1cnJlbnRWaXNpdChwYXRpZW50VXVpZCwgdmlzaXRVdWlkKSB7XG4gICAgZ2V0VmlzaXRTdG9yZSgpLnNldFN0YXRlKHtcbiAgICAgICAgcGF0aWVudFV1aWQsXG4gICAgICAgIG1hbnVhbGx5U2V0VmlzaXRVdWlkOiB2aXNpdFV1aWRcbiAgICB9KTtcbn1cbmdldFZpc2l0U3RvcmUoKS5zdWJzY3JpYmUoKHN0YXRlKT0+e1xuICAgIHNldFZpc2l0U2Vzc2lvblN0b3JhZ2Uoc3RhdGUpO1xufSk7XG5mdW5jdGlvbiBzZXRWaXNpdFNlc3Npb25TdG9yYWdlKHZhbHVlKSB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnb3Blbm1yczp2aXNpdFN0b3JlU3RhdGUnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xufVxuZnVuY3Rpb24gZ2V0VmlzaXRTZXNzaW9uU3RvcmFnZSgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdvcGVubXJzOnZpc2l0U3RvcmVTdGF0ZScpIHx8ICdudWxsJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmlzaXQgYnkgc2VuZGluZyBhIFBPU1QgcmVxdWVzdCB0byB0aGUgT3Blbk1SUyBSRVNUIEFQSS5cbiAqXG4gKiBAcGFyYW0gcGF5bG9hZCBUaGUgdmlzaXQgZGF0YSB0byBjcmVhdGUsIGluY2x1ZGluZyBwYXRpZW50IFVVSUQsIHZpc2l0IHR5cGUsXG4gKiAgIHN0YXJ0IGRhdGV0aW1lLCBhbmQgb3RoZXIgdmlzaXQgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSBhYm9ydENvbnRyb2xsZXIgQW4gQWJvcnRDb250cm9sbGVyIHRvIGFsbG93IGNhbmNlbGxhdGlvbiBvZiB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEZldGNoUmVzcG9uc2UgY29udGFpbmluZyB0aGUgY3JlYXRlZCBWaXNpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNhdmVWaXNpdCB9IGZyb20gJ0BvcGVubXJzL2VzbS1mcmFtZXdvcmsnO1xuICogY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzYXZlVmlzaXQoe1xuICogICBwYXRpZW50OiAncGF0aWVudC11dWlkJyxcbiAqICAgdmlzaXRUeXBlOiAndmlzaXQtdHlwZS11dWlkJyxcbiAqICAgc3RhcnREYXRldGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gKiB9LCBhYm9ydENvbnRyb2xsZXIpO1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHNhdmVWaXNpdChwYXlsb2FkLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gb3Blbm1yc0ZldGNoKGAke3Jlc3RCYXNlVXJsfS92aXNpdGAsIHtcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBwYXlsb2FkXG4gICAgfSk7XG59XG4vKipcbiAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgdmlzaXQgYnkgc2VuZGluZyBhIFBPU1QgcmVxdWVzdCB0byB0aGUgT3Blbk1SUyBSRVNUIEFQSS5cbiAqXG4gKiBAcGFyYW0gdXVpZCBUaGUgVVVJRCBvZiB0aGUgdmlzaXQgdG8gdXBkYXRlLlxuICogQHBhcmFtIHBheWxvYWQgVGhlIHZpc2l0IGRhdGEgdG8gdXBkYXRlLCBzdWNoIGFzIHN0b3AgZGF0ZXRpbWUgb3IgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSBhYm9ydENvbnRyb2xsZXIgQW4gQWJvcnRDb250cm9sbGVyIHRvIGFsbG93IGNhbmNlbGxhdGlvbiBvZiB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEZldGNoUmVzcG9uc2UgY29udGFpbmluZyB0aGUgdXBkYXRlZCBWaXNpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHVwZGF0ZVZpc2l0IH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHVwZGF0ZVZpc2l0KCd2aXNpdC11dWlkJywge1xuICogICBzdG9wRGF0ZXRpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICogfSwgYWJvcnRDb250cm9sbGVyKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWaXNpdCh1dWlkLCBwYXlsb2FkLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gb3Blbm1yc0ZldGNoKGAke3Jlc3RCYXNlVXJsfS92aXNpdC8ke3V1aWR9YCwge1xuICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IHBheWxvYWRcbiAgICB9KTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBgdXNlVmlzaXRgIGhvb2sgaW5zdGVhZC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0VmlzaXRzRm9yUGF0aWVudChwYXRpZW50VXVpZCwgYWJvcnRDb250cm9sbGVyLCB2KSB7XG4gICAgY29uc3QgY3VzdG9tID0gdiA/PyBkZWZhdWx0VmlzaXRDdXN0b21SZXByZXNlbnRhdGlvbjtcbiAgICByZXR1cm4gb3Blbm1yc0ZldGNoKGAke3Jlc3RCYXNlVXJsfS92aXNpdD9wYXRpZW50PSR7cGF0aWVudFV1aWR9JnY9JHtjdXN0b219YCwge1xuICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqIEBkZXByZWNhdGVkICovIGV4cG9ydCBjb25zdCBnZXRTdGFydGVkVmlzaXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuIl0sIm5hbWVzIjpbIm9wZW5tcnNGZXRjaCIsInJlc3RCYXNlVXJsIiwiZ2V0R2xvYmFsU3RvcmUiLCJCZWhhdmlvclN1YmplY3QiLCJWaXNpdE1vZGUiLCJWaXNpdFN0YXR1cyIsImRlZmF1bHRWaXNpdEN1c3RvbVJlcHJlc2VudGF0aW9uIiwiaW5pdGlhbFN0YXRlIiwiZ2V0VmlzaXRTZXNzaW9uU3RvcmFnZSIsInBhdGllbnRVdWlkIiwibWFudWFsbHlTZXRWaXNpdFV1aWQiLCJtdXRhdGVWaXNpdENhbGxiYWNrcyIsImdldFZpc2l0U3RvcmUiLCJzZXRDdXJyZW50VmlzaXQiLCJ2aXNpdFV1aWQiLCJzZXRTdGF0ZSIsInN1YnNjcmliZSIsInN0YXRlIiwic2V0VmlzaXRTZXNzaW9uU3RvcmFnZSIsInZhbHVlIiwic2Vzc2lvblN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlIiwiZ2V0SXRlbSIsImUiLCJzYXZlVmlzaXQiLCJwYXlsb2FkIiwiYWJvcnRDb250cm9sbGVyIiwic2lnbmFsIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJ1cGRhdGVWaXNpdCIsInV1aWQiLCJnZXRWaXNpdHNGb3JQYXRpZW50IiwidiIsImN1c3RvbSIsImdldFN0YXJ0ZWRWaXNpdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-emr-api/dist/visit-utils.js\n");
409
409
 
410
410
  /***/ }),
411
411
 
@@ -415,7 +415,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
415
415
  \********************************************************/
416
416
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
417
417
 
418
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createErrorHandler: () => (/* binding */ createErrorHandler),\n/* harmony export */ reportError: () => (/* binding */ reportError)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-globals */ \"../../framework/esm-globals/dist/index.js\");\n/** @module @category Error Handling */ \nwindow.onerror = function(error) {\n console.error('Unexpected error: ', error);\n (0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__.dispatchToastShown)({\n description: error ?? 'Oops! An unexpected error occurred.',\n kind: 'error',\n title: 'Error'\n });\n return false;\n};\nwindow.onunhandledrejection = function(event) {\n console.error('Unhandled rejection: ', event.reason);\n (0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__.dispatchToastShown)({\n description: event.reason ?? 'Oops! An unhandled promise rejection occurred.',\n kind: 'error',\n title: 'Error'\n });\n};\nfunction reportError(err) {\n const error = ensureErrorObject(err);\n setTimeout(()=>{\n throw error;\n });\n}\nfunction createErrorHandler() {\n const outgoingErr = Error();\n return (incomingErr)=>{\n const finalErr = ensureErrorObject(incomingErr);\n finalErr.stack += `\\nAsync stacktrace:\\n${outgoingErr.stack}`;\n reportError(incomingErr);\n };\n}\nfunction ensureErrorObject(thing) {\n let message;\n if (thing instanceof Error) {\n return thing;\n } else if (thing === null) {\n return Error(`'null' was thrown as an error`);\n } else if (typeof thing === 'object') {\n try {\n message = `Object thrown as error: ${JSON.stringify(thing)}`;\n } catch (e) {\n message = `Object thrown as error with the following properties: ${Object.keys(thing)}`;\n }\n return Error(message);\n } else if (thing === undefined) {\n return Error(`'undefined' was thrown as an error`);\n } else {\n return Error(thing.toString());\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lcnJvci1oYW5kbGluZy9kaXN0L2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFDQUFxQyxHQUE2RDtBQUNsR0MsT0FBT0MsT0FBTyxHQUFHLFNBQVNDLEtBQUs7SUFDM0JDLFFBQVFELEtBQUssQ0FBQyxzQkFBc0JBO0lBQ3BDSCx3RUFBa0JBLENBQUM7UUFDZkssYUFBYUYsU0FBUztRQUN0QkcsTUFBTTtRQUNOQyxPQUFPO0lBQ1g7SUFDQSxPQUFPO0FBQ1g7QUFDQU4sT0FBT08sb0JBQW9CLEdBQUcsU0FBU0MsS0FBSztJQUN4Q0wsUUFBUUQsS0FBSyxDQUFDLHlCQUF5Qk0sTUFBTUMsTUFBTTtJQUNuRFYsd0VBQWtCQSxDQUFDO1FBQ2ZLLGFBQWFJLE1BQU1DLE1BQU0sSUFBSTtRQUM3QkosTUFBTTtRQUNOQyxPQUFPO0lBQ1g7QUFDSjtBQUNPLFNBQVNJLFlBQVlDLEdBQUc7SUFDM0IsTUFBTVQsUUFBUVUsa0JBQWtCRDtJQUNoQ0UsV0FBVztRQUNQLE1BQU1YO0lBQ1Y7QUFDSjtBQUNPLFNBQVNZO0lBQ1osTUFBTUMsY0FBY0M7SUFDcEIsT0FBTyxDQUFDQztRQUNKLE1BQU1DLFdBQVdOLGtCQUFrQks7UUFDbkNDLFNBQVNDLEtBQUssSUFBSSxDQUFDLHFCQUFxQixFQUFFSixZQUFZSSxLQUFLLEVBQUU7UUFDN0RULFlBQVlPO0lBQ2hCO0FBQ0o7QUFDQSxTQUFTTCxrQkFBa0JRLEtBQUs7SUFDNUIsSUFBSUM7SUFDSixJQUFJRCxpQkFBaUJKLE9BQU87UUFDeEIsT0FBT0k7SUFDWCxPQUFPLElBQUlBLFVBQVUsTUFBTTtRQUN2QixPQUFPSixNQUFNLENBQUMsNkJBQTZCLENBQUM7SUFDaEQsT0FBTyxJQUFJLE9BQU9JLFVBQVUsVUFBVTtRQUNsQyxJQUFJO1lBQ0FDLFVBQVUsQ0FBQyx3QkFBd0IsRUFBRUMsS0FBS0MsU0FBUyxDQUFDSCxRQUFRO1FBQ2hFLEVBQUUsT0FBT0ksR0FBRztZQUNSSCxVQUFVLENBQUMsc0RBQXNELEVBQUVJLE9BQU9DLElBQUksQ0FBQ04sUUFBUTtRQUMzRjtRQUNBLE9BQU9KLE1BQU1LO0lBQ2pCLE9BQU8sSUFBSUQsVUFBVU8sV0FBVztRQUM1QixPQUFPWCxNQUFNLENBQUMsa0NBQWtDLENBQUM7SUFDckQsT0FBTztRQUNILE9BQU9BLE1BQU1JLE1BQU1RLFFBQVE7SUFDL0I7QUFDSiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1lcnJvci1oYW5kbGluZy9kaXN0L2luZGV4LmpzPzhlMmIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEVycm9yIEhhbmRsaW5nICovIGltcG9ydCB7IGRpc3BhdGNoVG9hc3RTaG93biB9IGZyb20gXCJAb3Blbm1ycy9lc20tZ2xvYmFsc1wiO1xud2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICBkaXNwYXRjaFRvYXN0U2hvd24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogZXJyb3IgPz8gJ09vcHMhIEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQuJyxcbiAgICAgICAga2luZDogJ2Vycm9yJyxcbiAgICAgICAgdGl0bGU6ICdFcnJvcidcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xud2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcmVqZWN0aW9uOiAnLCBldmVudC5yZWFzb24pO1xuICAgIGRpc3BhdGNoVG9hc3RTaG93bih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5yZWFzb24gPz8gJ09vcHMhIEFuIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBvY2N1cnJlZC4nLFxuICAgICAgICBraW5kOiAnZXJyb3InLFxuICAgICAgICB0aXRsZTogJ0Vycm9yJ1xuICAgIH0pO1xufTtcbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRFcnJvcihlcnIpIHtcbiAgICBjb25zdCBlcnJvciA9IGVuc3VyZUVycm9yT2JqZWN0KGVycik7XG4gICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFcnJvckhhbmRsZXIoKSB7XG4gICAgY29uc3Qgb3V0Z29pbmdFcnIgPSBFcnJvcigpO1xuICAgIHJldHVybiAoaW5jb21pbmdFcnIpPT57XG4gICAgICAgIGNvbnN0IGZpbmFsRXJyID0gZW5zdXJlRXJyb3JPYmplY3QoaW5jb21pbmdFcnIpO1xuICAgICAgICBmaW5hbEVyci5zdGFjayArPSBgXFxuQXN5bmMgc3RhY2t0cmFjZTpcXG4ke291dGdvaW5nRXJyLnN0YWNrfWA7XG4gICAgICAgIHJlcG9ydEVycm9yKGluY29taW5nRXJyKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gZW5zdXJlRXJyb3JPYmplY3QodGhpbmcpIHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpbmc7XG4gICAgfSBlbHNlIGlmICh0aGluZyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyb3IoYCdudWxsJyB3YXMgdGhyb3duIGFzIGFuIGVycm9yYCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gYE9iamVjdCB0aHJvd24gYXMgZXJyb3I6ICR7SlNPTi5zdHJpbmdpZnkodGhpbmcpfWA7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgT2JqZWN0IHRocm93biBhcyBlcnJvciB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0aGluZyl9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXJyb3IobWVzc2FnZSk7XG4gICAgfSBlbHNlIGlmICh0aGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBFcnJvcihgJ3VuZGVmaW5lZCcgd2FzIHRocm93biBhcyBhbiBlcnJvcmApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBFcnJvcih0aGluZy50b1N0cmluZygpKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiZGlzcGF0Y2hUb2FzdFNob3duIiwid2luZG93Iiwib25lcnJvciIsImVycm9yIiwiY29uc29sZSIsImRlc2NyaXB0aW9uIiwia2luZCIsInRpdGxlIiwib251bmhhbmRsZWRyZWplY3Rpb24iLCJldmVudCIsInJlYXNvbiIsInJlcG9ydEVycm9yIiwiZXJyIiwiZW5zdXJlRXJyb3JPYmplY3QiLCJzZXRUaW1lb3V0IiwiY3JlYXRlRXJyb3JIYW5kbGVyIiwib3V0Z29pbmdFcnIiLCJFcnJvciIsImluY29taW5nRXJyIiwiZmluYWxFcnIiLCJzdGFjayIsInRoaW5nIiwibWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwiT2JqZWN0Iiwia2V5cyIsInVuZGVmaW5lZCIsInRvU3RyaW5nIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-error-handling/dist/index.js\n");
418
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createErrorHandler: () => (/* binding */ createErrorHandler),\n/* harmony export */ reportError: () => (/* binding */ reportError)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-globals */ \"../../framework/esm-globals/dist/index.js\");\n/** @module @category Error Handling */ \nwindow.onerror = function(error) {\n console.error('Unexpected error: ', error);\n (0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__.dispatchToastShown)({\n description: error ?? 'Oops! An unexpected error occurred.',\n kind: 'error',\n title: 'Error'\n });\n return false;\n};\nwindow.onunhandledrejection = function(event) {\n console.error('Unhandled rejection: ', event.reason);\n (0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__.dispatchToastShown)({\n description: event.reason ?? 'Oops! An unhandled promise rejection occurred.',\n kind: 'error',\n title: 'Error'\n });\n};\n/**\n * Reports an error to the global error handler. The error will be displayed\n * to the user as a toast notification. This function ensures the error is\n * converted to an Error object if it isn't already one.\n *\n * The error is thrown asynchronously (via setTimeout) to ensure it's caught\n * by the global window.onerror handler.\n *\n * @param err The error to report. Can be an Error object, string, or any other value.\n *\n * @example\n * ```ts\n * import { reportError } from '@openmrs/esm-framework';\n * try {\n * await riskyOperation();\n * } catch (error) {\n * reportError(error);\n * }\n * ```\n */ function reportError(err) {\n const error = ensureErrorObject(err);\n setTimeout(()=>{\n throw error;\n });\n}\n/**\n * Creates an error handler function that captures the current stack trace at\n * the time of creation. When the returned handler is invoked with an error,\n * it appends the captured stack trace to provide better debugging information\n * for asynchronous operations.\n *\n * This is particularly useful for handling errors in Promise chains or\n * callback-based APIs where the original call site would otherwise be lost.\n *\n * @returns A function that accepts an error and reports it with an enhanced stack trace.\n *\n * @example\n * ```ts\n * import { createErrorHandler } from '@openmrs/esm-framework';\n * const handleError = createErrorHandler();\n * someAsyncOperation()\n * .then(processResult)\n * .catch(handleError);\n * ```\n */ function createErrorHandler() {\n const outgoingErr = Error();\n return (incomingErr)=>{\n const finalErr = ensureErrorObject(incomingErr);\n finalErr.stack += `\\nAsync stacktrace:\\n${outgoingErr.stack}`;\n reportError(incomingErr);\n };\n}\nfunction ensureErrorObject(thing) {\n let message;\n if (thing instanceof Error) {\n return thing;\n } else if (thing === null) {\n return Error(`'null' was thrown as an error`);\n } else if (typeof thing === 'object') {\n try {\n message = `Object thrown as error: ${JSON.stringify(thing)}`;\n } catch (e) {\n message = `Object thrown as error with the following properties: ${Object.keys(thing)}`;\n }\n return Error(message);\n } else if (thing === undefined) {\n return Error(`'undefined' was thrown as an error`);\n } else {\n return Error(thing.toString());\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1lcnJvci1oYW5kbGluZy9kaXN0L2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFDQUFxQyxHQUE2RDtBQUNsR0MsT0FBT0MsT0FBTyxHQUFHLFNBQVNDLEtBQUs7SUFDM0JDLFFBQVFELEtBQUssQ0FBQyxzQkFBc0JBO0lBQ3BDSCx3RUFBa0JBLENBQUM7UUFDZkssYUFBYUYsU0FBUztRQUN0QkcsTUFBTTtRQUNOQyxPQUFPO0lBQ1g7SUFDQSxPQUFPO0FBQ1g7QUFDQU4sT0FBT08sb0JBQW9CLEdBQUcsU0FBU0MsS0FBSztJQUN4Q0wsUUFBUUQsS0FBSyxDQUFDLHlCQUF5Qk0sTUFBTUMsTUFBTTtJQUNuRFYsd0VBQWtCQSxDQUFDO1FBQ2ZLLGFBQWFJLE1BQU1DLE1BQU0sSUFBSTtRQUM3QkosTUFBTTtRQUNOQyxPQUFPO0lBQ1g7QUFDSjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBbUJDLEdBQVUsU0FBU0ksWUFBWUMsR0FBRztJQUMvQixNQUFNVCxRQUFRVSxrQkFBa0JEO0lBQ2hDRSxXQUFXO1FBQ1AsTUFBTVg7SUFDVjtBQUNKO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQkMsR0FBVSxTQUFTWTtJQUNoQixNQUFNQyxjQUFjQztJQUNwQixPQUFPLENBQUNDO1FBQ0osTUFBTUMsV0FBV04sa0JBQWtCSztRQUNuQ0MsU0FBU0MsS0FBSyxJQUFJLENBQUMscUJBQXFCLEVBQUVKLFlBQVlJLEtBQUssRUFBRTtRQUM3RFQsWUFBWU87SUFDaEI7QUFDSjtBQUNBLFNBQVNMLGtCQUFrQlEsS0FBSztJQUM1QixJQUFJQztJQUNKLElBQUlELGlCQUFpQkosT0FBTztRQUN4QixPQUFPSTtJQUNYLE9BQU8sSUFBSUEsVUFBVSxNQUFNO1FBQ3ZCLE9BQU9KLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQztJQUNoRCxPQUFPLElBQUksT0FBT0ksVUFBVSxVQUFVO1FBQ2xDLElBQUk7WUFDQUMsVUFBVSxDQUFDLHdCQUF3QixFQUFFQyxLQUFLQyxTQUFTLENBQUNILFFBQVE7UUFDaEUsRUFBRSxPQUFPSSxHQUFHO1lBQ1JILFVBQVUsQ0FBQyxzREFBc0QsRUFBRUksT0FBT0MsSUFBSSxDQUFDTixRQUFRO1FBQzNGO1FBQ0EsT0FBT0osTUFBTUs7SUFDakIsT0FBTyxJQUFJRCxVQUFVTyxXQUFXO1FBQzVCLE9BQU9YLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQztJQUNyRCxPQUFPO1FBQ0gsT0FBT0EsTUFBTUksTUFBTVEsUUFBUTtJQUMvQjtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWVycm9yLWhhbmRsaW5nL2Rpc3QvaW5kZXguanM/OGUyYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgRXJyb3IgSGFuZGxpbmcgKi8gaW1wb3J0IHsgZGlzcGF0Y2hUb2FzdFNob3duIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1nbG9iYWxzXCI7XG53aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgIGRpc3BhdGNoVG9hc3RTaG93bih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBlcnJvciA/PyAnT29wcyEgQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4nLFxuICAgICAgICBraW5kOiAnZXJyb3InLFxuICAgICAgICB0aXRsZTogJ0Vycm9yJ1xuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbn07XG53aW5kb3cub251bmhhbmRsZWRyZWplY3Rpb24gPSBmdW5jdGlvbihldmVudCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCByZWplY3Rpb246ICcsIGV2ZW50LnJlYXNvbik7XG4gICAgZGlzcGF0Y2hUb2FzdFNob3duKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGV2ZW50LnJlYXNvbiA/PyAnT29wcyEgQW4gdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIG9jY3VycmVkLicsXG4gICAgICAgIGtpbmQ6ICdlcnJvcicsXG4gICAgICAgIHRpdGxlOiAnRXJyb3InXG4gICAgfSk7XG59O1xuLyoqXG4gKiBSZXBvcnRzIGFuIGVycm9yIHRvIHRoZSBnbG9iYWwgZXJyb3IgaGFuZGxlci4gVGhlIGVycm9yIHdpbGwgYmUgZGlzcGxheWVkXG4gKiB0byB0aGUgdXNlciBhcyBhIHRvYXN0IG5vdGlmaWNhdGlvbi4gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoZSBlcnJvciBpc1xuICogY29udmVydGVkIHRvIGFuIEVycm9yIG9iamVjdCBpZiBpdCBpc24ndCBhbHJlYWR5IG9uZS5cbiAqXG4gKiBUaGUgZXJyb3IgaXMgdGhyb3duIGFzeW5jaHJvbm91c2x5ICh2aWEgc2V0VGltZW91dCkgdG8gZW5zdXJlIGl0J3MgY2F1Z2h0XG4gKiBieSB0aGUgZ2xvYmFsIHdpbmRvdy5vbmVycm9yIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGVyciBUaGUgZXJyb3IgdG8gcmVwb3J0LiBDYW4gYmUgYW4gRXJyb3Igb2JqZWN0LCBzdHJpbmcsIG9yIGFueSBvdGhlciB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHJlcG9ydEVycm9yIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiB0cnkge1xuICogICBhd2FpdCByaXNreU9wZXJhdGlvbigpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgcmVwb3J0RXJyb3IoZXJyb3IpO1xuICogfVxuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydEVycm9yKGVycikge1xuICAgIGNvbnN0IGVycm9yID0gZW5zdXJlRXJyb3JPYmplY3QoZXJyKTtcbiAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBjYXB0dXJlcyB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBhdFxuICogdGhlIHRpbWUgb2YgY3JlYXRpb24uIFdoZW4gdGhlIHJldHVybmVkIGhhbmRsZXIgaXMgaW52b2tlZCB3aXRoIGFuIGVycm9yLFxuICogaXQgYXBwZW5kcyB0aGUgY2FwdHVyZWQgc3RhY2sgdHJhY2UgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4gKiBmb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuXG4gKlxuICogVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBoYW5kbGluZyBlcnJvcnMgaW4gUHJvbWlzZSBjaGFpbnMgb3JcbiAqIGNhbGxiYWNrLWJhc2VkIEFQSXMgd2hlcmUgdGhlIG9yaWdpbmFsIGNhbGwgc2l0ZSB3b3VsZCBvdGhlcndpc2UgYmUgbG9zdC5cbiAqXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhbiBlcnJvciBhbmQgcmVwb3J0cyBpdCB3aXRoIGFuIGVuaGFuY2VkIHN0YWNrIHRyYWNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlRXJyb3JIYW5kbGVyIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBjb25zdCBoYW5kbGVFcnJvciA9IGNyZWF0ZUVycm9ySGFuZGxlcigpO1xuICogc29tZUFzeW5jT3BlcmF0aW9uKClcbiAqICAgLnRoZW4ocHJvY2Vzc1Jlc3VsdClcbiAqICAgLmNhdGNoKGhhbmRsZUVycm9yKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFcnJvckhhbmRsZXIoKSB7XG4gICAgY29uc3Qgb3V0Z29pbmdFcnIgPSBFcnJvcigpO1xuICAgIHJldHVybiAoaW5jb21pbmdFcnIpPT57XG4gICAgICAgIGNvbnN0IGZpbmFsRXJyID0gZW5zdXJlRXJyb3JPYmplY3QoaW5jb21pbmdFcnIpO1xuICAgICAgICBmaW5hbEVyci5zdGFjayArPSBgXFxuQXN5bmMgc3RhY2t0cmFjZTpcXG4ke291dGdvaW5nRXJyLnN0YWNrfWA7XG4gICAgICAgIHJlcG9ydEVycm9yKGluY29taW5nRXJyKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gZW5zdXJlRXJyb3JPYmplY3QodGhpbmcpIHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpbmc7XG4gICAgfSBlbHNlIGlmICh0aGluZyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyb3IoYCdudWxsJyB3YXMgdGhyb3duIGFzIGFuIGVycm9yYCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gYE9iamVjdCB0aHJvd24gYXMgZXJyb3I6ICR7SlNPTi5zdHJpbmdpZnkodGhpbmcpfWA7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgT2JqZWN0IHRocm93biBhcyBlcnJvciB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0aGluZyl9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXJyb3IobWVzc2FnZSk7XG4gICAgfSBlbHNlIGlmICh0aGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBFcnJvcihgJ3VuZGVmaW5lZCcgd2FzIHRocm93biBhcyBhbiBlcnJvcmApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBFcnJvcih0aGluZy50b1N0cmluZygpKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiZGlzcGF0Y2hUb2FzdFNob3duIiwid2luZG93Iiwib25lcnJvciIsImVycm9yIiwiY29uc29sZSIsImRlc2NyaXB0aW9uIiwia2luZCIsInRpdGxlIiwib251bmhhbmRsZWRyZWplY3Rpb24iLCJldmVudCIsInJlYXNvbiIsInJlcG9ydEVycm9yIiwiZXJyIiwiZW5zdXJlRXJyb3JPYmplY3QiLCJzZXRUaW1lb3V0IiwiY3JlYXRlRXJyb3JIYW5kbGVyIiwib3V0Z29pbmdFcnIiLCJFcnJvciIsImluY29taW5nRXJyIiwiZmluYWxFcnIiLCJzdGFjayIsInRoaW5nIiwibWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwiT2JqZWN0Iiwia2V5cyIsInVuZGVmaW5lZCIsInRvU3RyaW5nIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-error-handling/dist/index.js\n");
419
419
 
420
420
  /***/ }),
421
421
 
@@ -445,7 +445,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
445
445
  \*********************************************************/
446
446
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
447
447
 
448
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ attach: () => (/* binding */ attach),\n/* harmony export */ detach: () => (/* binding */ detach),\n/* harmony export */ detachAll: () => (/* binding */ detachAll),\n/* harmony export */ getAssignedExtensions: () => (/* binding */ getAssignedExtensions),\n/* harmony export */ getExtensionNameFromId: () => (/* binding */ getExtensionNameFromId),\n/* harmony export */ getExtensionRegistration: () => (/* binding */ getExtensionRegistration),\n/* harmony export */ getExtensionRegistrationFrom: () => (/* binding */ getExtensionRegistrationFrom),\n/* harmony export */ registerExtension: () => (/* binding */ registerExtension),\n/* harmony export */ registerExtensionSlot: () => (/* binding */ registerExtensionSlot),\n/* harmony export */ reset: () => (/* binding */ reset),\n/* harmony export */ updateExtensionSlotState: () => (/* binding */ updateExtensionSlotState)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-config */ \"../../framework/esm-config/dist/index.js\");\n/* harmony import */ var _openmrs_esm_expression_evaluator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @openmrs/esm-expression-evaluator */ \"../../framework/esm-expression-evaluator/dist/evaluator.js\");\n/* harmony import */ var _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-feature-flags */ \"../../framework/esm-feature-flags/dist/index.js\");\n/* harmony import */ var _openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @openmrs/esm-globals */ \"../../framework/esm-globals/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/is-online.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isEqual.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/merge.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers.js */ \"../../framework/esm-extensions/dist/helpers.js\");\n/* harmony import */ var _store_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store.js */ \"../../framework/esm-extensions/dist/store.js\");\n/** @module @category Extension */ /*\n * We have the following extension modes:\n *\n * - attached (set via code in form of: attach, detach, ...)\n * - configured (set via configuration in form of: added, removed, ...)\n * - assigned (computed from attached and configured)\n * - connected (computed from assigned using connectivity and online / offline)\n */ \n\n\n\n\n\n\n\n\nconst extensionInternalStore = (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.getExtensionInternalStore)();\nconst extensionStore = (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.getExtensionStore)();\nconst slotsConfigStore = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotsConfigStore)();\nconst extensionsConfigStore = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionsConfigStore)();\n// Keep the output store updated\nfunction updateExtensionOutputStore(internalState, extensionSlotConfigs, extensionsConfigStore, featureFlagStore, sessionStore) {\n const slots = {};\n const isOnline = (0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__.isOnline)();\n const enabledFeatureFlags = Object.entries(featureFlagStore.flags).filter(([, { enabled }])=>enabled).map(([name])=>name);\n for (let [slotName, slot] of Object.entries(internalState.slots)){\n const { config } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfigFromStore)(extensionSlotConfigs, slot.name);\n const assignedExtensions = getAssignedExtensionsFromSlotData(slotName, internalState, config, extensionsConfigStore, enabledFeatureFlags, isOnline, sessionStore.session);\n slots[slotName] = {\n moduleName: slot.moduleName,\n assignedExtensions\n };\n }\n if (!(0,lodash_es__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(extensionStore.getState().slots, slots)) {\n extensionStore.setState({\n slots\n });\n }\n}\nextensionInternalStore.subscribe((internalStore)=>{\n updateExtensionOutputStore(internalStore, slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\nslotsConfigStore.subscribe((slotConfigs)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotConfigs, extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\nextensionsConfigStore.subscribe((extensionConfigs)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionConfigs, _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\n_openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.subscribe((featureFlagStore)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), featureFlagStore, _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\n_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.subscribe((session)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), session);\n});\nfunction updateOutputStoreToCurrent() {\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n}\nupdateOutputStoreToCurrent();\n(0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_3__.subscribeConnectivityChanged)(updateOutputStoreToCurrent);\nfunction createNewExtensionSlotInfo(slotName, moduleName, state) {\n return {\n moduleName,\n name: slotName,\n attachedIds: [],\n config: null,\n state\n };\n}\n/**\n * Given an extension ID, which is a string uniquely identifying\n * an instance of an extension within an extension slot, this\n * returns the extension name.\n *\n * @example\n * ```js\n * getExtensionNameFromId(\"foo#bar\")\n * --> \"foo\"\n * getExtensionNameFromId(\"baz\")\n * --> \"baz\"\n * ```\n */ function getExtensionNameFromId(extensionId) {\n const [extensionName] = extensionId.split('#');\n return extensionName;\n}\nfunction getExtensionRegistrationFrom(state, extensionId) {\n const name = getExtensionNameFromId(extensionId);\n return state.extensions[name];\n}\nfunction getExtensionRegistration(extensionId) {\n const state = extensionInternalStore.getState();\n return getExtensionRegistrationFrom(state, extensionId);\n}\n/**\n * Extensions must be registered in order to be rendered.\n * This is handled by the app shell, when extensions are provided\n * via the `routes.json` file and registered through `registerApp()`.\n * @internal\n */ const registerExtension = (extensionRegistration)=>extensionInternalStore.setState((state)=>{\n state.extensions[extensionRegistration.name] = {\n ...extensionRegistration,\n instances: []\n };\n return state;\n });\n/**\n * Attach an extension to an extension slot.\n *\n * This will cause the extension to be rendered into the specified\n * extension slot, unless it is removed by configuration. Using\n * `attach` is an alternative to specifying the `slot` or `slots`\n * in the extension declaration.\n *\n * It is particularly useful when creating a slot into which\n * you want to render an existing extension. This enables you\n * to do so without modifying the extension's declaration, which\n * may be impractical or inappropriate, for example if you are\n * writing a module for a specific implementation.\n *\n * @param slotName a name uniquely identifying the slot\n * @param extensionId an extension name, with an optional #-suffix\n * to distinguish it from other instances of the same extension\n * attached to the same slot.\n */ function attach(slotName, extensionId) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[slotName];\n if (!existingSlot) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...createNewExtensionSlotInfo(slotName),\n attachedIds: [\n extensionId\n ]\n }\n }\n };\n } else {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...existingSlot,\n attachedIds: [\n ...existingSlot.attachedIds,\n extensionId\n ]\n }\n }\n };\n }\n });\n}\n/**\n * @deprecated Avoid using this. Extension attachments should be considered declarative.\n */ function detach(extensionSlotName, extensionId) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[extensionSlotName];\n if (existingSlot && existingSlot.attachedIds.includes(extensionId)) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [extensionSlotName]: {\n ...existingSlot,\n attachedIds: existingSlot.attachedIds.filter((id)=>id !== extensionId)\n }\n }\n };\n } else {\n return state;\n }\n });\n}\n/**\n * @deprecated Avoid using this. Extension attachments should be considered declarative.\n */ function detachAll(extensionSlotName) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[extensionSlotName];\n if (existingSlot) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [extensionSlotName]: {\n ...existingSlot,\n attachedIds: []\n }\n }\n };\n } else {\n return state;\n }\n });\n}\n/**\n * Get an order index for the extension. This will\n * come from either its configured order, its registered order\n * parameter, or the order in which it happened to be attached.\n */ function getOrder(extensionId, configuredOrder, registeredOrderIndex, attachedOrder) {\n const configuredIndex = configuredOrder.indexOf(extensionId);\n if (configuredIndex !== -1) {\n return configuredIndex;\n } else if (registeredOrderIndex !== undefined) {\n // extensions that don't have a configured order should appear after those that do\n return 1000 + registeredOrderIndex;\n } else {\n const assignedIndex = attachedOrder.indexOf(extensionId);\n if (assignedIndex !== -1) {\n // extensions that have neither a configured nor registered order should appear\n // after all others\n return 2000 + assignedIndex;\n } else {\n return -1;\n }\n }\n}\nfunction getAssignedExtensionsFromSlotData(slotName, internalState, config, extensionConfigStoreState, enabledFeatureFlags, isOnline, session) {\n const attachedIds = internalState.slots[slotName].attachedIds;\n const assignedIds = calculateAssignedIds(config, attachedIds);\n const extensions = [];\n // Create context once for all extensions in this slot\n const slotState = internalState.slots[slotName]?.state;\n const expressionContext = slotState && typeof slotState === 'object' ? {\n session,\n ...slotState\n } : {\n session\n };\n for (let id of assignedIds){\n const { config: rawExtensionConfig } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromStore)(extensionConfigStoreState, slotName, id);\n const rawExtensionSlotExtensionConfig = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromExtensionSlotStore)(config, slotName, id);\n const extensionConfig = (0,lodash_es__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(rawExtensionConfig, rawExtensionSlotExtensionConfig);\n const name = getExtensionNameFromId(id);\n const extension = internalState.extensions[name];\n // if the extension has not been registered yet, do not include it\n if (extension) {\n const requiredPrivileges = extensionConfig?.['Display conditions']?.privileges ?? extension.privileges ?? [];\n if (requiredPrivileges && (typeof requiredPrivileges === 'string' || Array.isArray(requiredPrivileges) && requiredPrivileges.length > 0)) {\n if (!session?.user) {\n continue;\n }\n if (!(0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.userHasAccess)(requiredPrivileges, session.user)) {\n continue;\n }\n }\n const displayConditionExpression = extensionConfig?.['Display conditions']?.expression || extension.displayExpression;\n if (displayConditionExpression !== undefined && typeof displayConditionExpression === 'string' && displayConditionExpression.trim().length > 0) {\n try {\n if (!(0,_openmrs_esm_expression_evaluator__WEBPACK_IMPORTED_MODULE_9__.evaluateAsBoolean)(displayConditionExpression, expressionContext)) {\n continue;\n }\n } catch (e) {\n console.error(`Error while evaluating expression '${displayConditionExpression}' for extension ${name} in slot ${slotName}`, e);\n continue;\n }\n }\n if (extension.featureFlag && !enabledFeatureFlags.includes(extension.featureFlag)) {\n continue;\n }\n if (window.offlineEnabled && !(0,_helpers_js__WEBPACK_IMPORTED_MODULE_4__.checkStatusFor)(isOnline, extension.online, extension.offline)) {\n continue;\n }\n extensions.push({\n id,\n name,\n moduleName: extension.moduleName,\n config: extensionConfig,\n featureFlag: extension.featureFlag,\n meta: extension.meta,\n online: extensionConfig?.['Display conditions']?.online ?? extension.online ?? true,\n offline: extensionConfig?.['Display conditions']?.offline ?? extension.offline ?? false\n });\n }\n }\n return extensions;\n}\n/**\n * Gets the list of extensions assigned to a given slot\n *\n * @param slotName The slot to load the assigned extensions for\n * @returns An array of extensions assigned to the named slot\n */ function getAssignedExtensions(slotName) {\n const internalState = extensionInternalStore.getState();\n const { config: slotConfig } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfig)(slotName);\n const extensionStoreState = extensionsConfigStore.getState();\n const featureFlagState = _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState();\n const sessionState = _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState();\n const isOnline = (0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__.isOnline)();\n const enabledFeatureFlags = Object.entries(featureFlagState.flags).filter(([, { enabled }])=>enabled).map(([name])=>name);\n return getAssignedExtensionsFromSlotData(slotName, internalState, slotConfig, extensionStoreState, enabledFeatureFlags, isOnline, sessionState.session);\n}\nfunction calculateAssignedIds(config, attachedIds) {\n const addedIds = config.add || [];\n const removedIds = config.remove || [];\n const idOrder = config.order || [];\n const { extensions } = extensionInternalStore.getState();\n return [\n ...attachedIds,\n ...addedIds\n ].filter((id)=>!removedIds.includes(id)).sort((idA, idB)=>{\n const ai = getOrder(idA, idOrder, extensions[getExtensionNameFromId(idA)]?.order, attachedIds);\n const bi = getOrder(idB, idOrder, extensions[getExtensionNameFromId(idB)]?.order, attachedIds);\n if (bi === -1) {\n return -1;\n } else if (ai === -1) {\n return 1;\n } else {\n return ai - bi;\n }\n });\n}\n/**\n * Used by by extension slots at mount time.\n *\n * @param moduleName The name of the module that contains the extension slot\n * @param slotName The extension slot name that is actually used\n * @param state Optional custom state for the slot, which will be stored in the extension store.\n * @internal\n */ const registerExtensionSlot = (moduleName, slotName, state)=>extensionInternalStore.setState((currentState)=>{\n const existingModuleName = currentState.slots[slotName]?.moduleName;\n if (existingModuleName && existingModuleName != moduleName) {\n console.warn(`An extension slot with the name '${slotName}' already exists. Refusing to register the same slot name twice (in \"registerExtensionSlot\"). The existing one is from module ${existingModuleName}.`);\n return currentState;\n }\n if (existingModuleName && existingModuleName == moduleName) {\n // Re-rendering an existing slot\n return currentState;\n }\n if (currentState.slots[slotName]) {\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...currentState.slots[slotName],\n moduleName,\n state\n }\n }\n };\n }\n const slot = createNewExtensionSlotInfo(slotName, moduleName, state);\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...slot\n }\n }\n };\n });\n/**\n * Used by extension slots to update the copy of the state for the extension slot\n *\n * @param slotName The name of the slot with state to update\n * @param state A copy of the new state\n * @param partial Whether this should be applied as a partial\n */ function updateExtensionSlotState(slotName, state, partial = false) {\n extensionInternalStore.setState((currentState)=>{\n const newState = partial ? (0,lodash_es__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(currentState.slots[slotName].state, state) : state;\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...currentState.slots[slotName],\n state: newState\n }\n }\n };\n });\n}\n/**\n * @internal\n * Just for testing.\n */ const reset = ()=>extensionStore.setState(()=>{\n return {\n slots: {},\n extensions: {}\n };\n });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvZXh0ZW5zaW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnQ0FBZ0MsR0FBRzs7Ozs7OztDQU9sQyxHQUFrRTtBQUMwSjtBQUN2SjtBQUNQO0FBQ0s7QUFDUjtBQUNqQjtBQUNHO0FBQzBEO0FBQ3hHLE1BQU1tQix5QkFBeUJILG9FQUF5QkE7QUFDeEQsTUFBTUksaUJBQWlCSCw0REFBaUJBO0FBQ3hDLE1BQU1JLG1CQUFtQmYsaUZBQTRCQTtBQUNyRCxNQUFNZ0Isd0JBQXdCZiw2RUFBd0JBO0FBQ3RELGdDQUFnQztBQUNoQyxTQUFTZ0IsMkJBQTJCQyxhQUFhLEVBQUVDLG9CQUFvQixFQUFFSCxxQkFBcUIsRUFBRUksZ0JBQWdCLEVBQUUxQixZQUFZO0lBQzFILE1BQU0yQixRQUFRLENBQUM7SUFDZixNQUFNaEIsV0FBV0MsNERBQVVBO0lBQzNCLE1BQU1nQixzQkFBc0JDLE9BQU9DLE9BQU8sQ0FBQ0osaUJBQWlCSyxLQUFLLEVBQUVDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRUMsT0FBTyxFQUFFLENBQUMsR0FBR0EsU0FBU0MsR0FBRyxDQUFDLENBQUMsQ0FBQ0MsS0FBSyxHQUFHQTtJQUNwSCxLQUFLLElBQUksQ0FBQ0MsVUFBVUMsS0FBSyxJQUFJUixPQUFPQyxPQUFPLENBQUNOLGNBQWNHLEtBQUssRUFBRTtRQUM3RCxNQUFNLEVBQUVXLE1BQU0sRUFBRSxHQUFHakMsb0ZBQStCQSxDQUFDb0Isc0JBQXNCWSxLQUFLRixJQUFJO1FBQ2xGLE1BQU1JLHFCQUFxQkMsa0NBQWtDSixVQUFVWixlQUFlYyxRQUFRaEIsdUJBQXVCTSxxQkFBcUJqQixVQUFVWCxhQUFheUMsT0FBTztRQUN4S2QsS0FBSyxDQUFDUyxTQUFTLEdBQUc7WUFDZE0sWUFBWUwsS0FBS0ssVUFBVTtZQUMzQkg7UUFDSjtJQUNKO0lBQ0EsSUFBSSxDQUFDMUIscURBQU9BLENBQUNPLGVBQWV1QixRQUFRLEdBQUdoQixLQUFLLEVBQUVBLFFBQVE7UUFDbERQLGVBQWV3QixRQUFRLENBQUM7WUFDcEJqQjtRQUNKO0lBQ0o7QUFDSjtBQUNBUix1QkFBdUIwQixTQUFTLENBQUMsQ0FBQ0M7SUFDOUJ2QiwyQkFBMkJ1QixlQUFlekIsaUJBQWlCc0IsUUFBUSxJQUFJckIsc0JBQXNCcUIsUUFBUSxJQUFJbEMseUVBQWlCQSxDQUFDa0MsUUFBUSxJQUFJM0MsMERBQVlBLENBQUMyQyxRQUFRO0FBQ2hLO0FBQ0F0QixpQkFBaUJ3QixTQUFTLENBQUMsQ0FBQ0U7SUFDeEJ4QiwyQkFBMkJKLHVCQUF1QndCLFFBQVEsSUFBSUksYUFBYXpCLHNCQUFzQnFCLFFBQVEsSUFBSWxDLHlFQUFpQkEsQ0FBQ2tDLFFBQVEsSUFBSTNDLDBEQUFZQSxDQUFDMkMsUUFBUTtBQUNwSztBQUNBckIsc0JBQXNCdUIsU0FBUyxDQUFDLENBQUNHO0lBQzdCekIsMkJBQTJCSix1QkFBdUJ3QixRQUFRLElBQUl0QixpQkFBaUJzQixRQUFRLElBQUlLLGtCQUFrQnZDLHlFQUFpQkEsQ0FBQ2tDLFFBQVEsSUFBSTNDLDBEQUFZQSxDQUFDMkMsUUFBUTtBQUNwSztBQUNBbEMseUVBQWlCQSxDQUFDb0MsU0FBUyxDQUFDLENBQUNuQjtJQUN6QkgsMkJBQTJCSix1QkFBdUJ3QixRQUFRLElBQUl0QixpQkFBaUJzQixRQUFRLElBQUlyQixzQkFBc0JxQixRQUFRLElBQUlqQixrQkFBa0IxQiwwREFBWUEsQ0FBQzJDLFFBQVE7QUFDeEs7QUFDQTNDLDBEQUFZQSxDQUFDNkMsU0FBUyxDQUFDLENBQUNKO0lBQ3BCbEIsMkJBQTJCSix1QkFBdUJ3QixRQUFRLElBQUl0QixpQkFBaUJzQixRQUFRLElBQUlyQixzQkFBc0JxQixRQUFRLElBQUlsQyx5RUFBaUJBLENBQUNrQyxRQUFRLElBQUlGO0FBQy9KO0FBQ0EsU0FBU1E7SUFDTDFCLDJCQUEyQkosdUJBQXVCd0IsUUFBUSxJQUFJdEIsaUJBQWlCc0IsUUFBUSxJQUFJckIsc0JBQXNCcUIsUUFBUSxJQUFJbEMseUVBQWlCQSxDQUFDa0MsUUFBUSxJQUFJM0MsMERBQVlBLENBQUMyQyxRQUFRO0FBQ3BMO0FBQ0FNO0FBQ0F2QyxrRkFBNEJBLENBQUN1QztBQUM3QixTQUFTQywyQkFBMkJkLFFBQVEsRUFBRU0sVUFBVSxFQUFFUyxLQUFLO0lBQzNELE9BQU87UUFDSFQ7UUFDQVAsTUFBTUM7UUFDTmdCLGFBQWEsRUFBRTtRQUNmZCxRQUFRO1FBQ1JhO0lBQ0o7QUFDSjtBQUNBOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUFVLFNBQVNFLHVCQUF1QkMsV0FBVztJQUNsRCxNQUFNLENBQUNDLGNBQWMsR0FBR0QsWUFBWUUsS0FBSyxDQUFDO0lBQzFDLE9BQU9EO0FBQ1g7QUFDTyxTQUFTRSw2QkFBNkJOLEtBQUssRUFBRUcsV0FBVztJQUMzRCxNQUFNbkIsT0FBT2tCLHVCQUF1QkM7SUFDcEMsT0FBT0gsTUFBTU8sVUFBVSxDQUFDdkIsS0FBSztBQUNqQztBQUNPLFNBQVN3Qix5QkFBeUJMLFdBQVc7SUFDaEQsTUFBTUgsUUFBUWhDLHVCQUF1QndCLFFBQVE7SUFDN0MsT0FBT2MsNkJBQTZCTixPQUFPRztBQUMvQztBQUNBOzs7OztDQUtDLEdBQVUsTUFBTU0sb0JBQW9CLENBQUNDLHdCQUF3QjFDLHVCQUF1QnlCLFFBQVEsQ0FBQyxDQUFDTztRQUN2RkEsTUFBTU8sVUFBVSxDQUFDRyxzQkFBc0IxQixJQUFJLENBQUMsR0FBRztZQUMzQyxHQUFHMEIscUJBQXFCO1lBQ3hCQyxXQUFXLEVBQUU7UUFDakI7UUFDQSxPQUFPWDtJQUNYLEdBQUc7QUFDUDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBQVUsU0FBU1ksT0FBTzNCLFFBQVEsRUFBRWtCLFdBQVc7SUFDNUNwQyx1RUFBNEJBLENBQUMsQ0FBQ2lDO1FBQzFCLE1BQU1hLGVBQWViLE1BQU14QixLQUFLLENBQUNTLFNBQVM7UUFDMUMsSUFBSSxDQUFDNEIsY0FBYztZQUNmLE9BQU87Z0JBQ0gsR0FBR2IsS0FBSztnQkFDUnhCLE9BQU87b0JBQ0gsR0FBR3dCLE1BQU14QixLQUFLO29CQUNkLENBQUNTLFNBQVMsRUFBRTt3QkFDUixHQUFHYywyQkFBMkJkLFNBQVM7d0JBQ3ZDZ0IsYUFBYTs0QkFDVEU7eUJBQ0g7b0JBQ0w7Z0JBQ0o7WUFDSjtRQUNKLE9BQU87WUFDSCxPQUFPO2dCQUNILEdBQUdILEtBQUs7Z0JBQ1J4QixPQUFPO29CQUNILEdBQUd3QixNQUFNeEIsS0FBSztvQkFDZCxDQUFDUyxTQUFTLEVBQUU7d0JBQ1IsR0FBRzRCLFlBQVk7d0JBQ2ZaLGFBQWE7K0JBQ05ZLGFBQWFaLFdBQVc7NEJBQzNCRTt5QkFDSDtvQkFDTDtnQkFDSjtZQUNKO1FBQ0o7SUFDSjtBQUNKO0FBQ0E7O0NBRUMsR0FBVSxTQUFTVyxPQUFPQyxpQkFBaUIsRUFBRVosV0FBVztJQUNyRHBDLHVFQUE0QkEsQ0FBQyxDQUFDaUM7UUFDMUIsTUFBTWEsZUFBZWIsTUFBTXhCLEtBQUssQ0FBQ3VDLGtCQUFrQjtRQUNuRCxJQUFJRixnQkFBZ0JBLGFBQWFaLFdBQVcsQ0FBQ2UsUUFBUSxDQUFDYixjQUFjO1lBQ2hFLE9BQU87Z0JBQ0gsR0FBR0gsS0FBSztnQkFDUnhCLE9BQU87b0JBQ0gsR0FBR3dCLE1BQU14QixLQUFLO29CQUNkLENBQUN1QyxrQkFBa0IsRUFBRTt3QkFDakIsR0FBR0YsWUFBWTt3QkFDZlosYUFBYVksYUFBYVosV0FBVyxDQUFDcEIsTUFBTSxDQUFDLENBQUNvQyxLQUFLQSxPQUFPZDtvQkFDOUQ7Z0JBQ0o7WUFDSjtRQUNKLE9BQU87WUFDSCxPQUFPSDtRQUNYO0lBQ0o7QUFDSjtBQUNBOztDQUVDLEdBQVUsU0FBU2tCLFVBQVVILGlCQUFpQjtJQUMzQ2hELHVFQUE0QkEsQ0FBQyxDQUFDaUM7UUFDMUIsTUFBTWEsZUFBZWIsTUFBTXhCLEtBQUssQ0FBQ3VDLGtCQUFrQjtRQUNuRCxJQUFJRixjQUFjO1lBQ2QsT0FBTztnQkFDSCxHQUFHYixLQUFLO2dCQUNSeEIsT0FBTztvQkFDSCxHQUFHd0IsTUFBTXhCLEtBQUs7b0JBQ2QsQ0FBQ3VDLGtCQUFrQixFQUFFO3dCQUNqQixHQUFHRixZQUFZO3dCQUNmWixhQUFhLEVBQUU7b0JBQ25CO2dCQUNKO1lBQ0o7UUFDSixPQUFPO1lBQ0gsT0FBT0Q7UUFDWDtJQUNKO0FBQ0o7QUFDQTs7OztDQUlDLEdBQUcsU0FBU21CLFNBQVNoQixXQUFXLEVBQUVpQixlQUFlLEVBQUVDLG9CQUFvQixFQUFFQyxhQUFhO0lBQ25GLE1BQU1DLGtCQUFrQkgsZ0JBQWdCSSxPQUFPLENBQUNyQjtJQUNoRCxJQUFJb0Isb0JBQW9CLENBQUMsR0FBRztRQUN4QixPQUFPQTtJQUNYLE9BQU8sSUFBSUYseUJBQXlCSSxXQUFXO1FBQzNDLGtGQUFrRjtRQUNsRixPQUFPLE9BQU9KO0lBQ2xCLE9BQU87UUFDSCxNQUFNSyxnQkFBZ0JKLGNBQWNFLE9BQU8sQ0FBQ3JCO1FBQzVDLElBQUl1QixrQkFBa0IsQ0FBQyxHQUFHO1lBQ3RCLCtFQUErRTtZQUMvRSxtQkFBbUI7WUFDbkIsT0FBTyxPQUFPQTtRQUNsQixPQUFPO1lBQ0gsT0FBTyxDQUFDO1FBQ1o7SUFDSjtBQUNKO0FBQ0EsU0FBU3JDLGtDQUFrQ0osUUFBUSxFQUFFWixhQUFhLEVBQUVjLE1BQU0sRUFBRXdDLHlCQUF5QixFQUFFbEQsbUJBQW1CLEVBQUVqQixRQUFRLEVBQUU4QixPQUFPO0lBQ3pJLE1BQU1XLGNBQWM1QixjQUFjRyxLQUFLLENBQUNTLFNBQVMsQ0FBQ2dCLFdBQVc7SUFDN0QsTUFBTTJCLGNBQWNDLHFCQUFxQjFDLFFBQVFjO0lBQ2pELE1BQU1NLGFBQWEsRUFBRTtJQUNyQixzREFBc0Q7SUFDdEQsTUFBTXVCLFlBQVl6RCxjQUFjRyxLQUFLLENBQUNTLFNBQVMsRUFBRWU7SUFDakQsTUFBTStCLG9CQUFvQkQsYUFBYSxPQUFPQSxjQUFjLFdBQVc7UUFDbkV4QztRQUNBLEdBQUd3QyxTQUFTO0lBQ2hCLElBQUk7UUFDQXhDO0lBQ0o7SUFDQSxLQUFLLElBQUkyQixNQUFNVyxZQUFZO1FBQ3ZCLE1BQU0sRUFBRXpDLFFBQVE2QyxrQkFBa0IsRUFBRSxHQUFHaEYsZ0ZBQTJCQSxDQUFDMkUsMkJBQTJCMUMsVUFBVWdDO1FBQ3hHLE1BQU1nQixrQ0FBa0NsRiw2RkFBd0NBLENBQUNvQyxRQUFRRixVQUFVZ0M7UUFDbkcsTUFBTWlCLGtCQUFrQnZFLHFEQUFLQSxDQUFDcUUsb0JBQW9CQztRQUNsRCxNQUFNakQsT0FBT2tCLHVCQUF1QmU7UUFDcEMsTUFBTWtCLFlBQVk5RCxjQUFja0MsVUFBVSxDQUFDdkIsS0FBSztRQUNoRCxrRUFBa0U7UUFDbEUsSUFBSW1ELFdBQVc7WUFDWCxNQUFNQyxxQkFBcUJGLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFRyxjQUFjRixVQUFVRSxVQUFVLElBQUksRUFBRTtZQUM1RyxJQUFJRCxzQkFBdUIsUUFBT0EsdUJBQXVCLFlBQVlFLE1BQU1DLE9BQU8sQ0FBQ0gsdUJBQXVCQSxtQkFBbUJJLE1BQU0sR0FBRyxJQUFJO2dCQUN0SSxJQUFJLENBQUNsRCxTQUFTbUQsTUFBTTtvQkFDaEI7Z0JBQ0o7Z0JBQ0EsSUFBSSxDQUFDM0YsK0RBQWFBLENBQUNzRixvQkFBb0I5QyxRQUFRbUQsSUFBSSxHQUFHO29CQUNsRDtnQkFDSjtZQUNKO1lBQ0EsTUFBTUMsNkJBQTZCUixpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRVMsY0FBY1IsVUFBVVMsaUJBQWlCO1lBQ3JILElBQUlGLCtCQUErQmpCLGFBQWEsT0FBT2lCLCtCQUErQixZQUFZQSwyQkFBMkJHLElBQUksR0FBR0wsTUFBTSxHQUFHLEdBQUc7Z0JBQzVJLElBQUk7b0JBQ0EsSUFBSSxDQUFDbkYsb0ZBQWlCQSxDQUFDcUYsNEJBQTRCWCxvQkFBb0I7d0JBQ25FO29CQUNKO2dCQUNKLEVBQUUsT0FBT2UsR0FBRztvQkFDUkMsUUFBUUMsS0FBSyxDQUFDLENBQUMsbUNBQW1DLEVBQUVOLDJCQUEyQixnQkFBZ0IsRUFBRTFELEtBQUssU0FBUyxFQUFFQyxVQUFVLEVBQUU2RDtvQkFDN0g7Z0JBQ0o7WUFDSjtZQUNBLElBQUlYLFVBQVVjLFdBQVcsSUFBSSxDQUFDeEUsb0JBQW9CdUMsUUFBUSxDQUFDbUIsVUFBVWMsV0FBVyxHQUFHO2dCQUMvRTtZQUNKO1lBQ0EsSUFBSUMsT0FBT0MsY0FBYyxJQUFJLENBQUN2RiwyREFBY0EsQ0FBQ0osVUFBVTJFLFVBQVVpQixNQUFNLEVBQUVqQixVQUFVa0IsT0FBTyxHQUFHO2dCQUN6RjtZQUNKO1lBQ0E5QyxXQUFXK0MsSUFBSSxDQUFDO2dCQUNackM7Z0JBQ0FqQztnQkFDQU8sWUFBWTRDLFVBQVU1QyxVQUFVO2dCQUNoQ0osUUFBUStDO2dCQUNSZSxhQUFhZCxVQUFVYyxXQUFXO2dCQUNsQ00sTUFBTXBCLFVBQVVvQixJQUFJO2dCQUNwQkgsUUFBUWxCLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFa0IsVUFBVWpCLFVBQVVpQixNQUFNLElBQUk7Z0JBQy9FQyxTQUFTbkIsaUJBQWlCLENBQUMscUJBQXFCLEVBQUVtQixXQUFXbEIsVUFBVWtCLE9BQU8sSUFBSTtZQUN0RjtRQUNKO0lBQ0o7SUFDQSxPQUFPOUM7QUFDWDtBQUNBOzs7OztDQUtDLEdBQVUsU0FBU2lELHNCQUFzQnZFLFFBQVE7SUFDOUMsTUFBTVosZ0JBQWdCTCx1QkFBdUJ3QixRQUFRO0lBQ3JELE1BQU0sRUFBRUwsUUFBUXNFLFVBQVUsRUFBRSxHQUFHeEcsMkVBQXNCQSxDQUFDZ0M7SUFDdEQsTUFBTXlFLHNCQUFzQnZGLHNCQUFzQnFCLFFBQVE7SUFDMUQsTUFBTW1FLG1CQUFtQnJHLHlFQUFpQkEsQ0FBQ2tDLFFBQVE7SUFDbkQsTUFBTW9FLGVBQWUvRywwREFBWUEsQ0FBQzJDLFFBQVE7SUFDMUMsTUFBTWhDLFdBQVdDLDREQUFVQTtJQUMzQixNQUFNZ0Isc0JBQXNCQyxPQUFPQyxPQUFPLENBQUNnRixpQkFBaUIvRSxLQUFLLEVBQUVDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRUMsT0FBTyxFQUFFLENBQUMsR0FBR0EsU0FBU0MsR0FBRyxDQUFDLENBQUMsQ0FBQ0MsS0FBSyxHQUFHQTtJQUNwSCxPQUFPSyxrQ0FBa0NKLFVBQVVaLGVBQWVvRixZQUFZQyxxQkFBcUJqRixxQkFBcUJqQixVQUFVb0csYUFBYXRFLE9BQU87QUFDMUo7QUFDQSxTQUFTdUMscUJBQXFCMUMsTUFBTSxFQUFFYyxXQUFXO0lBQzdDLE1BQU00RCxXQUFXMUUsT0FBTzJFLEdBQUcsSUFBSSxFQUFFO0lBQ2pDLE1BQU1DLGFBQWE1RSxPQUFPNkUsTUFBTSxJQUFJLEVBQUU7SUFDdEMsTUFBTUMsVUFBVTlFLE9BQU8rRSxLQUFLLElBQUksRUFBRTtJQUNsQyxNQUFNLEVBQUUzRCxVQUFVLEVBQUUsR0FBR3ZDLHVCQUF1QndCLFFBQVE7SUFDdEQsT0FBTztXQUNBUztXQUNBNEQ7S0FDTixDQUFDaEYsTUFBTSxDQUFDLENBQUNvQyxLQUFLLENBQUM4QyxXQUFXL0MsUUFBUSxDQUFDQyxLQUFLa0QsSUFBSSxDQUFDLENBQUNDLEtBQUtDO1FBQ2hELE1BQU1DLEtBQUtuRCxTQUFTaUQsS0FBS0gsU0FBUzFELFVBQVUsQ0FBQ0wsdUJBQXVCa0UsS0FBSyxFQUFFRixPQUFPakU7UUFDbEYsTUFBTXNFLEtBQUtwRCxTQUFTa0QsS0FBS0osU0FBUzFELFVBQVUsQ0FBQ0wsdUJBQXVCbUUsS0FBSyxFQUFFSCxPQUFPakU7UUFDbEYsSUFBSXNFLE9BQU8sQ0FBQyxHQUFHO1lBQ1gsT0FBTyxDQUFDO1FBQ1osT0FBTyxJQUFJRCxPQUFPLENBQUMsR0FBRztZQUNsQixPQUFPO1FBQ1gsT0FBTztZQUNILE9BQU9BLEtBQUtDO1FBQ2hCO0lBQ0o7QUFDSjtBQUNBOzs7Ozs7O0NBT0MsR0FBVSxNQUFNQyx3QkFBd0IsQ0FBQ2pGLFlBQVlOLFVBQVVlLFFBQVFoQyx1QkFBdUJ5QixRQUFRLENBQUMsQ0FBQ2dGO1FBQ2pHLE1BQU1DLHFCQUFxQkQsYUFBYWpHLEtBQUssQ0FBQ1MsU0FBUyxFQUFFTTtRQUN6RCxJQUFJbUYsc0JBQXNCQSxzQkFBc0JuRixZQUFZO1lBQ3hEd0QsUUFBUTRCLElBQUksQ0FBQyxDQUFDLGlDQUFpQyxFQUFFMUYsU0FBUyw4SEFBOEgsRUFBRXlGLG1CQUFtQixDQUFDLENBQUM7WUFDL00sT0FBT0Q7UUFDWDtRQUNBLElBQUlDLHNCQUFzQkEsc0JBQXNCbkYsWUFBWTtZQUN4RCxnQ0FBZ0M7WUFDaEMsT0FBT2tGO1FBQ1g7UUFDQSxJQUFJQSxhQUFhakcsS0FBSyxDQUFDUyxTQUFTLEVBQUU7WUFDOUIsT0FBTztnQkFDSCxHQUFHd0YsWUFBWTtnQkFDZmpHLE9BQU87b0JBQ0gsR0FBR2lHLGFBQWFqRyxLQUFLO29CQUNyQixDQUFDUyxTQUFTLEVBQUU7d0JBQ1IsR0FBR3dGLGFBQWFqRyxLQUFLLENBQUNTLFNBQVM7d0JBQy9CTTt3QkFDQVM7b0JBQ0o7Z0JBQ0o7WUFDSjtRQUNKO1FBQ0EsTUFBTWQsT0FBT2EsMkJBQTJCZCxVQUFVTSxZQUFZUztRQUM5RCxPQUFPO1lBQ0gsR0FBR3lFLFlBQVk7WUFDZmpHLE9BQU87Z0JBQ0gsR0FBR2lHLGFBQWFqRyxLQUFLO2dCQUNyQixDQUFDUyxTQUFTLEVBQUU7b0JBQ1IsR0FBR0MsSUFBSTtnQkFDWDtZQUNKO1FBQ0o7SUFDSixHQUFHO0FBQ1A7Ozs7OztDQU1DLEdBQVUsU0FBUzBGLHlCQUF5QjNGLFFBQVEsRUFBRWUsS0FBSyxFQUFFNkUsVUFBVSxLQUFLO0lBQ3pFN0csdUJBQXVCeUIsUUFBUSxDQUFDLENBQUNnRjtRQUM3QixNQUFNSyxXQUFXRCxVQUFVbEgscURBQUtBLENBQUM4RyxhQUFhakcsS0FBSyxDQUFDUyxTQUFTLENBQUNlLEtBQUssRUFBRUEsU0FBU0E7UUFDOUUsT0FBTztZQUNILEdBQUd5RSxZQUFZO1lBQ2ZqRyxPQUFPO2dCQUNILEdBQUdpRyxhQUFhakcsS0FBSztnQkFDckIsQ0FBQ1MsU0FBUyxFQUFFO29CQUNSLEdBQUd3RixhQUFhakcsS0FBSyxDQUFDUyxTQUFTO29CQUMvQmUsT0FBTzhFO2dCQUNYO1lBQ0o7UUFDSjtJQUNKO0FBQ0o7QUFDQTs7O0NBR0MsR0FBVSxNQUFNQyxRQUFRLElBQUk5RyxlQUFld0IsUUFBUSxDQUFDO1FBQzdDLE9BQU87WUFDSGpCLE9BQU8sQ0FBQztZQUNSK0IsWUFBWSxDQUFDO1FBQ2pCO0lBQ0osR0FBRyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvZXh0ZW5zaW9ucy5qcz9jMGU3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBFeHRlbnNpb24gKi8gLypcbiAqIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBleHRlbnNpb24gbW9kZXM6XG4gKlxuICogLSBhdHRhY2hlZCAoc2V0IHZpYSBjb2RlIGluIGZvcm0gb2Y6IGF0dGFjaCwgZGV0YWNoLCAuLi4pXG4gKiAtIGNvbmZpZ3VyZWQgKHNldCB2aWEgY29uZmlndXJhdGlvbiBpbiBmb3JtIG9mOiBhZGRlZCwgcmVtb3ZlZCwgLi4uKVxuICogLSBhc3NpZ25lZCAoY29tcHV0ZWQgZnJvbSBhdHRhY2hlZCBhbmQgY29uZmlndXJlZClcbiAqIC0gY29ubmVjdGVkIChjb21wdXRlZCBmcm9tIGFzc2lnbmVkIHVzaW5nIGNvbm5lY3Rpdml0eSBhbmQgb25saW5lIC8gb2ZmbGluZSlcbiAqLyBpbXBvcnQgeyBzZXNzaW9uU3RvcmUsIHVzZXJIYXNBY2Nlc3MgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWFwaVwiO1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbUV4dGVuc2lvblNsb3RTdG9yZSwgZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlLCBnZXRFeHRlbnNpb25TbG90Q29uZmlnLCBnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlLCBnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlLCBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZXZhbHVhdGVBc0Jvb2xlYW4gfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWV4cHJlc3Npb24tZXZhbHVhdG9yXCI7XG5pbXBvcnQgeyBmZWF0dXJlRmxhZ3NTdG9yZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tZmVhdHVyZS1mbGFnc1wiO1xuaW1wb3J0IHsgc3Vic2NyaWJlQ29ubmVjdGl2aXR5Q2hhbmdlZCB9IGZyb20gXCJAb3Blbm1ycy9lc20tZ2xvYmFsc1wiO1xuaW1wb3J0IHsgaXNPbmxpbmUgYXMgaXNPbmxpbmVGbiB9IGZyb20gXCJAb3Blbm1ycy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGlzRXF1YWwsIG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY2hlY2tTdGF0dXNGb3IgfSBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5pbXBvcnQgeyBnZXRFeHRlbnNpb25JbnRlcm5hbFN0b3JlLCBnZXRFeHRlbnNpb25TdG9yZSwgdXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSB9IGZyb20gXCIuL3N0b3JlLmpzXCI7XG5jb25zdCBleHRlbnNpb25JbnRlcm5hbFN0b3JlID0gZ2V0RXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSgpO1xuY29uc3QgZXh0ZW5zaW9uU3RvcmUgPSBnZXRFeHRlbnNpb25TdG9yZSgpO1xuY29uc3Qgc2xvdHNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKTtcbmNvbnN0IGV4dGVuc2lvbnNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSgpO1xuLy8gS2VlcCB0aGUgb3V0cHV0IHN0b3JlIHVwZGF0ZWRcbmZ1bmN0aW9uIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGludGVybmFsU3RhdGUsIGV4dGVuc2lvblNsb3RDb25maWdzLCBleHRlbnNpb25zQ29uZmlnU3RvcmUsIGZlYXR1cmVGbGFnU3RvcmUsIHNlc3Npb25TdG9yZSkge1xuICAgIGNvbnN0IHNsb3RzID0ge307XG4gICAgY29uc3QgaXNPbmxpbmUgPSBpc09ubGluZUZuKCk7XG4gICAgY29uc3QgZW5hYmxlZEZlYXR1cmVGbGFncyA9IE9iamVjdC5lbnRyaWVzKGZlYXR1cmVGbGFnU3RvcmUuZmxhZ3MpLmZpbHRlcigoWywgeyBlbmFibGVkIH1dKT0+ZW5hYmxlZCkubWFwKChbbmFtZV0pPT5uYW1lKTtcbiAgICBmb3IgKGxldCBbc2xvdE5hbWUsIHNsb3RdIG9mIE9iamVjdC5lbnRyaWVzKGludGVybmFsU3RhdGUuc2xvdHMpKXtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldEV4dGVuc2lvblNsb3RDb25maWdGcm9tU3RvcmUoZXh0ZW5zaW9uU2xvdENvbmZpZ3MsIHNsb3QubmFtZSk7XG4gICAgICAgIGNvbnN0IGFzc2lnbmVkRXh0ZW5zaW9ucyA9IGdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YShzbG90TmFtZSwgaW50ZXJuYWxTdGF0ZSwgY29uZmlnLCBleHRlbnNpb25zQ29uZmlnU3RvcmUsIGVuYWJsZWRGZWF0dXJlRmxhZ3MsIGlzT25saW5lLCBzZXNzaW9uU3RvcmUuc2Vzc2lvbik7XG4gICAgICAgIHNsb3RzW3Nsb3ROYW1lXSA9IHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6IHNsb3QubW9kdWxlTmFtZSxcbiAgICAgICAgICAgIGFzc2lnbmVkRXh0ZW5zaW9uc1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoIWlzRXF1YWwoZXh0ZW5zaW9uU3RvcmUuZ2V0U3RhdGUoKS5zbG90cywgc2xvdHMpKSB7XG4gICAgICAgIGV4dGVuc2lvblN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNsb3RzXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4dGVuc2lvbkludGVybmFsU3RvcmUuc3Vic2NyaWJlKChpbnRlcm5hbFN0b3JlKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGludGVybmFsU3RvcmUsIHNsb3RzQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCksIGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCksIHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbn0pO1xuc2xvdHNDb25maWdTdG9yZS5zdWJzY3JpYmUoKHNsb3RDb25maWdzKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdENvbmZpZ3MsIGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBmZWF0dXJlRmxhZ3NTdG9yZS5nZXRTdGF0ZSgpLCBzZXNzaW9uU3RvcmUuZ2V0U3RhdGUoKSk7XG59KTtcbmV4dGVuc2lvbnNDb25maWdTdG9yZS5zdWJzY3JpYmUoKGV4dGVuc2lvbkNvbmZpZ3MpPT57XG4gICAgdXBkYXRlRXh0ZW5zaW9uT3V0cHV0U3RvcmUoZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpLCBzbG90c0NvbmZpZ1N0b3JlLmdldFN0YXRlKCksIGV4dGVuc2lvbkNvbmZpZ3MsIGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCksIHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbn0pO1xuZmVhdHVyZUZsYWdzU3RvcmUuc3Vic2NyaWJlKChmZWF0dXJlRmxhZ1N0b3JlKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdTdG9yZSwgc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xufSk7XG5zZXNzaW9uU3RvcmUuc3Vic2NyaWJlKChzZXNzaW9uKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKSwgc2Vzc2lvbik7XG59KTtcbmZ1bmN0aW9uIHVwZGF0ZU91dHB1dFN0b3JlVG9DdXJyZW50KCkge1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKSwgc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xufVxudXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQoKTtcbnN1YnNjcmliZUNvbm5lY3Rpdml0eUNoYW5nZWQodXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQpO1xuZnVuY3Rpb24gY3JlYXRlTmV3RXh0ZW5zaW9uU2xvdEluZm8oc2xvdE5hbWUsIG1vZHVsZU5hbWUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgbmFtZTogc2xvdE5hbWUsXG4gICAgICAgIGF0dGFjaGVkSWRzOiBbXSxcbiAgICAgICAgY29uZmlnOiBudWxsLFxuICAgICAgICBzdGF0ZVxuICAgIH07XG59XG4vKipcbiAqIEdpdmVuIGFuIGV4dGVuc2lvbiBJRCwgd2hpY2ggaXMgYSBzdHJpbmcgdW5pcXVlbHkgaWRlbnRpZnlpbmdcbiAqIGFuIGluc3RhbmNlIG9mIGFuIGV4dGVuc2lvbiB3aXRoaW4gYW4gZXh0ZW5zaW9uIHNsb3QsIHRoaXNcbiAqIHJldHVybnMgdGhlIGV4dGVuc2lvbiBuYW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChcImZvbyNiYXJcIilcbiAqICAtLT4gXCJmb29cIlxuICogZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChcImJhelwiKVxuICogIC0tPiBcImJhelwiXG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uRnJvbShzdGF0ZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCk7XG4gICAgcmV0dXJuIHN0YXRlLmV4dGVuc2lvbnNbbmFtZV07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uKGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBleHRlbnNpb25JbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvblJlZ2lzdHJhdGlvbkZyb20oc3RhdGUsIGV4dGVuc2lvbklkKTtcbn1cbi8qKlxuICogRXh0ZW5zaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuXG4gKiBUaGlzIGlzIGhhbmRsZWQgYnkgdGhlIGFwcCBzaGVsbCwgd2hlbiBleHRlbnNpb25zIGFyZSBwcm92aWRlZFxuICogdmlhIHRoZSBgcm91dGVzLmpzb25gIGZpbGUgYW5kIHJlZ2lzdGVyZWQgdGhyb3VnaCBgcmVnaXN0ZXJBcHAoKWAuXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgY29uc3QgcmVnaXN0ZXJFeHRlbnNpb24gPSAoZXh0ZW5zaW9uUmVnaXN0cmF0aW9uKT0+ZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT57XG4gICAgICAgIHN0YXRlLmV4dGVuc2lvbnNbZXh0ZW5zaW9uUmVnaXN0cmF0aW9uLm5hbWVdID0ge1xuICAgICAgICAgICAgLi4uZXh0ZW5zaW9uUmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgaW5zdGFuY2VzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSk7XG4vKipcbiAqIEF0dGFjaCBhbiBleHRlbnNpb24gdG8gYW4gZXh0ZW5zaW9uIHNsb3QuXG4gKlxuICogVGhpcyB3aWxsIGNhdXNlIHRoZSBleHRlbnNpb24gdG8gYmUgcmVuZGVyZWQgaW50byB0aGUgc3BlY2lmaWVkXG4gKiBleHRlbnNpb24gc2xvdCwgdW5sZXNzIGl0IGlzIHJlbW92ZWQgYnkgY29uZmlndXJhdGlvbi4gVXNpbmdcbiAqIGBhdHRhY2hgIGlzIGFuIGFsdGVybmF0aXZlIHRvIHNwZWNpZnlpbmcgdGhlIGBzbG90YCBvciBgc2xvdHNgXG4gKiBpbiB0aGUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLlxuICpcbiAqIEl0IGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBjcmVhdGluZyBhIHNsb3QgaW50byB3aGljaFxuICogeW91IHdhbnQgdG8gcmVuZGVyIGFuIGV4aXN0aW5nIGV4dGVuc2lvbi4gVGhpcyBlbmFibGVzIHlvdVxuICogdG8gZG8gc28gd2l0aG91dCBtb2RpZnlpbmcgdGhlIGV4dGVuc2lvbidzIGRlY2xhcmF0aW9uLCB3aGljaFxuICogbWF5IGJlIGltcHJhY3RpY2FsIG9yIGluYXBwcm9wcmlhdGUsIGZvciBleGFtcGxlIGlmIHlvdSBhcmVcbiAqIHdyaXRpbmcgYSBtb2R1bGUgZm9yIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIHNsb3ROYW1lIGEgbmFtZSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGUgc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbklkIGFuIGV4dGVuc2lvbiBuYW1lLCB3aXRoIGFuIG9wdGlvbmFsICMtc3VmZml4XG4gKiAgICB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBleHRlbnNpb25cbiAqICAgIGF0dGFjaGVkIHRvIHRoZSBzYW1lIHNsb3QuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaChzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICB1cGRhdGVJbnRlcm5hbEV4dGVuc2lvblN0b3JlKChzdGF0ZSk9PntcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTbG90ID0gc3RhdGUuc2xvdHNbc2xvdE5hbWVdO1xuICAgICAgICBpZiAoIWV4aXN0aW5nU2xvdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zbG90cyxcbiAgICAgICAgICAgICAgICAgICAgW3Nsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3JlYXRlTmV3RXh0ZW5zaW9uU2xvdEluZm8oc2xvdE5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWRJZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgICAgIFtzbG90TmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nU2xvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkSWRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXhpc3RpbmdTbG90LmF0dGFjaGVkSWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIEF2b2lkIHVzaW5nIHRoaXMuIEV4dGVuc2lvbiBhdHRhY2htZW50cyBzaG91bGQgYmUgY29uc2lkZXJlZCBkZWNsYXJhdGl2ZS5cbiAqLyBleHBvcnQgZnVuY3Rpb24gZGV0YWNoKGV4dGVuc2lvblNsb3ROYW1lLCBleHRlbnNpb25JZCkge1xuICAgIHVwZGF0ZUludGVybmFsRXh0ZW5zaW9uU3RvcmUoKHN0YXRlKT0+e1xuICAgICAgICBjb25zdCBleGlzdGluZ1Nsb3QgPSBzdGF0ZS5zbG90c1tleHRlbnNpb25TbG90TmFtZV07XG4gICAgICAgIGlmIChleGlzdGluZ1Nsb3QgJiYgZXhpc3RpbmdTbG90LmF0dGFjaGVkSWRzLmluY2x1ZGVzKGV4dGVuc2lvbklkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zbG90cyxcbiAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvblNsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXhpc3RpbmdTbG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWRJZHM6IGV4aXN0aW5nU2xvdC5hdHRhY2hlZElkcy5maWx0ZXIoKGlkKT0+aWQgIT09IGV4dGVuc2lvbklkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCBBdm9pZCB1c2luZyB0aGlzLiBFeHRlbnNpb24gYXR0YWNobWVudHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGVjbGFyYXRpdmUuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRldGFjaEFsbChleHRlbnNpb25TbG90TmFtZSkge1xuICAgIHVwZGF0ZUludGVybmFsRXh0ZW5zaW9uU3RvcmUoKHN0YXRlKT0+e1xuICAgICAgICBjb25zdCBleGlzdGluZ1Nsb3QgPSBzdGF0ZS5zbG90c1tleHRlbnNpb25TbG90TmFtZV07XG4gICAgICAgIGlmIChleGlzdGluZ1Nsb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25TbG90TmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nU2xvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkSWRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBHZXQgYW4gb3JkZXIgaW5kZXggZm9yIHRoZSBleHRlbnNpb24uIFRoaXMgd2lsbFxuICogY29tZSBmcm9tIGVpdGhlciBpdHMgY29uZmlndXJlZCBvcmRlciwgaXRzIHJlZ2lzdGVyZWQgb3JkZXJcbiAqIHBhcmFtZXRlciwgb3IgdGhlIG9yZGVyIGluIHdoaWNoIGl0IGhhcHBlbmVkIHRvIGJlIGF0dGFjaGVkLlxuICovIGZ1bmN0aW9uIGdldE9yZGVyKGV4dGVuc2lvbklkLCBjb25maWd1cmVkT3JkZXIsIHJlZ2lzdGVyZWRPcmRlckluZGV4LCBhdHRhY2hlZE9yZGVyKSB7XG4gICAgY29uc3QgY29uZmlndXJlZEluZGV4ID0gY29uZmlndXJlZE9yZGVyLmluZGV4T2YoZXh0ZW5zaW9uSWQpO1xuICAgIGlmIChjb25maWd1cmVkSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBjb25maWd1cmVkSW5kZXg7XG4gICAgfSBlbHNlIGlmIChyZWdpc3RlcmVkT3JkZXJJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGV4dGVuc2lvbnMgdGhhdCBkb24ndCBoYXZlIGEgY29uZmlndXJlZCBvcmRlciBzaG91bGQgYXBwZWFyIGFmdGVyIHRob3NlIHRoYXQgZG9cbiAgICAgICAgcmV0dXJuIDEwMDAgKyByZWdpc3RlcmVkT3JkZXJJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhc3NpZ25lZEluZGV4ID0gYXR0YWNoZWRPcmRlci5pbmRleE9mKGV4dGVuc2lvbklkKTtcbiAgICAgICAgaWYgKGFzc2lnbmVkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBleHRlbnNpb25zIHRoYXQgaGF2ZSBuZWl0aGVyIGEgY29uZmlndXJlZCBub3IgcmVnaXN0ZXJlZCBvcmRlciBzaG91bGQgYXBwZWFyXG4gICAgICAgICAgICAvLyBhZnRlciBhbGwgb3RoZXJzXG4gICAgICAgICAgICByZXR1cm4gMjAwMCArIGFzc2lnbmVkSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRBc3NpZ25lZEV4dGVuc2lvbnNGcm9tU2xvdERhdGEoc2xvdE5hbWUsIGludGVybmFsU3RhdGUsIGNvbmZpZywgZXh0ZW5zaW9uQ29uZmlnU3RvcmVTdGF0ZSwgZW5hYmxlZEZlYXR1cmVGbGFncywgaXNPbmxpbmUsIHNlc3Npb24pIHtcbiAgICBjb25zdCBhdHRhY2hlZElkcyA9IGludGVybmFsU3RhdGUuc2xvdHNbc2xvdE5hbWVdLmF0dGFjaGVkSWRzO1xuICAgIGNvbnN0IGFzc2lnbmVkSWRzID0gY2FsY3VsYXRlQXNzaWduZWRJZHMoY29uZmlnLCBhdHRhY2hlZElkcyk7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IFtdO1xuICAgIC8vIENyZWF0ZSBjb250ZXh0IG9uY2UgZm9yIGFsbCBleHRlbnNpb25zIGluIHRoaXMgc2xvdFxuICAgIGNvbnN0IHNsb3RTdGF0ZSA9IGludGVybmFsU3RhdGUuc2xvdHNbc2xvdE5hbWVdPy5zdGF0ZTtcbiAgICBjb25zdCBleHByZXNzaW9uQ29udGV4dCA9IHNsb3RTdGF0ZSAmJiB0eXBlb2Ygc2xvdFN0YXRlID09PSAnb2JqZWN0JyA/IHtcbiAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgLi4uc2xvdFN0YXRlXG4gICAgfSA6IHtcbiAgICAgICAgc2Vzc2lvblxuICAgIH07XG4gICAgZm9yIChsZXQgaWQgb2YgYXNzaWduZWRJZHMpe1xuICAgICAgICBjb25zdCB7IGNvbmZpZzogcmF3RXh0ZW5zaW9uQ29uZmlnIH0gPSBnZXRFeHRlbnNpb25Db25maWdGcm9tU3RvcmUoZXh0ZW5zaW9uQ29uZmlnU3RvcmVTdGF0ZSwgc2xvdE5hbWUsIGlkKTtcbiAgICAgICAgY29uc3QgcmF3RXh0ZW5zaW9uU2xvdEV4dGVuc2lvbkNvbmZpZyA9IGdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUoY29uZmlnLCBzbG90TmFtZSwgaWQpO1xuICAgICAgICBjb25zdCBleHRlbnNpb25Db25maWcgPSBtZXJnZShyYXdFeHRlbnNpb25Db25maWcsIHJhd0V4dGVuc2lvblNsb3RFeHRlbnNpb25Db25maWcpO1xuICAgICAgICBjb25zdCBuYW1lID0gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChpZCk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGludGVybmFsU3RhdGUuZXh0ZW5zaW9uc1tuYW1lXTtcbiAgICAgICAgLy8gaWYgdGhlIGV4dGVuc2lvbiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCB5ZXQsIGRvIG5vdCBpbmNsdWRlIGl0XG4gICAgICAgIGlmIChleHRlbnNpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkUHJpdmlsZWdlcyA9IGV4dGVuc2lvbkNvbmZpZz8uWydEaXNwbGF5IGNvbmRpdGlvbnMnXT8ucHJpdmlsZWdlcyA/PyBleHRlbnNpb24ucHJpdmlsZWdlcyA/PyBbXTtcbiAgICAgICAgICAgIGlmIChyZXF1aXJlZFByaXZpbGVnZXMgJiYgKHR5cGVvZiByZXF1aXJlZFByaXZpbGVnZXMgPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkocmVxdWlyZWRQcml2aWxlZ2VzKSAmJiByZXF1aXJlZFByaXZpbGVnZXMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24/LnVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdXNlckhhc0FjY2VzcyhyZXF1aXJlZFByaXZpbGVnZXMsIHNlc3Npb24udXNlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb24gPSBleHRlbnNpb25Db25maWc/LlsnRGlzcGxheSBjb25kaXRpb25zJ10/LmV4cHJlc3Npb24gfHwgZXh0ZW5zaW9uLmRpc3BsYXlFeHByZXNzaW9uO1xuICAgICAgICAgICAgaWYgKGRpc3BsYXlDb25kaXRpb25FeHByZXNzaW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRpc3BsYXlDb25kaXRpb25FeHByZXNzaW9uID09PSAnc3RyaW5nJyAmJiBkaXNwbGF5Q29uZGl0aW9uRXhwcmVzc2lvbi50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXZhbHVhdGVBc0Jvb2xlYW4oZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb24sIGV4cHJlc3Npb25Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHdoaWxlIGV2YWx1YXRpbmcgZXhwcmVzc2lvbiAnJHtkaXNwbGF5Q29uZGl0aW9uRXhwcmVzc2lvbn0nIGZvciBleHRlbnNpb24gJHtuYW1lfSBpbiBzbG90ICR7c2xvdE5hbWV9YCwgZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHRlbnNpb24uZmVhdHVyZUZsYWcgJiYgIWVuYWJsZWRGZWF0dXJlRmxhZ3MuaW5jbHVkZXMoZXh0ZW5zaW9uLmZlYXR1cmVGbGFnKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdpbmRvdy5vZmZsaW5lRW5hYmxlZCAmJiAhY2hlY2tTdGF0dXNGb3IoaXNPbmxpbmUsIGV4dGVuc2lvbi5vbmxpbmUsIGV4dGVuc2lvbi5vZmZsaW5lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIG1vZHVsZU5hbWU6IGV4dGVuc2lvbi5tb2R1bGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogZXh0ZW5zaW9uQ29uZmlnLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVGbGFnOiBleHRlbnNpb24uZmVhdHVyZUZsYWcsXG4gICAgICAgICAgICAgICAgbWV0YTogZXh0ZW5zaW9uLm1ldGEsXG4gICAgICAgICAgICAgICAgb25saW5lOiBleHRlbnNpb25Db25maWc/LlsnRGlzcGxheSBjb25kaXRpb25zJ10/Lm9ubGluZSA/PyBleHRlbnNpb24ub25saW5lID8/IHRydWUsXG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZXh0ZW5zaW9uQ29uZmlnPy5bJ0Rpc3BsYXkgY29uZGl0aW9ucyddPy5vZmZsaW5lID8/IGV4dGVuc2lvbi5vZmZsaW5lID8/IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9ucztcbn1cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBvZiBleHRlbnNpb25zIGFzc2lnbmVkIHRvIGEgZ2l2ZW4gc2xvdFxuICpcbiAqIEBwYXJhbSBzbG90TmFtZSBUaGUgc2xvdCB0byBsb2FkIHRoZSBhc3NpZ25lZCBleHRlbnNpb25zIGZvclxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZXh0ZW5zaW9ucyBhc3NpZ25lZCB0byB0aGUgbmFtZWQgc2xvdFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRBc3NpZ25lZEV4dGVuc2lvbnMoc2xvdE5hbWUpIHtcbiAgICBjb25zdCBpbnRlcm5hbFN0YXRlID0gZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHsgY29uZmlnOiBzbG90Q29uZmlnIH0gPSBnZXRFeHRlbnNpb25TbG90Q29uZmlnKHNsb3ROYW1lKTtcbiAgICBjb25zdCBleHRlbnNpb25TdG9yZVN0YXRlID0gZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgZmVhdHVyZUZsYWdTdGF0ZSA9IGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3Qgc2Vzc2lvblN0YXRlID0gc2Vzc2lvblN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgaXNPbmxpbmUgPSBpc09ubGluZUZuKCk7XG4gICAgY29uc3QgZW5hYmxlZEZlYXR1cmVGbGFncyA9IE9iamVjdC5lbnRyaWVzKGZlYXR1cmVGbGFnU3RhdGUuZmxhZ3MpLmZpbHRlcigoWywgeyBlbmFibGVkIH1dKT0+ZW5hYmxlZCkubWFwKChbbmFtZV0pPT5uYW1lKTtcbiAgICByZXR1cm4gZ2V0QXNzaWduZWRFeHRlbnNpb25zRnJvbVNsb3REYXRhKHNsb3ROYW1lLCBpbnRlcm5hbFN0YXRlLCBzbG90Q29uZmlnLCBleHRlbnNpb25TdG9yZVN0YXRlLCBlbmFibGVkRmVhdHVyZUZsYWdzLCBpc09ubGluZSwgc2Vzc2lvblN0YXRlLnNlc3Npb24pO1xufVxuZnVuY3Rpb24gY2FsY3VsYXRlQXNzaWduZWRJZHMoY29uZmlnLCBhdHRhY2hlZElkcykge1xuICAgIGNvbnN0IGFkZGVkSWRzID0gY29uZmlnLmFkZCB8fCBbXTtcbiAgICBjb25zdCByZW1vdmVkSWRzID0gY29uZmlnLnJlbW92ZSB8fCBbXTtcbiAgICBjb25zdCBpZE9yZGVyID0gY29uZmlnLm9yZGVyIHx8IFtdO1xuICAgIGNvbnN0IHsgZXh0ZW5zaW9ucyB9ID0gZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBbXG4gICAgICAgIC4uLmF0dGFjaGVkSWRzLFxuICAgICAgICAuLi5hZGRlZElkc1xuICAgIF0uZmlsdGVyKChpZCk9PiFyZW1vdmVkSWRzLmluY2x1ZGVzKGlkKSkuc29ydCgoaWRBLCBpZEIpPT57XG4gICAgICAgIGNvbnN0IGFpID0gZ2V0T3JkZXIoaWRBLCBpZE9yZGVyLCBleHRlbnNpb25zW2dldEV4dGVuc2lvbk5hbWVGcm9tSWQoaWRBKV0/Lm9yZGVyLCBhdHRhY2hlZElkcyk7XG4gICAgICAgIGNvbnN0IGJpID0gZ2V0T3JkZXIoaWRCLCBpZE9yZGVyLCBleHRlbnNpb25zW2dldEV4dGVuc2lvbk5hbWVGcm9tSWQoaWRCKV0/Lm9yZGVyLCBhdHRhY2hlZElkcyk7XG4gICAgICAgIGlmIChiaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChhaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFpIC0gYmk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogVXNlZCBieSBieSBleHRlbnNpb24gc2xvdHMgYXQgbW91bnQgdGltZS5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuc2lvbiBzbG90XG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIGV4dGVuc2lvbiBzbG90IG5hbWUgdGhhdCBpcyBhY3R1YWxseSB1c2VkXG4gKiBAcGFyYW0gc3RhdGUgT3B0aW9uYWwgY3VzdG9tIHN0YXRlIGZvciB0aGUgc2xvdCwgd2hpY2ggd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGV4dGVuc2lvbiBzdG9yZS5cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBjb25zdCByZWdpc3RlckV4dGVuc2lvblNsb3QgPSAobW9kdWxlTmFtZSwgc2xvdE5hbWUsIHN0YXRlKT0+ZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoY3VycmVudFN0YXRlKT0+e1xuICAgICAgICBjb25zdCBleGlzdGluZ01vZHVsZU5hbWUgPSBjdXJyZW50U3RhdGUuc2xvdHNbc2xvdE5hbWVdPy5tb2R1bGVOYW1lO1xuICAgICAgICBpZiAoZXhpc3RpbmdNb2R1bGVOYW1lICYmIGV4aXN0aW5nTW9kdWxlTmFtZSAhPSBtb2R1bGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEFuIGV4dGVuc2lvbiBzbG90IHdpdGggdGhlIG5hbWUgJyR7c2xvdE5hbWV9JyBhbHJlYWR5IGV4aXN0cy4gUmVmdXNpbmcgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgc2xvdCBuYW1lIHR3aWNlIChpbiBcInJlZ2lzdGVyRXh0ZW5zaW9uU2xvdFwiKS4gVGhlIGV4aXN0aW5nIG9uZSBpcyBmcm9tIG1vZHVsZSAke2V4aXN0aW5nTW9kdWxlTmFtZX0uYCk7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleGlzdGluZ01vZHVsZU5hbWUgJiYgZXhpc3RpbmdNb2R1bGVOYW1lID09IG1vZHVsZU5hbWUpIHtcbiAgICAgICAgICAgIC8vIFJlLXJlbmRlcmluZyBhbiBleGlzdGluZyBzbG90XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50U3RhdGUuc2xvdHNbc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgICAgIFtzbG90TmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRTdGF0ZS5zbG90c1tzbG90TmFtZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2xvdCA9IGNyZWF0ZU5ld0V4dGVuc2lvblNsb3RJbmZvKHNsb3ROYW1lLCBtb2R1bGVOYW1lLCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRTdGF0ZS5zbG90cyxcbiAgICAgICAgICAgICAgICBbc2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNsb3RcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG4vKipcbiAqIFVzZWQgYnkgZXh0ZW5zaW9uIHNsb3RzIHRvIHVwZGF0ZSB0aGUgY29weSBvZiB0aGUgc3RhdGUgZm9yIHRoZSBleHRlbnNpb24gc2xvdFxuICpcbiAqIEBwYXJhbSBzbG90TmFtZSBUaGUgbmFtZSBvZiB0aGUgc2xvdCB3aXRoIHN0YXRlIHRvIHVwZGF0ZVxuICogQHBhcmFtIHN0YXRlIEEgY29weSBvZiB0aGUgbmV3IHN0YXRlXG4gKiBAcGFyYW0gcGFydGlhbCBXaGV0aGVyIHRoaXMgc2hvdWxkIGJlIGFwcGxpZWQgYXMgYSBwYXJ0aWFsXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUV4dGVuc2lvblNsb3RTdGF0ZShzbG90TmFtZSwgc3RhdGUsIHBhcnRpYWwgPSBmYWxzZSkge1xuICAgIGV4dGVuc2lvbkludGVybmFsU3RvcmUuc2V0U3RhdGUoKGN1cnJlbnRTdGF0ZSk9PntcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBwYXJ0aWFsID8gbWVyZ2UoY3VycmVudFN0YXRlLnNsb3RzW3Nsb3ROYW1lXS5zdGF0ZSwgc3RhdGUpIDogc3RhdGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRTdGF0ZS5zbG90cyxcbiAgICAgICAgICAgICAgICBbc2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRTdGF0ZS5zbG90c1tzbG90TmFtZV0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBuZXdTdGF0ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKiBKdXN0IGZvciB0ZXN0aW5nLlxuICovIGV4cG9ydCBjb25zdCByZXNldCA9ICgpPT5leHRlbnNpb25TdG9yZS5zZXRTdGF0ZSgoKT0+e1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2xvdHM6IHt9LFxuICAgICAgICAgICAgZXh0ZW5zaW9uczoge31cbiAgICAgICAgfTtcbiAgICB9KTtcbiJdLCJuYW1lcyI6WyJzZXNzaW9uU3RvcmUiLCJ1c2VySGFzQWNjZXNzIiwiZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbUV4dGVuc2lvblNsb3RTdG9yZSIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21TdG9yZSIsImdldEV4dGVuc2lvblNsb3RDb25maWciLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlIiwiZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSIsImdldEV4dGVuc2lvbnNDb25maWdTdG9yZSIsImV2YWx1YXRlQXNCb29sZWFuIiwiZmVhdHVyZUZsYWdzU3RvcmUiLCJzdWJzY3JpYmVDb25uZWN0aXZpdHlDaGFuZ2VkIiwiaXNPbmxpbmUiLCJpc09ubGluZUZuIiwiaXNFcXVhbCIsIm1lcmdlIiwiY2hlY2tTdGF0dXNGb3IiLCJnZXRFeHRlbnNpb25JbnRlcm5hbFN0b3JlIiwiZ2V0RXh0ZW5zaW9uU3RvcmUiLCJ1cGRhdGVJbnRlcm5hbEV4dGVuc2lvblN0b3JlIiwiZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSIsImV4dGVuc2lvblN0b3JlIiwic2xvdHNDb25maWdTdG9yZSIsImV4dGVuc2lvbnNDb25maWdTdG9yZSIsInVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlIiwiaW50ZXJuYWxTdGF0ZSIsImV4dGVuc2lvblNsb3RDb25maWdzIiwiZmVhdHVyZUZsYWdTdG9yZSIsInNsb3RzIiwiZW5hYmxlZEZlYXR1cmVGbGFncyIsIk9iamVjdCIsImVudHJpZXMiLCJmbGFncyIsImZpbHRlciIsImVuYWJsZWQiLCJtYXAiLCJuYW1lIiwic2xvdE5hbWUiLCJzbG90IiwiY29uZmlnIiwiYXNzaWduZWRFeHRlbnNpb25zIiwiZ2V0QXNzaWduZWRFeHRlbnNpb25zRnJvbVNsb3REYXRhIiwic2Vzc2lvbiIsIm1vZHVsZU5hbWUiLCJnZXRTdGF0ZSIsInNldFN0YXRlIiwic3Vic2NyaWJlIiwiaW50ZXJuYWxTdG9yZSIsInNsb3RDb25maWdzIiwiZXh0ZW5zaW9uQ29uZmlncyIsInVwZGF0ZU91dHB1dFN0b3JlVG9DdXJyZW50IiwiY3JlYXRlTmV3RXh0ZW5zaW9uU2xvdEluZm8iLCJzdGF0ZSIsImF0dGFjaGVkSWRzIiwiZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZCIsImV4dGVuc2lvbklkIiwiZXh0ZW5zaW9uTmFtZSIsInNwbGl0IiwiZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uRnJvbSIsImV4dGVuc2lvbnMiLCJnZXRFeHRlbnNpb25SZWdpc3RyYXRpb24iLCJyZWdpc3RlckV4dGVuc2lvbiIsImV4dGVuc2lvblJlZ2lzdHJhdGlvbiIsImluc3RhbmNlcyIsImF0dGFjaCIsImV4aXN0aW5nU2xvdCIsImRldGFjaCIsImV4dGVuc2lvblNsb3ROYW1lIiwiaW5jbHVkZXMiLCJpZCIsImRldGFjaEFsbCIsImdldE9yZGVyIiwiY29uZmlndXJlZE9yZGVyIiwicmVnaXN0ZXJlZE9yZGVySW5kZXgiLCJhdHRhY2hlZE9yZGVyIiwiY29uZmlndXJlZEluZGV4IiwiaW5kZXhPZiIsInVuZGVmaW5lZCIsImFzc2lnbmVkSW5kZXgiLCJleHRlbnNpb25Db25maWdTdG9yZVN0YXRlIiwiYXNzaWduZWRJZHMiLCJjYWxjdWxhdGVBc3NpZ25lZElkcyIsInNsb3RTdGF0ZSIsImV4cHJlc3Npb25Db250ZXh0IiwicmF3RXh0ZW5zaW9uQ29uZmlnIiwicmF3RXh0ZW5zaW9uU2xvdEV4dGVuc2lvbkNvbmZpZyIsImV4dGVuc2lvbkNvbmZpZyIsImV4dGVuc2lvbiIsInJlcXVpcmVkUHJpdmlsZWdlcyIsInByaXZpbGVnZXMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ1c2VyIiwiZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwiZGlzcGxheUV4cHJlc3Npb24iLCJ0cmltIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsImZlYXR1cmVGbGFnIiwid2luZG93Iiwib2ZmbGluZUVuYWJsZWQiLCJvbmxpbmUiLCJvZmZsaW5lIiwicHVzaCIsIm1ldGEiLCJnZXRBc3NpZ25lZEV4dGVuc2lvbnMiLCJzbG90Q29uZmlnIiwiZXh0ZW5zaW9uU3RvcmVTdGF0ZSIsImZlYXR1cmVGbGFnU3RhdGUiLCJzZXNzaW9uU3RhdGUiLCJhZGRlZElkcyIsImFkZCIsInJlbW92ZWRJZHMiLCJyZW1vdmUiLCJpZE9yZGVyIiwib3JkZXIiLCJzb3J0IiwiaWRBIiwiaWRCIiwiYWkiLCJiaSIsInJlZ2lzdGVyRXh0ZW5zaW9uU2xvdCIsImN1cnJlbnRTdGF0ZSIsImV4aXN0aW5nTW9kdWxlTmFtZSIsIndhcm4iLCJ1cGRhdGVFeHRlbnNpb25TbG90U3RhdGUiLCJwYXJ0aWFsIiwibmV3U3RhdGUiLCJyZXNldCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/extensions.js\n");
448
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ attach: () => (/* binding */ attach),\n/* harmony export */ detach: () => (/* binding */ detach),\n/* harmony export */ detachAll: () => (/* binding */ detachAll),\n/* harmony export */ getAssignedExtensions: () => (/* binding */ getAssignedExtensions),\n/* harmony export */ getExtensionNameFromId: () => (/* binding */ getExtensionNameFromId),\n/* harmony export */ getExtensionRegistration: () => (/* binding */ getExtensionRegistration),\n/* harmony export */ getExtensionRegistrationFrom: () => (/* binding */ getExtensionRegistrationFrom),\n/* harmony export */ registerExtension: () => (/* binding */ registerExtension),\n/* harmony export */ registerExtensionSlot: () => (/* binding */ registerExtensionSlot),\n/* harmony export */ reset: () => (/* binding */ reset),\n/* harmony export */ updateExtensionSlotState: () => (/* binding */ updateExtensionSlotState)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-config */ \"../../framework/esm-config/dist/index.js\");\n/* harmony import */ var _openmrs_esm_expression_evaluator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @openmrs/esm-expression-evaluator */ \"../../framework/esm-expression-evaluator/dist/evaluator.js\");\n/* harmony import */ var _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-feature-flags */ \"../../framework/esm-feature-flags/dist/index.js\");\n/* harmony import */ var _openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @openmrs/esm-globals */ \"../../framework/esm-globals/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/is-online.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/isEqual.js\");\n/* harmony import */ var lodash_es__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es */ \"../../../node_modules/lodash-es/merge.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers.js */ \"../../framework/esm-extensions/dist/helpers.js\");\n/* harmony import */ var _store_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store.js */ \"../../framework/esm-extensions/dist/store.js\");\n/** @module @category Extension */ /*\n * We have the following extension modes:\n *\n * - attached (set via code in form of: attach, detach, ...)\n * - configured (set via configuration in form of: added, removed, ...)\n * - assigned (computed from attached and configured)\n * - connected (computed from assigned using connectivity and online / offline)\n */ \n\n\n\n\n\n\n\n\nconst extensionInternalStore = (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.getExtensionInternalStore)();\nconst extensionStore = (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.getExtensionStore)();\nconst slotsConfigStore = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotsConfigStore)();\nconst extensionsConfigStore = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionsConfigStore)();\n// Keep the output store updated\nfunction updateExtensionOutputStore(internalState, extensionSlotConfigs, extensionsConfigStore, featureFlagStore, sessionStore) {\n const slots = {};\n const isOnline = (0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__.isOnline)();\n const enabledFeatureFlags = Object.entries(featureFlagStore.flags).filter(([, { enabled }])=>enabled).map(([name])=>name);\n for (let [slotName, slot] of Object.entries(internalState.slots)){\n const { config } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfigFromStore)(extensionSlotConfigs, slot.name);\n const assignedExtensions = getAssignedExtensionsFromSlotData(slotName, internalState, config, extensionsConfigStore, enabledFeatureFlags, isOnline, sessionStore.session);\n slots[slotName] = {\n moduleName: slot.moduleName,\n assignedExtensions\n };\n }\n if (!(0,lodash_es__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(extensionStore.getState().slots, slots)) {\n extensionStore.setState({\n slots\n });\n }\n}\nextensionInternalStore.subscribe((internalStore)=>{\n updateExtensionOutputStore(internalStore, slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\nslotsConfigStore.subscribe((slotConfigs)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotConfigs, extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\nextensionsConfigStore.subscribe((extensionConfigs)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionConfigs, _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\n_openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.subscribe((featureFlagStore)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), featureFlagStore, _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n});\n_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.subscribe((session)=>{\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), session);\n});\nfunction updateOutputStoreToCurrent() {\n updateExtensionOutputStore(extensionInternalStore.getState(), slotsConfigStore.getState(), extensionsConfigStore.getState(), _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState(), _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState());\n}\nupdateOutputStoreToCurrent();\n(0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_3__.subscribeConnectivityChanged)(updateOutputStoreToCurrent);\nfunction createNewExtensionSlotInfo(slotName, moduleName, state) {\n return {\n moduleName,\n name: slotName,\n attachedIds: [],\n config: null,\n state\n };\n}\n/**\n * Given an extension ID, which is a string uniquely identifying\n * an instance of an extension within an extension slot, this\n * returns the extension name.\n *\n * @example\n * ```js\n * getExtensionNameFromId(\"foo#bar\")\n * --> \"foo\"\n * getExtensionNameFromId(\"baz\")\n * --> \"baz\"\n * ```\n */ function getExtensionNameFromId(extensionId) {\n const [extensionName] = extensionId.split('#');\n return extensionName;\n}\nfunction getExtensionRegistrationFrom(state, extensionId) {\n const name = getExtensionNameFromId(extensionId);\n return state.extensions[name];\n}\nfunction getExtensionRegistration(extensionId) {\n const state = extensionInternalStore.getState();\n return getExtensionRegistrationFrom(state, extensionId);\n}\n/**\n * Extensions must be registered in order to be rendered.\n * This is handled by the app shell, when extensions are provided\n * via the `routes.json` file and registered through `registerApp()`.\n * @internal\n */ const registerExtension = (extensionRegistration)=>extensionInternalStore.setState((state)=>{\n state.extensions[extensionRegistration.name] = {\n ...extensionRegistration,\n instances: []\n };\n return state;\n });\n/**\n * Attach an extension to an extension slot.\n *\n * This will cause the extension to be rendered into the specified\n * extension slot, unless it is removed by configuration. Using\n * `attach` is an alternative to specifying the `slot` or `slots`\n * in the extension declaration.\n *\n * It is particularly useful when creating a slot into which\n * you want to render an existing extension. This enables you\n * to do so without modifying the extension's declaration, which\n * may be impractical or inappropriate, for example if you are\n * writing a module for a specific implementation.\n *\n * @param slotName a name uniquely identifying the slot\n * @param extensionId an extension name, with an optional #-suffix\n * to distinguish it from other instances of the same extension\n * attached to the same slot.\n */ function attach(slotName, extensionId) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[slotName];\n if (!existingSlot) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...createNewExtensionSlotInfo(slotName),\n attachedIds: [\n extensionId\n ]\n }\n }\n };\n } else {\n return {\n ...state,\n slots: {\n ...state.slots,\n [slotName]: {\n ...existingSlot,\n attachedIds: [\n ...existingSlot.attachedIds,\n extensionId\n ]\n }\n }\n };\n }\n });\n}\n/**\n * Detaches an extension from an extension slot.\n *\n * @param extensionSlotName The name of the extension slot to detach from.\n * @param extensionId The ID of the extension to detach.\n *\n * @deprecated Avoid using this. Extension attachments should be considered declarative.\n */ function detach(extensionSlotName, extensionId) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[extensionSlotName];\n if (existingSlot && existingSlot.attachedIds.includes(extensionId)) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [extensionSlotName]: {\n ...existingSlot,\n attachedIds: existingSlot.attachedIds.filter((id)=>id !== extensionId)\n }\n }\n };\n } else {\n return state;\n }\n });\n}\n/**\n * Detaches all extensions from an extension slot.\n *\n * @param extensionSlotName The name of the extension slot to clear.\n *\n * @deprecated Avoid using this. Extension attachments should be considered declarative.\n */ function detachAll(extensionSlotName) {\n (0,_store_js__WEBPACK_IMPORTED_MODULE_5__.updateInternalExtensionStore)((state)=>{\n const existingSlot = state.slots[extensionSlotName];\n if (existingSlot) {\n return {\n ...state,\n slots: {\n ...state.slots,\n [extensionSlotName]: {\n ...existingSlot,\n attachedIds: []\n }\n }\n };\n } else {\n return state;\n }\n });\n}\n/**\n * Get an order index for the extension. This will\n * come from either its configured order, its registered order\n * parameter, or the order in which it happened to be attached.\n */ function getOrder(extensionId, configuredOrder, registeredOrderIndex, attachedOrder) {\n const configuredIndex = configuredOrder.indexOf(extensionId);\n if (configuredIndex !== -1) {\n return configuredIndex;\n } else if (registeredOrderIndex !== undefined) {\n // extensions that don't have a configured order should appear after those that do\n return 1000 + registeredOrderIndex;\n } else {\n const assignedIndex = attachedOrder.indexOf(extensionId);\n if (assignedIndex !== -1) {\n // extensions that have neither a configured nor registered order should appear\n // after all others\n return 2000 + assignedIndex;\n } else {\n return -1;\n }\n }\n}\nfunction getAssignedExtensionsFromSlotData(slotName, internalState, config, extensionConfigStoreState, enabledFeatureFlags, isOnline, session) {\n const attachedIds = internalState.slots[slotName].attachedIds;\n const assignedIds = calculateAssignedIds(config, attachedIds);\n const extensions = [];\n // Create context once for all extensions in this slot\n const slotState = internalState.slots[slotName]?.state;\n const expressionContext = slotState && typeof slotState === 'object' ? {\n session,\n ...slotState\n } : {\n session\n };\n for (let id of assignedIds){\n const { config: rawExtensionConfig } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromStore)(extensionConfigStoreState, slotName, id);\n const rawExtensionSlotExtensionConfig = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionConfigFromExtensionSlotStore)(config, slotName, id);\n const extensionConfig = (0,lodash_es__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(rawExtensionConfig, rawExtensionSlotExtensionConfig);\n const name = getExtensionNameFromId(id);\n const extension = internalState.extensions[name];\n // if the extension has not been registered yet, do not include it\n if (extension) {\n const requiredPrivileges = extensionConfig?.['Display conditions']?.privileges ?? extension.privileges ?? [];\n if (requiredPrivileges && (typeof requiredPrivileges === 'string' || Array.isArray(requiredPrivileges) && requiredPrivileges.length > 0)) {\n if (!session?.user) {\n continue;\n }\n if (!(0,_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.userHasAccess)(requiredPrivileges, session.user)) {\n continue;\n }\n }\n const displayConditionExpression = extensionConfig?.['Display conditions']?.expression || extension.displayExpression;\n if (displayConditionExpression !== undefined && typeof displayConditionExpression === 'string' && displayConditionExpression.trim().length > 0) {\n try {\n if (!(0,_openmrs_esm_expression_evaluator__WEBPACK_IMPORTED_MODULE_9__.evaluateAsBoolean)(displayConditionExpression, expressionContext)) {\n continue;\n }\n } catch (e) {\n console.error(`Error while evaluating expression '${displayConditionExpression}' for extension ${name} in slot ${slotName}`, e);\n continue;\n }\n }\n if (extension.featureFlag && !enabledFeatureFlags.includes(extension.featureFlag)) {\n continue;\n }\n if (window.offlineEnabled && !(0,_helpers_js__WEBPACK_IMPORTED_MODULE_4__.checkStatusFor)(isOnline, extension.online, extension.offline)) {\n continue;\n }\n extensions.push({\n id,\n name,\n moduleName: extension.moduleName,\n config: extensionConfig,\n featureFlag: extension.featureFlag,\n meta: extension.meta,\n online: extensionConfig?.['Display conditions']?.online ?? extension.online ?? true,\n offline: extensionConfig?.['Display conditions']?.offline ?? extension.offline ?? false\n });\n }\n }\n return extensions;\n}\n/**\n * Gets the list of extensions assigned to a given slot\n *\n * @param slotName The slot to load the assigned extensions for\n * @returns An array of extensions assigned to the named slot\n */ function getAssignedExtensions(slotName) {\n const internalState = extensionInternalStore.getState();\n const { config: slotConfig } = (0,_openmrs_esm_config__WEBPACK_IMPORTED_MODULE_1__.getExtensionSlotConfig)(slotName);\n const extensionStoreState = extensionsConfigStore.getState();\n const featureFlagState = _openmrs_esm_feature_flags__WEBPACK_IMPORTED_MODULE_2__.featureFlagsStore.getState();\n const sessionState = _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_0__.sessionStore.getState();\n const isOnline = (0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_6__.isOnline)();\n const enabledFeatureFlags = Object.entries(featureFlagState.flags).filter(([, { enabled }])=>enabled).map(([name])=>name);\n return getAssignedExtensionsFromSlotData(slotName, internalState, slotConfig, extensionStoreState, enabledFeatureFlags, isOnline, sessionState.session);\n}\nfunction calculateAssignedIds(config, attachedIds) {\n const addedIds = config.add || [];\n const removedIds = config.remove || [];\n const idOrder = config.order || [];\n const { extensions } = extensionInternalStore.getState();\n return [\n ...attachedIds,\n ...addedIds\n ].filter((id)=>!removedIds.includes(id)).sort((idA, idB)=>{\n const ai = getOrder(idA, idOrder, extensions[getExtensionNameFromId(idA)]?.order, attachedIds);\n const bi = getOrder(idB, idOrder, extensions[getExtensionNameFromId(idB)]?.order, attachedIds);\n if (bi === -1) {\n return -1;\n } else if (ai === -1) {\n return 1;\n } else {\n return ai - bi;\n }\n });\n}\n/**\n * Used by by extension slots at mount time.\n *\n * @param moduleName The name of the module that contains the extension slot\n * @param slotName The extension slot name that is actually used\n * @param state Optional custom state for the slot, which will be stored in the extension store.\n * @internal\n */ const registerExtensionSlot = (moduleName, slotName, state)=>extensionInternalStore.setState((currentState)=>{\n const existingModuleName = currentState.slots[slotName]?.moduleName;\n if (existingModuleName && existingModuleName != moduleName) {\n console.warn(`An extension slot with the name '${slotName}' already exists. Refusing to register the same slot name twice (in \"registerExtensionSlot\"). The existing one is from module ${existingModuleName}.`);\n return currentState;\n }\n if (existingModuleName && existingModuleName == moduleName) {\n // Re-rendering an existing slot\n return currentState;\n }\n if (currentState.slots[slotName]) {\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...currentState.slots[slotName],\n moduleName,\n state\n }\n }\n };\n }\n const slot = createNewExtensionSlotInfo(slotName, moduleName, state);\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...slot\n }\n }\n };\n });\n/**\n * Used by extension slots to update the copy of the state for the extension slot\n *\n * @param slotName The name of the slot with state to update\n * @param state A copy of the new state\n * @param partial Whether this should be applied as a partial\n */ function updateExtensionSlotState(slotName, state, partial = false) {\n extensionInternalStore.setState((currentState)=>{\n const newState = partial ? (0,lodash_es__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(currentState.slots[slotName].state, state) : state;\n return {\n ...currentState,\n slots: {\n ...currentState.slots,\n [slotName]: {\n ...currentState.slots[slotName],\n state: newState\n }\n }\n };\n });\n}\n/**\n * @internal\n * Just for testing.\n */ const reset = ()=>extensionStore.setState(()=>{\n return {\n slots: {},\n extensions: {}\n };\n });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvZXh0ZW5zaW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnQ0FBZ0MsR0FBRzs7Ozs7OztDQU9sQyxHQUFrRTtBQUMwSjtBQUN2SjtBQUNQO0FBQ0s7QUFDUjtBQUNqQjtBQUNHO0FBQzBEO0FBQ3hHLE1BQU1tQix5QkFBeUJILG9FQUF5QkE7QUFDeEQsTUFBTUksaUJBQWlCSCw0REFBaUJBO0FBQ3hDLE1BQU1JLG1CQUFtQmYsaUZBQTRCQTtBQUNyRCxNQUFNZ0Isd0JBQXdCZiw2RUFBd0JBO0FBQ3RELGdDQUFnQztBQUNoQyxTQUFTZ0IsMkJBQTJCQyxhQUFhLEVBQUVDLG9CQUFvQixFQUFFSCxxQkFBcUIsRUFBRUksZ0JBQWdCLEVBQUUxQixZQUFZO0lBQzFILE1BQU0yQixRQUFRLENBQUM7SUFDZixNQUFNaEIsV0FBV0MsNERBQVVBO0lBQzNCLE1BQU1nQixzQkFBc0JDLE9BQU9DLE9BQU8sQ0FBQ0osaUJBQWlCSyxLQUFLLEVBQUVDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRUMsT0FBTyxFQUFFLENBQUMsR0FBR0EsU0FBU0MsR0FBRyxDQUFDLENBQUMsQ0FBQ0MsS0FBSyxHQUFHQTtJQUNwSCxLQUFLLElBQUksQ0FBQ0MsVUFBVUMsS0FBSyxJQUFJUixPQUFPQyxPQUFPLENBQUNOLGNBQWNHLEtBQUssRUFBRTtRQUM3RCxNQUFNLEVBQUVXLE1BQU0sRUFBRSxHQUFHakMsb0ZBQStCQSxDQUFDb0Isc0JBQXNCWSxLQUFLRixJQUFJO1FBQ2xGLE1BQU1JLHFCQUFxQkMsa0NBQWtDSixVQUFVWixlQUFlYyxRQUFRaEIsdUJBQXVCTSxxQkFBcUJqQixVQUFVWCxhQUFheUMsT0FBTztRQUN4S2QsS0FBSyxDQUFDUyxTQUFTLEdBQUc7WUFDZE0sWUFBWUwsS0FBS0ssVUFBVTtZQUMzQkg7UUFDSjtJQUNKO0lBQ0EsSUFBSSxDQUFDMUIscURBQU9BLENBQUNP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QUFDO1FBQ2pCO0lBQ0osR0FBRyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1leHRlbnNpb25zL2Rpc3QvZXh0ZW5zaW9ucy5qcz9jMGU3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBFeHRlbnNpb24gKi8gLypcbiAqIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBleHRlbnNpb24gbW9kZXM6XG4gKlxuICogLSBhdHRhY2hlZCAoc2V0IHZpYSBjb2RlIGluIGZvcm0gb2Y6IGF0dGFjaCwgZGV0YWNoLCAuLi4pXG4gKiAtIGNvbmZpZ3VyZWQgKHNldCB2aWEgY29uZmlndXJhdGlvbiBpbiBmb3JtIG9mOiBhZGRlZCwgcmVtb3ZlZCwgLi4uKVxuICogLSBhc3NpZ25lZCAoY29tcHV0ZWQgZnJvbSBhdHRhY2hlZCBhbmQgY29uZmlndXJlZClcbiAqIC0gY29ubmVjdGVkIChjb21wdXRlZCBmcm9tIGFzc2lnbmVkIHVzaW5nIGNvbm5lY3Rpdml0eSBhbmQgb25saW5lIC8gb2ZmbGluZSlcbiAqLyBpbXBvcnQgeyBzZXNzaW9uU3RvcmUsIHVzZXJIYXNBY2Nlc3MgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWFwaVwiO1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbUV4dGVuc2lvblNsb3RTdG9yZSwgZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlLCBnZXRFeHRlbnNpb25TbG90Q29uZmlnLCBnZXRFeHRlbnNpb25TbG90Q29uZmlnRnJvbVN0b3JlLCBnZXRFeHRlbnNpb25TbG90c0NvbmZpZ1N0b3JlLCBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZXZhbHVhdGVBc0Jvb2xlYW4gfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWV4cHJlc3Npb24tZXZhbHVhdG9yXCI7XG5pbXBvcnQgeyBmZWF0dXJlRmxhZ3NTdG9yZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tZmVhdHVyZS1mbGFnc1wiO1xuaW1wb3J0IHsgc3Vic2NyaWJlQ29ubmVjdGl2aXR5Q2hhbmdlZCB9IGZyb20gXCJAb3Blbm1ycy9lc20tZ2xvYmFsc1wiO1xuaW1wb3J0IHsgaXNPbmxpbmUgYXMgaXNPbmxpbmVGbiB9IGZyb20gXCJAb3Blbm1ycy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGlzRXF1YWwsIG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY2hlY2tTdGF0dXNGb3IgfSBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5pbXBvcnQgeyBnZXRFeHRlbnNpb25JbnRlcm5hbFN0b3JlLCBnZXRFeHRlbnNpb25TdG9yZSwgdXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSB9IGZyb20gXCIuL3N0b3JlLmpzXCI7XG5jb25zdCBleHRlbnNpb25JbnRlcm5hbFN0b3JlID0gZ2V0RXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSgpO1xuY29uc3QgZXh0ZW5zaW9uU3RvcmUgPSBnZXRFeHRlbnNpb25TdG9yZSgpO1xuY29uc3Qgc2xvdHNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKTtcbmNvbnN0IGV4dGVuc2lvbnNDb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbnNDb25maWdTdG9yZSgpO1xuLy8gS2VlcCB0aGUgb3V0cHV0IHN0b3JlIHVwZGF0ZWRcbmZ1bmN0aW9uIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGludGVybmFsU3RhdGUsIGV4dGVuc2lvblNsb3RDb25maWdzLCBleHRlbnNpb25zQ29uZmlnU3RvcmUsIGZlYXR1cmVGbGFnU3RvcmUsIHNlc3Npb25TdG9yZSkge1xuICAgIGNvbnN0IHNsb3RzID0ge307XG4gICAgY29uc3QgaXNPbmxpbmUgPSBpc09ubGluZUZuKCk7XG4gICAgY29uc3QgZW5hYmxlZEZlYXR1cmVGbGFncyA9IE9iamVjdC5lbnRyaWVzKGZlYXR1cmVGbGFnU3RvcmUuZmxhZ3MpLmZpbHRlcigoWywgeyBlbmFibGVkIH1dKT0+ZW5hYmxlZCkubWFwKChbbmFtZV0pPT5uYW1lKTtcbiAgICBmb3IgKGxldCBbc2xvdE5hbWUsIHNsb3RdIG9mIE9iamVjdC5lbnRyaWVzKGludGVybmFsU3RhdGUuc2xvdHMpKXtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldEV4dGVuc2lvblNsb3RDb25maWdGcm9tU3RvcmUoZXh0ZW5zaW9uU2xvdENvbmZpZ3MsIHNsb3QubmFtZSk7XG4gICAgICAgIGNvbnN0IGFzc2lnbmVkRXh0ZW5zaW9ucyA9IGdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YShzbG90TmFtZSwgaW50ZXJuYWxTdGF0ZSwgY29uZmlnLCBleHRlbnNpb25zQ29uZmlnU3RvcmUsIGVuYWJsZWRGZWF0dXJlRmxhZ3MsIGlzT25saW5lLCBzZXNzaW9uU3RvcmUuc2Vzc2lvbik7XG4gICAgICAgIHNsb3RzW3Nsb3ROYW1lXSA9IHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6IHNsb3QubW9kdWxlTmFtZSxcbiAgICAgICAgICAgIGFzc2lnbmVkRXh0ZW5zaW9uc1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoIWlzRXF1YWwoZXh0ZW5zaW9uU3RvcmUuZ2V0U3RhdGUoKS5zbG90cywgc2xvdHMpKSB7XG4gICAgICAgIGV4dGVuc2lvblN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNsb3RzXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4dGVuc2lvbkludGVybmFsU3RvcmUuc3Vic2NyaWJlKChpbnRlcm5hbFN0b3JlKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGludGVybmFsU3RvcmUsIHNsb3RzQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCksIGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCksIHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbn0pO1xuc2xvdHNDb25maWdTdG9yZS5zdWJzY3JpYmUoKHNsb3RDb25maWdzKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdENvbmZpZ3MsIGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBmZWF0dXJlRmxhZ3NTdG9yZS5nZXRTdGF0ZSgpLCBzZXNzaW9uU3RvcmUuZ2V0U3RhdGUoKSk7XG59KTtcbmV4dGVuc2lvbnNDb25maWdTdG9yZS5zdWJzY3JpYmUoKGV4dGVuc2lvbkNvbmZpZ3MpPT57XG4gICAgdXBkYXRlRXh0ZW5zaW9uT3V0cHV0U3RvcmUoZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5nZXRTdGF0ZSgpLCBzbG90c0NvbmZpZ1N0b3JlLmdldFN0YXRlKCksIGV4dGVuc2lvbkNvbmZpZ3MsIGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCksIHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpKTtcbn0pO1xuZmVhdHVyZUZsYWdzU3RvcmUuc3Vic2NyaWJlKChmZWF0dXJlRmxhZ1N0b3JlKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdTdG9yZSwgc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xufSk7XG5zZXNzaW9uU3RvcmUuc3Vic2NyaWJlKChzZXNzaW9uKT0+e1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKSwgc2Vzc2lvbik7XG59KTtcbmZ1bmN0aW9uIHVwZGF0ZU91dHB1dFN0b3JlVG9DdXJyZW50KCkge1xuICAgIHVwZGF0ZUV4dGVuc2lvbk91dHB1dFN0b3JlKGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKSwgc2xvdHNDb25maWdTdG9yZS5nZXRTdGF0ZSgpLCBleHRlbnNpb25zQ29uZmlnU3RvcmUuZ2V0U3RhdGUoKSwgZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKSwgc2Vzc2lvblN0b3JlLmdldFN0YXRlKCkpO1xufVxudXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQoKTtcbnN1YnNjcmliZUNvbm5lY3Rpdml0eUNoYW5nZWQodXBkYXRlT3V0cHV0U3RvcmVUb0N1cnJlbnQpO1xuZnVuY3Rpb24gY3JlYXRlTmV3RXh0ZW5zaW9uU2xvdEluZm8oc2xvdE5hbWUsIG1vZHVsZU5hbWUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgbmFtZTogc2xvdE5hbWUsXG4gICAgICAgIGF0dGFjaGVkSWRzOiBbXSxcbiAgICAgICAgY29uZmlnOiBudWxsLFxuICAgICAgICBzdGF0ZVxuICAgIH07XG59XG4vKipcbiAqIEdpdmVuIGFuIGV4dGVuc2lvbiBJRCwgd2hpY2ggaXMgYSBzdHJpbmcgdW5pcXVlbHkgaWRlbnRpZnlpbmdcbiAqIGFuIGluc3RhbmNlIG9mIGFuIGV4dGVuc2lvbiB3aXRoaW4gYW4gZXh0ZW5zaW9uIHNsb3QsIHRoaXNcbiAqIHJldHVybnMgdGhlIGV4dGVuc2lvbiBuYW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChcImZvbyNiYXJcIilcbiAqICAtLT4gXCJmb29cIlxuICogZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChcImJhelwiKVxuICogIC0tPiBcImJhelwiXG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uRnJvbShzdGF0ZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCk7XG4gICAgcmV0dXJuIHN0YXRlLmV4dGVuc2lvbnNbbmFtZV07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uKGV4dGVuc2lvbklkKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBleHRlbnNpb25JbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvblJlZ2lzdHJhdGlvbkZyb20oc3RhdGUsIGV4dGVuc2lvbklkKTtcbn1cbi8qKlxuICogRXh0ZW5zaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuXG4gKiBUaGlzIGlzIGhhbmRsZWQgYnkgdGhlIGFwcCBzaGVsbCwgd2hlbiBleHRlbnNpb25zIGFyZSBwcm92aWRlZFxuICogdmlhIHRoZSBgcm91dGVzLmpzb25gIGZpbGUgYW5kIHJlZ2lzdGVyZWQgdGhyb3VnaCBgcmVnaXN0ZXJBcHAoKWAuXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgY29uc3QgcmVnaXN0ZXJFeHRlbnNpb24gPSAoZXh0ZW5zaW9uUmVnaXN0cmF0aW9uKT0+ZXh0ZW5zaW9uSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT57XG4gICAgICAgIHN0YXRlLmV4dGVuc2lvbnNbZXh0ZW5zaW9uUmVnaXN0cmF0aW9uLm5hbWVdID0ge1xuICAgICAgICAgICAgLi4uZXh0ZW5zaW9uUmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgaW5zdGFuY2VzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSk7XG4vKipcbiAqIEF0dGFjaCBhbiBleHRlbnNpb24gdG8gYW4gZXh0ZW5zaW9uIHNsb3QuXG4gKlxuICogVGhpcyB3aWxsIGNhdXNlIHRoZSBleHRlbnNpb24gdG8gYmUgcmVuZGVyZWQgaW50byB0aGUgc3BlY2lmaWVkXG4gKiBleHRlbnNpb24gc2xvdCwgdW5sZXNzIGl0IGlzIHJlbW92ZWQgYnkgY29uZmlndXJhdGlvbi4gVXNpbmdcbiAqIGBhdHRhY2hgIGlzIGFuIGFsdGVybmF0aXZlIHRvIHNwZWNpZnlpbmcgdGhlIGBzbG90YCBvciBgc2xvdHNgXG4gKiBpbiB0aGUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLlxuICpcbiAqIEl0IGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBjcmVhdGluZyBhIHNsb3QgaW50byB3aGljaFxuICogeW91IHdhbnQgdG8gcmVuZGVyIGFuIGV4aXN0aW5nIGV4dGVuc2lvbi4gVGhpcyBlbmFibGVzIHlvdVxuICogdG8gZG8gc28gd2l0aG91dCBtb2RpZnlpbmcgdGhlIGV4dGVuc2lvbidzIGRlY2xhcmF0aW9uLCB3aGljaFxuICogbWF5IGJlIGltcHJhY3RpY2FsIG9yIGluYXBwcm9wcmlhdGUsIGZvciBleGFtcGxlIGlmIHlvdSBhcmVcbiAqIHdyaXRpbmcgYSBtb2R1bGUgZm9yIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIHNsb3ROYW1lIGEgbmFtZSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGUgc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbklkIGFuIGV4dGVuc2lvbiBuYW1lLCB3aXRoIGFuIG9wdGlvbmFsICMtc3VmZml4XG4gKiAgICB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBleHRlbnNpb25cbiAqICAgIGF0dGFjaGVkIHRvIHRoZSBzYW1lIHNsb3QuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaChzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICB1cGRhdGVJbnRlcm5hbEV4dGVuc2lvblN0b3JlKChzdGF0ZSk9PntcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTbG90ID0gc3RhdGUuc2xvdHNbc2xvdE5hbWVdO1xuICAgICAgICBpZiAoIWV4aXN0aW5nU2xvdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zbG90cyxcbiAgICAgICAgICAgICAgICAgICAgW3Nsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3JlYXRlTmV3RXh0ZW5zaW9uU2xvdEluZm8oc2xvdE5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWRJZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgICAgIFtzbG90TmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nU2xvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkSWRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXhpc3RpbmdTbG90LmF0dGFjaGVkSWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIERldGFjaGVzIGFuIGV4dGVuc2lvbiBmcm9tIGFuIGV4dGVuc2lvbiBzbG90LlxuICpcbiAqIEBwYXJhbSBleHRlbnNpb25TbG90TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHNsb3QgdG8gZGV0YWNoIGZyb20uXG4gKiBAcGFyYW0gZXh0ZW5zaW9uSWQgVGhlIElEIG9mIHRoZSBleHRlbnNpb24gdG8gZGV0YWNoLlxuICpcbiAqIEBkZXByZWNhdGVkIEF2b2lkIHVzaW5nIHRoaXMuIEV4dGVuc2lvbiBhdHRhY2htZW50cyBzaG91bGQgYmUgY29uc2lkZXJlZCBkZWNsYXJhdGl2ZS5cbiAqLyBleHBvcnQgZnVuY3Rpb24gZGV0YWNoKGV4dGVuc2lvblNsb3ROYW1lLCBleHRlbnNpb25JZCkge1xuICAgIHVwZGF0ZUludGVybmFsRXh0ZW5zaW9uU3RvcmUoKHN0YXRlKT0+e1xuICAgICAgICBjb25zdCBleGlzdGluZ1Nsb3QgPSBzdGF0ZS5zbG90c1tleHRlbnNpb25TbG90TmFtZV07XG4gICAgICAgIGlmIChleGlzdGluZ1Nsb3QgJiYgZXhpc3RpbmdTbG90LmF0dGFjaGVkSWRzLmluY2x1ZGVzKGV4dGVuc2lvbklkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zbG90cyxcbiAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvblNsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXhpc3RpbmdTbG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWRJZHM6IGV4aXN0aW5nU2xvdC5hdHRhY2hlZElkcy5maWx0ZXIoKGlkKT0+aWQgIT09IGV4dGVuc2lvbklkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBEZXRhY2hlcyBhbGwgZXh0ZW5zaW9ucyBmcm9tIGFuIGV4dGVuc2lvbiBzbG90LlxuICpcbiAqIEBwYXJhbSBleHRlbnNpb25TbG90TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHNsb3QgdG8gY2xlYXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgQXZvaWQgdXNpbmcgdGhpcy4gRXh0ZW5zaW9uIGF0dGFjaG1lbnRzIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlY2xhcmF0aXZlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBkZXRhY2hBbGwoZXh0ZW5zaW9uU2xvdE5hbWUpIHtcbiAgICB1cGRhdGVJbnRlcm5hbEV4dGVuc2lvblN0b3JlKChzdGF0ZSk9PntcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTbG90ID0gc3RhdGUuc2xvdHNbZXh0ZW5zaW9uU2xvdE5hbWVdO1xuICAgICAgICBpZiAoZXhpc3RpbmdTbG90KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNsb3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uU2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5leGlzdGluZ1Nsb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZElkczogW11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogR2V0IGFuIG9yZGVyIGluZGV4IGZvciB0aGUgZXh0ZW5zaW9uLiBUaGlzIHdpbGxcbiAqIGNvbWUgZnJvbSBlaXRoZXIgaXRzIGNvbmZpZ3VyZWQgb3JkZXIsIGl0cyByZWdpc3RlcmVkIG9yZGVyXG4gKiBwYXJhbWV0ZXIsIG9yIHRoZSBvcmRlciBpbiB3aGljaCBpdCBoYXBwZW5lZCB0byBiZSBhdHRhY2hlZC5cbiAqLyBmdW5jdGlvbiBnZXRPcmRlcihleHRlbnNpb25JZCwgY29uZmlndXJlZE9yZGVyLCByZWdpc3RlcmVkT3JkZXJJbmRleCwgYXR0YWNoZWRPcmRlcikge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRJbmRleCA9IGNvbmZpZ3VyZWRPcmRlci5pbmRleE9mKGV4dGVuc2lvbklkKTtcbiAgICBpZiAoY29uZmlndXJlZEluZGV4ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gY29uZmlndXJlZEluZGV4O1xuICAgIH0gZWxzZSBpZiAocmVnaXN0ZXJlZE9yZGVySW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBleHRlbnNpb25zIHRoYXQgZG9uJ3QgaGF2ZSBhIGNvbmZpZ3VyZWQgb3JkZXIgc2hvdWxkIGFwcGVhciBhZnRlciB0aG9zZSB0aGF0IGRvXG4gICAgICAgIHJldHVybiAxMDAwICsgcmVnaXN0ZXJlZE9yZGVySW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXNzaWduZWRJbmRleCA9IGF0dGFjaGVkT3JkZXIuaW5kZXhPZihleHRlbnNpb25JZCk7XG4gICAgICAgIGlmIChhc3NpZ25lZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gZXh0ZW5zaW9ucyB0aGF0IGhhdmUgbmVpdGhlciBhIGNvbmZpZ3VyZWQgbm9yIHJlZ2lzdGVyZWQgb3JkZXIgc2hvdWxkIGFwcGVhclxuICAgICAgICAgICAgLy8gYWZ0ZXIgYWxsIG90aGVyc1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyBhc3NpZ25lZEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QXNzaWduZWRFeHRlbnNpb25zRnJvbVNsb3REYXRhKHNsb3ROYW1lLCBpbnRlcm5hbFN0YXRlLCBjb25maWcsIGV4dGVuc2lvbkNvbmZpZ1N0b3JlU3RhdGUsIGVuYWJsZWRGZWF0dXJlRmxhZ3MsIGlzT25saW5lLCBzZXNzaW9uKSB7XG4gICAgY29uc3QgYXR0YWNoZWRJZHMgPSBpbnRlcm5hbFN0YXRlLnNsb3RzW3Nsb3ROYW1lXS5hdHRhY2hlZElkcztcbiAgICBjb25zdCBhc3NpZ25lZElkcyA9IGNhbGN1bGF0ZUFzc2lnbmVkSWRzKGNvbmZpZywgYXR0YWNoZWRJZHMpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbXTtcbiAgICAvLyBDcmVhdGUgY29udGV4dCBvbmNlIGZvciBhbGwgZXh0ZW5zaW9ucyBpbiB0aGlzIHNsb3RcbiAgICBjb25zdCBzbG90U3RhdGUgPSBpbnRlcm5hbFN0YXRlLnNsb3RzW3Nsb3ROYW1lXT8uc3RhdGU7XG4gICAgY29uc3QgZXhwcmVzc2lvbkNvbnRleHQgPSBzbG90U3RhdGUgJiYgdHlwZW9mIHNsb3RTdGF0ZSA9PT0gJ29iamVjdCcgPyB7XG4gICAgICAgIHNlc3Npb24sXG4gICAgICAgIC4uLnNsb3RTdGF0ZVxuICAgIH0gOiB7XG4gICAgICAgIHNlc3Npb25cbiAgICB9O1xuICAgIGZvciAobGV0IGlkIG9mIGFzc2lnbmVkSWRzKXtcbiAgICAgICAgY29uc3QgeyBjb25maWc6IHJhd0V4dGVuc2lvbkNvbmZpZyB9ID0gZ2V0RXh0ZW5zaW9uQ29uZmlnRnJvbVN0b3JlKGV4dGVuc2lvbkNvbmZpZ1N0b3JlU3RhdGUsIHNsb3ROYW1lLCBpZCk7XG4gICAgICAgIGNvbnN0IHJhd0V4dGVuc2lvblNsb3RFeHRlbnNpb25Db25maWcgPSBnZXRFeHRlbnNpb25Db25maWdGcm9tRXh0ZW5zaW9uU2xvdFN0b3JlKGNvbmZpZywgc2xvdE5hbWUsIGlkKTtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uQ29uZmlnID0gbWVyZ2UocmF3RXh0ZW5zaW9uQ29uZmlnLCByYXdFeHRlbnNpb25TbG90RXh0ZW5zaW9uQ29uZmlnKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoaWQpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBpbnRlcm5hbFN0YXRlLmV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgIC8vIGlmIHRoZSBleHRlbnNpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgeWV0LCBkbyBub3QgaW5jbHVkZSBpdFxuICAgICAgICBpZiAoZXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZFByaXZpbGVnZXMgPSBleHRlbnNpb25Db25maWc/LlsnRGlzcGxheSBjb25kaXRpb25zJ10/LnByaXZpbGVnZXMgPz8gZXh0ZW5zaW9uLnByaXZpbGVnZXMgPz8gW107XG4gICAgICAgICAgICBpZiAocmVxdWlyZWRQcml2aWxlZ2VzICYmICh0eXBlb2YgcmVxdWlyZWRQcml2aWxlZ2VzID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KHJlcXVpcmVkUHJpdmlsZWdlcykgJiYgcmVxdWlyZWRQcml2aWxlZ2VzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uPy51c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXVzZXJIYXNBY2Nlc3MocmVxdWlyZWRQcml2aWxlZ2VzLCBzZXNzaW9uLnVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlDb25kaXRpb25FeHByZXNzaW9uID0gZXh0ZW5zaW9uQ29uZmlnPy5bJ0Rpc3BsYXkgY29uZGl0aW9ucyddPy5leHByZXNzaW9uIHx8IGV4dGVuc2lvbi5kaXNwbGF5RXhwcmVzc2lvbjtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5Q29uZGl0aW9uRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkaXNwbGF5Q29uZGl0aW9uRXhwcmVzc2lvbiA9PT0gJ3N0cmluZycgJiYgZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb24udHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV2YWx1YXRlQXNCb29sZWFuKGRpc3BsYXlDb25kaXRpb25FeHByZXNzaW9uLCBleHByZXNzaW9uQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB3aGlsZSBldmFsdWF0aW5nIGV4cHJlc3Npb24gJyR7ZGlzcGxheUNvbmRpdGlvbkV4cHJlc3Npb259JyBmb3IgZXh0ZW5zaW9uICR7bmFtZX0gaW4gc2xvdCAke3Nsb3ROYW1lfWAsIGUpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmZlYXR1cmVGbGFnICYmICFlbmFibGVkRmVhdHVyZUZsYWdzLmluY2x1ZGVzKGV4dGVuc2lvbi5mZWF0dXJlRmxhZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3aW5kb3cub2ZmbGluZUVuYWJsZWQgJiYgIWNoZWNrU3RhdHVzRm9yKGlzT25saW5lLCBleHRlbnNpb24ub25saW5lLCBleHRlbnNpb24ub2ZmbGluZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4dGVuc2lvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBleHRlbnNpb24ubW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICBjb25maWc6IGV4dGVuc2lvbkNvbmZpZyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlRmxhZzogZXh0ZW5zaW9uLmZlYXR1cmVGbGFnLFxuICAgICAgICAgICAgICAgIG1ldGE6IGV4dGVuc2lvbi5tZXRhLFxuICAgICAgICAgICAgICAgIG9ubGluZTogZXh0ZW5zaW9uQ29uZmlnPy5bJ0Rpc3BsYXkgY29uZGl0aW9ucyddPy5vbmxpbmUgPz8gZXh0ZW5zaW9uLm9ubGluZSA/PyB0cnVlLFxuICAgICAgICAgICAgICAgIG9mZmxpbmU6IGV4dGVuc2lvbkNvbmZpZz8uWydEaXNwbGF5IGNvbmRpdGlvbnMnXT8ub2ZmbGluZSA/PyBleHRlbnNpb24ub2ZmbGluZSA/PyBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvbnM7XG59XG4vKipcbiAqIEdldHMgdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyBhc3NpZ25lZCB0byBhIGdpdmVuIHNsb3RcbiAqXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIHNsb3QgdG8gbG9hZCB0aGUgYXNzaWduZWQgZXh0ZW5zaW9ucyBmb3JcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGV4dGVuc2lvbnMgYXNzaWduZWQgdG8gdGhlIG5hbWVkIHNsb3RcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0QXNzaWduZWRFeHRlbnNpb25zKHNsb3ROYW1lKSB7XG4gICAgY29uc3QgaW50ZXJuYWxTdGF0ZSA9IGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCB7IGNvbmZpZzogc2xvdENvbmZpZyB9ID0gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZyhzbG90TmFtZSk7XG4gICAgY29uc3QgZXh0ZW5zaW9uU3RvcmVTdGF0ZSA9IGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGZlYXR1cmVGbGFnU3RhdGUgPSBmZWF0dXJlRmxhZ3NTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHNlc3Npb25TdGF0ZSA9IHNlc3Npb25TdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGlzT25saW5lID0gaXNPbmxpbmVGbigpO1xuICAgIGNvbnN0IGVuYWJsZWRGZWF0dXJlRmxhZ3MgPSBPYmplY3QuZW50cmllcyhmZWF0dXJlRmxhZ1N0YXRlLmZsYWdzKS5maWx0ZXIoKFssIHsgZW5hYmxlZCB9XSk9PmVuYWJsZWQpLm1hcCgoW25hbWVdKT0+bmFtZSk7XG4gICAgcmV0dXJuIGdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YShzbG90TmFtZSwgaW50ZXJuYWxTdGF0ZSwgc2xvdENvbmZpZywgZXh0ZW5zaW9uU3RvcmVTdGF0ZSwgZW5hYmxlZEZlYXR1cmVGbGFncywgaXNPbmxpbmUsIHNlc3Npb25TdGF0ZS5zZXNzaW9uKTtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZUFzc2lnbmVkSWRzKGNvbmZpZywgYXR0YWNoZWRJZHMpIHtcbiAgICBjb25zdCBhZGRlZElkcyA9IGNvbmZpZy5hZGQgfHwgW107XG4gICAgY29uc3QgcmVtb3ZlZElkcyA9IGNvbmZpZy5yZW1vdmUgfHwgW107XG4gICAgY29uc3QgaWRPcmRlciA9IGNvbmZpZy5vcmRlciB8fCBbXTtcbiAgICBjb25zdCB7IGV4dGVuc2lvbnMgfSA9IGV4dGVuc2lvbkludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5hdHRhY2hlZElkcyxcbiAgICAgICAgLi4uYWRkZWRJZHNcbiAgICBdLmZpbHRlcigoaWQpPT4hcmVtb3ZlZElkcy5pbmNsdWRlcyhpZCkpLnNvcnQoKGlkQSwgaWRCKT0+e1xuICAgICAgICBjb25zdCBhaSA9IGdldE9yZGVyKGlkQSwgaWRPcmRlciwgZXh0ZW5zaW9uc1tnZXRFeHRlbnNpb25OYW1lRnJvbUlkKGlkQSldPy5vcmRlciwgYXR0YWNoZWRJZHMpO1xuICAgICAgICBjb25zdCBiaSA9IGdldE9yZGVyKGlkQiwgaWRPcmRlciwgZXh0ZW5zaW9uc1tnZXRFeHRlbnNpb25OYW1lRnJvbUlkKGlkQildPy5vcmRlciwgYXR0YWNoZWRJZHMpO1xuICAgICAgICBpZiAoYmkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYWkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhaSAtIGJpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIFVzZWQgYnkgYnkgZXh0ZW5zaW9uIHNsb3RzIGF0IG1vdW50IHRpbWUuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIHNsb3ROYW1lIFRoZSBleHRlbnNpb24gc2xvdCBuYW1lIHRoYXQgaXMgYWN0dWFsbHkgdXNlZFxuICogQHBhcmFtIHN0YXRlIE9wdGlvbmFsIGN1c3RvbSBzdGF0ZSBmb3IgdGhlIHNsb3QsIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBleHRlbnNpb24gc3RvcmUuXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgY29uc3QgcmVnaXN0ZXJFeHRlbnNpb25TbG90ID0gKG1vZHVsZU5hbWUsIHNsb3ROYW1lLCBzdGF0ZSk9PmV4dGVuc2lvbkludGVybmFsU3RvcmUuc2V0U3RhdGUoKGN1cnJlbnRTdGF0ZSk9PntcbiAgICAgICAgY29uc3QgZXhpc3RpbmdNb2R1bGVOYW1lID0gY3VycmVudFN0YXRlLnNsb3RzW3Nsb3ROYW1lXT8ubW9kdWxlTmFtZTtcbiAgICAgICAgaWYgKGV4aXN0aW5nTW9kdWxlTmFtZSAmJiBleGlzdGluZ01vZHVsZU5hbWUgIT0gbW9kdWxlTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBBbiBleHRlbnNpb24gc2xvdCB3aXRoIHRoZSBuYW1lICcke3Nsb3ROYW1lfScgYWxyZWFkeSBleGlzdHMuIFJlZnVzaW5nIHRvIHJlZ2lzdGVyIHRoZSBzYW1lIHNsb3QgbmFtZSB0d2ljZSAoaW4gXCJyZWdpc3RlckV4dGVuc2lvblNsb3RcIikuIFRoZSBleGlzdGluZyBvbmUgaXMgZnJvbSBtb2R1bGUgJHtleGlzdGluZ01vZHVsZU5hbWV9LmApO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhpc3RpbmdNb2R1bGVOYW1lICYmIGV4aXN0aW5nTW9kdWxlTmFtZSA9PSBtb2R1bGVOYW1lKSB7XG4gICAgICAgICAgICAvLyBSZS1yZW5kZXJpbmcgYW4gZXhpc3Rpbmcgc2xvdFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFN0YXRlLnNsb3RzW3Nsb3ROYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudFN0YXRlLnNsb3RzLFxuICAgICAgICAgICAgICAgICAgICBbc2xvdE5hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHNbc2xvdE5hbWVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNsb3QgPSBjcmVhdGVOZXdFeHRlbnNpb25TbG90SW5mbyhzbG90TmFtZSwgbW9kdWxlTmFtZSwgc3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgW3Nsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAuLi5zbG90XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xuLyoqXG4gKiBVc2VkIGJ5IGV4dGVuc2lvbiBzbG90cyB0byB1cGRhdGUgdGhlIGNvcHkgb2YgdGhlIHN0YXRlIGZvciB0aGUgZXh0ZW5zaW9uIHNsb3RcbiAqXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIHNsb3Qgd2l0aCBzdGF0ZSB0byB1cGRhdGVcbiAqIEBwYXJhbSBzdGF0ZSBBIGNvcHkgb2YgdGhlIG5ldyBzdGF0ZVxuICogQHBhcmFtIHBhcnRpYWwgV2hldGhlciB0aGlzIHNob3VsZCBiZSBhcHBsaWVkIGFzIGEgcGFydGlhbFxuICovIGV4cG9ydCBmdW5jdGlvbiB1cGRhdGVFeHRlbnNpb25TbG90U3RhdGUoc2xvdE5hbWUsIHN0YXRlLCBwYXJ0aWFsID0gZmFsc2UpIHtcbiAgICBleHRlbnNpb25JbnRlcm5hbFN0b3JlLnNldFN0YXRlKChjdXJyZW50U3RhdGUpPT57XG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0gcGFydGlhbCA/IG1lcmdlKGN1cnJlbnRTdGF0ZS5zbG90c1tzbG90TmFtZV0uc3RhdGUsIHN0YXRlKSA6IHN0YXRlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAgICAgW3Nsb3ROYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUuc2xvdHNbc2xvdE5hbWVdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogbmV3U3RhdGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICogSnVzdCBmb3IgdGVzdGluZy5cbiAqLyBleHBvcnQgY29uc3QgcmVzZXQgPSAoKT0+ZXh0ZW5zaW9uU3RvcmUuc2V0U3RhdGUoKCk9PntcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNsb3RzOiB7fSxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IHt9XG4gICAgICAgIH07XG4gICAgfSk7XG4iXSwibmFtZXMiOlsic2Vzc2lvblN0b3JlIiwidXNlckhhc0FjY2VzcyIsImdldEV4dGVuc2lvbkNvbmZpZ0Zyb21FeHRlbnNpb25TbG90U3RvcmUiLCJnZXRFeHRlbnNpb25Db25maWdGcm9tU3RvcmUiLCJnZXRFeHRlbnNpb25TbG90Q29uZmlnIiwiZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ0Zyb21TdG9yZSIsImdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUiLCJldmFsdWF0ZUFzQm9vbGVhbiIsImZlYXR1cmVGbGFnc1N0b3JlIiwic3Vic2NyaWJlQ29ubmVjdGl2aXR5Q2hhbmdlZCIsImlzT25saW5lIiwiaXNPbmxpbmVGbiIsImlzRXF1YWwiLCJtZXJnZSIsImNoZWNrU3RhdHVzRm9yIiwiZ2V0RXh0ZW5zaW9uSW50ZXJuYWxTdG9yZSIsImdldEV4dGVuc2lvblN0b3JlIiwidXBkYXRlSW50ZXJuYWxFeHRlbnNpb25TdG9yZSIsImV4dGVuc2lvbkludGVybmFsU3RvcmUiLCJleHRlbnNpb25TdG9yZSIsInNsb3RzQ29uZmlnU3RvcmUiLCJleHRlbnNpb25zQ29uZmlnU3RvcmUiLCJ1cGRhdGVFeHRlbnNpb25PdXRwdXRTdG9yZSIsImludGVybmFsU3RhdGUiLCJleHRlbnNpb25TbG90Q29uZmlncyIsImZlYXR1cmVGbGFnU3RvcmUiLCJzbG90cyIsImVuYWJsZWRGZWF0dXJlRmxhZ3MiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmxhZ3MiLCJmaWx0ZXIiLCJlbmFibGVkIiwibWFwIiwibmFtZSIsInNsb3ROYW1lIiwic2xvdCIsImNvbmZpZyIsImFzc2lnbmVkRXh0ZW5zaW9ucyIsImdldEFzc2lnbmVkRXh0ZW5zaW9uc0Zyb21TbG90RGF0YSIsInNlc3Npb24iLCJtb2R1bGVOYW1lIiwiZ2V0U3RhdGUiLCJzZXRTdGF0ZSIsInN1YnNjcmliZSIsImludGVybmFsU3RvcmUiLCJzbG90Q29uZmlncyIsImV4dGVuc2lvbkNvbmZpZ3MiLCJ1cGRhdGVPdXRwdXRTdG9yZVRvQ3VycmVudCIsImNyZWF0ZU5ld0V4dGVuc2lvblNsb3RJbmZvIiwic3RhdGUiLCJhdHRhY2hlZElkcyIsImdldEV4dGVuc2lvbk5hbWVGcm9tSWQiLCJleHRlbnNpb25JZCIsImV4dGVuc2lvbk5hbWUiLCJzcGxpdCIsImdldEV4dGVuc2lvblJlZ2lzdHJhdGlvbkZyb20iLCJleHRlbnNpb25zIiwiZ2V0RXh0ZW5zaW9uUmVnaXN0cmF0aW9uIiwicmVnaXN0ZXJFeHRlbnNpb24iLCJleHRlbnNpb25SZWdpc3RyYXRpb24iLCJpbnN0YW5jZXMiLCJhdHRhY2giLCJleGlzdGluZ1Nsb3QiLCJkZXRhY2giLCJleHRlbnNpb25TbG90TmFtZSIsImluY2x1ZGVzIiwiaWQiLCJkZXRhY2hBbGwiLCJnZXRPcmRlciIsImNvbmZpZ3VyZWRPcmRlciIsInJlZ2lzdGVyZWRPcmRlckluZGV4IiwiYXR0YWNoZWRPcmRlciIsImNvbmZpZ3VyZWRJbmRleCIsImluZGV4T2YiLCJ1bmRlZmluZWQiLCJhc3NpZ25lZEluZGV4IiwiZXh0ZW5zaW9uQ29uZmlnU3RvcmVTdGF0ZSIsImFzc2lnbmVkSWRzIiwiY2FsY3VsYXRlQXNzaWduZWRJZHMiLCJzbG90U3RhdGUiLCJleHByZXNzaW9uQ29udGV4dCIsInJhd0V4dGVuc2lvbkNvbmZpZyIsInJhd0V4dGVuc2lvblNsb3RFeHRlbnNpb25Db25maWciLCJleHRlbnNpb25Db25maWciLCJleHRlbnNpb24iLCJyZXF1aXJlZFByaXZpbGVnZXMiLCJwcml2aWxlZ2VzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwidXNlciIsImRpc3BsYXlDb25kaXRpb25FeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImRpc3BsYXlFeHByZXNzaW9uIiwidHJpbSIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJmZWF0dXJlRmxhZyIsIndpbmRvdyIsIm9mZmxpbmVFbmFibGVkIiwib25saW5lIiwib2ZmbGluZSIsInB1c2giLCJtZXRhIiwiZ2V0QXNzaWduZWRFeHRlbnNpb25zIiwic2xvdENvbmZpZyIsImV4dGVuc2lvblN0b3JlU3RhdGUiLCJmZWF0dXJlRmxhZ1N0YXRlIiwic2Vzc2lvblN0YXRlIiwiYWRkZWRJZHMiLCJhZGQiLCJyZW1vdmVkSWRzIiwicmVtb3ZlIiwiaWRPcmRlciIsIm9yZGVyIiwic29ydCIsImlkQSIsImlkQiIsImFpIiwiYmkiLCJyZWdpc3RlckV4dGVuc2lvblNsb3QiLCJjdXJyZW50U3RhdGUiLCJleGlzdGluZ01vZHVsZU5hbWUiLCJ3YXJuIiwidXBkYXRlRXh0ZW5zaW9uU2xvdFN0YXRlIiwicGFydGlhbCIsIm5ld1N0YXRlIiwicmVzZXQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-extensions/dist/extensions.js\n");
449
449
 
450
450
  /***/ }),
451
451
 
@@ -545,7 +545,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
545
545
  \***************************************************************/
546
546
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
547
547
 
548
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ cleanupObsoleteFeatureFlags: () => (/* binding */ cleanupObsoleteFeatureFlags),\n/* harmony export */ featureFlagsStore: () => (/* binding */ featureFlagsStore),\n/* harmony export */ getFeatureFlag: () => (/* binding */ getFeatureFlag),\n/* harmony export */ registerFeatureFlag: () => (/* binding */ registerFeatureFlag),\n/* harmony export */ setFeatureFlag: () => (/* binding */ setFeatureFlag),\n/* harmony export */ subscribeToFeatureFlag: () => (/* binding */ subscribeToFeatureFlag)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/** @module @category Feature Flags */ \nconst initialFeatureFlags = {\n flags: getFeatureFlagsFromLocalStorage()\n};\n/** @internal */ const featureFlagsStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)('feature-flags', initialFeatureFlags);\nfeatureFlagsStore.subscribe((state)=>{\n for (const [flagName, flag] of Object.entries(state.flags)){\n localStorage.setItem(`openmrs:feature-flag:${flagName}`, flag.enabled.toString());\n localStorage.setItem(`openmrs:feature-flag-meta:${flagName}`, JSON.stringify({\n label: flag.label,\n description: flag.description\n }));\n }\n});\nfunction getFeatureFlagsFromLocalStorage() {\n const flags = {};\n for (const key of Object.keys(localStorage)){\n if (key.startsWith('openmrs:feature-flag:')) {\n const flagName = key.replace('openmrs:feature-flag:', '');\n const meta = JSON.parse(localStorage.getItem(`openmrs:feature-flag-meta:${flagName}`) || '{}');\n flags[flagName] = {\n enabled: localStorage.getItem(key) === 'true',\n ...meta\n };\n }\n }\n return flags;\n}\n/**\n * This function creates a feature flag. Call it in top-level code anywhere. It will\n * not reset whether the flag is enabled or not, so it's safe to call it multiple times.\n * Once a feature flag is created, it will appear with a toggle in the Implementer Tools.\n * It can then be used to turn on or off features in the code.\n *\n * @param flagName A code-friendly name for the flag, which will be used to reference it in code\n * @param label A human-friendly name which will be displayed in the Implementer Tools\n * @param description An explanation of what the flag does, which will be displayed in the Implementer Tools\n */ function registerFeatureFlag(flagName, label, description) {\n featureFlagsStore.setState((state)=>({\n flags: {\n ...state.flags,\n [flagName]: {\n enabled: state.flags[flagName]?.enabled ?? false,\n label,\n description\n }\n }\n }));\n}\n/**\n * This function removes feature flags from local storage that no longer exist in the current state.\n */ function cleanupObsoleteFeatureFlags() {\n const flags = featureFlagsStore.getState().flags;\n Object.keys(localStorage).filter((key)=>key.startsWith('openmrs:feature-flag:')).forEach((key)=>{\n const flagName = key.replace('openmrs:feature-flag:', '');\n if (!flags[flagName]) {\n localStorage.removeItem(key);\n localStorage.removeItem(`openmrs:feature-flag-meta:${flagName}`);\n }\n });\n}\n/** Use this function to access the current value of the feature flag\n *\n * If you are using React, use `useFeatureFlag` instead.\n */ function getFeatureFlag(flagName) {\n return featureFlagsStore.getState().flags[flagName].enabled;\n}\n/** Use this function to subscribe to the value of the feature flag\n *\n * If you are using React, use `useFeatureFlag` instead.\n */ function subscribeToFeatureFlag(flagName, callback) {\n featureFlagsStore.subscribe((state)=>{\n callback(state.flags[flagName].enabled);\n });\n}\n/** @internal for Implementer Tools */ function setFeatureFlag(flagName, value) {\n featureFlagsStore.setState((state)=>({\n flags: {\n ...state.flags,\n [flagName]: {\n ...state.flags[flagName],\n enabled: value\n }\n }\n }));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1mZWF0dXJlLWZsYWdzL2Rpc3QvZmVhdHVyZS1mbGFncy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsb0NBQW9DLEdBQXVEO0FBQzNGLE1BQU1DLHNCQUFzQjtJQUN4QkMsT0FBT0M7QUFDWDtBQUNBLGNBQWMsR0FBVSxNQUFNQyxvQkFBb0JKLGtFQUFjQSxDQUFDLGlCQUFpQkMscUJBQXFCO0FBQ3ZHRyxrQkFBa0JDLFNBQVMsQ0FBQyxDQUFDQztJQUN6QixLQUFLLE1BQU0sQ0FBQ0MsVUFBVUMsS0FBSyxJQUFJQyxPQUFPQyxPQUFPLENBQUNKLE1BQU1KLEtBQUssRUFBRTtRQUN2RFMsYUFBYUMsT0FBTyxDQUFDLENBQUMscUJBQXFCLEVBQUVMLFVBQVUsRUFBRUMsS0FBS0ssT0FBTyxDQUFDQyxRQUFRO1FBQzlFSCxhQUFhQyxPQUFPLENBQUMsQ0FBQywwQkFBMEIsRUFBRUwsVUFBVSxFQUFFUSxLQUFLQyxTQUFTLENBQUM7WUFDekVDLE9BQU9ULEtBQUtTLEtBQUs7WUFDakJDLGFBQWFWLEtBQUtVLFdBQVc7UUFDakM7SUFDSjtBQUNKO0FBQ0EsU0FBU2Y7SUFDTCxNQUFNRCxRQUFRLENBQUM7SUFDZixLQUFLLE1BQU1pQixPQUFPVixPQUFPVyxJQUFJLENBQUNULGNBQWM7UUFDeEMsSUFBSVEsSUFBSUUsVUFBVSxDQUFDLDBCQUEwQjtZQUN6QyxNQUFNZCxXQUFXWSxJQUFJRyxPQUFPLENBQUMseUJBQXlCO1lBQ3RELE1BQU1DLE9BQU9SLEtBQUtTLEtBQUssQ0FBQ2IsYUFBYWMsT0FBTyxDQUFDLENBQUMsMEJBQTBCLEVBQUVsQixVQUFVLEtBQUs7WUFDekZMLEtBQUssQ0FBQ0ssU0FBUyxHQUFHO2dCQUNkTSxTQUFTRixhQUFhYyxPQUFPLENBQUNOLFNBQVM7Z0JBQ3ZDLEdBQUdJLElBQUk7WUFDWDtRQUNKO0lBQ0o7SUFDQSxPQUFPckI7QUFDWDtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUFVLFNBQVN3QixvQkFBb0JuQixRQUFRLEVBQUVVLEtBQUssRUFBRUMsV0FBVztJQUNoRWQsa0JBQWtCdUIsUUFBUSxDQUFDLENBQUNyQixRQUFTO1lBQzdCSixPQUFPO2dCQUNILEdBQUdJLE1BQU1KLEtBQUs7Z0JBQ2QsQ0FBQ0ssU0FBUyxFQUFFO29CQUNSTSxTQUFTUCxNQUFNSixLQUFLLENBQUNLLFNBQVMsRUFBRU0sV0FBVztvQkFDM0NJO29CQUNBQztnQkFDSjtZQUNKO1FBQ0o7QUFDUjtBQUNBOztDQUVDLEdBQVUsU0FBU1U7SUFDaEIsTUFBTTFCLFFBQVFFLGtCQUFrQnlCLFFBQVEsR0FBRzNCLEtBQUs7SUFDaERPLE9BQU9XLElBQUksQ0FBQ1QsY0FBY21CLE1BQU0sQ0FBQyxDQUFDWCxNQUFNQSxJQUFJRSxVQUFVLENBQUMsMEJBQTBCVSxPQUFPLENBQUMsQ0FBQ1o7UUFDdEYsTUFBTVosV0FBV1ksSUFBSUcsT0FBTyxDQUFDLHlCQUF5QjtRQUN0RCxJQUFJLENBQUNwQixLQUFLLENBQUNLLFNBQVMsRUFBRTtZQUNsQkksYUFBYXFCLFVBQVUsQ0FBQ2I7WUFDeEJSLGFBQWFxQixVQUFVLENBQUMsQ0FBQywwQkFBMEIsRUFBRXpCLFVBQVU7UUFDbkU7SUFDSjtBQUNKO0FBQ0E7OztDQUdDLEdBQVUsU0FBUzBCLGVBQWUxQixRQUFRO0lBQ3ZDLE9BQU9ILGtCQUFrQnlCLFFBQVEsR0FBRzNCLEtBQUssQ0FBQ0ssU0FBUyxDQUFDTSxPQUFPO0FBQy9EO0FBQ0E7OztDQUdDLEdBQVUsU0FBU3FCLHVCQUF1QjNCLFFBQVEsRUFBRTRCLFFBQVE7SUFDekQvQixrQkFBa0JDLFNBQVMsQ0FBQyxDQUFDQztRQUN6QjZCLFNBQVM3QixNQUFNSixLQUFLLENBQUNLLFNBQVMsQ0FBQ00sT0FBTztJQUMxQztBQUNKO0FBQ0Esb0NBQW9DLEdBQVUsU0FBU3VCLGVBQWU3QixRQUFRLEVBQUU4QixLQUFLO0lBQ2pGakMsa0JBQWtCdUIsUUFBUSxDQUFDLENBQUNyQixRQUFTO1lBQzdCSixPQUFPO2dCQUNILEdBQUdJLE1BQU1KLEtBQUs7Z0JBQ2QsQ0FBQ0ssU0FBUyxFQUFFO29CQUNSLEdBQUdELE1BQU1KLEtBQUssQ0FBQ0ssU0FBUztvQkFDeEJNLFNBQVN3QjtnQkFDYjtZQUNKO1FBQ0o7QUFDUiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1mZWF0dXJlLWZsYWdzL2Rpc3QvZmVhdHVyZS1mbGFncy5qcz83MTE3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBGZWF0dXJlIEZsYWdzICovIGltcG9ydCB7IGdldEdsb2JhbFN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1zdGF0ZVwiO1xuY29uc3QgaW5pdGlhbEZlYXR1cmVGbGFncyA9IHtcbiAgICBmbGFnczogZ2V0RmVhdHVyZUZsYWdzRnJvbUxvY2FsU3RvcmFnZSgpXG59O1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3QgZmVhdHVyZUZsYWdzU3RvcmUgPSBnZXRHbG9iYWxTdG9yZSgnZmVhdHVyZS1mbGFncycsIGluaXRpYWxGZWF0dXJlRmxhZ3MpO1xuZmVhdHVyZUZsYWdzU3RvcmUuc3Vic2NyaWJlKChzdGF0ZSk9PntcbiAgICBmb3IgKGNvbnN0IFtmbGFnTmFtZSwgZmxhZ10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGUuZmxhZ3MpKXtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYG9wZW5tcnM6ZmVhdHVyZS1mbGFnOiR7ZmxhZ05hbWV9YCwgZmxhZy5lbmFibGVkLnRvU3RyaW5nKCkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgb3Blbm1yczpmZWF0dXJlLWZsYWctbWV0YToke2ZsYWdOYW1lfWAsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGxhYmVsOiBmbGFnLmxhYmVsLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGZsYWcuZGVzY3JpcHRpb25cbiAgICAgICAgfSkpO1xuICAgIH1cbn0pO1xuZnVuY3Rpb24gZ2V0RmVhdHVyZUZsYWdzRnJvbUxvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCBmbGFncyA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGxvY2FsU3RvcmFnZSkpe1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ29wZW5tcnM6ZmVhdHVyZS1mbGFnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnTmFtZSA9IGtleS5yZXBsYWNlKCdvcGVubXJzOmZlYXR1cmUtZmxhZzonLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgb3Blbm1yczpmZWF0dXJlLWZsYWctbWV0YToke2ZsYWdOYW1lfWApIHx8ICd7fScpO1xuICAgICAgICAgICAgZmxhZ3NbZmxhZ05hbWVdID0ge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgPT09ICd0cnVlJyxcbiAgICAgICAgICAgICAgICAuLi5tZXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbGFncztcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZmVhdHVyZSBmbGFnLiBDYWxsIGl0IGluIHRvcC1sZXZlbCBjb2RlIGFueXdoZXJlLiBJdCB3aWxsXG4gKiBub3QgcmVzZXQgd2hldGhlciB0aGUgZmxhZyBpcyBlbmFibGVkIG9yIG5vdCwgc28gaXQncyBzYWZlIHRvIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMuXG4gKiBPbmNlIGEgZmVhdHVyZSBmbGFnIGlzIGNyZWF0ZWQsIGl0IHdpbGwgYXBwZWFyIHdpdGggYSB0b2dnbGUgaW4gdGhlIEltcGxlbWVudGVyIFRvb2xzLlxuICogSXQgY2FuIHRoZW4gYmUgdXNlZCB0byB0dXJuIG9uIG9yIG9mZiBmZWF0dXJlcyBpbiB0aGUgY29kZS5cbiAqXG4gKiBAcGFyYW0gZmxhZ05hbWUgQSBjb2RlLWZyaWVuZGx5IG5hbWUgZm9yIHRoZSBmbGFnLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGl0IGluIGNvZGVcbiAqIEBwYXJhbSBsYWJlbCBBIGh1bWFuLWZyaWVuZGx5IG5hbWUgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIEltcGxlbWVudGVyIFRvb2xzXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gQW4gZXhwbGFuYXRpb24gb2Ygd2hhdCB0aGUgZmxhZyBkb2VzLCB3aGljaCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgSW1wbGVtZW50ZXIgVG9vbHNcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGZWF0dXJlRmxhZyhmbGFnTmFtZSwgbGFiZWwsIGRlc2NyaXB0aW9uKSB7XG4gICAgZmVhdHVyZUZsYWdzU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIGZsYWdzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuZmxhZ3MsXG4gICAgICAgICAgICAgICAgW2ZsYWdOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBzdGF0ZS5mbGFnc1tmbGFnTmFtZV0/LmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZmVhdHVyZSBmbGFncyBmcm9tIGxvY2FsIHN0b3JhZ2UgdGhhdCBubyBsb25nZXIgZXhpc3QgaW4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGNsZWFudXBPYnNvbGV0ZUZlYXR1cmVGbGFncygpIHtcbiAgICBjb25zdCBmbGFncyA9IGZlYXR1cmVGbGFnc1N0b3JlLmdldFN0YXRlKCkuZmxhZ3M7XG4gICAgT2JqZWN0LmtleXMobG9jYWxTdG9yYWdlKS5maWx0ZXIoKGtleSk9PmtleS5zdGFydHNXaXRoKCdvcGVubXJzOmZlYXR1cmUtZmxhZzonKSkuZm9yRWFjaCgoa2V5KT0+e1xuICAgICAgICBjb25zdCBmbGFnTmFtZSA9IGtleS5yZXBsYWNlKCdvcGVubXJzOmZlYXR1cmUtZmxhZzonLCAnJyk7XG4gICAgICAgIGlmICghZmxhZ3NbZmxhZ05hbWVdKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYG9wZW5tcnM6ZmVhdHVyZS1mbGFnLW1ldGE6JHtmbGFnTmFtZX1gKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGFjY2VzcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmVhdHVyZSBmbGFnXG4gKlxuICogSWYgeW91IGFyZSB1c2luZyBSZWFjdCwgdXNlIGB1c2VGZWF0dXJlRmxhZ2AgaW5zdGVhZC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RmVhdHVyZUZsYWcoZmxhZ05hbWUpIHtcbiAgICByZXR1cm4gZmVhdHVyZUZsYWdzU3RvcmUuZ2V0U3RhdGUoKS5mbGFnc1tmbGFnTmFtZV0uZW5hYmxlZDtcbn1cbi8qKiBVc2UgdGhpcyBmdW5jdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmZWF0dXJlIGZsYWdcbiAqXG4gKiBJZiB5b3UgYXJlIHVzaW5nIFJlYWN0LCB1c2UgYHVzZUZlYXR1cmVGbGFnYCBpbnN0ZWFkLlxuICovIGV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVUb0ZlYXR1cmVGbGFnKGZsYWdOYW1lLCBjYWxsYmFjaykge1xuICAgIGZlYXR1cmVGbGFnc1N0b3JlLnN1YnNjcmliZSgoc3RhdGUpPT57XG4gICAgICAgIGNhbGxiYWNrKHN0YXRlLmZsYWdzW2ZsYWdOYW1lXS5lbmFibGVkKTtcbiAgICB9KTtcbn1cbi8qKiBAaW50ZXJuYWwgZm9yIEltcGxlbWVudGVyIFRvb2xzICovIGV4cG9ydCBmdW5jdGlvbiBzZXRGZWF0dXJlRmxhZyhmbGFnTmFtZSwgdmFsdWUpIHtcbiAgICBmZWF0dXJlRmxhZ3NTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgZmxhZ3M6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5mbGFncyxcbiAgICAgICAgICAgICAgICBbZmxhZ05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmZsYWdzW2ZsYWdOYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbiJdLCJuYW1lcyI6WyJnZXRHbG9iYWxTdG9yZSIsImluaXRpYWxGZWF0dXJlRmxhZ3MiLCJmbGFncyIsImdldEZlYXR1cmVGbGFnc0Zyb21Mb2NhbFN0b3JhZ2UiLCJmZWF0dXJlRmxhZ3NTdG9yZSIsInN1YnNjcmliZSIsInN0YXRlIiwiZmxhZ05hbWUiLCJmbGFnIiwiT2JqZWN0IiwiZW50cmllcyIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJlbmFibGVkIiwidG9TdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsImtleSIsImtleXMiLCJzdGFydHNXaXRoIiwicmVwbGFjZSIsIm1ldGEiLCJwYXJzZSIsImdldEl0ZW0iLCJyZWdpc3RlckZlYXR1cmVGbGFnIiwic2V0U3RhdGUiLCJjbGVhbnVwT2Jzb2xldGVGZWF0dXJlRmxhZ3MiLCJnZXRTdGF0ZSIsImZpbHRlciIsImZvckVhY2giLCJyZW1vdmVJdGVtIiwiZ2V0RmVhdHVyZUZsYWciLCJzdWJzY3JpYmVUb0ZlYXR1cmVGbGFnIiwiY2FsbGJhY2siLCJzZXRGZWF0dXJlRmxhZyIsInZhbHVlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-feature-flags/dist/feature-flags.js\n");
548
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ cleanupObsoleteFeatureFlags: () => (/* binding */ cleanupObsoleteFeatureFlags),\n/* harmony export */ featureFlagsStore: () => (/* binding */ featureFlagsStore),\n/* harmony export */ getFeatureFlag: () => (/* binding */ getFeatureFlag),\n/* harmony export */ registerFeatureFlag: () => (/* binding */ registerFeatureFlag),\n/* harmony export */ setFeatureFlag: () => (/* binding */ setFeatureFlag),\n/* harmony export */ subscribeToFeatureFlag: () => (/* binding */ subscribeToFeatureFlag)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-state */ \"../../framework/esm-state/dist/index.js\");\n/** @module @category Feature Flags */ \nconst initialFeatureFlags = {\n flags: getFeatureFlagsFromLocalStorage()\n};\n/** @internal */ const featureFlagsStore = (0,_openmrs_esm_state__WEBPACK_IMPORTED_MODULE_0__.getGlobalStore)('feature-flags', initialFeatureFlags);\nfeatureFlagsStore.subscribe((state)=>{\n for (const [flagName, flag] of Object.entries(state.flags)){\n localStorage.setItem(`openmrs:feature-flag:${flagName}`, flag.enabled.toString());\n localStorage.setItem(`openmrs:feature-flag-meta:${flagName}`, JSON.stringify({\n label: flag.label,\n description: flag.description\n }));\n }\n});\nfunction getFeatureFlagsFromLocalStorage() {\n const flags = {};\n for (const key of Object.keys(localStorage)){\n if (key.startsWith('openmrs:feature-flag:')) {\n const flagName = key.replace('openmrs:feature-flag:', '');\n const meta = JSON.parse(localStorage.getItem(`openmrs:feature-flag-meta:${flagName}`) || '{}');\n flags[flagName] = {\n enabled: localStorage.getItem(key) === 'true',\n ...meta\n };\n }\n }\n return flags;\n}\n/**\n * This function creates a feature flag. Call it in top-level code anywhere. It will\n * not reset whether the flag is enabled or not, so it's safe to call it multiple times.\n * Once a feature flag is created, it will appear with a toggle in the Implementer Tools.\n * It can then be used to turn on or off features in the code.\n *\n * @param flagName A code-friendly name for the flag, which will be used to reference it in code\n * @param label A human-friendly name which will be displayed in the Implementer Tools\n * @param description An explanation of what the flag does, which will be displayed in the Implementer Tools\n */ function registerFeatureFlag(flagName, label, description) {\n featureFlagsStore.setState((state)=>({\n flags: {\n ...state.flags,\n [flagName]: {\n enabled: state.flags[flagName]?.enabled ?? false,\n label,\n description\n }\n }\n }));\n}\n/**\n * This function removes feature flags from local storage that no longer exist in the current state.\n */ function cleanupObsoleteFeatureFlags() {\n const flags = featureFlagsStore.getState().flags;\n Object.keys(localStorage).filter((key)=>key.startsWith('openmrs:feature-flag:')).forEach((key)=>{\n const flagName = key.replace('openmrs:feature-flag:', '');\n if (!flags[flagName]) {\n localStorage.removeItem(key);\n localStorage.removeItem(`openmrs:feature-flag-meta:${flagName}`);\n }\n });\n}\n/**\n * Use this function to access the current value of the feature flag.\n *\n * If you are using React, use `useFeatureFlag` instead.\n *\n * @param flagName The name of the feature flag to check.\n * @returns `true` if the feature flag is enabled, `false` otherwise.\n */ function getFeatureFlag(flagName) {\n return featureFlagsStore.getState().flags[flagName].enabled;\n}\n/**\n * Use this function to subscribe to the value of the feature flag.\n * The callback will be invoked immediately with the current value and\n * again whenever the flag value changes.\n *\n * If you are using React, use `useFeatureFlag` instead.\n *\n * @param flagName The name of the feature flag to subscribe to.\n * @param callback A function that will be called with the current flag value.\n */ function subscribeToFeatureFlag(flagName, callback) {\n featureFlagsStore.subscribe((state)=>{\n callback(state.flags[flagName].enabled);\n });\n}\n/** @internal for Implementer Tools */ function setFeatureFlag(flagName, value) {\n featureFlagsStore.setState((state)=>({\n flags: {\n ...state.flags,\n [flagName]: {\n ...state.flags[flagName],\n enabled: value\n }\n }\n }));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1mZWF0dXJlLWZsYWdzL2Rpc3QvZmVhdHVyZS1mbGFncy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsb0NBQW9DLEdBQXVEO0FBQzNGLE1BQU1DLHNCQUFzQjtJQUN4QkMsT0FBT0M7QUFDWDtBQUNBLGNBQWMsR0FBVSxNQUFNQyxvQkFBb0JKLGtFQUFjQSxDQUFDLGlCQUFpQkMscUJBQXFCO0FBQ3ZHRyxrQkFBa0JDLFNBQVMsQ0FBQyxDQUFDQztJQUN6QixLQUFLLE1BQU0sQ0FBQ0MsVUFBVUMsS0FBSyxJQUFJQyxPQUFPQyxPQUFPLENBQUNKLE1BQU1KLEtBQUssRUFBRTtRQUN2RFMsYUFBYUMsT0FBTyxDQUFDLENBQUMscUJBQXFCLEVBQUVMLFVBQVUsRUFBRUMsS0FBS0ssT0FBTyxDQUFDQyxRQUFRO1FBQzlFSCxhQUFhQyxPQUFPLENBQUMsQ0FBQywwQkFBMEIsRUFBRUwsVUFBVSxFQUFFUSxLQUFLQyxTQUFTLENBQUM7WUFDekVDLE9BQU9ULEtBQUtTLEtBQUs7WUFDakJDLGFBQWFWLEtBQUtVLFdBQVc7UUFDakM7SUFDSjtBQUNKO0FBQ0EsU0FBU2Y7SUFDTCxNQUFNRCxRQUFRLENBQUM7SUFDZixLQUFLLE1BQU1pQixPQUFPVixPQUFPVyxJQUFJLENBQUNULGNBQWM7UUFDeEMsSUFBSVEsSUFBSUUsVUFBVSxDQUFDLDBCQUEwQjtZQUN6QyxNQUFNZCxXQUFXWSxJQUFJRyxPQUFPLENBQUMseUJBQXlCO1lBQ3RELE1BQU1DLE9BQU9SLEtBQUtTLEtBQUssQ0FBQ2IsYUFBYWMsT0FBTyxDQUFDLENBQUMsMEJBQTBCLEVBQUVsQixVQUFVLEtBQUs7WUFDekZMLEtBQUssQ0FBQ0ssU0FBUyxHQUFHO2dCQUNkTSxTQUFTRixhQUFhYyxPQUFPLENBQUNOLFNBQVM7Z0JBQ3ZDLEdBQUdJLElBQUk7WUFDWDtRQUNKO0lBQ0o7SUFDQSxPQUFPckI7QUFDWDtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUFVLFNBQVN3QixvQkFBb0JuQixRQUFRLEVBQUVVLEtBQUssRUFBRUMsV0FBVztJQUNoRWQsa0JBQWtCdUIsUUFBUSxDQUFDLENBQUNyQixRQUFTO1lBQzdCSixPQUFPO2dCQUNILEdBQUdJLE1BQU1KLEtBQUs7Z0JBQ2QsQ0FBQ0ssU0FBUyxFQUFFO29CQUNSTSxTQUFTUCxNQUFNSixLQUFLLENBQUNLLFNBQVMsRUFBRU0sV0FBVztvQkFDM0NJO29CQUNBQztnQkFDSjtZQUNKO1FBQ0o7QUFDUjtBQUNBOztDQUVDLEdBQVUsU0FBU1U7SUFDaEIsTUFBTTFCLFFBQVFFLGtCQUFrQnlCLFFBQVEsR0FBRzNCLEtBQUs7SUFDaERPLE9BQU9XLElBQUksQ0FBQ1QsY0FBY21CLE1BQU0sQ0FBQyxDQUFDWCxNQUFNQSxJQUFJRSxVQUFVLENBQUMsMEJBQTBCVSxPQUFPLENBQUMsQ0FBQ1o7UUFDdEYsTUFBTVosV0FBV1ksSUFBSUcsT0FBTyxDQUFDLHlCQUF5QjtRQUN0RCxJQUFJLENBQUNwQixLQUFLLENBQUNLLFNBQVMsRUFBRTtZQUNsQkksYUFBYXFCLFVBQVUsQ0FBQ2I7WUFDeEJSLGFBQWFxQixVQUFVLENBQUMsQ0FBQywwQkFBMEIsRUFBRXpCLFVBQVU7UUFDbkU7SUFDSjtBQUNKO0FBQ0E7Ozs7Ozs7Q0FPQyxHQUFVLFNBQVMwQixlQUFlMUIsUUFBUTtJQUN2QyxPQUFPSCxrQkFBa0J5QixRQUFRLEdBQUczQixLQUFLLENBQUNLLFNBQVMsQ0FBQ00sT0FBTztBQUMvRDtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUFVLFNBQVNxQix1QkFBdUIzQixRQUFRLEVBQUU0QixRQUFRO0lBQ3pEL0Isa0JBQWtCQyxTQUFTLENBQUMsQ0FBQ0M7UUFDekI2QixTQUFTN0IsTUFBTUosS0FBSyxDQUFDSyxTQUFTLENBQUNNLE9BQU87SUFDMUM7QUFDSjtBQUNBLG9DQUFvQyxHQUFVLFNBQVN1QixlQUFlN0IsUUFBUSxFQUFFOEIsS0FBSztJQUNqRmpDLGtCQUFrQnVCLFFBQVEsQ0FBQyxDQUFDckIsUUFBUztZQUM3QkosT0FBTztnQkFDSCxHQUFHSSxNQUFNSixLQUFLO2dCQUNkLENBQUNLLFNBQVMsRUFBRTtvQkFDUixHQUFHRCxNQUFNSixLQUFLLENBQUNLLFNBQVM7b0JBQ3hCTSxTQUFTd0I7Z0JBQ2I7WUFDSjtRQUNKO0FBQ1IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tZmVhdHVyZS1mbGFncy9kaXN0L2ZlYXR1cmUtZmxhZ3MuanM/NzExNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgRmVhdHVyZSBGbGFncyAqLyBpbXBvcnQgeyBnZXRHbG9iYWxTdG9yZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tc3RhdGVcIjtcbmNvbnN0IGluaXRpYWxGZWF0dXJlRmxhZ3MgPSB7XG4gICAgZmxhZ3M6IGdldEZlYXR1cmVGbGFnc0Zyb21Mb2NhbFN0b3JhZ2UoKVxufTtcbi8qKiBAaW50ZXJuYWwgKi8gZXhwb3J0IGNvbnN0IGZlYXR1cmVGbGFnc1N0b3JlID0gZ2V0R2xvYmFsU3RvcmUoJ2ZlYXR1cmUtZmxhZ3MnLCBpbml0aWFsRmVhdHVyZUZsYWdzKTtcbmZlYXR1cmVGbGFnc1N0b3JlLnN1YnNjcmliZSgoc3RhdGUpPT57XG4gICAgZm9yIChjb25zdCBbZmxhZ05hbWUsIGZsYWddIG9mIE9iamVjdC5lbnRyaWVzKHN0YXRlLmZsYWdzKSl7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBvcGVubXJzOmZlYXR1cmUtZmxhZzoke2ZsYWdOYW1lfWAsIGZsYWcuZW5hYmxlZC50b1N0cmluZygpKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYG9wZW5tcnM6ZmVhdHVyZS1mbGFnLW1ldGE6JHtmbGFnTmFtZX1gLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBsYWJlbDogZmxhZy5sYWJlbCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmbGFnLmRlc2NyaXB0aW9uXG4gICAgICAgIH0pKTtcbiAgICB9XG59KTtcbmZ1bmN0aW9uIGdldEZlYXR1cmVGbGFnc0Zyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgZmxhZ3MgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhsb2NhbFN0b3JhZ2UpKXtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCdvcGVubXJzOmZlYXR1cmUtZmxhZzonKSkge1xuICAgICAgICAgICAgY29uc3QgZmxhZ05hbWUgPSBrZXkucmVwbGFjZSgnb3Blbm1yczpmZWF0dXJlLWZsYWc6JywgJycpO1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oYG9wZW5tcnM6ZmVhdHVyZS1mbGFnLW1ldGE6JHtmbGFnTmFtZX1gKSB8fCAne30nKTtcbiAgICAgICAgICAgIGZsYWdzW2ZsYWdOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpID09PSAndHJ1ZScsXG4gICAgICAgICAgICAgICAgLi4ubWV0YVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmxhZ3M7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGZlYXR1cmUgZmxhZy4gQ2FsbCBpdCBpbiB0b3AtbGV2ZWwgY29kZSBhbnl3aGVyZS4gSXQgd2lsbFxuICogbm90IHJlc2V0IHdoZXRoZXIgdGhlIGZsYWcgaXMgZW5hYmxlZCBvciBub3QsIHNvIGl0J3Mgc2FmZSB0byBjYWxsIGl0IG11bHRpcGxlIHRpbWVzLlxuICogT25jZSBhIGZlYXR1cmUgZmxhZyBpcyBjcmVhdGVkLCBpdCB3aWxsIGFwcGVhciB3aXRoIGEgdG9nZ2xlIGluIHRoZSBJbXBsZW1lbnRlciBUb29scy5cbiAqIEl0IGNhbiB0aGVuIGJlIHVzZWQgdG8gdHVybiBvbiBvciBvZmYgZmVhdHVyZXMgaW4gdGhlIGNvZGUuXG4gKlxuICogQHBhcmFtIGZsYWdOYW1lIEEgY29kZS1mcmllbmRseSBuYW1lIGZvciB0aGUgZmxhZywgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlZmVyZW5jZSBpdCBpbiBjb2RlXG4gKiBAcGFyYW0gbGFiZWwgQSBodW1hbi1mcmllbmRseSBuYW1lIHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBJbXBsZW1lbnRlciBUb29sc1xuICogQHBhcmFtIGRlc2NyaXB0aW9uIEFuIGV4cGxhbmF0aW9uIG9mIHdoYXQgdGhlIGZsYWcgZG9lcywgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIEltcGxlbWVudGVyIFRvb2xzXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRmVhdHVyZUZsYWcoZmxhZ05hbWUsIGxhYmVsLCBkZXNjcmlwdGlvbikge1xuICAgIGZlYXR1cmVGbGFnc1N0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICBmbGFnczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLmZsYWdzLFxuICAgICAgICAgICAgICAgIFtmbGFnTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogc3RhdGUuZmxhZ3NbZmxhZ05hbWVdPy5lbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGZlYXR1cmUgZmxhZ3MgZnJvbSBsb2NhbCBzdG9yYWdlIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGluIHRoZSBjdXJyZW50IHN0YXRlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwT2Jzb2xldGVGZWF0dXJlRmxhZ3MoKSB7XG4gICAgY29uc3QgZmxhZ3MgPSBmZWF0dXJlRmxhZ3NTdG9yZS5nZXRTdGF0ZSgpLmZsYWdzO1xuICAgIE9iamVjdC5rZXlzKGxvY2FsU3RvcmFnZSkuZmlsdGVyKChrZXkpPT5rZXkuc3RhcnRzV2l0aCgnb3Blbm1yczpmZWF0dXJlLWZsYWc6JykpLmZvckVhY2goKGtleSk9PntcbiAgICAgICAgY29uc3QgZmxhZ05hbWUgPSBrZXkucmVwbGFjZSgnb3Blbm1yczpmZWF0dXJlLWZsYWc6JywgJycpO1xuICAgICAgICBpZiAoIWZsYWdzW2ZsYWdOYW1lXSkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBvcGVubXJzOmZlYXR1cmUtZmxhZy1tZXRhOiR7ZmxhZ05hbWV9YCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gYWNjZXNzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmZWF0dXJlIGZsYWcuXG4gKlxuICogSWYgeW91IGFyZSB1c2luZyBSZWFjdCwgdXNlIGB1c2VGZWF0dXJlRmxhZ2AgaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0gZmxhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgZmxhZyB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBmbGFnIGlzIGVuYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRGZWF0dXJlRmxhZyhmbGFnTmFtZSkge1xuICAgIHJldHVybiBmZWF0dXJlRmxhZ3NTdG9yZS5nZXRTdGF0ZSgpLmZsYWdzW2ZsYWdOYW1lXS5lbmFibGVkO1xufVxuLyoqXG4gKiBVc2UgdGhpcyBmdW5jdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmZWF0dXJlIGZsYWcuXG4gKiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGltbWVkaWF0ZWx5IHdpdGggdGhlIGN1cnJlbnQgdmFsdWUgYW5kXG4gKiBhZ2FpbiB3aGVuZXZlciB0aGUgZmxhZyB2YWx1ZSBjaGFuZ2VzLlxuICpcbiAqIElmIHlvdSBhcmUgdXNpbmcgUmVhY3QsIHVzZSBgdXNlRmVhdHVyZUZsYWdgIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIGZsYWdOYW1lIFRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIGZsYWcgdG8gc3Vic2NyaWJlIHRvLlxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IGZsYWcgdmFsdWUuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHN1YnNjcmliZVRvRmVhdHVyZUZsYWcoZmxhZ05hbWUsIGNhbGxiYWNrKSB7XG4gICAgZmVhdHVyZUZsYWdzU3RvcmUuc3Vic2NyaWJlKChzdGF0ZSk9PntcbiAgICAgICAgY2FsbGJhY2soc3RhdGUuZmxhZ3NbZmxhZ05hbWVdLmVuYWJsZWQpO1xuICAgIH0pO1xufVxuLyoqIEBpbnRlcm5hbCBmb3IgSW1wbGVtZW50ZXIgVG9vbHMgKi8gZXhwb3J0IGZ1bmN0aW9uIHNldEZlYXR1cmVGbGFnKGZsYWdOYW1lLCB2YWx1ZSkge1xuICAgIGZlYXR1cmVGbGFnc1N0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICBmbGFnczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLmZsYWdzLFxuICAgICAgICAgICAgICAgIFtmbGFnTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUuZmxhZ3NbZmxhZ05hbWVdLFxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuIl0sIm5hbWVzIjpbImdldEdsb2JhbFN0b3JlIiwiaW5pdGlhbEZlYXR1cmVGbGFncyIsImZsYWdzIiwiZ2V0RmVhdHVyZUZsYWdzRnJvbUxvY2FsU3RvcmFnZSIsImZlYXR1cmVGbGFnc1N0b3JlIiwic3Vic2NyaWJlIiwic3RhdGUiLCJmbGFnTmFtZSIsImZsYWciLCJPYmplY3QiLCJlbnRyaWVzIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImVuYWJsZWQiLCJ0b1N0cmluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwia2V5Iiwia2V5cyIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwibWV0YSIsInBhcnNlIiwiZ2V0SXRlbSIsInJlZ2lzdGVyRmVhdHVyZUZsYWciLCJzZXRTdGF0ZSIsImNsZWFudXBPYnNvbGV0ZUZlYXR1cmVGbGFncyIsImdldFN0YXRlIiwiZmlsdGVyIiwiZm9yRWFjaCIsInJlbW92ZUl0ZW0iLCJnZXRGZWF0dXJlRmxhZyIsInN1YnNjcmliZVRvRmVhdHVyZUZsYWciLCJjYWxsYmFjayIsInNldEZlYXR1cmVGbGFnIiwidmFsdWUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-feature-flags/dist/feature-flags.js\n");
549
549
 
550
550
  /***/ }),
551
551
 
@@ -635,7 +635,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
635
635
  \****************************************************************************/
636
636
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
637
637
 
638
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ interpolateString: () => (/* binding */ interpolateString),\n/* harmony export */ interpolateUrl: () => (/* binding */ interpolateUrl)\n/* harmony export */ });\n/** @module @category Navigation */ function trimTrailingSlash(str) {\n return str.replace(/\\/$/, '');\n}\n/**\n * Interpolates a string with openmrsBase and openmrsSpaBase.\n *\n * Useful for accepting `${openmrsBase}` or `${openmrsSpaBase}`plus additional template\n * parameters in configurable URLs.\n *\n * Example usage:\n * ```js\n * interpolateUrl(\"test ${openmrsBase} ${openmrsSpaBase} ok\");\n * // will return \"test /openmrs /openmrs/spa ok\"\n *\n * interpolateUrl(\"${openmrsSpaBase}/patient/${patientUuid}\", {\n * patientUuid: \"4fcb7185-c6c9-450f-8828-ccae9436bd82\",\n * }); // will return \"/openmrs/spa/patient/4fcb7185-c6c9-450f-8828-ccae9436bd82\"\n * ```\n *\n * This can be used in conjunction with the `navigate` function like so\n * ```js\n * navigate({\n * to: interpolateUrl(\n * \"${openmrsSpaBase}/patient/${patientUuid}\",\n * { patientUuid: patient.uuid }\n * )\n * }); // will navigate to \"/openmrs/spa/patient/4fcb7185-c6c9-450f-8828-ccae9436bd82\"\n * ```\n *\n * @param template A string to interpolate\n * @param additionalParams Additional values to interpolate into the string template\n */ function interpolateUrl(template, additionalParams) {\n const openmrsSpaBase = trimTrailingSlash(window.getOpenmrsSpaBase());\n return interpolateString(template, {\n openmrsBase: window.openmrsBase,\n openmrsSpaBase: openmrsSpaBase,\n ...additionalParams\n }).replace(/^\\/\\//, '/'); // remove extra initial slash if present\n}\n/**\n * Interpolates values of `params` into the `template` string.\n *\n * Example usage:\n * ```js\n * interpolateString(\"test ${one} ${two} 3\", {\n * one: \"1\",\n * two: \"2\",\n * }); // will return \"test 1 2 3\"\n * interpolateString(\"test ok\", { one: \"1\", two: \"2\" }) // will return \"test ok\"\n * ```\n *\n * @param template With optional params wrapped in `${ }`\n * @param params Values to interpolate into the string template\n */ function interpolateString(template, params) {\n const names = Object.keys(params);\n return names.reduce((prev, curr)=>prev.split('${' + curr + '}').join(params[curr]), template);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1uYXZpZ2F0aW9uL2Rpc3QvbmF2aWdhdGlvbi9pbnRlcnBvbGF0ZS1zdHJpbmcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUMsR0FBRyxTQUFTQSxrQkFBa0JDLEdBQUc7SUFDOUQsT0FBT0EsSUFBSUMsT0FBTyxDQUFDLE9BQU87QUFDOUI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTRCQyxHQUFVLFNBQVNDLGVBQWVDLFFBQVEsRUFBRUMsZ0JBQWdCO0lBQ3pELE1BQU1DLGlCQUFpQk4sa0JBQWtCTyxPQUFPQyxpQkFBaUI7SUFDakUsT0FBT0Msa0JBQWtCTCxVQUFVO1FBQy9CTSxhQUFhSCxPQUFPRyxXQUFXO1FBQy9CSixnQkFBZ0JBO1FBQ2hCLEdBQUdELGdCQUFnQjtJQUN2QixHQUFHSCxPQUFPLENBQUMsU0FBUyxNQUFNLHdDQUF3QztBQUN0RTtBQUNBOzs7Ozs7Ozs7Ozs7OztDQWNDLEdBQVUsU0FBU08sa0JBQWtCTCxRQUFRLEVBQUVPLE1BQU07SUFDbEQsTUFBTUMsUUFBUUMsT0FBT0MsSUFBSSxDQUFDSDtJQUMxQixPQUFPQyxNQUFNRyxNQUFNLENBQUMsQ0FBQ0MsTUFBTUMsT0FBT0QsS0FBS0UsS0FBSyxDQUFDLE9BQU9ELE9BQU8sS0FBS0UsSUFBSSxDQUFDUixNQUFNLENBQUNNLEtBQUssR0FBR2I7QUFDeEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tbmF2aWdhdGlvbi9kaXN0L25hdmlnYXRpb24vaW50ZXJwb2xhdGUtc3RyaW5nLmpzP2IwZWEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IE5hdmlnYXRpb24gKi8gZnVuY3Rpb24gdHJpbVRyYWlsaW5nU2xhc2goc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXC8kLywgJycpO1xufVxuLyoqXG4gKiBJbnRlcnBvbGF0ZXMgYSBzdHJpbmcgd2l0aCBvcGVubXJzQmFzZSBhbmQgb3Blbm1yc1NwYUJhc2UuXG4gKlxuICogVXNlZnVsIGZvciBhY2NlcHRpbmcgYCR7b3Blbm1yc0Jhc2V9YCBvciBgJHtvcGVubXJzU3BhQmFzZX1gcGx1cyBhZGRpdGlvbmFsIHRlbXBsYXRlXG4gKiBwYXJhbWV0ZXJzIGluIGNvbmZpZ3VyYWJsZSBVUkxzLlxuICpcbiAqIEV4YW1wbGUgdXNhZ2U6XG4gKiBgYGBqc1xuICogaW50ZXJwb2xhdGVVcmwoXCJ0ZXN0ICR7b3Blbm1yc0Jhc2V9ICR7b3Blbm1yc1NwYUJhc2V9IG9rXCIpO1xuICogICAgLy8gd2lsbCByZXR1cm4gXCJ0ZXN0IC9vcGVubXJzIC9vcGVubXJzL3NwYSBva1wiXG4gKlxuICogaW50ZXJwb2xhdGVVcmwoXCIke29wZW5tcnNTcGFCYXNlfS9wYXRpZW50LyR7cGF0aWVudFV1aWR9XCIsIHtcbiAqICAgIHBhdGllbnRVdWlkOiBcIjRmY2I3MTg1LWM2YzktNDUwZi04ODI4LWNjYWU5NDM2YmQ4MlwiLFxuICogfSk7IC8vIHdpbGwgcmV0dXJuIFwiL29wZW5tcnMvc3BhL3BhdGllbnQvNGZjYjcxODUtYzZjOS00NTBmLTg4MjgtY2NhZTk0MzZiZDgyXCJcbiAqIGBgYFxuICpcbiAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYG5hdmlnYXRlYCBmdW5jdGlvbiBsaWtlIHNvXG4gKiBgYGBqc1xuICogbmF2aWdhdGUoe1xuICogIHRvOiBpbnRlcnBvbGF0ZVVybChcbiAqICAgIFwiJHtvcGVubXJzU3BhQmFzZX0vcGF0aWVudC8ke3BhdGllbnRVdWlkfVwiLFxuICogICAgeyBwYXRpZW50VXVpZDogcGF0aWVudC51dWlkIH1cbiAqICApXG4gKiB9KTsgLy8gd2lsbCBuYXZpZ2F0ZSB0byBcIi9vcGVubXJzL3NwYS9wYXRpZW50LzRmY2I3MTg1LWM2YzktNDUwZi04ODI4LWNjYWU5NDM2YmQ4MlwiXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVtcGxhdGUgQSBzdHJpbmcgdG8gaW50ZXJwb2xhdGVcbiAqIEBwYXJhbSBhZGRpdGlvbmFsUGFyYW1zIEFkZGl0aW9uYWwgdmFsdWVzIHRvIGludGVycG9sYXRlIGludG8gdGhlIHN0cmluZyB0ZW1wbGF0ZVxuICovIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZVVybCh0ZW1wbGF0ZSwgYWRkaXRpb25hbFBhcmFtcykge1xuICAgIGNvbnN0IG9wZW5tcnNTcGFCYXNlID0gdHJpbVRyYWlsaW5nU2xhc2god2luZG93LmdldE9wZW5tcnNTcGFCYXNlKCkpO1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZVN0cmluZyh0ZW1wbGF0ZSwge1xuICAgICAgICBvcGVubXJzQmFzZTogd2luZG93Lm9wZW5tcnNCYXNlLFxuICAgICAgICBvcGVubXJzU3BhQmFzZTogb3Blbm1yc1NwYUJhc2UsXG4gICAgICAgIC4uLmFkZGl0aW9uYWxQYXJhbXNcbiAgICB9KS5yZXBsYWNlKC9eXFwvXFwvLywgJy8nKTsgLy8gcmVtb3ZlIGV4dHJhIGluaXRpYWwgc2xhc2ggaWYgcHJlc2VudFxufVxuLyoqXG4gKiBJbnRlcnBvbGF0ZXMgdmFsdWVzIG9mIGBwYXJhbXNgIGludG8gdGhlIGB0ZW1wbGF0ZWAgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGUgdXNhZ2U6XG4gKiBgYGBqc1xuICogaW50ZXJwb2xhdGVTdHJpbmcoXCJ0ZXN0ICR7b25lfSAke3R3b30gM1wiLCB7XG4gKiAgICBvbmU6IFwiMVwiLFxuICogICAgdHdvOiBcIjJcIixcbiAqIH0pOyAvLyB3aWxsIHJldHVybiBcInRlc3QgMSAyIDNcIlxuICogaW50ZXJwb2xhdGVTdHJpbmcoXCJ0ZXN0IG9rXCIsIHsgb25lOiBcIjFcIiwgdHdvOiBcIjJcIiB9KSAvLyB3aWxsIHJldHVybiBcInRlc3Qgb2tcIlxuICogYGBgXG4gKlxuICogQHBhcmFtIHRlbXBsYXRlIFdpdGggb3B0aW9uYWwgcGFyYW1zIHdyYXBwZWQgaW4gYCR7IH1gXG4gKiBAcGFyYW0gcGFyYW1zIFZhbHVlcyB0byBpbnRlcnBvbGF0ZSBpbnRvIHRoZSBzdHJpbmcgdGVtcGxhdGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVTdHJpbmcodGVtcGxhdGUsIHBhcmFtcykge1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMocGFyYW1zKTtcbiAgICByZXR1cm4gbmFtZXMucmVkdWNlKChwcmV2LCBjdXJyKT0+cHJldi5zcGxpdCgnJHsnICsgY3VyciArICd9Jykuam9pbihwYXJhbXNbY3Vycl0pLCB0ZW1wbGF0ZSk7XG59XG4iXSwibmFtZXMiOlsidHJpbVRyYWlsaW5nU2xhc2giLCJzdHIiLCJyZXBsYWNlIiwiaW50ZXJwb2xhdGVVcmwiLCJ0ZW1wbGF0ZSIsImFkZGl0aW9uYWxQYXJhbXMiLCJvcGVubXJzU3BhQmFzZSIsIndpbmRvdyIsImdldE9wZW5tcnNTcGFCYXNlIiwiaW50ZXJwb2xhdGVTdHJpbmciLCJvcGVubXJzQmFzZSIsInBhcmFtcyIsIm5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsInByZXYiLCJjdXJyIiwic3BsaXQiLCJqb2luIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-navigation/dist/navigation/interpolate-string.js\n");
638
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ interpolateString: () => (/* binding */ interpolateString),\n/* harmony export */ interpolateUrl: () => (/* binding */ interpolateUrl)\n/* harmony export */ });\n/** @module @category Navigation */ function trimTrailingSlash(str) {\n return str.replace(/\\/$/, '');\n}\n/**\n * Interpolates a string with openmrsBase and openmrsSpaBase.\n *\n * Useful for accepting `${openmrsBase}` or `${openmrsSpaBase}`plus additional template\n * parameters in configurable URLs.\n *\n * Example usage:\n * ```js\n * interpolateUrl(\"test ${openmrsBase} ${openmrsSpaBase} ok\");\n * // will return \"test /openmrs /openmrs/spa ok\"\n *\n * interpolateUrl(\"${openmrsSpaBase}/patient/${patientUuid}\", {\n * patientUuid: \"4fcb7185-c6c9-450f-8828-ccae9436bd82\",\n * }); // will return \"/openmrs/spa/patient/4fcb7185-c6c9-450f-8828-ccae9436bd82\"\n * ```\n *\n * This can be used in conjunction with the `navigate` function like so\n * ```js\n * navigate({\n * to: interpolateUrl(\n * \"${openmrsSpaBase}/patient/${patientUuid}\",\n * { patientUuid: patient.uuid }\n * )\n * }); // will navigate to \"/openmrs/spa/patient/4fcb7185-c6c9-450f-8828-ccae9436bd82\"\n * ```\n *\n * @param template A string to interpolate\n * @param additionalParams Additional values to interpolate into the string template\n * @returns The interpolated string with all template parameters replaced.\n */ function interpolateUrl(template, additionalParams) {\n const openmrsSpaBase = trimTrailingSlash(window.getOpenmrsSpaBase());\n return interpolateString(template, {\n openmrsBase: window.openmrsBase,\n openmrsSpaBase: openmrsSpaBase,\n ...additionalParams\n }).replace(/^\\/\\//, '/'); // remove extra initial slash if present\n}\n/**\n * Interpolates values of `params` into the `template` string.\n *\n * Example usage:\n * ```js\n * interpolateString(\"test ${one} ${two} 3\", {\n * one: \"1\",\n * two: \"2\",\n * }); // will return \"test 1 2 3\"\n * interpolateString(\"test ok\", { one: \"1\", two: \"2\" }) // will return \"test ok\"\n * ```\n *\n * @param template With optional params wrapped in `${ }`\n * @param params Values to interpolate into the string template\n * @returns The template string with all parameter placeholders replaced by their values.\n */ function interpolateString(template, params) {\n const names = Object.keys(params);\n return names.reduce((prev, curr)=>prev.split('${' + curr + '}').join(params[curr]), template);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1uYXZpZ2F0aW9uL2Rpc3QvbmF2aWdhdGlvbi9pbnRlcnBvbGF0ZS1zdHJpbmcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUMsR0FBRyxTQUFTQSxrQkFBa0JDLEdBQUc7SUFDOUQsT0FBT0EsSUFBSUMsT0FBTyxDQUFDLE9BQU87QUFDOUI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E2QkMsR0FBVSxTQUFTQyxlQUFlQyxRQUFRLEVBQUVDLGdCQUFnQjtJQUN6RCxNQUFNQyxpQkFBaUJOLGtCQUFrQk8sT0FBT0MsaUJBQWlCO0lBQ2pFLE9BQU9DLGtCQUFrQkwsVUFBVTtRQUMvQk0sYUFBYUgsT0FBT0csV0FBVztRQUMvQkosZ0JBQWdCQTtRQUNoQixHQUFHRCxnQkFBZ0I7SUFDdkIsR0FBR0gsT0FBTyxDQUFDLFNBQVMsTUFBTSx3Q0FBd0M7QUFDdEU7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0NBZUMsR0FBVSxTQUFTTyxrQkFBa0JMLFFBQVEsRUFBRU8sTUFBTTtJQUNsRCxNQUFNQyxRQUFRQyxPQUFPQyxJQUFJLENBQUNIO0lBQzFCLE9BQU9DLE1BQU1HLE1BQU0sQ0FBQyxDQUFDQyxNQUFNQyxPQUFPRCxLQUFLRSxLQUFLLENBQUMsT0FBT0QsT0FBTyxLQUFLRSxJQUFJLENBQUNSLE1BQU0sQ0FBQ00sS0FBSyxHQUFHYjtBQUN4RiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1uYXZpZ2F0aW9uL2Rpc3QvbmF2aWdhdGlvbi9pbnRlcnBvbGF0ZS1zdHJpbmcuanM/YjBlYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgTmF2aWdhdGlvbiAqLyBmdW5jdGlvbiB0cmltVHJhaWxpbmdTbGFzaChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG59XG4vKipcbiAqIEludGVycG9sYXRlcyBhIHN0cmluZyB3aXRoIG9wZW5tcnNCYXNlIGFuZCBvcGVubXJzU3BhQmFzZS5cbiAqXG4gKiBVc2VmdWwgZm9yIGFjY2VwdGluZyBgJHtvcGVubXJzQmFzZX1gIG9yIGAke29wZW5tcnNTcGFCYXNlfWBwbHVzIGFkZGl0aW9uYWwgdGVtcGxhdGVcbiAqIHBhcmFtZXRlcnMgaW4gY29uZmlndXJhYmxlIFVSTHMuXG4gKlxuICogRXhhbXBsZSB1c2FnZTpcbiAqIGBgYGpzXG4gKiBpbnRlcnBvbGF0ZVVybChcInRlc3QgJHtvcGVubXJzQmFzZX0gJHtvcGVubXJzU3BhQmFzZX0gb2tcIik7XG4gKiAgICAvLyB3aWxsIHJldHVybiBcInRlc3QgL29wZW5tcnMgL29wZW5tcnMvc3BhIG9rXCJcbiAqXG4gKiBpbnRlcnBvbGF0ZVVybChcIiR7b3Blbm1yc1NwYUJhc2V9L3BhdGllbnQvJHtwYXRpZW50VXVpZH1cIiwge1xuICogICAgcGF0aWVudFV1aWQ6IFwiNGZjYjcxODUtYzZjOS00NTBmLTg4MjgtY2NhZTk0MzZiZDgyXCIsXG4gKiB9KTsgLy8gd2lsbCByZXR1cm4gXCIvb3Blbm1ycy9zcGEvcGF0aWVudC80ZmNiNzE4NS1jNmM5LTQ1MGYtODgyOC1jY2FlOTQzNmJkODJcIlxuICogYGBgXG4gKlxuICogVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgbmF2aWdhdGVgIGZ1bmN0aW9uIGxpa2Ugc29cbiAqIGBgYGpzXG4gKiBuYXZpZ2F0ZSh7XG4gKiAgdG86IGludGVycG9sYXRlVXJsKFxuICogICAgXCIke29wZW5tcnNTcGFCYXNlfS9wYXRpZW50LyR7cGF0aWVudFV1aWR9XCIsXG4gKiAgICB7IHBhdGllbnRVdWlkOiBwYXRpZW50LnV1aWQgfVxuICogIClcbiAqIH0pOyAvLyB3aWxsIG5hdmlnYXRlIHRvIFwiL29wZW5tcnMvc3BhL3BhdGllbnQvNGZjYjcxODUtYzZjOS00NTBmLTg4MjgtY2NhZTk0MzZiZDgyXCJcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB0ZW1wbGF0ZSBBIHN0cmluZyB0byBpbnRlcnBvbGF0ZVxuICogQHBhcmFtIGFkZGl0aW9uYWxQYXJhbXMgQWRkaXRpb25hbCB2YWx1ZXMgdG8gaW50ZXJwb2xhdGUgaW50byB0aGUgc3RyaW5nIHRlbXBsYXRlXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJwb2xhdGVkIHN0cmluZyB3aXRoIGFsbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHJlcGxhY2VkLlxuICovIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZVVybCh0ZW1wbGF0ZSwgYWRkaXRpb25hbFBhcmFtcykge1xuICAgIGNvbnN0IG9wZW5tcnNTcGFCYXNlID0gdHJpbVRyYWlsaW5nU2xhc2god2luZG93LmdldE9wZW5tcnNTcGFCYXNlKCkpO1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZVN0cmluZyh0ZW1wbGF0ZSwge1xuICAgICAgICBvcGVubXJzQmFzZTogd2luZG93Lm9wZW5tcnNCYXNlLFxuICAgICAgICBvcGVubXJzU3BhQmFzZTogb3Blbm1yc1NwYUJhc2UsXG4gICAgICAgIC4uLmFkZGl0aW9uYWxQYXJhbXNcbiAgICB9KS5yZXBsYWNlKC9eXFwvXFwvLywgJy8nKTsgLy8gcmVtb3ZlIGV4dHJhIGluaXRpYWwgc2xhc2ggaWYgcHJlc2VudFxufVxuLyoqXG4gKiBJbnRlcnBvbGF0ZXMgdmFsdWVzIG9mIGBwYXJhbXNgIGludG8gdGhlIGB0ZW1wbGF0ZWAgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGUgdXNhZ2U6XG4gKiBgYGBqc1xuICogaW50ZXJwb2xhdGVTdHJpbmcoXCJ0ZXN0ICR7b25lfSAke3R3b30gM1wiLCB7XG4gKiAgICBvbmU6IFwiMVwiLFxuICogICAgdHdvOiBcIjJcIixcbiAqIH0pOyAvLyB3aWxsIHJldHVybiBcInRlc3QgMSAyIDNcIlxuICogaW50ZXJwb2xhdGVTdHJpbmcoXCJ0ZXN0IG9rXCIsIHsgb25lOiBcIjFcIiwgdHdvOiBcIjJcIiB9KSAvLyB3aWxsIHJldHVybiBcInRlc3Qgb2tcIlxuICogYGBgXG4gKlxuICogQHBhcmFtIHRlbXBsYXRlIFdpdGggb3B0aW9uYWwgcGFyYW1zIHdyYXBwZWQgaW4gYCR7IH1gXG4gKiBAcGFyYW0gcGFyYW1zIFZhbHVlcyB0byBpbnRlcnBvbGF0ZSBpbnRvIHRoZSBzdHJpbmcgdGVtcGxhdGVcbiAqIEByZXR1cm5zIFRoZSB0ZW1wbGF0ZSBzdHJpbmcgd2l0aCBhbGwgcGFyYW1ldGVyIHBsYWNlaG9sZGVycyByZXBsYWNlZCBieSB0aGVpciB2YWx1ZXMuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlU3RyaW5nKHRlbXBsYXRlLCBwYXJhbXMpIHtcbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHBhcmFtcyk7XG4gICAgcmV0dXJuIG5hbWVzLnJlZHVjZSgocHJldiwgY3Vycik9PnByZXYuc3BsaXQoJyR7JyArIGN1cnIgKyAnfScpLmpvaW4ocGFyYW1zW2N1cnJdKSwgdGVtcGxhdGUpO1xufVxuIl0sIm5hbWVzIjpbInRyaW1UcmFpbGluZ1NsYXNoIiwic3RyIiwicmVwbGFjZSIsImludGVycG9sYXRlVXJsIiwidGVtcGxhdGUiLCJhZGRpdGlvbmFsUGFyYW1zIiwib3Blbm1yc1NwYUJhc2UiLCJ3aW5kb3ciLCJnZXRPcGVubXJzU3BhQmFzZSIsImludGVycG9sYXRlU3RyaW5nIiwib3Blbm1yc0Jhc2UiLCJwYXJhbXMiLCJuYW1lcyIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInNwbGl0Iiwiam9pbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-navigation/dist/navigation/interpolate-string.js\n");
639
639
 
640
640
  /***/ }),
641
641
 
@@ -775,7 +775,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
775
775
  \****************************************************************/
776
776
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
777
777
 
778
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConfigurableLink: () => (/* binding */ ConfigurableLink)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-navigation */ \"../../framework/esm-navigation/dist/index.js\");\n/** @module @category Navigation */ \n\nfunction handleClick(event, to, templateParams, onBeforeNavigate) {\n // Left click without modifiers (normal navigation)\n if (event.button === 0 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {\n event.preventDefault();\n onBeforeNavigate?.(event);\n (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_1__.navigate)({\n to,\n templateParams\n });\n }\n // Left click with Ctrl key (or Cmd key on Mac) - Open in new tab\n if (event.button === 0 && (event.ctrlKey || event.metaKey)) {\n onBeforeNavigate?.(event);\n }\n // Left click with Shift key - Open in new window\n if (event.button === 0 && event.shiftKey) {\n onBeforeNavigate?.(event);\n }\n // Middle click - Open in new background tab\n if (event.button === 1) {\n onBeforeNavigate?.(event);\n }\n}\n/**\n * A React link component which calls [[navigate]] when clicked\n */ function ConfigurableLink({ to, templateParams, onBeforeNavigate, children, ...otherProps }) {\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n if (otherProps.href) {\n console.warn(`ConfigurableLink does not support the href prop. Use the 'to' prop instead. The provided href value is '${otherProps.href}'`);\n }\n if (otherProps.onClick) {\n console.warn(`ConfigurableLink does not support the onClick prop. Use the 'onBeforeNavigate' prop instead. The 'to' prop of the offending link is ${to}`);\n }\n }, []);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"a\", {\n onClick: (event)=>handleClick(event, to, templateParams, onBeforeNavigate),\n href: (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_1__.interpolateUrl)(to, templateParams),\n ...otherProps\n }, children);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L0NvbmZpZ3VyYWJsZUxpbmsuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUNBQWlDLEdBQTRDO0FBQ1Y7QUFDbkUsU0FBU0ksWUFBWUMsS0FBSyxFQUFFQyxFQUFFLEVBQUVDLGNBQWMsRUFBRUMsZ0JBQWdCO0lBQzVELG1EQUFtRDtJQUNuRCxJQUFJSCxNQUFNSSxNQUFNLEtBQUssS0FBSyxDQUFDSixNQUFNSyxPQUFPLElBQUksQ0FBQ0wsTUFBTU0sUUFBUSxJQUFJLENBQUNOLE1BQU1PLE1BQU0sSUFBSSxDQUFDUCxNQUFNUSxPQUFPLEVBQUU7UUFDNUZSLE1BQU1TLGNBQWM7UUFDcEJOLG1CQUFtQkg7UUFDbkJILGlFQUFRQSxDQUFDO1lBQ0xJO1lBQ0FDO1FBQ0o7SUFDSjtJQUNBLGlFQUFpRTtJQUNqRSxJQUFJRixNQUFNSSxNQUFNLEtBQUssS0FBTUosQ0FBQUEsTUFBTUssT0FBTyxJQUFJTCxNQUFNUSxPQUFPLEdBQUc7UUFDeERMLG1CQUFtQkg7SUFDdkI7SUFDQSxpREFBaUQ7SUFDakQsSUFBSUEsTUFBTUksTUFBTSxLQUFLLEtBQUtKLE1BQU1NLFFBQVEsRUFBRTtRQUN0Q0gsbUJBQW1CSDtJQUN2QjtJQUNBLDRDQUE0QztJQUM1QyxJQUFJQSxNQUFNSSxNQUFNLEtBQUssR0FBRztRQUNwQkQsbUJBQW1CSDtJQUN2QjtBQUNKO0FBQ0E7O0NBRUMsR0FBVSxTQUFTVSxpQkFBaUIsRUFBRVQsRUFBRSxFQUFFQyxjQUFjLEVBQUVDLGdCQUFnQixFQUFFUSxRQUFRLEVBQUUsR0FBR0MsWUFBWTtJQUNsR2hCLGdEQUFTQSxDQUFDO1FBQ04sSUFBSWdCLFdBQVdDLElBQUksRUFBRTtZQUNqQkMsUUFBUUMsSUFBSSxDQUFDLENBQUMsd0dBQXdHLEVBQUVILFdBQVdDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUk7UUFDQSxJQUFJRCxXQUFXSSxPQUFPLEVBQUU7WUFDcEJGLFFBQVFDLElBQUksQ0FBQyxDQUFDLG9JQUFvSSxFQUFFZCxJQUFJO1FBQzVKO0lBQ0osR0FBRyxFQUFFO0lBQ0wsT0FBTyxXQUFXLEdBQUdOLGdEQUFtQixDQUFDLEtBQUs7UUFDMUNxQixTQUFTLENBQUNoQixRQUFRRCxZQUFZQyxPQUFPQyxJQUFJQyxnQkFBZ0JDO1FBQ3pEVSxNQUFNZix1RUFBY0EsQ0FBQ0csSUFBSUM7UUFDekIsR0FBR1UsVUFBVTtJQUNqQixHQUFHRDtBQUNQIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvQ29uZmlndXJhYmxlTGluay5qcz8wMDNiIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBOYXZpZ2F0aW9uICovIGltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IG5hdmlnYXRlLCBpbnRlcnBvbGF0ZVVybCB9IGZyb20gXCJAb3Blbm1ycy9lc20tbmF2aWdhdGlvblwiO1xuZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQsIHRvLCB0ZW1wbGF0ZVBhcmFtcywgb25CZWZvcmVOYXZpZ2F0ZSkge1xuICAgIC8vIExlZnQgY2xpY2sgd2l0aG91dCBtb2RpZmllcnMgKG5vcm1hbCBuYXZpZ2F0aW9uKVxuICAgIGlmIChldmVudC5idXR0b24gPT09IDAgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25CZWZvcmVOYXZpZ2F0ZT8uKGV2ZW50KTtcbiAgICAgICAgbmF2aWdhdGUoe1xuICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gTGVmdCBjbGljayB3aXRoIEN0cmwga2V5IChvciBDbWQga2V5IG9uIE1hYykgLSBPcGVuIGluIG5ldyB0YWJcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpKSB7XG4gICAgICAgIG9uQmVmb3JlTmF2aWdhdGU/LihldmVudCk7XG4gICAgfVxuICAgIC8vIExlZnQgY2xpY2sgd2l0aCBTaGlmdCBrZXkgLSBPcGVuIGluIG5ldyB3aW5kb3dcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgIG9uQmVmb3JlTmF2aWdhdGU/LihldmVudCk7XG4gICAgfVxuICAgIC8vIE1pZGRsZSBjbGljayAtIE9wZW4gaW4gbmV3IGJhY2tncm91bmQgdGFiXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSkge1xuICAgICAgICBvbkJlZm9yZU5hdmlnYXRlPy4oZXZlbnQpO1xuICAgIH1cbn1cbi8qKlxuICogQSBSZWFjdCBsaW5rIGNvbXBvbmVudCB3aGljaCBjYWxscyBbW25hdmlnYXRlXV0gd2hlbiBjbGlja2VkXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIENvbmZpZ3VyYWJsZUxpbmsoeyB0bywgdGVtcGxhdGVQYXJhbXMsIG9uQmVmb3JlTmF2aWdhdGUsIGNoaWxkcmVuLCAuLi5vdGhlclByb3BzIH0pIHtcbiAgICB1c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKG90aGVyUHJvcHMuaHJlZikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb25maWd1cmFibGVMaW5rIGRvZXMgbm90IHN1cHBvcnQgdGhlIGhyZWYgcHJvcC4gVXNlIHRoZSAndG8nIHByb3AgaW5zdGVhZC4gVGhlIHByb3ZpZGVkIGhyZWYgdmFsdWUgaXMgJyR7b3RoZXJQcm9wcy5ocmVmfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXJQcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYENvbmZpZ3VyYWJsZUxpbmsgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb25DbGljayBwcm9wLiBVc2UgdGhlICdvbkJlZm9yZU5hdmlnYXRlJyBwcm9wIGluc3RlYWQuIFRoZSAndG8nIHByb3Agb2YgdGhlIG9mZmVuZGluZyBsaW5rIGlzICR7dG99YCk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgICBvbkNsaWNrOiAoZXZlbnQpPT5oYW5kbGVDbGljayhldmVudCwgdG8sIHRlbXBsYXRlUGFyYW1zLCBvbkJlZm9yZU5hdmlnYXRlKSxcbiAgICAgICAgaHJlZjogaW50ZXJwb2xhdGVVcmwodG8sIHRlbXBsYXRlUGFyYW1zKSxcbiAgICAgICAgLi4ub3RoZXJQcm9wc1xuICAgIH0sIGNoaWxkcmVuKTtcbn1cbiJdLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsIm5hdmlnYXRlIiwiaW50ZXJwb2xhdGVVcmwiLCJoYW5kbGVDbGljayIsImV2ZW50IiwidG8iLCJ0ZW1wbGF0ZVBhcmFtcyIsIm9uQmVmb3JlTmF2aWdhdGUiLCJidXR0b24iLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJhbHRLZXkiLCJtZXRhS2V5IiwicHJldmVudERlZmF1bHQiLCJDb25maWd1cmFibGVMaW5rIiwiY2hpbGRyZW4iLCJvdGhlclByb3BzIiwiaHJlZiIsImNvbnNvbGUiLCJ3YXJuIiwib25DbGljayIsImNyZWF0ZUVsZW1lbnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/ConfigurableLink.js\n");
778
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConfigurableLink: () => (/* binding */ ConfigurableLink)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-navigation */ \"../../framework/esm-navigation/dist/index.js\");\n/** @module @category Navigation */ \n\nfunction handleClick(event, to, templateParams, onBeforeNavigate) {\n // Left click without modifiers (normal navigation)\n if (event.button === 0 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {\n event.preventDefault();\n onBeforeNavigate?.(event);\n (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_1__.navigate)({\n to,\n templateParams\n });\n }\n // Left click with Ctrl key (or Cmd key on Mac) - Open in new tab\n if (event.button === 0 && (event.ctrlKey || event.metaKey)) {\n onBeforeNavigate?.(event);\n }\n // Left click with Shift key - Open in new window\n if (event.button === 0 && event.shiftKey) {\n onBeforeNavigate?.(event);\n }\n // Middle click - Open in new background tab\n if (event.button === 1) {\n onBeforeNavigate?.(event);\n }\n}\n/**\n * A React link component which calls {@link navigate} when clicked\n */ function ConfigurableLink({ to, templateParams, onBeforeNavigate, children, ...otherProps }) {\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n if (otherProps.href) {\n console.warn(`ConfigurableLink does not support the href prop. Use the 'to' prop instead. The provided href value is '${otherProps.href}'`);\n }\n if (otherProps.onClick) {\n console.warn(`ConfigurableLink does not support the onClick prop. Use the 'onBeforeNavigate' prop instead. The 'to' prop of the offending link is ${to}`);\n }\n }, []);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"a\", {\n onClick: (event)=>handleClick(event, to, templateParams, onBeforeNavigate),\n href: (0,_openmrs_esm_navigation__WEBPACK_IMPORTED_MODULE_1__.interpolateUrl)(to, templateParams),\n ...otherProps\n }, children);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L0NvbmZpZ3VyYWJsZUxpbmsuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUNBQWlDLEdBQTRDO0FBQ1Y7QUFDbkUsU0FBU0ksWUFBWUMsS0FBSyxFQUFFQyxFQUFFLEVBQUVDLGNBQWMsRUFBRUMsZ0JBQWdCO0lBQzVELG1EQUFtRDtJQUNuRCxJQUFJSCxNQUFNSSxNQUFNLEtBQUssS0FBSyxDQUFDSixNQUFNSyxPQUFPLElBQUksQ0FBQ0wsTUFBTU0sUUFBUSxJQUFJLENBQUNOLE1BQU1PLE1BQU0sSUFBSSxDQUFDUCxNQUFNUSxPQUFPLEVBQUU7UUFDNUZSLE1BQU1TLGNBQWM7UUFDcEJOLG1CQUFtQkg7UUFDbkJILGlFQUFRQSxDQUFDO1lBQ0xJO1lBQ0FDO1FBQ0o7SUFDSjtJQUNBLGlFQUFpRTtJQUNqRSxJQUFJRixNQUFNSSxNQUFNLEtBQUssS0FBTUosQ0FBQUEsTUFBTUssT0FBTyxJQUFJTCxNQUFNUSxPQUFPLEdBQUc7UUFDeERMLG1CQUFtQkg7SUFDdkI7SUFDQSxpREFBaUQ7SUFDakQsSUFBSUEsTUFBTUksTUFBTSxLQUFLLEtBQUtKLE1BQU1NLFFBQVEsRUFBRTtRQUN0Q0gsbUJBQW1CSDtJQUN2QjtJQUNBLDRDQUE0QztJQUM1QyxJQUFJQSxNQUFNSSxNQUFNLEtBQUssR0FBRztRQUNwQkQsbUJBQW1CSDtJQUN2QjtBQUNKO0FBQ0E7O0NBRUMsR0FBVSxTQUFTVSxpQkFBaUIsRUFBRVQsRUFBRSxFQUFFQyxjQUFjLEVBQUVDLGdCQUFnQixFQUFFUSxRQUFRLEVBQUUsR0FBR0MsWUFBWTtJQUNsR2hCLGdEQUFTQSxDQUFDO1FBQ04sSUFBSWdCLFdBQVdDLElBQUksRUFBRTtZQUNqQkMsUUFBUUMsSUFBSSxDQUFDLENBQUMsd0dBQXdHLEVBQUVILFdBQVdDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUk7UUFDQSxJQUFJRCxXQUFXSSxPQUFPLEVBQUU7WUFDcEJGLFFBQVFDLElBQUksQ0FBQyxDQUFDLG9JQUFvSSxFQUFFZCxJQUFJO1FBQzVKO0lBQ0osR0FBRyxFQUFFO0lBQ0wsT0FBTyxXQUFXLEdBQUdOLGdEQUFtQixDQUFDLEtBQUs7UUFDMUNxQixTQUFTLENBQUNoQixRQUFRRCxZQUFZQyxPQUFPQyxJQUFJQyxnQkFBZ0JDO1FBQ3pEVSxNQUFNZix1RUFBY0EsQ0FBQ0csSUFBSUM7UUFDekIsR0FBR1UsVUFBVTtJQUNqQixHQUFHRDtBQUNQIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvQ29uZmlndXJhYmxlTGluay5qcz8wMDNiIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBOYXZpZ2F0aW9uICovIGltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IG5hdmlnYXRlLCBpbnRlcnBvbGF0ZVVybCB9IGZyb20gXCJAb3Blbm1ycy9lc20tbmF2aWdhdGlvblwiO1xuZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQsIHRvLCB0ZW1wbGF0ZVBhcmFtcywgb25CZWZvcmVOYXZpZ2F0ZSkge1xuICAgIC8vIExlZnQgY2xpY2sgd2l0aG91dCBtb2RpZmllcnMgKG5vcm1hbCBuYXZpZ2F0aW9uKVxuICAgIGlmIChldmVudC5idXR0b24gPT09IDAgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25CZWZvcmVOYXZpZ2F0ZT8uKGV2ZW50KTtcbiAgICAgICAgbmF2aWdhdGUoe1xuICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gTGVmdCBjbGljayB3aXRoIEN0cmwga2V5IChvciBDbWQga2V5IG9uIE1hYykgLSBPcGVuIGluIG5ldyB0YWJcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpKSB7XG4gICAgICAgIG9uQmVmb3JlTmF2aWdhdGU/LihldmVudCk7XG4gICAgfVxuICAgIC8vIExlZnQgY2xpY2sgd2l0aCBTaGlmdCBrZXkgLSBPcGVuIGluIG5ldyB3aW5kb3dcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgIG9uQmVmb3JlTmF2aWdhdGU/LihldmVudCk7XG4gICAgfVxuICAgIC8vIE1pZGRsZSBjbGljayAtIE9wZW4gaW4gbmV3IGJhY2tncm91bmQgdGFiXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSkge1xuICAgICAgICBvbkJlZm9yZU5hdmlnYXRlPy4oZXZlbnQpO1xuICAgIH1cbn1cbi8qKlxuICogQSBSZWFjdCBsaW5rIGNvbXBvbmVudCB3aGljaCBjYWxscyB7QGxpbmsgbmF2aWdhdGV9IHdoZW4gY2xpY2tlZFxuICovIGV4cG9ydCBmdW5jdGlvbiBDb25maWd1cmFibGVMaW5rKHsgdG8sIHRlbXBsYXRlUGFyYW1zLCBvbkJlZm9yZU5hdmlnYXRlLCBjaGlsZHJlbiwgLi4ub3RoZXJQcm9wcyB9KSB7XG4gICAgdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGlmIChvdGhlclByb3BzLmhyZWYpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ29uZmlndXJhYmxlTGluayBkb2VzIG5vdCBzdXBwb3J0IHRoZSBocmVmIHByb3AuIFVzZSB0aGUgJ3RvJyBwcm9wIGluc3RlYWQuIFRoZSBwcm92aWRlZCBocmVmIHZhbHVlIGlzICcke290aGVyUHJvcHMuaHJlZn0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyUHJvcHMub25DbGljaykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb25maWd1cmFibGVMaW5rIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9uQ2xpY2sgcHJvcC4gVXNlIHRoZSAnb25CZWZvcmVOYXZpZ2F0ZScgcHJvcCBpbnN0ZWFkLiBUaGUgJ3RvJyBwcm9wIG9mIHRoZSBvZmZlbmRpbmcgbGluayBpcyAke3RvfWApO1xuICAgICAgICB9XG4gICAgfSwgW10pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgICAgb25DbGljazogKGV2ZW50KT0+aGFuZGxlQ2xpY2soZXZlbnQsIHRvLCB0ZW1wbGF0ZVBhcmFtcywgb25CZWZvcmVOYXZpZ2F0ZSksXG4gICAgICAgIGhyZWY6IGludGVycG9sYXRlVXJsKHRvLCB0ZW1wbGF0ZVBhcmFtcyksXG4gICAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9LCBjaGlsZHJlbik7XG59XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJ1c2VFZmZlY3QiLCJuYXZpZ2F0ZSIsImludGVycG9sYXRlVXJsIiwiaGFuZGxlQ2xpY2siLCJldmVudCIsInRvIiwidGVtcGxhdGVQYXJhbXMiLCJvbkJlZm9yZU5hdmlnYXRlIiwiYnV0dG9uIiwiY3RybEtleSIsInNoaWZ0S2V5IiwiYWx0S2V5IiwibWV0YUtleSIsInByZXZlbnREZWZhdWx0IiwiQ29uZmlndXJhYmxlTGluayIsImNoaWxkcmVuIiwib3RoZXJQcm9wcyIsImhyZWYiLCJjb25zb2xlIiwid2FybiIsIm9uQ2xpY2siLCJjcmVhdGVFbGVtZW50Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/ConfigurableLink.js\n");
779
779
 
780
780
  /***/ }),
781
781
 
@@ -835,7 +835,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
835
835
  \************************************************************/
836
836
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
837
837
 
838
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getAsyncExtensionLifecycle: () => (/* binding */ getAsyncExtensionLifecycle),\n/* harmony export */ getAsyncLifecycle: () => (/* binding */ getAsyncLifecycle),\n/* harmony export */ getLifecycle: () => (/* binding */ getLifecycle),\n/* harmony export */ getSyncLifecycle: () => (/* binding */ getSyncLifecycle)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ \"../../../node_modules/react-dom/client.js\");\n/* harmony import */ var single_spa_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! single-spa-react */ \"../../../node_modules/single-spa-react/lib/esm/single-spa-react.js\");\n/* harmony import */ var _openmrsComponentDecorator_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./openmrsComponentDecorator.js */ \"../../framework/esm-react-utils/dist/openmrsComponentDecorator.js\");\n/** @module @category Framework */ \n\n\n\nfunction getLifecycle(Component, options) {\n return (0,single_spa_react__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n React: react__WEBPACK_IMPORTED_MODULE_0__,\n ReactDOMClient: react_dom_client__WEBPACK_IMPORTED_MODULE_1__,\n rootComponent: (0,_openmrsComponentDecorator_js__WEBPACK_IMPORTED_MODULE_3__.openmrsComponentDecorator)(options)(Component)\n });\n}\nfunction getAsyncLifecycle(lazy, options) {\n return ()=>lazy().then(({ default: Component })=>getLifecycle(Component, options));\n}\nfunction getSyncLifecycle(Component, options) {\n return ()=>Promise.resolve(getLifecycle(Component, options));\n}\n/**\n * @deprecated Use getAsyncLifecycle instead.\n */ const getAsyncExtensionLifecycle = getAsyncLifecycle;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L2dldExpZmVjeWNsZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLGdDQUFnQyxHQUE2QjtBQUNmO0FBQ0E7QUFDNkI7QUFDcEUsU0FBU0ksYUFBYUMsU0FBUyxFQUFFQyxPQUFPO0lBQzNDLE9BQU9KLDREQUFjQSxDQUFDO1FBQ2xCRixLQUFLQSxvQ0FBQUE7UUFDTEMsY0FBY0EsK0NBQUFBO1FBQ2RNLGVBQWVKLHdGQUF5QkEsQ0FBQ0csU0FBU0Q7SUFDdEQ7QUFDSjtBQUNPLFNBQVNHLGtCQUFrQkMsSUFBSSxFQUFFSCxPQUFPO0lBQzNDLE9BQU8sSUFBSUcsT0FBT0MsSUFBSSxDQUFDLENBQUMsRUFBRUMsU0FBU04sU0FBUyxFQUFFLEdBQUdELGFBQWFDLFdBQVdDO0FBQzdFO0FBQ08sU0FBU00saUJBQWlCUCxTQUFTLEVBQUVDLE9BQU87SUFDL0MsT0FBTyxJQUFJTyxRQUFRQyxPQUFPLENBQUNWLGFBQWFDLFdBQVdDO0FBQ3ZEO0FBQ0E7O0NBRUMsR0FBVSxNQUFNUyw2QkFBNkJQLGtCQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L2dldExpZmVjeWNsZS5qcz9mN2NhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBGcmFtZXdvcmsgKi8gaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NQ2xpZW50IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCI7XG5pbXBvcnQgc2luZ2xlU3BhUmVhY3QgZnJvbSBcInNpbmdsZS1zcGEtcmVhY3RcIjtcbmltcG9ydCB7IG9wZW5tcnNDb21wb25lbnREZWNvcmF0b3IgfSBmcm9tIFwiLi9vcGVubXJzQ29tcG9uZW50RGVjb3JhdG9yLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlmZWN5Y2xlKENvbXBvbmVudCwgb3B0aW9ucykge1xuICAgIHJldHVybiBzaW5nbGVTcGFSZWFjdCh7XG4gICAgICAgIFJlYWN0LFxuICAgICAgICBSZWFjdERPTUNsaWVudCxcbiAgICAgICAgcm9vdENvbXBvbmVudDogb3Blbm1yc0NvbXBvbmVudERlY29yYXRvcihvcHRpb25zKShDb21wb25lbnQpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXN5bmNMaWZlY3ljbGUobGF6eSwgb3B0aW9ucykge1xuICAgIHJldHVybiAoKT0+bGF6eSgpLnRoZW4oKHsgZGVmYXVsdDogQ29tcG9uZW50IH0pPT5nZXRMaWZlY3ljbGUoQ29tcG9uZW50LCBvcHRpb25zKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3luY0xpZmVjeWNsZShDb21wb25lbnQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKCk9PlByb21pc2UucmVzb2x2ZShnZXRMaWZlY3ljbGUoQ29tcG9uZW50LCBvcHRpb25zKSk7XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBnZXRBc3luY0xpZmVjeWNsZSBpbnN0ZWFkLlxuICovIGV4cG9ydCBjb25zdCBnZXRBc3luY0V4dGVuc2lvbkxpZmVjeWNsZSA9IGdldEFzeW5jTGlmZWN5Y2xlO1xuIl0sIm5hbWVzIjpbIlJlYWN0IiwiUmVhY3RET01DbGllbnQiLCJzaW5nbGVTcGFSZWFjdCIsIm9wZW5tcnNDb21wb25lbnREZWNvcmF0b3IiLCJnZXRMaWZlY3ljbGUiLCJDb21wb25lbnQiLCJvcHRpb25zIiwicm9vdENvbXBvbmVudCIsImdldEFzeW5jTGlmZWN5Y2xlIiwibGF6eSIsInRoZW4iLCJkZWZhdWx0IiwiZ2V0U3luY0xpZmVjeWNsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiZ2V0QXN5bmNFeHRlbnNpb25MaWZlY3ljbGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/getLifecycle.js\n");
838
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getAsyncExtensionLifecycle: () => (/* binding */ getAsyncExtensionLifecycle),\n/* harmony export */ getAsyncLifecycle: () => (/* binding */ getAsyncLifecycle),\n/* harmony export */ getLifecycle: () => (/* binding */ getLifecycle),\n/* harmony export */ getSyncLifecycle: () => (/* binding */ getSyncLifecycle)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ \"../../../node_modules/react-dom/client.js\");\n/* harmony import */ var single_spa_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! single-spa-react */ \"../../../node_modules/single-spa-react/lib/esm/single-spa-react.js\");\n/* harmony import */ var _openmrsComponentDecorator_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./openmrsComponentDecorator.js */ \"../../framework/esm-react-utils/dist/openmrsComponentDecorator.js\");\n/** @module @category Framework */ \n\n\n\n/**\n * Creates a single-spa lifecycle object for a React component. The component is\n * wrapped with the OpenMRS component decorator which provides standard functionality\n * like error boundaries, configuration, and extension support.\n *\n * @param Component The React component to create a lifecycle for.\n * @param options Configuration options for the OpenMRS component decorator.\n * @returns A single-spa lifecycle object with bootstrap, mount, and unmount functions.\n *\n * @example\n * ```ts\n * import { getLifecycle } from '@openmrs/esm-framework';\n * import MyComponent from './MyComponent';\n * export const lifecycle = getLifecycle(MyComponent, { featureName: 'my-feature', moduleName: '@openmrs/esm-my-app' });\n * ```\n */ function getLifecycle(Component, options) {\n return (0,single_spa_react__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n React: react__WEBPACK_IMPORTED_MODULE_0__,\n ReactDOMClient: react_dom_client__WEBPACK_IMPORTED_MODULE_1__,\n rootComponent: (0,_openmrsComponentDecorator_js__WEBPACK_IMPORTED_MODULE_3__.openmrsComponentDecorator)(options)(Component)\n });\n}\n/**\n * Creates a lazy-loading single-spa lifecycle for a React component. The component\n * is loaded asynchronously via dynamic import only when it's needed, which helps\n * reduce initial bundle size. This is the recommended way to define lifecycles\n * for most modules.\n *\n * @param lazy A function that returns a Promise resolving to a module with the\n * component as its default export (i.e., a dynamic import).\n * @param options Configuration options for the OpenMRS component decorator.\n * @returns A function that returns a Promise resolving to a single-spa lifecycle object.\n *\n * @example\n * ```ts\n * import { getAsyncLifecycle } from '@openmrs/esm-framework';\n * const options = { featureName: 'my-feature', moduleName: '@openmrs/esm-my-app' };\n * export const root = getAsyncLifecycle(() => import('./root.component'), options);\n * ```\n */ function getAsyncLifecycle(lazy, options) {\n return ()=>lazy().then(({ default: Component })=>getLifecycle(Component, options));\n}\n/**\n * Creates a single-spa lifecycle for a React component that is already loaded.\n * Unlike {@link getAsyncLifecycle}, this wraps a synchronously-available component\n * in a Promise to match the expected lifecycle interface. Use this when the\n * component doesn't need lazy loading.\n *\n * @param Component The React component to create a lifecycle for.\n * @param options Configuration options for the OpenMRS component decorator.\n * @returns A function that returns a Promise resolving to a single-spa lifecycle object.\n *\n * @example\n * ```ts\n * import { getSyncLifecycle } from '@openmrs/esm-framework';\n * import MyComponent from './MyComponent';\n * const options = { featureName: 'my-feature', moduleName: '@openmrs/esm-my-app' };\n * export const myExtension = getSyncLifecycle(MyComponent, options);\n * ```\n */ function getSyncLifecycle(Component, options) {\n return ()=>Promise.resolve(getLifecycle(Component, options));\n}\n/**\n * @deprecated Use getAsyncLifecycle instead.\n */ const getAsyncExtensionLifecycle = getAsyncLifecycle;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L2dldExpZmVjeWNsZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLGdDQUFnQyxHQUE2QjtBQUNmO0FBQ0E7QUFDNkI7QUFDM0U7Ozs7Ozs7Ozs7Ozs7OztDQWVDLEdBQVUsU0FBU0ksYUFBYUMsU0FBUyxFQUFFQyxPQUFPO0lBQy9DLE9BQU9KLDREQUFjQSxDQUFDO1FBQ2xCRixLQUFLQSxvQ0FBQUE7UUFDTEMsY0FBY0EsK0NBQUFBO1FBQ2RNLGVBQWVKLHdGQUF5QkEsQ0FBQ0csU0FBU0Q7SUFDdEQ7QUFDSjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztDQWlCQyxHQUFVLFNBQVNHLGtCQUFrQkMsSUFBSSxFQUFFSCxPQUFPO0lBQy9DLE9BQU8sSUFBSUcsT0FBT0MsSUFBSSxDQUFDLENBQUMsRUFBRUMsU0FBU04sU0FBUyxFQUFFLEdBQUdELGFBQWFDLFdBQVdDO0FBQzdFO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUJDLEdBQVUsU0FBU00saUJBQWlCUCxTQUFTLEVBQUVDLE9BQU87SUFDbkQsT0FBTyxJQUFJTyxRQUFRQyxPQUFPLENBQUNWLGFBQWFDLFdBQVdDO0FBQ3ZEO0FBQ0E7O0NBRUMsR0FBVSxNQUFNUyw2QkFBNkJQLGtCQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L2dldExpZmVjeWNsZS5qcz9mN2NhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBGcmFtZXdvcmsgKi8gaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NQ2xpZW50IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCI7XG5pbXBvcnQgc2luZ2xlU3BhUmVhY3QgZnJvbSBcInNpbmdsZS1zcGEtcmVhY3RcIjtcbmltcG9ydCB7IG9wZW5tcnNDb21wb25lbnREZWNvcmF0b3IgfSBmcm9tIFwiLi9vcGVubXJzQ29tcG9uZW50RGVjb3JhdG9yLmpzXCI7XG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUtc3BhIGxpZmVjeWNsZSBvYmplY3QgZm9yIGEgUmVhY3QgY29tcG9uZW50LiBUaGUgY29tcG9uZW50IGlzXG4gKiB3cmFwcGVkIHdpdGggdGhlIE9wZW5NUlMgY29tcG9uZW50IGRlY29yYXRvciB3aGljaCBwcm92aWRlcyBzdGFuZGFyZCBmdW5jdGlvbmFsaXR5XG4gKiBsaWtlIGVycm9yIGJvdW5kYXJpZXMsIGNvbmZpZ3VyYXRpb24sIGFuZCBleHRlbnNpb24gc3VwcG9ydC5cbiAqXG4gKiBAcGFyYW0gQ29tcG9uZW50IFRoZSBSZWFjdCBjb21wb25lbnQgdG8gY3JlYXRlIGEgbGlmZWN5Y2xlIGZvci5cbiAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIE9wZW5NUlMgY29tcG9uZW50IGRlY29yYXRvci5cbiAqIEByZXR1cm5zIEEgc2luZ2xlLXNwYSBsaWZlY3ljbGUgb2JqZWN0IHdpdGggYm9vdHN0cmFwLCBtb3VudCwgYW5kIHVubW91bnQgZnVuY3Rpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZ2V0TGlmZWN5Y2xlIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBpbXBvcnQgTXlDb21wb25lbnQgZnJvbSAnLi9NeUNvbXBvbmVudCc7XG4gKiBleHBvcnQgY29uc3QgbGlmZWN5Y2xlID0gZ2V0TGlmZWN5Y2xlKE15Q29tcG9uZW50LCB7IGZlYXR1cmVOYW1lOiAnbXktZmVhdHVyZScsIG1vZHVsZU5hbWU6ICdAb3Blbm1ycy9lc20tbXktYXBwJyB9KTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRMaWZlY3ljbGUoQ29tcG9uZW50LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHNpbmdsZVNwYVJlYWN0KHtcbiAgICAgICAgUmVhY3QsXG4gICAgICAgIFJlYWN0RE9NQ2xpZW50LFxuICAgICAgICByb290Q29tcG9uZW50OiBvcGVubXJzQ29tcG9uZW50RGVjb3JhdG9yKG9wdGlvbnMpKENvbXBvbmVudClcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGxhenktbG9hZGluZyBzaW5nbGUtc3BhIGxpZmVjeWNsZSBmb3IgYSBSZWFjdCBjb21wb25lbnQuIFRoZSBjb21wb25lbnRcbiAqIGlzIGxvYWRlZCBhc3luY2hyb25vdXNseSB2aWEgZHluYW1pYyBpbXBvcnQgb25seSB3aGVuIGl0J3MgbmVlZGVkLCB3aGljaCBoZWxwc1xuICogcmVkdWNlIGluaXRpYWwgYnVuZGxlIHNpemUuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHdheSB0byBkZWZpbmUgbGlmZWN5Y2xlc1xuICogZm9yIG1vc3QgbW9kdWxlcy5cbiAqXG4gKiBAcGFyYW0gbGF6eSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFByb21pc2UgcmVzb2x2aW5nIHRvIGEgbW9kdWxlIHdpdGggdGhlXG4gKiAgIGNvbXBvbmVudCBhcyBpdHMgZGVmYXVsdCBleHBvcnQgKGkuZS4sIGEgZHluYW1pYyBpbXBvcnQpLlxuICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgT3Blbk1SUyBjb21wb25lbnQgZGVjb3JhdG9yLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBQcm9taXNlIHJlc29sdmluZyB0byBhIHNpbmdsZS1zcGEgbGlmZWN5Y2xlIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGdldEFzeW5jTGlmZWN5Y2xlIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBjb25zdCBvcHRpb25zID0geyBmZWF0dXJlTmFtZTogJ215LWZlYXR1cmUnLCBtb2R1bGVOYW1lOiAnQG9wZW5tcnMvZXNtLW15LWFwcCcgfTtcbiAqIGV4cG9ydCBjb25zdCByb290ID0gZ2V0QXN5bmNMaWZlY3ljbGUoKCkgPT4gaW1wb3J0KCcuL3Jvb3QuY29tcG9uZW50JyksIG9wdGlvbnMpO1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldEFzeW5jTGlmZWN5Y2xlKGxhenksIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKCk9PmxhenkoKS50aGVuKCh7IGRlZmF1bHQ6IENvbXBvbmVudCB9KT0+Z2V0TGlmZWN5Y2xlKENvbXBvbmVudCwgb3B0aW9ucykpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlLXNwYSBsaWZlY3ljbGUgZm9yIGEgUmVhY3QgY29tcG9uZW50IHRoYXQgaXMgYWxyZWFkeSBsb2FkZWQuXG4gKiBVbmxpa2Uge0BsaW5rIGdldEFzeW5jTGlmZWN5Y2xlfSwgdGhpcyB3cmFwcyBhIHN5bmNocm9ub3VzbHktYXZhaWxhYmxlIGNvbXBvbmVudFxuICogaW4gYSBQcm9taXNlIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBsaWZlY3ljbGUgaW50ZXJmYWNlLiBVc2UgdGhpcyB3aGVuIHRoZVxuICogY29tcG9uZW50IGRvZXNuJ3QgbmVlZCBsYXp5IGxvYWRpbmcuXG4gKlxuICogQHBhcmFtIENvbXBvbmVudCBUaGUgUmVhY3QgY29tcG9uZW50IHRvIGNyZWF0ZSBhIGxpZmVjeWNsZSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBPcGVuTVJTIGNvbXBvbmVudCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFByb21pc2UgcmVzb2x2aW5nIHRvIGEgc2luZ2xlLXNwYSBsaWZlY3ljbGUgb2JqZWN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZ2V0U3luY0xpZmVjeWNsZSB9IGZyb20gJ0BvcGVubXJzL2VzbS1mcmFtZXdvcmsnO1xuICogaW1wb3J0IE15Q29tcG9uZW50IGZyb20gJy4vTXlDb21wb25lbnQnO1xuICogY29uc3Qgb3B0aW9ucyA9IHsgZmVhdHVyZU5hbWU6ICdteS1mZWF0dXJlJywgbW9kdWxlTmFtZTogJ0BvcGVubXJzL2VzbS1teS1hcHAnIH07XG4gKiBleHBvcnQgY29uc3QgbXlFeHRlbnNpb24gPSBnZXRTeW5jTGlmZWN5Y2xlKE15Q29tcG9uZW50LCBvcHRpb25zKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRTeW5jTGlmZWN5Y2xlKENvbXBvbmVudCwgb3B0aW9ucykge1xuICAgIHJldHVybiAoKT0+UHJvbWlzZS5yZXNvbHZlKGdldExpZmVjeWNsZShDb21wb25lbnQsIG9wdGlvbnMpKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGdldEFzeW5jTGlmZWN5Y2xlIGluc3RlYWQuXG4gKi8gZXhwb3J0IGNvbnN0IGdldEFzeW5jRXh0ZW5zaW9uTGlmZWN5Y2xlID0gZ2V0QXN5bmNMaWZlY3ljbGU7XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJSZWFjdERPTUNsaWVudCIsInNpbmdsZVNwYVJlYWN0Iiwib3Blbm1yc0NvbXBvbmVudERlY29yYXRvciIsImdldExpZmVjeWNsZSIsIkNvbXBvbmVudCIsIm9wdGlvbnMiLCJyb290Q29tcG9uZW50IiwiZ2V0QXN5bmNMaWZlY3ljbGUiLCJsYXp5IiwidGhlbiIsImRlZmF1bHQiLCJnZXRTeW5jTGlmZWN5Y2xlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRBc3luY0V4dGVuc2lvbkxpZmVjeWNsZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/getLifecycle.js\n");
839
839
 
840
840
  /***/ }),
841
841
 
@@ -905,7 +905,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
905
905
  \**************************************************************/
906
906
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
907
907
 
908
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useAttachments: () => (/* binding */ useAttachments)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var swr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! swr */ \"../../../node_modules/swr/dist/core/index.mjs\");\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @openmrs/esm-emr-api */ \"../../framework/esm-emr-api/dist/index.js\");\n/** @module @category API */ \n\n\n\nfunction useAttachments(patientUuid, includeEncounterless) {\n const { data, error, mutate, isLoading, isValidating } = (0,swr__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(`${_openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_3__.attachmentUrl}?patient=${patientUuid}&includeEncounterless=${includeEncounterless}`, _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__.openmrsFetch);\n const results = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>({\n isLoading,\n data: data?.data.results ?? [],\n error,\n mutate,\n isValidating\n }), [\n data,\n error,\n isLoading,\n isValidating,\n mutate\n ]);\n return results;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUF0dGFjaG1lbnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsMEJBQTBCLEdBQW1DO0FBQ3BDO0FBQ3VCO0FBQ0s7QUFDOUMsU0FBU0ksZUFBZUMsV0FBVyxFQUFFQyxvQkFBb0I7SUFDNUQsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsTUFBTSxFQUFFQyxTQUFTLEVBQUVDLFlBQVksRUFBRSxHQUFHViwrQ0FBTUEsQ0FBQyxHQUFHRSwrREFBYUEsQ0FBQyxTQUFTLEVBQUVFLFlBQVksc0JBQXNCLEVBQUVDLHNCQUFzQixFQUFFSiwwREFBWUE7SUFDcEssTUFBTVUsVUFBVVosOENBQU9BLENBQUMsSUFBSztZQUNyQlU7WUFDQUgsTUFBTUEsTUFBTUEsS0FBS0ssV0FBVyxFQUFFO1lBQzlCSjtZQUNBQztZQUNBRTtRQUNKLElBQUk7UUFDSko7UUFDQUM7UUFDQUU7UUFDQUM7UUFDQUY7S0FDSDtJQUNELE9BQU9HO0FBQ1giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VBdHRhY2htZW50cy5qcz80OGM0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBBUEkgKi8gaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHVzZVNXUiBmcm9tIFwic3dyXCI7XG5pbXBvcnQgeyBvcGVubXJzRmV0Y2ggfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWFwaVwiO1xuaW1wb3J0IHsgYXR0YWNobWVudFVybCB9IGZyb20gXCJAb3Blbm1ycy9lc20tZW1yLWFwaVwiO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUF0dGFjaG1lbnRzKHBhdGllbnRVdWlkLCBpbmNsdWRlRW5jb3VudGVybGVzcykge1xuICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IsIG11dGF0ZSwgaXNMb2FkaW5nLCBpc1ZhbGlkYXRpbmcgfSA9IHVzZVNXUihgJHthdHRhY2htZW50VXJsfT9wYXRpZW50PSR7cGF0aWVudFV1aWR9JmluY2x1ZGVFbmNvdW50ZXJsZXNzPSR7aW5jbHVkZUVuY291bnRlcmxlc3N9YCwgb3Blbm1yc0ZldGNoKTtcbiAgICBjb25zdCByZXN1bHRzID0gdXNlTWVtbygoKT0+KHtcbiAgICAgICAgICAgIGlzTG9hZGluZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGE/LmRhdGEucmVzdWx0cyA/PyBbXSxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgbXV0YXRlLFxuICAgICAgICAgICAgaXNWYWxpZGF0aW5nXG4gICAgICAgIH0pLCBbXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgIGlzVmFsaWRhdGluZyxcbiAgICAgICAgbXV0YXRlXG4gICAgXSk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG4iXSwibmFtZXMiOlsidXNlTWVtbyIsInVzZVNXUiIsIm9wZW5tcnNGZXRjaCIsImF0dGFjaG1lbnRVcmwiLCJ1c2VBdHRhY2htZW50cyIsInBhdGllbnRVdWlkIiwiaW5jbHVkZUVuY291bnRlcmxlc3MiLCJkYXRhIiwiZXJyb3IiLCJtdXRhdGUiLCJpc0xvYWRpbmciLCJpc1ZhbGlkYXRpbmciLCJyZXN1bHRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useAttachments.js\n");
908
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useAttachments: () => (/* binding */ useAttachments)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var swr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! swr */ \"../../../node_modules/swr/dist/core/index.mjs\");\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/* harmony import */ var _openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @openmrs/esm-emr-api */ \"../../framework/esm-emr-api/dist/index.js\");\n/** @module @category API */ \n\n\n\n/**\n * A React hook that fetches attachments for a patient using SWR for caching\n * and automatic revalidation.\n *\n * @param patientUuid The UUID of the patient whose attachments should be fetched.\n * @param includeEncounterless Whether to include attachments that are not\n * associated with any encounter.\n * @returns An object containing:\n * - `data`: Array of attachment objects (empty array while loading)\n * - `isLoading`: Whether the initial fetch is in progress\n * - `isValidating`: Whether any request (initial or revalidation) is in progress\n * - `error`: Any error that occurred during fetching\n * - `mutate`: Function to trigger a revalidation of the data\n *\n * @example\n * ```tsx\n * import { useAttachments } from '@openmrs/esm-framework';\n * function PatientAttachments({ patientUuid }) {\n * const { data, isLoading, error } = useAttachments(patientUuid, true);\n * if (isLoading) return <span>Loading...</span>;\n * if (error) return <span>Error loading attachments</span>;\n * return <AttachmentList attachments={data} />;\n * }\n * ```\n */ function useAttachments(patientUuid, includeEncounterless) {\n const { data, error, mutate, isLoading, isValidating } = (0,swr__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(`${_openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_3__.attachmentUrl}?patient=${patientUuid}&includeEncounterless=${includeEncounterless}`, _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__.openmrsFetch);\n const results = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>({\n isLoading,\n data: data?.data.results ?? [],\n error,\n mutate,\n isValidating\n }), [\n data,\n error,\n isLoading,\n isValidating,\n mutate\n ]);\n return results;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUF0dGFjaG1lbnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsMEJBQTBCLEdBQW1DO0FBQ3BDO0FBQ3VCO0FBQ0s7QUFDckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXdCQyxHQUFVLFNBQVNJLGVBQWVDLFdBQVcsRUFBRUMsb0JBQW9CO0lBQ2hFLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxZQUFZLEVBQUUsR0FBR1YsK0NBQU1BLENBQUMsR0FBR0UsK0RBQWFBLENBQUMsU0FBUyxFQUFFRSxZQUFZLHNCQUFzQixFQUFFQyxzQkFBc0IsRUFBRUosMERBQVlBO0lBQ3BLLE1BQU1VLFVBQVVaLDhDQUFPQSxDQUFDLElBQUs7WUFDckJVO1lBQ0FILE1BQU1BLE1BQU1BLEtBQUtLLFdBQVcsRUFBRTtZQUM5Qko7WUFDQUM7WUFDQUU7UUFDSixJQUFJO1FBQ0pKO1FBQ0FDO1FBQ0FFO1FBQ0FDO1FBQ0FGO0tBQ0g7SUFDRCxPQUFPRztBQUNYIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvdXNlQXR0YWNobWVudHMuanM/NDhjNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB1c2VTV1IgZnJvbSBcInN3clwiO1xuaW1wb3J0IHsgb3Blbm1yc0ZldGNoIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1hcGlcIjtcbmltcG9ydCB7IGF0dGFjaG1lbnRVcmwgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWVtci1hcGlcIjtcbi8qKlxuICogQSBSZWFjdCBob29rIHRoYXQgZmV0Y2hlcyBhdHRhY2htZW50cyBmb3IgYSBwYXRpZW50IHVzaW5nIFNXUiBmb3IgY2FjaGluZ1xuICogYW5kIGF1dG9tYXRpYyByZXZhbGlkYXRpb24uXG4gKlxuICogQHBhcmFtIHBhdGllbnRVdWlkIFRoZSBVVUlEIG9mIHRoZSBwYXRpZW50IHdob3NlIGF0dGFjaG1lbnRzIHNob3VsZCBiZSBmZXRjaGVkLlxuICogQHBhcmFtIGluY2x1ZGVFbmNvdW50ZXJsZXNzIFdoZXRoZXIgdG8gaW5jbHVkZSBhdHRhY2htZW50cyB0aGF0IGFyZSBub3RcbiAqICAgYXNzb2NpYXRlZCB3aXRoIGFueSBlbmNvdW50ZXIuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZzpcbiAqICAgLSBgZGF0YWA6IEFycmF5IG9mIGF0dGFjaG1lbnQgb2JqZWN0cyAoZW1wdHkgYXJyYXkgd2hpbGUgbG9hZGluZylcbiAqICAgLSBgaXNMb2FkaW5nYDogV2hldGhlciB0aGUgaW5pdGlhbCBmZXRjaCBpcyBpbiBwcm9ncmVzc1xuICogICAtIGBpc1ZhbGlkYXRpbmdgOiBXaGV0aGVyIGFueSByZXF1ZXN0IChpbml0aWFsIG9yIHJldmFsaWRhdGlvbikgaXMgaW4gcHJvZ3Jlc3NcbiAqICAgLSBgZXJyb3JgOiBBbnkgZXJyb3IgdGhhdCBvY2N1cnJlZCBkdXJpbmcgZmV0Y2hpbmdcbiAqICAgLSBgbXV0YXRlYDogRnVuY3Rpb24gdG8gdHJpZ2dlciBhIHJldmFsaWRhdGlvbiBvZiB0aGUgZGF0YVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZUF0dGFjaG1lbnRzIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBmdW5jdGlvbiBQYXRpZW50QXR0YWNobWVudHMoeyBwYXRpZW50VXVpZCB9KSB7XG4gKiAgIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nLCBlcnJvciB9ID0gdXNlQXR0YWNobWVudHMocGF0aWVudFV1aWQsIHRydWUpO1xuICogICBpZiAoaXNMb2FkaW5nKSByZXR1cm4gPHNwYW4+TG9hZGluZy4uLjwvc3Bhbj47XG4gKiAgIGlmIChlcnJvcikgcmV0dXJuIDxzcGFuPkVycm9yIGxvYWRpbmcgYXR0YWNobWVudHM8L3NwYW4+O1xuICogICByZXR1cm4gPEF0dGFjaG1lbnRMaXN0IGF0dGFjaG1lbnRzPXtkYXRhfSAvPjtcbiAqIH1cbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB1c2VBdHRhY2htZW50cyhwYXRpZW50VXVpZCwgaW5jbHVkZUVuY291bnRlcmxlc3MpIHtcbiAgICBjb25zdCB7IGRhdGEsIGVycm9yLCBtdXRhdGUsIGlzTG9hZGluZywgaXNWYWxpZGF0aW5nIH0gPSB1c2VTV1IoYCR7YXR0YWNobWVudFVybH0/cGF0aWVudD0ke3BhdGllbnRVdWlkfSZpbmNsdWRlRW5jb3VudGVybGVzcz0ke2luY2x1ZGVFbmNvdW50ZXJsZXNzfWAsIG9wZW5tcnNGZXRjaCk7XG4gICAgY29uc3QgcmVzdWx0cyA9IHVzZU1lbW8oKCk9Pih7XG4gICAgICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgICAgICBkYXRhOiBkYXRhPy5kYXRhLnJlc3VsdHMgPz8gW10sXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIG11dGF0ZSxcbiAgICAgICAgICAgIGlzVmFsaWRhdGluZ1xuICAgICAgICB9KSwgW1xuICAgICAgICBkYXRhLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgaXNMb2FkaW5nLFxuICAgICAgICBpc1ZhbGlkYXRpbmcsXG4gICAgICAgIG11dGF0ZVxuICAgIF0pO1xuICAgIHJldHVybiByZXN1bHRzO1xufVxuIl0sIm5hbWVzIjpbInVzZU1lbW8iLCJ1c2VTV1IiLCJvcGVubXJzRmV0Y2giLCJhdHRhY2htZW50VXJsIiwidXNlQXR0YWNobWVudHMiLCJwYXRpZW50VXVpZCIsImluY2x1ZGVFbmNvdW50ZXJsZXNzIiwiZGF0YSIsImVycm9yIiwibXV0YXRlIiwiaXNMb2FkaW5nIiwiaXNWYWxpZGF0aW5nIiwicmVzdWx0cyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useAttachments.js\n");
909
909
 
910
910
  /***/ }),
911
911
 
@@ -915,7 +915,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
915
915
  \*****************************************************************/
916
916
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
917
917
 
918
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useBodyScrollLock: () => (/* binding */ useBodyScrollLock)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/** @module @category UI */ \nfunction useBodyScrollLock(active) {\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n if (active) {\n const original = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = 'hidden';\n return ()=>{\n document.body.style.overflow = original;\n };\n }\n }, [\n active\n ]);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUJvZHlTY3JvbGxMb2NrLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCLEdBQXFDO0FBQ3ZELFNBQVNDLGtCQUFrQkMsTUFBTTtJQUNwQ0YsZ0RBQVNBLENBQUM7UUFDTixJQUFJRSxRQUFRO1lBQ1IsTUFBTUMsV0FBV0MsT0FBT0MsZ0JBQWdCLENBQUNDLFNBQVNDLElBQUksRUFBRUMsUUFBUTtZQUNoRUYsU0FBU0MsSUFBSSxDQUFDRSxLQUFLLENBQUNELFFBQVEsR0FBRztZQUMvQixPQUFPO2dCQUNIRixTQUFTQyxJQUFJLENBQUNFLEtBQUssQ0FBQ0QsUUFBUSxHQUFHTDtZQUNuQztRQUNKO0lBQ0osR0FBRztRQUNDRDtLQUNIO0FBQ0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VCb2R5U2Nyb2xsTG9jay5qcz80NWUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBVSSAqLyBpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VCb2R5U2Nyb2xsTG9jayhhY3RpdmUpIHtcbiAgICB1c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5vdmVyZmxvdztcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBvcmlnaW5hbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGFjdGl2ZVxuICAgIF0pO1xufVxuIl0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZUJvZHlTY3JvbGxMb2NrIiwiYWN0aXZlIiwib3JpZ2luYWwiLCJ3aW5kb3ciLCJnZXRDb21wdXRlZFN0eWxlIiwiZG9jdW1lbnQiLCJib2R5Iiwib3ZlcmZsb3ciLCJzdHlsZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useBodyScrollLock.js\n");
918
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useBodyScrollLock: () => (/* binding */ useBodyScrollLock)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/** @module @category UI */ \n/**\n * A React hook that prevents scrolling on the document body when active.\n * Useful for modals, overlays, or any full-screen UI that should prevent\n * background scrolling. The original overflow style is restored when the\n * hook becomes inactive or the component unmounts.\n *\n * @param active Whether to lock the body scroll. When `true`, sets\n * `document.body.style.overflow` to 'hidden'.\n *\n * @example\n * ```tsx\n * import { useBodyScrollLock } from '@openmrs/esm-framework';\n * function Modal({ isOpen }) {\n * useBodyScrollLock(isOpen);\n * return isOpen ? <div className=\"modal\">...</div> : null;\n * }\n * ```\n */ function useBodyScrollLock(active) {\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n if (active) {\n const original = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = 'hidden';\n return ()=>{\n document.body.style.overflow = original;\n };\n }\n }, [\n active\n ]);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUJvZHlTY3JvbGxMb2NrLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCLEdBQXFDO0FBQzlEOzs7Ozs7Ozs7Ozs7Ozs7OztDQWlCQyxHQUFVLFNBQVNDLGtCQUFrQkMsTUFBTTtJQUN4Q0YsZ0RBQVNBLENBQUM7UUFDTixJQUFJRSxRQUFRO1lBQ1IsTUFBTUMsV0FBV0MsT0FBT0MsZ0JBQWdCLENBQUNDLFNBQVNDLElBQUksRUFBRUMsUUFBUTtZQUNoRUYsU0FBU0MsSUFBSSxDQUFDRSxLQUFLLENBQUNELFFBQVEsR0FBRztZQUMvQixPQUFPO2dCQUNIRixTQUFTQyxJQUFJLENBQUNFLEtBQUssQ0FBQ0QsUUFBUSxHQUFHTDtZQUNuQztRQUNKO0lBQ0osR0FBRztRQUNDRDtLQUNIO0FBQ0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VCb2R5U2Nyb2xsTG9jay5qcz80NWUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBVSSAqLyBpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbi8qKlxuICogQSBSZWFjdCBob29rIHRoYXQgcHJldmVudHMgc2Nyb2xsaW5nIG9uIHRoZSBkb2N1bWVudCBib2R5IHdoZW4gYWN0aXZlLlxuICogVXNlZnVsIGZvciBtb2RhbHMsIG92ZXJsYXlzLCBvciBhbnkgZnVsbC1zY3JlZW4gVUkgdGhhdCBzaG91bGQgcHJldmVudFxuICogYmFja2dyb3VuZCBzY3JvbGxpbmcuIFRoZSBvcmlnaW5hbCBvdmVyZmxvdyBzdHlsZSBpcyByZXN0b3JlZCB3aGVuIHRoZVxuICogaG9vayBiZWNvbWVzIGluYWN0aXZlIG9yIHRoZSBjb21wb25lbnQgdW5tb3VudHMuXG4gKlxuICogQHBhcmFtIGFjdGl2ZSBXaGV0aGVyIHRvIGxvY2sgdGhlIGJvZHkgc2Nyb2xsLiBXaGVuIGB0cnVlYCwgc2V0c1xuICogICBgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd2AgdG8gJ2hpZGRlbicuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlQm9keVNjcm9sbExvY2sgfSBmcm9tICdAb3Blbm1ycy9lc20tZnJhbWV3b3JrJztcbiAqIGZ1bmN0aW9uIE1vZGFsKHsgaXNPcGVuIH0pIHtcbiAqICAgdXNlQm9keVNjcm9sbExvY2soaXNPcGVuKTtcbiAqICAgcmV0dXJuIGlzT3BlbiA/IDxkaXYgY2xhc3NOYW1lPVwibW9kYWxcIj4uLi48L2Rpdj4gOiBudWxsO1xuICogfVxuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVzZUJvZHlTY3JvbGxMb2NrKGFjdGl2ZSkge1xuICAgIHVzZUVmZmVjdCgoKT0+e1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLm92ZXJmbG93O1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9IG9yaWdpbmFsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sIFtcbiAgICAgICAgYWN0aXZlXG4gICAgXSk7XG59XG4iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlQm9keVNjcm9sbExvY2siLCJhY3RpdmUiLCJvcmlnaW5hbCIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJkb2N1bWVudCIsImJvZHkiLCJvdmVyZmxvdyIsInN0eWxlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useBodyScrollLock.js\n");
919
919
 
920
920
  /***/ }),
921
921
 
@@ -945,7 +945,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
945
945
  \***************************************************************/
946
946
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
947
947
 
948
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useConnectivity: () => (/* binding */ useConnectivity)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-globals */ \"../../framework/esm-globals/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/is-online.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/** @module @category Offline */ \n\n\nfunction useConnectivity() {\n let [isOnline, setIsOnline] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)((0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_2__.isOnline)());\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>(0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__.subscribeConnectivityChanged)(({ online })=>setIsOnline(online)), []);\n return isOnline;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUNvbm5lY3Rpdml0eS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsOEJBQThCLEdBQXVFO0FBQ3pDO0FBQ2hCO0FBQ3JDLFNBQVNLO0lBQ1osSUFBSSxDQUFDSixVQUFVSyxZQUFZLEdBQUdGLCtDQUFRQSxDQUFDRiw0REFBVUE7SUFDakRDLGdEQUFTQSxDQUFDLElBQUlILGtGQUE0QkEsQ0FBQyxDQUFDLEVBQUVPLE1BQU0sRUFBRSxHQUFHRCxZQUFZQyxVQUFVLEVBQUU7SUFDakYsT0FBT047QUFDWCIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUNvbm5lY3Rpdml0eS5qcz9lOWQ4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBPZmZsaW5lICovIGltcG9ydCB7IHN1YnNjcmliZUNvbm5lY3Rpdml0eUNoYW5nZWQgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWdsb2JhbHNcIjtcbmltcG9ydCB7IGlzT25saW5lIGFzIGlzT25saW5lRm4gfSBmcm9tIFwiQG9wZW5tcnMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5leHBvcnQgZnVuY3Rpb24gdXNlQ29ubmVjdGl2aXR5KCkge1xuICAgIGxldCBbaXNPbmxpbmUsIHNldElzT25saW5lXSA9IHVzZVN0YXRlKGlzT25saW5lRm4oKSk7XG4gICAgdXNlRWZmZWN0KCgpPT5zdWJzY3JpYmVDb25uZWN0aXZpdHlDaGFuZ2VkKCh7IG9ubGluZSB9KT0+c2V0SXNPbmxpbmUob25saW5lKSksIFtdKTtcbiAgICByZXR1cm4gaXNPbmxpbmU7XG59XG4iXSwibmFtZXMiOlsic3Vic2NyaWJlQ29ubmVjdGl2aXR5Q2hhbmdlZCIsImlzT25saW5lIiwiaXNPbmxpbmVGbiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidXNlQ29ubmVjdGl2aXR5Iiwic2V0SXNPbmxpbmUiLCJvbmxpbmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useConnectivity.js\n");
948
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useConnectivity: () => (/* binding */ useConnectivity)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-globals */ \"../../framework/esm-globals/dist/index.js\");\n/* harmony import */ var _openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-utils */ \"../../framework/esm-utils/dist/is-online.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/** @module @category Offline */ \n\n\n/**\n * A React hook that returns the current online/offline status and automatically\n * updates when connectivity changes. Useful for showing offline indicators or\n * conditionally rendering UI based on network availability.\n *\n * @returns `true` if the browser is online, `false` if offline.\n *\n * @example\n * ```tsx\n * import { useConnectivity } from '@openmrs/esm-framework';\n * function NetworkStatus() {\n * const isOnline = useConnectivity();\n * return <span>{isOnline ? 'Online' : 'Offline'}</span>;\n * }\n * ```\n */ function useConnectivity() {\n let [isOnline, setIsOnline] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)((0,_openmrs_esm_utils__WEBPACK_IMPORTED_MODULE_2__.isOnline)());\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>(0,_openmrs_esm_globals__WEBPACK_IMPORTED_MODULE_0__.subscribeConnectivityChanged)(({ online })=>setIsOnline(online)), []);\n return isOnline;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUNvbm5lY3Rpdml0eS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsOEJBQThCLEdBQXVFO0FBQ3pDO0FBQ2hCO0FBQzVDOzs7Ozs7Ozs7Ozs7Ozs7Q0FlQyxHQUFVLFNBQVNLO0lBQ2hCLElBQUksQ0FBQ0osVUFBVUssWUFBWSxHQUFHRiwrQ0FBUUEsQ0FBQ0YsNERBQVVBO0lBQ2pEQyxnREFBU0EsQ0FBQyxJQUFJSCxrRkFBNEJBLENBQUMsQ0FBQyxFQUFFTyxNQUFNLEVBQUUsR0FBR0QsWUFBWUMsVUFBVSxFQUFFO0lBQ2pGLE9BQU9OO0FBQ1giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VDb25uZWN0aXZpdHkuanM/ZTlkOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgT2ZmbGluZSAqLyBpbXBvcnQgeyBzdWJzY3JpYmVDb25uZWN0aXZpdHlDaGFuZ2VkIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1nbG9iYWxzXCI7XG5pbXBvcnQgeyBpc09ubGluZSBhcyBpc09ubGluZUZuIH0gZnJvbSBcIkBvcGVubXJzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuLyoqXG4gKiBBIFJlYWN0IGhvb2sgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IG9ubGluZS9vZmZsaW5lIHN0YXR1cyBhbmQgYXV0b21hdGljYWxseVxuICogdXBkYXRlcyB3aGVuIGNvbm5lY3Rpdml0eSBjaGFuZ2VzLiBVc2VmdWwgZm9yIHNob3dpbmcgb2ZmbGluZSBpbmRpY2F0b3JzIG9yXG4gKiBjb25kaXRpb25hbGx5IHJlbmRlcmluZyBVSSBiYXNlZCBvbiBuZXR3b3JrIGF2YWlsYWJpbGl0eS5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJyb3dzZXIgaXMgb25saW5lLCBgZmFsc2VgIGlmIG9mZmxpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlQ29ubmVjdGl2aXR5IH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBmdW5jdGlvbiBOZXR3b3JrU3RhdHVzKCkge1xuICogICBjb25zdCBpc09ubGluZSA9IHVzZUNvbm5lY3Rpdml0eSgpO1xuICogICByZXR1cm4gPHNwYW4+e2lzT25saW5lID8gJ09ubGluZScgOiAnT2ZmbGluZSd9PC9zcGFuPjtcbiAqIH1cbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB1c2VDb25uZWN0aXZpdHkoKSB7XG4gICAgbGV0IFtpc09ubGluZSwgc2V0SXNPbmxpbmVdID0gdXNlU3RhdGUoaXNPbmxpbmVGbigpKTtcbiAgICB1c2VFZmZlY3QoKCk9PnN1YnNjcmliZUNvbm5lY3Rpdml0eUNoYW5nZWQoKHsgb25saW5lIH0pPT5zZXRJc09ubGluZShvbmxpbmUpKSwgW10pO1xuICAgIHJldHVybiBpc09ubGluZTtcbn1cbiJdLCJuYW1lcyI6WyJzdWJzY3JpYmVDb25uZWN0aXZpdHlDaGFuZ2VkIiwiaXNPbmxpbmUiLCJpc09ubGluZUZuIiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJ1c2VDb25uZWN0aXZpdHkiLCJzZXRJc09ubGluZSIsIm9ubGluZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useConnectivity.js\n");
949
949
 
950
950
  /***/ }),
951
951
 
@@ -1095,7 +1095,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1095
1095
  \**********************************************************/
1096
1096
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1097
1097
 
1098
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useLeftNav: () => (/* binding */ useLeftNav)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-extensions */ \"../../framework/esm-extensions/dist/index.js\");\n/* harmony import */ var _ComponentContext_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ComponentContext.js */ \"../../framework/esm-react-utils/dist/ComponentContext.js\");\n\n\n\nfunction useLeftNav(params) {\n const componentContext = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_ComponentContext_js__WEBPACK_IMPORTED_MODULE_2__.ComponentContext);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n if (componentContext && componentContext.moduleName) {\n params.componentContext = componentContext;\n }\n (0,_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__.setLeftNav)(params);\n return ()=>{\n (0,_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__.unsetLeftNav)(params.name);\n };\n }, [\n componentContext,\n params\n ]);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUxlZnROYXYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUE4QztBQUNxQjtBQUNWO0FBQ2xELFNBQVNLLFdBQVdDLE1BQU07SUFDN0IsTUFBTUMsbUJBQW1CUCxpREFBVUEsQ0FBQ0ksa0VBQWdCQTtJQUNwREgsZ0RBQVNBLENBQUM7UUFDTixJQUFJTSxvQkFBb0JBLGlCQUFpQkMsVUFBVSxFQUFFO1lBQ2pERixPQUFPQyxnQkFBZ0IsR0FBR0E7UUFDOUI7UUFDQUwsbUVBQVVBLENBQUNJO1FBQ1gsT0FBTztZQUNISCxxRUFBWUEsQ0FBQ0csT0FBT0csSUFBSTtRQUM1QjtJQUNKLEdBQUc7UUFDQ0Y7UUFDQUQ7S0FDSDtBQUNMIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvdXNlTGVmdE5hdi5qcz9jYTJjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgc2V0TGVmdE5hdiwgdW5zZXRMZWZ0TmF2IH0gZnJvbSBcIkBvcGVubXJzL2VzbS1leHRlbnNpb25zXCI7XG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0IH0gZnJvbSBcIi4vQ29tcG9uZW50Q29udGV4dC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUxlZnROYXYocGFyYW1zKSB7XG4gICAgY29uc3QgY29tcG9uZW50Q29udGV4dCA9IHVzZUNvbnRleHQoQ29tcG9uZW50Q29udGV4dCk7XG4gICAgdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGlmIChjb21wb25lbnRDb250ZXh0ICYmIGNvbXBvbmVudENvbnRleHQubW9kdWxlTmFtZSkge1xuICAgICAgICAgICAgcGFyYW1zLmNvbXBvbmVudENvbnRleHQgPSBjb21wb25lbnRDb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHNldExlZnROYXYocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICB1bnNldExlZnROYXYocGFyYW1zLm5hbWUpO1xuICAgICAgICB9O1xuICAgIH0sIFtcbiAgICAgICAgY29tcG9uZW50Q29udGV4dCxcbiAgICAgICAgcGFyYW1zXG4gICAgXSk7XG59XG4iXSwibmFtZXMiOlsidXNlQ29udGV4dCIsInVzZUVmZmVjdCIsInNldExlZnROYXYiLCJ1bnNldExlZnROYXYiLCJDb21wb25lbnRDb250ZXh0IiwidXNlTGVmdE5hdiIsInBhcmFtcyIsImNvbXBvbmVudENvbnRleHQiLCJtb2R1bGVOYW1lIiwibmFtZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useLeftNav.js\n");
1098
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useLeftNav: () => (/* binding */ useLeftNav)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-extensions */ \"../../framework/esm-extensions/dist/index.js\");\n/* harmony import */ var _ComponentContext_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ComponentContext.js */ \"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/** @module @category UI */ \n\n\n/**\n * A React hook that registers a left navigation menu for the current component.\n * The navigation is automatically registered when the component mounts and\n * unregistered when it unmounts.\n *\n * **Important:** This hook should only be used in \"page\" components, not in\n * \"extension\" components. Extensions should not control the left navigation.\n *\n * @param params Configuration parameters for the left navigation, excluding the\n * module name which is automatically determined from the component context.\n *\n * @example\n * ```tsx\n * import { useLeftNav } from '@openmrs/esm-framework';\n * function MyPageComponent() {\n * useLeftNav({ name: 'my-nav', slots: ['nav-slot-1', 'nav-slot-2'] });\n * return <div>My Page</div>;\n * }\n * ```\n */ function useLeftNav(params) {\n const componentContext = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_ComponentContext_js__WEBPACK_IMPORTED_MODULE_2__.ComponentContext);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n if (componentContext && componentContext.moduleName) {\n params.componentContext = componentContext;\n }\n (0,_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__.setLeftNav)(params);\n return ()=>{\n (0,_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_1__.unsetLeftNav)(params.name);\n };\n }, [\n componentContext,\n params\n ]);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUxlZnROYXYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLHlCQUF5QixHQUFpRDtBQUNQO0FBQ1Y7QUFDekQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQkMsR0FBVSxTQUFTSyxXQUFXQyxNQUFNO0lBQ2pDLE1BQU1DLG1CQUFtQlAsaURBQVVBLENBQUNJLGtFQUFnQkE7SUFDcERILGdEQUFTQSxDQUFDO1FBQ04sSUFBSU0sb0JBQW9CQSxpQkFBaUJDLFVBQVUsRUFBRTtZQUNqREYsT0FBT0MsZ0JBQWdCLEdBQUdBO1FBQzlCO1FBQ0FMLG1FQUFVQSxDQUFDSTtRQUNYLE9BQU87WUFDSEgscUVBQVlBLENBQUNHLE9BQU9HLElBQUk7UUFDNUI7SUFDSixHQUFHO1FBQ0NGO1FBQ0FEO0tBQ0g7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUxlZnROYXYuanM/Y2EyYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgVUkgKi8gaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBzZXRMZWZ0TmF2LCB1bnNldExlZnROYXYgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiLi9Db21wb25lbnRDb250ZXh0LmpzXCI7XG4vKipcbiAqIEEgUmVhY3QgaG9vayB0aGF0IHJlZ2lzdGVycyBhIGxlZnQgbmF2aWdhdGlvbiBtZW51IGZvciB0aGUgY3VycmVudCBjb21wb25lbnQuXG4gKiBUaGUgbmF2aWdhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgd2hlbiB0aGUgY29tcG9uZW50IG1vdW50cyBhbmRcbiAqIHVucmVnaXN0ZXJlZCB3aGVuIGl0IHVubW91bnRzLlxuICpcbiAqICoqSW1wb3J0YW50OioqIFRoaXMgaG9vayBzaG91bGQgb25seSBiZSB1c2VkIGluIFwicGFnZVwiIGNvbXBvbmVudHMsIG5vdCBpblxuICogXCJleHRlbnNpb25cIiBjb21wb25lbnRzLiBFeHRlbnNpb25zIHNob3VsZCBub3QgY29udHJvbCB0aGUgbGVmdCBuYXZpZ2F0aW9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgbGVmdCBuYXZpZ2F0aW9uLCBleGNsdWRpbmcgdGhlXG4gKiAgIG1vZHVsZSBuYW1lIHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjb21wb25lbnQgY29udGV4dC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VMZWZ0TmF2IH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBmdW5jdGlvbiBNeVBhZ2VDb21wb25lbnQoKSB7XG4gKiAgIHVzZUxlZnROYXYoeyBuYW1lOiAnbXktbmF2Jywgc2xvdHM6IFsnbmF2LXNsb3QtMScsICduYXYtc2xvdC0yJ10gfSk7XG4gKiAgIHJldHVybiA8ZGl2Pk15IFBhZ2U8L2Rpdj47XG4gKiB9XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gdXNlTGVmdE5hdihwYXJhbXMpIHtcbiAgICBjb25zdCBjb21wb25lbnRDb250ZXh0ID0gdXNlQ29udGV4dChDb21wb25lbnRDb250ZXh0KTtcbiAgICB1c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKGNvbXBvbmVudENvbnRleHQgJiYgY29tcG9uZW50Q29udGV4dC5tb2R1bGVOYW1lKSB7XG4gICAgICAgICAgICBwYXJhbXMuY29tcG9uZW50Q29udGV4dCA9IGNvbXBvbmVudENvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0TGVmdE5hdihwYXJhbXMpO1xuICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgIHVuc2V0TGVmdE5hdihwYXJhbXMubmFtZSk7XG4gICAgICAgIH07XG4gICAgfSwgW1xuICAgICAgICBjb21wb25lbnRDb250ZXh0LFxuICAgICAgICBwYXJhbXNcbiAgICBdKTtcbn1cbiJdLCJuYW1lcyI6WyJ1c2VDb250ZXh0IiwidXNlRWZmZWN0Iiwic2V0TGVmdE5hdiIsInVuc2V0TGVmdE5hdiIsIkNvbXBvbmVudENvbnRleHQiLCJ1c2VMZWZ0TmF2IiwicGFyYW1zIiwiY29tcG9uZW50Q29udGV4dCIsIm1vZHVsZU5hbWUiLCJuYW1lIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useLeftNav.js\n");
1099
1099
 
1100
1100
  /***/ }),
1101
1101
 
@@ -1105,7 +1105,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1105
1105
  \***************************************************************/
1106
1106
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1107
1107
 
1108
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useLeftNavStore: () => (/* binding */ useLeftNavStore)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-extensions */ \"../../framework/esm-extensions/dist/index.js\");\n/* harmony import */ var _useStore_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useStore.js */ \"../../framework/esm-react-utils/dist/useStore.js\");\n\n\nfunction useLeftNavStore() {\n return (0,_useStore_js__WEBPACK_IMPORTED_MODULE_1__.useStore)(_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_0__.leftNavStore);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUxlZnROYXZTdG9yZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBdUQ7QUFDZDtBQUNsQyxTQUFTRTtJQUNaLE9BQU9ELHNEQUFRQSxDQUFDRCxpRUFBWUE7QUFDaEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VMZWZ0TmF2U3RvcmUuanM/ZDJlOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsZWZ0TmF2U3RvcmUgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSBcIi4vdXNlU3RvcmUuanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VMZWZ0TmF2U3RvcmUoKSB7XG4gICAgcmV0dXJuIHVzZVN0b3JlKGxlZnROYXZTdG9yZSk7XG59XG4iXSwibmFtZXMiOlsibGVmdE5hdlN0b3JlIiwidXNlU3RvcmUiLCJ1c2VMZWZ0TmF2U3RvcmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useLeftNavStore.js\n");
1108
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useLeftNavStore: () => (/* binding */ useLeftNavStore)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-extensions */ \"../../framework/esm-extensions/dist/index.js\");\n/* harmony import */ var _useStore_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useStore.js */ \"../../framework/esm-react-utils/dist/useStore.js\");\n/** @module @category UI */ \n\n/**\n * A React hook that provides access to the left navigation store state.\n * The component will re-render whenever the left navigation state changes.\n *\n * @returns The current state of the left navigation store.\n *\n * @example\n * ```tsx\n * import { useLeftNavStore } from '@openmrs/esm-framework';\n * function MyComponent() {\n * const leftNavState = useLeftNavStore();\n * return <div>Current nav: {leftNavState.activeNavName}</div>;\n * }\n * ```\n */ function useLeftNavStore() {\n return (0,_useStore_js__WEBPACK_IMPORTED_MODULE_1__.useStore)(_openmrs_esm_extensions__WEBPACK_IMPORTED_MODULE_0__.leftNavStore);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUxlZnROYXZTdG9yZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx5QkFBeUIsR0FBMEQ7QUFDMUM7QUFDekM7Ozs7Ozs7Ozs7Ozs7O0NBY0MsR0FBVSxTQUFTRTtJQUNoQixPQUFPRCxzREFBUUEsQ0FBQ0QsaUVBQVlBO0FBQ2hDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvdXNlTGVmdE5hdlN0b3JlLmpzP2QyZTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IFVJICovIGltcG9ydCB7IGxlZnROYXZTdG9yZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tZXh0ZW5zaW9uc1wiO1xuaW1wb3J0IHsgdXNlU3RvcmUgfSBmcm9tIFwiLi91c2VTdG9yZS5qc1wiO1xuLyoqXG4gKiBBIFJlYWN0IGhvb2sgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxlZnQgbmF2aWdhdGlvbiBzdG9yZSBzdGF0ZS5cbiAqIFRoZSBjb21wb25lbnQgd2lsbCByZS1yZW5kZXIgd2hlbmV2ZXIgdGhlIGxlZnQgbmF2aWdhdGlvbiBzdGF0ZSBjaGFuZ2VzLlxuICpcbiAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsZWZ0IG5hdmlnYXRpb24gc3RvcmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlTGVmdE5hdlN0b3JlIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBmdW5jdGlvbiBNeUNvbXBvbmVudCgpIHtcbiAqICAgY29uc3QgbGVmdE5hdlN0YXRlID0gdXNlTGVmdE5hdlN0b3JlKCk7XG4gKiAgIHJldHVybiA8ZGl2PkN1cnJlbnQgbmF2OiB7bGVmdE5hdlN0YXRlLmFjdGl2ZU5hdk5hbWV9PC9kaXY+O1xuICogfVxuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVzZUxlZnROYXZTdG9yZSgpIHtcbiAgICByZXR1cm4gdXNlU3RvcmUobGVmdE5hdlN0b3JlKTtcbn1cbiJdLCJuYW1lcyI6WyJsZWZ0TmF2U3RvcmUiLCJ1c2VTdG9yZSIsInVzZUxlZnROYXZTdG9yZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useLeftNavStore.js\n");
1109
1109
 
1110
1110
  /***/ }),
1111
1111
 
@@ -1115,7 +1115,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1115
1115
  \************************************************************/
1116
1116
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1117
1117
 
1118
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useLocations: () => (/* binding */ useLocations)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-emr-api */ \"../../framework/esm-emr-api/dist/index.js\");\n/** @module @category API */ \n\nfunction useLocations(tagUuidOrName = null, query = null) {\n const [locations, setLocations] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n const locationSub = (0,_openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_1__.getLocations)(tagUuidOrName, query).subscribe((locations)=>{\n setLocations(locations);\n }, (error)=>{\n console.error(error);\n });\n return ()=>locationSub.unsubscribe();\n }, [\n tagUuidOrName,\n query\n ]);\n return locations;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUxvY2F0aW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwQkFBMEIsR0FBK0M7QUFDckI7QUFDN0MsU0FBU0csYUFBYUMsZ0JBQWdCLElBQUksRUFBRUMsUUFBUSxJQUFJO0lBQzNELE1BQU0sQ0FBQ0MsV0FBV0MsYUFBYSxHQUFHUCwrQ0FBUUEsQ0FBQyxFQUFFO0lBQzdDQyxnREFBU0EsQ0FBQztRQUNOLE1BQU1PLGNBQWNOLGtFQUFZQSxDQUFDRSxlQUFlQyxPQUFPSSxTQUFTLENBQUMsQ0FBQ0g7WUFDOURDLGFBQWFEO1FBQ2pCLEdBQUcsQ0FBQ0k7WUFDQUMsUUFBUUQsS0FBSyxDQUFDQTtRQUNsQjtRQUNBLE9BQU8sSUFBSUYsWUFBWUksV0FBVztJQUN0QyxHQUFHO1FBQ0NSO1FBQ0FDO0tBQ0g7SUFDRCxPQUFPQztBQUNYIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvdXNlTG9jYXRpb25zLmpzP2JiZGYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBnZXRMb2NhdGlvbnMgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWVtci1hcGlcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VMb2NhdGlvbnModGFnVXVpZE9yTmFtZSA9IG51bGwsIHF1ZXJ5ID0gbnVsbCkge1xuICAgIGNvbnN0IFtsb2NhdGlvbnMsIHNldExvY2F0aW9uc10gPSB1c2VTdGF0ZShbXSk7XG4gICAgdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uU3ViID0gZ2V0TG9jYXRpb25zKHRhZ1V1aWRPck5hbWUsIHF1ZXJ5KS5zdWJzY3JpYmUoKGxvY2F0aW9ucyk9PntcbiAgICAgICAgICAgIHNldExvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICB9LCAoZXJyb3IpPT57XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKT0+bG9jYXRpb25TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9LCBbXG4gICAgICAgIHRhZ1V1aWRPck5hbWUsXG4gICAgICAgIHF1ZXJ5XG4gICAgXSk7XG4gICAgcmV0dXJuIGxvY2F0aW9ucztcbn1cbiJdLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsImdldExvY2F0aW9ucyIsInVzZUxvY2F0aW9ucyIsInRhZ1V1aWRPck5hbWUiLCJxdWVyeSIsImxvY2F0aW9ucyIsInNldExvY2F0aW9ucyIsImxvY2F0aW9uU3ViIiwic3Vic2NyaWJlIiwiZXJyb3IiLCJjb25zb2xlIiwidW5zdWJzY3JpYmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useLocations.js\n");
1118
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useLocations: () => (/* binding */ useLocations)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var _openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @openmrs/esm-emr-api */ \"../../framework/esm-emr-api/dist/index.js\");\n/** @module @category API */ \n\n/**\n * A React hook that fetches and returns locations from the OpenMRS server.\n * Locations can be filtered by a tag UUID/name and/or a search query string.\n *\n * @param tagUuidOrName Optional tag UUID or name to filter locations by.\n * Pass `null` to not filter by tag.\n * @param query Optional search query string to filter locations. Pass `null`\n * to not filter by query.\n * @returns An array of Location objects. Returns an empty array while loading\n * or if an error occurs.\n *\n * @example\n * ```tsx\n * import { useLocations } from '@openmrs/esm-framework';\n * function LocationList() {\n * const locations = useLocations('Login Location');\n * return (\n * <ul>\n * {locations.map((loc) => <li key={loc.uuid}>{loc.display}</li>)}\n * </ul>\n * );\n * }\n * ```\n */ function useLocations(tagUuidOrName = null, query = null) {\n const [locations, setLocations] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n const locationSub = (0,_openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_1__.getLocations)(tagUuidOrName, query).subscribe((locations)=>{\n setLocations(locations);\n }, (error)=>{\n console.error(error);\n });\n return ()=>locationSub.unsubscribe();\n }, [\n tagUuidOrName,\n query\n ]);\n return locations;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZUxvY2F0aW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwQkFBMEIsR0FBK0M7QUFDckI7QUFDcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUJDLEdBQVUsU0FBU0csYUFBYUMsZ0JBQWdCLElBQUksRUFBRUMsUUFBUSxJQUFJO0lBQy9ELE1BQU0sQ0FBQ0MsV0FBV0MsYUFBYSxHQUFHUCwrQ0FBUUEsQ0FBQyxFQUFFO0lBQzdDQyxnREFBU0EsQ0FBQztRQUNOLE1BQU1PLGNBQWNOLGtFQUFZQSxDQUFDRSxlQUFlQyxPQUFPSSxTQUFTLENBQUMsQ0FBQ0g7WUFDOURDLGFBQWFEO1FBQ2pCLEdBQUcsQ0FBQ0k7WUFDQUMsUUFBUUQsS0FBSyxDQUFDQTtRQUNsQjtRQUNBLE9BQU8sSUFBSUYsWUFBWUksV0FBVztJQUN0QyxHQUFHO1FBQ0NSO1FBQ0FDO0tBQ0g7SUFDRCxPQUFPQztBQUNYIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvdXNlTG9jYXRpb25zLmpzP2JiZGYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBnZXRMb2NhdGlvbnMgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWVtci1hcGlcIjtcbi8qKlxuICogQSBSZWFjdCBob29rIHRoYXQgZmV0Y2hlcyBhbmQgcmV0dXJucyBsb2NhdGlvbnMgZnJvbSB0aGUgT3Blbk1SUyBzZXJ2ZXIuXG4gKiBMb2NhdGlvbnMgY2FuIGJlIGZpbHRlcmVkIGJ5IGEgdGFnIFVVSUQvbmFtZSBhbmQvb3IgYSBzZWFyY2ggcXVlcnkgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB0YWdVdWlkT3JOYW1lIE9wdGlvbmFsIHRhZyBVVUlEIG9yIG5hbWUgdG8gZmlsdGVyIGxvY2F0aW9ucyBieS5cbiAqICAgUGFzcyBgbnVsbGAgdG8gbm90IGZpbHRlciBieSB0YWcuXG4gKiBAcGFyYW0gcXVlcnkgT3B0aW9uYWwgc2VhcmNoIHF1ZXJ5IHN0cmluZyB0byBmaWx0ZXIgbG9jYXRpb25zLiBQYXNzIGBudWxsYFxuICogICB0byBub3QgZmlsdGVyIGJ5IHF1ZXJ5LlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgTG9jYXRpb24gb2JqZWN0cy4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSB3aGlsZSBsb2FkaW5nXG4gKiAgIG9yIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VMb2NhdGlvbnMgfSBmcm9tICdAb3Blbm1ycy9lc20tZnJhbWV3b3JrJztcbiAqIGZ1bmN0aW9uIExvY2F0aW9uTGlzdCgpIHtcbiAqICAgY29uc3QgbG9jYXRpb25zID0gdXNlTG9jYXRpb25zKCdMb2dpbiBMb2NhdGlvbicpO1xuICogICByZXR1cm4gKFxuICogICAgIDx1bD5cbiAqICAgICAgIHtsb2NhdGlvbnMubWFwKChsb2MpID0+IDxsaSBrZXk9e2xvYy51dWlkfT57bG9jLmRpc3BsYXl9PC9saT4pfVxuICogICAgIDwvdWw+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqLyBleHBvcnQgZnVuY3Rpb24gdXNlTG9jYXRpb25zKHRhZ1V1aWRPck5hbWUgPSBudWxsLCBxdWVyeSA9IG51bGwpIHtcbiAgICBjb25zdCBbbG9jYXRpb25zLCBzZXRMb2NhdGlvbnNdID0gdXNlU3RhdGUoW10pO1xuICAgIHVzZUVmZmVjdCgoKT0+e1xuICAgICAgICBjb25zdCBsb2NhdGlvblN1YiA9IGdldExvY2F0aW9ucyh0YWdVdWlkT3JOYW1lLCBxdWVyeSkuc3Vic2NyaWJlKChsb2NhdGlvbnMpPT57XG4gICAgICAgICAgICBzZXRMb2NhdGlvbnMobG9jYXRpb25zKTtcbiAgICAgICAgfSwgKGVycm9yKT0+e1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCk9PmxvY2F0aW9uU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfSwgW1xuICAgICAgICB0YWdVdWlkT3JOYW1lLFxuICAgICAgICBxdWVyeVxuICAgIF0pO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG4iXSwibmFtZXMiOlsidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJnZXRMb2NhdGlvbnMiLCJ1c2VMb2NhdGlvbnMiLCJ0YWdVdWlkT3JOYW1lIiwicXVlcnkiLCJsb2NhdGlvbnMiLCJzZXRMb2NhdGlvbnMiLCJsb2NhdGlvblN1YiIsInN1YnNjcmliZSIsImVycm9yIiwiY29uc29sZSIsInVuc3Vic2NyaWJlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useLocations.js\n");
1119
1119
 
1120
1120
  /***/ }),
1121
1121
 
@@ -1125,7 +1125,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1125
1125
  \*****************************************************************/
1126
1126
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1127
1127
 
1128
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useOnClickOutside: () => (/* binding */ useOnClickOutside)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/** @module @category UI */ \nfunction useOnClickOutside(handler, active = true) {\n const ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n const listener = (event)=>{\n if (!active || !ref.current || !event.target || !(event.target instanceof Node)) {\n return;\n }\n if (ref.current.contains(event.target)) {\n return;\n }\n handler(event);\n };\n window.addEventListener(`mousedown`, listener);\n window.addEventListener(`touchstart`, listener);\n return ()=>{\n window.removeEventListener(`mousedown`, listener);\n window.removeEventListener(`touchstart`, listener);\n };\n }, [\n handler,\n active\n ]);\n return ref;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZU9uQ2xpY2tPdXRzaWRlLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCLEdBQTZDO0FBQy9ELFNBQVNFLGtCQUFrQkMsT0FBTyxFQUFFQyxTQUFTLElBQUk7SUFDcEQsTUFBTUMsTUFBTUwsNkNBQU1BLENBQUM7SUFDbkJDLGdEQUFTQSxDQUFDO1FBQ04sTUFBTUssV0FBVyxDQUFDQztZQUNkLElBQUksQ0FBQ0gsVUFBVSxDQUFDQyxJQUFJRyxPQUFPLElBQUksQ0FBQ0QsTUFBTUUsTUFBTSxJQUFJLENBQUVGLENBQUFBLE1BQU1FLE1BQU0sWUFBWUMsSUFBRyxHQUFJO2dCQUM3RTtZQUNKO1lBQ0EsSUFBSUwsSUFBSUcsT0FBTyxDQUFDRyxRQUFRLENBQUNKLE1BQU1FLE1BQU0sR0FBRztnQkFDcEM7WUFDSjtZQUNBTixRQUFRSTtRQUNaO1FBQ0FLLE9BQU9DLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUVQO1FBQ3JDTSxPQUFPQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFUDtRQUN0QyxPQUFPO1lBQ0hNLE9BQU9FLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUVSO1lBQ3hDTSxPQUFPRSxtQkFBbUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFUjtRQUM3QztJQUNKLEdBQUc7UUFDQ0g7UUFDQUM7S0FDSDtJQUNELE9BQU9DO0FBQ1giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VPbkNsaWNrT3V0c2lkZS5qcz83Mzc0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBVSSAqLyBpbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU9uQ2xpY2tPdXRzaWRlKGhhbmRsZXIsIGFjdGl2ZSA9IHRydWUpIHtcbiAgICBjb25zdCByZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KT0+e1xuICAgICAgICAgICAgaWYgKCFhY3RpdmUgfHwgIXJlZi5jdXJyZW50IHx8ICFldmVudC50YXJnZXQgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWYuY3VycmVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGBtb3VzZWRvd25gLCBsaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGB0b3VjaHN0YXJ0YCwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGBtb3VzZWRvd25gLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdG91Y2hzdGFydGAsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9LCBbXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIGFjdGl2ZVxuICAgIF0pO1xuICAgIHJldHVybiByZWY7XG59XG4iXSwibmFtZXMiOlsidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlT25DbGlja091dHNpZGUiLCJoYW5kbGVyIiwiYWN0aXZlIiwicmVmIiwibGlzdGVuZXIiLCJldmVudCIsImN1cnJlbnQiLCJ0YXJnZXQiLCJOb2RlIiwiY29udGFpbnMiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useOnClickOutside.js\n");
1128
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useOnClickOutside: () => (/* binding */ useOnClickOutside)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/** @module @category UI */ \n/**\n * A React hook that detects clicks outside of a referenced element. Useful for\n * implementing dropdown menus, modals, or any component that should close when\n * clicking outside of it.\n *\n * @typeParam T The type of HTML element the ref will be attached to.\n * @param handler A callback function invoked when a click occurs outside the\n * referenced element.\n * @param active Whether the outside click detection is active. Defaults to `true`.\n * Set to `false` to temporarily disable the detection.\n * @returns A React ref object to attach to the element you want to detect\n * outside clicks for.\n *\n * @example\n * ```tsx\n * import { useOnClickOutside } from '@openmrs/esm-framework';\n * function Dropdown() {\n * const [isOpen, setIsOpen] = useState(false);\n * const ref = useOnClickOutside<HTMLDivElement>(() => setIsOpen(false), isOpen);\n * return (\n * <div ref={ref}>\n * {isOpen && <ul>...</ul>}\n * </div>\n * );\n * }\n * ```\n */ function useOnClickOutside(handler, active = true) {\n const ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n const listener = (event)=>{\n if (!active || !ref.current || !event.target || !(event.target instanceof Node)) {\n return;\n }\n if (ref.current.contains(event.target)) {\n return;\n }\n handler(event);\n };\n window.addEventListener(`mousedown`, listener);\n window.addEventListener(`touchstart`, listener);\n return ()=>{\n window.removeEventListener(`mousedown`, listener);\n window.removeEventListener(`touchstart`, listener);\n };\n }, [\n handler,\n active\n ]);\n return ref;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZU9uQ2xpY2tPdXRzaWRlLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCLEdBQTZDO0FBQ3RFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTBCQyxHQUFVLFNBQVNFLGtCQUFrQkMsT0FBTyxFQUFFQyxTQUFTLElBQUk7SUFDeEQsTUFBTUMsTUFBTUwsNkNBQU1BLENBQUM7SUFDbkJDLGdEQUFTQSxDQUFDO1FBQ04sTUFBTUssV0FBVyxDQUFDQztZQUNkLElBQUksQ0FBQ0gsVUFBVSxDQUFDQyxJQUFJRyxPQUFPLElBQUksQ0FBQ0QsTUFBTUUsTUFBTSxJQUFJLENBQUVGLENBQUFBLE1BQU1FLE1BQU0sWUFBWUMsSUFBRyxHQUFJO2dCQUM3RTtZQUNKO1lBQ0EsSUFBSUwsSUFBSUcsT0FBTyxDQUFDRyxRQUFRLENBQUNKLE1BQU1FLE1BQU0sR0FBRztnQkFDcEM7WUFDSjtZQUNBTixRQUFRSTtRQUNaO1FBQ0FLLE9BQU9DLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUVQO1FBQ3JDTSxPQUFPQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFUDtRQUN0QyxPQUFPO1lBQ0hNLE9BQU9FLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUVSO1lBQ3hDTSxPQUFPRSxtQkFBbUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFUjtRQUM3QztJQUNKLEdBQUc7UUFDQ0g7UUFDQUM7S0FDSDtJQUNELE9BQU9DO0FBQ1giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VPbkNsaWNrT3V0c2lkZS5qcz83Mzc0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBVSSAqLyBpbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuLyoqXG4gKiBBIFJlYWN0IGhvb2sgdGhhdCBkZXRlY3RzIGNsaWNrcyBvdXRzaWRlIG9mIGEgcmVmZXJlbmNlZCBlbGVtZW50LiBVc2VmdWwgZm9yXG4gKiBpbXBsZW1lbnRpbmcgZHJvcGRvd24gbWVudXMsIG1vZGFscywgb3IgYW55IGNvbXBvbmVudCB0aGF0IHNob3VsZCBjbG9zZSB3aGVuXG4gKiBjbGlja2luZyBvdXRzaWRlIG9mIGl0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCBUaGUgdHlwZSBvZiBIVE1MIGVsZW1lbnQgdGhlIHJlZiB3aWxsIGJlIGF0dGFjaGVkIHRvLlxuICogQHBhcmFtIGhhbmRsZXIgQSBjYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gYSBjbGljayBvY2N1cnMgb3V0c2lkZSB0aGVcbiAqICAgcmVmZXJlbmNlZCBlbGVtZW50LlxuICogQHBhcmFtIGFjdGl2ZSBXaGV0aGVyIHRoZSBvdXRzaWRlIGNsaWNrIGRldGVjdGlvbiBpcyBhY3RpdmUuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqICAgU2V0IHRvIGBmYWxzZWAgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgZGV0ZWN0aW9uLlxuICogQHJldHVybnMgQSBSZWFjdCByZWYgb2JqZWN0IHRvIGF0dGFjaCB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byBkZXRlY3RcbiAqICAgb3V0c2lkZSBjbGlja3MgZm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZU9uQ2xpY2tPdXRzaWRlIH0gZnJvbSAnQG9wZW5tcnMvZXNtLWZyYW1ld29yayc7XG4gKiBmdW5jdGlvbiBEcm9wZG93bigpIHtcbiAqICAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAqICAgY29uc3QgcmVmID0gdXNlT25DbGlja091dHNpZGU8SFRNTERpdkVsZW1lbnQ+KCgpID0+IHNldElzT3BlbihmYWxzZSksIGlzT3Blbik7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGRpdiByZWY9e3JlZn0+XG4gKiAgICAgICB7aXNPcGVuICYmIDx1bD4uLi48L3VsPn1cbiAqICAgICA8L2Rpdj5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB1c2VPbkNsaWNrT3V0c2lkZShoYW5kbGVyLCBhY3RpdmUgPSB0cnVlKSB7XG4gICAgY29uc3QgcmVmID0gdXNlUmVmKG51bGwpO1xuICAgIHVzZUVmZmVjdCgoKT0+e1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IChldmVudCk9PntcbiAgICAgICAgICAgIGlmICghYWN0aXZlIHx8ICFyZWYuY3VycmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8ICEoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVmLmN1cnJlbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgbW91c2Vkb3duYCwgbGlzdGVuZXIpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgdG91Y2hzdGFydGAsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgbW91c2Vkb3duYCwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHRvdWNoc3RhcnRgLCBsaXN0ZW5lcik7XG4gICAgICAgIH07XG4gICAgfSwgW1xuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBhY3RpdmVcbiAgICBdKTtcbiAgICByZXR1cm4gcmVmO1xufVxuIl0sIm5hbWVzIjpbInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZU9uQ2xpY2tPdXRzaWRlIiwiaGFuZGxlciIsImFjdGl2ZSIsInJlZiIsImxpc3RlbmVyIiwiZXZlbnQiLCJjdXJyZW50IiwidGFyZ2V0IiwiTm9kZSIsImNvbnRhaW5zIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useOnClickOutside.js\n");
1129
1129
 
1130
1130
  /***/ }),
1131
1131
 
@@ -1205,7 +1205,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1205
1205
  \**********************************************************/
1206
1206
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1207
1207
 
1208
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ usePatient: () => (/* binding */ usePatient)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var swr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! swr */ \"../../../node_modules/swr/dist/core/index.mjs\");\n/* harmony import */ var _openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-emr-api */ \"../../framework/esm-emr-api/dist/index.js\");\n/** @module @category API */ \n\n\nfunction getPatientUuidFromUrl() {\n const match = /\\/patient\\/([a-zA-Z0-9\\-]+)\\/?/.exec(location.pathname);\n return match && match[1];\n}\n/**\n * This React hook returns a patient object. If the `patientUuid` is provided\n * as a parameter, then the patient for that UUID is returned. If the parameter\n * is not provided, the patient UUID is obtained from the current route, and\n * a route listener is set up to update the patient whenever the route changes.\n */ function usePatient(patientUuid) {\n const [currentPatientUuid, setCurrentPatientUuid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(patientUuid ?? getPatientUuidFromUrl());\n const { data: patient, error, isValidating } = (0,swr__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(currentPatientUuid ? [\n 'patient',\n currentPatientUuid\n ] : null, ()=>(0,_openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_2__.fetchCurrentPatient)(currentPatientUuid, {}));\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n const handleRouteUpdate = ()=>{\n const newPatientUuid = getPatientUuidFromUrl();\n if (newPatientUuid !== currentPatientUuid) {\n setCurrentPatientUuid(newPatientUuid);\n }\n };\n window.addEventListener('single-spa:routing-event', handleRouteUpdate);\n return ()=>window.removeEventListener('single-spa:routing-event', handleRouteUpdate);\n }, [\n currentPatientUuid\n ]);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>({\n isLoading: isValidating && !error && !patient,\n patient,\n patientUuid: currentPatientUuid,\n error\n }), [\n isValidating,\n error,\n patient,\n currentPatientUuid\n ]);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZVBhdGllbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLDBCQUEwQixHQUF3RDtBQUN6RDtBQUNrQztBQUMzRCxTQUFTSztJQUNMLE1BQU1DLFFBQVEsaUNBQWlDQyxJQUFJLENBQUNDLFNBQVNDLFFBQVE7SUFDckUsT0FBT0gsU0FBU0EsS0FBSyxDQUFDLEVBQUU7QUFDNUI7QUFDQTs7Ozs7Q0FLQyxHQUFVLFNBQVNJLFdBQVdDLFdBQVc7SUFDdEMsTUFBTSxDQUFDQyxvQkFBb0JDLHNCQUFzQixHQUFHWCwrQ0FBUUEsQ0FBQ1MsZUFBZU47SUFDNUUsTUFBTSxFQUFFUyxNQUFNQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsWUFBWSxFQUFFLEdBQUdkLCtDQUFNQSxDQUFDUyxxQkFBcUI7UUFDdkU7UUFDQUE7S0FDSCxHQUFHLE1BQU0sSUFBSVIseUVBQW1CQSxDQUFDUSxvQkFBb0IsQ0FBQztJQUN2RFosZ0RBQVNBLENBQUM7UUFDTixNQUFNa0Isb0JBQW9CO1lBQ3RCLE1BQU1DLGlCQUFpQmQ7WUFDdkIsSUFBSWMsbUJBQW1CUCxvQkFBb0I7Z0JBQ3ZDQyxzQkFBc0JNO1lBQzFCO1FBQ0o7UUFDQUMsT0FBT0MsZ0JBQWdCLENBQUMsNEJBQTRCSDtRQUNwRCxPQUFPLElBQUlFLE9BQU9FLG1CQUFtQixDQUFDLDRCQUE0Qko7SUFDdEUsR0FBRztRQUNDTjtLQUNIO0lBQ0QsT0FBT1gsOENBQU9BLENBQUMsSUFBSztZQUNac0IsV0FBV04sZ0JBQWdCLENBQUNELFNBQVMsQ0FBQ0Q7WUFDdENBO1lBQ0FKLGFBQWFDO1lBQ2JJO1FBQ0osSUFBSTtRQUNKQztRQUNBRDtRQUNBRDtRQUNBSDtLQUNIO0FBQ0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VQYXRpZW50LmpzPzY0ZTQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdXNlU1dSIGZyb20gXCJzd3JcIjtcbmltcG9ydCB7IGZldGNoQ3VycmVudFBhdGllbnQgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWVtci1hcGlcIjtcbmZ1bmN0aW9uIGdldFBhdGllbnRVdWlkRnJvbVVybCgpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9cXC9wYXRpZW50XFwvKFthLXpBLVowLTlcXC1dKylcXC8/Ly5leGVjKGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59XG4vKipcbiAqIFRoaXMgUmVhY3QgaG9vayByZXR1cm5zIGEgcGF0aWVudCBvYmplY3QuIElmIHRoZSBgcGF0aWVudFV1aWRgIGlzIHByb3ZpZGVkXG4gKiBhcyBhIHBhcmFtZXRlciwgdGhlbiB0aGUgcGF0aWVudCBmb3IgdGhhdCBVVUlEIGlzIHJldHVybmVkLiBJZiB0aGUgcGFyYW1ldGVyXG4gKiBpcyBub3QgcHJvdmlkZWQsIHRoZSBwYXRpZW50IFVVSUQgaXMgb2J0YWluZWQgZnJvbSB0aGUgY3VycmVudCByb3V0ZSwgYW5kXG4gKiBhIHJvdXRlIGxpc3RlbmVyIGlzIHNldCB1cCB0byB1cGRhdGUgdGhlIHBhdGllbnQgd2hlbmV2ZXIgdGhlIHJvdXRlIGNoYW5nZXMuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVzZVBhdGllbnQocGF0aWVudFV1aWQpIHtcbiAgICBjb25zdCBbY3VycmVudFBhdGllbnRVdWlkLCBzZXRDdXJyZW50UGF0aWVudFV1aWRdID0gdXNlU3RhdGUocGF0aWVudFV1aWQgPz8gZ2V0UGF0aWVudFV1aWRGcm9tVXJsKCkpO1xuICAgIGNvbnN0IHsgZGF0YTogcGF0aWVudCwgZXJyb3IsIGlzVmFsaWRhdGluZyB9ID0gdXNlU1dSKGN1cnJlbnRQYXRpZW50VXVpZCA/IFtcbiAgICAgICAgJ3BhdGllbnQnLFxuICAgICAgICBjdXJyZW50UGF0aWVudFV1aWRcbiAgICBdIDogbnVsbCwgKCk9PmZldGNoQ3VycmVudFBhdGllbnQoY3VycmVudFBhdGllbnRVdWlkLCB7fSkpO1xuICAgIHVzZUVmZmVjdCgoKT0+e1xuICAgICAgICBjb25zdCBoYW5kbGVSb3V0ZVVwZGF0ZSA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRpZW50VXVpZCA9IGdldFBhdGllbnRVdWlkRnJvbVVybCgpO1xuICAgICAgICAgICAgaWYgKG5ld1BhdGllbnRVdWlkICE9PSBjdXJyZW50UGF0aWVudFV1aWQpIHtcbiAgICAgICAgICAgICAgICBzZXRDdXJyZW50UGF0aWVudFV1aWQobmV3UGF0aWVudFV1aWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2luZ2xlLXNwYTpyb3V0aW5nLWV2ZW50JywgaGFuZGxlUm91dGVVcGRhdGUpO1xuICAgICAgICByZXR1cm4gKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzaW5nbGUtc3BhOnJvdXRpbmctZXZlbnQnLCBoYW5kbGVSb3V0ZVVwZGF0ZSk7XG4gICAgfSwgW1xuICAgICAgICBjdXJyZW50UGF0aWVudFV1aWRcbiAgICBdKTtcbiAgICByZXR1cm4gdXNlTWVtbygoKT0+KHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogaXNWYWxpZGF0aW5nICYmICFlcnJvciAmJiAhcGF0aWVudCxcbiAgICAgICAgICAgIHBhdGllbnQsXG4gICAgICAgICAgICBwYXRpZW50VXVpZDogY3VycmVudFBhdGllbnRVdWlkLFxuICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgfSksIFtcbiAgICAgICAgaXNWYWxpZGF0aW5nLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgcGF0aWVudCxcbiAgICAgICAgY3VycmVudFBhdGllbnRVdWlkXG4gICAgXSk7XG59XG4iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVN0YXRlIiwidXNlU1dSIiwiZmV0Y2hDdXJyZW50UGF0aWVudCIsImdldFBhdGllbnRVdWlkRnJvbVVybCIsIm1hdGNoIiwiZXhlYyIsImxvY2F0aW9uIiwicGF0aG5hbWUiLCJ1c2VQYXRpZW50IiwicGF0aWVudFV1aWQiLCJjdXJyZW50UGF0aWVudFV1aWQiLCJzZXRDdXJyZW50UGF0aWVudFV1aWQiLCJkYXRhIiwicGF0aWVudCIsImVycm9yIiwiaXNWYWxpZGF0aW5nIiwiaGFuZGxlUm91dGVVcGRhdGUiLCJuZXdQYXRpZW50VXVpZCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiaXNMb2FkaW5nIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/usePatient.js\n");
1208
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ usePatient: () => (/* binding */ usePatient)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var swr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! swr */ \"../../../node_modules/swr/dist/core/index.mjs\");\n/* harmony import */ var _openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-emr-api */ \"../../framework/esm-emr-api/dist/index.js\");\n/** @module @category API */ \n\n\nfunction getPatientUuidFromUrl() {\n const match = /\\/patient\\/([a-zA-Z0-9\\-]+)\\/?/.exec(location.pathname);\n return match && match[1];\n}\n/**\n * This React hook returns a patient object. If the `patientUuid` is provided\n * as a parameter, then the patient for that UUID is returned. If the parameter\n * is not provided, the patient UUID is obtained from the current route, and\n * a route listener is set up to update the patient whenever the route changes.\n *\n * @param patientUuid Optional UUID of the patient to fetch. If not provided,\n * the UUID is extracted from the current URL path.\n * @returns An object containing the patient data, loading state, current patient UUID, and any error.\n *\n */ function usePatient(patientUuid) {\n const [currentPatientUuid, setCurrentPatientUuid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(patientUuid ?? getPatientUuidFromUrl());\n const { data: patient, error, isValidating } = (0,swr__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(currentPatientUuid ? [\n 'patient',\n currentPatientUuid\n ] : null, ()=>(0,_openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_2__.fetchCurrentPatient)(currentPatientUuid, {}));\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{\n const handleRouteUpdate = ()=>{\n const newPatientUuid = getPatientUuidFromUrl();\n if (newPatientUuid !== currentPatientUuid) {\n setCurrentPatientUuid(newPatientUuid);\n }\n };\n window.addEventListener('single-spa:routing-event', handleRouteUpdate);\n return ()=>window.removeEventListener('single-spa:routing-event', handleRouteUpdate);\n }, [\n currentPatientUuid\n ]);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>({\n isLoading: isValidating && !error && !patient,\n patient,\n patientUuid: currentPatientUuid,\n error\n }), [\n isValidating,\n error,\n patient,\n currentPatientUuid\n ]);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZVBhdGllbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLDBCQUEwQixHQUF3RDtBQUN6RDtBQUNrQztBQUMzRCxTQUFTSztJQUNMLE1BQU1DLFFBQVEsaUNBQWlDQyxJQUFJLENBQUNDLFNBQVNDLFFBQVE7SUFDckUsT0FBT0gsU0FBU0EsS0FBSyxDQUFDLEVBQUU7QUFDNUI7QUFDQTs7Ozs7Ozs7OztDQVVDLEdBQVUsU0FBU0ksV0FBV0MsV0FBVztJQUN0QyxNQUFNLENBQUNDLG9CQUFvQkMsc0JBQXNCLEdBQUdYLCtDQUFRQSxDQUFDUyxlQUFlTjtJQUM1RSxNQUFNLEVBQUVTLE1BQU1DLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxZQUFZLEVBQUUsR0FBR2QsK0NBQU1BLENBQUNTLHFCQUFxQjtRQUN2RTtRQUNBQTtLQUNILEdBQUcsTUFBTSxJQUFJUix5RUFBbUJBLENBQUNRLG9CQUFvQixDQUFDO0lBQ3ZEWixnREFBU0EsQ0FBQztRQUNOLE1BQU1rQixvQkFBb0I7WUFDdEIsTUFBTUMsaUJBQWlCZDtZQUN2QixJQUFJYyxtQkFBbUJQLG9CQUFvQjtnQkFDdkNDLHNCQUFzQk07WUFDMUI7UUFDSjtRQUNBQyxPQUFPQyxnQkFBZ0IsQ0FBQyw0QkFBNEJIO1FBQ3BELE9BQU8sSUFBSUUsT0FBT0UsbUJBQW1CLENBQUMsNEJBQTRCSjtJQUN0RSxHQUFHO1FBQ0NOO0tBQ0g7SUFDRCxPQUFPWCw4Q0FBT0EsQ0FBQyxJQUFLO1lBQ1pzQixXQUFXTixnQkFBZ0IsQ0FBQ0QsU0FBUyxDQUFDRDtZQUN0Q0E7WUFDQUosYUFBYUM7WUFDYkk7UUFDSixJQUFJO1FBQ0pDO1FBQ0FEO1FBQ0FEO1FBQ0FIO0tBQ0g7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZVBhdGllbnQuanM/NjRlNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB1c2VTV1IgZnJvbSBcInN3clwiO1xuaW1wb3J0IHsgZmV0Y2hDdXJyZW50UGF0aWVudCB9IGZyb20gXCJAb3Blbm1ycy9lc20tZW1yLWFwaVwiO1xuZnVuY3Rpb24gZ2V0UGF0aWVudFV1aWRGcm9tVXJsKCkge1xuICAgIGNvbnN0IG1hdGNoID0gL1xcL3BhdGllbnRcXC8oW2EtekEtWjAtOVxcLV0rKVxcLz8vLmV4ZWMobG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn1cbi8qKlxuICogVGhpcyBSZWFjdCBob29rIHJldHVybnMgYSBwYXRpZW50IG9iamVjdC4gSWYgdGhlIGBwYXRpZW50VXVpZGAgaXMgcHJvdmlkZWRcbiAqIGFzIGEgcGFyYW1ldGVyLCB0aGVuIHRoZSBwYXRpZW50IGZvciB0aGF0IFVVSUQgaXMgcmV0dXJuZWQuIElmIHRoZSBwYXJhbWV0ZXJcbiAqIGlzIG5vdCBwcm92aWRlZCwgdGhlIHBhdGllbnQgVVVJRCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjdXJyZW50IHJvdXRlLCBhbmRcbiAqIGEgcm91dGUgbGlzdGVuZXIgaXMgc2V0IHVwIHRvIHVwZGF0ZSB0aGUgcGF0aWVudCB3aGVuZXZlciB0aGUgcm91dGUgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gcGF0aWVudFV1aWQgT3B0aW9uYWwgVVVJRCBvZiB0aGUgcGF0aWVudCB0byBmZXRjaC4gSWYgbm90IHByb3ZpZGVkLFxuICogICB0aGUgVVVJRCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgY3VycmVudCBVUkwgcGF0aC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXRpZW50IGRhdGEsIGxvYWRpbmcgc3RhdGUsIGN1cnJlbnQgcGF0aWVudCBVVUlELCBhbmQgYW55IGVycm9yLlxuICpcbiAqLyBleHBvcnQgZnVuY3Rpb24gdXNlUGF0aWVudChwYXRpZW50VXVpZCkge1xuICAgIGNvbnN0IFtjdXJyZW50UGF0aWVudFV1aWQsIHNldEN1cnJlbnRQYXRpZW50VXVpZF0gPSB1c2VTdGF0ZShwYXRpZW50VXVpZCA/PyBnZXRQYXRpZW50VXVpZEZyb21VcmwoKSk7XG4gICAgY29uc3QgeyBkYXRhOiBwYXRpZW50LCBlcnJvciwgaXNWYWxpZGF0aW5nIH0gPSB1c2VTV1IoY3VycmVudFBhdGllbnRVdWlkID8gW1xuICAgICAgICAncGF0aWVudCcsXG4gICAgICAgIGN1cnJlbnRQYXRpZW50VXVpZFxuICAgIF0gOiBudWxsLCAoKT0+ZmV0Y2hDdXJyZW50UGF0aWVudChjdXJyZW50UGF0aWVudFV1aWQsIHt9KSk7XG4gICAgdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGNvbnN0IGhhbmRsZVJvdXRlVXBkYXRlID0gKCk9PntcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGllbnRVdWlkID0gZ2V0UGF0aWVudFV1aWRGcm9tVXJsKCk7XG4gICAgICAgICAgICBpZiAobmV3UGF0aWVudFV1aWQgIT09IGN1cnJlbnRQYXRpZW50VXVpZCkge1xuICAgICAgICAgICAgICAgIHNldEN1cnJlbnRQYXRpZW50VXVpZChuZXdQYXRpZW50VXVpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzaW5nbGUtc3BhOnJvdXRpbmctZXZlbnQnLCBoYW5kbGVSb3V0ZVVwZGF0ZSk7XG4gICAgICAgIHJldHVybiAoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NpbmdsZS1zcGE6cm91dGluZy1ldmVudCcsIGhhbmRsZVJvdXRlVXBkYXRlKTtcbiAgICB9LCBbXG4gICAgICAgIGN1cnJlbnRQYXRpZW50VXVpZFxuICAgIF0pO1xuICAgIHJldHVybiB1c2VNZW1vKCgpPT4oe1xuICAgICAgICAgICAgaXNMb2FkaW5nOiBpc1ZhbGlkYXRpbmcgJiYgIWVycm9yICYmICFwYXRpZW50LFxuICAgICAgICAgICAgcGF0aWVudCxcbiAgICAgICAgICAgIHBhdGllbnRVdWlkOiBjdXJyZW50UGF0aWVudFV1aWQsXG4gICAgICAgICAgICBlcnJvclxuICAgICAgICB9KSwgW1xuICAgICAgICBpc1ZhbGlkYXRpbmcsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBwYXRpZW50LFxuICAgICAgICBjdXJyZW50UGF0aWVudFV1aWRcbiAgICBdKTtcbn1cbiJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlU3RhdGUiLCJ1c2VTV1IiLCJmZXRjaEN1cnJlbnRQYXRpZW50IiwiZ2V0UGF0aWVudFV1aWRGcm9tVXJsIiwibWF0Y2giLCJleGVjIiwibG9jYXRpb24iLCJwYXRobmFtZSIsInVzZVBhdGllbnQiLCJwYXRpZW50VXVpZCIsImN1cnJlbnRQYXRpZW50VXVpZCIsInNldEN1cnJlbnRQYXRpZW50VXVpZCIsImRhdGEiLCJwYXRpZW50IiwiZXJyb3IiLCJpc1ZhbGlkYXRpbmciLCJoYW5kbGVSb3V0ZVVwZGF0ZSIsIm5ld1BhdGllbnRVdWlkIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJpc0xvYWRpbmciXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/usePatient.js\n");
1209
1209
 
1210
1210
  /***/ }),
1211
1211
 
@@ -1215,7 +1215,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1215
1215
  \****************************************************************************/
1216
1216
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1217
1217
 
1218
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ usePrimaryIdentifierCode: () => (/* binding */ usePrimaryIdentifierCode)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var swr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! swr */ \"../../../node_modules/swr/dist/core/index.mjs\");\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/** @module @category API */ \n\n\nfunction usePrimaryIdentifierCode() {\n const url = `${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__.restBaseUrl}/metadatamapping/termmapping?v=custom:(metadataUuid)&code=emr.primaryIdentifierType`;\n const { data, error, isLoading } = (0,swr__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(url, _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__.openmrsFetch);\n const results = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>({\n primaryIdentifierCode: data?.data?.results[0]?.metadataUuid,\n isLoading,\n error\n }), [\n data,\n error,\n isLoading\n ]);\n return results;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZVByaW1hcnlJZGVudGlmaWVyUmVzb3VyY2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLDBCQUEwQixHQUFtQztBQUNwQztBQUNvQztBQUN0RCxTQUFTSTtJQUNaLE1BQU1DLE1BQU0sR0FBR0YseURBQVdBLENBQUMsbUZBQW1GLENBQUM7SUFDL0csTUFBTSxFQUFFRyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsU0FBUyxFQUFFLEdBQUdQLCtDQUFNQSxDQUFDSSxLQUFLSCwwREFBWUE7SUFDM0QsTUFBTU8sVUFBVVQsOENBQU9BLENBQUMsSUFBSztZQUNyQlUsdUJBQXVCSixNQUFNQSxNQUFNRyxPQUFPLENBQUMsRUFBRSxFQUFFRTtZQUMvQ0g7WUFDQUQ7UUFDSixJQUFJO1FBQ0pEO1FBQ0FDO1FBQ0FDO0tBQ0g7SUFDRCxPQUFPQztBQUNYIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvdXNlUHJpbWFyeUlkZW50aWZpZXJSZXNvdXJjZS5qcz84MzY5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBjYXRlZ29yeSBBUEkgKi8gaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHVzZVNXUiBmcm9tIFwic3dyXCI7XG5pbXBvcnQgeyBvcGVubXJzRmV0Y2gsIHJlc3RCYXNlVXJsIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1hcGlcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQcmltYXJ5SWRlbnRpZmllckNvZGUoKSB7XG4gICAgY29uc3QgdXJsID0gYCR7cmVzdEJhc2VVcmx9L21ldGFkYXRhbWFwcGluZy90ZXJtbWFwcGluZz92PWN1c3RvbToobWV0YWRhdGFVdWlkKSZjb2RlPWVtci5wcmltYXJ5SWRlbnRpZmllclR5cGVgO1xuICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IsIGlzTG9hZGluZyB9ID0gdXNlU1dSKHVybCwgb3Blbm1yc0ZldGNoKTtcbiAgICBjb25zdCByZXN1bHRzID0gdXNlTWVtbygoKT0+KHtcbiAgICAgICAgICAgIHByaW1hcnlJZGVudGlmaWVyQ29kZTogZGF0YT8uZGF0YT8ucmVzdWx0c1swXT8ubWV0YWRhdGFVdWlkLFxuICAgICAgICAgICAgaXNMb2FkaW5nLFxuICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgfSksIFtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGlzTG9hZGluZ1xuICAgIF0pO1xuICAgIHJldHVybiByZXN1bHRzO1xufVxuIl0sIm5hbWVzIjpbInVzZU1lbW8iLCJ1c2VTV1IiLCJvcGVubXJzRmV0Y2giLCJyZXN0QmFzZVVybCIsInVzZVByaW1hcnlJZGVudGlmaWVyQ29kZSIsInVybCIsImRhdGEiLCJlcnJvciIsImlzTG9hZGluZyIsInJlc3VsdHMiLCJwcmltYXJ5SWRlbnRpZmllckNvZGUiLCJtZXRhZGF0YVV1aWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/usePrimaryIdentifierResource.js\n");
1218
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ usePrimaryIdentifierCode: () => (/* binding */ usePrimaryIdentifierCode)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/* harmony import */ var swr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! swr */ \"../../../node_modules/swr/dist/core/index.mjs\");\n/* harmony import */ var _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @openmrs/esm-api */ \"../../framework/esm-api/dist/index.js\");\n/** @module @category API */ \n\n\n/**\n * A React hook that retrieves the UUID of the primary patient identifier type\n * from the metadata mapping configuration. This identifier type is commonly used\n * to display the main identifier for a patient, such as their medical record number.\n *\n * @returns An object containing the primary identifier type UUID, loading state, and any error.\n *\n */ function usePrimaryIdentifierCode() {\n const url = `${_openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__.restBaseUrl}/metadatamapping/termmapping?v=custom:(metadataUuid)&code=emr.primaryIdentifierType`;\n const { data, error, isLoading } = (0,swr__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(url, _openmrs_esm_api__WEBPACK_IMPORTED_MODULE_2__.openmrsFetch);\n const results = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(()=>({\n primaryIdentifierCode: data?.data?.results[0]?.metadataUuid,\n isLoading,\n error\n }), [\n data,\n error,\n isLoading\n ]);\n return results;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZVByaW1hcnlJZGVudGlmaWVyUmVzb3VyY2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLDBCQUEwQixHQUFtQztBQUNwQztBQUNvQztBQUM3RDs7Ozs7OztDQU9DLEdBQVUsU0FBU0k7SUFDaEIsTUFBTUMsTUFBTSxHQUFHRix5REFBV0EsQ0FBQyxtRkFBbUYsQ0FBQztJQUMvRyxNQUFNLEVBQUVHLElBQUksRUFBRUMsS0FBSyxFQUFFQyxTQUFTLEVBQUUsR0FBR1AsK0NBQU1BLENBQUNJLEtBQUtILDBEQUFZQTtJQUMzRCxNQUFNTyxVQUFVVCw4Q0FBT0EsQ0FBQyxJQUFLO1lBQ3JCVSx1QkFBdUJKLE1BQU1BLE1BQU1HLE9BQU8sQ0FBQyxFQUFFLEVBQUVFO1lBQy9DSDtZQUNBRDtRQUNKLElBQUk7UUFDSkQ7UUFDQUM7UUFDQUM7S0FDSDtJQUNELE9BQU9DO0FBQ1giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VQcmltYXJ5SWRlbnRpZmllclJlc291cmNlLmpzPzgzNjkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdXNlU1dSIGZyb20gXCJzd3JcIjtcbmltcG9ydCB7IG9wZW5tcnNGZXRjaCwgcmVzdEJhc2VVcmwgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWFwaVwiO1xuLyoqXG4gKiBBIFJlYWN0IGhvb2sgdGhhdCByZXRyaWV2ZXMgdGhlIFVVSUQgb2YgdGhlIHByaW1hcnkgcGF0aWVudCBpZGVudGlmaWVyIHR5cGVcbiAqIGZyb20gdGhlIG1ldGFkYXRhIG1hcHBpbmcgY29uZmlndXJhdGlvbi4gVGhpcyBpZGVudGlmaWVyIHR5cGUgaXMgY29tbW9ubHkgdXNlZFxuICogdG8gZGlzcGxheSB0aGUgbWFpbiBpZGVudGlmaWVyIGZvciBhIHBhdGllbnQsIHN1Y2ggYXMgdGhlaXIgbWVkaWNhbCByZWNvcmQgbnVtYmVyLlxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcmltYXJ5IGlkZW50aWZpZXIgdHlwZSBVVUlELCBsb2FkaW5nIHN0YXRlLCBhbmQgYW55IGVycm9yLlxuICpcbiAqLyBleHBvcnQgZnVuY3Rpb24gdXNlUHJpbWFyeUlkZW50aWZpZXJDb2RlKCkge1xuICAgIGNvbnN0IHVybCA9IGAke3Jlc3RCYXNlVXJsfS9tZXRhZGF0YW1hcHBpbmcvdGVybW1hcHBpbmc/dj1jdXN0b206KG1ldGFkYXRhVXVpZCkmY29kZT1lbXIucHJpbWFyeUlkZW50aWZpZXJUeXBlYDtcbiAgICBjb25zdCB7IGRhdGEsIGVycm9yLCBpc0xvYWRpbmcgfSA9IHVzZVNXUih1cmwsIG9wZW5tcnNGZXRjaCk7XG4gICAgY29uc3QgcmVzdWx0cyA9IHVzZU1lbW8oKCk9Pih7XG4gICAgICAgICAgICBwcmltYXJ5SWRlbnRpZmllckNvZGU6IGRhdGE/LmRhdGE/LnJlc3VsdHNbMF0/Lm1ldGFkYXRhVXVpZCxcbiAgICAgICAgICAgIGlzTG9hZGluZyxcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgIH0pLCBbXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBpc0xvYWRpbmdcbiAgICBdKTtcbiAgICByZXR1cm4gcmVzdWx0cztcbn1cbiJdLCJuYW1lcyI6WyJ1c2VNZW1vIiwidXNlU1dSIiwib3Blbm1yc0ZldGNoIiwicmVzdEJhc2VVcmwiLCJ1c2VQcmltYXJ5SWRlbnRpZmllckNvZGUiLCJ1cmwiLCJkYXRhIiwiZXJyb3IiLCJpc0xvYWRpbmciLCJyZXN1bHRzIiwicHJpbWFyeUlkZW50aWZpZXJDb2RlIiwibWV0YWRhdGFVdWlkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/usePrimaryIdentifierResource.js\n");
1219
1219
 
1220
1220
  /***/ }),
1221
1221
 
@@ -1275,7 +1275,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1275
1275
  \*************************************************************/
1276
1276
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1277
1277
 
1278
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useVisitTypes: () => (/* binding */ useVisitTypes)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-emr-api */ \"../../framework/esm-emr-api/dist/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/** @module @category API */ \n\nfunction useVisitTypes() {\n const [visitTypes, setVisitTypes] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const visitTypesSub = (0,_openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_0__.getVisitTypes)().subscribe((visitTypes)=>{\n setVisitTypes(visitTypes);\n }, (error)=>console.error(error));\n return ()=>visitTypesSub.unsubscribe();\n }, []);\n return visitTypes;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZVZpc2l0VHlwZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMEJBQTBCLEdBQXdEO0FBQ3RDO0FBQ3JDLFNBQVNHO0lBQ1osTUFBTSxDQUFDQyxZQUFZQyxjQUFjLEdBQUdILCtDQUFRQSxDQUFDLEVBQUU7SUFDL0NELGdEQUFTQSxDQUFDO1FBQ04sTUFBTUssZ0JBQWdCTixtRUFBYUEsR0FBR08sU0FBUyxDQUFDLENBQUNIO1lBQzdDQyxjQUFjRDtRQUNsQixHQUFHLENBQUNJLFFBQVFDLFFBQVFELEtBQUssQ0FBQ0E7UUFDMUIsT0FBTyxJQUFJRixjQUFjSSxXQUFXO0lBQ3hDLEdBQUcsRUFBRTtJQUNMLE9BQU9OO0FBQ1giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ab3Blbm1ycy9lc20tYXBwLXNoZWxsLy4uLy4uL2ZyYW1ld29yay9lc20tcmVhY3QtdXRpbHMvZGlzdC91c2VWaXNpdFR5cGVzLmpzPzZmZGMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IEFQSSAqLyBpbXBvcnQgeyBnZXRWaXNpdFR5cGVzIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1lbXItYXBpXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5leHBvcnQgZnVuY3Rpb24gdXNlVmlzaXRUeXBlcygpIHtcbiAgICBjb25zdCBbdmlzaXRUeXBlcywgc2V0VmlzaXRUeXBlc10gPSB1c2VTdGF0ZShbXSk7XG4gICAgdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGNvbnN0IHZpc2l0VHlwZXNTdWIgPSBnZXRWaXNpdFR5cGVzKCkuc3Vic2NyaWJlKCh2aXNpdFR5cGVzKT0+e1xuICAgICAgICAgICAgc2V0VmlzaXRUeXBlcyh2aXNpdFR5cGVzKTtcbiAgICAgICAgfSwgKGVycm9yKT0+Y29uc29sZS5lcnJvcihlcnJvcikpO1xuICAgICAgICByZXR1cm4gKCk9PnZpc2l0VHlwZXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHZpc2l0VHlwZXM7XG59XG4iXSwibmFtZXMiOlsiZ2V0VmlzaXRUeXBlcyIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidXNlVmlzaXRUeXBlcyIsInZpc2l0VHlwZXMiLCJzZXRWaXNpdFR5cGVzIiwidmlzaXRUeXBlc1N1YiIsInN1YnNjcmliZSIsImVycm9yIiwiY29uc29sZSIsInVuc3Vic2NyaWJlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useVisitTypes.js\n");
1278
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useVisitTypes: () => (/* binding */ useVisitTypes)\n/* harmony export */ });\n/* harmony import */ var _openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openmrs/esm-emr-api */ \"../../framework/esm-emr-api/dist/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react/react\");\n/** @module @category API */ \n\n/**\n * A React hook that fetches and returns all available visit types from the\n * OpenMRS server. The data is fetched once when the component mounts.\n *\n * @returns An array of VisitType objects. Returns an empty array while loading\n * or if an error occurs.\n *\n * @example\n * ```tsx\n * import { useVisitTypes } from '@openmrs/esm-framework';\n * function VisitTypeSelector() {\n * const visitTypes = useVisitTypes();\n * return (\n * <select>\n * {visitTypes.map((vt) => (\n * <option key={vt.uuid} value={vt.uuid}>{vt.display}</option>\n * ))}\n * </select>\n * );\n * }\n * ```\n */ function useVisitTypes() {\n const [visitTypes, setVisitTypes] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const visitTypesSub = (0,_openmrs_esm_emr_api__WEBPACK_IMPORTED_MODULE_0__.getVisitTypes)().subscribe((visitTypes)=>{\n setVisitTypes(visitTypes);\n }, (error)=>console.error(error));\n return ()=>visitTypesSub.unsubscribe();\n }, []);\n return visitTypes;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZVZpc2l0VHlwZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMEJBQTBCLEdBQXdEO0FBQ3RDO0FBQzVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FxQkMsR0FBVSxTQUFTRztJQUNoQixNQUFNLENBQUNDLFlBQVlDLGNBQWMsR0FBR0gsK0NBQVFBLENBQUMsRUFBRTtJQUMvQ0QsZ0RBQVNBLENBQUM7UUFDTixNQUFNSyxnQkFBZ0JOLG1FQUFhQSxHQUFHTyxTQUFTLENBQUMsQ0FBQ0g7WUFDN0NDLGNBQWNEO1FBQ2xCLEdBQUcsQ0FBQ0ksUUFBUUMsUUFBUUQsS0FBSyxDQUFDQTtRQUMxQixPQUFPLElBQUlGLGNBQWNJLFdBQVc7SUFDeEMsR0FBRyxFQUFFO0lBQ0wsT0FBT047QUFDWCIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L3VzZVZpc2l0VHlwZXMuanM/NmZkYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGltcG9ydCB7IGdldFZpc2l0VHlwZXMgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWVtci1hcGlcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbi8qKlxuICogQSBSZWFjdCBob29rIHRoYXQgZmV0Y2hlcyBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlIHZpc2l0IHR5cGVzIGZyb20gdGhlXG4gKiBPcGVuTVJTIHNlcnZlci4gVGhlIGRhdGEgaXMgZmV0Y2hlZCBvbmNlIHdoZW4gdGhlIGNvbXBvbmVudCBtb3VudHMuXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgVmlzaXRUeXBlIG9iamVjdHMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgd2hpbGUgbG9hZGluZ1xuICogICBvciBpZiBhbiBlcnJvciBvY2N1cnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlVmlzaXRUeXBlcyB9IGZyb20gJ0BvcGVubXJzL2VzbS1mcmFtZXdvcmsnO1xuICogZnVuY3Rpb24gVmlzaXRUeXBlU2VsZWN0b3IoKSB7XG4gKiAgIGNvbnN0IHZpc2l0VHlwZXMgPSB1c2VWaXNpdFR5cGVzKCk7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPHNlbGVjdD5cbiAqICAgICAgIHt2aXNpdFR5cGVzLm1hcCgodnQpID0+IChcbiAqICAgICAgICAgPG9wdGlvbiBrZXk9e3Z0LnV1aWR9IHZhbHVlPXt2dC51dWlkfT57dnQuZGlzcGxheX08L29wdGlvbj5cbiAqICAgICAgICkpfVxuICogICAgIDwvc2VsZWN0PlxuICogICApO1xuICogfVxuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVzZVZpc2l0VHlwZXMoKSB7XG4gICAgY29uc3QgW3Zpc2l0VHlwZXMsIHNldFZpc2l0VHlwZXNdID0gdXNlU3RhdGUoW10pO1xuICAgIHVzZUVmZmVjdCgoKT0+e1xuICAgICAgICBjb25zdCB2aXNpdFR5cGVzU3ViID0gZ2V0VmlzaXRUeXBlcygpLnN1YnNjcmliZSgodmlzaXRUeXBlcyk9PntcbiAgICAgICAgICAgIHNldFZpc2l0VHlwZXModmlzaXRUeXBlcyk7XG4gICAgICAgIH0sIChlcnJvcik9PmNvbnNvbGUuZXJyb3IoZXJyb3IpKTtcbiAgICAgICAgcmV0dXJuICgpPT52aXNpdFR5cGVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiB2aXNpdFR5cGVzO1xufVxuIl0sIm5hbWVzIjpbImdldFZpc2l0VHlwZXMiLCJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsInVzZVZpc2l0VHlwZXMiLCJ2aXNpdFR5cGVzIiwic2V0VmlzaXRUeXBlcyIsInZpc2l0VHlwZXNTdWIiLCJzdWJzY3JpYmUiLCJlcnJvciIsImNvbnNvbGUiLCJ1bnN1YnNjcmliZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/useVisitTypes.js\n");
1279
1279
 
1280
1280
  /***/ }),
1281
1281
 
@@ -1315,7 +1315,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1315
1315
  \******************************************************/
1316
1316
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1317
1317
 
1318
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getCoreTranslation: () => (/* binding */ getCoreTranslation),\n/* harmony export */ translateFrom: () => (/* binding */ translateFrom)\n/* harmony export */ });\n/* harmony import */ var _translations_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./translations.js */ \"../../framework/esm-translations/dist/translations.js\");\n/* harmony import */ var i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! i18next */ \"webpack/sharing/consume/default/i18next/i18next\");\n/** @module @category Translation */ \n\nconst i18n = i18next__WEBPACK_IMPORTED_MODULE_1__[\"default\"] || i18next__WEBPACK_IMPORTED_MODULE_1__;\ni18n.on('initialized', function() {\n window.i18next.loadNamespaces([\n 'core'\n ]);\n});\n/**\n * This function is for getting a translation from a specific module. Use this only if the\n * translation is neither in the app making the call, nor in the core translations.\n * This function is useful, for example, in libraries that are used by multiple apps, since libraries can't\n * define their own translations.\n *\n * Translations within the current app should be accessed with the i18next API, using\n * `useTranslation` and `t` as usual. Core translations should be accessed with the\n * [[getCoreTranslation]] function.\n *\n * IMPORTANT: This function creates a hidden dependency on the module. Worse yet, it creates\n * a dependency specifically on that module's translation keys, which are often regarded as\n * \"implementation details\" and therefore may be volatile. Also note that this function DOES NOT\n * load the module's translations if they have not already been loaded via `useTranslation`.\n * **This function should therefore be avoided when possible.**\n *\n * @param moduleName The module to get the translation from, e.g. '@openmrs/esm-login-app'\n * @param key The i18next translation key\n * @param fallback Fallback text for if the lookup fails\n * @param options Options object passed to the i18next `t` function. See https://www.i18next.com/translation-function/essentials#overview-options\n * for more information. `ns` and `defaultValue` are already set and may not be used.\n * @returns The translated text as a string\n */ function translateFrom(moduleName, key, fallback, options) {\n return i18n.t(key, {\n ns: moduleName,\n defaultValue: fallback,\n ...options\n });\n}\n/**\n * Use this function to obtain a translation from the core translations. This is a way to avoid having\n * to define common translations in your app, and to ensure that translations are consistent across\n * different apps. This function is also used to obtain translations in the framework and app shell.\n *\n * The complete set of core translations is available on the `CoreTranslationKey` type. Providing an\n * invalid key to this function will result in a type error.\n *\n * @param options Object passed to the i18next `t` function. See https://www.i18next.com/translation-function/essentials#overview-options\n * for more information. `ns` and `defaultValue` are already set and may not be used.\n */ function getCoreTranslation(key, defaultText, options) {\n if (!_translations_js__WEBPACK_IMPORTED_MODULE_0__.coreTranslations[key]) {\n console.error(`O3 Core Translations does not provide key '${key}'. The key itself is being rendered as text.`);\n return key;\n }\n return translateFrom('core', key, defaultText ?? _translations_js__WEBPACK_IMPORTED_MODULE_0__.coreTranslations[key], options);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS10cmFuc2xhdGlvbnMvZGlzdC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsa0NBQWtDLEdBQXdEO0FBQzlEO0FBQzVCLE1BQU1FLE9BQU9ELCtDQUFhLElBQUlBLG9DQUFLQTtBQUNuQ0MsS0FBS0UsRUFBRSxDQUFDLGVBQWU7SUFDbkJDLE9BQU9DLE9BQU8sQ0FBQ0MsY0FBYyxDQUFDO1FBQzFCO0tBQ0g7QUFDTDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0JDLEdBQVUsU0FBU0MsY0FBY0MsVUFBVSxFQUFFQyxHQUFHLEVBQUVDLFFBQVEsRUFBRUMsT0FBTztJQUNoRSxPQUFPVixLQUFLVyxDQUFDLENBQUNILEtBQUs7UUFDZkksSUFBSUw7UUFDSk0sY0FBY0o7UUFDZCxHQUFHQyxPQUFPO0lBQ2Q7QUFDSjtBQUNBOzs7Ozs7Ozs7O0NBVUMsR0FBVSxTQUFTSSxtQkFBbUJOLEdBQUcsRUFBRU8sV0FBVyxFQUFFTCxPQUFPO0lBQzVELElBQUksQ0FBQ1osOERBQWdCLENBQUNVLElBQUksRUFBRTtRQUN4QlEsUUFBUUMsS0FBSyxDQUFDLENBQUMsMkNBQTJDLEVBQUVULElBQUksNENBQTRDLENBQUM7UUFDN0csT0FBT0E7SUFDWDtJQUNBLE9BQU9GLGNBQWMsUUFBUUUsS0FBS08sZUFBZWpCLDhEQUFnQixDQUFDVSxJQUFJLEVBQUVFO0FBQzVFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXRyYW5zbGF0aW9ucy9kaXN0L2luZGV4LmpzPzU5YTYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IFRyYW5zbGF0aW9uICovIGltcG9ydCB7IGNvcmVUcmFuc2xhdGlvbnMgfSBmcm9tIFwiLi90cmFuc2xhdGlvbnMuanNcIjtcbmltcG9ydCBfaTE4biBmcm9tIFwiaTE4bmV4dFwiO1xuY29uc3QgaTE4biA9IF9pMThuLmRlZmF1bHQgfHwgX2kxOG47XG5pMThuLm9uKCdpbml0aWFsaXplZCcsIGZ1bmN0aW9uKCkge1xuICAgIHdpbmRvdy5pMThuZXh0LmxvYWROYW1lc3BhY2VzKFtcbiAgICAgICAgJ2NvcmUnXG4gICAgXSk7XG59KTtcbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgZ2V0dGluZyBhIHRyYW5zbGF0aW9uIGZyb20gYSBzcGVjaWZpYyBtb2R1bGUuIFVzZSB0aGlzIG9ubHkgaWYgdGhlXG4gKiB0cmFuc2xhdGlvbiBpcyBuZWl0aGVyIGluIHRoZSBhcHAgbWFraW5nIHRoZSBjYWxsLCBub3IgaW4gdGhlIGNvcmUgdHJhbnNsYXRpb25zLlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCBpbiBsaWJyYXJpZXMgdGhhdCBhcmUgdXNlZCBieSBtdWx0aXBsZSBhcHBzLCBzaW5jZSBsaWJyYXJpZXMgY2FuJ3RcbiAqIGRlZmluZSB0aGVpciBvd24gdHJhbnNsYXRpb25zLlxuICpcbiAqIFRyYW5zbGF0aW9ucyB3aXRoaW4gdGhlIGN1cnJlbnQgYXBwIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBpMThuZXh0IEFQSSwgdXNpbmdcbiAqIGB1c2VUcmFuc2xhdGlvbmAgYW5kIGB0YCBhcyB1c3VhbC4gQ29yZSB0cmFuc2xhdGlvbnMgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggdGhlXG4gKiBbW2dldENvcmVUcmFuc2xhdGlvbl1dIGZ1bmN0aW9uLlxuICpcbiAqIElNUE9SVEFOVDogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgaGlkZGVuIGRlcGVuZGVuY3kgb24gdGhlIG1vZHVsZS4gV29yc2UgeWV0LCBpdCBjcmVhdGVzXG4gKiBhIGRlcGVuZGVuY3kgc3BlY2lmaWNhbGx5IG9uIHRoYXQgbW9kdWxlJ3MgdHJhbnNsYXRpb24ga2V5cywgd2hpY2ggYXJlIG9mdGVuIHJlZ2FyZGVkIGFzXG4gKiBcImltcGxlbWVudGF0aW9uIGRldGFpbHNcIiBhbmQgdGhlcmVmb3JlIG1heSBiZSB2b2xhdGlsZS4gQWxzbyBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBET0VTIE5PVFxuICogbG9hZCB0aGUgbW9kdWxlJ3MgdHJhbnNsYXRpb25zIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZCB2aWEgYHVzZVRyYW5zbGF0aW9uYC5cbiAqICoqVGhpcyBmdW5jdGlvbiBzaG91bGQgdGhlcmVmb3JlIGJlIGF2b2lkZWQgd2hlbiBwb3NzaWJsZS4qKlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBtb2R1bGUgdG8gZ2V0IHRoZSB0cmFuc2xhdGlvbiBmcm9tLCBlLmcuICdAb3Blbm1ycy9lc20tbG9naW4tYXBwJ1xuICogQHBhcmFtIGtleSBUaGUgaTE4bmV4dCB0cmFuc2xhdGlvbiBrZXlcbiAqIEBwYXJhbSBmYWxsYmFjayBGYWxsYmFjayB0ZXh0IGZvciBpZiB0aGUgbG9va3VwIGZhaWxzXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIGkxOG5leHQgYHRgIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly93d3cuaTE4bmV4dC5jb20vdHJhbnNsYXRpb24tZnVuY3Rpb24vZXNzZW50aWFscyNvdmVydmlldy1vcHRpb25zXG4gKiAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiBgbnNgIGFuZCBgZGVmYXVsdFZhbHVlYCBhcmUgYWxyZWFkeSBzZXQgYW5kIG1heSBub3QgYmUgdXNlZC5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc2xhdGVkIHRleHQgYXMgYSBzdHJpbmdcbiAqLyBleHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlRnJvbShtb2R1bGVOYW1lLCBrZXksIGZhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGkxOG4udChrZXksIHtcbiAgICAgICAgbnM6IG1vZHVsZU5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZmFsbGJhY2ssXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbn1cbi8qKlxuICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gb2J0YWluIGEgdHJhbnNsYXRpb24gZnJvbSB0aGUgY29yZSB0cmFuc2xhdGlvbnMuIFRoaXMgaXMgYSB3YXkgdG8gYXZvaWQgaGF2aW5nXG4gKiB0byBkZWZpbmUgY29tbW9uIHRyYW5zbGF0aW9ucyBpbiB5b3VyIGFwcCwgYW5kIHRvIGVuc3VyZSB0aGF0IHRyYW5zbGF0aW9ucyBhcmUgY29uc2lzdGVudCBhY3Jvc3NcbiAqIGRpZmZlcmVudCBhcHBzLiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byBvYnRhaW4gdHJhbnNsYXRpb25zIGluIHRoZSBmcmFtZXdvcmsgYW5kIGFwcCBzaGVsbC5cbiAqXG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvcmUgdHJhbnNsYXRpb25zIGlzIGF2YWlsYWJsZSBvbiB0aGUgYENvcmVUcmFuc2xhdGlvbktleWAgdHlwZS4gUHJvdmlkaW5nIGFuXG4gKiBpbnZhbGlkIGtleSB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVzdWx0IGluIGEgdHlwZSBlcnJvci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBPYmplY3QgcGFzc2VkIHRvIHRoZSBpMThuZXh0IGB0YCBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vd3d3LmkxOG5leHQuY29tL3RyYW5zbGF0aW9uLWZ1bmN0aW9uL2Vzc2VudGlhbHMjb3ZlcnZpZXctb3B0aW9uc1xuICogICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiBgbnNgIGFuZCBgZGVmYXVsdFZhbHVlYCBhcmUgYWxyZWFkeSBzZXQgYW5kIG1heSBub3QgYmUgdXNlZC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29yZVRyYW5zbGF0aW9uKGtleSwgZGVmYXVsdFRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWNvcmVUcmFuc2xhdGlvbnNba2V5XSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBPMyBDb3JlIFRyYW5zbGF0aW9ucyBkb2VzIG5vdCBwcm92aWRlIGtleSAnJHtrZXl9Jy4gVGhlIGtleSBpdHNlbGYgaXMgYmVpbmcgcmVuZGVyZWQgYXMgdGV4dC5gKTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZUZyb20oJ2NvcmUnLCBrZXksIGRlZmF1bHRUZXh0ID8/IGNvcmVUcmFuc2xhdGlvbnNba2V5XSwgb3B0aW9ucyk7XG59XG4iXSwibmFtZXMiOlsiY29yZVRyYW5zbGF0aW9ucyIsIl9pMThuIiwiaTE4biIsImRlZmF1bHQiLCJvbiIsIndpbmRvdyIsImkxOG5leHQiLCJsb2FkTmFtZXNwYWNlcyIsInRyYW5zbGF0ZUZyb20iLCJtb2R1bGVOYW1lIiwia2V5IiwiZmFsbGJhY2siLCJvcHRpb25zIiwidCIsIm5zIiwiZGVmYXVsdFZhbHVlIiwiZ2V0Q29yZVRyYW5zbGF0aW9uIiwiZGVmYXVsdFRleHQiLCJjb25zb2xlIiwiZXJyb3IiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-translations/dist/index.js\n");
1318
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getCoreTranslation: () => (/* binding */ getCoreTranslation),\n/* harmony export */ translateFrom: () => (/* binding */ translateFrom)\n/* harmony export */ });\n/* harmony import */ var _translations_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./translations.js */ \"../../framework/esm-translations/dist/translations.js\");\n/* harmony import */ var i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! i18next */ \"webpack/sharing/consume/default/i18next/i18next\");\n/** @module @category Translation */ \n\nconst i18n = i18next__WEBPACK_IMPORTED_MODULE_1__[\"default\"] || i18next__WEBPACK_IMPORTED_MODULE_1__;\ni18n.on('initialized', function() {\n window.i18next.loadNamespaces([\n 'core'\n ]);\n});\n/**\n * This function is for getting a translation from a specific module. Use this only if the\n * translation is neither in the app making the call, nor in the core translations.\n * This function is useful, for example, in libraries that are used by multiple apps, since libraries can't\n * define their own translations.\n *\n * Translations within the current app should be accessed with the i18next API, using\n * `useTranslation` and `t` as usual. Core translations should be accessed with the\n * [[getCoreTranslation]] function.\n *\n * IMPORTANT: This function creates a hidden dependency on the module. Worse yet, it creates\n * a dependency specifically on that module's translation keys, which are often regarded as\n * \"implementation details\" and therefore may be volatile. Also note that this function DOES NOT\n * load the module's translations if they have not already been loaded via `useTranslation`.\n * **This function should therefore be avoided when possible.**\n *\n * @param moduleName The module to get the translation from, e.g. '@openmrs/esm-login-app'\n * @param key The i18next translation key\n * @param fallback Fallback text for if the lookup fails\n * @param options Options object passed to the i18next `t` function. See https://www.i18next.com/translation-function/essentials#overview-options\n * for more information. `ns` and `defaultValue` are already set and may not be used.\n * @returns The translated text as a string\n */ function translateFrom(moduleName, key, fallback, options) {\n return i18n.t(key, {\n ns: moduleName,\n defaultValue: fallback,\n ...options\n });\n}\n/**\n * Use this function to obtain a translation from the core translations. This is a way to avoid having\n * to define common translations in your app, and to ensure that translations are consistent across\n * different apps. This function is also used to obtain translations in the framework and app shell.\n *\n * The complete set of core translations is available on the `CoreTranslationKey` type. Providing an\n * invalid key to this function will result in a type error.\n *\n * @param key The translation key from the set of core translations.\n * @param defaultText Optional fallback text if the translation is not found.\n * @param options Object passed to the i18next `t` function. See https://www.i18next.com/translation-function/essentials#overview-options\n * for more information. `ns` and `defaultValue` are already set and may not be used.\n * @returns The translated string.\n */ function getCoreTranslation(key, defaultText, options) {\n if (!_translations_js__WEBPACK_IMPORTED_MODULE_0__.coreTranslations[key]) {\n console.error(`O3 Core Translations does not provide key '${key}'. The key itself is being rendered as text.`);\n return key;\n }\n return translateFrom('core', key, defaultText ?? _translations_js__WEBPACK_IMPORTED_MODULE_0__.coreTranslations[key], options);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS10cmFuc2xhdGlvbnMvZGlzdC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsa0NBQWtDLEdBQXdEO0FBQzlEO0FBQzVCLE1BQU1FLE9BQU9ELCtDQUFhLElBQUlBLG9DQUFLQTtBQUNuQ0MsS0FBS0UsRUFBRSxDQUFDLGVBQWU7SUFDbkJDLE9BQU9DLE9BQU8sQ0FBQ0MsY0FBYyxDQUFDO1FBQzFCO0tBQ0g7QUFDTDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0JDLEdBQVUsU0FBU0MsY0FBY0MsVUFBVSxFQUFFQyxHQUFHLEVBQUVDLFFBQVEsRUFBRUMsT0FBTztJQUNoRSxPQUFPVixLQUFLVyxDQUFDLENBQUNILEtBQUs7UUFDZkksSUFBSUw7UUFDSk0sY0FBY0o7UUFDZCxHQUFHQyxPQUFPO0lBQ2Q7QUFDSjtBQUNBOzs7Ozs7Ozs7Ozs7O0NBYUMsR0FBVSxTQUFTSSxtQkFBbUJOLEdBQUcsRUFBRU8sV0FBVyxFQUFFTCxPQUFPO0lBQzVELElBQUksQ0FBQ1osOERBQWdCLENBQUNVLElBQUksRUFBRTtRQUN4QlEsUUFBUUMsS0FBSyxDQUFDLENBQUMsMkNBQTJDLEVBQUVULElBQUksNENBQTRDLENBQUM7UUFDN0csT0FBT0E7SUFDWDtJQUNBLE9BQU9GLGNBQWMsUUFBUUUsS0FBS08sZUFBZWpCLDhEQUFnQixDQUFDVSxJQUFJLEVBQUVFO0FBQzVFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXRyYW5zbGF0aW9ucy9kaXN0L2luZGV4LmpzPzU5YTYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGNhdGVnb3J5IFRyYW5zbGF0aW9uICovIGltcG9ydCB7IGNvcmVUcmFuc2xhdGlvbnMgfSBmcm9tIFwiLi90cmFuc2xhdGlvbnMuanNcIjtcbmltcG9ydCBfaTE4biBmcm9tIFwiaTE4bmV4dFwiO1xuY29uc3QgaTE4biA9IF9pMThuLmRlZmF1bHQgfHwgX2kxOG47XG5pMThuLm9uKCdpbml0aWFsaXplZCcsIGZ1bmN0aW9uKCkge1xuICAgIHdpbmRvdy5pMThuZXh0LmxvYWROYW1lc3BhY2VzKFtcbiAgICAgICAgJ2NvcmUnXG4gICAgXSk7XG59KTtcbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgZ2V0dGluZyBhIHRyYW5zbGF0aW9uIGZyb20gYSBzcGVjaWZpYyBtb2R1bGUuIFVzZSB0aGlzIG9ubHkgaWYgdGhlXG4gKiB0cmFuc2xhdGlvbiBpcyBuZWl0aGVyIGluIHRoZSBhcHAgbWFraW5nIHRoZSBjYWxsLCBub3IgaW4gdGhlIGNvcmUgdHJhbnNsYXRpb25zLlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCBpbiBsaWJyYXJpZXMgdGhhdCBhcmUgdXNlZCBieSBtdWx0aXBsZSBhcHBzLCBzaW5jZSBsaWJyYXJpZXMgY2FuJ3RcbiAqIGRlZmluZSB0aGVpciBvd24gdHJhbnNsYXRpb25zLlxuICpcbiAqIFRyYW5zbGF0aW9ucyB3aXRoaW4gdGhlIGN1cnJlbnQgYXBwIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBpMThuZXh0IEFQSSwgdXNpbmdcbiAqIGB1c2VUcmFuc2xhdGlvbmAgYW5kIGB0YCBhcyB1c3VhbC4gQ29yZSB0cmFuc2xhdGlvbnMgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggdGhlXG4gKiBbW2dldENvcmVUcmFuc2xhdGlvbl1dIGZ1bmN0aW9uLlxuICpcbiAqIElNUE9SVEFOVDogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgaGlkZGVuIGRlcGVuZGVuY3kgb24gdGhlIG1vZHVsZS4gV29yc2UgeWV0LCBpdCBjcmVhdGVzXG4gKiBhIGRlcGVuZGVuY3kgc3BlY2lmaWNhbGx5IG9uIHRoYXQgbW9kdWxlJ3MgdHJhbnNsYXRpb24ga2V5cywgd2hpY2ggYXJlIG9mdGVuIHJlZ2FyZGVkIGFzXG4gKiBcImltcGxlbWVudGF0aW9uIGRldGFpbHNcIiBhbmQgdGhlcmVmb3JlIG1heSBiZSB2b2xhdGlsZS4gQWxzbyBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBET0VTIE5PVFxuICogbG9hZCB0aGUgbW9kdWxlJ3MgdHJhbnNsYXRpb25zIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZCB2aWEgYHVzZVRyYW5zbGF0aW9uYC5cbiAqICoqVGhpcyBmdW5jdGlvbiBzaG91bGQgdGhlcmVmb3JlIGJlIGF2b2lkZWQgd2hlbiBwb3NzaWJsZS4qKlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBtb2R1bGUgdG8gZ2V0IHRoZSB0cmFuc2xhdGlvbiBmcm9tLCBlLmcuICdAb3Blbm1ycy9lc20tbG9naW4tYXBwJ1xuICogQHBhcmFtIGtleSBUaGUgaTE4bmV4dCB0cmFuc2xhdGlvbiBrZXlcbiAqIEBwYXJhbSBmYWxsYmFjayBGYWxsYmFjayB0ZXh0IGZvciBpZiB0aGUgbG9va3VwIGZhaWxzXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIGkxOG5leHQgYHRgIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly93d3cuaTE4bmV4dC5jb20vdHJhbnNsYXRpb24tZnVuY3Rpb24vZXNzZW50aWFscyNvdmVydmlldy1vcHRpb25zXG4gKiAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiBgbnNgIGFuZCBgZGVmYXVsdFZhbHVlYCBhcmUgYWxyZWFkeSBzZXQgYW5kIG1heSBub3QgYmUgdXNlZC5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc2xhdGVkIHRleHQgYXMgYSBzdHJpbmdcbiAqLyBleHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlRnJvbShtb2R1bGVOYW1lLCBrZXksIGZhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGkxOG4udChrZXksIHtcbiAgICAgICAgbnM6IG1vZHVsZU5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZmFsbGJhY2ssXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbn1cbi8qKlxuICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gb2J0YWluIGEgdHJhbnNsYXRpb24gZnJvbSB0aGUgY29yZSB0cmFuc2xhdGlvbnMuIFRoaXMgaXMgYSB3YXkgdG8gYXZvaWQgaGF2aW5nXG4gKiB0byBkZWZpbmUgY29tbW9uIHRyYW5zbGF0aW9ucyBpbiB5b3VyIGFwcCwgYW5kIHRvIGVuc3VyZSB0aGF0IHRyYW5zbGF0aW9ucyBhcmUgY29uc2lzdGVudCBhY3Jvc3NcbiAqIGRpZmZlcmVudCBhcHBzLiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byBvYnRhaW4gdHJhbnNsYXRpb25zIGluIHRoZSBmcmFtZXdvcmsgYW5kIGFwcCBzaGVsbC5cbiAqXG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvcmUgdHJhbnNsYXRpb25zIGlzIGF2YWlsYWJsZSBvbiB0aGUgYENvcmVUcmFuc2xhdGlvbktleWAgdHlwZS4gUHJvdmlkaW5nIGFuXG4gKiBpbnZhbGlkIGtleSB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVzdWx0IGluIGEgdHlwZSBlcnJvci5cbiAqXG4gKiBAcGFyYW0ga2V5IFRoZSB0cmFuc2xhdGlvbiBrZXkgZnJvbSB0aGUgc2V0IG9mIGNvcmUgdHJhbnNsYXRpb25zLlxuICogQHBhcmFtIGRlZmF1bHRUZXh0IE9wdGlvbmFsIGZhbGxiYWNrIHRleHQgaWYgdGhlIHRyYW5zbGF0aW9uIGlzIG5vdCBmb3VuZC5cbiAqIEBwYXJhbSBvcHRpb25zIE9iamVjdCBwYXNzZWQgdG8gdGhlIGkxOG5leHQgYHRgIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly93d3cuaTE4bmV4dC5jb20vdHJhbnNsYXRpb24tZnVuY3Rpb24vZXNzZW50aWFscyNvdmVydmlldy1vcHRpb25zXG4gKiAgICAgICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIGBuc2AgYW5kIGBkZWZhdWx0VmFsdWVgIGFyZSBhbHJlYWR5IHNldCBhbmQgbWF5IG5vdCBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIHRyYW5zbGF0ZWQgc3RyaW5nLlxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRDb3JlVHJhbnNsYXRpb24oa2V5LCBkZWZhdWx0VGV4dCwgb3B0aW9ucykge1xuICAgIGlmICghY29yZVRyYW5zbGF0aW9uc1trZXldKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE8zIENvcmUgVHJhbnNsYXRpb25zIGRvZXMgbm90IHByb3ZpZGUga2V5ICcke2tleX0nLiBUaGUga2V5IGl0c2VsZiBpcyBiZWluZyByZW5kZXJlZCBhcyB0ZXh0LmApO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlRnJvbSgnY29yZScsIGtleSwgZGVmYXVsdFRleHQgPz8gY29yZVRyYW5zbGF0aW9uc1trZXldLCBvcHRpb25zKTtcbn1cbiJdLCJuYW1lcyI6WyJjb3JlVHJhbnNsYXRpb25zIiwiX2kxOG4iLCJpMThuIiwiZGVmYXVsdCIsIm9uIiwid2luZG93IiwiaTE4bmV4dCIsImxvYWROYW1lc3BhY2VzIiwidHJhbnNsYXRlRnJvbSIsIm1vZHVsZU5hbWUiLCJrZXkiLCJmYWxsYmFjayIsIm9wdGlvbnMiLCJ0IiwibnMiLCJkZWZhdWx0VmFsdWUiLCJnZXRDb3JlVHJhbnNsYXRpb24iLCJkZWZhdWx0VGV4dCIsImNvbnNvbGUiLCJlcnJvciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../framework/esm-translations/dist/index.js\n");
1319
1319
 
1320
1320
  /***/ }),
1321
1321
 
@@ -1335,7 +1335,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1335
1335
  \***************************************************/
1336
1336
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1337
1337
 
1338
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isOnline: () => (/* binding */ isOnline)\n/* harmony export */ });\nfunction isOnline(online) {\n return window.offlineEnabled ? online ?? navigator.onLine : true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS11dGlscy9kaXN0L2lzLW9ubGluZS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQU8sU0FBU0EsU0FBU0MsTUFBTTtJQUMzQixPQUFPQyxPQUFPQyxjQUFjLEdBQUdGLFVBQVVHLFVBQVVDLE1BQU0sR0FBRztBQUNoRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS11dGlscy9kaXN0L2lzLW9ubGluZS5qcz8wZmY1Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBpc09ubGluZShvbmxpbmUpIHtcbiAgICByZXR1cm4gd2luZG93Lm9mZmxpbmVFbmFibGVkID8gb25saW5lID8/IG5hdmlnYXRvci5vbkxpbmUgOiB0cnVlO1xufVxuIl0sIm5hbWVzIjpbImlzT25saW5lIiwib25saW5lIiwid2luZG93Iiwib2ZmbGluZUVuYWJsZWQiLCJuYXZpZ2F0b3IiLCJvbkxpbmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-utils/dist/is-online.js\n");
1338
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isOnline: () => (/* binding */ isOnline)\n/* harmony export */ });\n/**\n * Determines if the application should behave as if it is online.\n * When offline mode is enabled (`window.offlineEnabled`), this returns the\n * provided `online` parameter or falls back to `navigator.onLine`.\n * When offline mode is disabled, this always returns `true`.\n *\n * @param online Optional override for the online status. If provided and offline\n * mode is enabled, this value is returned directly.\n * @returns `true` if the application should behave as online, `false` otherwise.\n *\n * @category Utility\n */ function isOnline(online) {\n return window.offlineEnabled ? online ?? navigator.onLine : true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZnJhbWV3b3JrL2VzbS11dGlscy9kaXN0L2lzLW9ubGluZS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7Ozs7Ozs7O0NBV0MsR0FBVSxTQUFTQSxTQUFTQyxNQUFNO0lBQy9CLE9BQU9DLE9BQU9DLGNBQWMsR0FBR0YsVUFBVUcsVUFBVUMsTUFBTSxHQUFHO0FBQ2hFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXV0aWxzL2Rpc3QvaXMtb25saW5lLmpzPzBmZjUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYmVoYXZlIGFzIGlmIGl0IGlzIG9ubGluZS5cbiAqIFdoZW4gb2ZmbGluZSBtb2RlIGlzIGVuYWJsZWQgKGB3aW5kb3cub2ZmbGluZUVuYWJsZWRgKSwgdGhpcyByZXR1cm5zIHRoZVxuICogcHJvdmlkZWQgYG9ubGluZWAgcGFyYW1ldGVyIG9yIGZhbGxzIGJhY2sgdG8gYG5hdmlnYXRvci5vbkxpbmVgLlxuICogV2hlbiBvZmZsaW5lIG1vZGUgaXMgZGlzYWJsZWQsIHRoaXMgYWx3YXlzIHJldHVybnMgYHRydWVgLlxuICpcbiAqIEBwYXJhbSBvbmxpbmUgT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIHRoZSBvbmxpbmUgc3RhdHVzLiBJZiBwcm92aWRlZCBhbmQgb2ZmbGluZVxuICogICBtb2RlIGlzIGVuYWJsZWQsIHRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgZGlyZWN0bHkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBiZWhhdmUgYXMgb25saW5lLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBAY2F0ZWdvcnkgVXRpbGl0eVxuICovIGV4cG9ydCBmdW5jdGlvbiBpc09ubGluZShvbmxpbmUpIHtcbiAgICByZXR1cm4gd2luZG93Lm9mZmxpbmVFbmFibGVkID8gb25saW5lID8/IG5hdmlnYXRvci5vbkxpbmUgOiB0cnVlO1xufVxuIl0sIm5hbWVzIjpbImlzT25saW5lIiwib25saW5lIiwid2luZG93Iiwib2ZmbGluZUVuYWJsZWQiLCJuYXZpZ2F0b3IiLCJvbkxpbmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-utils/dist/is-online.js\n");
1339
1339
 
1340
1340
  /***/ }),
1341
1341