@smartbit4all/ng-client 1.1.25 → 1.1.26

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 (259) hide show
  1. package/README.md +386 -386
  2. package/esm2020/lib/session/api/api/api.mjs +4 -4
  3. package/esm2020/lib/session/api/api/session.service.mjs +306 -306
  4. package/esm2020/lib/session/api/configuration.mjs +91 -91
  5. package/esm2020/lib/session/api/encoder.mjs +19 -19
  6. package/esm2020/lib/session/api/index.mjs +3 -3
  7. package/esm2020/lib/session/api/model/accountInfo.mjs +13 -13
  8. package/esm2020/lib/session/api/model/apiError.mjs +13 -13
  9. package/esm2020/lib/session/api/model/authenticationProviderData.mjs +13 -13
  10. package/esm2020/lib/session/api/model/getAuthenticationProvidersResponse.mjs +2 -2
  11. package/esm2020/lib/session/api/model/models.mjs +9 -9
  12. package/esm2020/lib/session/api/model/refreshSessionRequest.mjs +13 -13
  13. package/esm2020/lib/session/api/model/session.mjs +2 -2
  14. package/esm2020/lib/session/api/model/sessionInfoData.mjs +2 -2
  15. package/esm2020/lib/session/api/model/userActivityLog.mjs +13 -13
  16. package/esm2020/lib/session/api/param.mjs +2 -2
  17. package/esm2020/lib/session/api/variables.mjs +9 -9
  18. package/esm2020/lib/session/cookie-service/smart-cookie.service.mjs +225 -225
  19. package/esm2020/lib/session/dev-tool/smart-dev-tool-dialog/smart-dev-tool-dialog.component.mjs +90 -90
  20. package/esm2020/lib/session/dev-tool/smart-dev-tool-dialog/smart-dev-tool-dialog.service.mjs +43 -43
  21. package/esm2020/lib/session/dev-tool/smart-dev-tool-floating-button/smart-dev-tool-floating-button.component.mjs +40 -40
  22. package/esm2020/lib/session/dev-tool/smart-dev-tool.interceptor.mjs +52 -52
  23. package/esm2020/lib/session/dev-tool/smart-dev-tool.service.mjs +161 -161
  24. package/esm2020/lib/session/projects.mjs +12 -12
  25. package/esm2020/lib/session/smart-error-catching.interceptor.mjs +71 -71
  26. package/esm2020/lib/session/smart-header-maintainer.interceptor.mjs +36 -36
  27. package/esm2020/lib/session/smart-session-handler.service.mjs +6 -6
  28. package/esm2020/lib/session/smart-session.module.mjs +74 -74
  29. package/esm2020/lib/session/smart-session.service.mjs +219 -205
  30. package/esm2020/lib/session/smart-timer/smart-session-timer.component.mjs +35 -35
  31. package/esm2020/lib/session/smart-timer/smart-session-timer.service.mjs +51 -51
  32. package/esm2020/lib/smart-client/projects.mjs +6 -6
  33. package/esm2020/lib/smart-client/smart-authentication.service.mjs +15 -15
  34. package/esm2020/lib/smart-client/smart-component-api-client.mjs +316 -316
  35. package/esm2020/lib/smart-client/smart.component.mjs +30 -30
  36. package/esm2020/lib/smart-client/smart.service.mjs +30 -30
  37. package/esm2020/lib/smart-client/smart.subject.mjs +21 -21
  38. package/esm2020/lib/smart-ng-client.module.mjs +20 -20
  39. package/esm2020/lib/smart-ng-client.service.mjs +19 -19
  40. package/esm2020/lib/view-context/api/api/api.mjs +4 -4
  41. package/esm2020/lib/view-context/api/api/view.service.mjs +701 -701
  42. package/esm2020/lib/view-context/api/api.module.mjs +40 -40
  43. package/esm2020/lib/view-context/api/configuration.mjs +91 -91
  44. package/esm2020/lib/view-context/api/encoder.mjs +19 -19
  45. package/esm2020/lib/view-context/api/index.mjs +7 -7
  46. package/esm2020/lib/view-context/api/model/closeResult.mjs +17 -17
  47. package/esm2020/lib/view-context/api/model/componentConstraint.mjs +2 -2
  48. package/esm2020/lib/view-context/api/model/componentModel.mjs +2 -2
  49. package/esm2020/lib/view-context/api/model/componentModelChange.mjs +13 -13
  50. package/esm2020/lib/view-context/api/model/dataChange.mjs +2 -2
  51. package/esm2020/lib/view-context/api/model/dataChangeEvent.mjs +2 -2
  52. package/esm2020/lib/view-context/api/model/dataChangeKind.mjs +17 -17
  53. package/esm2020/lib/view-context/api/model/messageData.mjs +2 -2
  54. package/esm2020/lib/view-context/api/model/messageOption.mjs +2 -2
  55. package/esm2020/lib/view-context/api/model/messageOptionType.mjs +17 -17
  56. package/esm2020/lib/view-context/api/model/messageResult.mjs +2 -2
  57. package/esm2020/lib/view-context/api/model/messageType.mjs +18 -18
  58. package/esm2020/lib/view-context/api/model/models.mjs +37 -37
  59. package/esm2020/lib/view-context/api/model/openPendingData.mjs +2 -2
  60. package/esm2020/lib/view-context/api/model/smartLinkData.mjs +2 -2
  61. package/esm2020/lib/view-context/api/model/uiAction.mjs +2 -2
  62. package/esm2020/lib/view-context/api/model/uiActionButtonDescriptor.mjs +13 -13
  63. package/esm2020/lib/view-context/api/model/uiActionButtonIconPos.mjs +16 -16
  64. package/esm2020/lib/view-context/api/model/uiActionButtonType.mjs +21 -21
  65. package/esm2020/lib/view-context/api/model/uiActionDescriptor.mjs +2 -2
  66. package/esm2020/lib/view-context/api/model/uiActionDialogDescriptor.mjs +2 -2
  67. package/esm2020/lib/view-context/api/model/uiActionFeedbackType.mjs +16 -16
  68. package/esm2020/lib/view-context/api/model/uiActionInputType.mjs +18 -18
  69. package/esm2020/lib/view-context/api/model/uiActionRequest.mjs +13 -13
  70. package/esm2020/lib/view-context/api/model/valueSet.mjs +2 -2
  71. package/esm2020/lib/view-context/api/model/view.mjs +2 -2
  72. package/esm2020/lib/view-context/api/model/viewApiError.mjs +13 -13
  73. package/esm2020/lib/view-context/api/model/viewConstraint.mjs +2 -2
  74. package/esm2020/lib/view-context/api/model/viewContext.mjs +2 -2
  75. package/esm2020/lib/view-context/api/model/viewContextChange.mjs +2 -2
  76. package/esm2020/lib/view-context/api/model/viewContextData.mjs +2 -2
  77. package/esm2020/lib/view-context/api/model/viewContextUpdate.mjs +2 -2
  78. package/esm2020/lib/view-context/api/model/viewData.mjs +2 -2
  79. package/esm2020/lib/view-context/api/model/viewEventHandler.mjs +20 -20
  80. package/esm2020/lib/view-context/api/model/viewState.mjs +21 -21
  81. package/esm2020/lib/view-context/api/model/viewStateUpdate.mjs +2 -2
  82. package/esm2020/lib/view-context/api/model/viewType.mjs +17 -17
  83. package/esm2020/lib/view-context/api/param.mjs +2 -2
  84. package/esm2020/lib/view-context/api/variables.mjs +9 -9
  85. package/esm2020/lib/view-context/message-dialog/message-dialog.component.mjs +63 -63
  86. package/esm2020/lib/view-context/projects.mjs +17 -17
  87. package/esm2020/lib/view-context/property-definition-data.mjs +2 -2
  88. package/esm2020/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +30 -30
  89. package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +53 -53
  90. package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +47 -47
  91. package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +119 -119
  92. package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +51 -51
  93. package/esm2020/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +109 -109
  94. package/esm2020/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +118 -118
  95. package/esm2020/lib/view-context/smart-ui-action/ui-action.model.mjs +7 -7
  96. package/esm2020/lib/view-context/smart-ui-action/ui-action.service.mjs +149 -149
  97. package/esm2020/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +29 -29
  98. package/esm2020/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +69 -69
  99. package/esm2020/lib/view-context/smart-view-context.interceptor.mjs +39 -39
  100. package/esm2020/lib/view-context/smart-view-context.model.mjs +2 -2
  101. package/esm2020/lib/view-context/smart-view-context.module.mjs +84 -84
  102. package/esm2020/lib/view-context/smart-view-context.service.mjs +503 -495
  103. package/esm2020/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +33 -33
  104. package/esm2020/lib/view-context/value-api/api/api.mjs +4 -4
  105. package/esm2020/lib/view-context/value-api/api/value.service.mjs +138 -138
  106. package/esm2020/lib/view-context/value-api/api.module.mjs +40 -40
  107. package/esm2020/lib/view-context/value-api/configuration.mjs +91 -91
  108. package/esm2020/lib/view-context/value-api/encoder.mjs +19 -19
  109. package/esm2020/lib/view-context/value-api/index.mjs +7 -7
  110. package/esm2020/lib/view-context/value-api/model/models.mjs +9 -9
  111. package/esm2020/lib/view-context/value-api/model/value.mjs +13 -13
  112. package/esm2020/lib/view-context/value-api/model/valueSetData.mjs +13 -13
  113. package/esm2020/lib/view-context/value-api/model/valueSetDefinition.mjs +2 -2
  114. package/esm2020/lib/view-context/value-api/model/valueSetDefinitionData.mjs +2 -2
  115. package/esm2020/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +23 -23
  116. package/esm2020/lib/view-context/value-api/model/valueSetExpression.mjs +2 -2
  117. package/esm2020/lib/view-context/value-api/model/valueSetOperand.mjs +2 -2
  118. package/esm2020/lib/view-context/value-api/model/valueSetOperation.mjs +18 -18
  119. package/esm2020/lib/view-context/value-api/param.mjs +2 -2
  120. package/esm2020/lib/view-context/value-api/variables.mjs +9 -9
  121. package/esm2020/projects.mjs +9 -9
  122. package/esm2020/smartbit4all-ng-client.mjs +4 -4
  123. package/fesm2015/smartbit4all-ng-client.mjs +4322 -4300
  124. package/fesm2015/smartbit4all-ng-client.mjs.map +1 -1
  125. package/fesm2020/smartbit4all-ng-client.mjs +4277 -4255
  126. package/fesm2020/smartbit4all-ng-client.mjs.map +1 -1
  127. package/lib/session/api/api/api.d.ts +3 -3
  128. package/lib/session/api/api/session.service.d.ts +107 -107
  129. package/lib/session/api/configuration.d.ts +104 -104
  130. package/lib/session/api/encoder.d.ts +11 -11
  131. package/lib/session/api/index.d.ts +2 -2
  132. package/lib/session/api/model/accountInfo.d.ts +22 -22
  133. package/lib/session/api/model/apiError.d.ts +15 -15
  134. package/lib/session/api/model/authenticationProviderData.d.ts +17 -17
  135. package/lib/session/api/model/getAuthenticationProvidersResponse.d.ts +15 -15
  136. package/lib/session/api/model/models.d.ts +8 -8
  137. package/lib/session/api/model/refreshSessionRequest.d.ts +14 -14
  138. package/lib/session/api/model/session.d.ts +32 -32
  139. package/lib/session/api/model/sessionInfoData.d.ts +22 -22
  140. package/lib/session/api/model/userActivityLog.d.ts +33 -33
  141. package/lib/session/api/param.d.ts +37 -37
  142. package/lib/session/api/variables.d.ts +8 -8
  143. package/lib/session/cookie-service/smart-cookie.service.d.ts +129 -129
  144. package/lib/session/dev-tool/smart-dev-tool-dialog/smart-dev-tool-dialog.component.d.ts +28 -28
  145. package/lib/session/dev-tool/smart-dev-tool-dialog/smart-dev-tool-dialog.service.d.ts +18 -18
  146. package/lib/session/dev-tool/smart-dev-tool-floating-button/smart-dev-tool-floating-button.component.d.ts +15 -15
  147. package/lib/session/dev-tool/smart-dev-tool.interceptor.d.ts +18 -18
  148. package/lib/session/dev-tool/smart-dev-tool.service.d.ts +55 -55
  149. package/lib/session/projects.d.ts +8 -8
  150. package/lib/session/smart-error-catching.interceptor.d.ts +13 -13
  151. package/lib/session/smart-header-maintainer.interceptor.d.ts +11 -11
  152. package/lib/session/smart-session-handler.service.d.ts +11 -11
  153. package/lib/session/smart-session.module.d.ts +15 -15
  154. package/lib/session/smart-session.service.d.ts +51 -50
  155. package/lib/session/smart-timer/smart-session-timer.component.d.ts +14 -14
  156. package/lib/session/smart-timer/smart-session-timer.service.d.ts +21 -21
  157. package/lib/smart-client/projects.d.ts +5 -5
  158. package/lib/smart-client/smart-authentication.service.d.ts +12 -12
  159. package/lib/smart-client/smart-component-api-client.d.ts +71 -71
  160. package/lib/smart-client/smart.component.d.ts +11 -11
  161. package/lib/smart-client/smart.service.d.ts +11 -11
  162. package/lib/smart-client/smart.subject.d.ts +6 -6
  163. package/lib/smart-ng-client.module.d.ts +8 -8
  164. package/lib/smart-ng-client.service.d.ts +10 -10
  165. package/lib/view-context/api/api/api.d.ts +3 -3
  166. package/lib/view-context/api/api/view.service.d.ts +266 -266
  167. package/lib/view-context/api/api.module.d.ts +11 -11
  168. package/lib/view-context/api/configuration.d.ts +104 -104
  169. package/lib/view-context/api/encoder.d.ts +11 -11
  170. package/lib/view-context/api/index.d.ts +6 -6
  171. package/lib/view-context/api/model/closeResult.d.ts +17 -17
  172. package/lib/view-context/api/model/componentConstraint.d.ts +25 -25
  173. package/lib/view-context/api/model/componentModel.d.ts +31 -31
  174. package/lib/view-context/api/model/componentModelChange.d.ts +29 -29
  175. package/lib/view-context/api/model/dataChange.d.ts +27 -27
  176. package/lib/view-context/api/model/dataChangeEvent.d.ts +33 -33
  177. package/lib/view-context/api/model/dataChangeKind.d.ts +20 -20
  178. package/lib/view-context/api/model/messageData.d.ts +29 -29
  179. package/lib/view-context/api/model/messageOption.d.ts +20 -20
  180. package/lib/view-context/api/model/messageOptionType.d.ts +17 -17
  181. package/lib/view-context/api/model/messageResult.d.ts +16 -16
  182. package/lib/view-context/api/model/messageType.d.ts +18 -18
  183. package/lib/view-context/api/model/models.d.ts +36 -36
  184. package/lib/view-context/api/model/openPendingData.d.ts +22 -22
  185. package/lib/view-context/api/model/smartLinkData.d.ts +21 -21
  186. package/lib/view-context/api/model/uiAction.d.ts +29 -29
  187. package/lib/view-context/api/model/uiActionButtonDescriptor.d.ts +18 -18
  188. package/lib/view-context/api/model/uiActionButtonIconPos.d.ts +19 -19
  189. package/lib/view-context/api/model/uiActionButtonType.d.ts +24 -24
  190. package/lib/view-context/api/model/uiActionDescriptor.d.ts +34 -34
  191. package/lib/view-context/api/model/uiActionDialogDescriptor.d.ts +23 -23
  192. package/lib/view-context/api/model/uiActionFeedbackType.d.ts +19 -19
  193. package/lib/view-context/api/model/uiActionInputType.d.ts +18 -18
  194. package/lib/view-context/api/model/uiActionRequest.d.ts +28 -28
  195. package/lib/view-context/api/model/valueSet.d.ts +20 -20
  196. package/lib/view-context/api/model/view.d.ts +68 -68
  197. package/lib/view-context/api/model/viewApiError.d.ts +18 -18
  198. package/lib/view-context/api/model/viewConstraint.d.ts +18 -18
  199. package/lib/view-context/api/model/viewContext.d.ts +22 -22
  200. package/lib/view-context/api/model/viewContextChange.d.ts +20 -20
  201. package/lib/view-context/api/model/viewContextData.d.ts +19 -19
  202. package/lib/view-context/api/model/viewContextUpdate.d.ts +22 -22
  203. package/lib/view-context/api/model/viewData.d.ts +27 -27
  204. package/lib/view-context/api/model/viewEventHandler.d.ts +30 -30
  205. package/lib/view-context/api/model/viewState.d.ts +21 -21
  206. package/lib/view-context/api/model/viewStateUpdate.d.ts +24 -24
  207. package/lib/view-context/api/model/viewType.d.ts +17 -17
  208. package/lib/view-context/api/param.d.ts +37 -37
  209. package/lib/view-context/api/variables.d.ts +8 -8
  210. package/lib/view-context/message-dialog/message-dialog.component.d.ts +17 -17
  211. package/lib/view-context/projects.d.ts +13 -13
  212. package/lib/view-context/property-definition-data.d.ts +5 -5
  213. package/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.d.ts +13 -13
  214. package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.d.ts +25 -25
  215. package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.d.ts +18 -18
  216. package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.d.ts +29 -29
  217. package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.d.ts +25 -25
  218. package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +30 -30
  219. package/lib/view-context/smart-ui-action/ui-action.descriptor.service.d.ts +21 -21
  220. package/lib/view-context/smart-ui-action/ui-action.model.d.ts +32 -32
  221. package/lib/view-context/smart-ui-action/ui-action.service.d.ts +31 -31
  222. package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.d.ts +13 -13
  223. package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.d.ts +19 -19
  224. package/lib/view-context/smart-view-context.interceptor.d.ts +13 -13
  225. package/lib/view-context/smart-view-context.model.d.ts +30 -30
  226. package/lib/view-context/smart-view-context.module.d.ts +20 -20
  227. package/lib/view-context/smart-view-context.service.d.ts +100 -99
  228. package/lib/view-context/smart-view-redirect/smart-view-redirect.d.ts +14 -14
  229. package/lib/view-context/value-api/api/api.d.ts +3 -3
  230. package/lib/view-context/value-api/api/value.service.d.ts +35 -35
  231. package/lib/view-context/value-api/api.module.d.ts +11 -11
  232. package/lib/view-context/value-api/configuration.d.ts +104 -104
  233. package/lib/view-context/value-api/encoder.d.ts +11 -11
  234. package/lib/view-context/value-api/index.d.ts +6 -6
  235. package/lib/view-context/value-api/model/models.d.ts +8 -8
  236. package/lib/view-context/value-api/model/value.d.ts +29 -29
  237. package/lib/view-context/value-api/model/valueSetData.d.ts +41 -41
  238. package/lib/view-context/value-api/model/valueSetDefinition.d.ts +16 -16
  239. package/lib/view-context/value-api/model/valueSetDefinitionData.d.ts +55 -55
  240. package/lib/view-context/value-api/model/valueSetDefinitionKind.d.ts +23 -23
  241. package/lib/view-context/value-api/model/valueSetExpression.d.ts +20 -20
  242. package/lib/view-context/value-api/model/valueSetOperand.d.ts +25 -25
  243. package/lib/view-context/value-api/model/valueSetOperation.d.ts +18 -18
  244. package/lib/view-context/value-api/param.d.ts +37 -37
  245. package/lib/view-context/value-api/variables.d.ts +8 -8
  246. package/package.json +1 -1
  247. package/projects.d.ts +5 -5
  248. package/schematics/collection.json +11 -11
  249. package/schematics/smart-component/index.ts +26 -26
  250. package/schematics/smart-component/schema.json +20 -20
  251. package/schematics/smart-component/smart-component.schema.ts +4 -4
  252. package/schematics/smart-component/templates/__name@dasherize__.component.html.template +2 -2
  253. package/schematics/smart-component/templates/__name@dasherize__.component.ts.template +26 -26
  254. package/smartbit4all-ng-client-1.1.26.tgz +0 -0
  255. package/smartbit4all-ng-client.d.ts +5 -5
  256. package/src/lib/session/api/README.md +226 -226
  257. package/src/lib/view-context/api/README.md +226 -226
  258. package/src/lib/view-context/value-api/README.md +226 -226
  259. package/smartbit4all-ng-client-1.1.25.tgz +0 -0
