stream-chat-angular 4.66.1 → 5.0.0-v5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/assets/version.d.ts +1 -1
  2. package/{esm2015/assets/version.js → esm2020/assets/version.mjs} +2 -2
  3. package/esm2020/lib/attachment-configuration.service.mjs +185 -0
  4. package/esm2020/lib/attachment-list/attachment-list.component.mjs +205 -0
  5. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +45 -0
  6. package/esm2020/lib/attachment.service.mjs +262 -0
  7. package/esm2020/lib/avatar/avatar.component.mjs +163 -0
  8. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +74 -0
  9. package/esm2020/lib/channel/channel.component.mjs +46 -0
  10. package/esm2020/lib/channel-header/channel-header.component.mjs +79 -0
  11. package/esm2020/lib/channel-list/channel-list-toggle.service.mjs +72 -0
  12. package/esm2020/lib/channel-list/channel-list.component.mjs +60 -0
  13. package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
  14. package/esm2020/lib/channel.service.mjs +1460 -0
  15. package/esm2020/lib/chat-client.service.mjs +206 -0
  16. package/{esm2015/lib/custom-templates.service.js → esm2020/lib/custom-templates.service.mjs} +3 -3
  17. package/{esm2015/lib/date-parser.service.js → esm2020/lib/date-parser.service.mjs} +3 -3
  18. package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +83 -0
  19. package/esm2020/lib/get-channel-display-text.mjs +14 -0
  20. package/esm2020/lib/get-message-translation.mjs +12 -0
  21. package/esm2020/lib/icon/icon.component.mjs +21 -0
  22. package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +31 -0
  23. package/esm2020/lib/loading-indicator/loading-indicator.component.mjs +31 -0
  24. package/esm2020/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +38 -0
  25. package/esm2020/lib/message/message.component.mjs +418 -0
  26. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +130 -0
  27. package/esm2020/lib/message-actions.service.mjs +119 -0
  28. package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
  29. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +262 -0
  30. package/{esm2015/lib/message-input/emoji-input.service.js → esm2020/lib/message-input/emoji-input.service.mjs} +3 -3
  31. package/{esm2015/lib/message-input/message-input-config.service.js → esm2020/lib/message-input/message-input-config.service.mjs} +3 -3
  32. package/esm2020/lib/message-input/message-input.component.mjs +443 -0
  33. package/{esm2015/lib/message-input/textarea/textarea.component.js → esm2020/lib/message-input/textarea/textarea.component.mjs} +5 -9
  34. package/esm2020/lib/message-input/textarea.directive.mjs +89 -0
  35. package/esm2020/lib/message-list/group-styles.mjs +52 -0
  36. package/{esm2015/lib/message-list/image-load.service.js → esm2020/lib/message-list/image-load.service.mjs} +3 -3
  37. package/esm2020/lib/message-list/message-list.component.mjs +699 -0
  38. package/esm2020/lib/message-preview.mjs +21 -0
  39. package/esm2020/lib/message-reactions/message-reactions.component.mjs +252 -0
  40. package/{esm2015/lib/message-reactions.service.js → esm2020/lib/message-reactions.service.mjs} +3 -3
  41. package/{esm2015/lib/message.service.js → esm2020/lib/message.service.mjs} +4 -4
  42. package/esm2020/lib/modal/modal.component.mjs +69 -0
  43. package/esm2020/lib/notification/notification.component.mjs +20 -0
  44. package/esm2020/lib/notification-list/notification-list.component.mjs +37 -0
  45. package/esm2020/lib/notification.service.mjs +79 -0
  46. package/esm2020/lib/read-by.mjs +12 -0
  47. package/{esm2015/lib/stream-autocomplete-textarea.module.js → esm2020/lib/stream-autocomplete-textarea.module.mjs} +6 -6
  48. package/{esm2015/lib/stream-avatar.module.js → esm2020/lib/stream-avatar.module.mjs} +5 -5
  49. package/{esm2015/lib/stream-chat.module.js → esm2020/lib/stream-chat.module.mjs} +14 -16
  50. package/{esm2015/lib/stream-i18n.service.js → esm2020/lib/stream-i18n.service.mjs} +5 -5
  51. package/{esm2015/lib/stream-textarea.module.js → esm2020/lib/stream-textarea.module.mjs} +6 -6
  52. package/esm2020/lib/theme.service.mjs +123 -0
  53. package/esm2020/lib/thread/thread.component.mjs +51 -0
  54. package/{esm2015/lib/transliteration.service.js → esm2020/lib/transliteration.service.mjs} +3 -3
  55. package/esm2020/lib/types.mjs +2 -0
  56. package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +183 -0
  57. package/esm2020/lib/voice-recording/voice-recording.component.mjs +102 -0
  58. package/fesm2015/{stream-chat-angular.js → stream-chat-angular.mjs} +313 -426
  59. package/fesm2015/stream-chat-angular.mjs.map +1 -0
  60. package/fesm2020/stream-chat-angular.mjs +7123 -0
  61. package/fesm2020/stream-chat-angular.mjs.map +1 -0
  62. package/lib/attachment-list/attachment-list.component.d.ts +3 -3
  63. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  64. package/lib/attachment.service.d.ts +0 -1
  65. package/lib/avatar/avatar.component.d.ts +1 -1
  66. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
  67. package/lib/channel/channel.component.d.ts +1 -1
  68. package/lib/channel-header/channel-header.component.d.ts +1 -1
  69. package/lib/channel-list/channel-list-toggle.service.d.ts +0 -1
  70. package/lib/channel-list/channel-list.component.d.ts +1 -1
  71. package/lib/channel-preview/channel-preview.component.d.ts +1 -1
  72. package/lib/channel.service.d.ts +7 -7
  73. package/lib/chat-client.service.d.ts +1 -1
  74. package/lib/edit-message-form/edit-message-form.component.d.ts +1 -1
  75. package/lib/get-message-translation.d.ts +1 -1
  76. package/lib/icon/icon.component.d.ts +1 -1
  77. package/lib/icon-placeholder/icon-placeholder.component.d.ts +1 -1
  78. package/lib/loading-indicator/loading-indicator.component.d.ts +1 -1
  79. package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
  80. package/lib/message/message.component.d.ts +3 -7
  81. package/lib/message-actions-box/message-actions-box.component.d.ts +2 -4
  82. package/lib/message-actions.service.d.ts +0 -1
  83. package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
  84. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
  85. package/lib/message-input/message-input.component.d.ts +2 -2
  86. package/lib/message-input/textarea/textarea.component.d.ts +1 -1
  87. package/lib/message-input/textarea.directive.d.ts +1 -1
  88. package/lib/message-list/group-styles.d.ts +1 -1
  89. package/lib/message-list/message-list.component.d.ts +4 -5
  90. package/lib/message-reactions/message-reactions.component.d.ts +1 -4
  91. package/lib/message.service.d.ts +0 -1
  92. package/lib/modal/modal.component.d.ts +1 -1
  93. package/lib/notification/notification.component.d.ts +1 -1
  94. package/lib/notification-list/notification-list.component.d.ts +2 -2
  95. package/lib/notification.service.d.ts +2 -5
  96. package/lib/stream-chat.module.d.ts +3 -3
  97. package/lib/theme.service.d.ts +1 -2
  98. package/lib/thread/thread.component.d.ts +1 -1
  99. package/lib/types.d.ts +18 -18
  100. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +2 -2
  101. package/lib/voice-recording/voice-recording.component.d.ts +1 -1
  102. package/package.json +31 -17
  103. package/src/assets/styles/v2/css/index.css +1 -1
  104. package/src/assets/styles/v2/css/index.layout.css +1 -1
  105. package/src/assets/styles/v2/scss/_base.scss +2 -2
  106. package/src/assets/version.ts +1 -1
  107. package/bundles/stream-chat-angular.umd.js +0 -8445
  108. package/bundles/stream-chat-angular.umd.js.map +0 -1
  109. package/esm2015/lib/attachment-configuration.service.js +0 -186
  110. package/esm2015/lib/attachment-list/attachment-list.component.js +0 -209
  111. package/esm2015/lib/attachment-preview-list/attachment-preview-list.component.js +0 -49
  112. package/esm2015/lib/attachment.service.js +0 -276
  113. package/esm2015/lib/avatar/avatar.component.js +0 -172
  114. package/esm2015/lib/avatar-placeholder/avatar-placeholder.component.js +0 -78
  115. package/esm2015/lib/channel/channel.component.js +0 -50
  116. package/esm2015/lib/channel-header/channel-header.component.js +0 -86
  117. package/esm2015/lib/channel-list/channel-list-toggle.service.js +0 -73
  118. package/esm2015/lib/channel-list/channel-list.component.js +0 -67
  119. package/esm2015/lib/channel-preview/channel-preview.component.js +0 -167
  120. package/esm2015/lib/channel.service.js +0 -1487
  121. package/esm2015/lib/chat-client.service.js +0 -211
  122. package/esm2015/lib/edit-message-form/edit-message-form.component.js +0 -87
  123. package/esm2015/lib/get-channel-display-text.js +0 -15
  124. package/esm2015/lib/get-message-translation.js +0 -13
  125. package/esm2015/lib/icon/icon.component.js +0 -25
  126. package/esm2015/lib/icon-placeholder/icon-placeholder.component.js +0 -35
  127. package/esm2015/lib/loading-indicator/loading-indicator.component.js +0 -35
  128. package/esm2015/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.js +0 -42
  129. package/esm2015/lib/message/message.component.js +0 -436
  130. package/esm2015/lib/message-actions-box/message-actions-box.component.js +0 -137
  131. package/esm2015/lib/message-actions.service.js +0 -114
  132. package/esm2015/lib/message-bounce-prompt/message-bounce-prompt.component.js +0 -80
  133. package/esm2015/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.js +0 -262
  134. package/esm2015/lib/message-input/message-input.component.js +0 -455
  135. package/esm2015/lib/message-input/textarea.directive.js +0 -90
  136. package/esm2015/lib/message-list/group-styles.js +0 -53
  137. package/esm2015/lib/message-list/message-list.component.js +0 -726
  138. package/esm2015/lib/message-preview.js +0 -7
  139. package/esm2015/lib/message-reactions/message-reactions.component.js +0 -266
  140. package/esm2015/lib/modal/modal.component.js +0 -74
  141. package/esm2015/lib/notification/notification.component.js +0 -24
  142. package/esm2015/lib/notification-list/notification-list.component.js +0 -38
  143. package/esm2015/lib/notification.service.js +0 -79
  144. package/esm2015/lib/read-by.js +0 -13
  145. package/esm2015/lib/theme.service.js +0 -122
  146. package/esm2015/lib/thread/thread.component.js +0 -55
  147. package/esm2015/lib/types.js +0 -2
  148. package/esm2015/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.js +0 -192
  149. package/esm2015/lib/voice-recording/voice-recording.component.js +0 -115
  150. package/fesm2015/stream-chat-angular.js.map +0 -1
  151. /package/{esm2015/assets/i18n/en.js → esm2020/assets/i18n/en.mjs} +0 -0
  152. /package/{esm2015/lib/injection-tokens.js → esm2020/lib/injection-tokens.mjs} +0 -0
  153. /package/{esm2015/lib/is-image-attachment.js → esm2020/lib/is-image-attachment.mjs} +0 -0
  154. /package/{esm2015/lib/is-image-file.js → esm2020/lib/is-image-file.mjs} +0 -0
  155. /package/{esm2015/lib/is-on-separate-date.js → esm2020/lib/is-on-separate-date.mjs} +0 -0
  156. /package/{esm2015/lib/list-users.js → esm2020/lib/list-users.mjs} +0 -0
  157. /package/{esm2015/lib/message-input/textarea.interface.js → esm2020/lib/message-input/textarea.interface.mjs} +0 -0
  158. /package/{esm2015/lib/parse-date.js → esm2020/lib/parse-date.mjs} +0 -0
  159. /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  160. /package/{esm2015/stream-chat-angular.js → esm2020/stream-chat-angular.mjs} +0 -0
  161. /package/{stream-chat-angular.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,21 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ export const createMessagePreview = (user, text, attachments = [], mentionedUsers = [], parentId = undefined, quotedMessageId = undefined, customData) => {
3
+ const clientSideId = `${user.id}-${uuidv4()}`;
4
+ return {
5
+ __html: text,
6
+ created_at: new Date(),
7
+ html: text,
8
+ id: clientSideId,
9
+ reactions: [],
10
+ status: 'sending',
11
+ text,
12
+ type: 'regular',
13
+ user,
14
+ attachments,
15
+ mentioned_users: mentionedUsers,
16
+ parent_id: parentId,
17
+ quoted_message_id: quotedMessageId,
18
+ ...customData,
19
+ };
20
+ };
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1wcmV2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtcHJldmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwQyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUdsQyxJQUFrQixFQUNsQixJQUFZLEVBQ1osY0FBK0IsRUFBRSxFQUNqQyxpQkFBb0MsRUFBRSxFQUN0QyxXQUErQixTQUFTLEVBQ3hDLGtCQUFzQyxTQUFTLEVBQy9DLFVBQWlELEVBQ2pELEVBQUU7SUFDRixNQUFNLFlBQVksR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUU5QyxPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsSUFBSSxFQUFFLElBQUk7UUFDVixFQUFFLEVBQUUsWUFBWTtRQUNoQixTQUFTLEVBQUUsRUFBRTtRQUNiLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLElBQUk7UUFDSixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUk7UUFDSixXQUFXO1FBQ1gsZUFBZSxFQUFFLGNBQWM7UUFDL0IsU0FBUyxFQUFFLFFBQVE7UUFDbkIsaUJBQWlCLEVBQUUsZUFBZTtRQUNsQyxHQUFHLFVBQVU7S0FDbUIsQ0FBQztBQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRhY2htZW50LCBNZXNzYWdlUmVzcG9uc2UsIFVzZXJSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWVzc2FnZVByZXZpZXcgPSA8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPihcbiAgdXNlcjogVXNlclJlc3BvbnNlLFxuICB0ZXh0OiBzdHJpbmcsXG4gIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50PFQ+W10gPSBbXSxcbiAgbWVudGlvbmVkVXNlcnM6IFVzZXJSZXNwb25zZTxUPltdID0gW10sXG4gIHBhcmVudElkOiB1bmRlZmluZWQgfCBzdHJpbmcgPSB1bmRlZmluZWQsXG4gIHF1b3RlZE1lc3NhZ2VJZDogdW5kZWZpbmVkIHwgc3RyaW5nID0gdW5kZWZpbmVkLFxuICBjdXN0b21EYXRhOiB1bmRlZmluZWQgfCBQYXJ0aWFsPFRbJ21lc3NhZ2VUeXBlJ10+XG4pID0+IHtcbiAgY29uc3QgY2xpZW50U2lkZUlkID0gYCR7dXNlci5pZH0tJHt1dWlkdjQoKX1gO1xuXG4gIHJldHVybiB7XG4gICAgX19odG1sOiB0ZXh0LFxuICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKCksXG4gICAgaHRtbDogdGV4dCxcbiAgICBpZDogY2xpZW50U2lkZUlkLFxuICAgIHJlYWN0aW9uczogW10sXG4gICAgc3RhdHVzOiAnc2VuZGluZycsXG4gICAgdGV4dCxcbiAgICB0eXBlOiAncmVndWxhcicsXG4gICAgdXNlcixcbiAgICBhdHRhY2htZW50cyxcbiAgICBtZW50aW9uZWRfdXNlcnM6IG1lbnRpb25lZFVzZXJzLFxuICAgIHBhcmVudF9pZDogcGFyZW50SWQsXG4gICAgcXVvdGVkX21lc3NhZ2VfaWQ6IHF1b3RlZE1lc3NhZ2VJZCxcbiAgICAuLi5jdXN0b21EYXRhLFxuICB9IGFzIHVua25vd24gYXMgTWVzc2FnZVJlc3BvbnNlPFQ+O1xufTtcbiJdfQ==
@@ -0,0 +1,252 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
+ import { ChannelService } from '../channel.service';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../channel.service";
5
+ import * as i2 from "../message-reactions.service";
6
+ import * as i3 from "../custom-templates.service";
7
+ import * as i4 from "../theme.service";
8
+ import * as i5 from "@angular/common";
9
+ import * as i6 from "../avatar-placeholder/avatar-placeholder.component";
10
+ import * as i7 from "../loading-indicator/loading-indicator.component";
11
+ import * as i8 from "../modal/modal.component";
12
+ /**
13
+ * The `MessageReactions` component displays the reactions of a message, the current user can add and remove reactions. You can read more about [message reactions](https://getstream.io/chat/docs/javascript/send_reaction/?language=javascript) in the platform documentation.
14
+ */
15
+ export class MessageReactionsComponent {
16
+ constructor(cdRef, channelService, messageReactionsService, customTemplatesService, themeService) {
17
+ this.cdRef = cdRef;
18
+ this.channelService = channelService;
19
+ this.messageReactionsService = messageReactionsService;
20
+ this.customTemplatesService = customTemplatesService;
21
+ this.themeService = themeService;
22
+ /**
23
+ * The number of reactions grouped by [reaction types](https://github.com/GetStream/stream-chat-angular/tree/master/projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.ts)
24
+ */
25
+ this.messageReactionCounts = {};
26
+ /**
27
+ * Indicates if the selector should be opened or closed. Adding a UI element to open and close the selector is the parent's component responsibility.
28
+ */
29
+ this.isSelectorOpen = false;
30
+ /**
31
+ * List of reactions of a [message](../types/stream-message.mdx), used to display the users of a reaction type.
32
+ */
33
+ this.latestReactions = [];
34
+ /**
35
+ * List of the user's own reactions of a [message](../types/stream-message.mdx), used to display the users of a reaction type.
36
+ */
37
+ this.ownReactions = [];
38
+ /**
39
+ * Indicates if the selector should be opened or closed. Adding a UI element to open and close the selector is the parent's component responsibility.
40
+ */
41
+ this.isSelectorOpenChange = new EventEmitter();
42
+ this.isLoading = true;
43
+ this.reactions = [];
44
+ this.shouldHandleReactionClick = true;
45
+ this.existingReactions = [];
46
+ this.reactionsCount = 0;
47
+ this.reactionOptions = [];
48
+ this.subscriptions = [];
49
+ this.isViewInited = false;
50
+ this.isOpenChange = (isOpen) => {
51
+ this.selectedReactionType = isOpen ? this.selectedReactionType : undefined;
52
+ };
53
+ this.eventHandler = (event) => {
54
+ if (!this.selectorContainer?.nativeElement.contains(event.target)) {
55
+ this.isSelectorOpenChange.emit(false);
56
+ }
57
+ };
58
+ }
59
+ ngOnInit() {
60
+ this.subscriptions.push(this.messageReactionsService.reactions$.subscribe((reactions) => {
61
+ this.reactionOptions = Object.keys(reactions);
62
+ this.setExistingReactions();
63
+ if (this.isViewInited) {
64
+ this.cdRef.detectChanges();
65
+ }
66
+ }));
67
+ }
68
+ ngOnChanges(changes) {
69
+ if (changes.isSelectorOpen) {
70
+ this.isSelectorOpen
71
+ ? setTimeout(() => this.watchForOutsideClicks()) // setTimeout: wait for current click to bubble up, and only watch for clicks after that
72
+ : this.stopWatchForOutsideClicks();
73
+ }
74
+ if (changes.messageReactionCounts) {
75
+ this.setExistingReactions();
76
+ }
77
+ if (changes.messageReactionCounts && this.messageReactionCounts) {
78
+ const reactionsCount = Object.keys(this.messageReactionCounts).reduce((acc, key) => acc + (this.messageReactionCounts[key] || 0), 0);
79
+ this.shouldHandleReactionClick =
80
+ reactionsCount <= ChannelService.MAX_MESSAGE_REACTIONS_TO_FETCH ||
81
+ !!this.messageReactionsService.customReactionClickHandler;
82
+ }
83
+ }
84
+ ngAfterViewInit() {
85
+ this.isViewInited = true;
86
+ }
87
+ ngAfterViewChecked() {
88
+ if (this.tooltipText && !this.tooltipPositions) {
89
+ this.setTooltipPosition();
90
+ this.cdRef.detectChanges();
91
+ }
92
+ }
93
+ ngOnDestroy() {
94
+ this.subscriptions.forEach((s) => s.unsubscribe());
95
+ }
96
+ getLatestUserByReaction(reactionType) {
97
+ return this.latestReactions.find((r) => r.type === reactionType && r.user)
98
+ ?.user;
99
+ }
100
+ getEmojiByReaction(reactionType) {
101
+ return this.messageReactionsService.reactions[reactionType];
102
+ }
103
+ reactionSelected(reactionType) {
104
+ if (!this.shouldHandleReactionClick) {
105
+ return;
106
+ }
107
+ if (this.themeService.themeVersion === '1') {
108
+ return;
109
+ }
110
+ if (!this.messageId) {
111
+ return;
112
+ }
113
+ if (this.messageReactionsService.customReactionClickHandler) {
114
+ this.messageReactionsService.customReactionClickHandler({
115
+ messageId: this.messageId,
116
+ reactionType: reactionType,
117
+ });
118
+ }
119
+ else {
120
+ this.selectedReactionType = reactionType;
121
+ void this.fetchAllReactions();
122
+ }
123
+ }
124
+ getUsersByReaction(reactionType) {
125
+ return this.latestReactions
126
+ .filter((r) => r.type === reactionType)
127
+ .map((r) => r.user?.name || r.user?.id)
128
+ .filter((i) => !!i)
129
+ .join(', ');
130
+ }
131
+ getAllUsersByReaction(reactionType) {
132
+ if (!reactionType) {
133
+ return [];
134
+ }
135
+ const users = this.reactions
136
+ .filter((r) => r.type === reactionType)
137
+ .map((r) => r.user)
138
+ .filter((i) => !!i);
139
+ users.sort((u1, u2) => {
140
+ const name1 = u1.name?.toLowerCase();
141
+ const name2 = u2.name?.toLowerCase();
142
+ if (!name1) {
143
+ return 1;
144
+ }
145
+ if (!name2) {
146
+ return -1;
147
+ }
148
+ if (name1 === name2) {
149
+ return 0;
150
+ }
151
+ if (name1 < name2) {
152
+ return -1;
153
+ }
154
+ else {
155
+ return 1;
156
+ }
157
+ });
158
+ return users;
159
+ }
160
+ showTooltip(event, reactionType) {
161
+ this.currentTooltipTarget = event.target;
162
+ this.tooltipText = this.getUsersByReaction(reactionType);
163
+ }
164
+ hideTooltip() {
165
+ this.tooltipText = undefined;
166
+ this.currentTooltipTarget = undefined;
167
+ this.tooltipPositions = undefined;
168
+ }
169
+ trackByMessageReaction(index, item) {
170
+ return item;
171
+ }
172
+ trackByUserId(index, item) {
173
+ return item.id;
174
+ }
175
+ async react(type) {
176
+ this.ownReactions.find((r) => r.type === type)
177
+ ? await this.channelService.removeReaction(this.messageId, type)
178
+ : await this.channelService.addReaction(this.messageId, type);
179
+ this.isSelectorOpenChange.emit(false);
180
+ }
181
+ isOwnReaction(reactionType) {
182
+ return !!this.ownReactions.find((r) => r.type === reactionType);
183
+ }
184
+ watchForOutsideClicks() {
185
+ window.addEventListener('click', this.eventHandler);
186
+ }
187
+ stopWatchForOutsideClicks() {
188
+ window.removeEventListener('click', this.eventHandler);
189
+ }
190
+ setTooltipPosition() {
191
+ const tooltip = this.selectorTooltip?.nativeElement.getBoundingClientRect();
192
+ const target = this.currentTooltipTarget?.getBoundingClientRect();
193
+ const container = this.selectorContainer?.nativeElement.getBoundingClientRect();
194
+ if (!tooltip || !target || !container)
195
+ return;
196
+ const tooltipPosition = tooltip.width === container.width || tooltip.x < container.x
197
+ ? 0
198
+ : target.left + target.width / 2 - container.left - tooltip.width / 2;
199
+ const arrowPosition = target.x - tooltip.x + target.width / 2 - tooltipPosition;
200
+ this.tooltipPositions = {
201
+ tooltip: tooltipPosition,
202
+ arrow: arrowPosition,
203
+ };
204
+ }
205
+ async fetchAllReactions() {
206
+ if (!this.messageId) {
207
+ return;
208
+ }
209
+ this.isLoading = true;
210
+ try {
211
+ this.reactions = await this.channelService.getMessageReactions(this.messageId);
212
+ }
213
+ catch (error) {
214
+ this.selectedReactionType = undefined;
215
+ }
216
+ finally {
217
+ this.isLoading = false;
218
+ this.cdRef.detectChanges();
219
+ }
220
+ }
221
+ setExistingReactions() {
222
+ this.existingReactions = Object.keys(this.messageReactionCounts)
223
+ .filter((k) => this.reactionOptions.indexOf(k) !== -1)
224
+ .filter((k) => this.messageReactionCounts[k] > 0);
225
+ this.reactionsCount = this.existingReactions.reduce((total, reaction) => total + this.messageReactionCounts[reaction], 0);
226
+ }
227
+ }
228
+ MessageReactionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ChannelService }, { token: i2.MessageReactionsService }, { token: i3.CustomTemplatesService }, { token: i4.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
229
+ MessageReactionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MessageReactionsComponent, selector: "stream-message-reactions", inputs: { messageId: "messageId", messageReactionCounts: "messageReactionCounts", isSelectorOpen: "isSelectorOpen", latestReactions: "latestReactions", ownReactions: "ownReactions" }, outputs: { isSelectorOpenChange: "isSelectorOpenChange" }, viewQueries: [{ propertyName: "selectorContainer", first: true, predicate: ["selectorContainer"], descendants: true }, { propertyName: "selectorTooltip", first: true, predicate: ["selectorTooltip"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"existingReactions.length > 0\"\n data-testid=\"reaction-list\"\n class=\"str-chat__reaction-list str-chat__message-reactions-container\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n [class.str-chat__reaction-list-hidden]=\"isSelectorOpen\"\n>\n <ul class=\"str-chat__message-reactions\">\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reaction\"\n data-testclass=\"emoji\"\n [ngStyle]=\"{ cursor: shouldHandleReactionClick ? 'pointer' : 'default' }\"\n [class.str-chat__message-reaction-own]=\"isOwnReaction(reactionType)\"\n (click)=\"reactionSelected(reactionType)\"\n (keyup.enter)=\"reactionSelected(reactionType)\"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }}&nbsp;\n </span>\n <span\n data-testclass=\"reaction-list-reaction-count\"\n class=\"str-chat__message-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\n </li>\n <li>\n <span\n data-testid=\"reactions-count\"\n class=\"str-chat__reaction-list--counter\"\n >{{ reactionsCount }}</span\n >\n </li>\n </ul>\n</div>\n\n<div\n *ngIf=\"isSelectorOpen\"\n #selectorContainer\n data-testid=\"reaction-selector\"\n class=\"str-chat__reaction-selector str-chat__message-reaction-selector\"\n>\n <div\n *ngIf=\"tooltipText\"\n #selectorTooltip\n class=\"str-chat__reaction-selector-tooltip\"\n data-testid=\"tooltip\"\n [ngStyle]=\"{\n left: tooltipPositions?.tooltip + 'px',\n visibility: tooltipPositions ? 'visible' : 'hidden'\n }\"\n >\n <div\n class=\"arrow\"\n [ngStyle]=\"{ left: tooltipPositions?.arrow + 'px' }\"\n ></div>\n <span class=\"latest-user-username\">\n {{ tooltipText }}\n </span>\n </div>\n <ul\n class=\"str-chat__message-reactions-list str-chat__message-reactions-options\"\n >\n <li\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n class=\"\n str-chat__message-reactions-option\n str-chat__message-reactions-list-item\n str-chat__emoji\n \"\n data-testclass=\"emoji-option\"\n [class.str-chat__message-reactions-option-selected]=\"\n isOwnReaction(reactionType)\n \"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <div\n *ngIf=\"getLatestUserByReaction(reactionType) as user\"\n class=\"latest-user str-chat__message-reactions-last-user\"\n attr.data-testid=\"{{ reactionType }}-last-user\"\n (click)=\"hideTooltip()\"\n (keyup.enter)=\"hideTooltip()\"\n (mouseenter)=\"showTooltip($event, reactionType)\"\n (mouseleave)=\"hideTooltip()\"\n >\n <stream-avatar-placeholder\n location=\"reaction\"\n attr.data-testid=\"{{ reactionType }}-avatar\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name || user.id\"\n [size]=\"20\"\n ></stream-avatar-placeholder>\n </div>\n <span\n class=\"\n emoji\n str-chat__emoji-selector-emoji-angular\n str-chat__message-reaction-emoji\n \"\n >\n {{ getEmojiByReaction(reactionType) }}\n </span>\n <span\n *ngIf=\"\n messageReactionCounts[reactionType] &&\n messageReactionCounts[reactionType]! > 0\n \"\n class=\"str-chat__message-reactions-list-item__count\"\n attr.data-testid=\"{{ reactionType }}-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\n </li>\n </ul>\n</div>\n\n<ng-container *ngIf=\"selectedReactionType\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: {\n isOpen: !!selectedReactionType,\n messageId: messageId,\n reactionType: selectedReactionType,\n isOpenChangeHandler: isOpenChange,\n content: modalContent\n }\n \"\n ></ng-container>\n</ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-messageId=\"messageId\"\n let-reactionType=\"reactionType\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"str-chat__message-reactions-details-modal\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"str-chat__message-reactions-details\">\n <div class=\"str-chat__message-reactions-details-reaction-types\">\n <div\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reactions-details-reaction-type\"\n [ngStyle]=\"{\n cursor: shouldHandleReactionClick ? 'pointer' : 'default'\n }\"\n attr.data-testid=\"reaction-details-selector-{{ reactionType }}\"\n [class.str-chat__message-reactions-details-reaction-type--selected]=\"\n reactionType === selectedReactionType\n \"\n (click)=\"selectedReactionType = reactionType; allUsers.scrollTop = 0\"\n (keyup.enter)=\"\n selectedReactionType = reactionType; allUsers.scrollTop = 0\n \"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }}&nbsp;\n </span>\n <span class=\"str-chat__message-reaction-count\">\n {{ messageReactionCounts[reactionType] }}\n </span>\n </div>\n </div>\n <div\n class=\"\n emoji\n str-chat__message-reaction-emoji str-chat__message-reaction-emoji-big\n \"\n >\n {{ getEmojiByReaction(selectedReactionType!) }}\n </div>\n <div\n #allUsers\n data-testid=\"all-reacting-users\"\n class=\"str-chat__message-reactions-details-reacting-users\"\n >\n <stream-loading-indicator\n *ngIf=\"isLoading; else reactions\"\n ></stream-loading-indicator>\n <ng-template #reactions>\n <div\n *ngFor=\"\n let user of getAllUsersByReaction(selectedReactionType);\n trackBy: trackByUserId\n \"\n class=\"str-chat__message-reactions-details-reacting-user\"\n >\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n type=\"user\"\n location=\"reaction\"\n [size]=\"30\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name\"\n [user]=\"user\"\n ></stream-avatar-placeholder>\n <span\n data-testclass=\"reaction-user-username\"\n class=\"str-chat__user-item--name\"\n >{{ user.name }}</span\n >\n </div>\n </ng-template>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "component", type: i7.LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }, { kind: "component", type: i8.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsComponent, decorators: [{
231
+ type: Component,
232
+ args: [{ selector: 'stream-message-reactions', template: "<div\n *ngIf=\"existingReactions.length > 0\"\n data-testid=\"reaction-list\"\n class=\"str-chat__reaction-list str-chat__message-reactions-container\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n [class.str-chat__reaction-list-hidden]=\"isSelectorOpen\"\n>\n <ul class=\"str-chat__message-reactions\">\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reaction\"\n data-testclass=\"emoji\"\n [ngStyle]=\"{ cursor: shouldHandleReactionClick ? 'pointer' : 'default' }\"\n [class.str-chat__message-reaction-own]=\"isOwnReaction(reactionType)\"\n (click)=\"reactionSelected(reactionType)\"\n (keyup.enter)=\"reactionSelected(reactionType)\"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }}&nbsp;\n </span>\n <span\n data-testclass=\"reaction-list-reaction-count\"\n class=\"str-chat__message-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\n </li>\n <li>\n <span\n data-testid=\"reactions-count\"\n class=\"str-chat__reaction-list--counter\"\n >{{ reactionsCount }}</span\n >\n </li>\n </ul>\n</div>\n\n<div\n *ngIf=\"isSelectorOpen\"\n #selectorContainer\n data-testid=\"reaction-selector\"\n class=\"str-chat__reaction-selector str-chat__message-reaction-selector\"\n>\n <div\n *ngIf=\"tooltipText\"\n #selectorTooltip\n class=\"str-chat__reaction-selector-tooltip\"\n data-testid=\"tooltip\"\n [ngStyle]=\"{\n left: tooltipPositions?.tooltip + 'px',\n visibility: tooltipPositions ? 'visible' : 'hidden'\n }\"\n >\n <div\n class=\"arrow\"\n [ngStyle]=\"{ left: tooltipPositions?.arrow + 'px' }\"\n ></div>\n <span class=\"latest-user-username\">\n {{ tooltipText }}\n </span>\n </div>\n <ul\n class=\"str-chat__message-reactions-list str-chat__message-reactions-options\"\n >\n <li\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n class=\"\n str-chat__message-reactions-option\n str-chat__message-reactions-list-item\n str-chat__emoji\n \"\n data-testclass=\"emoji-option\"\n [class.str-chat__message-reactions-option-selected]=\"\n isOwnReaction(reactionType)\n \"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <div\n *ngIf=\"getLatestUserByReaction(reactionType) as user\"\n class=\"latest-user str-chat__message-reactions-last-user\"\n attr.data-testid=\"{{ reactionType }}-last-user\"\n (click)=\"hideTooltip()\"\n (keyup.enter)=\"hideTooltip()\"\n (mouseenter)=\"showTooltip($event, reactionType)\"\n (mouseleave)=\"hideTooltip()\"\n >\n <stream-avatar-placeholder\n location=\"reaction\"\n attr.data-testid=\"{{ reactionType }}-avatar\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name || user.id\"\n [size]=\"20\"\n ></stream-avatar-placeholder>\n </div>\n <span\n class=\"\n emoji\n str-chat__emoji-selector-emoji-angular\n str-chat__message-reaction-emoji\n \"\n >\n {{ getEmojiByReaction(reactionType) }}\n </span>\n <span\n *ngIf=\"\n messageReactionCounts[reactionType] &&\n messageReactionCounts[reactionType]! > 0\n \"\n class=\"str-chat__message-reactions-list-item__count\"\n attr.data-testid=\"{{ reactionType }}-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\n </li>\n </ul>\n</div>\n\n<ng-container *ngIf=\"selectedReactionType\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: {\n isOpen: !!selectedReactionType,\n messageId: messageId,\n reactionType: selectedReactionType,\n isOpenChangeHandler: isOpenChange,\n content: modalContent\n }\n \"\n ></ng-container>\n</ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-messageId=\"messageId\"\n let-reactionType=\"reactionType\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"str-chat__message-reactions-details-modal\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"str-chat__message-reactions-details\">\n <div class=\"str-chat__message-reactions-details-reaction-types\">\n <div\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n class=\"str-chat__message-reactions-details-reaction-type\"\n [ngStyle]=\"{\n cursor: shouldHandleReactionClick ? 'pointer' : 'default'\n }\"\n attr.data-testid=\"reaction-details-selector-{{ reactionType }}\"\n [class.str-chat__message-reactions-details-reaction-type--selected]=\"\n reactionType === selectedReactionType\n \"\n (click)=\"selectedReactionType = reactionType; allUsers.scrollTop = 0\"\n (keyup.enter)=\"\n selectedReactionType = reactionType; allUsers.scrollTop = 0\n \"\n >\n <span class=\"emoji str-chat__message-reaction-emoji\">\n {{ getEmojiByReaction(reactionType) }}&nbsp;\n </span>\n <span class=\"str-chat__message-reaction-count\">\n {{ messageReactionCounts[reactionType] }}\n </span>\n </div>\n </div>\n <div\n class=\"\n emoji\n str-chat__message-reaction-emoji str-chat__message-reaction-emoji-big\n \"\n >\n {{ getEmojiByReaction(selectedReactionType!) }}\n </div>\n <div\n #allUsers\n data-testid=\"all-reacting-users\"\n class=\"str-chat__message-reactions-details-reacting-users\"\n >\n <stream-loading-indicator\n *ngIf=\"isLoading; else reactions\"\n ></stream-loading-indicator>\n <ng-template #reactions>\n <div\n *ngFor=\"\n let user of getAllUsersByReaction(selectedReactionType);\n trackBy: trackByUserId\n \"\n class=\"str-chat__message-reactions-details-reacting-user\"\n >\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n type=\"user\"\n location=\"reaction\"\n [size]=\"30\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name\"\n [user]=\"user\"\n ></stream-avatar-placeholder>\n <span\n data-testclass=\"reaction-user-username\"\n class=\"str-chat__user-item--name\"\n >{{ user.name }}</span\n >\n </div>\n </ng-template>\n </div>\n </div>\n</ng-template>\n" }]
233
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.ChannelService }, { type: i2.MessageReactionsService }, { type: i3.CustomTemplatesService }, { type: i4.ThemeService }]; }, propDecorators: { messageId: [{
234
+ type: Input
235
+ }], messageReactionCounts: [{
236
+ type: Input
237
+ }], isSelectorOpen: [{
238
+ type: Input
239
+ }], latestReactions: [{
240
+ type: Input
241
+ }], ownReactions: [{
242
+ type: Input
243
+ }], isSelectorOpenChange: [{
244
+ type: Output
245
+ }], selectorContainer: [{
246
+ type: ViewChild,
247
+ args: ['selectorContainer']
248
+ }], selectorTooltip: [{
249
+ type: ViewChild,
250
+ args: ['selectorTooltip']
251
+ }] } });
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtcmVhY3Rpb25zL21lc3NhZ2UtcmVhY3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLXJlYWN0aW9ucy9tZXNzYWdlLXJlYWN0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUFPcEQ7O0dBRUc7QUFLSCxNQUFNLE9BQU8seUJBQXlCO0lBK0NwQyxZQUNVLEtBQXdCLEVBQ3hCLGNBQThCLEVBQzlCLHVCQUFnRCxFQUNqRCxzQkFBOEMsRUFDN0MsWUFBMEI7UUFKMUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDakQsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM3QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQTdDcEM7O1dBRUc7UUFDTSwwQkFBcUIsR0FDNUIsRUFBRSxDQUFDO1FBQ0w7O1dBRUc7UUFDTSxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUN6Qzs7V0FFRztRQUNNLG9CQUFlLEdBQWtELEVBQUUsQ0FBQztRQUM3RTs7V0FFRztRQUNNLGlCQUFZLEdBQWtELEVBQUUsQ0FBQztRQUMxRTs7V0FFRztRQUNnQix5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FB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R0FBekIseUJBQXlCLHFpQkM5QnRDLGlrT0FxT0E7MkZEdk1hLHlCQUF5QjtrQkFKckMsU0FBUzsrQkFDRSwwQkFBMEI7Mk9BUzNCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSUcsZUFBZTtzQkFBdkIsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlhLG9CQUFvQjtzQkFBdEMsTUFBTTtnQkFHaUMsaUJBQWlCO3NCQUF4RCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFHUSxlQUFlO3NCQUFwRCxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlYWN0aW9uUmVzcG9uc2UsIFVzZXJSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYW5uZWxTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhbm5lbC5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VSZWFjdGlvblR5cGUsIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBNZXNzYWdlUmVhY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2UtcmVhY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZVJlYWN0aW9uc2AgY29tcG9uZW50IGRpc3BsYXlzIHRoZSByZWFjdGlvbnMgb2YgYSBtZXNzYWdlLCB0aGUgY3VycmVudCB1c2VyIGNhbiBhZGQgYW5kIHJlbW92ZSByZWFjdGlvbnMuIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IFttZXNzYWdlIHJlYWN0aW9uc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvc2VuZF9yZWFjdGlvbi8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgaW4gdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLXJlYWN0aW9ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLXJlYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VSZWFjdGlvbnNDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdGhlIHJlYWN0aW9ucyBiZWxvbmcgdG9cbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZWFjdGlvbnMgZ3JvdXBlZCBieSBbcmVhY3Rpb24gdHlwZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9HZXRTdHJlYW0vc3RyZWFtLWNoYXQtYW5ndWxhci90cmVlL21hc3Rlci9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS1yZWFjdGlvbnMvbWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50LnRzKVxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZVJlYWN0aW9uQ291bnRzOiB7IFtrZXkgaW4gTWVzc2FnZVJlYWN0aW9uVHlwZV0/OiBudW1iZXIgfSA9XG4gICAge307XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHNlbGVjdG9yIHNob3VsZCBiZSBvcGVuZWQgb3IgY2xvc2VkLiBBZGRpbmcgYSBVSSBlbGVtZW50IHRvIG9wZW4gYW5kIGNsb3NlIHRoZSBzZWxlY3RvciBpcyB0aGUgcGFyZW50J3MgY29tcG9uZW50IHJlc3BvbnNpYmlsaXR5LlxuICAgKi9cbiAgQElucHV0KCkgaXNTZWxlY3Rvck9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgcmVhY3Rpb25zIG9mIGEgW21lc3NhZ2VdKC4uL3R5cGVzL3N0cmVhbS1tZXNzYWdlLm1keCksIHVzZWQgdG8gZGlzcGxheSB0aGUgdXNlcnMgb2YgYSByZWFjdGlvbiB0eXBlLlxuICAgKi9cbiAgQElucHV0KCkgbGF0ZXN0UmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10gPSBbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgdGhlIHVzZXIncyBvd24gcmVhY3Rpb25zIG9mIGEgW21lc3NhZ2VdKC4uL3R5cGVzL3N0cmVhbS1tZXNzYWdlLm1keCksIHVzZWQgdG8gZGlzcGxheSB0aGUgdXNlcnMgb2YgYSByZWFjdGlvbiB0eXBlLlxuICAgKi9cbiAgQElucHV0KCkgb3duUmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10gPSBbXTtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIG9wZW5lZCBvciBjbG9zZWQuIEFkZGluZyBhIFVJIGVsZW1lbnQgdG8gb3BlbiBhbmQgY2xvc2UgdGhlIHNlbGVjdG9yIGlzIHRoZSBwYXJlbnQncyBjb21wb25lbnQgcmVzcG9uc2liaWxpdHkuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgaXNTZWxlY3Rvck9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIHRvb2x0aXBQb3NpdGlvbnM6IHsgYXJyb3c6IG51bWJlcjsgdG9vbHRpcDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gIHRvb2x0aXBUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdG9yQ29udGFpbmVyJykgcHJpdmF0ZSBzZWxlY3RvckNvbnRhaW5lcjpcbiAgICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICAgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdG9yVG9vbHRpcCcpIHByaXZhdGUgc2VsZWN0b3JUb29sdGlwOlxuICAgIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgY3VycmVudFRvb2x0aXBUYXJnZXQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBzZWxlY3RlZFJlYWN0aW9uVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpc0xvYWRpbmcgPSB0cnVlO1xuICByZWFjdGlvbnM6IFJlYWN0aW9uUmVzcG9uc2VbXSA9IFtdO1xuICBzaG91bGRIYW5kbGVSZWFjdGlvbkNsaWNrID0gdHJ1ZTtcbiAgZXhpc3RpbmdSZWFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHJlYWN0aW9uc0NvdW50OiBudW1iZXIgPSAwO1xuICByZWFjdGlvbk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlOiBNZXNzYWdlUmVhY3Rpb25zU2VydmljZSxcbiAgICBwdWJsaWMgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UucmVhY3Rpb25zJC5zdWJzY3JpYmUoKHJlYWN0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLnJlYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5rZXlzKHJlYWN0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0RXhpc3RpbmdSZWFjdGlvbnMoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5pc1NlbGVjdG9yT3Blbikge1xuICAgICAgdGhpcy5pc1NlbGVjdG9yT3BlblxuICAgICAgICA/IHNldFRpbWVvdXQoKCkgPT4gdGhpcy53YXRjaEZvck91dHNpZGVDbGlja3MoKSkgLy8gc2V0VGltZW91dDogd2FpdCBmb3IgY3VycmVudCBjbGljayB0byBidWJibGUgdXAsIGFuZCBvbmx5IHdhdGNoIGZvciBjbGlja3MgYWZ0ZXIgdGhhdFxuICAgICAgICA6IHRoaXMuc3RvcFdhdGNoRm9yT3V0c2lkZUNsaWNrcygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlUmVhY3Rpb25Db3VudHMpIHtcbiAgICAgIHRoaXMuc2V0RXhpc3RpbmdSZWFjdGlvbnMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZVJlYWN0aW9uQ291bnRzICYmIHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzKSB7XG4gICAgICBjb25zdCByZWFjdGlvbnNDb3VudCA9IE9iamVjdC5rZXlzKHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGtleSkgPT4gYWNjICsgKHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzW2tleV0gfHwgMCksXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICB0aGlzLnNob3VsZEhhbmRsZVJlYWN0aW9uQ2xpY2sgPVxuICAgICAgICByZWFjdGlvbnNDb3VudCA8PSBDaGFubmVsU2VydmljZS5NQVhfTUVTU0FHRV9SRUFDVElPTlNfVE9fRkVUQ0ggfHxcbiAgICAgICAgISF0aGlzLm1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlLmN1c3RvbVJlYWN0aW9uQ2xpY2tIYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlld0luaXRlZCA9IHRydWU7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRleHQgJiYgIXRoaXMudG9vbHRpcFBvc2l0aW9ucykge1xuICAgICAgdGhpcy5zZXRUb29sdGlwUG9zaXRpb24oKTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgZ2V0TGF0ZXN0VXNlckJ5UmVhY3Rpb24ocmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMubGF0ZXN0UmVhY3Rpb25zLmZpbmQoKHIpID0+IHIudHlwZSA9PT0gcmVhY3Rpb25UeXBlICYmIHIudXNlcilcbiAgICAgID8udXNlcjtcbiAgfVxuXG4gIGdldEVtb2ppQnlSZWFjdGlvbihyZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVhY3Rpb25zU2VydmljZS5yZWFjdGlvbnNbcmVhY3Rpb25UeXBlXTtcbiAgfVxuXG4gIHJlYWN0aW9uU2VsZWN0ZWQocmVhY3Rpb25UeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSGFuZGxlUmVhY3Rpb25DbGljaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50aGVtZVNlcnZpY2UudGhlbWVWZXJzaW9uID09PSAnMScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tZXNzYWdlUmVhY3Rpb25zU2VydmljZS5jdXN0b21SZWFjdGlvbkNsaWNrSGFuZGxlcikge1xuICAgICAgdGhpcy5tZXNzYWdlUmVhY3Rpb25zU2VydmljZS5jdXN0b21SZWFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlSWQsXG4gICAgICAgIHJlYWN0aW9uVHlwZTogcmVhY3Rpb25UeXBlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWFjdGlvblR5cGUgPSByZWFjdGlvblR5cGU7XG4gICAgICB2b2lkIHRoaXMuZmV0Y2hBbGxSZWFjdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRVc2Vyc0J5UmVhY3Rpb24ocmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMubGF0ZXN0UmVhY3Rpb25zXG4gICAgICAuZmlsdGVyKChyKSA9PiByLnR5cGUgPT09IHJlYWN0aW9uVHlwZSlcbiAgICAgIC5tYXAoKHIpID0+IHIudXNlcj8ubmFtZSB8fCByLnVzZXI/LmlkKVxuICAgICAgLmZpbHRlcigoaSkgPT4gISFpKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cblxuICBnZXRBbGxVc2Vyc0J5UmVhY3Rpb24oXG4gICAgcmVhY3Rpb25UeXBlPzogTWVzc2FnZVJlYWN0aW9uVHlwZVxuICApOiBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXSB7XG4gICAgaWYgKCFyZWFjdGlvblR5cGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VycyA9IHRoaXMucmVhY3Rpb25zXG4gICAgICAuZmlsdGVyKChyKSA9PiByLnR5cGUgPT09IHJlYWN0aW9uVHlwZSlcbiAgICAgIC5tYXAoKHIpID0+IHIudXNlcilcbiAgICAgIC5maWx0ZXIoKGkpID0+ICEhaSkgYXMgVXNlclJlc3BvbnNlW107XG5cbiAgICB1c2Vycy5zb3J0KCh1MSwgdTIpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUxID0gdTEubmFtZT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IG5hbWUyID0gdTIubmFtZT8udG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKCFuYW1lMSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFuYW1lMikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lMSA9PT0gbmFtZTIpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lMSA8IG5hbWUyKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgc2hvd1Rvb2x0aXAoZXZlbnQ6IEV2ZW50LCByZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICB0aGlzLmN1cnJlbnRUb29sdGlwVGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMudG9vbHRpcFRleHQgPSB0aGlzLmdldFVzZXJzQnlSZWFjdGlvbihyZWFjdGlvblR5cGUpO1xuICB9XG5cbiAgaGlkZVRvb2x0aXAoKSB7XG4gICAgdGhpcy50b29sdGlwVGV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRUb29sdGlwVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudG9vbHRpcFBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyYWNrQnlNZXNzYWdlUmVhY3Rpb24oaW5kZXg6IG51bWJlciwgaXRlbTogTWVzc2FnZVJlYWN0aW9uVHlwZSkge1xuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgdHJhY2tCeVVzZXJJZChpbmRleDogbnVtYmVyLCBpdGVtOiBVc2VyUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIGFzeW5jIHJlYWN0KHR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICB0aGlzLm93blJlYWN0aW9ucy5maW5kKChyKSA9PiByLnR5cGUgPT09IHR5cGUpXG4gICAgICA/IGF3YWl0IHRoaXMuY2hhbm5lbFNlcnZpY2UucmVtb3ZlUmVhY3Rpb24odGhpcy5tZXNzYWdlSWQhLCB0eXBlKVxuICAgICAgOiBhd2FpdCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFkZFJlYWN0aW9uKHRoaXMubWVzc2FnZUlkISwgdHlwZSk7XG4gICAgdGhpcy5pc1NlbGVjdG9yT3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIGlzT3duUmVhY3Rpb24ocmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vd25SZWFjdGlvbnMuZmluZCgocikgPT4gci50eXBlID09PSByZWFjdGlvblR5cGUpO1xuICB9XG5cbiAgaXNPcGVuQ2hhbmdlID0gKGlzT3BlbjogYm9vbGVhbikgPT4ge1xuICAgIHRoaXMuc2VsZWN0ZWRSZWFjdGlvblR5cGUgPSBpc09wZW4gPyB0aGlzLnNlbGVjdGVkUmVhY3Rpb25UeXBlIDogdW5kZWZpbmVkO1xuICB9O1xuXG4gIHByaXZhdGUgZXZlbnRIYW5kbGVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RvckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIHRoaXMuaXNTZWxlY3Rvck9wZW5DaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgd2F0Y2hGb3JPdXRzaWRlQ2xpY2tzKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFdhdGNoRm9yT3V0c2lkZUNsaWNrcygpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmV2ZW50SGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIHNldFRvb2x0aXBQb3NpdGlvbigpIHtcbiAgICBjb25zdCB0b29sdGlwID0gdGhpcy5zZWxlY3RvclRvb2x0aXA/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jdXJyZW50VG9vbHRpcFRhcmdldD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBjb250YWluZXIgPVxuICAgICAgdGhpcy5zZWxlY3RvckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmICghdG9vbHRpcCB8fCAhdGFyZ2V0IHx8ICFjb250YWluZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHRvb2x0aXBQb3NpdGlvbiA9XG4gICAgICB0b29sdGlwLndpZHRoID09PSBjb250YWluZXIud2lkdGggfHwgdG9vbHRpcC54IDwgY29udGFpbmVyLnhcbiAgICAgICAgPyAwXG4gICAgICAgIDogdGFyZ2V0LmxlZnQgKyB0YXJnZXQud2lkdGggLyAyIC0gY29udGFpbmVyLmxlZnQgLSB0b29sdGlwLndpZHRoIC8gMjtcblxuICAgIGNvbnN0IGFycm93UG9zaXRpb24gPVxuICAgICAgdGFyZ2V0LnggLSB0b29sdGlwLnggKyB0YXJnZXQud2lkdGggLyAyIC0gdG9vbHRpcFBvc2l0aW9uO1xuXG4gICAgdGhpcy50b29sdGlwUG9zaXRpb25zID0ge1xuICAgICAgdG9vbHRpcDogdG9vbHRpcFBvc2l0aW9uLFxuICAgICAgYXJyb3c6IGFycm93UG9zaXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hBbGxSZWFjdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVhY3Rpb25zID0gYXdhaXQgdGhpcy5jaGFubmVsU2VydmljZS5nZXRNZXNzYWdlUmVhY3Rpb25zKFxuICAgICAgICB0aGlzLm1lc3NhZ2VJZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlYWN0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RXhpc3RpbmdSZWFjdGlvbnMoKSB7XG4gICAgdGhpcy5leGlzdGluZ1JlYWN0aW9ucyA9IE9iamVjdC5rZXlzKHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzKVxuICAgICAgLmZpbHRlcigoaykgPT4gdGhpcy5yZWFjdGlvbk9wdGlvbnMuaW5kZXhPZihrKSAhPT0gLTEpXG4gICAgICAuZmlsdGVyKChrKSA9PiB0aGlzLm1lc3NhZ2VSZWFjdGlvbkNvdW50c1trXSEgPiAwKTtcbiAgICB0aGlzLnJlYWN0aW9uc0NvdW50ID0gdGhpcy5leGlzdGluZ1JlYWN0aW9ucy5yZWR1Y2UoXG4gICAgICAodG90YWwsIHJlYWN0aW9uKSA9PiB0b3RhbCArIHRoaXMubWVzc2FnZVJlYWN0aW9uQ291bnRzW3JlYWN0aW9uXSEsXG4gICAgICAwXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdlxuICAqbmdJZj1cImV4aXN0aW5nUmVhY3Rpb25zLmxlbmd0aCA+IDBcIlxuICBkYXRhLXRlc3RpZD1cInJlYWN0aW9uLWxpc3RcIlxuICBjbGFzcz1cInN0ci1jaGF0X19yZWFjdGlvbi1saXN0IHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1jb250YWluZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX3JlYWN0aW9uLWxpc3QtLXJldmVyc2VdPVwidHJ1ZVwiXG4gIFtjbGFzcy5zdHItY2hhdF9fcmVhY3Rpb24tbGlzdC1oaWRkZW5dPVwiaXNTZWxlY3Rvck9wZW5cIlxuPlxuICA8dWwgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnNcIj5cbiAgICA8bGlcbiAgICAgICpuZ0Zvcj1cIlxuICAgICAgICBsZXQgcmVhY3Rpb25UeXBlIG9mIGV4aXN0aW5nUmVhY3Rpb25zO1xuICAgICAgICB0cmFja0J5OiB0cmFja0J5TWVzc2FnZVJlYWN0aW9uXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvblwiXG4gICAgICBkYXRhLXRlc3RjbGFzcz1cImVtb2ppXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsgY3Vyc29yOiBzaG91bGRIYW5kbGVSZWFjdGlvbkNsaWNrID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnIH1cIlxuICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLW93bl09XCJpc093blJlYWN0aW9uKHJlYWN0aW9uVHlwZSlcIlxuICAgICAgKGNsaWNrKT1cInJlYWN0aW9uU2VsZWN0ZWQocmVhY3Rpb25UeXBlKVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwicmVhY3Rpb25TZWxlY3RlZChyZWFjdGlvblR5cGUpXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cImVtb2ppIHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWVtb2ppXCI+XG4gICAgICAgIHt7IGdldEVtb2ppQnlSZWFjdGlvbihyZWFjdGlvblR5cGUpIH19Jm5ic3A7XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInJlYWN0aW9uLWxpc3QtcmVhY3Rpb24tY291bnRcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWNvdW50XCJcbiAgICAgID5cbiAgICAgICAge3sgbWVzc2FnZVJlYWN0aW9uQ291bnRzW3JlYWN0aW9uVHlwZV0gfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxzcGFuXG4gICAgICAgIGRhdGEtdGVzdGlkPVwicmVhY3Rpb25zLWNvdW50XCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fcmVhY3Rpb24tbGlzdC0tY291bnRlclwiXG4gICAgICAgID57eyByZWFjdGlvbnNDb3VudCB9fTwvc3BhblxuICAgICAgPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cblxuPGRpdlxuICAqbmdJZj1cImlzU2VsZWN0b3JPcGVuXCJcbiAgI3NlbGVjdG9yQ29udGFpbmVyXG4gIGRhdGEtdGVzdGlkPVwicmVhY3Rpb24tc2VsZWN0b3JcIlxuICBjbGFzcz1cInN0ci1jaGF0X19yZWFjdGlvbi1zZWxlY3RvciBzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbi1zZWxlY3RvclwiXG4+XG4gIDxkaXZcbiAgICAqbmdJZj1cInRvb2x0aXBUZXh0XCJcbiAgICAjc2VsZWN0b3JUb29sdGlwXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fcmVhY3Rpb24tc2VsZWN0b3ItdG9vbHRpcFwiXG4gICAgZGF0YS10ZXN0aWQ9XCJ0b29sdGlwXCJcbiAgICBbbmdTdHlsZV09XCJ7XG4gICAgICBsZWZ0OiB0b29sdGlwUG9zaXRpb25zPy50b29sdGlwICsgJ3B4JyxcbiAgICAgIHZpc2liaWxpdHk6IHRvb2x0aXBQb3NpdGlvbnMgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1xuICAgIH1cIlxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJhcnJvd1wiXG4gICAgICBbbmdTdHlsZV09XCJ7IGxlZnQ6IHRvb2x0aXBQb3NpdGlvbnM/LmFycm93ICsgJ3B4JyB9XCJcbiAgICA+PC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJsYXRlc3QtdXNlci11c2VybmFtZVwiPlxuICAgICAge3sgdG9vbHRpcFRleHQgfX1cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuICA8dWxcbiAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1saXN0IHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1vcHRpb25zXCJcbiAgPlxuICAgIDxsaVxuICAgICAgKm5nRm9yPVwiXG4gICAgICAgIGxldCByZWFjdGlvblR5cGUgb2YgcmVhY3Rpb25PcHRpb25zO1xuICAgICAgICB0cmFja0J5OiB0cmFja0J5TWVzc2FnZVJlYWN0aW9uXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLW9wdGlvblxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtbGlzdC1pdGVtXG4gICAgICAgIHN0ci1jaGF0X19lbW9qaVxuICAgICAgXCJcbiAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZW1vamktb3B0aW9uXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtb3B0aW9uLXNlbGVjdGVkXT1cIlxuICAgICAgICBpc093blJlYWN0aW9uKHJlYWN0aW9uVHlwZSlcbiAgICAgIFwiXG4gICAgICAoY2xpY2spPVwicmVhY3QocmVhY3Rpb25UeXBlKVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwicmVhY3QocmVhY3Rpb25UeXBlKVwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImdldExhdGVzdFVzZXJCeVJlYWN0aW9uKHJlYWN0aW9uVHlwZSkgYXMgdXNlclwiXG4gICAgICAgIGNsYXNzPVwibGF0ZXN0LXVzZXIgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWxhc3QtdXNlclwiXG4gICAgICAgIGF0dHIuZGF0YS10ZXN0aWQ9XCJ7eyByZWFjdGlvblR5cGUgfX0tbGFzdC11c2VyXCJcbiAgICAgICAgKGNsaWNrKT1cImhpZGVUb29sdGlwKClcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiaGlkZVRvb2x0aXAoKVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInNob3dUb29sdGlwKCRldmVudCwgcmVhY3Rpb25UeXBlKVwiXG4gICAgICAgIChtb3VzZWxlYXZlKT1cImhpZGVUb29sdGlwKClcIlxuICAgICAgPlxuICAgICAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgICAgIGxvY2F0aW9uPVwicmVhY3Rpb25cIlxuICAgICAgICAgIGF0dHIuZGF0YS10ZXN0aWQ9XCJ7eyByZWFjdGlvblR5cGUgfX0tYXZhdGFyXCJcbiAgICAgICAgICBbaW1hZ2VVcmxdPVwidXNlci5pbWFnZVwiXG4gICAgICAgICAgW25hbWVdPVwidXNlci5uYW1lIHx8IHVzZXIuaWRcIlxuICAgICAgICAgIFtzaXplXT1cIjIwXCJcbiAgICAgICAgPjwvc3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBlbW9qaVxuICAgICAgICAgIHN0ci1jaGF0X19lbW9qaS1zZWxlY3Rvci1lbW9qaS1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb24tZW1vamlcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgZ2V0RW1vamlCeVJlYWN0aW9uKHJlYWN0aW9uVHlwZSkgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgbWVzc2FnZVJlYWN0aW9uQ291bnRzW3JlYWN0aW9uVHlwZV0gJiZcbiAgICAgICAgICBtZXNzYWdlUmVhY3Rpb25Db3VudHNbcmVhY3Rpb25UeXBlXSEgPiAwXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWxpc3QtaXRlbV9fY291bnRcIlxuICAgICAgICBhdHRyLmRhdGEtdGVzdGlkPVwie3sgcmVhY3Rpb25UeXBlIH19LXJlYWN0aW9uLWNvdW50XCJcbiAgICAgID5cbiAgICAgICAge3sgbWVzc2FnZVJlYWN0aW9uQ291bnRzW3JlYWN0aW9uVHlwZV0gfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2xpPlxuICA8L3VsPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFJlYWN0aW9uVHlwZVwiPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1vZGFsVGVtcGxhdGUkIHwgYXN5bmMpIHx8IGRlZmF1bHRNb2RhbDtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgaXNPcGVuOiAhIXNlbGVjdGVkUmVhY3Rpb25UeXBlLFxuICAgICAgICBtZXNzYWdlSWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgcmVhY3Rpb25UeXBlOiBzZWxlY3RlZFJlYWN0aW9uVHlwZSxcbiAgICAgICAgaXNPcGVuQ2hhbmdlSGFuZGxlcjogaXNPcGVuQ2hhbmdlLFxuICAgICAgICBjb250ZW50OiBtb2RhbENvbnRlbnRcbiAgICAgIH1cbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlXG4gICNkZWZhdWx0TW9kYWxcbiAgbGV0LWlzT3Blbj1cImlzT3BlblwiXG4gIGxldC1tZXNzYWdlSWQ9XCJtZXNzYWdlSWRcIlxuICBsZXQtcmVhY3Rpb25UeXBlPVwicmVhY3Rpb25UeXBlXCJcbiAgbGV0LWlzT3BlbkNoYW5nZUhhbmRsZXI9XCJpc09wZW5DaGFuZ2VIYW5kbGVyXCJcbiAgbGV0LWNvbnRlbnQ9XCJjb250ZW50XCJcbj5cbiAgPHN0cmVhbS1tb2RhbFxuICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWRldGFpbHMtbW9kYWxcIlxuICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAoaXNPcGVuQ2hhbmdlKT1cImlzT3BlbkNoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gID5cbiAgPC9zdHJlYW0tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsQ29udGVudD5cbiAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzXCI+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzLXJlYWN0aW9uLXR5cGVzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgIGxldCByZWFjdGlvblR5cGUgb2YgZXhpc3RpbmdSZWFjdGlvbnM7XG4gICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VSZWFjdGlvblxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzLXJlYWN0aW9uLXR5cGVcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgY3Vyc29yOiBzaG91bGRIYW5kbGVSZWFjdGlvbkNsaWNrID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnXG4gICAgICAgIH1cIlxuICAgICAgICBhdHRyLmRhdGEtdGVzdGlkPVwicmVhY3Rpb24tZGV0YWlscy1zZWxlY3Rvci17eyByZWFjdGlvblR5cGUgfX1cIlxuICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWRldGFpbHMtcmVhY3Rpb24tdHlwZS0tc2VsZWN0ZWRdPVwiXG4gICAgICAgICAgcmVhY3Rpb25UeXBlID09PSBzZWxlY3RlZFJlYWN0aW9uVHlwZVxuICAgICAgICBcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRSZWFjdGlvblR5cGUgPSByZWFjdGlvblR5cGU7IGFsbFVzZXJzLnNjcm9sbFRvcCA9IDBcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiXG4gICAgICAgICAgc2VsZWN0ZWRSZWFjdGlvblR5cGUgPSByZWFjdGlvblR5cGU7IGFsbFVzZXJzLnNjcm9sbFRvcCA9IDBcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJlbW9qaSBzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbi1lbW9qaVwiPlxuICAgICAgICAgIHt7IGdldEVtb2ppQnlSZWFjdGlvbihyZWFjdGlvblR5cGUpIH19Jm5ic3A7XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbi1jb3VudFwiPlxuICAgICAgICAgIHt7IG1lc3NhZ2VSZWFjdGlvbkNvdW50c1tyZWFjdGlvblR5cGVdIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIGVtb2ppXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWVtb2ppIHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9uLWVtb2ppLWJpZ1xuICAgICAgXCJcbiAgICA+XG4gICAgICB7eyBnZXRFbW9qaUJ5UmVhY3Rpb24oc2VsZWN0ZWRSZWFjdGlvblR5cGUhKSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgICNhbGxVc2Vyc1xuICAgICAgZGF0YS10ZXN0aWQ9XCJhbGwtcmVhY3RpbmctdXNlcnNcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtZGV0YWlscy1yZWFjdGluZy11c2Vyc1wiXG4gICAgPlxuICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvclxuICAgICAgICAqbmdJZj1cImlzTG9hZGluZzsgZWxzZSByZWFjdGlvbnNcIlxuICAgICAgPjwvc3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yPlxuICAgICAgPG5nLXRlbXBsYXRlICNyZWFjdGlvbnM+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCB1c2VyIG9mIGdldEFsbFVzZXJzQnlSZWFjdGlvbihzZWxlY3RlZFJlYWN0aW9uVHlwZSk7XG4gICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5VXNlcklkXG4gICAgICAgICAgXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1kZXRhaWxzLXJlYWN0aW5nLXVzZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiYXZhdGFyXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2F2YXRhciBzdHItY2hhdF9fYXZhdGFyLS1jaXJjbGVcIlxuICAgICAgICAgICAgdHlwZT1cInVzZXJcIlxuICAgICAgICAgICAgbG9jYXRpb249XCJyZWFjdGlvblwiXG4gICAgICAgICAgICBbc2l6ZV09XCIzMFwiXG4gICAgICAgICAgICBbaW1hZ2VVcmxdPVwidXNlci5pbWFnZVwiXG4gICAgICAgICAgICBbbmFtZV09XCJ1c2VyLm5hbWVcIlxuICAgICAgICAgICAgW3VzZXJdPVwidXNlclwiXG4gICAgICAgICAgPjwvc3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlcj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJyZWFjdGlvbi11c2VyLXVzZXJuYW1lXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3VzZXItaXRlbS0tbmFtZVwiXG4gICAgICAgICAgICA+e3sgdXNlci5uYW1lIH19PC9zcGFuXG4gICAgICAgICAgPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -34,9 +34,9 @@ export class MessageReactionsService {
34
34
  return this.reactions$.getValue();
35
35
  }
