@copilotkitnext/angular 0.0.9-alpha.3 → 0.0.10

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 (210) hide show
  1. package/dist/esm2022/index.mjs +2 -70
  2. package/dist/esm2022/lib/agent.mjs +73 -0
  3. package/dist/esm2022/lib/chat-config.mjs +35 -0
  4. package/dist/esm2022/lib/chat-state.mjs +18 -0
  5. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
  6. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
  7. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
  8. package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
  9. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  10. package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
  11. package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
  12. package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
  13. package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
  14. package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
  15. package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
  16. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
  17. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
  18. package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
  19. package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
  20. package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
  21. package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
  22. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
  23. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
  24. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
  25. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
  26. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
  27. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
  28. package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
  29. package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
  30. package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
  31. package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
  32. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
  33. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
  34. package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
  35. package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
  36. package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
  37. package/dist/esm2022/lib/config.mjs +9 -0
  38. package/dist/esm2022/lib/copilotkit.mjs +124 -0
  39. package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
  40. package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
  41. package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
  42. package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
  43. package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
  44. package/dist/esm2022/lib/resize-observer.mjs +152 -0
  45. package/dist/esm2022/lib/scroll-position.mjs +124 -0
  46. package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
  47. package/dist/esm2022/lib/slots/index.mjs +4 -0
  48. package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
  49. package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
  50. package/dist/esm2022/lib/tools.mjs +31 -0
  51. package/dist/esm2022/lib/utils.mjs +3 -3
  52. package/dist/esm2022/public-api.mjs +47 -0
  53. package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
  54. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  55. package/dist/index.d.ts +1 -55
  56. package/dist/lib/agent.d.ts +53 -0
  57. package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
  58. package/dist/lib/chat-state.d.ts +10 -0
  59. package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
  60. package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
  61. package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
  62. package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
  63. package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
  64. package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
  65. package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
  66. package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
  67. package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
  68. package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
  69. package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
  70. package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
  71. package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
  72. package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
  73. package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
  74. package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
  75. package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
  76. package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
  77. package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
  78. package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
  79. package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
  80. package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
  81. package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
  82. package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
  83. package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
  84. package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
  85. package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
  86. package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
  87. package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
  88. package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
  89. package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
  90. package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
  91. package/dist/lib/config.d.ts +16 -0
  92. package/dist/lib/copilotkit.d.ts +29 -0
  93. package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
  94. package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
  95. package/dist/lib/directives/tooltip.d.ts +33 -0
  96. package/dist/lib/human-in-the-loop.d.ts +13 -0
  97. package/dist/lib/render-tool-calls.d.ts +75 -0
  98. package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
  99. package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
  100. package/dist/lib/slots/copilot-slot.d.ts +34 -0
  101. package/dist/lib/slots/index.d.ts +3 -0
  102. package/dist/lib/slots/slot.types.d.ts +1 -1
  103. package/dist/lib/slots/slot.utils.d.ts +6 -4
  104. package/dist/lib/tools.d.ts +63 -0
  105. package/dist/lib/utils.d.ts +1 -1
  106. package/dist/public-api.d.ts +46 -0
  107. package/dist/styles.css +0 -69
  108. package/package.json +3 -3
  109. package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
  110. package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
  111. package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
  112. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
  113. package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
  114. package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
  115. package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
  116. package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
  117. package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
  118. package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
  119. package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
  120. package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
  121. package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
  122. package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
  123. package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
  124. package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
  125. package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
  126. package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
  127. package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
  128. package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
  129. package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
  130. package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
  131. package/dist/components/chat/copilot-chat.component.d.ts +0 -36
  132. package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
  133. package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
  134. package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
  135. package/dist/core/copilotkit.providers.d.ts +0 -13
  136. package/dist/core/copilotkit.service.d.ts +0 -119
  137. package/dist/core/copilotkit.types.d.ts +0 -81
  138. package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
  139. package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
  140. package/dist/directives/copilotkit-config.directive.d.ts +0 -44
  141. package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
  142. package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
  143. package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
  144. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
  145. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
  146. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
  147. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
  148. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
  149. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
  150. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
  151. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
  152. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
  153. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
  154. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
  155. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
  156. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
  157. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
  158. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
  159. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
  160. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
  161. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
  162. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
  163. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
  164. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
  165. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
  166. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
  167. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
  168. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
  169. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
  170. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
  171. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
  172. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
  173. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
  174. package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
  175. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
  176. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
  177. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
  178. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
  179. package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
  180. package/dist/esm2022/core/copilotkit.service.mjs +0 -411
  181. package/dist/esm2022/core/copilotkit.types.mjs +0 -13
  182. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
  183. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
  184. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
  185. package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
  186. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
  187. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
  188. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
  189. package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
  190. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
  191. package/dist/esm2022/services/resize-observer.service.mjs +0 -152
  192. package/dist/esm2022/services/scroll-position.service.mjs +0 -124
  193. package/dist/esm2022/types/frontend-tool.mjs +0 -2
  194. package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
  195. package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
  196. package/dist/esm2022/utils/agent.utils.mjs +0 -212
  197. package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
  198. package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
  199. package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
  200. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
  201. package/dist/lib/directives/tooltip.directive.d.ts +0 -33
  202. package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
  203. package/dist/types/frontend-tool.d.ts +0 -37
  204. package/dist/types/human-in-the-loop.d.ts +0 -44
  205. package/dist/utils/agent-context.utils.d.ts +0 -75
  206. package/dist/utils/agent.utils.d.ts +0 -108
  207. package/dist/utils/chat-config.utils.d.ts +0 -166
  208. package/dist/utils/copilotkit.utils.d.ts +0 -16
  209. package/dist/utils/frontend-tool.utils.d.ts +0 -119
  210. package/dist/utils/human-in-the-loop.utils.d.ts +0 -92
