@eui/core 15.4.1 → 15.4.2

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 (213) hide show
  1. package/LICENSE +296 -296
  2. package/README.md +26 -26
  3. package/assets/i18n-eui/bg.json +114 -114
  4. package/assets/i18n-eui/cs.json +114 -114
  5. package/assets/i18n-eui/da.json +114 -114
  6. package/assets/i18n-eui/de.json +114 -114
  7. package/assets/i18n-eui/el.json +114 -114
  8. package/assets/i18n-eui/en.json +113 -113
  9. package/assets/i18n-eui/es.json +114 -114
  10. package/assets/i18n-eui/et.json +114 -114
  11. package/assets/i18n-eui/fi.json +114 -114
  12. package/assets/i18n-eui/fr.json +114 -114
  13. package/assets/i18n-eui/ga.json +114 -114
  14. package/assets/i18n-eui/hr.json +114 -114
  15. package/assets/i18n-eui/hu.json +114 -114
  16. package/assets/i18n-eui/it.json +114 -114
  17. package/assets/i18n-eui/lt.json +114 -114
  18. package/assets/i18n-eui/lv.json +114 -114
  19. package/assets/i18n-eui/mt.json +114 -114
  20. package/assets/i18n-eui/nl.json +114 -114
  21. package/assets/i18n-eui/pl.json +114 -114
  22. package/assets/i18n-eui/pt.json +114 -114
  23. package/assets/i18n-eui/ro.json +114 -114
  24. package/assets/i18n-eui/sk.json +114 -114
  25. package/assets/i18n-eui/sl.json +114 -114
  26. package/assets/i18n-eui/sv.json +114 -114
  27. package/docs/classes/RouterMock.html +5 -5
  28. package/docs/dependencies.html +7 -95
  29. package/docs/index.html +59 -36
  30. package/docs/injectables/CoreAppEffects.html +51 -51
  31. package/docs/js/menu-wc.js +7 -12
  32. package/docs/js/menu-wc_es5.js +1 -1
  33. package/docs/js/search/search_index.js +2 -2
  34. package/docs/miscellaneous/variables.html +1211 -1211
  35. package/esm2020/eui-core.mjs +4 -4
  36. package/esm2020/index.mjs +13 -13
  37. package/esm2020/lib/eui-core.module.mjs +78 -78
  38. package/esm2020/lib/helpers/date-helpers.mjs +3 -3
  39. package/esm2020/lib/helpers/dom-helpers.mjs +87 -87
  40. package/esm2020/lib/helpers/event-helpers.mjs +9 -9
  41. package/esm2020/lib/helpers/form-helpers.mjs +42 -42
  42. package/esm2020/lib/helpers/format-helpers.mjs +66 -66
  43. package/esm2020/lib/helpers/http-helpers.mjs +7 -7
  44. package/esm2020/lib/helpers/index.mjs +8 -8
  45. package/esm2020/lib/helpers/utils.mjs +7 -7
  46. package/esm2020/lib/interceptors/add-lang-param.interceptor.mjs +35 -35
  47. package/esm2020/lib/interceptors/cache-prevention.interceptor.mjs +21 -21
  48. package/esm2020/lib/interceptors/cors-security.interceptor.mjs +15 -15
  49. package/esm2020/lib/interceptors/csrf-prevention.interceptor.mjs +15 -15
  50. package/esm2020/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +72 -72
  51. package/esm2020/lib/interceptors/index.mjs +8 -8
  52. package/esm2020/lib/interceptors/openid/index.mjs +4 -4
  53. package/esm2020/lib/interceptors/openid/openid-connect.interceptor.mjs +149 -149
  54. package/esm2020/lib/interceptors/openid/openid-connect.service.mjs +56 -56
  55. package/esm2020/lib/interceptors/openid/openid-connect.service.mock.mjs +8 -8
  56. package/esm2020/lib/interceptors/ux-request-error-model.interceptor.mjs +31 -31
  57. package/esm2020/lib/services/app/eui-init-app.mjs +29 -29
  58. package/esm2020/lib/services/app/eui-pre-init-app.mjs +43 -43
  59. package/esm2020/lib/services/app/eui-startup.mjs +40 -40
  60. package/esm2020/lib/services/app/factories/log.mjs +55 -55
  61. package/esm2020/lib/services/app/index.mjs +2 -2
  62. package/esm2020/lib/services/config/defaults.mjs +68 -68
  63. package/esm2020/lib/services/config/tokens.mjs +74 -74
  64. package/esm2020/lib/services/errors/eui.error.mjs +38 -38
  65. package/esm2020/lib/services/errors/global-error-handler.mjs +24 -24
  66. package/esm2020/lib/services/errors/http-error-handler-callback-functions.mjs +17 -17
  67. package/esm2020/lib/services/errors/http-error-handler.interceptor.mjs +55 -55
  68. package/esm2020/lib/services/errors/index.mjs +5 -5
  69. package/esm2020/lib/services/i18n/i18n.loader.mjs +198 -198
  70. package/esm2020/lib/services/i18n/i18n.resource.mjs +43 -43
  71. package/esm2020/lib/services/i18n/i18n.service.mjs +228 -228
  72. package/esm2020/lib/services/i18n/i18n.service.mock.mjs +38 -38
  73. package/esm2020/lib/services/i18n/index.mjs +6 -6
  74. package/esm2020/lib/services/index.mjs +19 -19
  75. package/esm2020/lib/services/locale/index.mjs +3 -3
  76. package/esm2020/lib/services/locale/locale.service.mjs +232 -232
  77. package/esm2020/lib/services/locale/locale.service.mock.mjs +43 -43
  78. package/esm2020/lib/services/log/index.mjs +4 -4
  79. package/esm2020/lib/services/log/log.module.mjs +38 -38
  80. package/esm2020/lib/services/log/log.service.mjs +51 -51
  81. package/esm2020/lib/services/log/log.service.mock.mjs +7 -7
  82. package/esm2020/lib/services/permission/permission.service.mjs +110 -110
  83. package/esm2020/lib/services/queue/api-queue.service.mjs +137 -137
  84. package/esm2020/lib/services/queue/api-queue.service.mock.mjs +23 -23
  85. package/esm2020/lib/services/queue/index.mjs +3 -3
  86. package/esm2020/lib/services/storage/async-storage.service.mjs +17 -17
  87. package/esm2020/lib/services/storage/async-storage.service.mock.mjs +22 -22
  88. package/esm2020/lib/services/storage/index.mjs +8 -8
  89. package/esm2020/lib/services/storage/local-forage.service.mjs +93 -93
  90. package/esm2020/lib/services/storage/local-storage.service.mjs +75 -75
  91. package/esm2020/lib/services/storage/session-storage.service.mjs +75 -75
  92. package/esm2020/lib/services/storage/storage.service.mjs +6 -6
  93. package/esm2020/lib/services/storage/storage.service.mock.mjs +12 -12
  94. package/esm2020/lib/services/store/actions/app.actions.mjs +74 -74
  95. package/esm2020/lib/services/store/actions/i18n.actions.mjs +11 -11
  96. package/esm2020/lib/services/store/actions/index.mjs +6 -6
  97. package/esm2020/lib/services/store/actions/locale.actions.mjs +11 -11
  98. package/esm2020/lib/services/store/actions/notifications.actions.mjs +11 -11
  99. package/esm2020/lib/services/store/actions/user.actions.mjs +39 -39
  100. package/esm2020/lib/services/store/effects/app.effects.mjs +55 -55
  101. package/esm2020/lib/services/store/effects/index.mjs +4 -4
  102. package/esm2020/lib/services/store/index.mjs +6 -6
  103. package/esm2020/lib/services/store/reducers/app.reducers.mjs +56 -56
  104. package/esm2020/lib/services/store/reducers/core.reducers.mjs +13 -13
  105. package/esm2020/lib/services/store/reducers/i18n.reducers.mjs +16 -16
  106. package/esm2020/lib/services/store/reducers/index.mjs +8 -8
  107. package/esm2020/lib/services/store/reducers/locale.reducers.mjs +16 -16
  108. package/esm2020/lib/services/store/reducers/meta.reducers.mjs +89 -89
  109. package/esm2020/lib/services/store/reducers/notifications.reducers.mjs +13 -13
  110. package/esm2020/lib/services/store/reducers/user.reducers.mjs +43 -43
  111. package/esm2020/lib/services/store/store.service.mjs +112 -112
  112. package/esm2020/lib/services/store/store.service.mock.mjs +22 -22
  113. package/esm2020/lib/services/user/index.mjs +3 -3
  114. package/esm2020/lib/services/user/user.service.mjs +64 -64
  115. package/esm2020/lib/services/user/user.service.mock.mjs +32 -32
  116. package/esm2020/lib/services/ux-app-shell.service.mjs +690 -690
  117. package/esm2020/lib/services/ux-dynamic-component/ux-dynamic-component.service.mjs +63 -63
  118. package/esm2020/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.mjs +66 -66
  119. package/esm2020/lib/services/ux-error-feedback/ux-error-feedback.service.mjs +99 -99
  120. package/esm2020/lib/services/ux-error-feedback/ux-error-handler.operator.mjs +16 -16
  121. package/esm2020/lib/services/ux-timezone.service.mjs +716 -716
  122. package/fesm2015/eui-core.mjs +4484 -4484
  123. package/fesm2015/eui-core.mjs.map +1 -1
  124. package/fesm2020/eui-core.mjs +4538 -4538
  125. package/fesm2020/eui-core.mjs.map +1 -1
  126. package/index.d.ts +5 -5
  127. package/lib/eui-core.module.d.ts +20 -20
  128. package/lib/helpers/date-helpers.d.ts +2 -2
  129. package/lib/helpers/dom-helpers.d.ts +26 -26
  130. package/lib/helpers/event-helpers.d.ts +1 -1
  131. package/lib/helpers/form-helpers.d.ts +10 -10
  132. package/lib/helpers/format-helpers.d.ts +12 -12
  133. package/lib/helpers/http-helpers.d.ts +2 -2
  134. package/lib/helpers/index.d.ts +7 -7
  135. package/lib/helpers/utils.d.ts +6 -6
  136. package/lib/interceptors/add-lang-param.interceptor.d.ts +16 -16
  137. package/lib/interceptors/cache-prevention.interceptor.d.ts +8 -8
  138. package/lib/interceptors/cors-security.interceptor.d.ts +8 -8
  139. package/lib/interceptors/csrf-prevention.interceptor.d.ts +8 -8
  140. package/lib/interceptors/eu-login-session-timeout-handling.interceptor.d.ts +12 -12
  141. package/lib/interceptors/index.d.ts +7 -7
  142. package/lib/interceptors/openid/index.d.ts +3 -3
  143. package/lib/interceptors/openid/openid-connect.interceptor.d.ts +14 -14
  144. package/lib/interceptors/openid/openid-connect.service.d.ts +17 -17
  145. package/lib/interceptors/openid/openid-connect.service.mock.d.ts +5 -5
  146. package/lib/interceptors/ux-request-error-model.interceptor.d.ts +13 -13
  147. package/lib/services/app/eui-init-app.d.ts +2 -2
  148. package/lib/services/app/eui-pre-init-app.d.ts +16 -16
  149. package/lib/services/app/eui-startup.d.ts +4 -4
  150. package/lib/services/app/factories/log.d.ts +25 -25
  151. package/lib/services/app/index.d.ts +1 -1
  152. package/lib/services/config/defaults.d.ts +11 -11
  153. package/lib/services/config/tokens.d.ts +19 -19
  154. package/lib/services/errors/eui.error.d.ts +15 -15
  155. package/lib/services/errors/global-error-handler.d.ts +10 -10
  156. package/lib/services/errors/http-error-handler-callback-functions.d.ts +6 -6
  157. package/lib/services/errors/http-error-handler.interceptor.d.ts +22 -22
  158. package/lib/services/errors/index.d.ts +4 -4
  159. package/lib/services/i18n/i18n.loader.d.ts +79 -79
  160. package/lib/services/i18n/i18n.resource.d.ts +35 -35
  161. package/lib/services/i18n/i18n.service.d.ts +73 -73
  162. package/lib/services/i18n/i18n.service.mock.d.ts +19 -19
  163. package/lib/services/i18n/index.d.ts +4 -4
  164. package/lib/services/index.d.ts +18 -18
  165. package/lib/services/locale/index.d.ts +2 -2
  166. package/lib/services/locale/locale.service.d.ts +68 -68
  167. package/lib/services/locale/locale.service.mock.d.ts +15 -15
  168. package/lib/services/log/index.d.ts +3 -3
  169. package/lib/services/log/log.module.d.ts +15 -15
  170. package/lib/services/log/log.service.d.ts +27 -27
  171. package/lib/services/log/log.service.mock.d.ts +4 -4
  172. package/lib/services/permission/permission.service.d.ts +52 -52
  173. package/lib/services/queue/api-queue.service.d.ts +76 -76
  174. package/lib/services/queue/api-queue.service.mock.d.ts +13 -13
  175. package/lib/services/queue/index.d.ts +2 -2
  176. package/lib/services/storage/async-storage.service.d.ts +44 -44
  177. package/lib/services/storage/async-storage.service.mock.d.ts +11 -11
  178. package/lib/services/storage/index.d.ts +7 -7
  179. package/lib/services/storage/local-forage.service.d.ts +48 -48
  180. package/lib/services/storage/local-storage.service.d.ts +34 -34
  181. package/lib/services/storage/session-storage.service.d.ts +34 -34
  182. package/lib/services/storage/storage.service.d.ts +28 -28
  183. package/lib/services/storage/storage.service.mock.d.ts +7 -7
  184. package/lib/services/store/actions/app.actions.d.ts +82 -82
  185. package/lib/services/store/actions/i18n.actions.d.ts +11 -11
  186. package/lib/services/store/actions/index.d.ts +5 -5
  187. package/lib/services/store/actions/locale.actions.d.ts +11 -11
  188. package/lib/services/store/actions/notifications.actions.d.ts +10 -10
  189. package/lib/services/store/actions/user.actions.d.ts +35 -35
  190. package/lib/services/store/effects/app.effects.d.ts +19 -19
  191. package/lib/services/store/effects/index.d.ts +3 -3
  192. package/lib/services/store/index.d.ts +5 -5
  193. package/lib/services/store/reducers/app.reducers.d.ts +3 -3
  194. package/lib/services/store/reducers/core.reducers.d.ts +3 -3
  195. package/lib/services/store/reducers/i18n.reducers.d.ts +3 -3
  196. package/lib/services/store/reducers/index.d.ts +7 -7
  197. package/lib/services/store/reducers/locale.reducers.d.ts +3 -3
  198. package/lib/services/store/reducers/meta.reducers.d.ts +17 -17
  199. package/lib/services/store/reducers/notifications.reducers.d.ts +3 -3
  200. package/lib/services/store/reducers/user.reducers.d.ts +3 -3
  201. package/lib/services/store/store.service.d.ts +43 -43
  202. package/lib/services/store/store.service.mock.d.ts +12 -12
  203. package/lib/services/user/index.d.ts +2 -2
  204. package/lib/services/user/user.service.d.ts +15 -15
  205. package/lib/services/user/user.service.mock.d.ts +16 -16
  206. package/lib/services/ux-app-shell.service.d.ts +155 -155
  207. package/lib/services/ux-dynamic-component/ux-dynamic-component.service.d.ts +36 -36
  208. package/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.d.ts +14 -14
  209. package/lib/services/ux-error-feedback/ux-error-feedback.service.d.ts +35 -35
  210. package/lib/services/ux-error-feedback/ux-error-handler.operator.d.ts +3 -3
  211. package/lib/services/ux-timezone.service.d.ts +269 -269
  212. package/package.json +2 -2
  213. package/docs/overview.html +0 -171