36
36
  }
37
- MessageReactionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageReactionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
38
- MessageReactionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageReactionsService, providedIn: 'root' });
39
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageReactionsService, decorators: [{
37
+ MessageReactionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
38
+ MessageReactionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsService, providedIn: 'root' });
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageReactionsService, decorators: [{
40
40
  type: Injectable,
41
41
  args: [{
42
42
  providedIn: 'root',
@@ -15,12 +15,12 @@ export class MessageService {
15
15
  this.displayAs = 'text';
16
16
  }
17
17
  }
18
- MessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
19
- MessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageService, providedIn: 'root' });
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageService, decorators: [{
18
+ MessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
19
+ MessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageService, providedIn: 'root' });
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageService, decorators: [{
21
21
  type: Injectable,
22
22
  args: [{
23
23
  providedIn: 'root',
24
24
  }]
25
25
  }], ctorParameters: function () { return []; } });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQzs7R0FFRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBa0J6QjtRQWpCQTs7Ozs7O1dBTUc7UUFDSCxjQUFTLEdBQW9CLE1BQU0sQ0FBQztJQVVyQixDQUFDOzsyR0FsQkwsY0FBYzsrR0FBZCxjQUFjLGNBRmIsTUFBTTsyRkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGUgbWVzc2FnZSBzZXJ2aWNlIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGRpc3BsYXlpbmcgdGhlIG1lc3NhZ2UgY29udGVudFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZVNlcnZpY2Uge1xuICAvKipcbiAgICogRGVjaWRlcyBpZiB0aGUgbWVzc2FnZSBjb250ZW50IHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgdGV4dCBvciBIVE1MXG4gICAqXG4gICAqIElmIHlvdSBkaXNwbGF5IG1lc3NhZ2VzIGFzIHRleHQgdGhlIGZvbGxvd2luZyBwYXJ0cyBhcmUgc3RpbGwgYmUgZGlzcGxheWVkIGFzIEhUTUw6XG4gICAqIC0gdXNlciBtZW50aW9ucyAtPiB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIHdpdGggeW91ciBvd24gdGVtcGxhdGUgdXNpbmcgdGhlIFtgY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZW50aW9uVGVtcGxhdGUkYF0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0N1c3RvbVRlbXBsYXRlc1NlcnZpY2UvI21lbnRpb250ZW1wbGF0ZSlcbiAgICogLSBsaW5rcyAtPiB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGJ5IHByb3ZpZGluZyB5b3Ugb3duIFtgY3VzdG9tTGlua1JlbmRlcmVyYF0oI2N1c3RvbWxpbmtyZW5kZXJlcikgbWV0aG9kXG4gICAqL1xuICBkaXNwbGF5QXM6ICd0ZXh0JyB8ICdodG1sJyA9ICd0ZXh0JztcblxuICAvKipcbiAgICogWW91IGNhbiBwcm92aWRlIGEgY3VzdG9tIG1ldGhvZCB0byBkaXNwbGF5IGxpbmtzXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgdGhlIHVybCB0aGUgbGluayBzaG91bGQgcmVmZXIgdG9cbiAgICogQHJldHVybnMgdGhlIEhUTUwgbWFya3VwIGFzIGEgc3RyaW5nIGZvciB0aGUgbGlua1xuICAgKi9cbiAgY3VzdG9tTGlua1JlbmRlcmVyPzogKHVybDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxufVxuIl19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQzs7R0FFRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBaUJ6QjtRQWhCQTs7Ozs7O1dBTUc7UUFDSCxjQUFTLEdBQW9CLE1BQU0sQ0FBQztJQVNyQixDQUFDOzsyR0FqQkwsY0FBYzsrR0FBZCxjQUFjLGNBRmIsTUFBTTsyRkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGUgbWVzc2FnZSBzZXJ2aWNlIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGRpc3BsYXlpbmcgdGhlIG1lc3NhZ2UgY29udGVudFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZVNlcnZpY2Uge1xuICAvKipcbiAgICogRGVjaWRlcyBpZiB0aGUgbWVzc2FnZSBjb250ZW50IHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgdGV4dCBvciBIVE1MXG4gICAqXG4gICAqIElmIHlvdSBkaXNwbGF5IG1lc3NhZ2VzIGFzIHRleHQgdGhlIGZvbGxvd2luZyBwYXJ0cyBhcmUgc3RpbGwgYmUgZGlzcGxheWVkIGFzIEhUTUw6XG4gICAqIC0gdXNlciBtZW50aW9ucyAtPiB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIHdpdGggeW91ciBvd24gdGVtcGxhdGUgdXNpbmcgdGhlIFtgY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZW50aW9uVGVtcGxhdGUkYF0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL0N1c3RvbVRlbXBsYXRlc1NlcnZpY2UvI21lbnRpb250ZW1wbGF0ZSlcbiAgICogLSBsaW5rcyAtPiB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGJ5IHByb3ZpZGluZyB5b3Ugb3duIFtgY3VzdG9tTGlua1JlbmRlcmVyYF0oI2N1c3RvbWxpbmtyZW5kZXJlcikgbWV0aG9kXG4gICAqL1xuICBkaXNwbGF5QXM6ICd0ZXh0JyB8ICdodG1sJyA9ICd0ZXh0JztcblxuICAvKipcbiAgICogWW91IGNhbiBwcm92aWRlIGEgY3VzdG9tIG1ldGhvZCB0byBkaXNwbGF5IGxpbmtzXG4gICAqIEBwYXJhbSB1cmwgdGhlIHVybCB0aGUgbGluayBzaG91bGQgcmVmZXIgdG9cbiAgICogQHJldHVybnMgdGhlIEhUTUwgbWFya3VwIGFzIGEgc3RyaW5nIGZvciB0aGUgbGlua1xuICAgKi9cbiAgY3VzdG9tTGlua1JlbmRlcmVyPzogKHVybDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxufVxuIl19