@@ -0,0 +1,170 @@
1
+ import { Directive, ElementRef, inject, input, output, } from "@angular/core";
2
+ import { ScrollPosition } from "../scroll-position";
3
+ import { ResizeObserverService } from "../resize-observer";
4
+ import { Subject } from "rxjs";
5
+ import { takeUntil, debounceTime, filter, distinctUntilChanged, } from "rxjs/operators";
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Directive for implementing stick-to-bottom scroll behavior
9
+ * Similar to the React use-stick-to-bottom library
10
+ *
11
+ * @example
12
+ * ```html
13
+ * <div copilotStickToBottom
14
+ * [enabled]="true"
15
+ * [threshold]="10"
16
+ * [initialBehavior]="'smooth'"
17
+ * [resizeBehavior]="'smooth'"
18
+ * (isAtBottomChange)="onBottomChange($event)">
19
+ * <!-- Content -->
20
+ * </div>
21
+ * ```
22
+ */
23
+ export class StickToBottom {
24
+ enabled = input(true);
25
+ threshold = input(10);
26
+ initialBehavior = input("smooth");
27
+ resizeBehavior = input("smooth");
28
+ debounceMs = input(100);
29
+ isAtBottomChange = output();
30
+ scrollToBottomRequested = output();
31
+ elementRef = inject(ElementRef);
32
+ scrollService = inject(ScrollPosition);
33
+ resizeService = inject(ResizeObserverService);
34
+ destroy$ = new Subject();
35
+ contentElement;
36
+ wasAtBottom = true;
37
+ hasInitialized = false;
38
+ userHasScrolled = false;
39
+ ngOnInit() {
40
+ // Setup will happen in ngAfterViewInit
41
+ }
42
+ ngAfterViewInit() {
43
+ const element = this.elementRef.nativeElement;
44
+ // Find or create content wrapper
45
+ this.contentElement = element.querySelector("[data-stick-to-bottom-content]");
46
+ if (!this.contentElement) {
47
+ this.contentElement = element;
48
+ }
49
+ this.setupScrollMonitoring();
50
+ this.setupResizeMonitoring();
51
+ this.setupContentMutationObserver();
52
+ // Initial scroll to bottom if enabled
53
+ setTimeout(() => {
54
+ this.hasInitialized = true;
55
+ if (this.enabled()) {
56
+ this.scrollToBottom(this.initialBehavior());
57
+ }
58
+ }, 0);
59
+ }
60
+ setupScrollMonitoring() {
61
+ if (!this.enabled())
62
+ return;
63
+ const element = this.elementRef.nativeElement;
64
+ // Monitor scroll position
65
+ this.scrollService
66
+ .monitorScrollPosition(element, this.threshold())
67
+ .pipe(takeUntil(this.destroy$), debounceTime(this.debounceMs()), distinctUntilChanged((a, b) => a.isAtBottom === b.isAtBottom))
68
+ .subscribe((state) => {
69
+ const wasAtBottom = this.wasAtBottom;
70
+ this.wasAtBottom = state.isAtBottom;
71
+ // Detect user scroll
72
+ if (!state.isAtBottom && wasAtBottom && this.hasInitialized) {
73
+ this.userHasScrolled = true;
74
+ }
75
+ else if (state.isAtBottom) {
76
+ this.userHasScrolled = false;
77
+ }
78
+ // Emit change
79
+ this.isAtBottomChange.emit(state.isAtBottom);
80
+ });
81
+ }
82
+ setupResizeMonitoring() {
83
+ if (!this.enabled() || !this.contentElement)
84
+ return;
85
+ // Monitor content resize
86
+ this.resizeService
87
+ .observeElement(this.contentElement, 0, 250)
88
+ .pipe(takeUntil(this.destroy$), filter(() => this.enabled() && !this.userHasScrolled))
89
+ .subscribe((state) => {
90
+ // Auto-scroll on resize if we were at bottom
91
+ if (this.wasAtBottom && !state.isResizing) {
92
+ this.scrollToBottom(this.resizeBehavior());
93
+ }
94
+ });
95
+ // Monitor container resize
96
+ const element = this.elementRef.nativeElement;
97
+ this.resizeService
98
+ .observeElement(element, 0, 250)
99
+ .pipe(takeUntil(this.destroy$), filter(() => this.enabled() && !this.userHasScrolled && this.wasAtBottom))
100
+ .subscribe(() => {
101
+ // Adjust scroll on container resize
102
+ this.scrollToBottom(this.resizeBehavior());
103
+ });
104
+ }
105
+ setupContentMutationObserver() {
106
+ if (!this.enabled() || !this.contentElement)
107
+ return;
108
+ const mutationObserver = new MutationObserver(() => {
109
+ if (this.enabled() && this.wasAtBottom && !this.userHasScrolled) {
110
+ // Content changed, scroll to bottom if we were there
111
+ requestAnimationFrame(() => {
112
+ this.scrollToBottom(this.resizeBehavior());
113
+ });
114
+ }
115
+ });
116
+ mutationObserver.observe(this.contentElement, {
117
+ childList: true,
118
+ subtree: true,
119
+ characterData: true,
120
+ });
121
+ // Cleanup on destroy
122
+ this.destroy$.subscribe(() => {
123
+ mutationObserver.disconnect();
124
+ });
125
+ }
126
+ /**
127
+ * Public method to scroll to bottom
128
+ * Can be called from parent component
129
+ */
130
+ scrollToBottom(behavior = "smooth") {
131
+ const element = this.elementRef.nativeElement;
132
+ const smooth = behavior === "smooth";
133
+ this.scrollService.scrollToBottom(element, smooth);
134
+ this.userHasScrolled = false;
135
+ this.scrollToBottomRequested.emit();
136
+ }
137
+ /**
138
+ * Check if currently at bottom
139
+ */
140
+ isAtBottom() {
141
+ return this.scrollService.isAtBottom(this.elementRef.nativeElement, this.threshold());
142
+ }
143
+ /**
144
+ * Get current scroll state
145
+ */
146
+ getScrollState() {
147
+ const element = this.elementRef.nativeElement;
148
+ return {
149
+ scrollTop: element.scrollTop,
150
+ scrollHeight: element.scrollHeight,
151
+ clientHeight: element.clientHeight,
152
+ isAtBottom: this.isAtBottom(),
153
+ };
154
+ }
155
+ ngOnDestroy() {
156
+ this.destroy$.next();
157
+ this.destroy$.complete();
158
+ }
159
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottom, deps: [], target: i0.ɵɵFactoryTarget.Directive });
160
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: StickToBottom, isStandalone: true, selector: "[copilotStickToBottom]", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, initialBehavior: { classPropertyName: "initialBehavior", publicName: "initialBehavior", isSignal: true, isRequired: false, transformFunction: null }, resizeBehavior: { classPropertyName: "resizeBehavior", publicName: "resizeBehavior", isSignal: true, isRequired: false, transformFunction: null }, debounceMs: { classPropertyName: "debounceMs", publicName: "debounceMs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isAtBottomChange: "isAtBottomChange", scrollToBottomRequested: "scrollToBottomRequested" }, providers: [ScrollPosition, ResizeObserverService], ngImport: i0 });
161
+ }
162
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottom, decorators: [{
163
+ type: Directive,
164
+ args: [{
165
+ standalone: true,
166
+ selector: "[copilotStickToBottom]",
167
+ providers: [ScrollPosition, ResizeObserverService],
168
+ }]
169
+ }] });
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2stdG8tYm90dG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kaXJlY3RpdmVzL3N0aWNrLXRvLWJvdHRvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFJVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sb0JBQW9CLEdBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7O0FBSXhCOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQU1ILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLE9BQU8sR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDL0IsU0FBUyxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5QixlQUFlLEdBQUcsS0FBSyxDQUFpQixRQUFRLENBQUMsQ0FBQztJQUNsRCxjQUFjLEdBQUcsS0FBSyxDQUFpQixRQUFRLENBQUMsQ0FBQztJQUNqRCxVQUFVLEdBQUcsS0FBSyxDQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRWhDLGdCQUFnQixHQUFHLE1BQU0sRUFBVyxDQUFDO0lBQ3JDLHVCQUF1QixHQUFHLE1BQU0sRUFBUSxDQUFDO0lBRWpDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2QyxhQUFhLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFOUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDL0IsY0FBYyxDQUFlO0lBQzdCLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRWhDLFFBQVE7UUFDTix1Q0FBdUM7SUFDekMsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQTRCLENBQUM7UUFFN0QsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FDekMsZ0NBQWdDLENBQ2xCLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFcEMsc0NBQXNDO1FBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztRQUU1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUU5QywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGFBQWE7YUFDZixxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ2hELElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQy9CLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQzlEO2FBQ0EsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFFcEMscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzVELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzlCLENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQy9CLENBQUM7WUFFRCxjQUFjO1lBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFFcEQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhO2FBQ2YsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUMzQyxJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDdEQ7YUFDQSxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQiw2Q0FBNkM7WUFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLDJCQUEyQjtRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYTthQUNmLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUMvQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsTUFBTSxDQUNKLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDbEUsQ0FDRjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUVwRCxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ2hFLHFEQUFxRDtnQkFDckQscUJBQXFCLENBQUMsR0FBRyxFQUFFO29CQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzVDLFNBQVMsRUFBRSxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUk7WUFDYixhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDLENBQUM7UUFFSCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzNCLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxXQUEyQixRQUFRO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLFFBQVEsS0FBSyxRQUFRLENBQUM7UUFFckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQzdCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FDakIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsT0FBTztZQUNMLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7WUFDbEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ2xDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTdLVSxhQUFhOzRGQUFiLGFBQWEsMDJCQUZiLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDOzs0RkFFdkMsYUFBYTtrQkFMekIsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDO2lCQUNuRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFNjcm9sbFBvc2l0aW9uIH0gZnJvbSBcIi4uL3Njcm9sbC1wb3NpdGlvblwiO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3Jlc2l6ZS1vYnNlcnZlclwiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICB0YWtlVW50aWwsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbmV4cG9ydCB0eXBlIFNjcm9sbEJlaGF2aW9yID0gXCJzbW9vdGhcIiB8IFwiaW5zdGFudFwiIHwgXCJhdXRvXCI7XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBpbXBsZW1lbnRpbmcgc3RpY2stdG8tYm90dG9tIHNjcm9sbCBiZWhhdmlvclxuICogU2ltaWxhciB0byB0aGUgUmVhY3QgdXNlLXN0aWNrLXRvLWJvdHRvbSBsaWJyYXJ5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxkaXYgY29waWxvdFN0aWNrVG9Cb3R0b21cbiAqICAgICAgW2VuYWJsZWRdPVwidHJ1ZVwiXG4gKiAgICAgIFt0aHJlc2hvbGRdPVwiMTBcIlxuICogICAgICBbaW5pdGlhbEJlaGF2aW9yXT1cIidzbW9vdGgnXCJcbiAqICAgICAgW3Jlc2l6ZUJlaGF2aW9yXT1cIidzbW9vdGgnXCJcbiAqICAgICAgKGlzQXRCb3R0b21DaGFuZ2UpPVwib25Cb3R0b21DaGFuZ2UoJGV2ZW50KVwiPlxuICogICA8IS0tIENvbnRlbnQgLS0+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RTdGlja1RvQm90dG9tXVwiLFxuICBwcm92aWRlcnM6IFtTY3JvbGxQb3NpdGlvbiwgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RpY2tUb0JvdHRvbSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgZW5hYmxlZCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICB0aHJlc2hvbGQgPSBpbnB1dDxudW1iZXI+KDEwKTtcbiAgaW5pdGlhbEJlaGF2aW9yID0gaW5wdXQ8U2Nyb2xsQmVoYXZpb3I+KFwic21vb3RoXCIpO1xuICByZXNpemVCZWhhdmlvciA9IGlucHV0PFNjcm9sbEJlaGF2aW9yPihcInNtb290aFwiKTtcbiAgZGVib3VuY2VNcyA9IGlucHV0PG51bWJlcj4oMTAwKTtcblxuICBpc0F0Qm90dG9tQ2hhbmdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHNjcm9sbFRvQm90dG9tUmVxdWVzdGVkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHNjcm9sbFNlcnZpY2UgPSBpbmplY3QoU2Nyb2xsUG9zaXRpb24pO1xuICBwcml2YXRlIHJlc2l6ZVNlcnZpY2UgPSBpbmplY3QoUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlKTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBjb250ZW50RWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHdhc0F0Qm90dG9tID0gdHJ1ZTtcbiAgcHJpdmF0ZSBoYXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNldHVwIHdpbGwgaGFwcGVuIGluIG5nQWZ0ZXJWaWV3SW5pdFxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIC8vIEZpbmQgb3IgY3JlYXRlIGNvbnRlbnQgd3JhcHBlclxuICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcIltkYXRhLXN0aWNrLXRvLWJvdHRvbS1jb250ZW50XVwiXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIXRoaXMuY29udGVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIHRoaXMuc2V0dXBTY3JvbGxNb25pdG9yaW5nKCk7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZU1vbml0b3JpbmcoKTtcbiAgICB0aGlzLnNldHVwQ29udGVudE11dGF0aW9uT2JzZXJ2ZXIoKTtcblxuICAgIC8vIEluaXRpYWwgc2Nyb2xsIHRvIGJvdHRvbSBpZiBlbmFibGVkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhhc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMuaW5pdGlhbEJlaGF2aW9yKCkpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNjcm9sbE1vbml0b3JpbmcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gTW9uaXRvciBzY3JvbGwgcG9zaXRpb25cbiAgICB0aGlzLnNjcm9sbFNlcnZpY2VcbiAgICAgIC5tb25pdG9yU2Nyb2xsUG9zaXRpb24oZWxlbWVudCwgdGhpcy50aHJlc2hvbGQoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlTXMoKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBhLmlzQXRCb3R0b20gPT09IGIuaXNBdEJvdHRvbSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHdhc0F0Qm90dG9tID0gdGhpcy53YXNBdEJvdHRvbTtcbiAgICAgICAgdGhpcy53YXNBdEJvdHRvbSA9IHN0YXRlLmlzQXRCb3R0b207XG5cbiAgICAgICAgLy8gRGV0ZWN0IHVzZXIgc2Nyb2xsXG4gICAgICAgIGlmICghc3RhdGUuaXNBdEJvdHRvbSAmJiB3YXNBdEJvdHRvbSAmJiB0aGlzLmhhc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgdGhpcy51c2VySGFzU2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmlzQXRCb3R0b20pIHtcbiAgICAgICAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjaGFuZ2VcbiAgICAgICAgdGhpcy5pc0F0Qm90dG9tQ2hhbmdlLmVtaXQoc3RhdGUuaXNBdEJvdHRvbSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSZXNpemVNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuY29udGVudEVsZW1lbnQpIHJldHVybjtcblxuICAgIC8vIE1vbml0b3IgY29udGVudCByZXNpemVcbiAgICB0aGlzLnJlc2l6ZVNlcnZpY2VcbiAgICAgIC5vYnNlcnZlRWxlbWVudCh0aGlzLmNvbnRlbnRFbGVtZW50LCAwLCAyNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKCkgJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgLy8gQXV0by1zY3JvbGwgb24gcmVzaXplIGlmIHdlIHdlcmUgYXQgYm90dG9tXG4gICAgICAgIGlmICh0aGlzLndhc0F0Qm90dG9tICYmICFzdGF0ZS5pc1Jlc2l6aW5nKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLnJlc2l6ZUJlaGF2aW9yKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIE1vbml0b3IgY29udGFpbmVyIHJlc2l6ZVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlc2l6ZVNlcnZpY2VcbiAgICAgIC5vYnNlcnZlRWxlbWVudChlbGVtZW50LCAwLCAyNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKCkgPT4gdGhpcy5lbmFibGVkKCkgJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkICYmIHRoaXMud2FzQXRCb3R0b21cbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIEFkanVzdCBzY3JvbGwgb24gY29udGFpbmVyIHJlc2l6ZVxuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IoKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDb250ZW50TXV0YXRpb25PYnNlcnZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmNvbnRlbnRFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlZCgpICYmIHRoaXMud2FzQXRCb3R0b20gJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkKSB7XG4gICAgICAgIC8vIENvbnRlbnQgY2hhbmdlZCwgc2Nyb2xsIHRvIGJvdHRvbSBpZiB3ZSB3ZXJlIHRoZXJlXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLnJlc2l6ZUJlaGF2aW9yKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRlbnRFbGVtZW50LCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIENsZWFudXAgb24gZGVzdHJveVxuICAgIHRoaXMuZGVzdHJveSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gc2Nyb2xsIHRvIGJvdHRvbVxuICAgKiBDYW4gYmUgY2FsbGVkIGZyb20gcGFyZW50IGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvQm90dG9tKGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9IFwic21vb3RoXCIpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgc21vb3RoID0gYmVoYXZpb3IgPT09IFwic21vb3RoXCI7XG5cbiAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsVG9Cb3R0b20oZWxlbWVudCwgc21vb3RoKTtcbiAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21SZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnRseSBhdCBib3R0b21cbiAgICovXG4gIHB1YmxpYyBpc0F0Qm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbFNlcnZpY2UuaXNBdEJvdHRvbShcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy50aHJlc2hvbGQoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc2Nyb2xsIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Nyb2xsU3RhdGUoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wLFxuICAgICAgc2Nyb2xsSGVpZ2h0OiBlbGVtZW50LnNjcm9sbEhlaWdodCxcbiAgICAgIGNsaWVudEhlaWdodDogZWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgICBpc0F0Qm90dG9tOiB0aGlzLmlzQXRCb3R0b20oKSxcbiAgICB9O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,217 @@
1
+ import { Directive, Input, ElementRef, HostListener, inject, ViewContainerRef, } from "@angular/core";
2
+ import { Overlay, OverlayPositionBuilder, } from "@angular/cdk/overlay";
3
+ import { ComponentPortal } from "@angular/cdk/portal";
4
+ import { Component, ChangeDetectionStrategy, } from "@angular/core";
5
+ import * as i0 from "@angular/core";
6
+ export class TooltipContent {
7
+ cdr;
8
+ text = "";
9
+ _position = "below";
10
+ get position() {
11
+ return this._position;
12
+ }
13
+ set position(value) {
14
+ this._position = value;
15
+ this.cdr.markForCheck();
16
+ }
17
+ constructor(cdr) {
18
+ this.cdr = cdr;
19
+ }
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipContent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
21
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TooltipContent, isStandalone: true, selector: "copilot-tooltip-content", ngImport: i0, template: `
22
+ <div class="copilot-tooltip-wrapper" [attr.data-position]="position">
23
+ <div class="copilot-tooltip">
24
+ {{ text }}
25
+ </div>
26
+ <div class="copilot-tooltip-arrow"></div>
27
+ </div>
28
+ `, isInline: true, styles: [".copilot-tooltip-wrapper{position:relative;display:inline-block;animation:fadeIn .15s ease-in-out}.copilot-tooltip{background-color:#1a1a1a;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-weight:500;white-space:nowrap;max-width:200px;box-shadow:0 2px 8px #00000026}.copilot-tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.copilot-tooltip-wrapper[data-position=below] .copilot-tooltip-arrow{top:-4px;left:50%;transform:translate(-50%);border-width:0 4px 4px 4px;border-color:transparent transparent #1a1a1a transparent}.copilot-tooltip-wrapper[data-position=above] .copilot-tooltip-arrow{bottom:-4px;left:50%;transform:translate(-50%);border-width:4px 4px 0 4px;border-color:#1a1a1a transparent transparent transparent}.copilot-tooltip-wrapper[data-position=left] .copilot-tooltip-arrow{right:-4px;top:50%;transform:translateY(-50%);border-width:4px 0 4px 4px;border-color:transparent transparent transparent #1a1a1a}.copilot-tooltip-wrapper[data-position=right] .copilot-tooltip-arrow{left:-4px;top:50%;transform:translateY(-50%);border-width:4px 4px 4px 0;border-color:transparent #1a1a1a transparent transparent}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipContent, decorators: [{
31
+ type: Component,
32
+ args: [{ selector: "copilot-tooltip-content", standalone: true, template: `
33
+ <div class="copilot-tooltip-wrapper" [attr.data-position]="position">
34
+ <div class="copilot-tooltip">
35
+ {{ text }}
36
+ </div>
37
+ <div class="copilot-tooltip-arrow"></div>
38
+ </div>
39
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".copilot-tooltip-wrapper{position:relative;display:inline-block;animation:fadeIn .15s ease-in-out}.copilot-tooltip{background-color:#1a1a1a;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-weight:500;white-space:nowrap;max-width:200px;box-shadow:0 2px 8px #00000026}.copilot-tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.copilot-tooltip-wrapper[data-position=below] .copilot-tooltip-arrow{top:-4px;left:50%;transform:translate(-50%);border-width:0 4px 4px 4px;border-color:transparent transparent #1a1a1a transparent}.copilot-tooltip-wrapper[data-position=above] .copilot-tooltip-arrow{bottom:-4px;left:50%;transform:translate(-50%);border-width:4px 4px 0 4px;border-color:#1a1a1a transparent transparent transparent}.copilot-tooltip-wrapper[data-position=left] .copilot-tooltip-arrow{right:-4px;top:50%;transform:translateY(-50%);border-width:4px 0 4px 4px;border-color:transparent transparent transparent #1a1a1a}.copilot-tooltip-wrapper[data-position=right] .copilot-tooltip-arrow{left:-4px;top:50%;transform:translateY(-50%);border-width:4px 4px 4px 0;border-color:transparent #1a1a1a transparent transparent}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}\n"] }]
40
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
41
+ export class CopilotTooltip {
42
+ tooltipText = "";
43
+ tooltipPosition = "below";
44
+ tooltipDelay = 500; // milliseconds
45
+ overlay = inject(Overlay);
46
+ overlayPositionBuilder = inject(OverlayPositionBuilder);
47
+ elementRef = inject(ElementRef);
48
+ viewContainerRef = inject(ViewContainerRef);
49
+ overlayRef;
50
+ tooltipTimeout;
51
+ originalTitle;
52
+ onMouseEnter() {
53
+ if (!this.tooltipText)
54
+ return;
55
+ // Store and remove native title to prevent OS tooltip
56
+ const element = this.elementRef.nativeElement;
57
+ if (element.hasAttribute("title")) {
58
+ this.originalTitle = element.getAttribute("title");
59
+ element.removeAttribute("title");
60
+ }
61
+ // Clear any existing timeout
62
+ if (this.tooltipTimeout) {
63
+ clearTimeout(this.tooltipTimeout);
64
+ }
65
+ // Set timeout to show tooltip after delay
66
+ this.tooltipTimeout = window.setTimeout(() => {
67
+ this.show();
68
+ }, this.tooltipDelay);
69
+ }
70
+ onMouseLeave() {
71
+ // Clear timeout if mouse leaves before tooltip shows
72
+ if (this.tooltipTimeout) {
73
+ clearTimeout(this.tooltipTimeout);
74
+ this.tooltipTimeout = undefined;
75
+ }
76
+ // Restore original title if it existed
77
+ if (this.originalTitle !== undefined) {
78
+ this.elementRef.nativeElement.setAttribute("title", this.originalTitle);
79
+ this.originalTitle = undefined;
80
+ }
81
+ // Hide tooltip if it's showing
82
+ this.hide();
83
+ }
84
+ show() {
85
+ if (this.overlayRef) {
86
+ return;
87
+ }
88
+ // Create overlay
89
+ const positionStrategy = this.overlayPositionBuilder
90
+ .flexibleConnectedTo(this.elementRef)
91
+ .withPositions(this.getPositions())
92
+ .withPush(false);
93
+ this.overlayRef = this.overlay.create({
94
+ positionStrategy,
95
+ scrollStrategy: this.overlay.scrollStrategies.close(),
96
+ hasBackdrop: false,
97
+ });
98
+ // Create component portal and attach
99
+ const portal = new ComponentPortal(TooltipContent, this.viewContainerRef);
100
+ const componentRef = this.overlayRef.attach(portal);
101
+ componentRef.instance.text = this.tooltipText;
102
+ // Detect actual position after overlay is positioned
103
+ setTimeout(() => {
104
+ if (this.overlayRef && this.elementRef.nativeElement) {
105
+ const tooltipRect = this.overlayRef.overlayElement.getBoundingClientRect();
106
+ const elementRect = this.elementRef.nativeElement.getBoundingClientRect();
107
+ let actualPosition = "below";
108
+ // Determine actual position based on relative positions
109
+ if (tooltipRect.bottom <= elementRect.top) {
110
+ actualPosition = "above";
111
+ }
112
+ else if (tooltipRect.top >= elementRect.bottom) {
113
+ actualPosition = "below";
114
+ }
115
+ else if (tooltipRect.right <= elementRect.left) {
116
+ actualPosition = "left";
117
+ }
118
+ else if (tooltipRect.left >= elementRect.right) {
119
+ actualPosition = "right";
120
+ }
121
+ componentRef.instance.position = actualPosition;
122
+ }
123
+ }, 0);
124
+ }
125
+ hide() {
126
+ if (this.overlayRef) {
127
+ this.overlayRef.dispose();
128
+ this.overlayRef = undefined;
129
+ }
130
+ }
131
+ getPositions() {
132
+ const positions = {
133
+ above: [
134
+ {
135
+ originX: "center",
136
+ originY: "top",
137
+ overlayX: "center",
138
+ overlayY: "bottom",
139
+ offsetY: -12,
140
+ },
141
+ ],
142
+ below: [
143
+ {
144
+ originX: "center",
145
+ originY: "bottom",
146
+ overlayX: "center",
147
+ overlayY: "top",
148
+ offsetY: 12,
149
+ },
150
+ ],
151
+ left: [
152
+ {
153
+ originX: "start",
154
+ originY: "center",
155
+ overlayX: "end",
156
+ overlayY: "center",
157
+ offsetX: -12,
158
+ },
159
+ ],
160
+ right: [
161
+ {
162
+ originX: "end",
163
+ originY: "center",
164
+ overlayX: "start",
165
+ overlayY: "center",
166
+ offsetX: 12,
167
+ },
168
+ ],
169
+ };
170
+ // Prefer below position, but use above as fallback
171
+ const primary = positions[this.tooltipPosition] || positions.below;
172
+ // For below position, add above as first fallback
173
+ const fallbacks = this.tooltipPosition === "below"
174
+ ? [
175
+ ...(positions.above || []),
176
+ ...(positions.left || []),
177
+ ...(positions.right || []),
178
+ ]
179
+ : Object.values(positions)
180
+ .filter((p) => p !== primary)
181
+ .flat();
182
+ return [...(primary || []), ...fallbacks];
183
+ }
184
+ ngOnDestroy() {
185
+ if (this.tooltipTimeout) {
186
+ clearTimeout(this.tooltipTimeout);
187
+ }
188
+ // Restore original title if it existed
189
+ if (this.originalTitle !== undefined) {
190
+ this.elementRef.nativeElement.setAttribute("title", this.originalTitle);
191
+ }
192
+ this.hide();
193
+ }
194
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
195
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotTooltip, isStandalone: true, selector: "[copilotTooltip]", inputs: { tooltipText: ["copilotTooltip", "tooltipText"], tooltipPosition: "tooltipPosition", tooltipDelay: "tooltipDelay" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 });
196
+ }
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltip, decorators: [{
198
+ type: Directive,
199
+ args: [{
200
+ selector: "[copilotTooltip]",
201
+ standalone: true,
202
+ }]
203
+ }], propDecorators: { tooltipText: [{
204
+ type: Input,
205
+ args: ["copilotTooltip"]
206
+ }], tooltipPosition: [{
207
+ type: Input
208
+ }], tooltipDelay: [{
209
+ type: Input
210
+ }], onMouseEnter: [{
211
+ type: HostListener,
212
+ args: ["mouseenter"]
213
+ }], onMouseLeave: [{
214
+ type: HostListener,
215
+ args: ["mouseleave"]
216
+ }] } });
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGlyZWN0aXZlcy90b29sdGlwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBRVosTUFBTSxFQUNOLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUVQLHNCQUFzQixHQUV2QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixHQUV4QixNQUFNLGVBQWUsQ0FBQzs7QUEwRnZCLE1BQU0sT0FBTyxjQUFjO0lBYUw7SUFacEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNGLFNBQVMsR0FBeUMsT0FBTyxDQUFDO0lBRWxFLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBMkM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBRyxDQUFDO3dHQWJuQyxjQUFjOzRGQUFkLGNBQWMsbUZBckZmOzs7Ozs7O0dBT1Q7OzRGQThFVSxjQUFjO2tCQXhGMUIsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxZQUNOOzs7Ozs7O0dBT1QsbUJBNEVnQix1QkFBdUIsQ0FBQyxNQUFNOztBQXNCakQsTUFBTSxPQUFPLGNBQWM7SUFDQSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBeUMsT0FBTyxDQUFDO0lBQ2hFLFlBQVksR0FB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QyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztpQkFDckIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO2lCQUM1QixJQUFJLEVBQUUsQ0FBQztRQUVoQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzt3R0EvS1UsY0FBYzs0RkFBZCxjQUFjOzs0RkFBZCxjQUFjO2tCQUoxQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFFMEIsV0FBVztzQkFBbkMsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ2QsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQVlOLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZO2dCQXVCMUIsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgaW5qZWN0LFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheVJlZixcbiAgT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcbiAgQ29ubmVjdGVkUG9zaXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiY29waWxvdC10b29sdGlwLWNvbnRlbnRcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwLXdyYXBwZXJcIiBbYXR0ci5kYXRhLXBvc2l0aW9uXT1cInBvc2l0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwXCI+XG4gICAgICAgIHt7IHRleHQgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvcGlsb3QtdG9vbHRpcC1hcnJvd1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXIge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgYW5pbWF0aW9uOiBmYWRlSW4gMC4xNXMgZWFzZS1pbi1vdXQ7XG4gICAgICB9XG5cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWExYTFhO1xuICAgICAgICBjb2xvcjogd2hpdGU7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gICAgICB9XG5cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEFycm93IGZvciB0b29sdGlwIGJlbG93IGVsZW1lbnQgKGFycm93IHBvaW50cyB1cCB0byB0b29sdGlwKSAqL1xuICAgICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyW2RhdGEtcG9zaXRpb249XCJiZWxvd1wiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgICAgdG9wOiAtNHB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgYm9yZGVyLXdpZHRoOiAwIDRweCA0cHggNHB4O1xuICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMxYTFhMWEgdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEFycm93IGZvciB0b29sdGlwIGFib3ZlIGVsZW1lbnQgKGFycm93IHBvaW50cyBkb3duIHRvIGVsZW1lbnQpICovXG4gICAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXJbZGF0YS1wb3NpdGlvbj1cImFib3ZlXCJdIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgICBib3R0b206IC00cHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICBib3JkZXItd2lkdGg6IDRweCA0cHggMCA0cHg7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzFhMWExYSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgdG8gdGhlIGxlZnQgKi9cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwibGVmdFwiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgICAgcmlnaHQ6IC00cHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgIGJvcmRlci13aWR0aDogNHB4IDAgNHB4IDRweDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjMWExYTFhO1xuICAgICAgfVxuXG4gICAgICAvKiBBcnJvdyBmb3IgdG9vbHRpcCB0byB0aGUgcmlnaHQgKi9cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwicmlnaHRcIl0gLmNvcGlsb3QtdG9vbHRpcC1hcnJvdyB7XG4gICAgICAgIGxlZnQ6IC00cHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgIGJvcmRlci13aWR0aDogNHB4IDRweCA0cHggMDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCAjMWExYTFhIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGZhZGVJbiB7XG4gICAgICAgIGZyb20ge1xuICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDJweCk7XG4gICAgICAgIH1cbiAgICAgICAgdG8ge1xuICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBDb250ZW50IHtcbiAgdGV4dCA9IFwiXCI7XG4gIHByaXZhdGUgX3Bvc2l0aW9uOiBcImFib3ZlXCIgfCBcImJlbG93XCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiA9IFwiYmVsb3dcIjtcblxuICBnZXQgcG9zaXRpb24oKTogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuXG4gIHNldCBwb3NpdGlvbih2YWx1ZTogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIpIHtcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RUb29sdGlwXVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90VG9vbHRpcCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dChcImNvcGlsb3RUb29sdGlwXCIpIHRvb2x0aXBUZXh0ID0gXCJcIjtcbiAgQElucHV0KCkgdG9vbHRpcFBvc2l0aW9uOiBcImFib3ZlXCIgfCBcImJlbG93XCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgdG9vbHRpcERlbGF5ID0gNTAwOyAvLyBtaWxsaXNlY29uZHNcblxuICBwcml2YXRlIG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgb3ZlcmxheVBvc2l0aW9uQnVpbGRlciA9IGluamVjdChPdmVybGF5UG9zaXRpb25CdWlsZGVyKTtcbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cbiAgcHJpdmF0ZSBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSB0b29sdGlwVGltZW91dD86IG51bWJlcjtcbiAgcHJpdmF0ZSBvcmlnaW5hbFRpdGxlPzogc3RyaW5nO1xuXG4gIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIpXG4gIG9uTW91c2VFbnRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG9vbHRpcFRleHQpIHJldHVybjtcblxuICAgIC8vIFN0b3JlIGFuZCByZW1vdmUgbmF0aXZlIHRpdGxlIHRvIHByZXZlbnQgT1MgdG9vbHRpcFxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFRpdGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXRcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aW1lb3V0IHRvIHNob3cgdG9vbHRpcCBhZnRlciBkZWxheVxuICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9LCB0aGlzLnRvb2x0aXBEZWxheSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwibW91c2VsZWF2ZVwiKVxuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGltZW91dCBpZiBtb3VzZSBsZWF2ZXMgYmVmb3JlIHRvb2x0aXAgc2hvd3NcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgICAgdGhpcy50b29sdGlwVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRpdGxlIGlmIGl0IGV4aXN0ZWRcbiAgICBpZiAodGhpcy5vcmlnaW5hbFRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIHRoaXMub3JpZ2luYWxUaXRsZSk7XG4gICAgICB0aGlzLm9yaWdpbmFsVGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSGlkZSB0b29sdGlwIGlmIGl0J3Mgc2hvd2luZ1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgb3ZlcmxheVxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlQb3NpdGlvbkJ1aWxkZXJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcbiAgICAgIC53aXRoUG9zaXRpb25zKHRoaXMuZ2V0UG9zaXRpb25zKCkpXG4gICAgICAud2l0aFB1c2goZmFsc2UpO1xuXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmNsb3NlKCksXG4gICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50IHBvcnRhbCBhbmQgYXR0YWNoXG4gICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChUb29sdGlwQ29udGVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnRleHQgPSB0aGlzLnRvb2x0aXBUZXh0O1xuXG4gICAgLy8gRGV0ZWN0IGFjdHVhbCBwb3NpdGlvbiBhZnRlciBvdmVybGF5IGlzIHBvc2l0aW9uZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPVxuICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPVxuICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGxldCBhY3R1YWxQb3NpdGlvbjogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgPSBcImJlbG93XCI7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGFjdHVhbCBwb3NpdGlvbiBiYXNlZCBvbiByZWxhdGl2ZSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKHRvb2x0aXBSZWN0LmJvdHRvbSA8PSBlbGVtZW50UmVjdC50b3ApIHtcbiAgICAgICAgICBhY3R1YWxQb3NpdGlvbiA9IFwiYWJvdmVcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC50b3AgPj0gZWxlbWVudFJlY3QuYm90dG9tKSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSBcImJlbG93XCI7XG4gICAgICAgIH0gZWxzZSBpZiAodG9vbHRpcFJlY3QucmlnaHQgPD0gZWxlbWVudFJlY3QubGVmdCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gXCJsZWZ0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAodG9vbHRpcFJlY3QubGVmdCA+PSBlbGVtZW50UmVjdC5yaWdodCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gXCJyaWdodFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnBvc2l0aW9uID0gYWN0dWFsUG9zaXRpb247XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGhpZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9ucygpOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBwb3NpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbm5lY3RlZFBvc2l0aW9uW10+ID0ge1xuICAgICAgYWJvdmU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgICBvZmZzZXRZOiAtMTIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYmVsb3c6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICBvdmVybGF5WDogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgICBvZmZzZXRZOiAxMixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiBcInN0YXJ0XCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvZmZzZXRYOiAtMTIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcmlnaHQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiZW5kXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgIG92ZXJsYXlZOiBcImNlbnRlclwiLFxuICAgICAgICAgIG9mZnNldFg6IDEyLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgLy8gUHJlZmVyIGJlbG93IHBvc2l0aW9uLCBidXQgdXNlIGFib3ZlIGFzIGZhbGxiYWNrXG4gICAgY29uc3QgcHJpbWFyeSA9IHBvc2l0aW9uc1t0aGlzLnRvb2x0aXBQb3NpdGlvbl0gfHwgcG9zaXRpb25zLmJlbG93O1xuICAgIC8vIEZvciBiZWxvdyBwb3NpdGlvbiwgYWRkIGFib3ZlIGFzIGZpcnN0IGZhbGxiYWNrXG4gICAgY29uc3QgZmFsbGJhY2tzID1cbiAgICAgIHRoaXMudG9vbHRpcFBvc2l0aW9uID09PSBcImJlbG93XCJcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi4ocG9zaXRpb25zLmFib3ZlIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLihwb3NpdGlvbnMubGVmdCB8fCBbXSksXG4gICAgICAgICAgICAuLi4ocG9zaXRpb25zLnJpZ2h0IHx8IFtdKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogT2JqZWN0LnZhbHVlcyhwb3NpdGlvbnMpXG4gICAgICAgICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBwcmltYXJ5KVxuICAgICAgICAgICAgLmZsYXQoKTtcblxuICAgIHJldHVybiBbLi4uKHByaW1hcnkgfHwgW10pLCAuLi5mYWxsYmFja3NdO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0aXRsZSBpZiBpdCBleGlzdGVkXG4gICAgaWYgKHRoaXMub3JpZ2luYWxUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCB0aGlzLm9yaWdpbmFsVGl0bGUpO1xuICAgIH1cbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,19 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { filter, lastValueFrom, Subject, take } from "rxjs";
3
+ import * as i0 from "@angular/core";
4
+ export class HumanInTheLoop {
5
+ results = new Subject();
6
+ addResult(toolCallId, toolName, result) {
7
+ this.results.next({ toolCallId, toolName, result });
8
+ }
9
+ onResult(toolCallId, toolName) {
10
+ return lastValueFrom(this.results.pipe(filter((result) => result.toolCallId === toolCallId && result.toolName === toolName), take(1)));
11
+ }
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HumanInTheLoop, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
13
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HumanInTheLoop, providedIn: "root" });
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HumanInTheLoop, decorators: [{
16
+ type: Injectable,
17
+ args: [{ providedIn: "root" }]
18
+ }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taW4tdGhlLWxvb3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2h1bWFuLWluLXRoZS1sb29wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFHNUQsTUFBTSxPQUFPLGNBQWM7SUFDekIsT0FBTyxHQUFHLElBQUksT0FBTyxFQUlqQixDQUFDO0lBRUwsU0FBUyxDQUFDLFVBQWtCLEVBQUUsUUFBZ0IsRUFBRSxNQUFlO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxRQUFRLENBQUMsVUFBa0IsRUFBRSxRQUFnQjtRQUMzQyxPQUFPLGFBQWEsQ0FDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsTUFBTSxDQUNKLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FDbkUsRUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1IsQ0FDRixDQUFDO0lBQ0osQ0FBQzt3R0FyQlUsY0FBYzs0R0FBZCxjQUFjLGNBREQsTUFBTTs7NEZBQ25CLGNBQWM7a0JBRDFCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2UgfSBmcm9tIFwicnhqc1wiO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgSHVtYW5JblRoZUxvb3Age1xuICByZXN1bHRzID0gbmV3IFN1YmplY3Q8e1xuICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICB0b29sTmFtZTogc3RyaW5nO1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgfT4oKTtcblxuICBhZGRSZXN1bHQodG9vbENhbGxJZDogc3RyaW5nLCB0b29sTmFtZTogc3RyaW5nLCByZXN1bHQ6IHVua25vd24pIHtcbiAgICB0aGlzLnJlc3VsdHMubmV4dCh7IHRvb2xDYWxsSWQsIHRvb2xOYW1lLCByZXN1bHQgfSk7XG4gIH1cblxuICBvblJlc3VsdCh0b29sQ2FsbElkOiBzdHJpbmcsIHRvb2xOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gbGFzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMucmVzdWx0cy5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKHJlc3VsdCkgPT5cbiAgICAgICAgICAgIHJlc3VsdC50b29sQ2FsbElkID09PSB0b29sQ2FsbElkICYmIHJlc3VsdC50b29sTmFtZSA9PT0gdG9vbE5hbWVcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,131 @@
1
+ import { NgComponentOutlet } from "@angular/common";
2
+ import { Component, inject, input } from "@angular/core";
3
+ import { CopilotKit } from "./copilotkit";
4
+ import { partialJSONParse } from "@copilotkitnext/shared";
5
+ import { HumanInTheLoop } from "./human-in-the-loop";
6
+ import * as i0 from "@angular/core";
7
+ export class RenderToolCalls {
8
+ #copilotKit = inject(CopilotKit);
9
+ #hitl = inject(HumanInTheLoop);
10
+ message = input.required();
11
+ messages = input.required();
12
+ isLoading = input(false);
13
+ pickRenderer(name) {
14
+ const messageAgentId = this.message()
15
+ .agentId;
16
+ const renderers = this.#copilotKit.toolCallRenderConfigs();
17
+ const clientTools = this.#copilotKit.clientToolCallRenderConfigs();
18
+ const humanInTheLoopTools = this.#copilotKit.humanInTheLoopToolRenderConfigs();
19
+ const renderer = renderers.find((candidate) => candidate.name === name &&
20
+ (candidate.agentId === undefined ||
21
+ candidate.agentId === messageAgentId));
22
+ if (renderer)
23
+ return { type: "renderer", config: renderer };
24
+ const clientTool = clientTools.find((candidate) => candidate.name === name &&
25
+ (candidate.agentId === undefined ||
26
+ candidate.agentId === messageAgentId));
27
+ if (clientTool)
28
+ return { type: "clientTool", config: clientTool };
29
+ const humanInTheLoopTool = humanInTheLoopTools.find((candidate) => candidate.name === name &&
30
+ (candidate.agentId === undefined ||
31
+ candidate.agentId === messageAgentId));
32
+ if (humanInTheLoopTool)
33
+ return { type: "humanInTheLoopTool", config: humanInTheLoopTool };
34
+ const starRenderer = renderers.find((candidate) => candidate.name === "*");
35
+ if (starRenderer)
36
+ return { type: "renderer", config: starRenderer };
37
+ return undefined;
38
+ }
39
+ buildToolCall(toolCall) {
40
+ const args = partialJSONParse(toolCall.function.arguments);
41
+ const message = this.#getToolMessage(toolCall.id);
42
+ if (message) {
43
+ return {
44
+ args,
45
+ status: "complete",
46
+ result: message.content,
47
+ };
48
+ }
49
+ else if (this.isLoading()) {
50
+ return {
51
+ args,
52
+ status: "in-progress",
53
+ result: undefined,
54
+ };
55
+ }
56
+ else {
57
+ return {
58
+ args,
59
+ status: "executing",
60
+ result: undefined,
61
+ };
62
+ }
63
+ }
64
+ buildHumanInTheLoopToolCall(toolCall) {
65
+ const args = partialJSONParse(toolCall.function.arguments);
66
+ const message = this.#getToolMessage(toolCall.id);
67
+ if (message) {
68
+ return {
69
+ args,
70
+ status: "complete",
71
+ result: message.content,
72
+ };
73
+ }
74
+ else if (this.isLoading()) {
75
+ return {
76
+ args,
77
+ status: "in-progress",
78
+ result: undefined,
79
+ };
80
+ }
81
+ else {
82
+ return {
83
+ args,
84
+ status: "executing",
85
+ result: undefined,
86
+ respond: (result) => {
87
+ this.#hitl.addResult(toolCall.id, toolCall.function.name, result);
88
+ },
89
+ };
90
+ }
91
+ }
92
+ #getToolMessage(toolCallId) {
93
+ return this.messages().find((m) => m.role === "tool" && m.toolCallId === toolCallId);
94
+ }
95
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RenderToolCalls, deps: [], target: i0.ɵɵFactoryTarget.Component });
96
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: RenderToolCalls, isStandalone: true, selector: "copilot-render-tool-calls", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
97
+ @for (toolCall of message().toolCalls ?? []; track toolCall.id) {
98
+ @let renderConfig = pickRenderer(toolCall.function.name);
99
+ @if (renderConfig && renderConfig.type !== "humanInTheLoopTool") {
100
+ <ng-container
101
+ *ngComponentOutlet="
102
+ renderConfig.config.component;
103
+ inputs: { toolCall: buildToolCall(toolCall) }
104
+ "
105
+ />
106
+ }
107
+ }
108
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }] });
109
+ }
110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RenderToolCalls, decorators: [{
111
+ type: Component,
112
+ args: [{
113
+ selector: "copilot-render-tool-calls",
114
+ standalone: true,
115
+ imports: [NgComponentOutlet],
116
+ template: `
117
+ @for (toolCall of message().toolCalls ?? []; track toolCall.id) {
118
+ @let renderConfig = pickRenderer(toolCall.function.name);
119
+ @if (renderConfig && renderConfig.type !== "humanInTheLoopTool") {
120
+ <ng-container
121
+ *ngComponentOutlet="
122
+ renderConfig.config.component;
123
+ inputs: { toolCall: buildToolCall(toolCall) }
124
+ "
125
+ />
126
+ }
127
+ }
128
+ `,
129
+ }]
130
+ }] });
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXRvb2wtY2FsbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlci10b29sLWNhbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBUTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFzQ3JELE1BQU0sT0FBTyxlQUFlO0lBQ2pCLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBb0IsQ0FBQztJQUM3QyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBYSxDQUFDO0lBQ3ZDLFNBQVMsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFakMsWUFBWSxDQUFDLElBQVk7UUFJakMsTUFBTSxjQUFjLEdBQUksSUFBSSxDQUFDLE9BQU8sRUFBZ0M7YUFDakUsT0FBTyxDQUFDO1FBQ1gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNuRSxNQUFNLG1CQUFtQixHQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFFckQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FDN0IsQ0FBQyxT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QixNQUFNLEVBQUUsU0FBUzthQUNsQixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPO2dCQUNMLElBQUk7Z0JBQ0osTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDcEUsQ0FBQzthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUFrQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQ3pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FDeEQsQ0FBQztJQUNKLENBQUM7d0dBL0dVLGVBQWU7NEZBQWYsZUFBZSxrZUFkaEI7Ozs7Ozs7Ozs7OztHQVlULDREQWJTLGlCQUFpQjs7NEZBZWhCLGVBQWU7a0JBbEIzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDNUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7R0FZVDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIGlucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEFzc2lzdGFudE1lc3NhZ2UsIE1lc3NhZ2UsIFRvb2xDYWxsIH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcbmltcG9ydCB7IENvcGlsb3RLaXQgfSBmcm9tIFwiLi9jb3BpbG90a2l0XCI7XG5pbXBvcnQge1xuICBGcm9udGVuZFRvb2xDb25maWcsXG4gIEh1bWFuSW5UaGVMb29wVG9vbENhbGwsXG4gIEh1bWFuSW5UaGVMb29wQ29uZmlnLFxuICBBbmd1bGFyVG9vbENhbGwsXG4gIFJlbmRlclRvb2xDYWxsQ29uZmlnLFxufSBmcm9tIFwiLi90b29sc1wiO1xuaW1wb3J0IHsgcGFydGlhbEpTT05QYXJzZSB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvc2hhcmVkXCI7XG5pbXBvcnQgeyBIdW1hbkluVGhlTG9vcCB9IGZyb20gXCIuL2h1bWFuLWluLXRoZS1sb29wXCI7XG5cbnR5cGUgUmVuZGVyZXJUb29sQ2FsbEhhbmRsZXIgPSB7XG4gIHR5cGU6IFwicmVuZGVyZXJcIjtcbiAgY29uZmlnOiBSZW5kZXJUb29sQ2FsbENvbmZpZztcbn07XG50eXBlIENsaWVudFRvb2xDYWxsSGFuZGxlciA9IHtcbiAgdHlwZTogXCJjbGllbnRUb29sXCI7XG4gIGNvbmZpZzogRnJvbnRlbmRUb29sQ29uZmlnO1xufTtcbnR5cGUgSHVtYW5JblRoZUxvb3BUb29sQ2FsbEhhbmRsZXIgPSB7XG4gIHR5cGU6IFwiaHVtYW5JblRoZUxvb3BUb29sXCI7XG4gIGNvbmZpZzogSHVtYW5JblRoZUxvb3BDb25maWc7XG59O1xuXG50eXBlIFRvb2xDYWxsSGFuZGxlciA9XG4gIHwgUmVuZGVyZXJUb29sQ2FsbEhhbmRsZXJcbiAgfCBDbGllbnRUb29sQ2FsbEhhbmRsZXJcbiAgfCBIdW1hbkluVGhlTG9vcFRvb2xDYWxsSGFuZGxlcjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNvcGlsb3QtcmVuZGVyLXRvb2wtY2FsbHNcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nQ29tcG9uZW50T3V0bGV0XSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAZm9yICh0b29sQ2FsbCBvZiBtZXNzYWdlKCkudG9vbENhbGxzID8/IFtdOyB0cmFjayB0b29sQ2FsbC5pZCkge1xuICAgICAgQGxldCByZW5kZXJDb25maWcgPSBwaWNrUmVuZGVyZXIodG9vbENhbGwuZnVuY3Rpb24ubmFtZSk7XG4gICAgICBAaWYgKHJlbmRlckNvbmZpZyAmJiByZW5kZXJDb25maWcudHlwZSAhPT0gXCJodW1hbkluVGhlTG9vcFRvb2xcIikge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiXG4gICAgICAgICAgICByZW5kZXJDb25maWcuY29uZmlnLmNvbXBvbmVudDtcbiAgICAgICAgICAgIGlucHV0czogeyB0b29sQ2FsbDogYnVpbGRUb29sQ2FsbCh0b29sQ2FsbCkgfVxuICAgICAgICAgIFwiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgfVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBSZW5kZXJUb29sQ2FsbHMge1xuICByZWFkb25seSAjY29waWxvdEtpdCA9IGluamVjdChDb3BpbG90S2l0KTtcbiAgcmVhZG9ubHkgI2hpdGwgPSBpbmplY3QoSHVtYW5JblRoZUxvb3ApO1xuICByZWFkb25seSBtZXNzYWdlID0gaW5wdXQucmVxdWlyZWQ8QXNzaXN0YW50TWVzc2FnZT4oKTtcbiAgcmVhZG9ubHkgbWVzc2FnZXMgPSBpbnB1dC5yZXF1aXJlZDxNZXNzYWdlW10+KCk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgcGlja1JlbmRlcmVyKG5hbWU6IHN0cmluZyk6IFRvb2xDYWxsSGFuZGxlciB8IHVuZGVmaW5lZCB7XG4gICAgdHlwZSBBc3Npc3RhbnRNZXNzYWdlV2l0aEFnZW50ID0gQXNzaXN0YW50TWVzc2FnZSAmIHtcbiAgICAgIGFnZW50SWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBtZXNzYWdlQWdlbnRJZCA9ICh0aGlzLm1lc3NhZ2UoKSBhcyBBc3Npc3RhbnRNZXNzYWdlV2l0aEFnZW50KVxuICAgICAgLmFnZW50SWQ7XG4gICAgY29uc3QgcmVuZGVyZXJzID0gdGhpcy4jY29waWxvdEtpdC50b29sQ2FsbFJlbmRlckNvbmZpZ3MoKTtcbiAgICBjb25zdCBjbGllbnRUb29scyA9IHRoaXMuI2NvcGlsb3RLaXQuY2xpZW50VG9vbENhbGxSZW5kZXJDb25maWdzKCk7XG4gICAgY29uc3QgaHVtYW5JblRoZUxvb3BUb29scyA9XG4gICAgICB0aGlzLiNjb3BpbG90S2l0Lmh1bWFuSW5UaGVMb29wVG9vbFJlbmRlckNvbmZpZ3MoKTtcblxuICAgIGNvbnN0IHJlbmRlcmVyID0gcmVuZGVyZXJzLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICBjYW5kaWRhdGUubmFtZSA9PT0gbmFtZSAmJlxuICAgICAgICAoY2FuZGlkYXRlLmFnZW50SWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIGNhbmRpZGF0ZS5hZ2VudElkID09PSBtZXNzYWdlQWdlbnRJZClcbiAgICApO1xuXG4gICAgaWYgKHJlbmRlcmVyKSByZXR1cm4geyB0eXBlOiBcInJlbmRlcmVyXCIsIGNvbmZpZzogcmVuZGVyZXIgfTtcblxuICAgIGNvbnN0IGNsaWVudFRvb2wgPSBjbGllbnRUb29scy5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUgJiZcbiAgICAgICAgKGNhbmRpZGF0ZS5hZ2VudElkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBjYW5kaWRhdGUuYWdlbnRJZCA9PT0gbWVzc2FnZUFnZW50SWQpXG4gICAgKTtcbiAgICBpZiAoY2xpZW50VG9vbCkgcmV0dXJuIHsgdHlwZTogXCJjbGllbnRUb29sXCIsIGNvbmZpZzogY2xpZW50VG9vbCB9O1xuXG4gICAgY29uc3QgaHVtYW5JblRoZUxvb3BUb29sID0gaHVtYW5JblRoZUxvb3BUb29scy5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUgJiZcbiAgICAgICAgKGNhbmRpZGF0ZS5hZ2VudElkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBjYW5kaWRhdGUuYWdlbnRJZCA9PT0gbWVzc2FnZUFnZW50SWQpXG4gICAgKTtcbiAgICBpZiAoaHVtYW5JblRoZUxvb3BUb29sKVxuICAgICAgcmV0dXJuIHsgdHlwZTogXCJodW1hbkluVGhlTG9vcFRvb2xcIiwgY29uZmlnOiBodW1hbkluVGhlTG9vcFRvb2wgfTtcblxuICAgIGNvbnN0IHN0YXJSZW5kZXJlciA9IHJlbmRlcmVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSBcIipcIik7XG4gICAgaWYgKHN0YXJSZW5kZXJlcikgcmV0dXJuIHsgdHlwZTogXCJyZW5kZXJlclwiLCBjb25maWc6IHN0YXJSZW5kZXJlciB9O1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFRvb2xDYWxsPEFyZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgdG9vbENhbGw6IFRvb2xDYWxsXG4gICk6IEFuZ3VsYXJUb29sQ2FsbDxBcmdzPiB7XG4gICAgY29uc3QgYXJncyA9IHBhcnRpYWxKU09OUGFyc2UodG9vbENhbGwuZnVuY3Rpb24uYXJndW1lbnRzKTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy4jZ2V0VG9vbE1lc3NhZ2UodG9vbENhbGwuaWQpO1xuXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXR1czogXCJjb21wbGV0ZVwiLFxuICAgICAgICByZXN1bHQ6IG1lc3NhZ2UuY29udGVudCEsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0xvYWRpbmcoKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImluLXByb2dyZXNzXCIsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImV4ZWN1dGluZ1wiLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkSHVtYW5JblRoZUxvb3BUb29sQ2FsbDxBcmdzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIHRvb2xDYWxsOiBUb29sQ2FsbFxuICApOiBIdW1hbkluVGhlTG9vcFRvb2xDYWxsPEFyZ3M+IHtcbiAgICBjb25zdCBhcmdzID0gcGFydGlhbEpTT05QYXJzZSh0b29sQ2FsbC5mdW5jdGlvbi5hcmd1bWVudHMpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLiNnZXRUb29sTWVzc2FnZSh0b29sQ2FsbC5pZCk7XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImNvbXBsZXRlXCIsXG4gICAgICAgIHJlc3VsdDogbWVzc2FnZS5jb250ZW50ISxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTG9hZGluZygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmdzLFxuICAgICAgICBzdGF0dXM6IFwiaW4tcHJvZ3Jlc3NcIixcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmdzLFxuICAgICAgICBzdGF0dXM6IFwiZXhlY3V0aW5nXCIsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICByZXNwb25kOiAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy4jaGl0bC5hZGRSZXN1bHQodG9vbENhbGwuaWQsIHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUsIHJlc3VsdCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gICNnZXRUb29sTWVzc2FnZSh0b29sQ2FsbElkOiBzdHJpbmcpOiBNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlcygpLmZpbmQoXG4gICAgICAobSkgPT4gbS5yb2xlID09PSBcInRvb2xcIiAmJiBtLnRvb2xDYWxsSWQgPT09IHRvb2xDYWxsSWRcbiAgICApO1xuICB9XG59XG4iXX0=