@@ -1,495 +1,503 @@
1
- import { Injectable } from '@angular/core';
2
- import { Subject, takeUntil } from 'rxjs';
3
- import { ViewState, ViewType, } from './api';
4
- import { MessageDialogComponent } from './message-dialog/message-dialog.component';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./api";
7
- import * as i2 from "../session/smart-session.service";
8
- import * as i3 from "@smartbit4all/navigation";
9
- import * as i4 from "@smartbit4all/dialog";
10
- export const SmartViewContextErrorDialogButtonLabel = 'SmartViewContextErrorDialogButtonLabel';
11
- export const SmartViewContextErrorDialogTitle = 'SmartViewContextErrorDialogTitle';
12
- export const SmartViewContextErrorDialogMessage = 'SmartViewContextErrorDialogMessage';
13
- export class SmartViewContextService {
14
- constructor(view, session, navigation, dialog, apiQueueService) {
15
- this.view = view;
16
- this.session = session;
17
- this.navigation = navigation;
18
- this.dialog = dialog;
19
- this.apiQueueService = apiQueueService;
20
- this.tabIdName = 'viewContextUuid';
21
- this.tabIdhttpHeaderName = 'viewContextUuid';
22
- this.viewHandlers = new Array();
23
- this.openedViewUuids = new Array();
24
- this.openedViewData = new Array();
25
- this.uuidOfPageHasBeenChanged = new Subject();
26
- this.viewContextHasBeenSynced = new Subject();
27
- this.openSmartLink = new Subject();
28
- this.isOpeningSmartLink = false;
29
- this.dialogRefs = [];
30
- this.smartApiClients = new Map();
31
- this.translateServiceChanged = new Subject();
32
- }
33
- set translateService(translateService) {
34
- this._translateService = translateService;
35
- this.translateServiceChanged.next();
36
- this.translateServiceChanged.complete();
37
- }
38
- get translateService() {
39
- if (this._translateService) {
40
- return this._translateService;
41
- }
42
- return undefined;
43
- }
44
- follow(uuid, detectChange) {
45
- this.smartApiClients.set(uuid, detectChange);
46
- }
47
- unfollow(uuid) {
48
- this.smartApiClients.delete(uuid);
49
- }
50
- setActionDescriptors(actionDescriptors) {
51
- this.actionDescriptors = actionDescriptors;
52
- }
53
- getActionDescriptors() {
54
- if (!this.actionDescriptors) {
55
- console.error('No action descriptors has been set to ViewContext.');
56
- }
57
- return this.actionDescriptors;
58
- }
59
- setViewHandlers(viewHandlers) {
60
- this.viewHandlers = viewHandlers;
61
- }
62
- setViewApiErrors(viewApiErrors) {
63
- this.smartViewContextApiErrors = viewApiErrors;
64
- }
65
- setMessageDialogName(messageDialogName) {
66
- this.messageDialogname = messageDialogName;
67
- this.viewHandlers.push({
68
- name: messageDialogName,
69
- component: MessageDialogComponent,
70
- });
71
- }
72
- setUpUrlForViewService() {
73
- this.view.configuration.basePath = this.url;
74
- }
75
- setUrl(url) {
76
- this.url = url + '/view';
77
- this.setUpUrlForViewService();
78
- }
79
- async getAndSyncViewContext(uuid) {
80
- if (!uuid) {
81
- uuid = this.getUuidOfPage(this.tabIdName);
82
- }
83
- await this.getViewContext(uuid).then(() => {
84
- this.syncView();
85
- });
86
- }
87
- async getViewContext(uuid) {
88
- this.viewContext = await this.view.getViewContext(uuid).toPromise();
89
- if (!this.viewContext) {
90
- throw new Error('ViewContext does not exist with the given uuid.');
91
- }
92
- return this.viewContext;
93
- }
94
- async getViewContextDataByPageName(pageName) {
95
- if (!this.viewContext) {
96
- let viewContextUuid = sessionStorage.getItem(this.tabIdName);
97
- if (!viewContextUuid) {
98
- throw new Error('View context is not initialized!');
99
- }
100
- await this.getViewContext(viewContextUuid);
101
- }
102
- let pageUuid = this.getUuidOfPage(pageName);
103
- let viewContextByPageName = this.viewContext?.views.find((view) => view.uuid === pageUuid);
104
- if (!viewContextByPageName) {
105
- throw new Error(`The ViewData of ${pageName} is not found!`);
106
- }
107
- return viewContextByPageName;
108
- }
109
- async updateViewContext(viewContextUpdate) {
110
- this.viewContext = await this.view.updateViewContext(viewContextUpdate).toPromise();
111
- return this.viewContext;
112
- }
113
- clearSessionStorage() {
114
- sessionStorage.clear();
115
- this.openedViewData = [];
116
- this.openedViewUuids = [];
117
- }
118
- setTabId(tabId) {
119
- sessionStorage.setItem(this.tabIdName, tabId);
120
- this.session.addHeaderParam({
121
- headerName: this.tabIdhttpHeaderName,
122
- value: tabId,
123
- });
124
- }
125
- async startViewContext() {
126
- this.clearSessionStorage();
127
- let newViewContext = await this.view
128
- .createViewContext()
129
- .toPromise();
130
- if (!newViewContext) {
131
- throw new Error('No ViewContext was created');
132
- }
133
- this.viewContext = newViewContext;
134
- this.setTabId(newViewContext.uuid);
135
- return this.viewContext;
136
- }
137
- async initialize(uuid) {
138
- if (this.viewHandlers.length === 0) {
139
- throw new Error("There aren't any viewHandlers in SmartViewContextService! Provide some to use its functions.");
140
- }
141
- if (!this.messageDialogname) {
142
- throw new Error('The messageDialogName provided by the backend has not been set.');
143
- }
144
- if (uuid) {
145
- let subscription = this.session.headersUpdated.subscribe(async () => {
146
- subscription.unsubscribe();
147
- try {
148
- await this.getViewContext(uuid);
149
- this.setTabId(uuid);
150
- }
151
- catch (err) {
152
- await this.startViewContext();
153
- }
154
- });
155
- this.setTabId(uuid);
156
- }
157
- else {
158
- await this.startViewContext();
159
- }
160
- return this.viewContext;
161
- }
162
- openView(view) {
163
- let viewHandler = this.viewHandlers.find((handler) => handler.name === view.viewName);
164
- if (!viewHandler) {
165
- throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName}`);
166
- }
167
- if (view.type === ViewType.Dialog) {
168
- if (!viewHandler.component) {
169
- throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
170
- }
171
- let dialogRef = this.dialog.openComponentAsDialog(viewHandler.component, viewHandler.name);
172
- dialogRef.disableClose = true;
173
- // if (view.viewName === this.messageDialogname) {
174
- // if (view.message?.options && view.message.options.length) {
175
- // }
176
- // }
177
- this.dialogRefs.push({
178
- uuid: view.uuid,
179
- dialogRef,
180
- });
181
- }
182
- else if (view.type === ViewType.Normal) {
183
- if (viewHandler.route === undefined) {
184
- throw new Error(`Route is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
185
- }
186
- this.navigation.navigateTo(viewHandler.route.split('/'));
187
- }
188
- else {
189
- throw new Error('The type of the view and its viewHandler is not the same!');
190
- }
191
- view.state = ViewState.Opened;
192
- this.openedViewUuids.push(view.uuid);
193
- this.openedViewData.push(view);
194
- sessionStorage.setItem(view.viewName, view.uuid);
195
- this.uuidOfPageHasBeenChanged.next(view.viewName);
196
- this.updateViewContext({
197
- updates: [
198
- {
199
- state: ViewState.Opened,
200
- uuid: view.uuid,
201
- },
202
- ],
203
- uuid: this.viewContext?.uuid,
204
- });
205
- }
206
- closeView(view) {
207
- let viewHandler = this.viewHandlers.find((handler) => handler.name === view.viewName);
208
- if (!viewHandler) {
209
- throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName}`);
210
- }
211
- if (view.type === ViewType.Dialog) {
212
- let dialogRef = this.dialogRefs.find((dialogRef) => dialogRef.uuid === view.uuid);
213
- if (dialogRef) {
214
- dialogRef.dialogRef.close();
215
- let index = this.dialogRefs.indexOf(dialogRef);
216
- this.dialogRefs.splice(index, 1);
217
- }
218
- else {
219
- throw new Error('DialogRef is not found by uuid.');
220
- }
221
- }
222
- else if (view.type === ViewType.Normal) {
223
- // TODO: close normal page???
224
- // this.navigation.navigateTo(viewHandler.route.split("/"));
225
- }
226
- else {
227
- throw new Error('The type of the view and its viewHandler is not the same!');
228
- }
229
- view.state = ViewState.Closed;
230
- const index = this.openedViewUuids.indexOf(view.uuid);
231
- if (index >= 0) {
232
- this.openedViewUuids.splice(index, 1);
233
- this.openedViewData.splice(index, 1);
234
- sessionStorage.removeItem(view.viewName);
235
- }
236
- this.updateViewContext({
237
- updates: [
238
- {
239
- state: ViewState.Closed,
240
- uuid: view.uuid,
241
- },
242
- ],
243
- uuid: this.viewContext?.uuid,
244
- });
245
- }
246
- async restoreViews(uuid) {
247
- if (!this.viewContext) {
248
- await this.getViewContext(uuid);
249
- }
250
- this.viewContext.views.map((view) => {
251
- this.openView(view);
252
- });
253
- }
254
- syncView() {
255
- this.viewContext?.views.map((view) => {
256
- switch (view.state) {
257
- case ViewState.ToOpen:
258
- this.openView(view);
259
- break;
260
- case ViewState.ToClose:
261
- this.closeView(view);
262
- break;
263
- }
264
- });
265
- const viewDataToClose = this.openedViewData.filter((viewData) => !this.viewContext?.views
266
- .flatMap((viewData) => viewData.uuid)
267
- .includes(viewData.uuid));
268
- if (viewDataToClose?.length) {
269
- viewDataToClose.map((viewData) => {
270
- this.closeView(viewData);
271
- });
272
- }
273
- this.viewContextHasBeenSynced.next();
274
- }
275
- getUuidOfPage(pageName) {
276
- let uuid = sessionStorage.getItem(pageName);
277
- if (!uuid) {
278
- throw new Error(`The uuid of ${pageName} is not available.`);
279
- }
280
- return uuid;
281
- }
282
- async message(messageData, messageResult) {
283
- await this.view
284
- .message(messageData.viewUuid ?? '', messageData.uuid, messageResult)
285
- .toPromise();
286
- await this.getAndSyncViewContext();
287
- }
288
- async getSmartViewContextApiErrorByCode(code) {
289
- let buttonLabel;
290
- let dialogTitle;
291
- let message;
292
- if (this.translateService) {
293
- buttonLabel = await this.translateService
294
- .get(SmartViewContextErrorDialogButtonLabel)
295
- .toPromise();
296
- dialogTitle = await this.translateService.get(SmartViewContextErrorDialogTitle).toPromise();
297
- message = await this.translateService.get(SmartViewContextErrorDialogMessage).toPromise();
298
- }
299
- else {
300
- buttonLabel = 'Ok';
301
- dialogTitle = 'Hiba';
302
- message = 'An error has occured.';
303
- }
304
- if (!this.smartViewContextApiErrors) {
305
- return {
306
- code,
307
- message,
308
- buttonLabel,
309
- dialogTitle,
310
- };
311
- }
312
- let apiErrorsWithCode = this.smartViewContextApiErrors.viewContextApiErrors.filter((apiError) => {
313
- return apiError.code === code;
314
- });
315
- if (!apiErrorsWithCode || (apiErrorsWithCode && !apiErrorsWithCode.length)) {
316
- console.error(`SmartViewContextApiError with code ${code} could not be found.`);
317
- return {
318
- code,
319
- message,
320
- buttonLabel,
321
- dialogTitle,
322
- };
323
- }
324
- return apiErrorsWithCode[0];
325
- }
326
- async getViewConstraint(uuid) {
327
- let viewConstraintResponse = await this.view.getViewConstraint(uuid).toPromise();
328
- if (!viewConstraintResponse)
329
- throw new Error('Could not get ViewConstraint with the given uuid.');
330
- return viewConstraintResponse;
331
- }
332
- async showPublishedView(channel, uuid) {
333
- await this.session.initialize();
334
- // TODO init view context automatically
335
- // await this.initialize();
336
- this.isOpeningSmartLink = true;
337
- this.openSmartLink.next();
338
- await this.openSmartLink.toPromise();
339
- await this.view.showPublishedView(channel, uuid).toPromise();
340
- await this.getAndSyncViewContext();
341
- this.isOpeningSmartLink = false;
342
- }
343
- async downloadResource(uuid, item) {
344
- return await this.view.downloadItem(uuid, item).toPromise();
345
- }
346
- async performAction(uuid, uiActionRequest) {
347
- return await this._performAction({
348
- uuid,
349
- uiActionRequest,
350
- });
351
- // const isCompleted = new Subject<void>();
352
- // this.apiQueueService.addToQueue({
353
- // callback: this._performAction.bind(this),
354
- // config: {
355
- // uuid,
356
- // uiActionRequest,
357
- // },
358
- // isCompleted,
359
- // });
360
- // return await isCompleted.toPromise();
361
- }
362
- async performWidgetAction(uuid, widgetId, nodeId, uiActionRequest) {
363
- return await this._performWidgetAction({ uuid, widgetId, nodeId, uiActionRequest });
364
- // const isCompleted = new Subject<void>();
365
- // this.apiQueueService.addToQueue({
366
- // callback: this._performWidgetAction.bind(this),
367
- // config: {
368
- // uuid,
369
- // widgetId,
370
- // nodeId,
371
- // uiActionRequest,
372
- // },
373
- // isCompleted,
374
- // });
375
- // return await isCompleted.toPromise();
376
- }
377
- async performWidgetMainAction(uuid, widgetId, uiActionRequest) {
378
- return await this._performWidgetMainAction({ uuid, widgetId, uiActionRequest });
379
- // const isCompleted = new Subject<void>();
380
- // this.apiQueueService.addToQueue({
381
- // callback: this._performWidgetMainAction.bind(this),
382
- // config: {
383
- // uuid,
384
- // widgetId,
385
- // uiActionRequest,
386
- // },
387
- // isCompleted,
388
- // });
389
- // return await isCompleted.toPromise();
390
- }
391
- async dataChanged(uuid, dataChange) {
392
- return await this._dataChanged({ uuid, dataChange });
393
- // const isCompleted = new Subject<void>();
394
- // this.apiQueueService.addToQueue(
395
- // {
396
- // callback: this._dataChanged.bind(this),
397
- // config: {
398
- // uuid,
399
- // dataChange,
400
- // },
401
- // isCompleted,
402
- // },
403
- // true
404
- // );
405
- // return await isCompleted.toPromise();
406
- }
407
- async _performAction(config) {
408
- return await this.handlePerformActionResponse(await this.view.performAction(config.uuid, config.uiActionRequest).toPromise());
409
- }
410
- async _performWidgetAction(config) {
411
- return await this.handlePerformActionResponse(await this.view
412
- .performWidgetAction(config.uuid, config.widgetId, config.nodeId, config.uiActionRequest)
413
- .toPromise());
414
- }
415
- async _performWidgetMainAction(config) {
416
- return await this.handlePerformActionResponse(await this.view
417
- .performWidgetMainAction(config.uuid, config.widgetId, config.uiActionRequest)
418
- .toPromise());
419
- }
420
- async _dataChanged(config) {
421
- return await this.handlePerformActionResponse(await this.view.dataChanged(config.uuid, config.dataChange).toPromise());
422
- }
423
- async handlePerformActionResponse(viewContextChange) {
424
- this.viewContext = viewContextChange?.viewContext;
425
- this.syncView();
426
- if (viewContextChange?.changes) {
427
- this.handleChanges(viewContextChange.changes);
428
- }
429
- }
430
- handleChanges(changes) {
431
- changes.forEach((componentModelChange) => {
432
- let detectChange = this.smartApiClients.get(componentModelChange.uuid);
433
- if (detectChange) {
434
- detectChange.next(componentModelChange);
435
- }
436
- });
437
- }
438
- async load(uuid) {
439
- return await this.view.getComponentModel(uuid).toPromise();
440
- }
441
- }
442
- SmartViewContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartViewContextService, deps: [{ token: i1.ViewService }, { token: i2.SmartSessionService }, { token: i3.SmartNavigationService }, { token: i4.SmartdialogService }, { token: ApiQueueService }], target: i0.ɵɵFactoryTarget.Injectable });
443
- SmartViewContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartViewContextService, providedIn: 'root' });
444
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartViewContextService, decorators: [{
445
- type: Injectable,
446
- args: [{
447
- providedIn: 'root',
448
- }]
449
- }], ctorParameters: function () { return [{ type: i1.ViewService }, { type: i2.SmartSessionService }, { type: i3.SmartNavigationService }, { type: i4.SmartdialogService }, { type: ApiQueueService }]; } });
450
- export const IS_ASYNC_PARAM_NAME = 'isAsync';
451
- export class ApiQueueService {
452
- constructor() {
453
- this._destroy$ = new Subject();
454
- this.queue = [];
455
- this.isProcessing = false;
456
- this.queueSubject = new Subject();
457
- this.queueSubject.pipe(takeUntil(this._destroy$)).subscribe(() => this.processQueue());
458
- }
459
- ngOnDestroy() {
460
- this._destroy$.next();
461
- this._destroy$.complete();
462
- }
463
- addToQueue(call, priority = false) {
464
- if (priority) {
465
- this.queue.unshift(call); // Add at the beginning of the queue if it has higher priority
466
- }
467
- else {
468
- this.queue.push(call); // Add at the end of the queue if it has lower priority
469
- }
470
- if (!this.isProcessing) {
471
- this.processQueue();
472
- }
473
- }
474
- async processQueue() {
475
- if (this.queue.length === 0) {
476
- this.isProcessing = false;
477
- return;
478
- }
479
- const apiQueueCall = this.queue.shift();
480
- if (apiQueueCall) {
481
- await apiQueueCall.callback(apiQueueCall.config);
482
- apiQueueCall.isCompleted.complete();
483
- this.queueSubject.next();
484
- }
485
- }
486
- }
487
- ApiQueueService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ApiQueueService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
488
- ApiQueueService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ApiQueueService, providedIn: 'root' });
489
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ApiQueueService, decorators: [{
490
- type: Injectable,
491
- args: [{
492
- providedIn: 'root',
493
- }]
494
- }], ctorParameters: function () { return []; } });
495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcxQyxPQUFPLEVBY0wsU0FBUyxFQUNULFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDOzs7Ozs7QUFTbkYsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsd0NBQXdDLENBQUM7QUFDL0YsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsa0NBQWtDLENBQUM7QUFDbkYsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsb0NBQW9DLENBQUM7QUFLdkYsTUFBTSxPQUFPLHVCQUF1QjtJQTBDbEMsWUFDVSxJQUFpQixFQUNqQixPQUE0QixFQUM1QixVQUFrQyxFQUNsQyxNQUEwQixFQUMxQixlQUFnQztRQUpoQyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBQzFCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQTlDbEMsY0FBUyxHQUFXLGlCQUFpQixDQUFDO1FBQ3RDLHdCQUFtQixHQUFXLGlCQUFpQixDQUFDO1FBSWhELGlCQUFZLEdBQWlDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekQsb0JBQWUsR0FBa0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM3QyxtQkFBYyxHQUFvQixJ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QVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7NkdBdENVLGVBQWU7aUhBQWYsZUFBZSxjQUZkLE1BQU07NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNtYXJ0ZGlhbG9nU2VydmljZSB9IGZyb20gJ0BzbWFydGJpdDRhbGwvZGlhbG9nJztcbmltcG9ydCB7IFNtYXJ0TmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICdAc21hcnRiaXQ0YWxsL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTbWFydFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2Vzc2lvbi9zbWFydC1zZXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgU21hcnRTdWJqZWN0IH0gZnJvbSAnLi4vc21hcnQtY2xpZW50L3NtYXJ0LnN1YmplY3QnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50TW9kZWwsXG4gIENvbXBvbmVudE1vZGVsQ2hhbmdlLFxuICBEYXRhQ2hhbmdlLFxuICBNZXNzYWdlRGF0YSxcbiAgTWVzc2FnZVJlc3VsdCxcbiAgVWlBY3Rpb25EZXNjcmlwdG9yLFxuICBVaUFjdGlvblJlcXVlc3QsXG4gIFZpZXdDb25zdHJhaW50LFxuICBWaWV3Q29udGV4dENoYW5nZSxcbiAgVmlld0NvbnRleHREYXRhLFxuICBWaWV3Q29udGV4dFVwZGF0ZSxcbiAgVmlld0RhdGEsXG4gIFZpZXdTZXJ2aWNlLFxuICBWaWV3U3RhdGUsXG4gIFZpZXdUeXBlLFxufSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBNZXNzYWdlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9tZXNzYWdlLWRpYWxvZy9tZXNzYWdlLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgU21hcnRUcmFuc2xhdGVTZXJ2aWNlLFxuICBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3IsXG4gIFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMsXG4gIFNtYXJ0Vmlld0RpYWxvZ1JlZixcbiAgU21hcnRWaWV3SGFuZGxlck1vZGVsLFxufSBmcm9tICcuL3NtYXJ0LXZpZXctY29udGV4dC5tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbCA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbCc7XG5leHBvcnQgY29uc3QgU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nVGl0bGUgPSAnU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nVGl0bGUnO1xuZXhwb3J0IGNvbnN0IFNtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ01lc3NhZ2UgPSAnU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nTWVzc2FnZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTbWFydFZpZXdDb250ZXh0U2VydmljZSB7XG4gIHByaXZhdGUgdGFiSWROYW1lOiBzdHJpbmcgPSAndmlld0NvbnRleHRVdWlkJztcbiAgcHJpdmF0ZSB0YWJJZGh0dHBIZWFkZXJOYW1lOiBzdHJpbmcgPSAndmlld0NvbnRleHRVdWlkJztcbiAgcHVibGljIG1lc3NhZ2VEaWFsb2duYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXJsPzogc3RyaW5nO1xuICBwcml2YXRlIHZpZXdDb250ZXh0PzogVmlld0NvbnRleHREYXRhO1xuICBwcml2YXRlIHZpZXdIYW5kbGVyczogQXJyYXk8U21hcnRWaWV3SGFuZGxlck1vZGVsPiA9IG5ldyBBcnJheSgpO1xuICBwcml2YXRlIG9wZW5lZFZpZXdVdWlkczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheSgpO1xuICBwcml2YXRlIG9wZW5lZFZpZXdEYXRhOiBBcnJheTxWaWV3RGF0YT4gPSBuZXcgQXJyYXkoKTtcblxuICBwdWJsaWMgdXVpZE9mUGFnZUhhc0JlZW5DaGFuZ2VkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdCgpO1xuICBwdWJsaWMgdmlld0NvbnRleHRIYXNCZWVuU3luY2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwdWJsaWMgc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycz86IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnM7XG5cbiAgcHVibGljIG9wZW5TbWFydExpbms6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuICBwdWJsaWMgaXNPcGVuaW5nU21hcnRMaW5rOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkaWFsb2dSZWZzOiBTbWFydFZpZXdEaWFsb2dSZWZbXSA9IFtdO1xuXG4gIHByaXZhdGUgYWN0aW9uRGVzY3JpcHRvcnM/OiBNYXA8c3RyaW5nLCBVaUFjdGlvbkRlc2NyaXB0b3I+O1xuXG4gIHB1YmxpYyBjb21tb25GZWVkYmFja1RleHQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHNtYXJ0QXBpQ2xpZW50czogTWFwPHN0cmluZywgU21hcnRTdWJqZWN0PGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBzZXQgdHJhbnNsYXRlU2VydmljZSh0cmFuc2xhdGVTZXJ2aWNlOiBTbWFydFRyYW5zbGF0ZVNlcnZpY2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlID0gdHJhbnNsYXRlU2VydmljZTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VDaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VDaGFuZ2VkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRyYW5zbGF0ZVNlcnZpY2UoKTogU21hcnRUcmFuc2xhdGVTZXJ2aWNlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fdHJhbnNsYXRlU2VydmljZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2U7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlPzogU21hcnRUcmFuc2xhdGVTZXJ2aWNlO1xuICBwdWJsaWMgdHJhbnNsYXRlU2VydmljZUNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdmlldzogVmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXNzaW9uOiBTbWFydFNlc3Npb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbmF2aWdhdGlvbjogU21hcnROYXZpZ2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogU21hcnRkaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBpUXVldWVTZXJ2aWNlOiBBcGlRdWV1ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIHB1YmxpYyBmb2xsb3codXVpZDogc3RyaW5nLCBkZXRlY3RDaGFuZ2U6IFNtYXJ0U3ViamVjdDxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5zbWFydEFwaUNsaWVudHMuc2V0KHV1aWQsIGRldGVjdENoYW5nZSk7XG4gIH1cbiAgcHVibGljIHVuZm9sbG93KHV1aWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc21hcnRBcGlDbGllbnRzLmRlbGV0ZSh1dWlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3Rpb25EZXNjcmlwdG9ycyhhY3Rpb25EZXNjcmlwdG9yczogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPik6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uRGVzY3JpcHRvcnMgPSBhY3Rpb25EZXNjcmlwdG9ycztcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3Rpb25EZXNjcmlwdG9ycygpOiBNYXA8c3RyaW5nLCBVaUFjdGlvbkRlc2NyaXB0b3I+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuYWN0aW9uRGVzY3JpcHRvcnMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGFjdGlvbiBkZXNjcmlwdG9ycyBoYXMgYmVlbiBzZXQgdG8gVmlld0NvbnRleHQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFjdGlvbkRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHVibGljIHNldFZpZXdIYW5kbGVycyh2aWV3SGFuZGxlcnM6IEFycmF5PFNtYXJ0Vmlld0hhbmRsZXJNb2RlbD4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdIYW5kbGVycyA9IHZpZXdIYW5kbGVycztcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaWV3QXBpRXJyb3JzKHZpZXdBcGlFcnJvcnM6IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMpOiB2b2lkIHtcbiAgICB0aGlzLnNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMgPSB2aWV3QXBpRXJyb3JzO1xuICB9XG5cbiAgcHVibGljIHNldE1lc3NhZ2VEaWFsb2dOYW1lKG1lc3NhZ2VEaWFsb2dOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VEaWFsb2duYW1lID0gbWVzc2FnZURpYWxvZ05hbWU7XG4gICAgdGhpcy52aWV3SGFuZGxlcnMucHVzaCh7XG4gICAgICBuYW1lOiBtZXNzYWdlRGlhbG9nTmFtZSxcbiAgICAgIGNvbXBvbmVudDogTWVzc2FnZURpYWxvZ0NvbXBvbmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VXBVcmxGb3JWaWV3U2VydmljZSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXcuY29uZmlndXJhdGlvbi5iYXNlUGF0aCA9IHRoaXMudXJsO1xuICB9XG5cbiAgcHVibGljIHNldFVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXJsID0gdXJsICsgJy92aWV3JztcbiAgICB0aGlzLnNldFVwVXJsRm9yVmlld1NlcnZpY2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBbmRTeW5jVmlld0NvbnRleHQodXVpZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdXVpZCkge1xuICAgICAgdXVpZCA9IHRoaXMuZ2V0VXVpZE9mUGFnZSh0aGlzLnRhYklkTmFtZSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0NvbnRleHQodXVpZCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNWaWV3KCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnRleHQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGE+IHtcbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gYXdhaXQgdGhpcy52aWV3LmdldFZpZXdDb250ZXh0KHV1aWQpLnRvUHJvbWlzZSgpO1xuICAgIGlmICghdGhpcy52aWV3Q29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWaWV3Q29udGV4dCBkb2VzIG5vdCBleGlzdCB3aXRoIHRoZSBnaXZlbiB1dWlkLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3Q29udGV4dERhdGFCeVBhZ2VOYW1lKHBhZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFZpZXdEYXRhPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdDb250ZXh0KSB7XG4gICAgICBsZXQgdmlld0NvbnRleHRVdWlkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnRhYklkTmFtZSk7XG4gICAgICBpZiAoIXZpZXdDb250ZXh0VXVpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZXcgY29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQhJyk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdldFZpZXdDb250ZXh0KHZpZXdDb250ZXh0VXVpZCEpO1xuICAgIH1cbiAgICBsZXQgcGFnZVV1aWQgPSB0aGlzLmdldFV1aWRPZlBhZ2UocGFnZU5hbWUpO1xuXG4gICAgbGV0IHZpZXdDb250ZXh0QnlQYWdlTmFtZSA9IHRoaXMudmlld0NvbnRleHQ/LnZpZXdzLmZpbmQoKHZpZXcpID0+IHZpZXcudXVpZCA9PT0gcGFnZVV1aWQpO1xuICAgIGlmICghdmlld0NvbnRleHRCeVBhZ2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBWaWV3RGF0YSBvZiAke3BhZ2VOYW1lfSBpcyBub3QgZm91bmQhYCk7XG4gICAgfVxuICAgIHJldHVybiB2aWV3Q29udGV4dEJ5UGFnZU5hbWU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVmlld0NvbnRleHQoXG4gICAgdmlld0NvbnRleHRVcGRhdGU6IFZpZXdDb250ZXh0VXBkYXRlXG4gICk6IFByb21pc2U8Vmlld0NvbnRleHREYXRhIHwgdW5kZWZpbmVkPiB7XG4gICAgdGhpcy52aWV3Q29udGV4dCA9IGF3YWl0IHRoaXMudmlldy51cGRhdGVWaWV3Q29udGV4dCh2aWV3Q29udGV4dFVwZGF0ZSkudG9Qcm9taXNlKCk7XG5cbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZXNzaW9uU3RvcmFnZSgpOiB2b2lkIHtcbiAgICBzZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xuICAgIHRoaXMub3BlbmVkVmlld0RhdGEgPSBbXTtcbiAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUYWJJZCh0YWJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnRhYklkTmFtZSwgdGFiSWQpO1xuICAgIHRoaXMuc2Vzc2lvbi5hZGRIZWFkZXJQYXJhbSh7XG4gICAgICBoZWFkZXJOYW1lOiB0aGlzLnRhYklkaHR0cEhlYWRlck5hbWUsXG4gICAgICB2YWx1ZTogdGFiSWQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRWaWV3Q29udGV4dCgpOiBQcm9taXNlPFZpZXdDb250ZXh0RGF0YT4ge1xuICAgIHRoaXMuY2xlYXJTZXNzaW9uU3RvcmFnZSgpO1xuXG4gICAgbGV0IG5ld1ZpZXdDb250ZXh0OiBWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQgPSBhd2FpdCB0aGlzLnZpZXdcbiAgICAgIC5jcmVhdGVWaWV3Q29udGV4dCgpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gICAgaWYgKCFuZXdWaWV3Q29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBWaWV3Q29udGV4dCB3YXMgY3JlYXRlZCcpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gbmV3Vmlld0NvbnRleHQ7XG4gICAgdGhpcy5zZXRUYWJJZChuZXdWaWV3Q29udGV4dC51dWlkISk7XG5cbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKHV1aWQ/OiBzdHJpbmcpOiBQcm9taXNlPFZpZXdDb250ZXh0RGF0YT4ge1xuICAgIGlmICh0aGlzLnZpZXdIYW5kbGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGVyZSBhcmVuJ3QgYW55IHZpZXdIYW5kbGVycyBpbiBTbWFydFZpZXdDb250ZXh0U2VydmljZSEgUHJvdmlkZSBzb21lIHRvIHVzZSBpdHMgZnVuY3Rpb25zLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubWVzc2FnZURpYWxvZ25hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG1lc3NhZ2VEaWFsb2dOYW1lIHByb3ZpZGVkIGJ5IHRoZSBiYWNrZW5kIGhhcyBub3QgYmVlbiBzZXQuJyk7XG4gICAgfVxuICAgIGlmICh1dWlkKSB7XG4gICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5zZXNzaW9uLmhlYWRlcnNVcGRhdGVkLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0NvbnRleHQodXVpZCk7XG4gICAgICAgICAgdGhpcy5zZXRUYWJJZCh1dWlkISk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3RhcnRWaWV3Q29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0VGFiSWQodXVpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRWaWV3Q29udGV4dCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0ITtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuVmlldyh2aWV3OiBWaWV3RGF0YSk6IHZvaWQge1xuICAgIGxldCB2aWV3SGFuZGxlcjogU21hcnRWaWV3SGFuZGxlck1vZGVsIHwgdW5kZWZpbmVkID0gdGhpcy52aWV3SGFuZGxlcnMuZmluZChcbiAgICAgIChoYW5kbGVyKSA9PiBoYW5kbGVyLm5hbWUgPT09IHZpZXcudmlld05hbWVcbiAgICApO1xuXG4gICAgaWYgKCF2aWV3SGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2FzIG5vdCBmb3VuZCBieSB2aWV3IG5hbWU6ICR7dmlldy52aWV3TmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuRGlhbG9nKSB7XG4gICAgICBpZiAoIXZpZXdIYW5kbGVyLmNvbXBvbmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvbXBvbmVudCBpcyB1bmRlZmluZWQgaW4gU21hcnRWaWV3SGFuZGxlck1vZGVsIHdpdGggbmFtZTogJHt2aWV3LnZpZXdOYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuQ29tcG9uZW50QXNEaWFsb2codmlld0hhbmRsZXIuY29tcG9uZW50LCB2aWV3SGFuZGxlci5uYW1lKTtcbiAgICAgIGRpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xuICAgICAgLy8gaWYgKHZpZXcudmlld05hbWUgPT09IHRoaXMubWVzc2FnZURpYWxvZ25hbWUpIHtcbiAgICAgIC8vICAgaWYgKHZpZXcubWVzc2FnZT8ub3B0aW9ucyAmJiB2aWV3Lm1lc3NhZ2Uub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgdGhpcy5kaWFsb2dSZWZzLnB1c2goe1xuICAgICAgICB1dWlkOiB2aWV3LnV1aWQsXG4gICAgICAgIGRpYWxvZ1JlZixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5Ob3JtYWwpIHtcbiAgICAgIGlmICh2aWV3SGFuZGxlci5yb3V0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgaXMgdW5kZWZpbmVkIGluIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3aXRoIG5hbWU6ICR7dmlldy52aWV3TmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmF2aWdhdGlvbi5uYXZpZ2F0ZVRvKHZpZXdIYW5kbGVyLnJvdXRlLnNwbGl0KCcvJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB0eXBlIG9mIHRoZSB2aWV3IGFuZCBpdHMgdmlld0hhbmRsZXIgaXMgbm90IHRoZSBzYW1lIScpO1xuICAgIH1cblxuICAgIHZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuT3BlbmVkO1xuXG4gICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMucHVzaCh2aWV3LnV1aWQpO1xuICAgIHRoaXMub3BlbmVkVmlld0RhdGEucHVzaCh2aWV3KTtcblxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odmlldy52aWV3TmFtZSwgdmlldy51dWlkKTtcbiAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZC5uZXh0KHZpZXcudmlld05hbWUpO1xuXG4gICAgdGhpcy51cGRhdGVWaWV3Q29udGV4dCh7XG4gICAgICB1cGRhdGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0ZTogVmlld1N0YXRlLk9wZW5lZCxcbiAgICAgICAgICB1dWlkOiB2aWV3LnV1aWQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdXVpZDogdGhpcy52aWV3Q29udGV4dD8udXVpZCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZVZpZXcodmlldzogVmlld0RhdGEpOiB2b2lkIHtcbiAgICBsZXQgdmlld0hhbmRsZXI6IFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB8IHVuZGVmaW5lZCA9IHRoaXMudmlld0hhbmRsZXJzLmZpbmQoXG4gICAgICAoaGFuZGxlcikgPT4gaGFuZGxlci5uYW1lID09PSB2aWV3LnZpZXdOYW1lXG4gICAgKTtcblxuICAgIGlmICghdmlld0hhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU21hcnRWaWV3SGFuZGxlck1vZGVsIHdhcyBub3QgZm91bmQgYnkgdmlldyBuYW1lOiAke3ZpZXcudmlld05hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuRGlhbG9nKSB7XG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dSZWZzLmZpbmQoXG4gICAgICAgIChkaWFsb2dSZWY6IFNtYXJ0Vmlld0RpYWxvZ1JlZikgPT4gZGlhbG9nUmVmLnV1aWQgPT09IHZpZXcudXVpZFxuICAgICAgKTtcbiAgICAgIGlmIChkaWFsb2dSZWYpIHtcbiAgICAgICAgZGlhbG9nUmVmLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRpYWxvZ1JlZnMuaW5kZXhPZihkaWFsb2dSZWYpO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGlhbG9nUmVmIGlzIG5vdCBmb3VuZCBieSB1dWlkLicpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5Ob3JtYWwpIHtcbiAgICAgIC8vIFRPRE86IGNsb3NlIG5vcm1hbCBwYWdlPz8/XG4gICAgICAvLyB0aGlzLm5hdmlnYXRpb24ubmF2aWdhdGVUbyh2aWV3SGFuZGxlci5yb3V0ZS5zcGxpdChcIi9cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB0eXBlIG9mIHRoZSB2aWV3IGFuZCBpdHMgdmlld0hhbmRsZXIgaXMgbm90IHRoZSBzYW1lIScpO1xuICAgIH1cblxuICAgIHZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuQ2xvc2VkO1xuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9wZW5lZFZpZXdVdWlkcy5pbmRleE9mKHZpZXcudXVpZCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMub3BlbmVkVmlld1V1aWRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHZpZXcudmlld05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVmlld0NvbnRleHQoe1xuICAgICAgdXBkYXRlczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3RhdGU6IFZpZXdTdGF0ZS5DbG9zZWQsXG4gICAgICAgICAgdXVpZDogdmlldy51dWlkLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHV1aWQ6IHRoaXMudmlld0NvbnRleHQ/LnV1aWQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzdG9yZVZpZXdzKHV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy52aWV3Q29udGV4dCkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKTtcbiAgICB9XG4gICAgdGhpcy52aWV3Q29udGV4dCEudmlld3MubWFwKCh2aWV3OiBWaWV3RGF0YSkgPT4ge1xuICAgICAgdGhpcy5vcGVuVmlldyh2aWV3KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzeW5jVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb250ZXh0Py52aWV3cy5tYXAoKHZpZXc6IFZpZXdEYXRhKSA9PiB7XG4gICAgICBzd2l0Y2ggKHZpZXcuc3RhdGUpIHtcbiAgICAgICAgY2FzZSBWaWV3U3RhdGUuVG9PcGVuOlxuICAgICAgICAgIHRoaXMub3BlblZpZXcodmlldyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmlld1N0YXRlLlRvQ2xvc2U6XG4gICAgICAgICAgdGhpcy5jbG9zZVZpZXcodmlldyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2aWV3RGF0YVRvQ2xvc2UgPSB0aGlzLm9wZW5lZFZpZXdEYXRhLmZpbHRlcihcbiAgICAgICh2aWV3RGF0YTogVmlld0RhdGEpID0+XG4gICAgICAgICF0aGlzLnZpZXdDb250ZXh0Py52aWV3c1xuICAgICAgICAgIC5mbGF0TWFwKCh2aWV3RGF0YTogVmlld0RhdGEpID0+IHZpZXdEYXRhLnV1aWQpXG4gICAgICAgICAgLmluY2x1ZGVzKHZpZXdEYXRhLnV1aWQpXG4gICAgKTtcbiAgICBpZiAodmlld0RhdGFUb0Nsb3NlPy5sZW5ndGgpIHtcbiAgICAgIHZpZXdEYXRhVG9DbG9zZS5tYXAoKHZpZXdEYXRhOiBWaWV3RGF0YSkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlVmlldyh2aWV3RGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdDb250ZXh0SGFzQmVlblN5bmNlZC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VXVpZE9mUGFnZShwYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgdXVpZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0ocGFnZU5hbWUpO1xuICAgIGlmICghdXVpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXVpZCBvZiAke3BhZ2VOYW1lfSBpcyBub3QgYXZhaWxhYmxlLmApO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBtZXNzYWdlKG1lc3NhZ2VEYXRhOiBNZXNzYWdlRGF0YSwgbWVzc2FnZVJlc3VsdDogTWVzc2FnZVJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudmlld1xuICAgICAgLm1lc3NhZ2UobWVzc2FnZURhdGEudmlld1V1aWQgPz8gJycsIG1lc3NhZ2VEYXRhLnV1aWQsIG1lc3NhZ2VSZXN1bHQpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gICAgYXdhaXQgdGhpcy5nZXRBbmRTeW5jVmlld0NvbnRleHQoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTbWFydFZpZXdDb250ZXh0QXBpRXJyb3JCeUNvZGUoY29kZTogc3RyaW5nKTogUHJvbWlzZTxTbWFydFZpZXdDb250ZXh0QXBpRXJyb3I+IHtcbiAgICBsZXQgYnV0dG9uTGFiZWw7XG4gICAgbGV0IGRpYWxvZ1RpdGxlO1xuICAgIGxldCBtZXNzYWdlO1xuICAgIGlmICh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgICAgIGJ1dHRvbkxhYmVsID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgICAgIC5nZXQoU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nQnV0dG9uTGFiZWwpXG4gICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgIGRpYWxvZ1RpdGxlID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSkudG9Qcm9taXNlKCk7XG4gICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlKS50b1Byb21pc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnV0dG9uTGFiZWwgPSAnT2snO1xuICAgICAgZGlhbG9nVGl0bGUgPSAnSGliYSc7XG4gICAgICBtZXNzYWdlID0gJ0FuIGVycm9yIGhhcyBvY2N1cmVkLic7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGJ1dHRvbkxhYmVsLFxuICAgICAgICBkaWFsb2dUaXRsZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBhcGlFcnJvcnNXaXRoQ29kZSA9IHRoaXMuc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycy52aWV3Q29udGV4dEFwaUVycm9ycy5maWx0ZXIoXG4gICAgICAoYXBpRXJyb3I6IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gYXBpRXJyb3IuY29kZSA9PT0gY29kZTtcbiAgICAgIH1cbiAgICApO1xuICAgIGlmICghYXBpRXJyb3JzV2l0aENvZGUgfHwgKGFwaUVycm9yc1dpdGhDb2RlICYmICFhcGlFcnJvcnNXaXRoQ29kZS5sZW5ndGgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3Igd2l0aCBjb2RlICR7Y29kZX0gY291bGQgbm90IGJlIGZvdW5kLmApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBidXR0b25MYWJlbCxcbiAgICAgICAgZGlhbG9nVGl0bGUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYXBpRXJyb3JzV2l0aENvZGVbMF07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnN0cmFpbnQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29uc3RyYWludD4ge1xuICAgIGxldCB2aWV3Q29uc3RyYWludFJlc3BvbnNlID0gYXdhaXQgdGhpcy52aWV3LmdldFZpZXdDb25zdHJhaW50KHV1aWQpLnRvUHJvbWlzZSgpO1xuICAgIGlmICghdmlld0NvbnN0cmFpbnRSZXNwb25zZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGdldCBWaWV3Q29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiB1dWlkLicpO1xuICAgIHJldHVybiB2aWV3Q29uc3RyYWludFJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNob3dQdWJsaXNoZWRWaWV3KGNoYW5uZWw6IHN0cmluZywgdXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXNzaW9uLmluaXRpYWxpemUoKTtcbiAgICAvLyBUT0RPIGluaXQgdmlldyBjb250ZXh0IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuaXNPcGVuaW5nU21hcnRMaW5rID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5TbWFydExpbmsubmV4dCgpO1xuICAgIGF3YWl0IHRoaXMub3BlblNtYXJ0TGluay50b1Byb21pc2UoKTtcblxuICAgIGF3YWl0IHRoaXMudmlldy5zaG93UHVibGlzaGVkVmlldyhjaGFubmVsLCB1dWlkKS50b1Byb21pc2UoKTtcbiAgICBhd2FpdCB0aGlzLmdldEFuZFN5bmNWaWV3Q29udGV4dCgpO1xuICAgIHRoaXMuaXNPcGVuaW5nU21hcnRMaW5rID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZG93bmxvYWRSZXNvdXJjZSh1dWlkOiBzdHJpbmcsIGl0ZW06IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudmlldy5kb3dubG9hZEl0ZW0odXVpZCwgaXRlbSkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybUFjdGlvbih1dWlkOiBzdHJpbmcsIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3BlcmZvcm1BY3Rpb24oe1xuICAgICAgdXVpZCxcbiAgICAgIHVpQWN0aW9uUmVxdWVzdCxcbiAgICB9KTtcbiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgLy8gdGhpcy5hcGlRdWV1ZVNlcnZpY2UuYWRkVG9RdWV1ZSh7XG4gICAgLy8gICBjYWxsYmFjazogdGhpcy5fcGVyZm9ybUFjdGlvbi5iaW5kKHRoaXMpLFxuICAgIC8vICAgY29uZmlnOiB7XG4gICAgLy8gICAgIHV1aWQsXG4gICAgLy8gICAgIHVpQWN0aW9uUmVxdWVzdCxcbiAgICAvLyAgIH0sXG4gICAgLy8gICBpc0NvbXBsZXRlZCxcbiAgICAvLyB9KTtcbiAgICAvLyByZXR1cm4gYXdhaXQgaXNDb21wbGV0ZWQudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVdpZGdldEFjdGlvbihcbiAgICB1dWlkOiBzdHJpbmcsXG4gICAgd2lkZ2V0SWQ6IHN0cmluZyxcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyZm9ybVdpZGdldEFjdGlvbih7IHV1aWQsIHdpZGdldElkLCBub2RlSWQsIHVpQWN0aW9uUmVxdWVzdCB9KTtcbiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgLy8gdGhpcy5hcGlRdWV1ZVNlcnZpY2UuYWRkVG9RdWV1ZSh7XG4gICAgLy8gICBjYWxsYmFjazogdGhpcy5fcGVyZm9ybVdpZGdldEFjdGlvbi5iaW5kKHRoaXMpLFxuICAgIC8vICAgY29uZmlnOiB7XG4gICAgLy8gICAgIHV1aWQsXG4gICAgLy8gICAgIHdpZGdldElkLFxuICAgIC8vICAgICBub2RlSWQsXG4gICAgLy8gICAgIHVpQWN0aW9uUmVxdWVzdCxcbiAgICAvLyAgIH0sXG4gICAgLy8gICBpc0NvbXBsZXRlZCxcbiAgICAvLyB9KTtcbiAgICAvLyByZXR1cm4gYXdhaXQgaXNDb21wbGV0ZWQudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVdpZGdldE1haW5BY3Rpb24oXG4gICAgdXVpZDogc3RyaW5nLFxuICAgIHdpZGdldElkOiBzdHJpbmcsXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3RcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3BlcmZvcm1XaWRnZXRNYWluQWN0aW9uKHsgdXVpZCwgd2lkZ2V0SWQsIHVpQWN0aW9uUmVxdWVzdCB9KTtcbiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgLy8gdGhpcy5hcGlRdWV1ZVNlcnZpY2UuYWRkVG9RdWV1ZSh7XG4gICAgLy8gICBjYWxsYmFjazogdGhpcy5fcGVyZm9ybVdpZGdldE1haW5BY3Rpb24uYmluZCh0aGlzKSxcbiAgICAvLyAgIGNvbmZpZzoge1xuICAgIC8vICAgICB1dWlkLFxuICAgIC8vICAgICB3aWRnZXRJZCxcbiAgICAvLyAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgIC8vICAgfSxcbiAgICAvLyAgIGlzQ29tcGxldGVkLFxuICAgIC8vIH0pO1xuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkYXRhQ2hhbmdlZCh1dWlkOiBzdHJpbmcsIGRhdGFDaGFuZ2U6IERhdGFDaGFuZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGF0YUNoYW5nZWQoeyB1dWlkLCBkYXRhQ2hhbmdlIH0pO1xuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKFxuICAgIC8vICAge1xuICAgIC8vICAgICBjYWxsYmFjazogdGhpcy5fZGF0YUNoYW5nZWQuYmluZCh0aGlzKSxcbiAgICAvLyAgICAgY29uZmlnOiB7XG4gICAgLy8gICAgICAgdXVpZCxcbiAgICAvLyAgICAgICBkYXRhQ2hhbmdlLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBpc0NvbXBsZXRlZCxcbiAgICAvLyAgIH0sXG4gICAgLy8gICB0cnVlXG4gICAgLy8gKTtcbiAgICAvLyByZXR1cm4gYXdhaXQgaXNDb21wbGV0ZWQudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtQWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxuICAgICAgYXdhaXQgdGhpcy52aWV3LnBlcmZvcm1BY3Rpb24oY29uZmlnLnV1aWQsIGNvbmZpZy51aUFjdGlvblJlcXVlc3QpLnRvUHJvbWlzZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3BlcmZvcm1XaWRnZXRBY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXG4gICAgICBhd2FpdCB0aGlzLnZpZXdcbiAgICAgICAgLnBlcmZvcm1XaWRnZXRBY3Rpb24oY29uZmlnLnV1aWQsIGNvbmZpZy53aWRnZXRJZCwgY29uZmlnLm5vZGVJZCwgY29uZmlnLnVpQWN0aW9uUmVxdWVzdClcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3BlcmZvcm1XaWRnZXRNYWluQWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxuICAgICAgYXdhaXQgdGhpcy52aWV3XG4gICAgICAgIC5wZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbihjb25maWcudXVpZCwgY29uZmlnLndpZGdldElkLCBjb25maWcudWlBY3Rpb25SZXF1ZXN0KVxuICAgICAgICAudG9Qcm9taXNlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZGF0YUNoYW5nZWQoY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXG4gICAgICBhd2FpdCB0aGlzLnZpZXcuZGF0YUNoYW5nZWQoY29uZmlnLnV1aWQsIGNvbmZpZy5kYXRhQ2hhbmdlKS50b1Byb21pc2UoKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxuICAgIHZpZXdDb250ZXh0Q2hhbmdlOiBWaWV3Q29udGV4dENoYW5nZSB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gdmlld0NvbnRleHRDaGFuZ2U/LnZpZXdDb250ZXh0O1xuICAgIHRoaXMuc3luY1ZpZXcoKTtcblxuICAgIGlmICh2aWV3Q29udGV4dENoYW5nZT8uY2hhbmdlcykge1xuICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VzKHZpZXdDb250ZXh0Q2hhbmdlLmNoYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbmdlcyhjaGFuZ2VzOiBBcnJheTxDb21wb25lbnRNb2RlbENoYW5nZT4pOiB2b2lkIHtcbiAgICBjaGFuZ2VzLmZvckVhY2goKGNvbXBvbmVudE1vZGVsQ2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSkgPT4ge1xuICAgICAgbGV0IGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PENvbXBvbmVudE1vZGVsQ2hhbmdlPiB8IHVuZGVmaW5lZCA9IHRoaXMuc21hcnRBcGlDbGllbnRzLmdldChcbiAgICAgICAgY29tcG9uZW50TW9kZWxDaGFuZ2UudXVpZFxuICAgICAgKTtcbiAgICAgIGlmIChkZXRlY3RDaGFuZ2UpIHtcbiAgICAgICAgZGV0ZWN0Q2hhbmdlLm5leHQoY29tcG9uZW50TW9kZWxDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRNb2RlbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnZpZXcuZ2V0Q29tcG9uZW50TW9kZWwodXVpZCkudG9Qcm9taXNlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IElTX0FTWU5DX1BBUkFNX05BTUUgPSAnaXNBc3luYyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpUXVldWVDYWxsIHtcbiAgY2FsbGJhY2s6IChjb25maWc6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuICBjb25maWc6IGFueTtcbiAgaXNDb21wbGV0ZWQ6IFN1YmplY3Q8dm9pZD47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBcGlRdWV1ZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBxdWV1ZTogQXBpUXVldWVDYWxsW10gPSBbXTtcbiAgcHJpdmF0ZSBpc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBxdWV1ZVN1YmplY3Q6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucXVldWVTdWJqZWN0LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucHJvY2Vzc1F1ZXVlKCkpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgYWRkVG9RdWV1ZShjYWxsOiBBcGlRdWV1ZUNhbGwsIHByaW9yaXR5OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAocHJpb3JpdHkpIHtcbiAgICAgIHRoaXMucXVldWUudW5zaGlmdChjYWxsKTsgLy8gQWRkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlIGlmIGl0IGhhcyBoaWdoZXIgcHJpb3JpdHlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGNhbGwpOyAvLyBBZGQgYXQgdGhlIGVuZCBvZiB0aGUgcXVldWUgaWYgaXQgaGFzIGxvd2VyIHByaW9yaXR5XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1Byb2Nlc3NpbmcpIHtcbiAgICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlRdWV1ZUNhbGwgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgaWYgKGFwaVF1ZXVlQ2FsbCkge1xuICAgICAgYXdhaXQgYXBpUXVldWVDYWxsLmNhbGxiYWNrKGFwaVF1ZXVlQ2FsbC5jb25maWcpO1xuICAgICAgYXBpUXVldWVDYWxsLmlzQ29tcGxldGVkLmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLnF1ZXVlU3ViamVjdC5uZXh0KCk7XG4gICAgfVxuICB9XG59XG4iXX0=
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject, takeUntil } from 'rxjs';
3
+ import { ViewState, ViewType, } from './api';
4
+ import { MessageDialogComponent } from './message-dialog/message-dialog.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./api";
7
+ import * as i2 from "../session/smart-session.service";
8
+ import * as i3 from "@smartbit4all/navigation";
9
+ import * as i4 from "@smartbit4all/dialog";
10
+ export const SmartViewContextErrorDialogButtonLabel = 'SmartViewContextErrorDialogButtonLabel';
11
+ export const SmartViewContextErrorDialogTitle = 'SmartViewContextErrorDialogTitle';
12
+ export const SmartViewContextErrorDialogMessage = 'SmartViewContextErrorDialogMessage';
13
+ export class SmartViewContextService {
14
+ constructor(view, session, navigation, dialog, apiQueueService) {
15
+ this.view = view;
16
+ this.session = session;
17
+ this.navigation = navigation;
18
+ this.dialog = dialog;
19
+ this.apiQueueService = apiQueueService;
20
+ this.tabIdName = 'viewContextUuid';
21
+ this.tabIdhttpHeaderName = 'viewContextUuid';
22
+ this.viewHandlers = new Array();
23
+ this.openedViewUuids = new Array();
24
+ this.openedViewData = new Array();
25
+ this.uuidOfPageHasBeenChanged = new Subject();
26
+ this.viewContextHasBeenSynced = new Subject();
27
+ this.openSmartLink = new Subject();
28
+ this.isOpeningSmartLink = false;
29
+ this.dialogRefs = [];
30
+ this.smartApiClients = new Map();
31
+ this.translateServiceChanged = new Subject();
32
+ }
33
+ set translateService(translateService) {
34
+ this._translateService = translateService;
35
+ this.translateServiceChanged.next();
36
+ this.translateServiceChanged.complete();
37
+ }
38
+ get translateService() {
39
+ if (this._translateService) {
40
+ return this._translateService;
41
+ }
42
+ return undefined;
43
+ }
44
+ follow(uuid, detectChange) {
45
+ this.smartApiClients.set(uuid, detectChange);
46
+ }
47
+ unfollow(uuid) {
48
+ this.smartApiClients.delete(uuid);
49
+ }
50
+ setActionDescriptors(actionDescriptors) {
51
+ this.actionDescriptors = actionDescriptors;
52
+ }
53
+ getActionDescriptors() {
54
+ if (!this.actionDescriptors) {
55
+ console.error('No action descriptors has been set to ViewContext.');
56
+ }
57
+ return this.actionDescriptors;
58
+ }
59
+ setViewHandlers(viewHandlers) {
60
+ this.viewHandlers = viewHandlers;
61
+ }
62
+ setViewApiErrors(viewApiErrors) {
63
+ this.smartViewContextApiErrors = viewApiErrors;
64
+ }
65
+ setMessageDialogName(messageDialogName) {
66
+ this.messageDialogname = messageDialogName;
67
+ this.viewHandlers.push({
68
+ name: messageDialogName,
69
+ component: MessageDialogComponent,
70
+ });
71
+ }
72
+ setUpUrlForViewService() {
73
+ this.view.configuration.basePath = this.url;
74
+ }
75
+ setUrl(url) {
76
+ this.url = url + '/view';
77
+ this.setUpUrlForViewService();
78
+ }
79
+ async getAndSyncViewContext(uuid) {
80
+ if (!uuid) {
81
+ uuid = this.getUuidOfPage(this.tabIdName);
82
+ }
83
+ await this.getViewContext(uuid).then(() => {
84
+ this.syncView();
85
+ });
86
+ }
87
+ async getViewContext(uuid) {
88
+ this.viewContext = await this.view.getViewContext(uuid).toPromise();
89
+ if (!this.viewContext) {
90
+ throw new Error('ViewContext does not exist with the given uuid.');
91
+ }
92
+ return this.viewContext;
93
+ }
94
+ async getViewContextDataByPageName(pageName) {
95
+ if (!this.viewContext) {
96
+ let viewContextUuid = sessionStorage.getItem(this.tabIdName);
97
+ if (!viewContextUuid) {
98
+ throw new Error('View context is not initialized!');
99
+ }
100
+ await this.getViewContext(viewContextUuid);
101
+ }
102
+ let pageUuid = this.getUuidOfPage(pageName);
103
+ let viewContextByPageName = this.viewContext?.views.find((view) => view.uuid === pageUuid);
104
+ if (!viewContextByPageName) {
105
+ throw new Error(`The ViewData of ${pageName} is not found!`);
106
+ }
107
+ return viewContextByPageName;
108
+ }
109
+ async updateViewContext(viewContextUpdate) {
110
+ this.viewContext = await this.view.updateViewContext(viewContextUpdate).toPromise();
111
+ return this.viewContext;
112
+ }
113
+ clearSessionStorage() {
114
+ sessionStorage.clear();
115
+ this.openedViewData = [];
116
+ this.openedViewUuids = [];
117
+ }
118
+ setTabId(tabId) {
119
+ sessionStorage.setItem(this.tabIdName, tabId);
120
+ this.session.addHeaderParam({
121
+ headerName: this.tabIdhttpHeaderName,
122
+ value: tabId,
123
+ });
124
+ }
125
+ async startViewContext() {
126
+ this.clearSessionStorage();
127
+ let newViewContext = await this.view
128
+ .createViewContext()
129
+ .toPromise();
130
+ if (!newViewContext) {
131
+ throw new Error('No ViewContext was created');
132
+ }
133
+ this.viewContext = newViewContext;
134
+ this.setTabId(newViewContext.uuid);
135
+ return this.viewContext;
136
+ }
137
+ async initialize(uuid) {
138
+ if (this.initializeRunning) {
139
+ return this.initializeRunning.toPromise();
140
+ }
141
+ else {
142
+ this.initializeRunning = new Subject();
143
+ try {
144
+ if (this.viewHandlers.length === 0) {
145
+ throw new Error("There aren't any viewHandlers in SmartViewContextService! Provide some to use its functions.");
146
+ }
147
+ if (!this.messageDialogname) {
148
+ throw new Error('The messageDialogName provided by the backend has not been set.');
149
+ }
150
+ if (uuid) {
151
+ this.setTabId(uuid);
152
+ try {
153
+ await this.getViewContext(uuid);
154
+ }
155
+ catch (err) {
156
+ await this.startViewContext();
157
+ }
158
+ }
159
+ else {
160
+ await this.startViewContext();
161
+ }
162
+ return this.viewContext;
163
+ }
164
+ finally {
165
+ this.initializeRunning.next(this.viewContext);
166
+ this.initializeRunning = undefined;
167
+ }
168
+ }
169
+ }
170
+ openView(view) {
171
+ let viewHandler = this.viewHandlers.find((handler) => handler.name === view.viewName);
172
+ if (!viewHandler) {
173
+ throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName}`);
174
+ }
175
+ if (view.type === ViewType.Dialog) {
176
+ if (!viewHandler.component) {
177
+ throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
178
+ }
179
+ let dialogRef = this.dialog.openComponentAsDialog(viewHandler.component, viewHandler.name);
180
+ dialogRef.disableClose = true;
181
+ // if (view.viewName === this.messageDialogname) {
182
+ // if (view.message?.options && view.message.options.length) {
183
+ // }
184
+ // }
185
+ this.dialogRefs.push({
186
+ uuid: view.uuid,
187
+ dialogRef,
188
+ });
189
+ }
190
+ else if (view.type === ViewType.Normal) {
191
+ if (viewHandler.route === undefined) {
192
+ throw new Error(`Route is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
193
+ }
194
+ this.navigation.navigateTo(viewHandler.route.split('/'));
195
+ }
196
+ else {
197
+ throw new Error('The type of the view and its viewHandler is not the same!');
198
+ }
199
+ view.state = ViewState.Opened;
200
+ this.openedViewUuids.push(view.uuid);
201
+ this.openedViewData.push(view);
202
+ sessionStorage.setItem(view.viewName, view.uuid);
203
+ this.uuidOfPageHasBeenChanged.next(view.viewName);
204
+ this.updateViewContext({
205
+ updates: [
206
+ {
207
+ state: ViewState.Opened,
208
+ uuid: view.uuid,
209
+ },
210
+ ],
211
+ uuid: this.viewContext?.uuid,
212
+ });
213
+ }
214
+ closeView(view) {
215
+ let viewHandler = this.viewHandlers.find((handler) => handler.name === view.viewName);
216
+ if (!viewHandler) {
217
+ throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName}`);
218
+ }
219
+ if (view.type === ViewType.Dialog) {
220
+ let dialogRef = this.dialogRefs.find((dialogRef) => dialogRef.uuid === view.uuid);
221
+ if (dialogRef) {
222
+ dialogRef.dialogRef.close();
223
+ let index = this.dialogRefs.indexOf(dialogRef);
224
+ this.dialogRefs.splice(index, 1);
225
+ }
226
+ else {
227
+ throw new Error('DialogRef is not found by uuid.');
228
+ }
229
+ }
230
+ else if (view.type === ViewType.Normal) {
231
+ // TODO: close normal page???
232
+ // this.navigation.navigateTo(viewHandler.route.split("/"));
233
+ }
234
+ else {
235
+ throw new Error('The type of the view and its viewHandler is not the same!');
236
+ }
237
+ view.state = ViewState.Closed;
238
+ const index = this.openedViewUuids.indexOf(view.uuid);
239
+ if (index >= 0) {
240
+ this.openedViewUuids.splice(index, 1);
241
+ this.openedViewData.splice(index, 1);
242
+ sessionStorage.removeItem(view.viewName);
243
+ }
244
+ this.updateViewContext({
245
+ updates: [
246
+ {
247
+ state: ViewState.Closed,
248
+ uuid: view.uuid,
249
+ },
250
+ ],
251
+ uuid: this.viewContext?.uuid,
252
+ });
253
+ }
254
+ async restoreViews(uuid) {
255
+ if (!this.viewContext) {
256
+ await this.getViewContext(uuid);
257
+ }
258
+ this.viewContext.views.map((view) => {
259
+ this.openView(view);
260
+ });
261
+ }
262
+ syncView() {
263
+ this.viewContext?.views.map((view) => {
264
+ switch (view.state) {
265
+ case ViewState.ToOpen:
266
+ this.openView(view);
267
+ break;
268
+ case ViewState.ToClose:
269
+ this.closeView(view);
270
+ break;
271
+ }
272
+ });
273
+ const viewDataToClose = this.openedViewData.filter((viewData) => !this.viewContext?.views
274
+ .flatMap((viewData) => viewData.uuid)
275
+ .includes(viewData.uuid));
276
+ if (viewDataToClose?.length) {
277
+ viewDataToClose.map((viewData) => {
278
+ this.closeView(viewData);
279
+ });
280
+ }
281
+ this.viewContextHasBeenSynced.next();
282
+ }
283
+ getUuidOfPage(pageName) {
284
+ let uuid = sessionStorage.getItem(pageName);
285
+ if (!uuid) {
286
+ throw new Error(`The uuid of ${pageName} is not available.`);
287
+ }
288
+ return uuid;
289
+ }
290
+ async message(messageData, messageResult) {
291
+ await this.view
292
+ .message(messageData.viewUuid ?? '', messageData.uuid, messageResult)
293
+ .toPromise();
294
+ await this.getAndSyncViewContext();
295
+ }
296
+ async getSmartViewContextApiErrorByCode(code) {
297
+ let buttonLabel;
298
+ let dialogTitle;
299
+ let message;
300
+ if (this.translateService) {
301
+ buttonLabel = await this.translateService
302
+ .get(SmartViewContextErrorDialogButtonLabel)
303
+ .toPromise();
304
+ dialogTitle = await this.translateService.get(SmartViewContextErrorDialogTitle).toPromise();
305
+ message = await this.translateService.get(SmartViewContextErrorDialogMessage).toPromise();
306
+ }
307
+ else {
308
+ buttonLabel = 'Ok';
309
+ dialogTitle = 'Hiba';
310
+ message = 'An error has occured.';
311
+ }
312
+ if (!this.smartViewContextApiErrors) {
313
+ return {
314
+ code,
315
+ message,
316
+ buttonLabel,
317
+ dialogTitle,
318
+ };
319
+ }
320
+ let apiErrorsWithCode = this.smartViewContextApiErrors.viewContextApiErrors.filter((apiError) => {
321
+ return apiError.code === code;
322
+ });
323
+ if (!apiErrorsWithCode || (apiErrorsWithCode && !apiErrorsWithCode.length)) {
324
+ console.error(`SmartViewContextApiError with code ${code} could not be found.`);
325
+ return {
326
+ code,
327
+ message,
328
+ buttonLabel,
329
+ dialogTitle,
330
+ };
331
+ }
332
+ return apiErrorsWithCode[0];
333
+ }
334
+ async getViewConstraint(uuid) {
335
+ let viewConstraintResponse = await this.view.getViewConstraint(uuid).toPromise();
336
+ if (!viewConstraintResponse)
337
+ throw new Error('Could not get ViewConstraint with the given uuid.');
338
+ return viewConstraintResponse;
339
+ }
340
+ async showPublishedView(channel, uuid) {
341
+ await this.session.initialize();
342
+ // TODO init view context automatically
343
+ // await this.initialize();
344
+ this.isOpeningSmartLink = true;
345
+ this.openSmartLink.next();
346
+ await this.openSmartLink.toPromise();
347
+ await this.view.showPublishedView(channel, uuid).toPromise();
348
+ await this.getAndSyncViewContext();
349
+ this.isOpeningSmartLink = false;
350
+ }
351
+ async downloadResource(uuid, item) {
352
+ return await this.view.downloadItem(uuid, item).toPromise();
353
+ }
354
+ async performAction(uuid, uiActionRequest) {
355
+ return await this._performAction({
356
+ uuid,
357
+ uiActionRequest,
358
+ });
359
+ // const isCompleted = new Subject<void>();
360
+ // this.apiQueueService.addToQueue({
361
+ // callback: this._performAction.bind(this),
362
+ // config: {
363
+ // uuid,
364
+ // uiActionRequest,
365
+ // },
366
+ // isCompleted,
367
+ // });
368
+ // return await isCompleted.toPromise();
369
+ }
370
+ async performWidgetAction(uuid, widgetId, nodeId, uiActionRequest) {
371
+ return await this._performWidgetAction({ uuid, widgetId, nodeId, uiActionRequest });
372
+ // const isCompleted = new Subject<void>();
373
+ // this.apiQueueService.addToQueue({
374
+ // callback: this._performWidgetAction.bind(this),
375
+ // config: {
376
+ // uuid,
377
+ // widgetId,
378
+ // nodeId,
379
+ // uiActionRequest,
380
+ // },
381
+ // isCompleted,
382
+ // });
383
+ // return await isCompleted.toPromise();
384
+ }
385
+ async performWidgetMainAction(uuid, widgetId, uiActionRequest) {
386
+ return await this._performWidgetMainAction({ uuid, widgetId, uiActionRequest });
387
+ // const isCompleted = new Subject<void>();
388
+ // this.apiQueueService.addToQueue({
389
+ // callback: this._performWidgetMainAction.bind(this),
390
+ // config: {
391
+ // uuid,
392
+ // widgetId,
393
+ // uiActionRequest,
394
+ // },
395
+ // isCompleted,
396
+ // });
397
+ // return await isCompleted.toPromise();
398
+ }
399
+ async dataChanged(uuid, dataChange) {
400
+ return await this._dataChanged({ uuid, dataChange });
401
+ // const isCompleted = new Subject<void>();
402
+ // this.apiQueueService.addToQueue(
403
+ // {
404
+ // callback: this._dataChanged.bind(this),
405
+ // config: {
406
+ // uuid,
407
+ // dataChange,
408
+ // },
409
+ // isCompleted,
410
+ // },
411
+ // true
412
+ // );
413
+ // return await isCompleted.toPromise();
414
+ }
415
+ async _performAction(config) {
416
+ return await this.handlePerformActionResponse(await this.view.performAction(config.uuid, config.uiActionRequest).toPromise());
417
+ }
418
+ async _performWidgetAction(config) {
419
+ return await this.handlePerformActionResponse(await this.view
420
+ .performWidgetAction(config.uuid, config.widgetId, config.nodeId, config.uiActionRequest)
421
+ .toPromise());
422
+ }
423
+ async _performWidgetMainAction(config) {
424
+ return await this.handlePerformActionResponse(await this.view
425
+ .performWidgetMainAction(config.uuid, config.widgetId, config.uiActionRequest)
426
+ .toPromise());
427
+ }
428
+ async _dataChanged(config) {
429
+ return await this.handlePerformActionResponse(await this.view.dataChanged(config.uuid, config.dataChange).toPromise());
430
+ }
431
+ async handlePerformActionResponse(viewContextChange) {
432
+ this.viewContext = viewContextChange?.viewContext;
433
+ this.syncView();
434
+ if (viewContextChange?.changes) {
435
+ this.handleChanges(viewContextChange.changes);
436
+ }
437
+ }
438
+ handleChanges(changes) {
439
+ changes.forEach((componentModelChange) => {
440
+ let detectChange = this.smartApiClients.get(componentModelChange.uuid);
441
+ if (detectChange) {
442
+ detectChange.next(componentModelChange);
443
+ }
444
+ });
445
+ }
446
+ async load(uuid) {
447
+ return await this.view.getComponentModel(uuid).toPromise();
448
+ }
449
+ }
450
+ SmartViewContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartViewContextService, deps: [{ token: i1.ViewService }, { token: i2.SmartSessionService }, { token: i3.SmartNavigationService }, { token: i4.SmartdialogService }, { token: ApiQueueService }], target: i0.ɵɵFactoryTarget.Injectable });
451
+ SmartViewContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartViewContextService, providedIn: 'root' });
452
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartViewContextService, decorators: [{
453
+ type: Injectable,
454
+ args: [{
455
+ providedIn: 'root',
456
+ }]
457
+ }], ctorParameters: function () { return [{ type: i1.ViewService }, { type: i2.SmartSessionService }, { type: i3.SmartNavigationService }, { type: i4.SmartdialogService }, { type: ApiQueueService }]; } });
458
+ export const IS_ASYNC_PARAM_NAME = 'isAsync';
459
+ export class ApiQueueService {
460
+ constructor() {
461
+ this._destroy$ = new Subject();
462
+ this.queue = [];
463
+ this.isProcessing = false;
464
+ this.queueSubject = new Subject();
465
+ this.queueSubject.pipe(takeUntil(this._destroy$)).subscribe(() => this.processQueue());
466
+ }
467
+ ngOnDestroy() {
468
+ this._destroy$.next();
469
+ this._destroy$.complete();
470
+ }
471
+ addToQueue(call, priority = false) {
472
+ if (priority) {
473
+ this.queue.unshift(call); // Add at the beginning of the queue if it has higher priority
474
+ }
475
+ else {
476
+ this.queue.push(call); // Add at the end of the queue if it has lower priority
477
+ }
478
+ if (!this.isProcessing) {
479
+ this.processQueue();
480
+ }
481
+ }
482
+ async processQueue() {
483
+ if (this.queue.length === 0) {
484
+ this.isProcessing = false;
485
+ return;
486
+ }
487
+ const apiQueueCall = this.queue.shift();
488
+ if (apiQueueCall) {
489
+ await apiQueueCall.callback(apiQueueCall.config);
490
+ apiQueueCall.isCompleted.complete();
491
+ this.queueSubject.next();
492
+ }
493
+ }
494
+ }
495
+ ApiQueueService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ApiQueueService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
496
+ ApiQueueService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ApiQueueService, providedIn: 'root' });
497
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ApiQueueService, decorators: [{
498
+ type: Injectable,
499
+ args: [{
500
+ providedIn: 'root',
501
+ }]
502
+ }], ctorParameters: function () { return []; } });
503
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcxQyxPQUFPLEVBY0wsU0FBUyxFQUNULFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDOzs7Ozs7QUFTbkYsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsd0NBQXdDLENBQUM7QUFDL0YsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsa0NBQWtDLENBQUM7QUFDbkYsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsb0NBQW9DLENBQUM7QUFLdkYsTUFBTSxPQUFPLHVCQUF1QjtJQTJDbEMsWUFDVSxJQUFpQixFQUNqQixPQUE0QixFQUM1QixVQUFrQyxFQUNsQyxNQUEwQixFQUMxQixlQUFnQztRQUpoQyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBQzFCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQS9DbEMsY0FBUyxHQUFXLGlCQUFpQixDQUFDO1FBQ3RDLHdCQUFtQixHQUFXLGlCQUFpQixDQUFDO1FBSWhELGlCQUFZLEdBQWlDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekQsb0JBQWUsR0FBa0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM3QyxtQkFBYyxHQUFvQixJ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O1lBQzFCLE9BQU87U0FDUjtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEMsSUFBSSxZQUFZLEVBQUU7WUFDaEIsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRCxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDOzs2R0F0Q1UsZUFBZTtpSEFBZixlQUFlLGNBRmQsTUFBTTs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTbWFydGRpYWxvZ1NlcnZpY2UgfSBmcm9tICdAc21hcnRiaXQ0YWxsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFNtYXJ0TmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICdAc21hcnRiaXQ0YWxsL25hdmlnYXRpb24nO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU21hcnRTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uL3Nlc3Npb24vc21hcnQtc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU21hcnRTdWJqZWN0IH0gZnJvbSAnLi4vc21hcnQtY2xpZW50L3NtYXJ0LnN1YmplY3QnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudE1vZGVsLFxyXG4gIENvbXBvbmVudE1vZGVsQ2hhbmdlLFxyXG4gIERhdGFDaGFuZ2UsXHJcbiAgTWVzc2FnZURhdGEsXHJcbiAgTWVzc2FnZVJlc3VsdCxcclxuICBVaUFjdGlvbkRlc2NyaXB0b3IsXHJcbiAgVWlBY3Rpb25SZXF1ZXN0LFxyXG4gIFZpZXdDb25zdHJhaW50LFxyXG4gIFZpZXdDb250ZXh0Q2hhbmdlLFxyXG4gIFZpZXdDb250ZXh0RGF0YSxcclxuICBWaWV3Q29udGV4dFVwZGF0ZSxcclxuICBWaWV3RGF0YSxcclxuICBWaWV3U2VydmljZSxcclxuICBWaWV3U3RhdGUsXHJcbiAgVmlld1R5cGUsXHJcbn0gZnJvbSAnLi9hcGknO1xyXG5pbXBvcnQgeyBNZXNzYWdlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9tZXNzYWdlLWRpYWxvZy9tZXNzYWdlLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0VHJhbnNsYXRlU2VydmljZSxcclxuICBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3IsXHJcbiAgU21hcnRWaWV3Q29udGV4dEFwaUVycm9ycyxcclxuICBTbWFydFZpZXdEaWFsb2dSZWYsXHJcbiAgU21hcnRWaWV3SGFuZGxlck1vZGVsLFxyXG59IGZyb20gJy4vc21hcnQtdmlldy1jb250ZXh0Lm1vZGVsJztcclxuXHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbCA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbCc7XHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSc7XHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlID0gJ1NtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ01lc3NhZ2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlIHtcclxuICBwcml2YXRlIHRhYklkTmFtZTogc3RyaW5nID0gJ3ZpZXdDb250ZXh0VXVpZCc7XHJcbiAgcHJpdmF0ZSB0YWJJZGh0dHBIZWFkZXJOYW1lOiBzdHJpbmcgPSAndmlld0NvbnRleHRVdWlkJztcclxuICBwdWJsaWMgbWVzc2FnZURpYWxvZ25hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHVybD86IHN0cmluZztcclxuICBwcml2YXRlIHZpZXdDb250ZXh0PzogVmlld0NvbnRleHREYXRhO1xyXG4gIHByaXZhdGUgdmlld0hhbmRsZXJzOiBBcnJheTxTbWFydFZpZXdIYW5kbGVyTW9kZWw+ID0gbmV3IEFycmF5KCk7XHJcbiAgcHJpdmF0ZSBvcGVuZWRWaWV3VXVpZHM6IEFycmF5PHN0cmluZz4gPSBuZXcgQXJyYXkoKTtcclxuICBwcml2YXRlIG9wZW5lZFZpZXdEYXRhOiBBcnJheTxWaWV3RGF0YT4gPSBuZXcgQXJyYXkoKTtcclxuXHJcbiAgcHVibGljIHV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwdWJsaWMgdmlld0NvbnRleHRIYXNCZWVuU3luY2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwcml2YXRlIGluaXRpYWxpemVSdW5uaW5nOiBTdWJqZWN0PFZpZXdDb250ZXh0RGF0YT4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHB1YmxpYyBzbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzPzogU21hcnRWaWV3Q29udGV4dEFwaUVycm9ycztcclxuXHJcbiAgcHVibGljIG9wZW5TbWFydExpbms6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIHB1YmxpYyBpc09wZW5pbmdTbWFydExpbms6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBkaWFsb2dSZWZzOiBTbWFydFZpZXdEaWFsb2dSZWZbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGFjdGlvbkRlc2NyaXB0b3JzPzogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPjtcclxuXHJcbiAgcHVibGljIGNvbW1vbkZlZWRiYWNrVGV4dD86IHN0cmluZztcclxuXHJcbiAgcHVibGljIHNtYXJ0QXBpQ2xpZW50czogTWFwPHN0cmluZywgU21hcnRTdWJqZWN0PGFueT4+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBwdWJsaWMgc2V0IHRyYW5zbGF0ZVNlcnZpY2UodHJhbnNsYXRlU2VydmljZTogU21hcnRUcmFuc2xhdGVTZXJ2aWNlIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlID0gdHJhbnNsYXRlU2VydmljZTtcclxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZUNoYW5nZWQubmV4dCgpO1xyXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlQ2hhbmdlZC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0cmFuc2xhdGVTZXJ2aWNlKCk6IFNtYXJ0VHJhbnNsYXRlU2VydmljZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5fdHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlPzogU21hcnRUcmFuc2xhdGVTZXJ2aWNlO1xyXG4gIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlQ2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB2aWV3OiBWaWV3U2VydmljZSxcclxuICAgIHByaXZhdGUgc2Vzc2lvbjogU21hcnRTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgbmF2aWdhdGlvbjogU21hcnROYXZpZ2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nOiBTbWFydGRpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwaVF1ZXVlU2VydmljZTogQXBpUXVldWVTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBwdWJsaWMgZm9sbG93KHV1aWQ6IHN0cmluZywgZGV0ZWN0Q2hhbmdlOiBTbWFydFN1YmplY3Q8YW55Pik6IHZvaWQge1xyXG4gICAgdGhpcy5zbWFydEFwaUNsaWVudHMuc2V0KHV1aWQsIGRldGVjdENoYW5nZSk7XHJcbiAgfVxyXG4gIHB1YmxpYyB1bmZvbGxvdyh1dWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc21hcnRBcGlDbGllbnRzLmRlbGV0ZSh1dWlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRBY3Rpb25EZXNjcmlwdG9ycyhhY3Rpb25EZXNjcmlwdG9yczogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPik6IHZvaWQge1xyXG4gICAgdGhpcy5hY3Rpb25EZXNjcmlwdG9ycyA9IGFjdGlvbkRlc2NyaXB0b3JzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFjdGlvbkRlc2NyaXB0b3JzKCk6IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj4gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCF0aGlzLmFjdGlvbkRlc2NyaXB0b3JzKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGFjdGlvbiBkZXNjcmlwdG9ycyBoYXMgYmVlbiBzZXQgdG8gVmlld0NvbnRleHQuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5hY3Rpb25EZXNjcmlwdG9ycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaWV3SGFuZGxlcnModmlld0hhbmRsZXJzOiBBcnJheTxTbWFydFZpZXdIYW5kbGVyTW9kZWw+KTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdIYW5kbGVycyA9IHZpZXdIYW5kbGVycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaWV3QXBpRXJyb3JzKHZpZXdBcGlFcnJvcnM6IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMpOiB2b2lkIHtcclxuICAgIHRoaXMuc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycyA9IHZpZXdBcGlFcnJvcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TWVzc2FnZURpYWxvZ05hbWUobWVzc2FnZURpYWxvZ05hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSA9IG1lc3NhZ2VEaWFsb2dOYW1lO1xyXG4gICAgdGhpcy52aWV3SGFuZGxlcnMucHVzaCh7XHJcbiAgICAgIG5hbWU6IG1lc3NhZ2VEaWFsb2dOYW1lLFxyXG4gICAgICBjb21wb25lbnQ6IE1lc3NhZ2VEaWFsb2dDb21wb25lbnQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VXBVcmxGb3JWaWV3U2VydmljZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlldy5jb25maWd1cmF0aW9uLmJhc2VQYXRoID0gdGhpcy51cmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VXJsKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnVybCA9IHVybCArICcvdmlldyc7XHJcbiAgICB0aGlzLnNldFVwVXJsRm9yVmlld1NlcnZpY2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBbmRTeW5jVmlld0NvbnRleHQodXVpZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF1dWlkKSB7XHJcbiAgICAgIHV1aWQgPSB0aGlzLmdldFV1aWRPZlBhZ2UodGhpcy50YWJJZE5hbWUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5zeW5jVmlldygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnRleHQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGE+IHtcclxuICAgIHRoaXMudmlld0NvbnRleHQgPSBhd2FpdCB0aGlzLnZpZXcuZ2V0Vmlld0NvbnRleHQodXVpZCkudG9Qcm9taXNlKCk7XHJcbiAgICBpZiAoIXRoaXMudmlld0NvbnRleHQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWaWV3Q29udGV4dCBkb2VzIG5vdCBleGlzdCB3aXRoIHRoZSBnaXZlbiB1dWlkLicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnRleHREYXRhQnlQYWdlTmFtZShwYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxWaWV3RGF0YT4ge1xyXG4gICAgaWYgKCF0aGlzLnZpZXdDb250ZXh0KSB7XHJcbiAgICAgIGxldCB2aWV3Q29udGV4dFV1aWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMudGFiSWROYW1lKTtcclxuICAgICAgaWYgKCF2aWV3Q29udGV4dFV1aWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZXcgY29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQhJyk7XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh2aWV3Q29udGV4dFV1aWQhKTtcclxuICAgIH1cclxuICAgIGxldCBwYWdlVXVpZCA9IHRoaXMuZ2V0VXVpZE9mUGFnZShwYWdlTmFtZSk7XHJcblxyXG4gICAgbGV0IHZpZXdDb250ZXh0QnlQYWdlTmFtZSA9IHRoaXMudmlld0NvbnRleHQ/LnZpZXdzLmZpbmQoKHZpZXcpID0+IHZpZXcudXVpZCA9PT0gcGFnZVV1aWQpO1xyXG4gICAgaWYgKCF2aWV3Q29udGV4dEJ5UGFnZU5hbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgVmlld0RhdGEgb2YgJHtwYWdlTmFtZX0gaXMgbm90IGZvdW5kIWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZpZXdDb250ZXh0QnlQYWdlTmFtZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWaWV3Q29udGV4dChcclxuICAgIHZpZXdDb250ZXh0VXBkYXRlOiBWaWV3Q29udGV4dFVwZGF0ZVxyXG4gICk6IFByb21pc2U8Vmlld0NvbnRleHREYXRhIHwgdW5kZWZpbmVkPiB7XHJcbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gYXdhaXQgdGhpcy52aWV3LnVwZGF0ZVZpZXdDb250ZXh0KHZpZXdDb250ZXh0VXBkYXRlKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJTZXNzaW9uU3RvcmFnZSgpOiB2b2lkIHtcclxuICAgIHNlc3Npb25TdG9yYWdlLmNsZWFyKCk7XHJcbiAgICB0aGlzLm9wZW5lZFZpZXdEYXRhID0gW107XHJcbiAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRUYWJJZCh0YWJJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMudGFiSWROYW1lLCB0YWJJZCk7XHJcbiAgICB0aGlzLnNlc3Npb24uYWRkSGVhZGVyUGFyYW0oe1xyXG4gICAgICBoZWFkZXJOYW1lOiB0aGlzLnRhYklkaHR0cEhlYWRlck5hbWUsXHJcbiAgICAgIHZhbHVlOiB0YWJJZCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHN0YXJ0Vmlld0NvbnRleHQoKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGE+IHtcclxuICAgIHRoaXMuY2xlYXJTZXNzaW9uU3RvcmFnZSgpO1xyXG5cclxuICAgIGxldCBuZXdWaWV3Q29udGV4dDogVmlld0NvbnRleHREYXRhIHwgdW5kZWZpbmVkID0gYXdhaXQgdGhpcy52aWV3XHJcbiAgICAgIC5jcmVhdGVWaWV3Q29udGV4dCgpXHJcbiAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIGlmICghbmV3Vmlld0NvbnRleHQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBWaWV3Q29udGV4dCB3YXMgY3JlYXRlZCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3Q29udGV4dCA9IG5ld1ZpZXdDb250ZXh0O1xyXG4gICAgdGhpcy5zZXRUYWJJZChuZXdWaWV3Q29udGV4dC51dWlkISk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSh1dWlkPzogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQ+IHtcclxuICAgIGlmICh0aGlzLmluaXRpYWxpemVSdW5uaW5nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemVSdW5uaW5nLnRvUHJvbWlzZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUnVubmluZyA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld0hhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICBcIlRoZXJlIGFyZW4ndCBhbnkgdmlld0hhbmRsZXJzIGluIFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlISBQcm92aWRlIHNvbWUgdG8gdXNlIGl0cyBmdW5jdGlvbnMuXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWVzc2FnZURpYWxvZ05hbWUgcHJvdmlkZWQgYnkgdGhlIGJhY2tlbmQgaGFzIG5vdCBiZWVuIHNldC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHV1aWQpIHtcclxuICAgICAgICAgIHRoaXMuc2V0VGFiSWQodXVpZCk7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldFZpZXdDb250ZXh0KHV1aWQpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhcnRWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0Vmlld0NvbnRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0ITtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVSdW5uaW5nLm5leHQodGhpcy52aWV3Q29udGV4dCEpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuVmlldyh2aWV3OiBWaWV3RGF0YSk6IHZvaWQge1xyXG4gICAgbGV0IHZpZXdIYW5kbGVyOiBTbWFydFZpZXdIYW5kbGVyTW9kZWwgfCB1bmRlZmluZWQgPSB0aGlzLnZpZXdIYW5kbGVycy5maW5kKFxyXG4gICAgICAoaGFuZGxlcikgPT4gaGFuZGxlci5uYW1lID09PSB2aWV3LnZpZXdOYW1lXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghdmlld0hhbmRsZXIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2FzIG5vdCBmb3VuZCBieSB2aWV3IG5hbWU6ICR7dmlldy52aWV3TmFtZX1gKTtcclxuICAgIH1cclxuICAgIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLkRpYWxvZykge1xyXG4gICAgICBpZiAoIXZpZXdIYW5kbGVyLmNvbXBvbmVudCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIGBDb21wb25lbnQgaXMgdW5kZWZpbmVkIGluIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3aXRoIG5hbWU6ICR7dmlldy52aWV3TmFtZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbkNvbXBvbmVudEFzRGlhbG9nKHZpZXdIYW5kbGVyLmNvbXBvbmVudCwgdmlld0hhbmRsZXIubmFtZSk7XHJcbiAgICAgIGRpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xyXG4gICAgICAvLyBpZiAodmlldy52aWV3TmFtZSA9PT0gdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSkge1xyXG4gICAgICAvLyAgIGlmICh2aWV3Lm1lc3NhZ2U/Lm9wdGlvbnMgJiYgdmlldy5tZXNzYWdlLm9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmcy5wdXNoKHtcclxuICAgICAgICB1dWlkOiB2aWV3LnV1aWQsXHJcbiAgICAgICAgZGlhbG9nUmVmLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5Ob3JtYWwpIHtcclxuICAgICAgaWYgKHZpZXdIYW5kbGVyLnJvdXRlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRlIGlzIHVuZGVmaW5lZCBpbiBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2l0aCBuYW1lOiAke3ZpZXcudmlld05hbWV9YCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uLm5hdmlnYXRlVG8odmlld0hhbmRsZXIucm91dGUuc3BsaXQoJy8nKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB0eXBlIG9mIHRoZSB2aWV3IGFuZCBpdHMgdmlld0hhbmRsZXIgaXMgbm90IHRoZSBzYW1lIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuT3BlbmVkO1xyXG5cclxuICAgIHRoaXMub3BlbmVkVmlld1V1aWRzLnB1c2godmlldy51dWlkKTtcclxuICAgIHRoaXMub3BlbmVkVmlld0RhdGEucHVzaCh2aWV3KTtcclxuXHJcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCk7XHJcbiAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZC5uZXh0KHZpZXcudmlld05hbWUpO1xyXG5cclxuICAgIHRoaXMudXBkYXRlVmlld0NvbnRleHQoe1xyXG4gICAgICB1cGRhdGVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc3RhdGU6IFZpZXdTdGF0ZS5PcGVuZWQsXHJcbiAgICAgICAgICB1dWlkOiB2aWV3LnV1aWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgICAgdXVpZDogdGhpcy52aWV3Q29udGV4dD8udXVpZCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlVmlldyh2aWV3OiBWaWV3RGF0YSk6IHZvaWQge1xyXG4gICAgbGV0IHZpZXdIYW5kbGVyOiBTbWFydFZpZXdIYW5kbGVyTW9kZWwgfCB1bmRlZmluZWQgPSB0aGlzLnZpZXdIYW5kbGVycy5maW5kKFxyXG4gICAgICAoaGFuZGxlcikgPT4gaGFuZGxlci5uYW1lID09PSB2aWV3LnZpZXdOYW1lXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghdmlld0hhbmRsZXIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2FzIG5vdCBmb3VuZCBieSB2aWV3IG5hbWU6ICR7dmlldy52aWV3TmFtZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5EaWFsb2cpIHtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nUmVmcy5maW5kKFxyXG4gICAgICAgIChkaWFsb2dSZWY6IFNtYXJ0Vmlld0RpYWxvZ1JlZikgPT4gZGlhbG9nUmVmLnV1aWQgPT09IHZpZXcudXVpZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZGlhbG9nUmVmKSB7XHJcbiAgICAgICAgZGlhbG9nUmVmLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGlhbG9nUmVmcy5pbmRleE9mKGRpYWxvZ1JlZik7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWZzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaWFsb2dSZWYgaXMgbm90IGZvdW5kIGJ5IHV1aWQuJyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5Ob3JtYWwpIHtcclxuICAgICAgLy8gVE9ETzogY2xvc2Ugbm9ybWFsIHBhZ2U/Pz9cclxuICAgICAgLy8gdGhpcy5uYXZpZ2F0aW9uLm5hdmlnYXRlVG8odmlld0hhbmRsZXIucm91dGUuc3BsaXQoXCIvXCIpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHR5cGUgb2YgdGhlIHZpZXcgYW5kIGl0cyB2aWV3SGFuZGxlciBpcyBub3QgdGhlIHNhbWUhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmlldy5zdGF0ZSA9IFZpZXdTdGF0ZS5DbG9zZWQ7XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9wZW5lZFZpZXdVdWlkcy5pbmRleE9mKHZpZXcudXVpZCk7XHJcbiAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odmlldy52aWV3TmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVWaWV3Q29udGV4dCh7XHJcbiAgICAgIHVwZGF0ZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBzdGF0ZTogVmlld1N0YXRlLkNsb3NlZCxcclxuICAgICAgICAgIHV1aWQ6IHZpZXcudXVpZCxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICB1dWlkOiB0aGlzLnZpZXdDb250ZXh0Py51dWlkLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVzdG9yZVZpZXdzKHV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLnZpZXdDb250ZXh0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0NvbnRleHQodXVpZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXdDb250ZXh0IS52aWV3cy5tYXAoKHZpZXc6IFZpZXdEYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMub3BlblZpZXcodmlldyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzeW5jVmlldygpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0NvbnRleHQ/LnZpZXdzLm1hcCgodmlldzogVmlld0RhdGEpID0+IHtcclxuICAgICAgc3dpdGNoICh2aWV3LnN0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBWaWV3U3RhdGUuVG9PcGVuOlxyXG4gICAgICAgICAgdGhpcy5vcGVuVmlldyh2aWV3KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVmlld1N0YXRlLlRvQ2xvc2U6XHJcbiAgICAgICAgICB0aGlzLmNsb3NlVmlldyh2aWV3KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB2aWV3RGF0YVRvQ2xvc2UgPSB0aGlzLm9wZW5lZFZpZXdEYXRhLmZpbHRlcihcclxuICAgICAgKHZpZXdEYXRhOiBWaWV3RGF0YSkgPT5cclxuICAgICAgICAhdGhpcy52aWV3Q29udGV4dD8udmlld3NcclxuICAgICAgICAgIC5mbGF0TWFwKCh2aWV3RGF0YTogVmlld0RhdGEpID0+IHZpZXdEYXRhLnV1aWQpXHJcbiAgICAgICAgICAuaW5jbHVkZXModmlld0RhdGEudXVpZClcclxuICAgICk7XHJcbiAgICBpZiAodmlld0RhdGFUb0Nsb3NlPy5sZW5ndGgpIHtcclxuICAgICAgdmlld0RhdGFUb0Nsb3NlLm1hcCgodmlld0RhdGE6IFZpZXdEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbG9zZVZpZXcodmlld0RhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZpZXdDb250ZXh0SGFzQmVlblN5bmNlZC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VXVpZE9mUGFnZShwYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB1dWlkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShwYWdlTmFtZSk7XHJcbiAgICBpZiAoIXV1aWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXVpZCBvZiAke3BhZ2VOYW1lfSBpcyBub3QgYXZhaWxhYmxlLmApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHV1aWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbWVzc2FnZShtZXNzYWdlRGF0YTogTWVzc2FnZURhdGEsIG1lc3NhZ2VSZXN1bHQ6IE1lc3NhZ2VSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMudmlld1xyXG4gICAgICAubWVzc2FnZShtZXNzYWdlRGF0YS52aWV3VXVpZCA/PyAnJywgbWVzc2FnZURhdGEudXVpZCwgbWVzc2FnZVJlc3VsdClcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRBbmRTeW5jVmlld0NvbnRleHQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRTbWFydFZpZXdDb250ZXh0QXBpRXJyb3JCeUNvZGUoY29kZTogc3RyaW5nKTogUHJvbWlzZTxTbWFydFZpZXdDb250ZXh0QXBpRXJyb3I+IHtcclxuICAgIGxldCBidXR0b25MYWJlbDtcclxuICAgIGxldCBkaWFsb2dUaXRsZTtcclxuICAgIGxldCBtZXNzYWdlO1xyXG4gICAgaWYgKHRoaXMudHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgICBidXR0b25MYWJlbCA9IGF3YWl0IHRoaXMudHJhbnNsYXRlU2VydmljZVxyXG4gICAgICAgIC5nZXQoU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nQnV0dG9uTGFiZWwpXHJcbiAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgICBkaWFsb2dUaXRsZSA9IGF3YWl0IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nVGl0bGUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlKS50b1Byb21pc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJ1dHRvbkxhYmVsID0gJ09rJztcclxuICAgICAgZGlhbG9nVGl0bGUgPSAnSGliYSc7XHJcbiAgICAgIG1lc3NhZ2UgPSAnQW4gZXJyb3IgaGFzIG9jY3VyZWQuJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycykge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGNvZGUsXHJcbiAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICBidXR0b25MYWJlbCxcclxuICAgICAgICBkaWFsb2dUaXRsZSxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGxldCBhcGlFcnJvcnNXaXRoQ29kZSA9IHRoaXMuc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycy52aWV3Q29udGV4dEFwaUVycm9ycy5maWx0ZXIoXHJcbiAgICAgIChhcGlFcnJvcjogU21hcnRWaWV3Q29udGV4dEFwaUVycm9yKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFwaUVycm9yLmNvZGUgPT09IGNvZGU7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBpZiAoIWFwaUVycm9yc1dpdGhDb2RlIHx8IChhcGlFcnJvcnNXaXRoQ29kZSAmJiAhYXBpRXJyb3JzV2l0aENvZGUubGVuZ3RoKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3Igd2l0aCBjb2RlICR7Y29kZX0gY291bGQgbm90IGJlIGZvdW5kLmApO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjb2RlLFxyXG4gICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgYnV0dG9uTGFiZWwsXHJcbiAgICAgICAgZGlhbG9nVGl0bGUsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXBpRXJyb3JzV2l0aENvZGVbMF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnN0cmFpbnQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29uc3RyYWludD4ge1xyXG4gICAgbGV0IHZpZXdDb25zdHJhaW50UmVzcG9uc2UgPSBhd2FpdCB0aGlzLnZpZXcuZ2V0Vmlld0NvbnN0cmFpbnQodXVpZCkudG9Qcm9taXNlKCk7XHJcbiAgICBpZiAoIXZpZXdDb25zdHJhaW50UmVzcG9uc2UpXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGdldCBWaWV3Q29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiB1dWlkLicpO1xyXG4gICAgcmV0dXJuIHZpZXdDb25zdHJhaW50UmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2hvd1B1Ymxpc2hlZFZpZXcoY2hhbm5lbDogc3RyaW5nLCB1dWlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuc2Vzc2lvbi5pbml0aWFsaXplKCk7XHJcbiAgICAvLyBUT0RPIGluaXQgdmlldyBjb250ZXh0IGF1dG9tYXRpY2FsbHlcclxuICAgIC8vIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG5cclxuICAgIHRoaXMuaXNPcGVuaW5nU21hcnRMaW5rID0gdHJ1ZTtcclxuICAgIHRoaXMub3BlblNtYXJ0TGluay5uZXh0KCk7XHJcbiAgICBhd2FpdCB0aGlzLm9wZW5TbWFydExpbmsudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy52aWV3LnNob3dQdWJsaXNoZWRWaWV3KGNoYW5uZWwsIHV1aWQpLnRvUHJvbWlzZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRBbmRTeW5jVmlld0NvbnRleHQoKTtcclxuICAgIHRoaXMuaXNPcGVuaW5nU21hcnRMaW5rID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZG93bmxvYWRSZXNvdXJjZSh1dWlkOiBzdHJpbmcsIGl0ZW06IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy52aWV3LmRvd25sb2FkSXRlbSh1dWlkLCBpdGVtKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtQWN0aW9uKHV1aWQ6IHN0cmluZywgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9wZXJmb3JtQWN0aW9uKHtcclxuICAgICAgdXVpZCxcclxuICAgICAgdWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgfSk7XHJcbiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcclxuICAgIC8vICAgY2FsbGJhY2s6IHRoaXMuX3BlcmZvcm1BY3Rpb24uYmluZCh0aGlzKSxcclxuICAgIC8vICAgY29uZmlnOiB7XHJcbiAgICAvLyAgICAgdXVpZCxcclxuICAgIC8vICAgICB1aUFjdGlvblJlcXVlc3QsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGlzQ29tcGxldGVkLFxyXG4gICAgLy8gfSk7XHJcbiAgICAvLyByZXR1cm4gYXdhaXQgaXNDb21wbGV0ZWQudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVdpZGdldEFjdGlvbihcclxuICAgIHV1aWQ6IHN0cmluZyxcclxuICAgIHdpZGdldElkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0XHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyZm9ybVdpZGdldEFjdGlvbih7IHV1aWQsIHdpZGdldElkLCBub2RlSWQsIHVpQWN0aW9uUmVxdWVzdCB9KTtcclxuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIC8vIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWUoe1xyXG4gICAgLy8gICBjYWxsYmFjazogdGhpcy5fcGVyZm9ybVdpZGdldEFjdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgLy8gICBjb25maWc6IHtcclxuICAgIC8vICAgICB1dWlkLFxyXG4gICAgLy8gICAgIHdpZGdldElkLFxyXG4gICAgLy8gICAgIG5vZGVJZCxcclxuICAgIC8vICAgICB1aUFjdGlvblJlcXVlc3QsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGlzQ29tcGxldGVkLFxyXG4gICAgLy8gfSk7XHJcbiAgICAvLyByZXR1cm4gYXdhaXQgaXNDb21wbGV0ZWQudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVdpZGdldE1haW5BY3Rpb24oXHJcbiAgICB1dWlkOiBzdHJpbmcsXHJcbiAgICB3aWRnZXRJZDogc3RyaW5nLFxyXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3RcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9wZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbih7IHV1aWQsIHdpZGdldElkLCB1aUFjdGlvblJlcXVlc3QgfSk7XHJcbiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcclxuICAgIC8vICAgY2FsbGJhY2s6IHRoaXMuX3BlcmZvcm1XaWRnZXRNYWluQWN0aW9uLmJpbmQodGhpcyksXHJcbiAgICAvLyAgIGNvbmZpZzoge1xyXG4gICAgLy8gICAgIHV1aWQsXHJcbiAgICAvLyAgICAgd2lkZ2V0SWQsXHJcbiAgICAvLyAgICAgdWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBpc0NvbXBsZXRlZCxcclxuICAgIC8vIH0pO1xyXG4gICAgLy8gcmV0dXJuIGF3YWl0IGlzQ29tcGxldGVkLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRhdGFDaGFuZ2VkKHV1aWQ6IHN0cmluZywgZGF0YUNoYW5nZTogRGF0YUNoYW5nZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RhdGFDaGFuZ2VkKHsgdXVpZCwgZGF0YUNoYW5nZSB9KTtcclxuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIC8vIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWUoXHJcbiAgICAvLyAgIHtcclxuICAgIC8vICAgICBjYWxsYmFjazogdGhpcy5fZGF0YUNoYW5nZWQuYmluZCh0aGlzKSxcclxuICAgIC8vICAgICBjb25maWc6IHtcclxuICAgIC8vICAgICAgIHV1aWQsXHJcbiAgICAvLyAgICAgICBkYXRhQ2hhbmdlLFxyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAgaXNDb21wbGV0ZWQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIHRydWVcclxuICAgIC8vICk7XHJcbiAgICAvLyByZXR1cm4gYXdhaXQgaXNDb21wbGV0ZWQudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtQWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXHJcbiAgICAgIGF3YWl0IHRoaXMudmlldy5wZXJmb3JtQWN0aW9uKGNvbmZpZy51dWlkLCBjb25maWcudWlBY3Rpb25SZXF1ZXN0KS50b1Byb21pc2UoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3BlcmZvcm1XaWRnZXRBY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcclxuICAgICAgYXdhaXQgdGhpcy52aWV3XHJcbiAgICAgICAgLnBlcmZvcm1XaWRnZXRBY3Rpb24oY29uZmlnLnV1aWQsIGNvbmZpZy53aWRnZXRJZCwgY29uZmlnLm5vZGVJZCwgY29uZmlnLnVpQWN0aW9uUmVxdWVzdClcclxuICAgICAgICAudG9Qcm9taXNlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbihjb25maWc6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxyXG4gICAgICBhd2FpdCB0aGlzLnZpZXdcclxuICAgICAgICAucGVyZm9ybVdpZGdldE1haW5BY3Rpb24oY29uZmlnLnV1aWQsIGNvbmZpZy53aWRnZXRJZCwgY29uZmlnLnVpQWN0aW9uUmVxdWVzdClcclxuICAgICAgICAudG9Qcm9taXNlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9kYXRhQ2hhbmdlZChjb25maWc6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxyXG4gICAgICBhd2FpdCB0aGlzLnZpZXcuZGF0YUNoYW5nZWQoY29uZmlnLnV1aWQsIGNvbmZpZy5kYXRhQ2hhbmdlKS50b1Byb21pc2UoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBoYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXHJcbiAgICB2aWV3Q29udGV4dENoYW5nZTogVmlld0NvbnRleHRDaGFuZ2UgfCB1bmRlZmluZWRcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlld0NvbnRleHQgPSB2aWV3Q29udGV4dENoYW5nZT8udmlld0NvbnRleHQ7XHJcbiAgICB0aGlzLnN5bmNWaWV3KCk7XHJcblxyXG4gICAgaWYgKHZpZXdDb250ZXh0Q2hhbmdlPy5jaGFuZ2VzKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlcyh2aWV3Q29udGV4dENoYW5nZS5jaGFuZ2VzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQ2hhbmdlcyhjaGFuZ2VzOiBBcnJheTxDb21wb25lbnRNb2RlbENoYW5nZT4pOiB2b2lkIHtcclxuICAgIGNoYW5nZXMuZm9yRWFjaCgoY29tcG9uZW50TW9kZWxDaGFuZ2U6IENvbXBvbmVudE1vZGVsQ2hhbmdlKSA9PiB7XHJcbiAgICAgIGxldCBkZXRlY3RDaGFuZ2U6IFNtYXJ0U3ViamVjdDxDb21wb25lbnRNb2RlbENoYW5nZT4gfCB1bmRlZmluZWQgPSB0aGlzLnNtYXJ0QXBpQ2xpZW50cy5nZXQoXHJcbiAgICAgICAgY29tcG9uZW50TW9kZWxDaGFuZ2UudXVpZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZGV0ZWN0Q2hhbmdlKSB7XHJcbiAgICAgICAgZGV0ZWN0Q2hhbmdlLm5leHQoY29tcG9uZW50TW9kZWxDaGFuZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkKHV1aWQ6IHN0cmluZyk6IFByb21pc2U8Q29tcG9uZW50TW9kZWwgfCB1bmRlZmluZWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnZpZXcuZ2V0Q29tcG9uZW50TW9kZWwodXVpZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgSVNfQVNZTkNfUEFSQU1fTkFNRSA9ICdpc0FzeW5jJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXBpUXVldWVDYWxsIHtcclxuICBjYWxsYmFjazogKGNvbmZpZzogYW55KSA9PiBQcm9taXNlPGFueT47XHJcbiAgY29uZmlnOiBhbnk7XHJcbiAgaXNDb21wbGV0ZWQ6IFN1YmplY3Q8dm9pZD47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcGlRdWV1ZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHJpdmF0ZSBxdWV1ZTogQXBpUXVldWVDYWxsW10gPSBbXTtcclxuICBwcml2YXRlIGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcXVldWVTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnF1ZXVlU3ViamVjdC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnByb2Nlc3NRdWV1ZSgpKTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgYWRkVG9RdWV1ZShjYWxsOiBBcGlRdWV1ZUNhbGwsIHByaW9yaXR5OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmIChwcmlvcml0eSkge1xyXG4gICAgICB0aGlzLnF1ZXVlLnVuc2hpZnQoY2FsbCk7IC8vIEFkZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZSBpZiBpdCBoYXMgaGlnaGVyIHByaW9yaXR5XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goY2FsbCk7IC8vIEFkZCBhdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSBpZiBpdCBoYXMgbG93ZXIgcHJpb3JpdHlcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pc1Byb2Nlc3NpbmcpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHByb2Nlc3NRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXBpUXVldWVDYWxsID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xyXG4gICAgaWYgKGFwaVF1ZXVlQ2FsbCkge1xyXG4gICAgICBhd2FpdCBhcGlRdWV1ZUNhbGwuY2FsbGJhY2soYXBpUXVldWVDYWxsLmNvbmZpZyk7XHJcbiAgICAgIGFwaVF1ZXVlQ2FsbC5pc0NvbXBsZXRlZC5jb21wbGV0ZSgpO1xyXG4gICAgICB0aGlzLnF1ZXVlU3ViamVjdC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==