@openmrs/esm-app-shell 10.0.1-pre.5598 → 10.0.1-pre.5605
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.
- package/.turbo/turbo-build.log +3 -3
- package/dist/064699d8fae9324f.js +1 -0
- package/dist/064699d8fae9324f.js.map +1 -0
- package/dist/{efebf38512c470bf.js → 6ec3732fa5340965.js} +1 -1
- package/dist/6ec3732fa5340965.js.map +1 -0
- package/dist/index.html +1 -1
- package/dist/{openmrs.1d13f248d2818658.js → openmrs.24299ade4d7be602.js} +3 -3
- package/dist/{openmrs.1d13f248d2818658.js.map → openmrs.24299ade4d7be602.js.map} +1 -1
- package/lib/{80ef8c60ad8d0f24.js → 179d0d3c39ccf890.js} +1 -1
- package/lib/{eecf9f88878078af.js → a9723890347a594e.js} +176 -3
- package/lib/index.html +1 -1
- package/lib/openmrs.js +7 -7
- package/package.json +3 -3
- package/rspack.config.js +2 -0
- package/src/index.ejs +1 -1
- package/src/index.ts +1 -1
- package/src/run.ts +35 -35
- package/tools/startup-preload-plugin.js +84 -0
- package/dist/b8b6c927e265bf9b.js +0 -1
- package/dist/b8b6c927e265bf9b.js.map +0 -1
- package/dist/c7304711c5bc39f8.js +0 -1
- package/dist/c7304711c5bc39f8.js.map +0 -1
- package/dist/efebf38512c470bf.js.map +0 -1
- package/lib/f865020c91218e5f.js +0 -42
|
@@ -4476,7 +4476,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
|
|
|
4476
4476
|
},
|
|
4477
4477
|
"../../framework/esm-api/dist/openmrs-fetch.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
4478
4478
|
"use strict";
|
|
4479
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n OpenmrsFetchError: () => (OpenmrsFetchError),\n fhirBaseUrl: () => (fhirBaseUrl),\n makeUrl: () => (makeUrl),\n openmrsFetch: () => (openmrsFetch),\n restBaseUrl: () => (restBaseUrl),\n sessionEndpoint: () => (sessionEndpoint)\n});\n/* import */ var lodash_es__rspack_import_3 = __webpack_require__(\"../../../node_modules/lodash-es/isPlainObject.js\");\n/* import */ var _openmrs_esm_config__rspack_import_0 = __webpack_require__(\"../../framework/esm-config/dist/index.js\");\n/* import */ var _openmrs_esm_navigation__rspack_import_1 = __webpack_require__(\"../../framework/esm-navigation/dist/index.js\");\n/* import */ var _config_schema_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-api/dist/config-schema.js\");\nfunction _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/** @module @category API */ \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__rspack_import_3[\"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__rspack_import_0.getConfig)('@openmrs/esm-api');\n if (response.ok) {\n /*\n * Backend modules can trigger SPA redirects by returning a `Location` header.\n * This is required because `fetch()` hides HTTP redirects from the application.\n *\n * - Session endpoint (2xx): Authentication challenge URLs (e.g. TOTP,2FA).\n * - HTTP 204: Logout redirect URLs (e.g. Keycloak IdP logout). Refer: OA-41 #1231\n */ const location = response.headers.get('location');\n const shouldRedirect = followRedirects && location && (url === makeUrl(sessionEndpoint) || response.status === 204);\n if (shouldRedirect) {\n (0,_openmrs_esm_navigation__rspack_import_1.navigate)({\n to: location\n });\n }\n if (response.status === 204) {\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__rspack_import_1.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__rspack_import_2.defaultRedirectAuthFailureUrl;\n (0,_openmrs_esm_navigation__rspack_import_1.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}\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\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyPz9ydWxlU2V0WzFdLnJ1bGVzWzVdLnVzZVswXSEvaG9tZS9ydW5uZXIvd29yay9vcGVubXJzLWVzbS1jb3JlL29wZW5tcnMtZXNtLWNvcmUvcGFja2FnZXMvZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9vcGVubXJzLWZldGNoLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWFwaS9kaXN0L29wZW5tcnMtZmV0Y2guanM/YzhiNiJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZGVmaW5lX3Byb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG4vKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWNvbmZpZ1wiO1xuaW1wb3J0IHsgY2xlYXJIaXN0b3J5LCBuYXZpZ2F0ZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgZGVmYXVsdFJlZGlyZWN0QXV0aEZhaWx1cmVVcmwgfSBmcm9tIFwiLi9jb25maWctc2NoZW1hLmpzXCI7XG4vKiogVGhlIGJhc2UgVVJMIGZvciB0aGUgT3Blbk1SUyBSRVNUIEFQSSAoZS5nLiwgJy93cy9yZXN0L3YxJykuICovIGV4cG9ydCBjb25zdCByZXN0QmFzZVVybCA9ICcvd3MvcmVzdC92MSc7XG4vKiogVGhlIGJhc2UgVVJMIGZvciB0aGUgT3Blbk1SUyBGSElSIFI0IEFQSSAoZS5nLiwgJy93cy9maGlyMi9SNCcpLiAqLyBleHBvcnQgY29uc3QgZmhpckJhc2VVcmwgPSAnL3dzL2ZoaXIyL1I0Jztcbi8qKiBUaGUgZW5kcG9pbnQgZm9yIHNlc3Npb24gbWFuYWdlbWVudCBvcGVyYXRpb25zLiAqLyBleHBvcnQgY29uc3Qgc2Vzc2lvbkVuZHBvaW50ID0gYCR7cmVzdEJhc2VVcmx9L3Nlc3Npb25gO1xuLyoqXG4gKiBBcHBlbmQgYHBhdGhgIHRvIHRoZSBPcGVuTVJTIFNQQSBiYXNlLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGFwcGVuZCB0byB0aGUgT3Blbk1SUyBiYXNlIFVSTC5cbiAqIEByZXR1cm5zIFRoZSBmdWxsIFVSTCB3aXRoIHRoZSBPcGVuTVJTIGJhc2UgcHJlcGVuZGVkLiBJZiB0aGUgcGF0aCBpcyBhbHJlYWR5XG4gKiAgIGFuIGFic29sdXRlIFVSTCAoc3RhcnRpbmcgd2l0aCAnaHR0cCcpLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogbWFrZVVybCgnL2Zvby9iYXInKTtcbiAqIC8vID0+ICcvb3Blbm1ycy9mb28vYmFyJ1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIG1ha2VVcmwocGF0aCkge1xuICAgIGlmIChwYXRoICYmIHBhdGguc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH0gZWxzZSBpZiAocGF0aFswXSAhPT0gJy8nKSB7XG4gICAgICAgIC8vIGVuc3VyZSBwYXRoIHN0YXJ0cyB3aXRoIC9cbiAgICAgICAgcGF0aCA9ICcvJyArIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3cub3Blbm1yc0Jhc2UgKyBwYXRoO1xufVxuLyoqXG4gKiBUaGUgb3Blbm1yc0ZldGNoIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlXG4gKiBbYnJvd3NlcidzIGJ1aWx0LWluIGZldGNoIGZ1bmN0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJL1VzaW5nX0ZldGNoKSxcbiAqIHdpdGggZXh0cmEgaGFuZGxpbmcgZm9yIE9wZW5NUlMtc3BlY2lmaWMgQVBJIGJlaGF2aW9ycywgc3VjaCBhc1xuICogcmVxdWVzdCBoZWFkZXJzLCBhdXRoZW50aWNhdGlvbiwgYXV0aG9yaXphdGlvbiwgYW5kIHRoZSBBUEkgdXJscy5cbiAqXG4gKiBAcGFyYW0gcGF0aCBBIHN0cmluZyB1cmwgdG8gbWFrZSB0aGUgcmVxdWVzdCB0by4gTm90ZSB0aGF0IHRoZVxuICogICBvcGVubXJzIGJhc2UgdXJsIChieSBkZWZhdWx0IGAvb3Blbm1yc2ApIHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogICBwcmVwZW5kZWQgdG8gdGhlIFVSTCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlIGl0LlxuICogQHBhcmFtIGZldGNoSW5pdCBBIFtmZXRjaCBpbml0IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUvZmV0Y2gjU3ludGF4KS5cbiAqICAgTm90ZSB0aGF0IHRoZSBgYm9keWAgcHJvcGVydHkgZG9lcyBub3QgbmVlZCB0byBiZSBgSlNPTi5zdHJpbmdpZnkoKWBlZFxuICogICBiZWNhdXNlIG9wZW5tcnNGZXRjaCB3aWxsIGRvIHRoYXQgZm9yIHlvdS5cbiAqIEByZXR1cm5zIEEgW1Byb21pc2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2UpXG4gKiAgIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIFtSZXNwb25zZSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXNwb25zZSkuXG4gKiAgIE5vdGUgdGhhdCB0aGUgb3Blbm1ycyB2ZXJzaW9uIG9mIHRoZSBSZXNwb25zZSBvYmplY3QgaGFzIGFscmVhZHlcbiAqICAgZG93bmxvYWRlZCB0aGUgSFRUUCByZXNwb25zZSBib2R5IGFzIGpzb24sIGFuZCBoYXMgYW4gYWRkaXRpb25hbFxuICogICBgZGF0YWAgcHJvcGVydHkgd2l0aCB0aGUgSFRUUCByZXNwb25zZSBqc29uIGFzIGEgamF2YXNjcmlwdCBvYmplY3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBvcGVubXJzRmV0Y2ggfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJ1xuICogY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICogb3Blbm1yc0ZldGNoKGAke3Jlc3RCYXNlVXJsfS9zZXNzaW9uJywge3NpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbH0pXG4gKiAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhyZXNwb25zZS5kYXRhLmF1dGhlbnRpY2F0ZWQpXG4gKiAgIH0pXG4gKiAgIC5jYXRjaChlcnIgPT4ge1xuICogICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YXR1cyk7XG4gKiAgIH0pXG4gKiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAqIG9wZW5tcnNGZXRjaChgJHtyZXN0QmFzZVVybH0vc2Vzc2lvbicsIHtcbiAqICAgbWV0aG9kOiAnUE9TVCcsXG4gKiAgIGJvZHk6IHtcbiAqICAgICB1c2VybmFtZTogJ2hpJyxcbiAqICAgICBwYXNzd29yZDogJ3RoZXJlJyxcbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICpcbiAqICMjIyMgQ2FuY2VsbGF0aW9uXG4gKlxuICogVG8gY2FuY2VsIGEgbmV0d29yayByZXF1ZXN0LCB1c2UgYW5cbiAqIFtBYm9ydENvbnRyb2xsZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIvYWJvcnQpLlxuICogSXQgaXMgYmVzdCBwcmFjdGljZSB0byBjYW5jZWwgeW91ciBuZXR3b3JrIHJlcXVlc3RzIHdoZW4gdGhlIHVzZXJcbiAqIG5hdmlnYXRlcyBhd2F5IGZyb20gYSBwYWdlIHdoaWxlIHRoZSByZXF1ZXN0IGlzIHBlbmRpbmcgcmVxdWVzdCwgdG9cbiAqIGZyZWUgdXAgbWVtb3J5IGFuZCBuZXR3b3JrIHJlc291cmNlcyBhbmQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMuXG4gKlxuICogQGNhdGVnb3J5IEFQSVxuICovIGV4cG9ydCBmdW5jdGlvbiBvcGVubXJzRmV0Y2gocGF0aCwgZmV0Y2hJbml0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEVycm9yKFwiVGhlIGZpcnN0IGFyZ3VtZW50IHRvIEBvcGVubXJzL2FwaSdzIG9wZW5tcnNGZXRjaCBmdW5jdGlvbiBtdXN0IGJlIGEgdXJsIHN0cmluZ1wiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmZXRjaEluaXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IEVycm9yKFwiVGhlIHNlY29uZCBhcmd1bWVudCB0byBAb3Blbm1ycy9hcGkncyBvcGVubXJzRmV0Y2ggZnVuY3Rpb24gbXVzdCBiZSBhIHBsYWluIG9iamVjdC5cIik7XG4gICAgfVxuICAgIGlmICghd2luZG93Lm9wZW5tcnNCYXNlKSB7XG4gICAgICAgIHRocm93IEVycm9yKFwiQG9wZW5tcnMvYXBpIGlzIHJ1bm5pbmcgaW4gYSBicm93c2VyIHRoYXQgZG9lc24ndCBoYXZlIHdpbmRvdy5vcGVubXJzQmFzZSwgd2hpY2ggaXMgcHJvdmlkZWQgYnkgb3Blbm1ycy1tb2R1bGUtc3BhJ3MgSFRNTCBmaWxlLlwiKTtcbiAgICB9XG4gICAgLy8gUHJlZml4IHRoZSB1cmwgd2l0aCB0aGUgb3Blbm1ycyBzcGEgYmFzZVxuICAgIGxldCB1cmwgPSBtYWtlVXJsKHBhdGgpO1xuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIG5lZWQgc29tZSBoZWFkZXJzXG4gICAgaWYgKCFmZXRjaEluaXQuaGVhZGVycykge1xuICAgICAgICBmZXRjaEluaXQuaGVhZGVycyA9IHt9O1xuICAgIH1cbiAgICAvKiBBdXRvbWF0aWNhbGx5IHN0cmluZ2lmeSBqYXZhc2NyaXB0IG9iamVjdHMgYmVpbmcgc2VudCBpbiB0aGVcbiAgICogcmVxdWVzdCBib2R5LlxuICAgKi8gaWYgKGlzUGxhaW5PYmplY3QoZmV0Y2hJbml0LmJvZHkpKSB7XG4gICAgICAgIGZldGNoSW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZmV0Y2hJbml0LmJvZHkpO1xuICAgIH1cbiAgICAvKiBBZGQgYSByZXF1ZXN0IGhlYWRlciB0byB0ZWxsIHRoZSBzZXJ2ZXIgdG8gcmVzcG9uZCB3aXRoIGpzb24sXG4gICAqIHNpbmNlIGZyb250ZW5kIGNvZGUgYWxtb3N0IGFsd2F5cyB3YW50cyBqc29uIGFuZCB0aGUgT3Blbk1SU1xuICAgKiBzZXJ2ZXIgd29uJ3QgZ2l2ZSB5b3UganNvbiB1bmxlc3MgeW91IGV4cGxpY2l0bHkgYXNrIGZvciBpdC5cbiAgICogSWYgYSBkaWZmZXJlbnQgQWNjZXB0IGhlYWRlciBpcyBwcmVmZXJyZWQsIHBhc3MgaXQgaW50byB0aGUgZmV0Y2hJbml0LlxuICAgKiBJZiBubyBBY2NlcHQgaGVhZGVyIGlzIGRlc2lyZWQsIHBhc3MgaXQgaW4gZXhwbGljaXRseSBhcyBudWxsLlxuICAgKi8gaWYgKHR5cGVvZiBmZXRjaEluaXQuaGVhZGVycy5BY2NlcHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZldGNoSW5pdC5oZWFkZXJzLkFjY2VwdCA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgICB9XG4gICAgaWYgKGZldGNoSW5pdC5oZWFkZXJzLkFjY2VwdCA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgZmV0Y2hJbml0LmhlYWRlcnMuQWNjZXB0O1xuICAgIH1cbiAgICAvKiBUaGlzIHRlbGxzIHRoZSBPcGVuTVJTIFJFU1QgQVBJIG5vdCB0byByZXR1cm4gYSBXV1ctQXV0aGVudGljYXRlXG4gICAqIGhlYWRlci4gUmV0dXJuaW5nIHRoYXQgaGVhZGVyIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIHRoZSBBUEksIGJ1dFxuICAgKiBub3QgZnJvbSBhIFVJLlxuICAgKi8gaWYgKHBhdGguc3RhcnRzV2l0aChyZXN0QmFzZVVybCkgJiYgdHlwZW9mIGZldGNoSW5pdC5oZWFkZXJzWydEaXNhYmxlLVdXVy1BdXRoZW50aWNhdGUnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZmV0Y2hJbml0LmhlYWRlcnNbJ0Rpc2FibGUtV1dXLUF1dGhlbnRpY2F0ZSddID0gJ3RydWUnO1xuICAgIH1cbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKGZoaXJCYXNlVXJsKSkge1xuICAgICAgICBjb25zdCB1cmxVcmwgPSBuZXcgVVJMKHVybCwgd2luZG93LmxvY2F0aW9uLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoIXVybFVybC5zZWFyY2hQYXJhbXMuaGFzKCdfc3VtbWFyeScpKSB7XG4gICAgICAgICAgICB1cmxVcmwuc2VhcmNoUGFyYW1zLnNldCgnX3N1bW1hcnknLCAnZGF0YScpO1xuICAgICAgICAgICAgdXJsID0gdXJsVXJsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogV2UgY2FwdHVyZSB0aGUgc3RhY2t0cmFjZSBiZWZvcmUgbWFraW5nIHRoZSByZXF1ZXN0LCBzbyB0aGF0IGlmIGFuIGVycm9yIG9jY3VycyB3ZSBjYW5cbiAgICogbG9nIGEgZnVsbCBzdGFja3RyYWNlIHRoYXQgaW5jbHVkZXMgdGhlIGNvZGUgdGhhdCBtYWRlIHRoZSByZXF1ZXN0IGFuZCBoYW5kbGVkIHRoZSByZXNwb25zZVxuICAgKiBPdGhlcndpc2UsIHdlIGNvdWxkIHJ1biBpbnRvIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0YWNrdHJhY2UgZG9lc24ndCBldmVuIHNob3cgd2hpY2ggY29kZVxuICAgKiBjYWxsZWQgQG9wZW5tcnMvYXBpLlxuICAgKi8gY29uc3QgcmVxdWVzdFN0YWNrdHJhY2UgPSBFcnJvcigpO1xuICAgIHJldHVybiB3aW5kb3cuZmV0Y2godXJsLCBmZXRjaEluaXQpLnRoZW4oYXN5bmMgKHIpPT57XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcjtcbiAgICAgICAgY29uc3QgeyByZWRpcmVjdEF1dGhGYWlsdXJlLCBmb2xsb3dSZWRpcmVjdHMgfSA9IGF3YWl0IGdldENvbmZpZygnQG9wZW5tcnMvZXNtLWFwaScpO1xuICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgKiBCYWNrZW5kIG1vZHVsZXMgY2FuIHRyaWdnZXIgU1BBIHJlZGlyZWN0cyBieSByZXR1cm5pbmcgYSBgTG9jYXRpb25gIGhlYWRlci5cbiAgICAgICAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBgZmV0Y2goKWAgaGlkZXMgSFRUUCByZWRpcmVjdHMgZnJvbSB0aGUgYXBwbGljYXRpb24uXG4gICAgICAgKlxuICAgICAgICogLSBTZXNzaW9uIGVuZHBvaW50ICgyeHgpOiBBdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UgVVJMcyAoZS5nLiBUT1RQLDJGQSkuXG4gICAgICAgKiAtIEhUVFAgMjA0OiBMb2dvdXQgcmVkaXJlY3QgVVJMcyAoZS5nLiBLZXljbG9hayBJZFAgbG9nb3V0KS4gUmVmZXI6IE9BLTQxICMxMjMxXG4gICAgICAgKi8gY29uc3QgbG9jYXRpb24gPSByZXNwb25zZS5oZWFkZXJzLmdldCgnbG9jYXRpb24nKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlZGlyZWN0ID0gZm9sbG93UmVkaXJlY3RzICYmIGxvY2F0aW9uICYmICh1cmwgPT09IG1ha2VVcmwoc2Vzc2lvbkVuZHBvaW50KSB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNCk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRvOiBsb2NhdGlvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgICAgICAgICAgLyogSFRUUCAyMDQgLSBObyBDb250ZW50XG4gICAgICAgICAqIFdlIHNob3VsZCBub3QgdHJ5IHRvIGRvd25sb2FkIHRoZSBlbXB0eSByZXNwb25zZSBhcyBqc29uLiBJbnN0ZWFkLFxuICAgICAgICAgKiB3ZSByZXR1cm4gbnVsbCBzaW5jZSB0aGVyZSBpcyBubyByZXNwb25zZSBib2R5LlxuICAgICAgICAgKi8gcmVzcG9uc2UuZGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBIVFRQIDIwMHMgLSBUaGUgcmVxdWVzdCBzdWNjZWVkZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuY2xvbmUoKS50ZXh0KCkudGhlbigocmVzcG9uc2VUZXh0KT0+e1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgZGlkbid0IHJlc3BvbmQgd2l0aCBqc29uXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogSFRUUCByZXNwb25zZSBzdGF0dXMgaXMgbm90IGluIDIwMHMuIFVzdWFsbHkgdGhpcyB3aWxsIG1lYW5cbiAgICAgICAqIGVpdGhlciBIVFRQIDQwMHMgKGJhZCByZXF1ZXN0IGZyb20gYnJvd3Nlcikgb3IgSFRUUCA1MDBzIChzZXJ2ZXIgZXJyb3IpXG4gICAgICAgKiBPdXIgZ29hbCBpcyB0byBjb21lIHVwIHdpdGggYmVzdCBwb3NzaWJsZSBzdGFja3RyYWNlIGFuZCBlcnJvciBtZXNzYWdlXG4gICAgICAgKiB0byBoZWxwIGRldmVsb3BlcnMgdW5kZXJzdGFuZCB0aGUgcHJvYmxlbSBhbmQgZGVidWdcbiAgICAgICAqLyAvKlxuICAgICAgICogUmVkaXJlY3QgdG8gZ2l2ZW4gdXJsIHdoZW4gcmVkaXJlY3Qgb24gYXV0aCBmYWlsdXJlIGlzIGVuYWJsZWRcbiAgICAgICAqLyBpZiAodXJsID09PSBtYWtlVXJsKHNlc3Npb25FbmRwb2ludCkgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDMgfHwgcmVkaXJlY3RBdXRoRmFpbHVyZS5lbmFibGVkICYmIHJlZGlyZWN0QXV0aEZhaWx1cmUuZXJyb3JzLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgICBjbGVhckhpc3RvcnkoKTtcbiAgICAgICAgICAgICAgICAvLyBieSBkZWZhdWx0LCByZWRpcmVjdCB0byB0aGUgdXJsIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnLlxuICAgICAgICAgICAgICAgIC8vIElmIGJsYW5rLCB1c2UgdGhlIGxvY2F0aW9uIGhlYWRlciBmcm9tIHRoZSByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGF0IGlzIGFsc28gYmxhbmssIHVzZSB0aGUgZGVmYXVsdCByZWRpcmVjdCB1cmwuXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSByZWRpcmVjdEF1dGhGYWlsdXJlLnVybCB8fCByZXNwb25zZS5oZWFkZXJzLmdldCgnbG9jYXRpb24nKSB8fCBkZWZhdWx0UmVkaXJlY3RBdXRoRmFpbHVyZVVybDtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRvOiBsb2NhdGlvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8qIFdlIHNvbWV0aW1lcyBkb24ndCByZWFsbHkgd2FudCB0aGlzIHByb21pc2UgdG8gcmVzb2x2ZSBzaW5jZSB0aGVyZSdzIG5vIHJlc3BvbnNlIGRhdGEsXG4gICAgICAgICAqIG5vciBkbyB3ZSB3YW50IGl0IHRvIHJlamVjdCBiZWNhdXNlIHRoYXQgd291bGQgdHJpZ2dlciBlcnJvciBoYW5kbGluZy4gV2UgaW5zdGVhZFxuICAgICAgICAgKiB3YW50IGl0IHRvIHJlbWFpbiBpbiBwZW5kaW5nIHN0YXR1cyB3aGlsZSB0aGUgbmF2aWdhdGlvbiBvY2N1cnMuXG4gICAgICAgICAqLyByZXR1cm4gcmVkaXJlY3RBdXRoRmFpbHVyZS5yZXNvbHZlUHJvbWlzZSA/IFByb21pc2UucmVzb2x2ZSgpIDogbmV3IFByb21pc2UoKCk9Pnt9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBkb3dubG9hZCBhIHJlc3BvbnNlIGJvZHksIGlmIGl0IGhhcyBvbmVcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuY2xvbmUoKS50ZXh0KCkudGhlbigocmVzcG9uc2VUZXh0KT0+e1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VCb2R5ID0gcmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5ID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGRpZG4ndCByZXNwb25kIHdpdGgganNvbiwgc28ganVzdCBnbyB3aXRoIHRoZSByZXNwb25zZSB0ZXh0IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgdGhlIGZldGNoIHByb21pc2UgZ28gaW50byBcInJlamVjdGVkXCIgc3RhdHVzLCB3aXRoIHRoZSBiZXN0XG4gICAgICAgICAgICAgICAqIHBvc3NpYmxlIHN0YWNrdHJhY2UgYW5kIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAqLyB0aHJvdyBuZXcgT3Blbm1yc0ZldGNoRXJyb3IodXJsLCByZXNwb25zZSwgcmVzcG9uc2VCb2R5LCByZXF1ZXN0U3RhY2t0cmFjZSk7XG4gICAgICAgICAgICAgICAgfSwgKGVycik9PntcbiAgICAgICAgICAgICAgICAgICAgLyogV2Ugd2VyZW4ndCBhYmxlIHRvIGRvd25sb2FkIGEgcmVzcG9uc2UgYm9keSBmb3IgdGhpcyBlcnJvci5cbiAgICAgICAgICAgICAgICogVGltZSB0byBqdXN0IGdpdmUgdGhlIGJlc3QgcG9zc2libGUgc3RhY2t0cmFjZSBhbmQgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICovIHRocm93IG5ldyBPcGVubXJzRmV0Y2hFcnJvcih1cmwsIHJlc3BvbnNlLCBudWxsLCByZXF1ZXN0U3RhY2t0cmFjZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBjbGFzcyBPcGVubXJzRmV0Y2hFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHJlc3BvbnNlLCByZXNwb25zZUJvZHksIHJlcXVlc3RTdGFja3RyYWNlKXtcbiAgICAgICAgc3VwZXIoKSwgX2RlZmluZV9wcm9wZXJ0eSh0aGlzLCBcInJlc3BvbnNlXCIsIHZvaWQgMCksIF9kZWZpbmVfcHJvcGVydHkodGhpcywgXCJyZXNwb25zZUJvZHlcIiwgdm9pZCAwKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gYFNlcnZlciByZXNwb25kZWQgd2l0aCAke3Jlc3BvbnNlLnN0YXR1c30gKCR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0pIGZvciB1cmwgJHt1cmx9LiBDaGVjayBlcnIucmVzcG9uc2VCb2R5IG9yIG5ldHdvcmsgdGFiIGluIGRldiB0b29scyBmb3IgbW9yZSBpbmZvYDtcbiAgICAgICAgcmVxdWVzdFN0YWNrdHJhY2UubWVzc2FnZSA9IHRoaXMubWVzc2FnZTtcbiAgICAgICAgdGhpcy5yZXNwb25zZUJvZHkgPSByZXNwb25zZUJvZHk7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zdGFjayA9IGBTdGFja3RyYWNlIGZvciBvdXRnb2luZyByZXF1ZXN0OlxcbiR7cmVxdWVzdFN0YWNrdHJhY2Uuc3RhY2t9XFxuU3RhY2t0cmFjZSBmb3IgaW5jb21pbmcgcmVzcG9uc2U6XFxuJHt0aGlzLnN0YWNrfWA7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIl9kZWZpbmVfcHJvcGVydHkiLCJvYmoiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImlzUGxhaW5PYmplY3QiLCJnZXRDb25maWciLCJjbGVhckhpc3RvcnkiLCJuYXZpZ2F0ZSIsImRlZmF1bHRSZWRpcmVjdEF1dGhGYWlsdXJlVXJsIiwicmVzdEJhc2VVcmwiLCJmaGlyQmFzZVVybCIsInNlc3Npb25FbmRwb2ludCIsIm1ha2VVcmwiLCJwYXRoIiwid2luZG93Iiwib3Blbm1yc0ZldGNoIiwiZmV0Y2hJbml0IiwiRXJyb3IiLCJ1cmwiLCJKU09OIiwidXJsVXJsIiwiVVJMIiwicmVxdWVzdFN0YWNrdHJhY2UiLCJyIiwicmVzcG9uc2UiLCJyZWRpcmVjdEF1dGhGYWlsdXJlIiwiZm9sbG93UmVkaXJlY3RzIiwibG9jYXRpb24iLCJzaG91bGRSZWRpcmVjdCIsInJlc3BvbnNlVGV4dCIsImVyciIsIlByb21pc2UiLCJyZXNwb25zZUJvZHkiLCJPcGVubXJzRmV0Y2hFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVNBLGlCQUFpQkMsR0FBRyxFQUFFQyxHQUFHLEVBQUVDLEtBQUs7SUFDckMsSUFBSUQsT0FBT0QsS0FBSztRQUNaRyxPQUFPLGNBQWMsQ0FBQ0gsS0FBS0MsS0FBSztZQUM1QixPQUFPQztZQUNQLFlBQVk7WUFDWixjQUFjO1lBQ2QsVUFBVTtRQUNkO0lBQ0osT0FBTztRQUNIRixHQUFHLENBQUNDLElBQUksR0FBR0M7SUFDZjtJQUNBLE9BQU9GO0FBQ1g7QUFDQSwwQkFBMEIsR0FBNkM7QUFDdkI7QUFDaUI7QUFDRTtBQUNuRSxpRUFBaUUsR0FBVSxNQUFNUyxjQUFjLGNBQWM7QUFDN0cscUVBQXFFLEdBQVUsTUFBTUMsY0FBYyxlQUFlO0FBQ2xILG9EQUFvRCxHQUFVLE1BQU1DLGtCQUFrQixHQUFHRixZQUFZLFFBQVEsQ0FBQyxDQUFDO0FBQy9HOzs7Ozs7Ozs7Ozs7O0NBYUMsR0FBVSxTQUFTRyxRQUFRQyxJQUFJO0lBQzVCLElBQUlBLFFBQVFBLEtBQUssVUFBVSxDQUFDLFNBQVM7UUFDakMsT0FBT0E7SUFDWCxPQUFPLElBQUlBLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSztRQUN4Qiw0QkFBNEI7UUFDNUJBLE9BQU8sTUFBTUE7SUFDakI7SUFDQSxPQUFPQyxPQUFPLFdBQVcsR0FBR0Q7QUFDaEM7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBZ0RDLEdBQVUsU0FBU0UsYUFBYUYsSUFBSSxFQUFFRyxZQUFZLENBQUMsQ0FBQztJQUNqRCxJQUFJLE9BQU9ILFNBQVMsVUFBVTtRQUMxQixNQUFNSSxNQUFNO0lBQ2hCO0lBQ0EsSUFBSSxPQUFPRCxjQUFjLFVBQVU7UUFDL0IsTUFBTUMsTUFBTTtJQUNoQjtJQUNBLElBQUksQ0FBQ0gsT0FBTyxXQUFXLEVBQUU7UUFDckIsTUFBTUcsTUFBTTtJQUNoQjtJQUNBLDJDQUEyQztJQUMzQyxJQUFJQyxNQUFNTixRQUFRQztJQUNsQixtQ0FBbUM7SUFDbkMsSUFBSSxDQUFDRyxVQUFVLE9BQU8sRUFBRTtRQUNwQkEsVUFBVSxPQUFPLEdBQUcsQ0FBQztJQUN6QjtJQUNBOztHQUVELEdBQUcsSUFBSVoseUNBQWFBLENBQUNZLFVBQVUsSUFBSSxHQUFHO1FBQ2pDQSxVQUFVLElBQUksR0FBR0csS0FBSyxTQUFTLENBQUNILFVBQVUsSUFBSTtJQUNsRDtJQUNBOzs7OztHQUtELEdBQUcsSUFBSSxPQUFPQSxVQUFVLE9BQU8sQ0FBQyxNQUFNLEtBQUssYUFBYTtRQUNuREEsVUFBVSxPQUFPLENBQUMsTUFBTSxHQUFHO0lBQy9CO0lBQ0EsSUFBSUEsVUFBVSxPQUFPLENBQUMsTUFBTSxLQUFLLE1BQU07UUFDbkMsT0FBT0EsVUFBVSxPQUFPLENBQUMsTUFBTTtJQUNuQztJQUNBOzs7R0FHRCxHQUFHLElBQUlILEtBQUssVUFBVSxDQUFDSixnQkFBZ0IsT0FBT08sVUFBVSxPQUFPLENBQUMsMkJBQTJCLEtBQUssYUFBYTtRQUN4R0EsVUFBVSxPQUFPLENBQUMsMkJBQTJCLEdBQUc7SUFDcEQ7SUFDQSxJQUFJSCxLQUFLLFVBQVUsQ0FBQ0gsY0FBYztRQUM5QixNQUFNVSxTQUFTLElBQUlDLElBQUlILEtBQUtKLE9BQU8sUUFBUSxDQUFDLFFBQVE7UUFDcEQsSUFBSSxDQUFDTSxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYTtZQUN0Q0EsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDcENGLE1BQU1FLE9BQU8sUUFBUTtRQUN6QjtJQUNKO0lBQ0E7Ozs7R0FJRCxHQUFHLE1BQU1FLG9CQUFvQkw7SUFDNUIsT0FBT0gsT0FBTyxLQUFLLENBQUNJLEtBQUtGLFdBQVcsSUFBSSxDQUFDLE9BQU9PO1FBQzVDLE1BQU1DLFdBQVdEO1FBQ2pCLE1BQU0sRUFBRUUsbUJBQW1CLEVBQUVDLGVBQWUsRUFBRSxHQUFHLE1BQU1yQixrREFBU0EsQ0FBQztRQUNqRSxJQUFJbUIsU0FBUyxFQUFFLEVBQUU7WUFDYjs7Ozs7O09BTUwsR0FBRyxNQUFNRyxXQUFXSCxTQUFTLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDcEMsTUFBTUksaUJBQWlCRixtQkFBbUJDLFlBQWFULENBQUFBLFFBQVFOLFFBQVFELG9CQUFvQmEsU0FBUyxNQUFNLEtBQUssR0FBRTtZQUNqSCxJQUFJSSxnQkFBZ0I7Z0JBQ2hCckIscURBQVFBLENBQUM7b0JBQ0wsSUFBSW9CO2dCQUNSO1lBQ0o7WUFDQSxJQUFJSCxTQUFTLE1BQU0sS0FBSyxLQUFLO2dCQUN6Qjs7O1NBR1AsR0FBR0EsU0FBUyxJQUFJLEdBQUc7Z0JBQ1osT0FBT0E7WUFDWCxPQUFPO2dCQUNILG9DQUFvQztnQkFDcEMsT0FBT0EsU0FBUyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDSztvQkFDakMsSUFBSTt3QkFDQSxJQUFJQSxjQUFjOzRCQUNkTCxTQUFTLElBQUksR0FBR0wsS0FBSyxLQUFLLENBQUNVO3dCQUMvQjtvQkFDSixFQUFFLE9BQU9DLEtBQUs7b0JBQ2Qsa0NBQWtDO29CQUNsQztvQkFDQSxPQUFPTjtnQkFDWDtZQUNKO1FBQ0osT0FBTztZQUNIOzs7O09BSUwsR0FBRzs7T0FFSCxHQUFHLElBQUlOLFFBQVFOLFFBQVFELG9CQUFvQmEsU0FBUyxNQUFNLEtBQUssT0FBT0Msb0JBQW9CLE9BQU8sSUFBSUEsb0JBQW9CLE1BQU0sQ0FBQyxRQUFRLENBQUNELFNBQVMsTUFBTSxHQUFHO2dCQUNsSmxCLHlEQUFZQTtnQkFDWiwyREFBMkQ7Z0JBQzNELHVEQUF1RDtnQkFDdkQsdURBQXVEO2dCQUN2RCxNQUFNcUIsV0FBV0Ysb0JBQW9CLEdBQUcsSUFBSUQsU0FBUyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWVoQixnRUFBNkJBO2dCQUM3R0QscURBQVFBLENBQUM7b0JBQ0wsSUFBSW9CO2dCQUNSO2dCQUNBOzs7U0FHUCxHQUFHLE9BQU9GLG9CQUFvQixjQUFjLEdBQUdNLFFBQVEsT0FBTyxLQUFLLElBQUlBLFFBQVEsS0FBSztZQUNqRixPQUFPO2dCQUNILHFEQUFxRDtnQkFDckQsT0FBT1AsU0FBUyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDSztvQkFDakMsSUFBSUcsZUFBZUg7b0JBQ25CLElBQUk7d0JBQ0FHLGVBQWViLEtBQUssS0FBSyxDQUFDVTtvQkFDOUIsRUFBRSxPQUFPQyxLQUFLO29CQUNkLDRFQUE0RTtvQkFDNUU7b0JBQ0E7O2VBRUwsR0FBRyxNQUFNLElBQUlHLGtCQUFrQmYsS0FBS00sVUFBVVEsY0FBY1Y7Z0JBQzNELEdBQUcsQ0FBQ1E7b0JBQ0E7O2VBRUwsR0FBRyxNQUFNLElBQUlHLGtCQUFrQmYsS0FBS00sVUFBVSxNQUFNRjtnQkFDbkQ7WUFDSjtRQUNKO0lBQ0o7QUFDSjtBQUNPLE1BQU1XLDBCQUEwQmhCO0lBQ25DLFlBQVlDLEdBQUcsRUFBRU0sUUFBUSxFQUFFUSxZQUFZLEVBQUVWLGlCQUFpQixDQUFDO1FBQ3ZELEtBQUssSUFBSXZCLGlCQUFpQixJQUFJLEVBQUUsWUFBWSxLQUFLLElBQUlBLGlCQUFpQixJQUFJLEVBQUUsZ0JBQWdCLEtBQUs7UUFDakcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixFQUFFeUIsU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFQSxTQUFTLFVBQVUsQ0FBQyxVQUFVLEVBQUVOLElBQUksa0VBQWtFLENBQUM7UUFDbktJLGtCQUFrQixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU87UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBR1U7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBR1I7UUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLGtDQUFrQyxFQUFFRixrQkFBa0IsS0FBSyxDQUFDLHFDQUFxQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUU7SUFDakk7QUFDSiJ9\n//# sourceURL=webpack-internal:///../../framework/esm-api/dist/openmrs-fetch.js\n\n}");
|
|
4479
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n OpenmrsFetchError: () => (OpenmrsFetchError),\n fhirBaseUrl: () => (fhirBaseUrl),\n makeUrl: () => (makeUrl),\n openmrsFetch: () => (openmrsFetch),\n restBaseUrl: () => (restBaseUrl),\n sessionEndpoint: () => (sessionEndpoint)\n});\n/* import */ var lodash_es__rspack_import_3 = __webpack_require__(\"../../../node_modules/lodash-es/isPlainObject.js\");\n/* import */ var _openmrs_esm_config__rspack_import_0 = __webpack_require__(\"../../framework/esm-config/dist/index.js\");\n/* import */ var _openmrs_esm_navigation__rspack_import_1 = __webpack_require__(\"../../framework/esm-navigation/dist/index.js\");\n/* import */ var _config_schema_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-api/dist/config-schema.js\");\nfunction _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/** @module @category API */ \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__rspack_import_3[\"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 */ let isRestRequest = false;\n try {\n const requestUrl = new URL(url, window.location.href);\n const restUrl = new URL(makeUrl(restBaseUrl), window.location.href);\n // Compare normalized paths without changing the outgoing URL. Pagination links\n // may omit the extra slash introduced by an openmrsBase with a trailing slash.\n const requestPath = requestUrl.pathname.replace(/\\/{2,}/g, '/');\n const restPath = restUrl.pathname.replace(/\\/{2,}/g, '/');\n isRestRequest = requestUrl.origin === restUrl.origin && (requestPath === restPath || requestPath.startsWith(`${restPath}/`));\n } catch {\n // Let native fetch reject malformed URLs instead of throwing synchronously here.\n }\n if (isRestRequest) {\n let hasAuthHeader = false;\n for (const [name, value] of Object.entries(fetchInit.headers)){\n if (name.toLowerCase() === 'disable-www-authenticate') {\n if (value === undefined) {\n // Remove every casing so fetch cannot combine \"undefined\" with the default.\n delete fetchInit.headers[name];\n } else {\n hasAuthHeader = true;\n }\n }\n }\n if (!hasAuthHeader) {\n fetchInit.headers['Disable-WWW-Authenticate'] = 'true';\n }\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__rspack_import_0.getConfig)('@openmrs/esm-api');\n if (response.ok) {\n /*\n * Backend modules can trigger SPA redirects by returning a `Location` header.\n * This is required because `fetch()` hides HTTP redirects from the application.\n *\n * - Session endpoint (2xx): Authentication challenge URLs (e.g. TOTP,2FA).\n * - HTTP 204: Logout redirect URLs (e.g. Keycloak IdP logout). Refer: OA-41 #1231\n */ const location = response.headers.get('location');\n const shouldRedirect = followRedirects && location && (url === makeUrl(sessionEndpoint) || response.status === 204);\n if (shouldRedirect) {\n (0,_openmrs_esm_navigation__rspack_import_1.navigate)({\n to: location\n });\n }\n if (response.status === 204) {\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__rspack_import_1.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__rspack_import_2.defaultRedirectAuthFailureUrl;\n (0,_openmrs_esm_navigation__rspack_import_1.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}\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\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyPz9ydWxlU2V0WzFdLnJ1bGVzWzVdLnVzZVswXSEvaG9tZS9ydW5uZXIvd29yay9vcGVubXJzLWVzbS1jb3JlL29wZW5tcnMtZXNtLWNvcmUvcGFja2FnZXMvZnJhbWV3b3JrL2VzbS1hcGkvZGlzdC9vcGVubXJzLWZldGNoLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLWFwaS9kaXN0L29wZW5tcnMtZmV0Y2guanM/YzhiNiJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZGVmaW5lX3Byb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG4vKiogQG1vZHVsZSBAY2F0ZWdvcnkgQVBJICovIGltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tIFwiQG9wZW5tcnMvZXNtLWNvbmZpZ1wiO1xuaW1wb3J0IHsgY2xlYXJIaXN0b3J5LCBuYXZpZ2F0ZSB9IGZyb20gXCJAb3Blbm1ycy9lc20tbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgZGVmYXVsdFJlZGlyZWN0QXV0aEZhaWx1cmVVcmwgfSBmcm9tIFwiLi9jb25maWctc2NoZW1hLmpzXCI7XG4vKiogVGhlIGJhc2UgVVJMIGZvciB0aGUgT3Blbk1SUyBSRVNUIEFQSSAoZS5nLiwgJy93cy9yZXN0L3YxJykuICovIGV4cG9ydCBjb25zdCByZXN0QmFzZVVybCA9ICcvd3MvcmVzdC92MSc7XG4vKiogVGhlIGJhc2UgVVJMIGZvciB0aGUgT3Blbk1SUyBGSElSIFI0IEFQSSAoZS5nLiwgJy93cy9maGlyMi9SNCcpLiAqLyBleHBvcnQgY29uc3QgZmhpckJhc2VVcmwgPSAnL3dzL2ZoaXIyL1I0Jztcbi8qKiBUaGUgZW5kcG9pbnQgZm9yIHNlc3Npb24gbWFuYWdlbWVudCBvcGVyYXRpb25zLiAqLyBleHBvcnQgY29uc3Qgc2Vzc2lvbkVuZHBvaW50ID0gYCR7cmVzdEJhc2VVcmx9L3Nlc3Npb25gO1xuLyoqXG4gKiBBcHBlbmQgYHBhdGhgIHRvIHRoZSBPcGVuTVJTIFNQQSBiYXNlLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGFwcGVuZCB0byB0aGUgT3Blbk1SUyBiYXNlIFVSTC5cbiAqIEByZXR1cm5zIFRoZSBmdWxsIFVSTCB3aXRoIHRoZSBPcGVuTVJTIGJhc2UgcHJlcGVuZGVkLiBJZiB0aGUgcGF0aCBpcyBhbHJlYWR5XG4gKiAgIGFuIGFic29sdXRlIFVSTCAoc3RhcnRpbmcgd2l0aCAnaHR0cCcpLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogbWFrZVVybCgnL2Zvby9iYXInKTtcbiAqIC8vID0+ICcvb3Blbm1ycy9mb28vYmFyJ1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIG1ha2VVcmwocGF0aCkge1xuICAgIGlmIChwYXRoICYmIHBhdGguc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH0gZWxzZSBpZiAocGF0aFswXSAhPT0gJy8nKSB7XG4gICAgICAgIC8vIGVuc3VyZSBwYXRoIHN0YXJ0cyB3aXRoIC9cbiAgICAgICAgcGF0aCA9ICcvJyArIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3cub3Blbm1yc0Jhc2UgKyBwYXRoO1xufVxuLyoqXG4gKiBUaGUgb3Blbm1yc0ZldGNoIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlXG4gKiBbYnJvd3NlcidzIGJ1aWx0LWluIGZldGNoIGZ1bmN0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJL1VzaW5nX0ZldGNoKSxcbiAqIHdpdGggZXh0cmEgaGFuZGxpbmcgZm9yIE9wZW5NUlMtc3BlY2lmaWMgQVBJIGJlaGF2aW9ycywgc3VjaCBhc1xuICogcmVxdWVzdCBoZWFkZXJzLCBhdXRoZW50aWNhdGlvbiwgYXV0aG9yaXphdGlvbiwgYW5kIHRoZSBBUEkgdXJscy5cbiAqXG4gKiBAcGFyYW0gcGF0aCBBIHN0cmluZyB1cmwgdG8gbWFrZSB0aGUgcmVxdWVzdCB0by4gTm90ZSB0aGF0IHRoZVxuICogICBvcGVubXJzIGJhc2UgdXJsIChieSBkZWZhdWx0IGAvb3Blbm1yc2ApIHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogICBwcmVwZW5kZWQgdG8gdGhlIFVSTCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlIGl0LlxuICogQHBhcmFtIGZldGNoSW5pdCBBIFtmZXRjaCBpbml0IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUvZmV0Y2gjU3ludGF4KS5cbiAqICAgTm90ZSB0aGF0IHRoZSBgYm9keWAgcHJvcGVydHkgZG9lcyBub3QgbmVlZCB0byBiZSBgSlNPTi5zdHJpbmdpZnkoKWBlZFxuICogICBiZWNhdXNlIG9wZW5tcnNGZXRjaCB3aWxsIGRvIHRoYXQgZm9yIHlvdS5cbiAqIEByZXR1cm5zIEEgW1Byb21pc2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2UpXG4gKiAgIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIFtSZXNwb25zZSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXNwb25zZSkuXG4gKiAgIE5vdGUgdGhhdCB0aGUgb3Blbm1ycyB2ZXJzaW9uIG9mIHRoZSBSZXNwb25zZSBvYmplY3QgaGFzIGFscmVhZHlcbiAqICAgZG93bmxvYWRlZCB0aGUgSFRUUCByZXNwb25zZSBib2R5IGFzIGpzb24sIGFuZCBoYXMgYW4gYWRkaXRpb25hbFxuICogICBgZGF0YWAgcHJvcGVydHkgd2l0aCB0aGUgSFRUUCByZXNwb25zZSBqc29uIGFzIGEgamF2YXNjcmlwdCBvYmplY3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBvcGVubXJzRmV0Y2ggfSBmcm9tICdAb3Blbm1ycy9lc20tYXBpJ1xuICogY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICogb3Blbm1yc0ZldGNoKGAke3Jlc3RCYXNlVXJsfS9zZXNzaW9uJywge3NpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbH0pXG4gKiAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhyZXNwb25zZS5kYXRhLmF1dGhlbnRpY2F0ZWQpXG4gKiAgIH0pXG4gKiAgIC5jYXRjaChlcnIgPT4ge1xuICogICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YXR1cyk7XG4gKiAgIH0pXG4gKiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAqIG9wZW5tcnNGZXRjaChgJHtyZXN0QmFzZVVybH0vc2Vzc2lvbicsIHtcbiAqICAgbWV0aG9kOiAnUE9TVCcsXG4gKiAgIGJvZHk6IHtcbiAqICAgICB1c2VybmFtZTogJ2hpJyxcbiAqICAgICBwYXNzd29yZDogJ3RoZXJlJyxcbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICpcbiAqICMjIyMgQ2FuY2VsbGF0aW9uXG4gKlxuICogVG8gY2FuY2VsIGEgbmV0d29yayByZXF1ZXN0LCB1c2UgYW5cbiAqIFtBYm9ydENvbnRyb2xsZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIvYWJvcnQpLlxuICogSXQgaXMgYmVzdCBwcmFjdGljZSB0byBjYW5jZWwgeW91ciBuZXR3b3JrIHJlcXVlc3RzIHdoZW4gdGhlIHVzZXJcbiAqIG5hdmlnYXRlcyBhd2F5IGZyb20gYSBwYWdlIHdoaWxlIHRoZSByZXF1ZXN0IGlzIHBlbmRpbmcgcmVxdWVzdCwgdG9cbiAqIGZyZWUgdXAgbWVtb3J5IGFuZCBuZXR3b3JrIHJlc291cmNlcyBhbmQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMuXG4gKlxuICogQGNhdGVnb3J5IEFQSVxuICovIGV4cG9ydCBmdW5jdGlvbiBvcGVubXJzRmV0Y2gocGF0aCwgZmV0Y2hJbml0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEVycm9yKFwiVGhlIGZpcnN0IGFyZ3VtZW50IHRvIEBvcGVubXJzL2FwaSdzIG9wZW5tcnNGZXRjaCBmdW5jdGlvbiBtdXN0IGJlIGEgdXJsIHN0cmluZ1wiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmZXRjaEluaXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IEVycm9yKFwiVGhlIHNlY29uZCBhcmd1bWVudCB0byBAb3Blbm1ycy9hcGkncyBvcGVubXJzRmV0Y2ggZnVuY3Rpb24gbXVzdCBiZSBhIHBsYWluIG9iamVjdC5cIik7XG4gICAgfVxuICAgIGlmICghd2luZG93Lm9wZW5tcnNCYXNlKSB7XG4gICAgICAgIHRocm93IEVycm9yKFwiQG9wZW5tcnMvYXBpIGlzIHJ1bm5pbmcgaW4gYSBicm93c2VyIHRoYXQgZG9lc24ndCBoYXZlIHdpbmRvdy5vcGVubXJzQmFzZSwgd2hpY2ggaXMgcHJvdmlkZWQgYnkgb3Blbm1ycy1tb2R1bGUtc3BhJ3MgSFRNTCBmaWxlLlwiKTtcbiAgICB9XG4gICAgLy8gUHJlZml4IHRoZSB1cmwgd2l0aCB0aGUgb3Blbm1ycyBzcGEgYmFzZVxuICAgIGxldCB1cmwgPSBtYWtlVXJsKHBhdGgpO1xuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIG5lZWQgc29tZSBoZWFkZXJzXG4gICAgaWYgKCFmZXRjaEluaXQuaGVhZGVycykge1xuICAgICAgICBmZXRjaEluaXQuaGVhZGVycyA9IHt9O1xuICAgIH1cbiAgICAvKiBBdXRvbWF0aWNhbGx5IHN0cmluZ2lmeSBqYXZhc2NyaXB0IG9iamVjdHMgYmVpbmcgc2VudCBpbiB0aGVcbiAgICogcmVxdWVzdCBib2R5LlxuICAgKi8gaWYgKGlzUGxhaW5PYmplY3QoZmV0Y2hJbml0LmJvZHkpKSB7XG4gICAgICAgIGZldGNoSW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZmV0Y2hJbml0LmJvZHkpO1xuICAgIH1cbiAgICAvKiBBZGQgYSByZXF1ZXN0IGhlYWRlciB0byB0ZWxsIHRoZSBzZXJ2ZXIgdG8gcmVzcG9uZCB3aXRoIGpzb24sXG4gICAqIHNpbmNlIGZyb250ZW5kIGNvZGUgYWxtb3N0IGFsd2F5cyB3YW50cyBqc29uIGFuZCB0aGUgT3Blbk1SU1xuICAgKiBzZXJ2ZXIgd29uJ3QgZ2l2ZSB5b3UganNvbiB1bmxlc3MgeW91IGV4cGxpY2l0bHkgYXNrIGZvciBpdC5cbiAgICogSWYgYSBkaWZmZXJlbnQgQWNjZXB0IGhlYWRlciBpcyBwcmVmZXJyZWQsIHBhc3MgaXQgaW50byB0aGUgZmV0Y2hJbml0LlxuICAgKiBJZiBubyBBY2NlcHQgaGVhZGVyIGlzIGRlc2lyZWQsIHBhc3MgaXQgaW4gZXhwbGljaXRseSBhcyBudWxsLlxuICAgKi8gaWYgKHR5cGVvZiBmZXRjaEluaXQuaGVhZGVycy5BY2NlcHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZldGNoSW5pdC5oZWFkZXJzLkFjY2VwdCA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgICB9XG4gICAgaWYgKGZldGNoSW5pdC5oZWFkZXJzLkFjY2VwdCA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgZmV0Y2hJbml0LmhlYWRlcnMuQWNjZXB0O1xuICAgIH1cbiAgICAvKiBUaGlzIHRlbGxzIHRoZSBPcGVuTVJTIFJFU1QgQVBJIG5vdCB0byByZXR1cm4gYSBXV1ctQXV0aGVudGljYXRlXG4gICAqIGhlYWRlci4gUmV0dXJuaW5nIHRoYXQgaGVhZGVyIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIHRoZSBBUEksIGJ1dFxuICAgKiBub3QgZnJvbSBhIFVJLlxuICAgKi8gbGV0IGlzUmVzdFJlcXVlc3QgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXF1ZXN0VXJsID0gbmV3IFVSTCh1cmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcmVzdFVybCA9IG5ldyBVUkwobWFrZVVybChyZXN0QmFzZVVybCksIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgLy8gQ29tcGFyZSBub3JtYWxpemVkIHBhdGhzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG91dGdvaW5nIFVSTC4gUGFnaW5hdGlvbiBsaW5rc1xuICAgICAgICAvLyBtYXkgb21pdCB0aGUgZXh0cmEgc2xhc2ggaW50cm9kdWNlZCBieSBhbiBvcGVubXJzQmFzZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVxdWVzdFVybC5wYXRobmFtZS5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7XG4gICAgICAgIGNvbnN0IHJlc3RQYXRoID0gcmVzdFVybC5wYXRobmFtZS5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7XG4gICAgICAgIGlzUmVzdFJlcXVlc3QgPSByZXF1ZXN0VXJsLm9yaWdpbiA9PT0gcmVzdFVybC5vcmlnaW4gJiYgKHJlcXVlc3RQYXRoID09PSByZXN0UGF0aCB8fCByZXF1ZXN0UGF0aC5zdGFydHNXaXRoKGAke3Jlc3RQYXRofS9gKSk7XG4gICAgfSBjYXRjaCAge1xuICAgIC8vIExldCBuYXRpdmUgZmV0Y2ggcmVqZWN0IG1hbGZvcm1lZCBVUkxzIGluc3RlYWQgb2YgdGhyb3dpbmcgc3luY2hyb25vdXNseSBoZXJlLlxuICAgIH1cbiAgICBpZiAoaXNSZXN0UmVxdWVzdCkge1xuICAgICAgICBsZXQgaGFzQXV0aEhlYWRlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmV0Y2hJbml0LmhlYWRlcnMpKXtcbiAgICAgICAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkaXNhYmxlLXd3dy1hdXRoZW50aWNhdGUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV2ZXJ5IGNhc2luZyBzbyBmZXRjaCBjYW5ub3QgY29tYmluZSBcInVuZGVmaW5lZFwiIHdpdGggdGhlIGRlZmF1bHQuXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmZXRjaEluaXQuaGVhZGVyc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoYXNBdXRoSGVhZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoYXNBdXRoSGVhZGVyKSB7XG4gICAgICAgICAgICBmZXRjaEluaXQuaGVhZGVyc1snRGlzYWJsZS1XV1ctQXV0aGVudGljYXRlJ10gPSAndHJ1ZSc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChmaGlyQmFzZVVybCkpIHtcbiAgICAgICAgY29uc3QgdXJsVXJsID0gbmV3IFVSTCh1cmwsIHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKCF1cmxVcmwuc2VhcmNoUGFyYW1zLmhhcygnX3N1bW1hcnknKSkge1xuICAgICAgICAgICAgdXJsVXJsLnNlYXJjaFBhcmFtcy5zZXQoJ19zdW1tYXJ5JywgJ2RhdGEnKTtcbiAgICAgICAgICAgIHVybCA9IHVybFVybC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qIFdlIGNhcHR1cmUgdGhlIHN0YWNrdHJhY2UgYmVmb3JlIG1ha2luZyB0aGUgcmVxdWVzdCwgc28gdGhhdCBpZiBhbiBlcnJvciBvY2N1cnMgd2UgY2FuXG4gICAqIGxvZyBhIGZ1bGwgc3RhY2t0cmFjZSB0aGF0IGluY2x1ZGVzIHRoZSBjb2RlIHRoYXQgbWFkZSB0aGUgcmVxdWVzdCBhbmQgaGFuZGxlZCB0aGUgcmVzcG9uc2VcbiAgICogT3RoZXJ3aXNlLCB3ZSBjb3VsZCBydW4gaW50byBzaXR1YXRpb25zIHdoZXJlIHRoZSBzdGFja3RyYWNlIGRvZXNuJ3QgZXZlbiBzaG93IHdoaWNoIGNvZGVcbiAgICogY2FsbGVkIEBvcGVubXJzL2FwaS5cbiAgICovIGNvbnN0IHJlcXVlc3RTdGFja3RyYWNlID0gRXJyb3IoKTtcbiAgICByZXR1cm4gd2luZG93LmZldGNoKHVybCwgZmV0Y2hJbml0KS50aGVuKGFzeW5jIChyKT0+e1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHI7XG4gICAgICAgIGNvbnN0IHsgcmVkaXJlY3RBdXRoRmFpbHVyZSwgZm9sbG93UmVkaXJlY3RzIH0gPSBhd2FpdCBnZXRDb25maWcoJ0BvcGVubXJzL2VzbS1hcGknKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICogQmFja2VuZCBtb2R1bGVzIGNhbiB0cmlnZ2VyIFNQQSByZWRpcmVjdHMgYnkgcmV0dXJuaW5nIGEgYExvY2F0aW9uYCBoZWFkZXIuXG4gICAgICAgKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgYGZldGNoKClgIGhpZGVzIEhUVFAgcmVkaXJlY3RzIGZyb20gdGhlIGFwcGxpY2F0aW9uLlxuICAgICAgICpcbiAgICAgICAqIC0gU2Vzc2lvbiBlbmRwb2ludCAoMnh4KTogQXV0aGVudGljYXRpb24gY2hhbGxlbmdlIFVSTHMgKGUuZy4gVE9UUCwyRkEpLlxuICAgICAgICogLSBIVFRQIDIwNDogTG9nb3V0IHJlZGlyZWN0IFVSTHMgKGUuZy4gS2V5Y2xvYWsgSWRQIGxvZ291dCkuIFJlZmVyOiBPQS00MSAjMTIzMVxuICAgICAgICovIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2xvY2F0aW9uJyk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZWRpcmVjdCA9IGZvbGxvd1JlZGlyZWN0cyAmJiBsb2NhdGlvbiAmJiAodXJsID09PSBtYWtlVXJsKHNlc3Npb25FbmRwb2ludCkgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpO1xuICAgICAgICAgICAgaWYgKHNob3VsZFJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgbmF2aWdhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0bzogbG9jYXRpb25cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgICAgICAgICAgICAgIC8qIEhUVFAgMjA0IC0gTm8gQ29udGVudFxuICAgICAgICAgKiBXZSBzaG91bGQgbm90IHRyeSB0byBkb3dubG9hZCB0aGUgZW1wdHkgcmVzcG9uc2UgYXMganNvbi4gSW5zdGVhZCxcbiAgICAgICAgICogd2UgcmV0dXJuIG51bGwgc2luY2UgdGhlcmUgaXMgbm8gcmVzcG9uc2UgYm9keS5cbiAgICAgICAgICovIHJlc3BvbnNlLmRhdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSFRUUCAyMDBzIC0gVGhlIHJlcXVlc3Qgc3VjY2VlZGVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmNsb25lKCkudGV4dCgpLnRoZW4oKHJlc3BvbnNlVGV4dCk9PntcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGRpZG4ndCByZXNwb25kIHdpdGgganNvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGlzIG5vdCBpbiAyMDBzLiBVc3VhbGx5IHRoaXMgd2lsbCBtZWFuXG4gICAgICAgKiBlaXRoZXIgSFRUUCA0MDBzIChiYWQgcmVxdWVzdCBmcm9tIGJyb3dzZXIpIG9yIEhUVFAgNTAwcyAoc2VydmVyIGVycm9yKVxuICAgICAgICogT3VyIGdvYWwgaXMgdG8gY29tZSB1cCB3aXRoIGJlc3QgcG9zc2libGUgc3RhY2t0cmFjZSBhbmQgZXJyb3IgbWVzc2FnZVxuICAgICAgICogdG8gaGVscCBkZXZlbG9wZXJzIHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gYW5kIGRlYnVnXG4gICAgICAgKi8gLypcbiAgICAgICAqIFJlZGlyZWN0IHRvIGdpdmVuIHVybCB3aGVuIHJlZGlyZWN0IG9uIGF1dGggZmFpbHVyZSBpcyBlbmFibGVkXG4gICAgICAgKi8gaWYgKHVybCA9PT0gbWFrZVVybChzZXNzaW9uRW5kcG9pbnQpICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzIHx8IHJlZGlyZWN0QXV0aEZhaWx1cmUuZW5hYmxlZCAmJiByZWRpcmVjdEF1dGhGYWlsdXJlLmVycm9ycy5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJIaXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgcmVkaXJlY3QgdG8gdGhlIHVybCBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZy5cbiAgICAgICAgICAgICAgICAvLyBJZiBibGFuaywgdXNlIHRoZSBsb2NhdGlvbiBoZWFkZXIgZnJvbSB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhhdCBpcyBhbHNvIGJsYW5rLCB1c2UgdGhlIGRlZmF1bHQgcmVkaXJlY3QgdXJsLlxuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcmVkaXJlY3RBdXRoRmFpbHVyZS51cmwgfHwgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2xvY2F0aW9uJykgfHwgZGVmYXVsdFJlZGlyZWN0QXV0aEZhaWx1cmVVcmw7XG4gICAgICAgICAgICAgICAgbmF2aWdhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0bzogbG9jYXRpb25cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvKiBXZSBzb21ldGltZXMgZG9uJ3QgcmVhbGx5IHdhbnQgdGhpcyBwcm9taXNlIHRvIHJlc29sdmUgc2luY2UgdGhlcmUncyBubyByZXNwb25zZSBkYXRhLFxuICAgICAgICAgKiBub3IgZG8gd2Ugd2FudCBpdCB0byByZWplY3QgYmVjYXVzZSB0aGF0IHdvdWxkIHRyaWdnZXIgZXJyb3IgaGFuZGxpbmcuIFdlIGluc3RlYWRcbiAgICAgICAgICogd2FudCBpdCB0byByZW1haW4gaW4gcGVuZGluZyBzdGF0dXMgd2hpbGUgdGhlIG5hdmlnYXRpb24gb2NjdXJzLlxuICAgICAgICAgKi8gcmV0dXJuIHJlZGlyZWN0QXV0aEZhaWx1cmUucmVzb2x2ZVByb21pc2UgPyBQcm9taXNlLnJlc29sdmUoKSA6IG5ldyBQcm9taXNlKCgpPT57fSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZG93bmxvYWQgYSByZXNwb25zZSBib2R5LCBpZiBpdCBoYXMgb25lXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmNsb25lKCkudGV4dCgpLnRoZW4oKHJlc3BvbnNlVGV4dCk9PntcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBkaWRuJ3QgcmVzcG9uZCB3aXRoIGpzb24sIHNvIGp1c3QgZ28gd2l0aCB0aGUgcmVzcG9uc2UgdGV4dCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHRoZSBmZXRjaCBwcm9taXNlIGdvIGludG8gXCJyZWplY3RlZFwiIHN0YXR1cywgd2l0aCB0aGUgYmVzdFxuICAgICAgICAgICAgICAgKiBwb3NzaWJsZSBzdGFja3RyYWNlIGFuZCBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgICAgICAgKi8gdGhyb3cgbmV3IE9wZW5tcnNGZXRjaEVycm9yKHVybCwgcmVzcG9uc2UsIHJlc3BvbnNlQm9keSwgcmVxdWVzdFN0YWNrdHJhY2UpO1xuICAgICAgICAgICAgICAgIH0sIChlcnIpPT57XG4gICAgICAgICAgICAgICAgICAgIC8qIFdlIHdlcmVuJ3QgYWJsZSB0byBkb3dubG9hZCBhIHJlc3BvbnNlIGJvZHkgZm9yIHRoaXMgZXJyb3IuXG4gICAgICAgICAgICAgICAqIFRpbWUgdG8ganVzdCBnaXZlIHRoZSBiZXN0IHBvc3NpYmxlIHN0YWNrdHJhY2UgYW5kIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAqLyB0aHJvdyBuZXcgT3Blbm1yc0ZldGNoRXJyb3IodXJsLCByZXNwb25zZSwgbnVsbCwgcmVxdWVzdFN0YWNrdHJhY2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgY2xhc3MgT3Blbm1yc0ZldGNoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IodXJsLCByZXNwb25zZSwgcmVzcG9uc2VCb2R5LCByZXF1ZXN0U3RhY2t0cmFjZSl7XG4gICAgICAgIHN1cGVyKCksIF9kZWZpbmVfcHJvcGVydHkodGhpcywgXCJyZXNwb25zZVwiLCB2b2lkIDApLCBfZGVmaW5lX3Byb3BlcnR5KHRoaXMsIFwicmVzcG9uc2VCb2R5XCIsIHZvaWQgMCk7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IGBTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggJHtyZXNwb25zZS5zdGF0dXN9ICgke3Jlc3BvbnNlLnN0YXR1c1RleHR9KSBmb3IgdXJsICR7dXJsfS4gQ2hlY2sgZXJyLnJlc3BvbnNlQm9keSBvciBuZXR3b3JrIHRhYiBpbiBkZXYgdG9vbHMgZm9yIG1vcmUgaW5mb2A7XG4gICAgICAgIHJlcXVlc3RTdGFja3RyYWNlLm1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2U7XG4gICAgICAgIHRoaXMucmVzcG9uc2VCb2R5ID0gcmVzcG9uc2VCb2R5O1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBgU3RhY2t0cmFjZSBmb3Igb3V0Z29pbmcgcmVxdWVzdDpcXG4ke3JlcXVlc3RTdGFja3RyYWNlLnN0YWNrfVxcblN0YWNrdHJhY2UgZm9yIGluY29taW5nIHJlc3BvbnNlOlxcbiR7dGhpcy5zdGFja31gO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJfZGVmaW5lX3Byb3BlcnR5Iiwib2JqIiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJpc1BsYWluT2JqZWN0IiwiZ2V0Q29uZmlnIiwiY2xlYXJIaXN0b3J5IiwibmF2aWdhdGUiLCJkZWZhdWx0UmVkaXJlY3RBdXRoRmFpbHVyZVVybCIsInJlc3RCYXNlVXJsIiwiZmhpckJhc2VVcmwiLCJzZXNzaW9uRW5kcG9pbnQiLCJtYWtlVXJsIiwicGF0aCIsIndpbmRvdyIsIm9wZW5tcnNGZXRjaCIsImZldGNoSW5pdCIsIkVycm9yIiwidXJsIiwiSlNPTiIsImlzUmVzdFJlcXVlc3QiLCJyZXF1ZXN0VXJsIiwiVVJMIiwicmVzdFVybCIsInJlcXVlc3RQYXRoIiwicmVzdFBhdGgiLCJoYXNBdXRoSGVhZGVyIiwibmFtZSIsInVuZGVmaW5lZCIsInVybFVybCIsInJlcXVlc3RTdGFja3RyYWNlIiwiciIsInJlc3BvbnNlIiwicmVkaXJlY3RBdXRoRmFpbHVyZSIsImZvbGxvd1JlZGlyZWN0cyIsImxvY2F0aW9uIiwic2hvdWxkUmVkaXJlY3QiLCJyZXNwb25zZVRleHQiLCJlcnIiLCJQcm9taXNlIiwicmVzcG9uc2VCb2R5IiwiT3Blbm1yc0ZldGNoRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTQSxpQkFBaUJDLEdBQUcsRUFBRUMsR0FBRyxFQUFFQyxLQUFLO0lBQ3JDLElBQUlELE9BQU9ELEtBQUs7UUFDWkcsT0FBTyxjQUFjLENBQUNILEtBQUtDLEtBQUs7WUFDNUIsT0FBT0M7WUFDUCxZQUFZO1lBQ1osY0FBYztZQUNkLFVBQVU7UUFDZDtJQUNKLE9BQU87UUFDSEYsR0FBRyxDQUFDQyxJQUFJLEdBQUdDO0lBQ2Y7SUFDQSxPQUFPRjtBQUNYO0FBQ0EsMEJBQTBCLEdBQTZDO0FBQ3ZCO0FBQ2lCO0FBQ0U7QUFDbkUsaUVBQWlFLEdBQVUsTUFBTVMsY0FBYyxjQUFjO0FBQzdHLHFFQUFxRSxHQUFVLE1BQU1DLGNBQWMsZUFBZTtBQUNsSCxvREFBb0QsR0FBVSxNQUFNQyxrQkFBa0IsR0FBR0YsWUFBWSxRQUFRLENBQUMsQ0FBQztBQUMvRzs7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\n//# sourceURL=webpack-internal:///../../framework/esm-api/dist/openmrs-fetch.js\n\n}");
|
|
4480
4480
|
|
|
4481
4481
|
},
|
|
4482
4482
|
"../../framework/esm-api/dist/setup.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
|