@@ -1,72 +1,72 @@
1
- import { Injectable } from '@angular/core';
2
- import { HttpResponse } from '@angular/common/http';
3
- import { tap } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- // The EuLoginSessionTimeoutHandlingInterceptor assumes that the EU login client is configured with:
6
- // <redirectionInterceptor>eu.cec.digit.ecas.client.http.ajax.JsonAjaxRedirectionInterceptor</redirectionInterceptor>
7
- // WARNING: The default EU login client behaviour that provides the JSON-un-parsable login HTML page, is no longer supported!
8
- export class EuLoginSessionTimeoutHandlingInterceptor {
9
- intercept(request, next) {
10
- return next.handle(request).pipe(tap((event) => {
11
- this.checkRequestSuccessForEULoginSessionTimeout(request, event);
12
- return event;
13
- }, (error) => {
14
- this.checkRequestErrorForEULoginSessionTimeout(request, error);
15
- }));
16
- }
17
- checkRequestSuccessForEULoginSessionTimeout(request, event) {
18
- if (event instanceof HttpResponse) {
19
- if (this.isSsoResponse(event.body)) {
20
- this.reauthenticate(request, event);
21
- }
22
- }
23
- }
24
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
- checkRequestErrorForEULoginSessionTimeout(request, response) {
26
- // intentionally blank; meant for overriding
27
- }
28
- isSsoResponse(body) {
29
- if (body) {
30
- if (typeof body !== 'string') {
31
- return (body.success === false &&
32
- body.status === 'ECAS_AUTHENTICATION_REQUIRED' &&
33
- body.code === 303 &&
34
- body.message === 'session expired');
35
- }
36
- else {
37
- const html = body;
38
- try {
39
- return ((html.indexOf('<meta name="Keywords" content="EU Login, ECAS, Authentication, Security" />') >= 0 &&
40
- html.indexOf('<meta name="Description" content="EU Login" />') >= 0) ||
41
- html.indexOf('<meta name="Description" content="European Commission Authentication Service" />') >= 0 ||
42
- html.indexOf('<title>Mock Login Form</title>') >= 0 ||
43
- html.indexOf('<title>Redirecting To ECAS</title>') >= 0 ||
44
- html === '{ success : false, status : "ECAS_AUTHENTICATION_REQUIRED", code : 303, message : "session expired" }' ||
45
- // eslint-disable-next-line max-len
46
- JSON.stringify(JSON.parse(html)) ===
47
- JSON.stringify({
48
- success: false,
49
- status: 'ECAS_AUTHENTICATION_REQUIRED',
50
- code: 303,
51
- message: 'session expired',
52
- }));
53
- }
54
- catch (e) {
55
- return false;
56
- }
57
- }
58
- }
59
- else {
60
- return false;
61
- }
62
- }
63
- reauthenticate(request, response) {
64
- document.location.reload();
65
- }
66
- }
67
- /** @nocollapse */ EuLoginSessionTimeoutHandlingInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
68
- /** @nocollapse */ EuLoginSessionTimeoutHandlingInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor });
69
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor, decorators: [{
70
- type: Injectable
71
- }] });
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnRlcmNlcHRvcnMvZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUF3RCxZQUFZLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFFNUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUVyQyxvR0FBb0c7QUFDcEcscUhBQXFIO0FBQ3JILDZIQUE2SDtBQUU3SCxNQUFNLE9BQU8sd0NBQXdDO0lBQ2pELFNBQVMsQ0FBQyxPQUF5QixFQUFFLElBQWlCO1FBQ2xELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzVCLEdBQUcsQ0FDQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ04sSUFBSSxDQUFDLDJDQUEyQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRSxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUNKLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFUywyQ0FBMkMsQ0FBQyxPQUF5QixFQUFFLEtBQXFCO1FBQ2xHLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRTtZQUMvQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQXFCLEtBQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQXFCLEtBQUssQ0FBQyxDQUFDO2FBQzFEO1NBQ0o7SUFDTCxDQUFDO0lBRUQsNkRBQTZEO0lBQ25ELHlDQUF5QyxDQUFDLE9BQXlCLEVBQUUsUUFBMEI7UUFDckcsNENBQTRDO0lBQ2hELENBQUM7SUFFUyxhQUFhLENBQUMsSUFBUztRQUM3QixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUMxQixPQUFPLENBQ0gsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLO29CQUN0QixJQUFJLENBQUMsTUFBTSxLQUFLLDhCQUE4QjtvQkFDOUMsSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHO29CQUNqQixJQUFJLENBQUMsT0FBTyxLQUFLLGlCQUFpQixDQUNyQyxDQUFDO2FBQ0w7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixJQUFJO29CQUNBLE9BQU8sQ0FDSCxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsNkVBQTZFLENBQUMsSUFBSSxDQUFDO3dCQUM3RixJQUFJLENBQUMsT0FBTyxDQUFDLGdEQUFnRCxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN4RSxJQUFJLENBQUMsT0FBTyxDQUFDLGtGQUFrRixDQUFDLElBQUksQ0FBQzt3QkFDckcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUM7d0JBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDO3dCQUN2RCxJQUFJLEtBQUssdUdBQXVHO3dCQUNoSCxtQ0FBbUM7d0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQ0FDWCxPQUFPLEVBQUUsS0FBSztnQ0FDZCxNQUFNLEVBQUUsOEJBQThCO2dDQUN0QyxJQUFJLEVBQUUsR0FBRztnQ0FDVCxPQUFPLEVBQUUsaUJBQWlCOzZCQUM3QixDQUFDLENBQ1QsQ0FBQztpQkFDTDtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFPLEtBQUssQ0FBQztpQkFDaEI7YUFDSjtTQUNKO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFUyxjQUFjLENBQUMsT0FBeUIsRUFBRSxRQUEwQjtRQUMxRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9CLENBQUM7O3dKQW5FUSx3Q0FBd0M7NEpBQXhDLHdDQUF3QzsyRkFBeEMsd0NBQXdDO2tCQURwRCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UsIEh0dHBSZXNwb25zZUJhc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuLy8gVGhlIEV1TG9naW5TZXNzaW9uVGltZW91dEhhbmRsaW5nSW50ZXJjZXB0b3IgYXNzdW1lcyB0aGF0IHRoZSBFVSBsb2dpbiBjbGllbnQgaXMgY29uZmlndXJlZCB3aXRoOlxyXG4vLyA8cmVkaXJlY3Rpb25JbnRlcmNlcHRvcj5ldS5jZWMuZGlnaXQuZWNhcy5jbGllbnQuaHR0cC5hamF4Lkpzb25BamF4UmVkaXJlY3Rpb25JbnRlcmNlcHRvcjwvcmVkaXJlY3Rpb25JbnRlcmNlcHRvcj5cclxuLy8gV0FSTklORzogVGhlIGRlZmF1bHQgRVUgbG9naW4gY2xpZW50IGJlaGF2aW91ciB0aGF0IHByb3ZpZGVzIHRoZSBKU09OLXVuLXBhcnNhYmxlIGxvZ2luIEhUTUwgcGFnZSwgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCFcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRXVMb2dpblNlc3Npb25UaW1lb3V0SGFuZGxpbmdJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcbiAgICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcChcclxuICAgICAgICAgICAgICAgIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZXF1ZXN0U3VjY2Vzc0ZvckVVTG9naW5TZXNzaW9uVGltZW91dChyZXF1ZXN0LCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZXF1ZXN0RXJyb3JGb3JFVUxvZ2luU2Vzc2lvblRpbWVvdXQocmVxdWVzdCwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY2hlY2tSZXF1ZXN0U3VjY2Vzc0ZvckVVTG9naW5TZXNzaW9uVGltZW91dChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCBldmVudDogSHR0cEV2ZW50PGFueT4pIHtcclxuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTc29SZXNwb25zZSgoPEh0dHBSZXNwb25zZTxhbnk+PmV2ZW50KS5ib2R5KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWF1dGhlbnRpY2F0ZShyZXF1ZXN0LCA8SHR0cFJlc3BvbnNlPGFueT4+ZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHByb3RlY3RlZCBjaGVja1JlcXVlc3RFcnJvckZvckVVTG9naW5TZXNzaW9uVGltZW91dChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCByZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgYmxhbms7IG1lYW50IGZvciBvdmVycmlkaW5nXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGlzU3NvUmVzcG9uc2UoYm9keTogYW55KSB7XHJcbiAgICAgICAgaWYgKGJvZHkpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICBib2R5LnN1Y2Nlc3MgPT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYm9keS5zdGF0dXMgPT09ICdFQ0FTX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkuY29kZSA9PT0gMzAzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYm9keS5tZXNzYWdlID09PSAnc2Vzc2lvbiBleHBpcmVkJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBib2R5O1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoaHRtbC5pbmRleE9mKCc8bWV0YSBuYW1lPVwiS2V5d29yZHNcIiBjb250ZW50PVwiRVUgTG9naW4sIEVDQVMsIEF1dGhlbnRpY2F0aW9uLCBTZWN1cml0eVwiIC8+JykgPj0gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5pbmRleE9mKCc8bWV0YSBuYW1lPVwiRGVzY3JpcHRpb25cIiBjb250ZW50PVwiRVUgTG9naW5cIiAvPicpID49IDApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwuaW5kZXhPZignPG1ldGEgbmFtZT1cIkRlc2NyaXB0aW9uXCIgY29udGVudD1cIkV1cm9wZWFuIENvbW1pc3Npb24gQXV0aGVudGljYXRpb24gU2VydmljZVwiIC8+JykgPj0gMCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLmluZGV4T2YoJzx0aXRsZT5Nb2NrIExvZ2luIEZvcm08L3RpdGxlPicpID49IDAgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5pbmRleE9mKCc8dGl0bGU+UmVkaXJlY3RpbmcgVG8gRUNBUzwvdGl0bGU+JykgPj0gMCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sID09PSAneyBzdWNjZXNzIDogZmFsc2UsIHN0YXR1cyA6IFwiRUNBU19BVVRIRU5USUNBVElPTl9SRVFVSVJFRFwiLCBjb2RlIDogMzAzLCBtZXNzYWdlIDogXCJzZXNzaW9uIGV4cGlyZWRcIiB9JyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShKU09OLnBhcnNlKGh0bWwpKSA9PT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdFQ0FTX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAzMDMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3Nlc3Npb24gZXhwaXJlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVhdXRoZW50aWNhdGUocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgcmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpIHtcclxuICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIH1cclxufVxyXG4iXX0=
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpResponse } from '@angular/common/http';
3
+ import { tap } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ // The EuLoginSessionTimeoutHandlingInterceptor assumes that the EU login client is configured with:
6
+ // <redirectionInterceptor>eu.cec.digit.ecas.client.http.ajax.JsonAjaxRedirectionInterceptor</redirectionInterceptor>
7
+ // WARNING: The default EU login client behaviour that provides the JSON-un-parsable login HTML page, is no longer supported!
8
+ export class EuLoginSessionTimeoutHandlingInterceptor {
9
+ intercept(request, next) {
10
+ return next.handle(request).pipe(tap((event) => {
11
+ this.checkRequestSuccessForEULoginSessionTimeout(request, event);
12
+ return event;
13
+ }, (error) => {
14
+ this.checkRequestErrorForEULoginSessionTimeout(request, error);
15
+ }));
16
+ }
17
+ checkRequestSuccessForEULoginSessionTimeout(request, event) {
18
+ if (event instanceof HttpResponse) {
19
+ if (this.isSsoResponse(event.body)) {
20
+ this.reauthenticate(request, event);
21
+ }
22
+ }
23
+ }
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
+ checkRequestErrorForEULoginSessionTimeout(request, response) {
26
+ // intentionally blank; meant for overriding
27
+ }
28
+ isSsoResponse(body) {
29
+ if (body) {
30
+ if (typeof body !== 'string') {
31
+ return (body.success === false &&
32
+ body.status === 'ECAS_AUTHENTICATION_REQUIRED' &&
33
+ body.code === 303 &&
34
+ body.message === 'session expired');
35
+ }
36
+ else {
37
+ const html = body;
38
+ try {
39
+ return ((html.indexOf('<meta name="Keywords" content="EU Login, ECAS, Authentication, Security" />') >= 0 &&
40
+ html.indexOf('<meta name="Description" content="EU Login" />') >= 0) ||
41
+ html.indexOf('<meta name="Description" content="European Commission Authentication Service" />') >= 0 ||
42
+ html.indexOf('<title>Mock Login Form</title>') >= 0 ||
43
+ html.indexOf('<title>Redirecting To ECAS</title>') >= 0 ||
44
+ html === '{ success : false, status : "ECAS_AUTHENTICATION_REQUIRED", code : 303, message : "session expired" }' ||
45
+ // eslint-disable-next-line max-len
46
+ JSON.stringify(JSON.parse(html)) ===
47
+ JSON.stringify({
48
+ success: false,
49
+ status: 'ECAS_AUTHENTICATION_REQUIRED',
50
+ code: 303,
51
+ message: 'session expired',
52
+ }));
53
+ }
54
+ catch (e) {
55
+ return false;
56
+ }
57
+ }
58
+ }
59
+ else {
60
+ return false;
61
+ }
62
+ }
63
+ reauthenticate(request, response) {
64
+ document.location.reload();
65
+ }
66
+ }
67
+ /** @nocollapse */ EuLoginSessionTimeoutHandlingInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
68
+ /** @nocollapse */ EuLoginSessionTimeoutHandlingInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor });
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EuLoginSessionTimeoutHandlingInterceptor, decorators: [{
70
+ type: Injectable
71
+ }] });
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnRlcmNlcHRvcnMvZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUF3RCxZQUFZLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFFNUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUVyQyxvR0FBb0c7QUFDcEcscUhBQXFIO0FBQ3JILDZIQUE2SDtBQUU3SCxNQUFNLE9BQU8sd0NBQXdDO0lBQ2pELFNBQVMsQ0FBQyxPQUF5QixFQUFFLElBQWlCO1FBQ2xELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzVCLEdBQUcsQ0FDQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ04sSUFBSSxDQUFDLDJDQUEyQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRSxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUNKLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFUywyQ0FBMkMsQ0FBQyxPQUF5QixFQUFFLEtBQXFCO1FBQ2xHLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRTtZQUMvQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQXFCLEtBQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQXFCLEtBQUssQ0FBQyxDQUFDO2FBQzFEO1NBQ0o7SUFDTCxDQUFDO0lBRUQsNkRBQTZEO0lBQ25ELHlDQUF5QyxDQUFDLE9BQXlCLEVBQUUsUUFBMEI7UUFDckcsNENBQTRDO0lBQ2hELENBQUM7SUFFUyxhQUFhLENBQUMsSUFBUztRQUM3QixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUMxQixPQUFPLENBQ0gsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLO29CQUN0QixJQUFJLENBQUMsTUFBTSxLQUFLLDhCQUE4QjtvQkFDOUMsSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHO29CQUNqQixJQUFJLENBQUMsT0FBTyxLQUFLLGlCQUFpQixDQUNyQyxDQUFDO2FBQ0w7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixJQUFJO29CQUNBLE9BQU8sQ0FDSCxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsNkVBQTZFLENBQUMsSUFBSSxDQUFDO3dCQUM3RixJQUFJLENBQUMsT0FBTyxDQUFDLGdEQUFnRCxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN4RSxJQUFJLENBQUMsT0FBTyxDQUFDLGtGQUFrRixDQUFDLElBQUksQ0FBQzt3QkFDckcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUM7d0JBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDO3dCQUN2RCxJQUFJLEtBQUssdUdBQXVHO3dCQUNoSCxtQ0FBbUM7d0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQ0FDWCxPQUFPLEVBQUUsS0FBSztnQ0FDZCxNQUFNLEVBQUUsOEJBQThCO2dDQUN0QyxJQUFJLEVBQUUsR0FBRztnQ0FDVCxPQUFPLEVBQUUsaUJBQWlCOzZCQUM3QixDQUFDLENBQ1QsQ0FBQztpQkFDTDtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFPLEtBQUssQ0FBQztpQkFDaEI7YUFDSjtTQUNKO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFUyxjQUFjLENBQUMsT0FBeUIsRUFBRSxRQUEwQjtRQUMxRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9CLENBQUM7O3dKQW5FUSx3Q0FBd0M7NEpBQXhDLHdDQUF3QzsyRkFBeEMsd0NBQXdDO2tCQURwRCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwSGFuZGxlciwgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwUmVzcG9uc2VCYXNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBUaGUgRXVMb2dpblNlc3Npb25UaW1lb3V0SGFuZGxpbmdJbnRlcmNlcHRvciBhc3N1bWVzIHRoYXQgdGhlIEVVIGxvZ2luIGNsaWVudCBpcyBjb25maWd1cmVkIHdpdGg6XG4vLyA8cmVkaXJlY3Rpb25JbnRlcmNlcHRvcj5ldS5jZWMuZGlnaXQuZWNhcy5jbGllbnQuaHR0cC5hamF4Lkpzb25BamF4UmVkaXJlY3Rpb25JbnRlcmNlcHRvcjwvcmVkaXJlY3Rpb25JbnRlcmNlcHRvcj5cbi8vIFdBUk5JTkc6IFRoZSBkZWZhdWx0IEVVIGxvZ2luIGNsaWVudCBiZWhhdmlvdXIgdGhhdCBwcm92aWRlcyB0aGUgSlNPTi11bi1wYXJzYWJsZSBsb2dpbiBIVE1MIHBhZ2UsIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQhXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRXVMb2dpblNlc3Npb25UaW1lb3V0SGFuZGxpbmdJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gICAgaW50ZXJjZXB0KHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCkucGlwZShcbiAgICAgICAgICAgIHRhcChcbiAgICAgICAgICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1JlcXVlc3RTdWNjZXNzRm9yRVVMb2dpblNlc3Npb25UaW1lb3V0KHJlcXVlc3QsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZXF1ZXN0RXJyb3JGb3JFVUxvZ2luU2Vzc2lvblRpbWVvdXQocmVxdWVzdCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tSZXF1ZXN0U3VjY2Vzc0ZvckVVTG9naW5TZXNzaW9uVGltZW91dChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCBldmVudDogSHR0cEV2ZW50PGFueT4pIHtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1Nzb1Jlc3BvbnNlKCg8SHR0cFJlc3BvbnNlPGFueT4+ZXZlbnQpLmJvZHkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWF1dGhlbnRpY2F0ZShyZXF1ZXN0LCA8SHR0cFJlc3BvbnNlPGFueT4+ZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBjaGVja1JlcXVlc3RFcnJvckZvckVVTG9naW5TZXNzaW9uVGltZW91dChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCByZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rOyBtZWFudCBmb3Igb3ZlcnJpZGluZ1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc1Nzb1Jlc3BvbnNlKGJvZHk6IGFueSkge1xuICAgICAgICBpZiAoYm9keSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGJvZHkuc3VjY2VzcyA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgYm9keS5zdGF0dXMgPT09ICdFQ0FTX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEJyAmJlxuICAgICAgICAgICAgICAgICAgICBib2R5LmNvZGUgPT09IDMwMyAmJlxuICAgICAgICAgICAgICAgICAgICBib2R5Lm1lc3NhZ2UgPT09ICdzZXNzaW9uIGV4cGlyZWQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJvZHk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChodG1sLmluZGV4T2YoJzxtZXRhIG5hbWU9XCJLZXl3b3Jkc1wiIGNvbnRlbnQ9XCJFVSBMb2dpbiwgRUNBUywgQXV0aGVudGljYXRpb24sIFNlY3VyaXR5XCIgLz4nKSA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5pbmRleE9mKCc8bWV0YSBuYW1lPVwiRGVzY3JpcHRpb25cIiBjb250ZW50PVwiRVUgTG9naW5cIiAvPicpID49IDApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLmluZGV4T2YoJzxtZXRhIG5hbWU9XCJEZXNjcmlwdGlvblwiIGNvbnRlbnQ9XCJFdXJvcGVhbiBDb21taXNzaW9uIEF1dGhlbnRpY2F0aW9uIFNlcnZpY2VcIiAvPicpID49IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwuaW5kZXhPZignPHRpdGxlPk1vY2sgTG9naW4gRm9ybTwvdGl0bGU+JykgPj0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5pbmRleE9mKCc8dGl0bGU+UmVkaXJlY3RpbmcgVG8gRUNBUzwvdGl0bGU+JykgPj0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9PT0gJ3sgc3VjY2VzcyA6IGZhbHNlLCBzdGF0dXMgOiBcIkVDQVNfQVVUSEVOVElDQVRJT05fUkVRVUlSRURcIiwgY29kZSA6IDMwMywgbWVzc2FnZSA6IFwic2Vzc2lvbiBleHBpcmVkXCIgfScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShKU09OLnBhcnNlKGh0bWwpKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdFQ0FTX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogMzAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc2Vzc2lvbiBleHBpcmVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWF1dGhlbnRpY2F0ZShyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCByZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9XG59XG4iXX0=
@@ -1,8 +1,8 @@
1
- export * from './add-lang-param.interceptor';
2
- export * from './cache-prevention.interceptor';
3
- export * from './cors-security.interceptor';
4
- export * from './csrf-prevention.interceptor';
5
- export * from './eu-login-session-timeout-handling.interceptor';
6
- export * from './ux-request-error-model.interceptor';
7
- export * from './openid/index';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyY2VwdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaURBQWlELENBQUM7QUFDaEUsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hZGQtbGFuZy1wYXJhbS5pbnRlcmNlcHRvcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUtcHJldmVudGlvbi5pbnRlcmNlcHRvcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29ycy1zZWN1cml0eS5pbnRlcmNlcHRvcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vY3NyZi1wcmV2ZW50aW9uLmludGVyY2VwdG9yJztcclxuZXhwb3J0ICogZnJvbSAnLi9ldS1sb2dpbi1zZXNzaW9uLXRpbWVvdXQtaGFuZGxpbmcuaW50ZXJjZXB0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL3V4LXJlcXVlc3QtZXJyb3ItbW9kZWwuaW50ZXJjZXB0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL29wZW5pZC9pbmRleCc7XHJcbiJdfQ==
1
+ export * from './add-lang-param.interceptor';
2
+ export * from './cache-prevention.interceptor';
3
+ export * from './cors-security.interceptor';
4
+ export * from './csrf-prevention.interceptor';
5
+ export * from './eu-login-session-timeout-handling.interceptor';
6
+ export * from './ux-request-error-model.interceptor';
7
+ export * from './openid/index';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyY2VwdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaURBQWlELENBQUM7QUFDaEUsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hZGQtbGFuZy1wYXJhbS5pbnRlcmNlcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlLXByZXZlbnRpb24uaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JzLXNlY3VyaXR5LmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vY3NyZi1wcmV2ZW50aW9uLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZXUtbG9naW4tc2Vzc2lvbi10aW1lb3V0LWhhbmRsaW5nLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdXgtcmVxdWVzdC1lcnJvci1tb2RlbC5pbnRlcmNlcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL29wZW5pZC9pbmRleCc7XG4iXX0=
@@ -1,4 +1,4 @@
1
- export * from './openid-connect.interceptor';
2
- export * from './openid-connect.service';
3
- export * from './openid-connect.service.mock';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyY2VwdG9ycy9vcGVuaWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL29wZW5pZC1jb25uZWN0LmludGVyY2VwdG9yJztcclxuZXhwb3J0ICogZnJvbSAnLi9vcGVuaWQtY29ubmVjdC5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9vcGVuaWQtY29ubmVjdC5zZXJ2aWNlLm1vY2snO1xyXG4iXX0=
1
+ export * from './openid-connect.interceptor';
2
+ export * from './openid-connect.service';
3
+ export * from './openid-connect.service.mock';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyY2VwdG9ycy9vcGVuaWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL29wZW5pZC1jb25uZWN0LmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vb3BlbmlkLWNvbm5lY3Quc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL29wZW5pZC1jb25uZWN0LnNlcnZpY2UubW9jayc7XG4iXX0=
@@ -1,149 +1,149 @@
1
- import { Injectable } from '@angular/core';
2
- import { HttpErrorResponse, HttpEventType, HttpHeaders, } from '@angular/common/http';
3
- import { of, Subject, throwError } from 'rxjs';
4
- import { catchError } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- export class OpenIdConnectInterceptor {
7
- constructor() {
8
- // By default, the original request should at least be retries once in case the cached API Gateway token expires:
9
- this.defaultMaximumRequestRetries = 1;
10
- // check if the OpenIdConnect is defined
11
- if (typeof OpenIdConnect === 'undefined') {
12
- console.error('Please include the script openid-login.js in your index.html file.', 'For more details, please consult the documentation regarding the Http Interceptors and OpenID Connect configuration.');
13
- }
14
- }
15
- intercept(request, next, retryCount = 0, retryCallback) {
16
- if (typeof OpenIdConnect !== 'undefined') {
17
- let authorizedRequest = retryCallback;
18
- if (!authorizedRequest) {
19
- authorizedRequest = new Subject();
20
- }
21
- OpenIdConnect.getAuthorizationHeaders(request.urlWithParams, (headers) => {
22
- let newRequest = request;
23
- if (headers) {
24
- let newHeaders = request.headers;
25
- if (newHeaders) {
26
- for (const headerName in headers) {
27
- // eslint-disable-next-line no-prototype-builtins
28
- if (headers.hasOwnProperty(headerName)) {
29
- newHeaders = newHeaders.set(headerName, headers[headerName]);
30
- }
31
- }
32
- }
33
- else {
34
- newHeaders = new HttpHeaders(headers);
35
- }
36
- newRequest = request.clone({
37
- withCredentials: false,
38
- headers: newHeaders,
39
- });
40
- }
41
- // Don't mix the next line with the line below it.
42
- // We would get a "Cannot access 'subscription' before initialization" error.
43
- let subscription = null;
44
- subscription = next
45
- .handle(newRequest)
46
- .pipe(catchError((response) => this.handleErrorResponse(response, request, next, retryCount, authorizedRequest, subscription)))
47
- .subscribe((httpEvent) => {
48
- if (httpEvent) {
49
- authorizedRequest.next(httpEvent);
50
- if (httpEvent.type === HttpEventType.Response) {
51
- if (subscription) {
52
- subscription.unsubscribe();
53
- }
54
- authorizedRequest.complete();
55
- }
56
- }
57
- });
58
- }, (errorResponse) => {
59
- const errorProperties = {
60
- error: errorResponse,
61
- };
62
- if (errorResponse) {
63
- errorProperties.status = errorResponse.status;
64
- errorProperties.statusText = errorResponse.statusText;
65
- }
66
- return this.handleErrorResponse(new HttpErrorResponse(errorProperties), request, next, retryCount, authorizedRequest, null);
67
- });
68
- return authorizedRequest;
69
- }
70
- else {
71
- return next.handle(request);
72
- }
73
- }
74
- handleErrorResponse(response, originalRequest, next, retryCount = 0, retryCallback, subscription) {
75
- if (response) {
76
- if (response.error && response.error.error === 'invalid_request') {
77
- // The ID token is invalid or incorrect; retrieve another one:
78
- OpenIdConnect.renewIdToken();
79
- }
80
- else if (this.apiGatewayTokenExpired(response)) {
81
- OpenIdConnect.clearCachedApiGatewayAccessToken();
82
- return this.retryRequest(originalRequest, response, next, retryCount, retryCallback, subscription);
83
- }
84
- else if (response.status === 401 || response.status === 403) {
85
- // The EU Login access token is invalid. (403)
86
- // The target service is unable to read the access token, for example because the EU Login session ended. (401)
87
- // Retry in case the access token became invalid too quickly:
88
- return this.retryRequest(originalRequest, response, next, retryCount, retryCallback, subscription);
89
- }
90
- else if (response.status === 0) {
91
- // One of the access token requests or the original request was not sent.
92
- // Most likely one of the CORS pre-flight requests failed, or the browser is offline.
93
- console.warn('The OpenID Connect call may have issues:\n' +
94
- '* the CORS pre-flight requests for the OpenID Connect access tokens or for the REST call could be failing\n' +
95
- '* the browser could be currently offline.');
96
- }
97
- }
98
- if (subscription) {
99
- subscription.unsubscribe();
100
- }
101
- if (retryCallback) {
102
- retryCallback.error(response);
103
- retryCallback.complete();
104
- }
105
- return throwError(response);
106
- }
107
- retryRequest(originalRequest, response, next, retryCount = 0, retryCallback, subscription) {
108
- if (retryCount < this.maximumRequestRetries()) {
109
- this.intercept(originalRequest, next, retryCount + 1, retryCallback);
110
- }
111
- else {
112
- console.error('The OpenID Connect call may have issues:\n' +
113
- '* the client ID could be invalid\n' +
114
- '* the API Gateway access token could be invalid\n' +
115
- '* the EU Login access token for the target service could be invalid.');
116
- if (subscription) {
117
- subscription.unsubscribe();
118
- }
119
- if (retryCallback) {
120
- retryCallback.error(response);
121
- retryCallback.complete();
122
- }
123
- }
124
- return of(null);
125
- }
126
- apiGatewayTokenExpired(response) {
127
- if (response && response.status === 401) {
128
- const message = '' + response.error;
129
- return message.indexOf('<ams:code>900901</ams:code>') >= 0;
130
- }
131
- else {
132
- return false;
133
- }
134
- }
135
- maximumRequestRetries() {
136
- if (OpenIdConnect.config && OpenIdConnect.config.maximumRequestRetries >= 0) {
137
- return OpenIdConnect.config.maximumRequestRetries;
138
- }
139
- else {
140
- return this.defaultMaximumRequestRetries;
141
- }
142
- }
143
- }
144
- /** @nocollapse */ OpenIdConnectInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OpenIdConnectInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
145
- /** @nocollapse */ OpenIdConnectInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OpenIdConnectInterceptor });
146
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OpenIdConnectInterceptor, decorators: [{
147
- type: Injectable
148
- }], ctorParameters: function () { return []; } });
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmlkLWNvbm5lY3QuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyY2VwdG9ycy9vcGVuaWQvb3BlbmlkLWNvbm5lY3QuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsaUJBQWlCLEVBRWpCLGFBQWEsRUFFYixXQUFXLEdBSWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFPNUMsTUFBTSxPQUFPLHdCQUF3QjtJQUlqQztRQUhBLGlIQUFpSDtRQUNqSCxpQ0FBNEIsR0FBRyxDQUFDLENBQUM7UUFHN0Isd0NBQXdDO1FBQ3hDLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQ1Qsb0VBQW9FLEVBQ3BFLHNIQUFzSCxDQUN6SCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUNMLE9BQXlCLEVBQ3pCLElBQWlCLEVBQ2pCLFVBQVUsR0FBRyxDQUFDLEVBQ2QsYUFBdUM7UUFFdkMsSUFBSSxPQUFPLGFBQWEsS0FBSyxXQUFXLEVBQUU7WUFDdEMsSUFBSSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7WUFDdEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUNwQixpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQzthQUNyRDtZQUVELGFBQWEsQ0FBQyx1QkFBdUIsQ0FDakMsT0FBTyxDQUFDLGFBQWEsRUFDckIsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDYixJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUM7Z0JBQ3pCLElBQUks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QXNFLENBQzdFLENBQUM7WUFDRixJQUFJLFlBQVksRUFBRTtnQkFDZCxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDOUI7WUFDRCxJQUFJLGFBQWEsRUFBRTtnQkFDZixhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDNUI7U0FDSjtRQUVELE9BQU8sRUFBRSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRVMsc0JBQXNCLENBQUMsUUFBMkI7UUFDeEQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDckMsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDcEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlEO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFUyxxQkFBcUI7UUFDM0IsSUFBSSxhQUFhLENBQUMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMscUJBQXFCLElBQUksQ0FBQyxFQUFFO1lBQ3pFLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztTQUNyRDthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUM7U0FDNUM7SUFDTCxDQUFDOzt3SUF0TFEsd0JBQXdCOzRJQUF4Qix3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIEh0dHBFcnJvclJlc3BvbnNlLFxyXG4gICAgSHR0cEV2ZW50LFxyXG4gICAgSHR0cEV2ZW50VHlwZSxcclxuICAgIEh0dHBIYW5kbGVyLFxyXG4gICAgSHR0cEhlYWRlcnMsXHJcbiAgICBIdHRwSW50ZXJjZXB0b3IsXHJcbiAgICBIdHRwUmVxdWVzdCxcclxuICAgIEh0dHBSZXNwb25zZSxcclxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8vIFRoaXMgdmFyaWFibGUgaXMgZGVjbGFyZWQgaW4gdGhlIGphdmFzY3JpcHQgZmlsZSBvcGVuaWQtbG9naW4uanNcclxuLy8gYW5kIHdpbGwgYmUgaW1wb3J0ZWQgaW4gdGhlIGVVSSBhcHBsaWNhdGlvbnMnIGluZGV4Lmh0bWwgZmlsZSwgd2hlbiBuZWNlc3NhcnkuXHJcbmRlY2xhcmUgbGV0IE9wZW5JZENvbm5lY3Q6IGFueTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE9wZW5JZENvbm5lY3RJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcbiAgICAvLyBCeSBkZWZhdWx0LCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBzaG91bGQgYXQgbGVhc3QgYmUgcmV0cmllcyBvbmNlIGluIGNhc2UgdGhlIGNhY2hlZCBBUEkgR2F0ZXdheSB0b2tlbiBleHBpcmVzOlxyXG4gICAgZGVmYXVsdE1heGltdW1SZXF1ZXN0UmV0cmllcyA9IDE7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIE9wZW5JZENvbm5lY3QgaXMgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0eXBlb2YgT3BlbklkQ29ubmVjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgICAgICdQbGVhc2UgaW5jbHVkZSB0aGUgc2NyaXB0IG9wZW5pZC1sb2dpbi5qcyBpbiB5b3VyIGluZGV4Lmh0bWwgZmlsZS4nLFxyXG4gICAgICAgICAgICAgICAgJ0ZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyB0aGUgSHR0cCBJbnRlcmNlcHRvcnMgYW5kIE9wZW5JRCBDb25uZWN0IGNvbmZpZ3VyYXRpb24uJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbnRlcmNlcHQoXHJcbiAgICAgICAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PixcclxuICAgICAgICBuZXh0OiBIdHRwSGFuZGxlcixcclxuICAgICAgICByZXRyeUNvdW50ID0gMCxcclxuICAgICAgICByZXRyeUNhbGxiYWNrPzogU3ViamVjdDxIdHRwRXZlbnQ8YW55Pj5cclxuICAgICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgICAgICBpZiAodHlwZW9mIE9wZW5JZENvbm5lY3QgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGxldCBhdXRob3JpemVkUmVxdWVzdCA9IHJldHJ5Q2FsbGJhY2s7XHJcbiAgICAgICAgICAgIGlmICghYXV0aG9yaXplZFJlcXVlc3QpIHtcclxuICAgICAgICAgICAgICAgIGF1dGhvcml6ZWRSZXF1ZXN0ID0gbmV3IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIE9wZW5JZENvbm5lY3QuZ2V0QXV0aG9yaXphdGlvbkhlYWRlcnMoXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybFdpdGhQYXJhbXMsXHJcbiAgICAgICAgICAgICAgICAoaGVhZGVyczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1JlcXVlc3QgPSByZXF1ZXN0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdIZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SGVhZGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXJOYW1lIGluIGhlYWRlcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycyA9IG5ld0hlYWRlcnMuc2V0KGhlYWRlck5hbWUsIGhlYWRlcnNbaGVhZGVyTmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ld0hlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgbWl4IHRoZSBuZXh0IGxpbmUgd2l0aCB0aGUgbGluZSBiZWxvdyBpdC5cclxuICAgICAgICAgICAgICAgICAgICAvLyBXZSB3b3VsZCBnZXQgYSBcIkNhbm5vdCBhY2Nlc3MgJ3N1YnNjcmlwdGlvbicgYmVmb3JlIGluaXRpYWxpemF0aW9uXCIgZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuaGFuZGxlKG5ld1JlcXVlc3QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZSwgcmVxdWVzdCwgbmV4dCwgcmV0cnlDb3VudCwgYXV0aG9yaXplZFJlcXVlc3QsIHN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChodHRwRXZlbnQ6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cEV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZFJlcXVlc3QubmV4dChodHRwRXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChodHRwRXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVkUmVxdWVzdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgKGVycm9yUmVzcG9uc2U6IFhNTEh0dHBSZXF1ZXN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQcm9wZXJ0aWVzOiBhbnkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvclJlc3BvbnNlLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JQcm9wZXJ0aWVzLnN0YXR1cyA9IGVycm9yUmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclByb3BlcnRpZXMuc3RhdHVzVGV4dCA9IGVycm9yUmVzcG9uc2Uuc3RhdHVzVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yUmVzcG9uc2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIdHRwRXJyb3JSZXNwb25zZShlcnJvclByb3BlcnRpZXMpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVkUmVxdWVzdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYXV0aG9yaXplZFJlcXVlc3Q7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaGFuZGxlRXJyb3JSZXNwb25zZShcclxuICAgICAgICByZXNwb25zZTogSHR0cEVycm9yUmVzcG9uc2UsXHJcbiAgICAgICAgb3JpZ2luYWxSZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxyXG4gICAgICAgIG5leHQ6IEh0dHBIYW5kbGVyLFxyXG4gICAgICAgIHJldHJ5Q291bnQ6IG51bWJlciA9IDAsXHJcbiAgICAgICAgcmV0cnlDYWxsYmFjazogU3ViamVjdDxIdHRwRXZlbnQ8YW55Pj4sXHJcbiAgICAgICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25cclxuICAgICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yICYmIHJlc3BvbnNlLmVycm9yLmVycm9yID09PSAnaW52YWxpZF9yZXF1ZXN0Jykge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIElEIHRva2VuIGlzIGludmFsaWQgb3IgaW5jb3JyZWN0OyByZXRyaWV2ZSBhbm90aGVyIG9uZTpcclxuICAgICAgICAgICAgICAgIE9wZW5JZENvbm5lY3QucmVuZXdJZFRva2VuKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcGlHYXRld2F5VG9rZW5FeHBpcmVkKHJlc3BvbnNlKSkge1xyXG4gICAgICAgICAgICAgICAgT3BlbklkQ29ubmVjdC5jbGVhckNhY2hlZEFwaUdhdGV3YXlBY2Nlc3NUb2tlbigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9yaWdpbmFsUmVxdWVzdCwgcmVzcG9uc2UsIG5leHQsIHJldHJ5Q291bnQsIHJldHJ5Q2FsbGJhY2ssIHN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBFVSBMb2dpbiBhY2Nlc3MgdG9rZW4gaXMgaW52YWxpZC4gKDQwMylcclxuICAgICAgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgc2VydmljZSBpcyB1bmFibGUgdG8gcmVhZCB0aGUgYWNjZXNzIHRva2VuLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHRoZSBFVSBMb2dpbiBzZXNzaW9uIGVuZGVkLiAoNDAxKVxyXG4gICAgICAgICAgICAgICAgLy8gUmV0cnkgaW4gY2FzZSB0aGUgYWNjZXNzIHRva2VuIGJlY2FtZSBpbnZhbGlkIHRvbyBxdWlja2x5OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9yaWdpbmFsUmVxdWVzdCwgcmVzcG9uc2UsIG5leHQsIHJldHJ5Q291bnQsIHJldHJ5Q2FsbGJhY2ssIHN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPbmUgb2YgdGhlIGFjY2VzcyB0b2tlbiByZXF1ZXN0cyBvciB0aGUgb3JpZ2luYWwgcmVxdWVzdCB3YXMgbm90IHNlbnQuXHJcbiAgICAgICAgICAgICAgICAvLyBNb3N0IGxpa2VseSBvbmUgb2YgdGhlIENPUlMgcHJlLWZsaWdodCByZXF1ZXN0cyBmYWlsZWQsIG9yIHRoZSBicm93c2VyIGlzIG9mZmxpbmUuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgICAgICAgICAgJ1RoZSBPcGVuSUQgQ29ubmVjdCBjYWxsIG1heSBoYXZlIGlzc3VlczpcXG4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyogdGhlIENPUlMgcHJlLWZsaWdodCByZXF1ZXN0cyBmb3IgdGhlIE9wZW5JRCBDb25uZWN0IGFjY2VzcyB0b2tlbnMgb3IgZm9yIHRoZSBSRVNUIGNhbGwgY291bGQgYmUgZmFpbGluZ1xcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnKiB0aGUgYnJvd3NlciBjb3VsZCBiZSBjdXJyZW50bHkgb2ZmbGluZS4nXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmV0cnlDYWxsYmFjaykge1xyXG4gICAgICAgICAgICByZXRyeUNhbGxiYWNrLmVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgcmV0cnlDYWxsYmFjay5jb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZXRyeVJlcXVlc3QoXHJcbiAgICAgICAgb3JpZ2luYWxSZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxyXG4gICAgICAgIHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSxcclxuICAgICAgICBuZXh0OiBIdHRwSGFuZGxlcixcclxuICAgICAgICByZXRyeUNvdW50OiBudW1iZXIgPSAwLFxyXG4gICAgICAgIHJldHJ5Q2FsbGJhY2s6IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+LFxyXG4gICAgICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uXHJcbiAgICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICAgICAgaWYgKHJldHJ5Q291bnQgPCB0aGlzLm1heGltdW1SZXF1ZXN0UmV0cmllcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0KG9yaWdpbmFsUmVxdWVzdCwgbmV4dCwgcmV0cnlDb3VudCArIDEsIHJldHJ5Q2FsbGJhY2spO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgICAgICAnVGhlIE9wZW5JRCBDb25uZWN0IGNhbGwgbWF5IGhhdmUgaXNzdWVzOlxcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICcqIHRoZSBjbGllbnQgSUQgY291bGQgYmUgaW52YWxpZFxcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICcqIHRoZSBBUEkgR2F0ZXdheSBhY2Nlc3MgdG9rZW4gY291bGQgYmUgaW52YWxpZFxcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICcqIHRoZSBFVSBMb2dpbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSB0YXJnZXQgc2VydmljZSBjb3VsZCBiZSBpbnZhbGlkLidcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJldHJ5Q2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIHJldHJ5Q2FsbGJhY2suZXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0cnlDYWxsYmFjay5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2Y8SHR0cEV2ZW50PGFueT4+KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhcGlHYXRld2F5VG9rZW5FeHBpcmVkKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJycgKyByZXNwb25zZS5lcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuaW5kZXhPZignPGFtczpjb2RlPjkwMDkwMTwvYW1zOmNvZGU+JykgPj0gMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtYXhpbXVtUmVxdWVzdFJldHJpZXMoKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoT3BlbklkQ29ubmVjdC5jb25maWcgJiYgT3BlbklkQ29ubmVjdC5jb25maWcubWF4aW11bVJlcXVlc3RSZXRyaWVzID49IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIE9wZW5JZENvbm5lY3QuY29uZmlnLm1heGltdW1SZXF1ZXN0UmV0cmllcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0TWF4aW11bVJlcXVlc3RSZXRyaWVzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpErrorResponse, HttpEventType, HttpHeaders, } from '@angular/common/http';
3
+ import { of, Subject, throwError } from 'rxjs';
4
+ import { catchError } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ export class OpenIdConnectInterceptor {
7
+ constructor() {
8
+ // By default, the original request should at least be retries once in case the cached API Gateway token expires:
9
+ this.defaultMaximumRequestRetries = 1;
10
+ // check if the OpenIdConnect is defined
11
+ if (typeof OpenIdConnect === 'undefined') {
12
+ console.error('Please include the script openid-login.js in your index.html file.', 'For more details, please consult the documentation regarding the Http Interceptors and OpenID Connect configuration.');
13
+ }
14
+ }
15
+ intercept(request, next, retryCount = 0, retryCallback) {
16
+ if (typeof OpenIdConnect !== 'undefined') {
17
+ let authorizedRequest = retryCallback;
18
+ if (!authorizedRequest) {
19
+ authorizedRequest = new Subject();
20
+ }
21
+ OpenIdConnect.getAuthorizationHeaders(request.urlWithParams, (headers) => {
22
+ let newRequest = request;
23
+ if (headers) {
24
+ let newHeaders = request.headers;
25
+ if (newHeaders) {
26
+ for (const headerName in headers) {
27
+ // eslint-disable-next-line no-prototype-builtins
28
+ if (headers.hasOwnProperty(headerName)) {
29
+ newHeaders = newHeaders.set(headerName, headers[headerName]);
30
+ }
31
+ }
32
+ }
33
+ else {
34
+ newHeaders = new HttpHeaders(headers);
35
+ }
36
+ newRequest = request.clone({
37
+ withCredentials: false,
38
+ headers: newHeaders,
39
+ });
40
+ }
41
+ // Don't mix the next line with the line below it.
42
+ // We would get a "Cannot access 'subscription' before initialization" error.
43
+ let subscription = null;
44
+ subscription = next
45
+ .handle(newRequest)
46
+ .pipe(catchError((response) => this.handleErrorResponse(response, request, next, retryCount, authorizedRequest, subscription)))
47
+ .subscribe((httpEvent) => {
48
+ if (httpEvent) {
49
+ authorizedRequest.next(httpEvent);
50
+ if (httpEvent.type === HttpEventType.Response) {
51
+ if (subscription) {
52
+ subscription.unsubscribe();
53
+ }
54
+ authorizedRequest.complete();
55
+ }
56
+ }
57
+ });
58
+ }, (errorResponse) => {
59
+ const errorProperties = {
60
+ error: errorResponse,
61
+ };
62
+ if (errorResponse) {
63
+ errorProperties.status = errorResponse.status;
64
+ errorProperties.statusText = errorResponse.statusText;
65
+ }
66
+ return this.handleErrorResponse(new HttpErrorResponse(errorProperties), request, next, retryCount, authorizedRequest, null);
67
+ });
68
+ return authorizedRequest;
69
+ }
70
+ else {
71
+ return next.handle(request);
72
+ }
73
+ }
74
+ handleErrorResponse(response, originalRequest, next, retryCount = 0, retryCallback, subscription) {
75
+ if (response) {
76
+ if (response.error && response.error.error === 'invalid_request') {
77
+ // The ID token is invalid or incorrect; retrieve another one:
78
+ OpenIdConnect.renewIdToken();
79
+ }
80
+ else if (this.apiGatewayTokenExpired(response)) {
81
+ OpenIdConnect.clearCachedApiGatewayAccessToken();
82
+ return this.retryRequest(originalRequest, response, next, retryCount, retryCallback, subscription);
83
+ }
84
+ else if (response.status === 401 || response.status === 403) {
85
+ // The EU Login access token is invalid. (403)
86
+ // The target service is unable to read the access token, for example because the EU Login session ended. (401)
87
+ // Retry in case the access token became invalid too quickly:
88
+ return this.retryRequest(originalRequest, response, next, retryCount, retryCallback, subscription);
89
+ }
90
+ else if (response.status === 0) {
91
+ // One of the access token requests or the original request was not sent.
92
+ // Most likely one of the CORS pre-flight requests failed, or the browser is offline.
93
+ console.warn('The OpenID Connect call may have issues:\n' +
94
+ '* the CORS pre-flight requests for the OpenID Connect access tokens or for the REST call could be failing\n' +
95
+ '* the browser could be currently offline.');
96
+ }
97
+ }
98
+ if (subscription) {
99
+ subscription.unsubscribe();
100
+ }
101
+ if (retryCallback) {
102
+ retryCallback.error(response);
103
+ retryCallback.complete();
104
+ }
105
+ return throwError(response);
106
+ }
107
+ retryRequest(originalRequest, response, next, retryCount = 0, retryCallback, subscription) {
108
+ if (retryCount < this.maximumRequestRetries()) {
109
+ this.intercept(originalRequest, next, retryCount + 1, retryCallback);
110
+ }
111
+ else {
112
+ console.error('The OpenID Connect call may have issues:\n' +
113
+ '* the client ID could be invalid\n' +
114
+ '* the API Gateway access token could be invalid\n' +
115
+ '* the EU Login access token for the target service could be invalid.');
116
+ if (subscription) {
117
+ subscription.unsubscribe();
118
+ }
119
+ if (retryCallback) {
120
+ retryCallback.error(response);
121
+ retryCallback.complete();
122
+ }
123
+ }
124
+ return of(null);
125
+ }
126
+ apiGatewayTokenExpired(response) {
127
+ if (response && response.status === 401) {
128
+ const message = '' + response.error;
129
+ return message.indexOf('<ams:code>900901</ams:code>') >= 0;
130
+ }
131
+ else {
132
+ return false;
133
+ }
134
+ }
135
+ maximumRequestRetries() {
136
+ if (OpenIdConnect.config && OpenIdConnect.config.maximumRequestRetries >= 0) {
137
+ return OpenIdConnect.config.maximumRequestRetries;
138
+ }
139
+ else {
140
+ return this.defaultMaximumRequestRetries;
141
+ }
142
+ }
143
+ }
144
+ /** @nocollapse */ OpenIdConnectInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OpenIdConnectInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
145
+ /** @nocollapse */ OpenIdConnectInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OpenIdConnectInterceptor });
146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OpenIdConnectInterceptor, decorators: [{
147
+ type: Injectable
148
+ }], ctorParameters: function () { return []; } });
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmlkLWNvbm5lY3QuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ludGVyY2VwdG9ycy9vcGVuaWQvb3BlbmlkLWNvbm5lY3QuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsaUJBQWlCLEVBRWpCLGFBQWEsRUFFYixXQUFXLEdBSWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFPNUMsTUFBTSxPQUFPLHdCQUF3QjtJQUlqQztRQUhBLGlIQUFpSDtRQUNqSCxpQ0FBNEIsR0FBRyxDQUFDLENBQUM7UUFHN0Isd0NBQXdDO1FBQ3hDLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQ1Qsb0VBQW9FLEVBQ3BFLHNIQUFzSCxDQUN6SCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUNMLE9BQXlCLEVBQ3pCLElBQWlCLEVBQ2pCLFVBQVUsR0FBRyxDQUFDLEVBQ2QsYUFBdUM7UUFFdkMsSUFBSSxPQUFPLGFBQWEsS0FBSyxXQUFXLEVBQUU7WUFDdEMsSUFBSSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7WUFDdEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUNwQixpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQzthQUNyRDtZQUVELGFBQWEsQ0FBQyx1QkFBdUIsQ0FDakMsT0FBTyxDQUFDLGFBQWEsRUFDckIsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDYixJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUM7Z0JBQ3pCLElBQUks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QXNFLENBQzdFLENBQUM7WUFDRixJQUFJLFlBQVksRUFBRTtnQkFDZCxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDOUI7WUFDRCxJQUFJLGFBQWEsRUFBRTtnQkFDZixhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDNUI7U0FDSjtRQUVELE9BQU8sRUFBRSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRVMsc0JBQXNCLENBQUMsUUFBMkI7UUFDeEQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDckMsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDcEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlEO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFUyxxQkFBcUI7UUFDM0IsSUFBSSxhQUFhLENBQUMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMscUJBQXFCLElBQUksQ0FBQyxFQUFFO1lBQ3pFLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztTQUNyRDthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUM7U0FDNUM7SUFDTCxDQUFDOzt3SUF0TFEsd0JBQXdCOzRJQUF4Qix3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgSHR0cEVycm9yUmVzcG9uc2UsXG4gICAgSHR0cEV2ZW50LFxuICAgIEh0dHBFdmVudFR5cGUsXG4gICAgSHR0cEhhbmRsZXIsXG4gICAgSHR0cEhlYWRlcnMsXG4gICAgSHR0cEludGVyY2VwdG9yLFxuICAgIEh0dHBSZXF1ZXN0LFxuICAgIEh0dHBSZXNwb25zZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLy8gVGhpcyB2YXJpYWJsZSBpcyBkZWNsYXJlZCBpbiB0aGUgamF2YXNjcmlwdCBmaWxlIG9wZW5pZC1sb2dpbi5qc1xuLy8gYW5kIHdpbGwgYmUgaW1wb3J0ZWQgaW4gdGhlIGVVSSBhcHBsaWNhdGlvbnMnIGluZGV4Lmh0bWwgZmlsZSwgd2hlbiBuZWNlc3NhcnkuXG5kZWNsYXJlIGxldCBPcGVuSWRDb25uZWN0OiBhbnk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPcGVuSWRDb25uZWN0SW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHNob3VsZCBhdCBsZWFzdCBiZSByZXRyaWVzIG9uY2UgaW4gY2FzZSB0aGUgY2FjaGVkIEFQSSBHYXRld2F5IHRva2VuIGV4cGlyZXM6XG4gICAgZGVmYXVsdE1heGltdW1SZXF1ZXN0UmV0cmllcyA9IDE7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIE9wZW5JZENvbm5lY3QgaXMgZGVmaW5lZFxuICAgICAgICBpZiAodHlwZW9mIE9wZW5JZENvbm5lY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdQbGVhc2UgaW5jbHVkZSB0aGUgc2NyaXB0IG9wZW5pZC1sb2dpbi5qcyBpbiB5b3VyIGluZGV4Lmh0bWwgZmlsZS4nLFxuICAgICAgICAgICAgICAgICdGb3IgbW9yZSBkZXRhaWxzLCBwbGVhc2UgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiByZWdhcmRpbmcgdGhlIEh0dHAgSW50ZXJjZXB0b3JzIGFuZCBPcGVuSUQgQ29ubmVjdCBjb25maWd1cmF0aW9uLidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnRlcmNlcHQoXG4gICAgICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgICAgIG5leHQ6IEh0dHBIYW5kbGVyLFxuICAgICAgICByZXRyeUNvdW50ID0gMCxcbiAgICAgICAgcmV0cnlDYWxsYmFjaz86IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+XG4gICAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgICAgICBpZiAodHlwZW9mIE9wZW5JZENvbm5lY3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZXQgYXV0aG9yaXplZFJlcXVlc3QgPSByZXRyeUNhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFhdXRob3JpemVkUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGF1dGhvcml6ZWRSZXF1ZXN0ID0gbmV3IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9wZW5JZENvbm5lY3QuZ2V0QXV0aG9yaXphdGlvbkhlYWRlcnMoXG4gICAgICAgICAgICAgICAgcmVxdWVzdC51cmxXaXRoUGFyYW1zLFxuICAgICAgICAgICAgICAgIChoZWFkZXJzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1JlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0hlYWRlcnMgPSByZXF1ZXN0LmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMgPSBuZXdIZWFkZXJzLnNldChoZWFkZXJOYW1lLCBoZWFkZXJzW2hlYWRlck5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyhoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ld0hlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IG1peCB0aGUgbmV4dCBsaW5lIHdpdGggdGhlIGxpbmUgYmVsb3cgaXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdvdWxkIGdldCBhIFwiQ2Fubm90IGFjY2VzcyAnc3Vic2NyaXB0aW9uJyBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIiBlcnJvci5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGUobmV3UmVxdWVzdClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlLCByZXF1ZXN0LCBuZXh0LCByZXRyeUNvdW50LCBhdXRob3JpemVkUmVxdWVzdCwgc3Vic2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGh0dHBFdmVudDogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6ZWRSZXF1ZXN0Lm5leHQoaHR0cEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0dHBFdmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVkUmVxdWVzdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3JSZXNwb25zZTogWE1MSHR0cFJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQcm9wZXJ0aWVzOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUHJvcGVydGllcy5zdGF0dXMgPSBlcnJvclJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUHJvcGVydGllcy5zdGF0dXNUZXh0ID0gZXJyb3JSZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3JSZXNwb25zZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIdHRwRXJyb3JSZXNwb25zZShlcnJvclByb3BlcnRpZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWRSZXF1ZXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUVycm9yUmVzcG9uc2UoXG4gICAgICAgIHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICAgICAgb3JpZ2luYWxSZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxuICAgICAgICBuZXh0OiBIdHRwSGFuZGxlcixcbiAgICAgICAgcmV0cnlDb3VudDogbnVtYmVyID0gMCxcbiAgICAgICAgcmV0cnlDYWxsYmFjazogU3ViamVjdDxIdHRwRXZlbnQ8YW55Pj4sXG4gICAgICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uXG4gICAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvciAmJiByZXNwb25zZS5lcnJvci5lcnJvciA9PT0gJ2ludmFsaWRfcmVxdWVzdCcpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgSUQgdG9rZW4gaXMgaW52YWxpZCBvciBpbmNvcnJlY3Q7IHJldHJpZXZlIGFub3RoZXIgb25lOlxuICAgICAgICAgICAgICAgIE9wZW5JZENvbm5lY3QucmVuZXdJZFRva2VuKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXBpR2F0ZXdheVRva2VuRXhwaXJlZChyZXNwb25zZSkpIHtcbiAgICAgICAgICAgICAgICBPcGVuSWRDb25uZWN0LmNsZWFyQ2FjaGVkQXBpR2F0ZXdheUFjY2Vzc1Rva2VuKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9yaWdpbmFsUmVxdWVzdCwgcmVzcG9uc2UsIG5leHQsIHJldHJ5Q291bnQsIHJldHJ5Q2FsbGJhY2ssIHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIEVVIExvZ2luIGFjY2VzcyB0b2tlbiBpcyBpbnZhbGlkLiAoNDAzKVxuICAgICAgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgc2VydmljZSBpcyB1bmFibGUgdG8gcmVhZCB0aGUgYWNjZXNzIHRva2VuLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHRoZSBFVSBMb2dpbiBzZXNzaW9uIGVuZGVkLiAoNDAxKVxuICAgICAgICAgICAgICAgIC8vIFJldHJ5IGluIGNhc2UgdGhlIGFjY2VzcyB0b2tlbiBiZWNhbWUgaW52YWxpZCB0b28gcXVpY2tseTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXRyeVJlcXVlc3Qob3JpZ2luYWxSZXF1ZXN0LCByZXNwb25zZSwgbmV4dCwgcmV0cnlDb3VudCwgcmV0cnlDYWxsYmFjaywgc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gT25lIG9mIHRoZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdHMgb3IgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgd2FzIG5vdCBzZW50LlxuICAgICAgICAgICAgICAgIC8vIE1vc3QgbGlrZWx5IG9uZSBvZiB0aGUgQ09SUyBwcmUtZmxpZ2h0IHJlcXVlc3RzIGZhaWxlZCwgb3IgdGhlIGJyb3dzZXIgaXMgb2ZmbGluZS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdUaGUgT3BlbklEIENvbm5lY3QgY2FsbCBtYXkgaGF2ZSBpc3N1ZXM6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKiB0aGUgQ09SUyBwcmUtZmxpZ2h0IHJlcXVlc3RzIGZvciB0aGUgT3BlbklEIENvbm5lY3QgYWNjZXNzIHRva2VucyBvciBmb3IgdGhlIFJFU1QgY2FsbCBjb3VsZCBiZSBmYWlsaW5nXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKiB0aGUgYnJvd3NlciBjb3VsZCBiZSBjdXJyZW50bHkgb2ZmbGluZS4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRyeUNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXRyeUNhbGxiYWNrLmVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJldHJ5Q2FsbGJhY2suY29tcGxldGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmV0cnlSZXF1ZXN0KFxuICAgICAgICBvcmlnaW5hbFJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgICAgIHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICAgICAgbmV4dDogSHR0cEhhbmRsZXIsXG4gICAgICAgIHJldHJ5Q291bnQ6IG51bWJlciA9IDAsXG4gICAgICAgIHJldHJ5Q2FsbGJhY2s6IFN1YmplY3Q8SHR0cEV2ZW50PGFueT4+LFxuICAgICAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvblxuICAgICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgaWYgKHJldHJ5Q291bnQgPCB0aGlzLm1heGltdW1SZXF1ZXN0UmV0cmllcygpKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdChvcmlnaW5hbFJlcXVlc3QsIG5leHQsIHJldHJ5Q291bnQgKyAxLCByZXRyeUNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1RoZSBPcGVuSUQgQ29ubmVjdCBjYWxsIG1heSBoYXZlIGlzc3VlczpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJyogdGhlIGNsaWVudCBJRCBjb3VsZCBiZSBpbnZhbGlkXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICcqIHRoZSBBUEkgR2F0ZXdheSBhY2Nlc3MgdG9rZW4gY291bGQgYmUgaW52YWxpZFxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnKiB0aGUgRVUgTG9naW4gYWNjZXNzIHRva2VuIGZvciB0aGUgdGFyZ2V0IHNlcnZpY2UgY291bGQgYmUgaW52YWxpZC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJldHJ5Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICByZXRyeUNhbGxiYWNrLmVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICByZXRyeUNhbGxiYWNrLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Y8SHR0cEV2ZW50PGFueT4+KG51bGwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcGlHYXRld2F5VG9rZW5FeHBpcmVkKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnJyArIHJlc3BvbnNlLmVycm9yO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuaW5kZXhPZignPGFtczpjb2RlPjkwMDkwMTwvYW1zOmNvZGU+JykgPj0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBtYXhpbXVtUmVxdWVzdFJldHJpZXMoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKE9wZW5JZENvbm5lY3QuY29uZmlnICYmIE9wZW5JZENvbm5lY3QuY29uZmlnLm1heGltdW1SZXF1ZXN0UmV0cmllcyA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gT3BlbklkQ29ubmVjdC5jb25maWcubWF4aW11bVJlcXVlc3RSZXRyaWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1heGltdW1SZXF1ZXN0UmV0cmllcztcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==