@@ -0,0 +1,69 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../icon-placeholder/icon-placeholder.component";
5
+ /**
6
+ * The `Modal` component displays its content in an overlay. The modal can be closed with a close button, if the user clicks outside of the modal content, or if the escape button is pressed. The modal can also be closed from outside.
7
+ */
8
+ export class ModalComponent {
9
+ constructor() {
10
+ /**
11
+ * If `true` the modal will be displayed, if `false` the modal will be hidden
12
+ */
13
+ this.isOpen = false;
14
+ /**
15
+ * Emits `true` if the modal becomes visible, and `false` if the modal is closed.
16
+ */
17
+ this.isOpenChange = new EventEmitter();
18
+ this.watchForEscPress = (event) => {
19
+ if (event.key === 'Escape') {
20
+ this.close();
21
+ }
22
+ };
23
+ this.stopWatchForEscPress = () => {
24
+ window.removeEventListener('keyup', this.watchForEscPress);
25
+ };
26
+ this.watchForOutsideClicks = (event) => {
27
+ if (!this.innerContainer?.nativeElement.contains(event.target)) {
28
+ this.close();
29
+ }
30
+ };
31
+ }
32
+ ngOnChanges(changes) {
33
+ if (changes.isOpen) {
34
+ if (this.isOpen) {
35
+ window.addEventListener('keyup', this.watchForEscPress);
36
+ setTimeout(() => window.addEventListener('click', this.watchForOutsideClicks), 0);
37
+ }
38
+ else {
39
+ this.stopWatchForOutsideClicks();
40
+ this.stopWatchForEscPress();
41
+ }
42
+ }
43
+ }
44
+ close() {
45
+ this.isOpen = false;
46
+ this.isOpenChange.emit(false);
47
+ this.stopWatchForOutsideClicks();
48
+ this.stopWatchForEscPress();
49
+ }
50
+ stopWatchForOutsideClicks() {
51
+ window.removeEventListener('click', this.watchForOutsideClicks);
52
+ }
53
+ }
54
+ ModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
+ ModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: ModalComponent, selector: "stream-modal", inputs: { isOpen: "isOpen", content: "content" }, outputs: { isOpenChange: "isOpenChange" }, viewQueries: [{ propertyName: "innerContainer", first: true, predicate: ["modalInner"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n data-testid=\"modal\"\n class=\"str-chat__modal str-chat__modal--{{ isOpen ? 'open' : 'close' }}\"\n>\n <div\n data-testid=\"close\"\n class=\"str-chat__modal__close-button\"\n (click)=\"close()\"\n (keyup.enter)=\"close()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n <div #modalInner class=\"str-chat__modal__inner\">\n <ng-container *ngIf=\"content; else elseContent\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <ng-template #elseContent>\n <ng-content></ng-content>\n </ng-template>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }] });
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ModalComponent, decorators: [{
57
+ type: Component,
58
+ args: [{ selector: 'stream-modal', template: "<div\n data-testid=\"modal\"\n class=\"str-chat__modal str-chat__modal--{{ isOpen ? 'open' : 'close' }}\"\n>\n <div\n data-testid=\"close\"\n class=\"str-chat__modal__close-button\"\n (click)=\"close()\"\n (keyup.enter)=\"close()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n <div #modalInner class=\"str-chat__modal__inner\">\n <ng-container *ngIf=\"content; else elseContent\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <ng-template #elseContent>\n <ng-content></ng-content>\n </ng-template>\n </div>\n</div>\n" }]
59
+ }], ctorParameters: function () { return []; }, propDecorators: { isOpen: [{
60
+ type: Input
61
+ }], content: [{
62
+ type: Input
63
+ }], isOpenChange: [{
64
+ type: Output
65
+ }], innerContainer: [{
66
+ type: ViewChild,
67
+ args: ['modalInner']
68
+ }] } });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21vZGFsL21vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tb2RhbC9tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUdOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQzs7OztBQUV2Qjs7R0FFRztBQU1ILE1BQU0sT0FBTyxjQUFjO0lBaUJ6QjtRQWhCQTs7V0FFRztRQUNNLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFLeEI7O1dBRUc7UUFDZ0IsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBNkJ0RCxxQkFBZ0IsR0FBRyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtZQUNsRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO2dCQUMxQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDZDtRQUNILENBQUMsQ0FBQztRQUVNLHlCQUFvQixHQUFHLEdBQUcsRUFBRTtZQUNsQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQztRQUVNLDBCQUFxQixHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBYyxDQUFDLEVBQUU7Z0JBQ3RFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDO0lBdENhLENBQUM7SUFFaEIsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDeEQsVUFBVSxDQUNSLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQ2xFLENBQUMsQ0FDRixDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQzdCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFrQk8seUJBQXlCO1FBQy9CLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDbEUsQ0FBQzs7MkdBM0RVLGNBQWM7K0ZBQWQsY0FBYyxvUkNwQjNCLDhuQkFxQkE7MkZERGEsY0FBYztrQkFMMUIsU0FBUzsrQkFDRSxjQUFjOzBFQVFmLE1BQU07c0JBQWQsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSWEsWUFBWTtzQkFBOUIsTUFBTTtnQkFDMEIsY0FBYztzQkFBOUMsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogVGhlIGBNb2RhbGAgY29tcG9uZW50IGRpc3BsYXlzIGl0cyBjb250ZW50IGluIGFuIG92ZXJsYXkuIFRoZSBtb2RhbCBjYW4gYmUgY2xvc2VkIHdpdGggYSBjbG9zZSBidXR0b24sIGlmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBtb2RhbCBjb250ZW50LCBvciBpZiB0aGUgZXNjYXBlIGJ1dHRvbiBpcyBwcmVzc2VkLiBUaGUgbW9kYWwgY2FuIGFsc28gYmUgY2xvc2VkIGZyb20gb3V0c2lkZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogSWYgYHRydWVgIHRoZSBtb2RhbCB3aWxsIGJlIGRpc3BsYXllZCwgaWYgYGZhbHNlYCB0aGUgbW9kYWwgd2lsbCBiZSBoaWRkZW5cbiAgICovXG4gIEBJbnB1dCgpIGlzT3BlbiA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1vZGFsICAoY2FuIGFsc28gYmUgcHJvdmlkZWQgdXNpbmcgYG5nLWNvbnRlbnRgKVxuICAgKi9cbiAgQElucHV0KCkgY29udGVudDogVGVtcGxhdGVSZWY8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBFbWl0cyBgdHJ1ZWAgaWYgdGhlIG1vZGFsIGJlY29tZXMgdmlzaWJsZSwgYW5kIGBmYWxzZWAgaWYgdGhlIG1vZGFsIGlzIGNsb3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBpc09wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBWaWV3Q2hpbGQoJ21vZGFsSW5uZXInKSBwcml2YXRlIGlubmVyQ29udGFpbmVyOlxuICAgIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmlzT3Blbikge1xuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMud2F0Y2hGb3JFc2NQcmVzcyk7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgKCkgPT4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy53YXRjaEZvck91dHNpZGVDbGlja3MpLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RvcFdhdGNoRm9yT3V0c2lkZUNsaWNrcygpO1xuICAgICAgICB0aGlzLnN0b3BXYXRjaEZvckVzY1ByZXNzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLnN0b3BXYXRjaEZvck91dHNpZGVDbGlja3MoKTtcbiAgICB0aGlzLnN0b3BXYXRjaEZvckVzY1ByZXNzKCk7XG4gIH1cblxuICBwcml2YXRlIHdhdGNoRm9yRXNjUHJlc3MgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0b3BXYXRjaEZvckVzY1ByZXNzID0gKCkgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMud2F0Y2hGb3JFc2NQcmVzcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSB3YXRjaEZvck91dHNpZGVDbGlja3MgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLmlubmVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0b3BXYXRjaEZvck91dHNpZGVDbGlja3MoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy53YXRjaEZvck91dHNpZGVDbGlja3MpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGRhdGEtdGVzdGlkPVwibW9kYWxcIlxuICBjbGFzcz1cInN0ci1jaGF0X19tb2RhbCBzdHItY2hhdF9fbW9kYWwtLXt7IGlzT3BlbiA/ICdvcGVuJyA6ICdjbG9zZScgfX1cIlxuPlxuICA8ZGl2XG4gICAgZGF0YS10ZXN0aWQ9XCJjbG9zZVwiXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fbW9kYWxfX2Nsb3NlLWJ1dHRvblwiXG4gICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgIChrZXl1cC5lbnRlcik9XCJjbG9zZSgpXCJcbiAgPlxuICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwiY2xvc2VcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICA8L2Rpdj5cbiAgPGRpdiAjbW9kYWxJbm5lciBjbGFzcz1cInN0ci1jaGF0X19tb2RhbF9faW5uZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudDsgZWxzZSBlbHNlQ29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2Vsc2VDb250ZW50PlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,20 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ /**
5
+ * The `Notification` component displays a notification within the [`NotificationList`](./NotificationListComponent.mdx)
6
+ */
7
+ export class NotificationComponent {
8
+ constructor() { }
9
+ }
10
+ NotificationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: NotificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11
+ NotificationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: NotificationComponent, selector: "stream-notification", inputs: { type: "type", content: "content" }, ngImport: i0, template: "<div\n data-testid=\"custom-notification\"\n class=\"str-chat__custom-notification notification-{{\n type\n }} str-chat__notification\"\n>\n <ng-container *ngIf=\"content; else elseContent\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <ng-template #elseContent>\n <ng-content></ng-content>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: NotificationComponent, decorators: [{
13
+ type: Component,
14
+ args: [{ selector: 'stream-notification', template: "<div\n data-testid=\"custom-notification\"\n class=\"str-chat__custom-notification notification-{{\n type\n }} str-chat__notification\"\n>\n <ng-container *ngIf=\"content; else elseContent\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <ng-template #elseContent>\n <ng-content></ng-content>\n </ng-template>\n</div>\n" }]
15
+ }], ctorParameters: function () { return []; }, propDecorators: { type: [{
16
+ type: Input
17
+ }], content: [{
18
+ type: Input
19
+ }] } });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFlLE1BQU0sZUFBZSxDQUFDOzs7QUFHOUQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8scUJBQXFCO0lBVWhDLGdCQUFlLENBQUM7O2tIQVZMLHFCQUFxQjtzR0FBckIscUJBQXFCLHlHQ1hsQyxxWEFhQTsyRkRGYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UscUJBQXFCOzBFQVF0QixJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBOb3RpZmljYXRpb25gIGNvbXBvbmVudCBkaXNwbGF5cyBhIG5vdGlmaWNhdGlvbiB3aXRoaW4gdGhlIFtgTm90aWZpY2F0aW9uTGlzdGBdKC4vTm90aWZpY2F0aW9uTGlzdENvbXBvbmVudC5tZHgpXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1ub3RpZmljYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIEBJbnB1dCgpIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgbm90aWZpY2F0aW9uIChjYW4gYWxzbyBiZSBwcm92aWRlZCB1c2luZyBgbmctY29udGVudGApXG4gICAqL1xuICBASW5wdXQoKSBjb250ZW50OiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCI8ZGl2XG4gIGRhdGEtdGVzdGlkPVwiY3VzdG9tLW5vdGlmaWNhdGlvblwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX2N1c3RvbS1ub3RpZmljYXRpb24gbm90aWZpY2F0aW9uLXt7XG4gICAgdHlwZVxuICB9fSBzdHItY2hhdF9fbm90aWZpY2F0aW9uXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ7IGVsc2UgZWxzZUNvbnRlbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNlbHNlQ29udGVudD5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,37 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../custom-templates.service";
4
+ import * as i2 from "../notification.service";
5
+ import * as i3 from "../theme.service";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "../notification/notification.component";
8
+ import * as i6 from "@ngx-translate/core";
9
+ /**
10
+ * The `NotificationList` component displays the list of active notifications.
11
+ */
12
+ export class NotificationListComponent {
13
+ constructor(customTemplatesService, notificationService, themeService) {
14
+ this.customTemplatesService = customTemplatesService;
15
+ this.notificationService = notificationService;
16
+ this.themeService = themeService;
17
+ this.notifications$ = this.notificationService.notifications$;
18
+ this.theme$ = this.themeService.theme$;
19
+ this.themeVersion = this.themeService.themeVersion;
20
+ }
21
+ trackById(_, item) {
22
+ return item.id;
23
+ }
24
+ getNotificationContentContext(notification) {
25
+ return {
26
+ ...notification.templateContext,
27
+ dismissFn: notification.dismissFn,
28
+ };
29
+ }
30
+ }
31
+ NotificationListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: NotificationListComponent, deps: [{ token: i1.CustomTemplatesService }, { token: i2.NotificationService }, { token: i3.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
32
+ NotificationListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: NotificationListComponent, selector: "stream-notification-list", ngImport: i0, template: "<div\n data-testid=\"notification-list\"\n class=\"str-chat__theme-{{ theme$ | async }} str-chat__list-notifications\"\n [class.str-chat]=\"themeVersion === '2'\"\n>\n <ng-container\n *ngFor=\"let notification of notifications$ | async; trackBy: trackById\"\n >\n <ng-template #notificationContent>\n <div\n *ngIf=\"notification.text !== undefined\"\n data-testclass=\"notification-content\"\n >\n {{ notification.text | translate: notification.translateParams }}\n </div>\n <ng-container *ngIf=\"notification.template !== undefined\">\n <ng-container\n *ngTemplateOutlet=\"\n notification.template;\n context: getNotificationContentContext(notification)\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.notificationTemplate$ | async) ||\n defaultNotification;\n context: { type: notification.type, content: notificationContent }\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template #defaultNotification let-type=\"type\" let-content=\"content\">\n <stream-notification [type]=\"type\" [content]=\"content\"></stream-notification>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.NotificationComponent, selector: "stream-notification", inputs: ["type", "content"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: NotificationListComponent, decorators: [{
34
+ type: Component,
35
+ args: [{ selector: 'stream-notification-list', template: "<div\n data-testid=\"notification-list\"\n class=\"str-chat__theme-{{ theme$ | async }} str-chat__list-notifications\"\n [class.str-chat]=\"themeVersion === '2'\"\n>\n <ng-container\n *ngFor=\"let notification of notifications$ | async; trackBy: trackById\"\n >\n <ng-template #notificationContent>\n <div\n *ngIf=\"notification.text !== undefined\"\n data-testclass=\"notification-content\"\n >\n {{ notification.text | translate: notification.translateParams }}\n </div>\n <ng-container *ngIf=\"notification.template !== undefined\">\n <ng-container\n *ngTemplateOutlet=\"\n notification.template;\n context: getNotificationContentContext(notification)\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.notificationTemplate$ | async) ||\n defaultNotification;\n context: { type: notification.type, content: notificationContent }\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template #defaultNotification let-type=\"type\" let-content=\"content\">\n <stream-notification [type]=\"type\" [content]=\"content\"></stream-notification>\n</ng-template>\n" }]
36
+ }], ctorParameters: function () { return [{ type: i1.CustomTemplatesService }, { type: i2.NotificationService }, { type: i3.ThemeService }]; } });
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL25vdGlmaWNhdGlvbi1saXN0L25vdGlmaWNhdGlvbi1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9ub3RpZmljYXRpb24tbGlzdC9ub3RpZmljYXRpb24tbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQU8xQzs7R0FFRztBQU1ILE1BQU0sT0FBTyx5QkFBeUI7SUFLcEMsWUFDa0Isc0JBQThDLEVBQ3RELG1CQUF3QyxFQUN4QyxZQUEwQjtRQUZsQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ3RELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFFbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDO1FBQzlELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztJQUNyRCxDQUFDO0lBRUQsU0FBUyxDQUFDLENBQVMsRUFBRSxJQUF5QjtRQUM1QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELDZCQUE2QixDQUFDLFlBQWlDO1FBQzdELE9BQU87WUFDTCxHQUFHLFlBQVksQ0FBQyxlQUFlO1lBQy9CLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUztTQUNsQyxDQUFDO0lBQ0osQ0FBQzs7c0hBeEJVLHlCQUF5QjswR0FBekIseUJBQXlCLGdFQ2Z0Qyw2d0NBcUNBOzJGRHRCYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ub3RpZmljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblBheWxvYWQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBOb3RpZmljYXRpb25MaXN0YCBjb21wb25lbnQgZGlzcGxheXMgdGhlIGxpc3Qgb2YgYWN0aXZlIG5vdGlmaWNhdGlvbnMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1ub3RpZmljYXRpb24tbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3RpZmljYXRpb24tbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbkxpc3RDb21wb25lbnQge1xuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25QYXlsb2FkW10+O1xuICB0aGVtZVZlcnNpb246ICcxJyB8ICcyJztcbiAgdGhlbWUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zJCA9IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5ub3RpZmljYXRpb25zJDtcbiAgICB0aGlzLnRoZW1lJCA9IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lJDtcbiAgICB0aGlzLnRoZW1lVmVyc2lvbiA9IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lVmVyc2lvbjtcbiAgfVxuXG4gIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IE5vdGlmaWNhdGlvblBheWxvYWQpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIGdldE5vdGlmaWNhdGlvbkNvbnRlbnRDb250ZXh0KG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uUGF5bG9hZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5ub3RpZmljYXRpb24udGVtcGxhdGVDb250ZXh0LFxuICAgICAgZGlzbWlzc0ZuOiBub3RpZmljYXRpb24uZGlzbWlzc0ZuLFxuICAgIH07XG4gIH1cbn1cbiIsIjxkaXZcbiAgZGF0YS10ZXN0aWQ9XCJub3RpZmljYXRpb24tbGlzdFwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX3RoZW1lLXt7IHRoZW1lJCB8IGFzeW5jIH19IHN0ci1jaGF0X19saXN0LW5vdGlmaWNhdGlvbnNcIlxuICBbY2xhc3Muc3RyLWNoYXRdPVwidGhlbWVWZXJzaW9uID09PSAnMidcIlxuPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nRm9yPVwibGV0IG5vdGlmaWNhdGlvbiBvZiBub3RpZmljYXRpb25zJCB8IGFzeW5jOyB0cmFja0J5OiB0cmFja0J5SWRcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlICNub3RpZmljYXRpb25Db250ZW50PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIm5vdGlmaWNhdGlvbi50ZXh0ICE9PSB1bmRlZmluZWRcIlxuICAgICAgICBkYXRhLXRlc3RjbGFzcz1cIm5vdGlmaWNhdGlvbi1jb250ZW50XCJcbiAgICAgID5cbiAgICAgICAge3sgbm90aWZpY2F0aW9uLnRleHQgfCB0cmFuc2xhdGU6IG5vdGlmaWNhdGlvbi50cmFuc2xhdGVQYXJhbXMgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdGlmaWNhdGlvbi50ZW1wbGF0ZSAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgbm90aWZpY2F0aW9uLnRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDogZ2V0Tm90aWZpY2F0aW9uQ29udGVudENvbnRleHQobm90aWZpY2F0aW9uKVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2Uubm90aWZpY2F0aW9uVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgZGVmYXVsdE5vdGlmaWNhdGlvbjtcbiAgICAgICAgY29udGV4dDogeyB0eXBlOiBub3RpZmljYXRpb24udHlwZSwgY29udGVudDogbm90aWZpY2F0aW9uQ29udGVudCB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Tm90aWZpY2F0aW9uIGxldC10eXBlPVwidHlwZVwiIGxldC1jb250ZW50PVwiY29udGVudFwiPlxuICA8c3RyZWFtLW5vdGlmaWNhdGlvbiBbdHlwZV09XCJ0eXBlXCIgW2NvbnRlbnRdPVwiY29udGVudFwiPjwvc3RyZWFtLW5vdGlmaWNhdGlvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=