stream-chat-angular 6.0.0-beta.5 → 6.0.0-rc.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.
- package/README.md +2 -2
- package/assets/i18n/en.d.ts +0 -1
- package/assets/version.d.ts +1 -1
- package/{esm2022 → esm2020}/assets/i18n/en.mjs +1 -2
- package/{esm2022 → esm2020}/assets/version.mjs +2 -2
- package/esm2020/lib/attachment-configuration.service.mjs +182 -0
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +232 -0
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
- package/esm2020/lib/attachment.service.mjs +481 -0
- package/esm2020/lib/avatar/avatar.component.mjs +160 -0
- package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +66 -0
- package/esm2020/lib/channel/channel.component.mjs +45 -0
- package/esm2020/lib/channel-header/channel-header.component.mjs +72 -0
- package/esm2020/lib/channel-list/channel-list.component.mjs +47 -0
- package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
- package/esm2020/lib/channel-query.mjs +77 -0
- package/esm2020/lib/channel.service.mjs +1561 -0
- package/esm2020/lib/chat-client.service.mjs +233 -0
- package/esm2020/lib/custom-templates.service.mjs +244 -0
- package/{esm2022 → esm2020}/lib/date-parser.service.mjs +5 -5
- package/esm2020/lib/file-utils.mjs +35 -0
- package/{esm2022 → esm2020}/lib/get-channel-display-text.mjs +1 -1
- package/esm2020/lib/get-message-translation.mjs +12 -0
- package/esm2020/lib/icon/icon-placeholder/icon-placeholder.component.mjs +28 -0
- package/{esm2022 → esm2020}/lib/icon/icon.component.mjs +5 -5
- package/{esm2022 → esm2020}/lib/icon/icon.module.mjs +11 -11
- package/{esm2022 → esm2020}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
- package/esm2020/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +20 -0
- package/{esm2022 → esm2020}/lib/list-users.mjs +1 -1
- package/esm2020/lib/message/message.component.mjs +486 -0
- package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +123 -0
- package/esm2020/lib/message-actions.service.mjs +187 -0
- package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
- package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +333 -0
- package/{esm2022 → esm2020}/lib/message-input/emoji-input.service.mjs +7 -7
- package/esm2020/lib/message-input/message-input-config.service.mjs +50 -0
- package/esm2020/lib/message-input/message-input.component.mjs +507 -0
- package/{esm2022 → esm2020}/lib/message-input/textarea/textarea.component.mjs +6 -6
- package/{esm2022 → esm2020}/lib/message-input/textarea.directive.mjs +5 -5
- package/{esm2022 → esm2020}/lib/message-input/voice-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/message-list/group-styles.mjs +1 -1
- package/esm2020/lib/message-list/message-list.component.mjs +717 -0
- package/esm2020/lib/message-preview.mjs +21 -0
- package/esm2020/lib/message-reactions/message-reactions.component.mjs +168 -0
- package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +61 -0
- package/{esm2022 → esm2020}/lib/message-reactions.service.mjs +6 -6
- package/esm2020/lib/message-text/message-text.component.mjs +143 -0
- package/esm2020/lib/message.service.mjs +43 -0
- package/{esm2022 → esm2020}/lib/modal/modal.component.mjs +6 -6
- package/esm2020/lib/notification/notification.component.mjs +20 -0
- package/esm2020/lib/notification-list/notification-list.component.mjs +36 -0
- package/{esm2022 → esm2020}/lib/notification.service.mjs +6 -6
- package/esm2020/lib/paginated-list/paginated-list.component.mjs +94 -0
- package/{esm2022 → esm2020}/lib/parse-date.mjs +1 -1
- package/esm2020/lib/read-by.mjs +12 -0
- package/esm2020/lib/stream-autocomplete-textarea.module.mjs +33 -0
- package/{esm2022 → esm2020}/lib/stream-avatar.module.mjs +5 -5
- package/{esm2022 → esm2020}/lib/stream-chat.module.mjs +59 -59
- package/{esm2022 → esm2020}/lib/stream-i18n.service.mjs +6 -6
- package/esm2020/lib/stream-textarea.module.mjs +31 -0
- package/{esm2022 → esm2020}/lib/theme.service.mjs +6 -6
- package/esm2020/lib/thread/thread.component.mjs +51 -0
- package/{esm2022 → esm2020}/lib/transliteration.service.mjs +5 -5
- package/esm2020/lib/types-custom.mjs +2 -0
- package/esm2020/lib/types.mjs +2 -0
- package/esm2020/lib/user-list/user-list.component.mjs +47 -0
- package/esm2020/lib/virtualized-list.service.mjs +271 -0
- package/{esm2022 → esm2020}/lib/virtualized-message-list.service.mjs +1 -1
- package/{esm2022 → esm2020}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/voice-recorder/media-recorder.mjs +1 -1
- package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +61 -0
- package/esm2020/lib/voice-recorder/transcoder.service.mjs +121 -0
- package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +35 -0
- package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +80 -0
- package/{esm2022 → esm2020}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
- package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +112 -0
- package/esm2020/lib/voice-recording/voice-recording.component.mjs +91 -0
- package/{esm2022 → esm2020}/lib/voice-recording/voice-recording.module.mjs +5 -5
- package/{esm2022 → esm2020}/lib/wave-form-sampler.mjs +1 -1
- package/esm2020/public-api.mjs +86 -0
- package/esm2020/stream-chat.mjs +2 -0
- package/fesm2015/stream-chat-angular.mjs +9171 -0
- package/fesm2015/stream-chat-angular.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/stream-chat-angular.mjs +1251 -961
- package/fesm2020/stream-chat-angular.mjs.map +1 -0
- package/lib/attachment-configuration.service.d.ts +12 -12
- package/lib/attachment-list/attachment-list.component.d.ts +15 -10
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
- package/lib/attachment.service.d.ts +12 -10
- package/lib/avatar/avatar.component.d.ts +7 -7
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +5 -5
- package/lib/channel/channel.component.d.ts +1 -1
- package/lib/channel-header/channel-header.component.d.ts +2 -2
- package/lib/channel-list/channel-list.component.d.ts +3 -4
- package/lib/channel-preview/channel-preview.component.d.ts +6 -6
- package/lib/channel-query.d.ts +26 -0
- package/lib/channel.service.d.ts +146 -154
- package/lib/chat-client.service.d.ts +17 -15
- package/lib/custom-templates.service.d.ts +50 -50
- package/lib/get-channel-display-text.d.ts +1 -2
- package/lib/get-message-translation.d.ts +3 -3
- package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +2 -2
- package/lib/icon/icon.component.d.ts +2 -2
- package/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
- package/lib/message/message.component.d.ts +6 -6
- package/lib/message-actions-box/message-actions-box.component.d.ts +5 -4
- package/lib/message-actions.service.d.ts +10 -10
- package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +5 -5
- package/lib/message-input/emoji-input.service.d.ts +2 -2
- package/lib/message-input/message-input-config.service.d.ts +3 -3
- package/lib/message-input/message-input.component.d.ts +10 -33
- package/lib/message-input/textarea/textarea.component.d.ts +3 -3
- package/lib/message-input/textarea.directive.d.ts +1 -1
- package/lib/message-list/group-styles.d.ts +1 -1
- package/lib/message-list/message-list.component.d.ts +3 -2
- package/lib/message-preview.d.ts +2 -3
- package/lib/message-reactions/message-reactions.component.d.ts +9 -8
- package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +6 -5
- package/lib/message-reactions.service.d.ts +4 -4
- package/lib/message-text/message-text.component.d.ts +5 -5
- package/lib/message.service.d.ts +6 -7
- package/lib/modal/modal.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +2 -2
- package/lib/notification-list/notification-list.component.d.ts +1 -0
- package/lib/notification.service.d.ts +1 -1
- package/lib/paginated-list/paginated-list.component.d.ts +2 -5
- package/lib/read-by.d.ts +1 -2
- package/lib/stream-i18n.service.d.ts +1 -1
- package/lib/theme.service.d.ts +1 -1
- package/lib/thread/thread.component.d.ts +3 -3
- package/lib/types-custom.d.ts +15 -0
- package/lib/types.d.ts +116 -155
- package/lib/user-list/user-list.component.d.ts +2 -3
- package/lib/virtualized-message-list.service.d.ts +1 -1
- package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
- package/lib/voice-recorder/media-recorder.d.ts +2 -2
- package/lib/voice-recorder/transcoder.service.d.ts +4 -4
- package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +1 -0
- package/lib/voice-recorder/voice-recorder.component.d.ts +2 -2
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +3 -3
- package/lib/voice-recording/voice-recording.component.d.ts +2 -3
- package/package.json +21 -15
- package/public-api.d.ts +3 -0
- package/src/assets/i18n/en.ts +0 -1
- package/src/assets/version.ts +1 -1
- package/esm2022/lib/attachment-configuration.service.mjs +0 -185
- package/esm2022/lib/attachment-list/attachment-list.component.mjs +0 -212
- package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
- package/esm2022/lib/attachment.service.mjs +0 -479
- package/esm2022/lib/avatar/avatar.component.mjs +0 -157
- package/esm2022/lib/avatar-placeholder/avatar-placeholder.component.mjs +0 -66
- package/esm2022/lib/channel/channel.component.mjs +0 -45
- package/esm2022/lib/channel-header/channel-header.component.mjs +0 -72
- package/esm2022/lib/channel-list/channel-list.component.mjs +0 -50
- package/esm2022/lib/channel-preview/channel-preview.component.mjs +0 -150
- package/esm2022/lib/channel.service.mjs +0 -1393
- package/esm2022/lib/chat-client.service.mjs +0 -227
- package/esm2022/lib/custom-templates.service.mjs +0 -244
- package/esm2022/lib/file-utils.mjs +0 -35
- package/esm2022/lib/get-message-translation.mjs +0 -12
- package/esm2022/lib/icon/icon-placeholder/icon-placeholder.component.mjs +0 -28
- package/esm2022/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +0 -20
- package/esm2022/lib/message/message.component.mjs +0 -486
- package/esm2022/lib/message-actions-box/message-actions-box.component.mjs +0 -120
- package/esm2022/lib/message-actions.service.mjs +0 -187
- package/esm2022/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +0 -71
- package/esm2022/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +0 -333
- package/esm2022/lib/message-input/message-input-config.service.mjs +0 -50
- package/esm2022/lib/message-input/message-input.component.mjs +0 -507
- package/esm2022/lib/message-list/message-list.component.mjs +0 -715
- package/esm2022/lib/message-preview.mjs +0 -21
- package/esm2022/lib/message-reactions/message-reactions.component.mjs +0 -165
- package/esm2022/lib/message-reactions-selector/message-reactions-selector.component.mjs +0 -57
- package/esm2022/lib/message-text/message-text.component.mjs +0 -143
- package/esm2022/lib/message.service.mjs +0 -43
- package/esm2022/lib/notification/notification.component.mjs +0 -20
- package/esm2022/lib/notification-list/notification-list.component.mjs +0 -33
- package/esm2022/lib/paginated-list/paginated-list.component.mjs +0 -94
- package/esm2022/lib/read-by.mjs +0 -12
- package/esm2022/lib/stream-autocomplete-textarea.module.mjs +0 -33
- package/esm2022/lib/stream-textarea.module.mjs +0 -31
- package/esm2022/lib/thread/thread.component.mjs +0 -51
- package/esm2022/lib/types.mjs +0 -2
- package/esm2022/lib/user-list/user-list.component.mjs +0 -47
- package/esm2022/lib/virtualized-list.service.mjs +0 -273
- package/esm2022/lib/voice-recorder/mp3-transcoder.mjs +0 -61
- package/esm2022/lib/voice-recorder/transcoder.service.mjs +0 -121
- package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +0 -32
- package/esm2022/lib/voice-recorder/voice-recorder.component.mjs +0 -80
- package/esm2022/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +0 -112
- package/esm2022/lib/voice-recording/voice-recording.component.mjs +0 -91
- package/esm2022/public-api.mjs +0 -82
- package/fesm2022/stream-chat-angular.mjs.map +0 -1
- /package/{esm2022 → esm2020}/lib/format-duration.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/injection-tokens.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-image-attachment.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-on-separate-date.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-safari.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/message-input/textarea.interface.mjs +0 -0
- /package/{esm2022 → esm2020}/stream-chat-angular.mjs +0 -0
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, HostBinding, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { debounceTime, filter } from 'rxjs/operators';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../../channel.service";
|
|
6
|
-
import * as i2 from "../../chat-client.service";
|
|
7
|
-
import * as i3 from "../../transliteration.service";
|
|
8
|
-
import * as i4 from "../emoji-input.service";
|
|
9
|
-
import * as i5 from "../../custom-templates.service";
|
|
10
|
-
import * as i6 from "../message-input-config.service";
|
|
11
|
-
import * as i7 from "@angular/common";
|
|
12
|
-
import * as i8 from "angular-mentions";
|
|
13
|
-
import * as i9 from "../../avatar-placeholder/avatar-placeholder.component";
|
|
14
|
-
import * as i10 from "@ngx-translate/core";
|
|
15
|
-
/**
|
|
16
|
-
* The `AutocompleteTextarea` component is used by the [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/) component to display the input HTML element where users can type their message.
|
|
17
|
-
*/
|
|
18
|
-
export class AutocompleteTextareaComponent {
|
|
19
|
-
constructor(channelService, chatClientService, transliterationService, emojiInputService, customTemplatesService, cdRef, messageInputConfigService) {
|
|
20
|
-
this.channelService = channelService;
|
|
21
|
-
this.chatClientService = chatClientService;
|
|
22
|
-
this.transliterationService = transliterationService;
|
|
23
|
-
this.emojiInputService = emojiInputService;
|
|
24
|
-
this.customTemplatesService = customTemplatesService;
|
|
25
|
-
this.cdRef = cdRef;
|
|
26
|
-
this.messageInputConfigService = messageInputConfigService;
|
|
27
|
-
this.class = 'str-chat__textarea str-chat__message-textarea-angular-host';
|
|
28
|
-
/**
|
|
29
|
-
* The value of the input HTML element.
|
|
30
|
-
*/
|
|
31
|
-
this.value = '';
|
|
32
|
-
/**
|
|
33
|
-
* Placeholder of the textarea
|
|
34
|
-
*/
|
|
35
|
-
this.placeholder = '';
|
|
36
|
-
/**
|
|
37
|
-
* If true, users can mention other users in messages. You can also set this input on the [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/#inputs-and-outputs/) component.
|
|
38
|
-
*/
|
|
39
|
-
this.areMentionsEnabled = true;
|
|
40
|
-
/**
|
|
41
|
-
* The scope for user mentions, either members of the current channel of members of the application. You can also set this input on the [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/#inputs-and-outputs) component.
|
|
42
|
-
*/
|
|
43
|
-
this.mentionScope = 'channel';
|
|
44
|
-
/**
|
|
45
|
-
* Enables or disables auto focus on the textarea element
|
|
46
|
-
*/
|
|
47
|
-
this.autoFocus = true;
|
|
48
|
-
/**
|
|
49
|
-
* Emits the current value of the input element when a user types.
|
|
50
|
-
*/
|
|
51
|
-
this.valueChange = new EventEmitter();
|
|
52
|
-
/**
|
|
53
|
-
* Emits when a user triggers a message send event (this happens when they hit the `Enter` key).
|
|
54
|
-
*/
|
|
55
|
-
this.send = new EventEmitter();
|
|
56
|
-
/**
|
|
57
|
-
* Emits the array of users that are mentioned in the message, it is updated when a user mentions a new user or deletes a mention.
|
|
58
|
-
*/
|
|
59
|
-
this.userMentions = new EventEmitter();
|
|
60
|
-
/**
|
|
61
|
-
* Emits any paste event that occured inside the textarea
|
|
62
|
-
*/
|
|
63
|
-
this.pasteFromClipboard = new EventEmitter();
|
|
64
|
-
this.autocompleteKey = 'autocompleteLabel';
|
|
65
|
-
this.mentionTriggerChar = '@';
|
|
66
|
-
this.commandTriggerChar = '/';
|
|
67
|
-
this.autocompleteConfig = {
|
|
68
|
-
mentions: [],
|
|
69
|
-
};
|
|
70
|
-
this.subscriptions = [];
|
|
71
|
-
this.mentionedUsers = [];
|
|
72
|
-
this.userMentionConfig = {
|
|
73
|
-
triggerChar: this.mentionTriggerChar,
|
|
74
|
-
dropUp: true,
|
|
75
|
-
allowSpace: true,
|
|
76
|
-
labelKey: this.autocompleteKey,
|
|
77
|
-
returnTrigger: true,
|
|
78
|
-
mentionFilter: (searchString, items) => this.filter(searchString, items),
|
|
79
|
-
mentionSelect: (item, triggerChar) => this.itemSelectedFromAutocompleteList(item, triggerChar),
|
|
80
|
-
};
|
|
81
|
-
this.slashCommandConfig = {
|
|
82
|
-
triggerChar: this.commandTriggerChar,
|
|
83
|
-
dropUp: true,
|
|
84
|
-
labelKey: 'name',
|
|
85
|
-
returnTrigger: true,
|
|
86
|
-
mentionFilter: (searchString, items) => this.filter(searchString, items),
|
|
87
|
-
mentionSelect: (item, triggerChar) => this.itemSelectedFromAutocompleteList(item, triggerChar),
|
|
88
|
-
};
|
|
89
|
-
this.searchTerm$ = new BehaviorSubject('');
|
|
90
|
-
this.isViewInited = false;
|
|
91
|
-
this.searchTerm$
|
|
92
|
-
.pipe(filter((searchTerm) => searchTerm.length !== 1), debounceTime(300))
|
|
93
|
-
.subscribe((searchTerm) => {
|
|
94
|
-
if (searchTerm.startsWith(this.mentionTriggerChar)) {
|
|
95
|
-
void this.updateMentionOptions(searchTerm);
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
void this.updateCustomAutocompleteOptions(searchTerm);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
this.subscriptions.push(this.channelService.activeChannel$.subscribe((channel) => {
|
|
102
|
-
const commands = channel?.getConfig()?.commands || [];
|
|
103
|
-
this.slashCommandConfig.items = commands.map((c) => ({
|
|
104
|
-
...c,
|
|
105
|
-
[this.autocompleteKey]: c.name,
|
|
106
|
-
type: 'command',
|
|
107
|
-
}));
|
|
108
|
-
this.mentionedUsers = [];
|
|
109
|
-
this.userMentions.next([...this.mentionedUsers]);
|
|
110
|
-
void this.updateMentionOptions(this.searchTerm$.getValue());
|
|
111
|
-
void this.updateCustomAutocompleteOptions(this.searchTerm$.getValue());
|
|
112
|
-
}));
|
|
113
|
-
this.subscriptions.push(this.emojiInputService.emojiInput$.subscribe((emoji) => {
|
|
114
|
-
this.messageInput.nativeElement.focus();
|
|
115
|
-
const { selectionStart } = this.messageInput.nativeElement;
|
|
116
|
-
this.messageInput.nativeElement.setRangeText(emoji);
|
|
117
|
-
this.messageInput.nativeElement.selectionStart =
|
|
118
|
-
selectionStart + emoji.length;
|
|
119
|
-
this.messageInput.nativeElement.selectionEnd =
|
|
120
|
-
selectionStart + emoji.length;
|
|
121
|
-
this.inputChanged();
|
|
122
|
-
}));
|
|
123
|
-
this.subscriptions.push(this.customTemplatesService.mentionAutocompleteItemTemplate$.subscribe((template) => (this.mentionAutocompleteItemTemplate = template)));
|
|
124
|
-
this.subscriptions.push(this.customTemplatesService.commandAutocompleteItemTemplate$.subscribe((template) => (this.commandAutocompleteItemTemplate = template)));
|
|
125
|
-
this.autocompleteConfig.mentions = [
|
|
126
|
-
this.userMentionConfig,
|
|
127
|
-
this.slashCommandConfig,
|
|
128
|
-
];
|
|
129
|
-
this.subscriptions.push(this.messageInputConfigService.customAutocompletes$.subscribe((customConfigs) => {
|
|
130
|
-
const builtInItems = this.autocompleteConfig.mentions?.filter((m) => m === this.userMentionConfig || m === this.slashCommandConfig) ?? [];
|
|
131
|
-
const transformedCustomConfigs = customConfigs.map((c) => {
|
|
132
|
-
const copy = {
|
|
133
|
-
items: c.options.map((o) => ({
|
|
134
|
-
...o,
|
|
135
|
-
templateRef: c.templateRef,
|
|
136
|
-
})),
|
|
137
|
-
triggerChar: c.triggerCharacter,
|
|
138
|
-
dropUp: true,
|
|
139
|
-
labelKey: this.autocompleteKey,
|
|
140
|
-
returnTrigger: true,
|
|
141
|
-
allowSpace: c.allowSpace,
|
|
142
|
-
mentionFilter: (searchString, items) => this.filter(searchString, items),
|
|
143
|
-
mentionSelect: (item, triggerChar) => this.itemSelectedFromAutocompleteList(item, triggerChar),
|
|
144
|
-
};
|
|
145
|
-
return copy;
|
|
146
|
-
});
|
|
147
|
-
this.autocompleteConfig.mentions = [
|
|
148
|
-
...builtInItems,
|
|
149
|
-
...transformedCustomConfigs,
|
|
150
|
-
];
|
|
151
|
-
this.autocompleteConfig = { ...this.autocompleteConfig };
|
|
152
|
-
}));
|
|
153
|
-
}
|
|
154
|
-
ngOnChanges(changes) {
|
|
155
|
-
if (changes.areMentionsEnabled) {
|
|
156
|
-
this.autocompleteConfig.mentions =
|
|
157
|
-
this.autocompleteConfig?.mentions?.filter((c) => {
|
|
158
|
-
if (c !== this.userMentionConfig) {
|
|
159
|
-
return true;
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
return this.areMentionsEnabled;
|
|
163
|
-
}
|
|
164
|
-
}) ?? [];
|
|
165
|
-
this.autocompleteConfig = { ...this.autocompleteConfig };
|
|
166
|
-
}
|
|
167
|
-
if (changes.mentionScope) {
|
|
168
|
-
void this.updateMentionOptions(this.searchTerm$.getValue());
|
|
169
|
-
}
|
|
170
|
-
if (changes.value && !this.value && this.messageInput) {
|
|
171
|
-
this.messageInput.nativeElement.style.height = 'auto';
|
|
172
|
-
this.chatClientService?.chatClient?.logger?.('info', '[Autocomplete textarea] Value reset, adjusting textarea height to auto');
|
|
173
|
-
this.updateMentionedUsersFromText();
|
|
174
|
-
}
|
|
175
|
-
else if (changes.value &&
|
|
176
|
-
this.value &&
|
|
177
|
-
this.messageInput &&
|
|
178
|
-
this.isViewInited) {
|
|
179
|
-
this.chatClientService?.chatClient?.logger?.('info', '[Autocomplete textarea] Value changed');
|
|
180
|
-
setTimeout(() => {
|
|
181
|
-
if (this.messageInput.nativeElement.scrollHeight > 0) {
|
|
182
|
-
this.adjustTextareaHeight();
|
|
183
|
-
}
|
|
184
|
-
}, 0);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
ngAfterViewInit() {
|
|
188
|
-
this.isViewInited = true;
|
|
189
|
-
this.chatClientService?.chatClient?.logger?.('info', '[Autocomplete textarea] View inited');
|
|
190
|
-
if (this.messageInput.nativeElement.scrollHeight > 0 && this.value) {
|
|
191
|
-
this.adjustTextareaHeight();
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
filter(searchString, items) {
|
|
195
|
-
return items.filter((item) => this.transliterate(item.autocompleteLabel.toLowerCase()).includes(this.transliterate(searchString.toLowerCase())));
|
|
196
|
-
}
|
|
197
|
-
itemSelectedFromAutocompleteList(item, triggerChar = '') {
|
|
198
|
-
if (triggerChar === this.mentionTriggerChar) {
|
|
199
|
-
this.mentionedUsers.push((item.user ? item.user : item));
|
|
200
|
-
this.userMentions.next([...this.mentionedUsers]);
|
|
201
|
-
}
|
|
202
|
-
this.searchTerm$.next('');
|
|
203
|
-
return triggerChar + item.autocompleteLabel + ' ';
|
|
204
|
-
}
|
|
205
|
-
autcompleteSearchTermChanged(searchTerm) {
|
|
206
|
-
if (searchTerm.length === 1) {
|
|
207
|
-
if (searchTerm === this.mentionTriggerChar) {
|
|
208
|
-
void this.updateMentionOptions();
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
void this.updateCustomAutocompleteOptions(searchTerm);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
this.searchTerm$.next(searchTerm);
|
|
215
|
-
}
|
|
216
|
-
inputChanged() {
|
|
217
|
-
this.chatClientService?.chatClient?.logger?.('info', '[Autocomplete textarea] Input changed');
|
|
218
|
-
this.valueChange.emit(this.messageInput.nativeElement.value);
|
|
219
|
-
this.adjustTextareaHeight();
|
|
220
|
-
}
|
|
221
|
-
inputLeft() {
|
|
222
|
-
this.updateMentionedUsersFromText();
|
|
223
|
-
}
|
|
224
|
-
enterHit(event) {
|
|
225
|
-
if (this.inputMode === 'desktop' && !event.isComposing) {
|
|
226
|
-
event.preventDefault();
|
|
227
|
-
this.updateMentionedUsersFromText();
|
|
228
|
-
this.send.next();
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
adjustTextareaHeight() {
|
|
232
|
-
this.chatClientService?.chatClient?.logger?.('info', `[Autocomplete textarea] Textarea height set from ${this.messageInput.nativeElement.style.height} to ${this.messageInput.nativeElement.scrollHeight}px`);
|
|
233
|
-
this.messageInput.nativeElement.style.height = '';
|
|
234
|
-
this.messageInput.nativeElement.style.height = `${this.messageInput.nativeElement.scrollHeight}px`;
|
|
235
|
-
}
|
|
236
|
-
transliterate(s) {
|
|
237
|
-
if (this.transliterationService) {
|
|
238
|
-
return this.transliterationService.transliterate(s);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
return s;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
async updateMentionOptions(searchTerm) {
|
|
245
|
-
if (!this.areMentionsEnabled) {
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
searchTerm = searchTerm?.replace(this.mentionTriggerChar, '');
|
|
249
|
-
const request = this.mentionScope === 'application'
|
|
250
|
-
? (s) => this.chatClientService.autocompleteUsers(s)
|
|
251
|
-
: (s) => this.channelService.autocompleteMembers(s);
|
|
252
|
-
const result = await request(searchTerm || '');
|
|
253
|
-
const items = this.filter(searchTerm || '', result.map((i) => {
|
|
254
|
-
const user = (i.user ? i.user : i);
|
|
255
|
-
return {
|
|
256
|
-
...i,
|
|
257
|
-
autocompleteLabel: user.name || user.id,
|
|
258
|
-
type: 'mention',
|
|
259
|
-
};
|
|
260
|
-
}));
|
|
261
|
-
this.userMentionConfig.items = items;
|
|
262
|
-
this.autocompleteConfig.mentions = [
|
|
263
|
-
...(this.autocompleteConfig?.mentions ?? []),
|
|
264
|
-
];
|
|
265
|
-
this.autocompleteConfig = { ...this.autocompleteConfig };
|
|
266
|
-
this.cdRef.detectChanges();
|
|
267
|
-
}
|
|
268
|
-
updateMentionedUsersFromText() {
|
|
269
|
-
const updatedMentionedUsers = [];
|
|
270
|
-
this.mentionedUsers.forEach((u) => {
|
|
271
|
-
const key = u.name || u.id;
|
|
272
|
-
if (this.value.includes(`${this.mentionTriggerChar}${key}`)) {
|
|
273
|
-
updatedMentionedUsers.push(u);
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
if (updatedMentionedUsers.length !== this.mentionedUsers.length) {
|
|
277
|
-
this.userMentions.next([...updatedMentionedUsers]);
|
|
278
|
-
this.mentionedUsers = updatedMentionedUsers;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
async updateCustomAutocompleteOptions(searchTerm) {
|
|
282
|
-
if (this.messageInputConfigService.customAutocompletes$.getValue().length ===
|
|
283
|
-
0) {
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
const customMentionConfig = this.autocompleteConfig.mentions?.find((c) => c.triggerChar && searchTerm.startsWith(c.triggerChar));
|
|
287
|
-
const customAutocompleteConfig = customMentionConfig
|
|
288
|
-
? this.messageInputConfigService.customAutocompletes$
|
|
289
|
-
.getValue()
|
|
290
|
-
.find((c) => c.triggerCharacter === customMentionConfig?.triggerChar)
|
|
291
|
-
: undefined;
|
|
292
|
-
if (customMentionConfig && customAutocompleteConfig?.updateOptions) {
|
|
293
|
-
const newOptions = await customAutocompleteConfig.updateOptions(searchTerm.replace(customMentionConfig.triggerChar || '', ''));
|
|
294
|
-
customMentionConfig.items = newOptions.map((o) => ({
|
|
295
|
-
...o,
|
|
296
|
-
templateRef: customAutocompleteConfig.templateRef,
|
|
297
|
-
}));
|
|
298
|
-
this.autocompleteConfig = { ...this.autocompleteConfig };
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: AutocompleteTextareaComponent, deps: [{ token: i1.ChannelService }, { token: i2.ChatClientService }, { token: i3.TransliterationService }, { token: i4.EmojiInputService }, { token: i5.CustomTemplatesService }, { token: i0.ChangeDetectorRef }, { token: i6.MessageInputConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
302
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", type: AutocompleteTextareaComponent, selector: "stream-autocomplete-textarea", inputs: { value: "value", placeholder: "placeholder", areMentionsEnabled: "areMentionsEnabled", inputMode: "inputMode", mentionScope: "mentionScope", autoFocus: "autoFocus" }, outputs: { valueChange: "valueChange", send: "send", userMentions: "userMentions", pasteFromClipboard: "pasteFromClipboard" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "messageInput", first: true, predicate: ["input"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<textarea\n #input\n data-testid=\"textarea\"\n class=\"rta__textarea str-chat__textarea__textarea str-chat__angular-textarea str-chat__message-textarea\"\n rows=\"1\"\n [value]=\"value || ''\"\n [autofocus]=\"autoFocus\"\n placeholder=\"{{ placeholder | translate }}\"\n [mentionConfig]=\"autocompleteConfig\"\n [mentionListTemplate]=\"autocompleteItem\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"enterHit($event)\"\n (searchTerm)=\"autcompleteSearchTermChanged($event)\"\n (blur)=\"inputLeft()\"\n (paste)=\"pasteFromClipboard.emit($event)\"\n></textarea>\n<ng-template #autocompleteItem let-item=\"item\">\n @if (item.templateRef) {\n <ng-container\n *ngTemplateOutlet=\"item.templateRef; context: { item: item }\"\n />\n } @else {\n <div class=\"rta rta__item str-chat__emojisearch__item\">\n @switch (item.type) {\n @case (\"mention\") {\n <div class=\"rta__entity\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionAutocompleteItemTemplate || defaultMentionTemplate;\n context: { item: item }\n \"\n />\n </div>\n }\n @case (\"command\") {\n <div class=\"rta__entity\">\n <ng-container\n *ngTemplateOutlet=\"\n commandAutocompleteItemTemplate || defaultCommandTemplate;\n context: { item: item }\n \"\n />\n </div>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultCommandTemplate let-item=\"item\">\n <div class=\"str-chat__slash-command\">\n <span class=\"str-chat__slash-command-header\">\n <strong\n class=\"str-chat__slash-command-name\"\n data-testclass=\"command-name\"\n >{{ item.name }}</strong\n >\n <span class=\"str-chat__slash-command-args\"\n >/{{ item.name }} {{ item.args }}</span\n >\n </span>\n <br />\n </div>\n</ng-template>\n\n<ng-template #defaultMentionTemplate let-item=\"item\">\n <div class=\"str-chat__user-item\">\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n type=\"user\"\n location=\"autocomplete-item\"\n [imageUrl]=\"item.image || item.user?.image\"\n [name]=\"item.autocompleteLabel\"\n [user]=\"item.user || item\"\n />\n <span data-testclass=\"username\" class=\"str-chat__user-item--name\">{{\n item.autocompleteLabel\n }}</span>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.MentionDirective, selector: "[mention], [mentionConfig]", inputs: ["mention", "mentionConfig", "mentionListTemplate"], outputs: ["searchTerm", "itemSelected", "opened", "closed"] }, { kind: "component", type: i9.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
|
|
303
|
-
}
|
|
304
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: AutocompleteTextareaComponent, decorators: [{
|
|
305
|
-
type: Component,
|
|
306
|
-
args: [{ selector: 'stream-autocomplete-textarea', template: "<textarea\n #input\n data-testid=\"textarea\"\n class=\"rta__textarea str-chat__textarea__textarea str-chat__angular-textarea str-chat__message-textarea\"\n rows=\"1\"\n [value]=\"value || ''\"\n [autofocus]=\"autoFocus\"\n placeholder=\"{{ placeholder | translate }}\"\n [mentionConfig]=\"autocompleteConfig\"\n [mentionListTemplate]=\"autocompleteItem\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"enterHit($event)\"\n (searchTerm)=\"autcompleteSearchTermChanged($event)\"\n (blur)=\"inputLeft()\"\n (paste)=\"pasteFromClipboard.emit($event)\"\n></textarea>\n<ng-template #autocompleteItem let-item=\"item\">\n @if (item.templateRef) {\n <ng-container\n *ngTemplateOutlet=\"item.templateRef; context: { item: item }\"\n />\n } @else {\n <div class=\"rta rta__item str-chat__emojisearch__item\">\n @switch (item.type) {\n @case (\"mention\") {\n <div class=\"rta__entity\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionAutocompleteItemTemplate || defaultMentionTemplate;\n context: { item: item }\n \"\n />\n </div>\n }\n @case (\"command\") {\n <div class=\"rta__entity\">\n <ng-container\n *ngTemplateOutlet=\"\n commandAutocompleteItemTemplate || defaultCommandTemplate;\n context: { item: item }\n \"\n />\n </div>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #defaultCommandTemplate let-item=\"item\">\n <div class=\"str-chat__slash-command\">\n <span class=\"str-chat__slash-command-header\">\n <strong\n class=\"str-chat__slash-command-name\"\n data-testclass=\"command-name\"\n >{{ item.name }}</strong\n >\n <span class=\"str-chat__slash-command-args\"\n >/{{ item.name }} {{ item.args }}</span\n >\n </span>\n <br />\n </div>\n</ng-template>\n\n<ng-template #defaultMentionTemplate let-item=\"item\">\n <div class=\"str-chat__user-item\">\n <stream-avatar-placeholder\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n type=\"user\"\n location=\"autocomplete-item\"\n [imageUrl]=\"item.image || item.user?.image\"\n [name]=\"item.autocompleteLabel\"\n [user]=\"item.user || item\"\n />\n <span data-testclass=\"username\" class=\"str-chat__user-item--name\">{{\n item.autocompleteLabel\n }}</span>\n </div>\n</ng-template>\n" }]
|
|
307
|
-
}], ctorParameters: () => [{ type: i1.ChannelService }, { type: i2.ChatClientService }, { type: i3.TransliterationService }, { type: i4.EmojiInputService }, { type: i5.CustomTemplatesService }, { type: i0.ChangeDetectorRef }, { type: i6.MessageInputConfigService }], propDecorators: { class: [{
|
|
308
|
-
type: HostBinding
|
|
309
|
-
}], value: [{
|
|
310
|
-
type: Input
|
|
311
|
-
}], placeholder: [{
|
|
312
|
-
type: Input
|
|
313
|
-
}], areMentionsEnabled: [{
|
|
314
|
-
type: Input
|
|
315
|
-
}], inputMode: [{
|
|
316
|
-
type: Input
|
|
317
|
-
}], mentionScope: [{
|
|
318
|
-
type: Input
|
|
319
|
-
}], autoFocus: [{
|
|
320
|
-
type: Input
|
|
321
|
-
}], valueChange: [{
|
|
322
|
-
type: Output
|
|
323
|
-
}], send: [{
|
|
324
|
-
type: Output
|
|
325
|
-
}], userMentions: [{
|
|
326
|
-
type: Output
|
|
327
|
-
}], pasteFromClipboard: [{
|
|
328
|
-
type: Output
|
|
329
|
-
}], messageInput: [{
|
|
330
|
-
type: ViewChild,
|
|
331
|
-
args: ['input']
|
|
332
|
-
}] } });
|
|
333
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLXRleHRhcmVhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWlucHV0L2F1dG9jb21wbGV0ZS10ZXh0YXJlYS9hdXRvY29tcGxldGUtdGV4dGFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtaW5wdXQvYXV0b2NvbXBsZXRlLXRleHRhcmVhL2F1dG9jb21wbGV0ZS10ZXh0YXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUVMLE1BQU0sRUFHTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFRdkIsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFLckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7O0FBTXREOztHQUVHO0FBTUgsTUFBTSxPQUFPLDZCQUE2QjtJQThGeEMsWUFDVSxjQUE4QixFQUM5QixpQkFBb0MsRUFDcEMsc0JBQThDLEVBQzlDLGlCQUFvQyxFQUNwQyxzQkFBOEMsRUFDOUMsS0FBd0IsRUFDeEIseUJBQW9EO1FBTnBELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLDhCQUF5QixHQUF6Qix5QkFBeUIs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LHdCQUF3QixDQUFDLFdBQVc7YUFDbEQsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzFEO0lBQ0gsQ0FBQzs4R0FsWVUsNkJBQTZCO2tHQUE3Qiw2QkFBNkIsZ2lCQ3hDMUMsbWdGQWlGQTs7MkZEekNhLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSw4QkFBOEI7cVNBT3pCLEtBQUs7c0JBQW5CLFdBQVc7Z0JBS0gsS0FBSztzQkFBYixLQUFLO2dCQUlHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsWUFBWTtzQkFBcEIsS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlhLFdBQVc7c0JBQTdCLE1BQU07Z0JBSVksSUFBSTtzQkFBdEIsTUFBTTtnQkFJWSxZQUFZO3NCQUE5QixNQUFNO2dCQUlZLGtCQUFrQjtzQkFBcEMsTUFBTTtnQkFhcUIsWUFBWTtzQkFBdkMsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lbnRpb25Db25maWcsIE1lbnRpb25zIH0gZnJvbSAnYW5ndWxhci1tZW50aW9ucyc7XG5pbXBvcnQge1xuICBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbUNvbnRleHQsXG4gIE1lbnRpb25BdXRjb21wbGV0ZUxpc3RJdGVtLFxuICBDb21tYW5kQXV0b2NvbXBsZXRlTGlzdEl0ZW1Db250ZXh0LFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVc2VyUmVzcG9uc2UgfSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4uLy4uL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBUZXh0YXJlYUludGVyZmFjZSB9IGZyb20gJy4uL3RleHRhcmVhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUcmFuc2xpdGVyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdHJhbnNsaXRlcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW1vamlJbnB1dFNlcnZpY2UgfSBmcm9tICcuLi9lbW9qaS1pbnB1dC5zZXJ2aWNlJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2UtaW5wdXQtY29uZmlnLnNlcnZpY2UnO1xuXG4vKipcbiAqIFRoZSBgQXV0b2NvbXBsZXRlVGV4dGFyZWFgIGNvbXBvbmVudCBpcyB1c2VkIGJ5IHRoZSBbYE1lc3NhZ2VJbnB1dGBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29tcG9uZW50cy9NZXNzYWdlSW5wdXRDb21wb25lbnQvKSBjb21wb25lbnQgdG8gZGlzcGxheSB0aGUgaW5wdXQgSFRNTCBlbGVtZW50IHdoZXJlIHVzZXJzIGNhbiB0eXBlIHRoZWlyIG1lc3NhZ2UuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1hdXRvY29tcGxldGUtdGV4dGFyZWEnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0b2NvbXBsZXRlLXRleHRhcmVhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlVGV4dGFyZWFDb21wb25lbnRcbiAgaW1wbGVtZW50cyBUZXh0YXJlYUludGVyZmFjZSwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0XG57XG4gIEBIb3N0QmluZGluZygpIGNsYXNzID1cbiAgICAnc3RyLWNoYXRfX3RleHRhcmVhIHN0ci1jaGF0X19tZXNzYWdlLXRleHRhcmVhLWFuZ3VsYXItaG9zdCc7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGlucHV0IEhUTUwgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlID0gJyc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciBvZiB0aGUgdGV4dGFyZWFcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB1c2VycyBjYW4gbWVudGlvbiBvdGhlciB1c2VycyBpbiBtZXNzYWdlcy4gWW91IGNhbiBhbHNvIHNldCB0aGlzIGlucHV0IG9uIHRoZSBbYE1lc3NhZ2VJbnB1dGBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29tcG9uZW50cy9NZXNzYWdlSW5wdXRDb21wb25lbnQvI2lucHV0cy1hbmQtb3V0cHV0cy8pIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGFyZU1lbnRpb25zRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG4gIC8qKlxuICAgKiBTZWUgW2BNZXNzYWdlSW5wdXRDb25maWdTZXJ2aWNlYF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9NZXNzYWdlSW5wdXRDb25maWdTZXJ2aWNlKSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgQElucHV0KCkgaW5wdXRNb2RlITogJ2Rlc2t0b3AnIHwgJ21vYmlsZSc7XG4gIC8qKlxuICAgKiBUaGUgc2NvcGUgZm9yIHVzZXIgbWVudGlvbnMsIGVpdGhlciBtZW1iZXJzIG9mIHRoZSBjdXJyZW50IGNoYW5uZWwgb2YgbWVtYmVycyBvZiB0aGUgYXBwbGljYXRpb24uIFlvdSBjYW4gYWxzbyBzZXQgdGhpcyBpbnB1dCBvbiB0aGUgW2BNZXNzYWdlSW5wdXRgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL2NvbXBvbmVudHMvTWVzc2FnZUlucHV0Q29tcG9uZW50LyNpbnB1dHMtYW5kLW91dHB1dHMpIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIG1lbnRpb25TY29wZTogJ2NoYW5uZWwnIHwgJ2FwcGxpY2F0aW9uJyA9ICdjaGFubmVsJztcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0byBmb2N1cyBvbiB0aGUgdGV4dGFyZWEgZWxlbWVudFxuICAgKi9cbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnB1dCBlbGVtZW50IHdoZW4gYSB1c2VyIHR5cGVzLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIGEgdXNlciB0cmlnZ2VycyBhIG1lc3NhZ2Ugc2VuZCBldmVudCAodGhpcyBoYXBwZW5zIHdoZW4gdGhleSBoaXQgdGhlIGBFbnRlcmAga2V5KS5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZW5kID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRW1pdHMgdGhlIGFycmF5IG9mIHVzZXJzIHRoYXQgYXJlIG1lbnRpb25lZCBpbiB0aGUgbWVzc2FnZSwgaXQgaXMgdXBkYXRlZCB3aGVuIGEgdXNlciBtZW50aW9ucyBhIG5ldyB1c2VyIG9yIGRlbGV0ZXMgYSBtZW50aW9uLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHVzZXJNZW50aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlclJlc3BvbnNlW10+KCk7XG4gIC8qKlxuICAgKiBFbWl0cyBhbnkgcGFzdGUgZXZlbnQgdGhhdCBvY2N1cmVkIGluc2lkZSB0aGUgdGV4dGFyZWFcbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBwYXN0ZUZyb21DbGlwYm9hcmQgPSBuZXcgRXZlbnRFbWl0dGVyPENsaXBib2FyZEV2ZW50PigpO1xuICBtZW50aW9uQXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlOlxuICAgIHwgVGVtcGxhdGVSZWY8TWVudGlvbkF1dGNvbXBsZXRlTGlzdEl0ZW1Db250ZXh0PlxuICAgIHwgdW5kZWZpbmVkO1xuICBjb21tYW5kQXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlOlxuICAgIHwgVGVtcGxhdGVSZWY8Q29tbWFuZEF1dG9jb21wbGV0ZUxpc3RJdGVtQ29udGV4dD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvY29tcGxldGVLZXkgPSAnYXV0b2NvbXBsZXRlTGFiZWwnO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbnRpb25UcmlnZ2VyQ2hhciA9ICdAJztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVHJpZ2dlckNoYXIgPSAnLyc7XG4gIGF1dG9jb21wbGV0ZUNvbmZpZzogTWVudGlvbkNvbmZpZyA9IHtcbiAgICBtZW50aW9uczogW10sXG4gIH07XG4gIEBWaWV3Q2hpbGQoJ2lucHV0JykgcHJpdmF0ZSBtZXNzYWdlSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgbWVudGlvbmVkVXNlcnM6IFVzZXJSZXNwb25zZVtdID0gW107XG4gIHByaXZhdGUgdXNlck1lbnRpb25Db25maWc6IE1lbnRpb25zID0ge1xuICAgIHRyaWdnZXJDaGFyOiB0aGlzLm1lbnRpb25UcmlnZ2VyQ2hhcixcbiAgICBkcm9wVXA6IHRydWUsXG4gICAgYWxsb3dTcGFjZTogdHJ1ZSxcbiAgICBsYWJlbEtleTogdGhpcy5hdXRvY29tcGxldGVLZXksXG4gICAgcmV0dXJuVHJpZ2dlcjogdHJ1ZSxcbiAgICBtZW50aW9uRmlsdGVyOiAoXG4gICAgICBzZWFyY2hTdHJpbmc6IHN0cmluZyxcbiAgICAgIGl0ZW1zOiB7IGF1dG9jb21wbGV0ZUxhYmVsOiBzdHJpbmcgfVtdLFxuICAgICkgPT4gdGhpcy5maWx0ZXIoc2VhcmNoU3RyaW5nLCBpdGVtcyksXG4gICAgbWVudGlvblNlbGVjdDogKGl0ZW0sIHRyaWdnZXJDaGFyKSA9PlxuICAgICAgdGhpcy5pdGVtU2VsZWN0ZWRGcm9tQXV0b2NvbXBsZXRlTGlzdChcbiAgICAgICAgaXRlbSBhcyBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbSxcbiAgICAgICAgdHJpZ2dlckNoYXIsXG4gICAgICApLFxuICB9O1xuICBwcml2YXRlIHNsYXNoQ29tbWFuZENvbmZpZzogTWVudGlvbnMgPSB7XG4gICAgdHJpZ2dlckNoYXI6IHRoaXMuY29tbWFuZFRyaWdnZXJDaGFyLFxuICAgIGRyb3BVcDogdHJ1ZSxcbiAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgIHJldHVyblRyaWdnZXI6IHRydWUsXG4gICAgbWVudGlvbkZpbHRlcjogKFxuICAgICAgc2VhcmNoU3RyaW5nOiBzdHJpbmcsXG4gICAgICBpdGVtczogeyBhdXRvY29tcGxldGVMYWJlbDogc3RyaW5nIH1bXSxcbiAgICApID0+IHRoaXMuZmlsdGVyKHNlYXJjaFN0cmluZywgaXRlbXMpLFxuICAgIG1lbnRpb25TZWxlY3Q6IChpdGVtLCB0cmlnZ2VyQ2hhcikgPT5cbiAgICAgIHRoaXMuaXRlbVNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZUxpc3QoXG4gICAgICAgIGl0ZW0gYXMgTWVudGlvbkF1dGNvbXBsZXRlTGlzdEl0ZW0sXG4gICAgICAgIHRyaWdnZXJDaGFyLFxuICAgICAgKSxcbiAgfTtcbiAgcHJpdmF0ZSBzZWFyY2hUZXJtJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHByaXZhdGUgaXNWaWV3SW5pdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xpdGVyYXRpb25TZXJ2aWNlOiBUcmFuc2xpdGVyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZW1vamlJbnB1dFNlcnZpY2U6IEVtb2ppSW5wdXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIG1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2U6IE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuc2VhcmNoVGVybSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHNlYXJjaFRlcm0pID0+IHNlYXJjaFRlcm0ubGVuZ3RoICE9PSAxKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChzZWFyY2hUZXJtKSA9PiB7XG4gICAgICAgIGlmIChzZWFyY2hUZXJtLnN0YXJ0c1dpdGgodGhpcy5tZW50aW9uVHJpZ2dlckNoYXIpKSB7XG4gICAgICAgICAgdm9pZCB0aGlzLnVwZGF0ZU1lbnRpb25PcHRpb25zKHNlYXJjaFRlcm0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZvaWQgdGhpcy51cGRhdGVDdXN0b21BdXRvY29tcGxldGVPcHRpb25zKHNlYXJjaFRlcm0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbCQuc3Vic2NyaWJlKChjaGFubmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRzID0gY2hhbm5lbD8uZ2V0Q29uZmlnKCk/LmNvbW1hbmRzIHx8IFtdO1xuICAgICAgICB0aGlzLnNsYXNoQ29tbWFuZENvbmZpZy5pdGVtcyA9IGNvbW1hbmRzLm1hcCgoYykgPT4gKHtcbiAgICAgICAgICAuLi5jLFxuICAgICAgICAgIFt0aGlzLmF1dG9jb21wbGV0ZUtleV06IGMubmFtZSxcbiAgICAgICAgICB0eXBlOiAnY29tbWFuZCcsXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5tZW50aW9uZWRVc2VycyA9IFtdO1xuICAgICAgICB0aGlzLnVzZXJNZW50aW9ucy5uZXh0KFsuLi50aGlzLm1lbnRpb25lZFVzZXJzXSk7XG4gICAgICAgIHZvaWQgdGhpcy51cGRhdGVNZW50aW9uT3B0aW9ucyh0aGlzLnNlYXJjaFRlcm0kLmdldFZhbHVlKCkpO1xuICAgICAgICB2b2lkIHRoaXMudXBkYXRlQ3VzdG9tQXV0b2NvbXBsZXRlT3B0aW9ucyh0aGlzLnNlYXJjaFRlcm0kLmdldFZhbHVlKCkpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuZW1vamlJbnB1dFNlcnZpY2UuZW1vamlJbnB1dCQuc3Vic2NyaWJlKChlbW9qaSkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQgfSA9IHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0UmFuZ2VUZXh0KGVtb2ppKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9XG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQhICsgZW1vamkubGVuZ3RoO1xuICAgICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9XG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQhICsgZW1vamkubGVuZ3RoO1xuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlZCgpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZW50aW9uQXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMubWVudGlvbkF1dG9jb21wbGV0ZUl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5jb21tYW5kQXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY29tbWFuZEF1dG9jb21wbGV0ZUl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUNvbmZpZy5tZW50aW9ucyA9IFtcbiAgICAgIHRoaXMudXNlck1lbnRpb25Db25maWcsXG4gICAgICB0aGlzLnNsYXNoQ29tbWFuZENvbmZpZyxcbiAgICBdO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5tZXNzYWdlSW5wdXRDb25maWdTZXJ2aWNlLmN1c3RvbUF1dG9jb21wbGV0ZXMkLnN1YnNjcmliZShcbiAgICAgICAgKGN1c3RvbUNvbmZpZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsdEluSXRlbXMgPVxuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVDb25maWcubWVudGlvbnM/LmZpbHRlcihcbiAgICAgICAgICAgICAgKG0pID0+XG4gICAgICAgICAgICAgICAgbSA9PT0gdGhpcy51c2VyTWVudGlvbkNvbmZpZyB8fCBtID09PSB0aGlzLnNsYXNoQ29tbWFuZENvbmZpZyxcbiAgICAgICAgICAgICkgPz8gW107XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDdXN0b21Db25maWdzID0gY3VzdG9tQ29uZmlncy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvcHk6IE1lbnRpb25zID0ge1xuICAgICAgICAgICAgICBpdGVtczogYy5vcHRpb25zLm1hcCgobykgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5vLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlUmVmOiBjLnRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgIHRyaWdnZXJDaGFyOiBjLnRyaWdnZXJDaGFyYWN0ZXIsXG4gICAgICAgICAgICAgIGRyb3BVcDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6IHRoaXMuYXV0b2NvbXBsZXRlS2V5LFxuICAgICAgICAgICAgICByZXR1cm5UcmlnZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICBhbGxvd1NwYWNlOiBjLmFsbG93U3BhY2UsXG4gICAgICAgICAgICAgIG1lbnRpb25GaWx0ZXI6IChcbiAgICAgICAgICAgICAgICBzZWFyY2hTdHJpbmc6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBpdGVtczogeyBhdXRvY29tcGxldGVMYWJlbDogc3RyaW5nIH1bXSxcbiAgICAgICAgICAgICAgKSA9PiB0aGlzLmZpbHRlcihzZWFyY2hTdHJpbmcsIGl0ZW1zKSxcbiAgICAgICAgICAgICAgbWVudGlvblNlbGVjdDogKGl0ZW0sIHRyaWdnZXJDaGFyKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbVNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZUxpc3QoXG4gICAgICAgICAgICAgICAgICBpdGVtIGFzIE1lbnRpb25BdXRjb21wbGV0ZUxpc3RJdGVtLFxuICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoYXIsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBjb3B5O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVDb25maWcubWVudGlvbnMgPSBbXG4gICAgICAgICAgICAuLi5idWlsdEluSXRlbXMsXG4gICAgICAgICAgICAuLi50cmFuc2Zvcm1lZEN1c3RvbUNvbmZpZ3MsXG4gICAgICAgICAgXTtcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUNvbmZpZyA9IHsgLi4udGhpcy5hdXRvY29tcGxldGVDb25maWcgfTtcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5hcmVNZW50aW9uc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQ29uZmlnLm1lbnRpb25zID1cbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVDb25maWc/Lm1lbnRpb25zPy5maWx0ZXIoKGMpID0+IHtcbiAgICAgICAgICBpZiAoYyAhPT0gdGhpcy51c2VyTWVudGlvbkNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFyZU1lbnRpb25zRW5hYmxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pID8/IFtdO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVDb25maWcgPSB7IC4uLnRoaXMuYXV0b2NvbXBsZXRlQ29uZmlnIH07XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLm1lbnRpb25TY29wZSkge1xuICAgICAgdm9pZCB0aGlzLnVwZGF0ZU1lbnRpb25PcHRpb25zKHRoaXMuc2VhcmNoVGVybSQuZ2V0VmFsdWUoKSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLnZhbHVlICYmICF0aGlzLnZhbHVlICYmIHRoaXMubWVzc2FnZUlucHV0KSB7XG4gICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2U/LmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAnaW5mbycsXG4gICAgICAgICdbQXV0b2NvbXBsZXRlIHRleHRhcmVhXSBWYWx1ZSByZXNldCwgYWRqdXN0aW5nIHRleHRhcmVhIGhlaWdodCB0byBhdXRvJyxcbiAgICAgICk7XG4gICAgICB0aGlzLnVwZGF0ZU1lbnRpb25lZFVzZXJzRnJvbVRleHQoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hhbmdlcy52YWx1ZSAmJlxuICAgICAgdGhpcy52YWx1ZSAmJlxuICAgICAgdGhpcy5tZXNzYWdlSW5wdXQgJiZcbiAgICAgIHRoaXMuaXNWaWV3SW5pdGVkXG4gICAgKSB7XG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlPy5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgJ2luZm8nLFxuICAgICAgICAnW0F1dG9jb21wbGV0ZSB0ZXh0YXJlYV0gVmFsdWUgY2hhbmdlZCcsXG4gICAgICApO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCA+IDApIHtcbiAgICAgICAgICB0aGlzLmFkanVzdFRleHRhcmVhSGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlld0luaXRlZCA9IHRydWU7XG4gICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZT8uY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAnaW5mbycsXG4gICAgICAnW0F1dG9jb21wbGV0ZSB0ZXh0YXJlYV0gVmlldyBpbml0ZWQnLFxuICAgICk7XG4gICAgaWYgKHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gMCAmJiB0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLmFkanVzdFRleHRhcmVhSGVpZ2h0KCk7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyKHNlYXJjaFN0cmluZzogc3RyaW5nLCBpdGVtczogeyBhdXRvY29tcGxldGVMYWJlbDogc3RyaW5nIH1bXSkge1xuICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICB0aGlzLnRyYW5zbGl0ZXJhdGUoaXRlbS5hdXRvY29tcGxldGVMYWJlbC50b0xvd2VyQ2FzZSgpKS5pbmNsdWRlcyhcbiAgICAgICAgdGhpcy50cmFuc2xpdGVyYXRlKHNlYXJjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGl0ZW1TZWxlY3RlZEZyb21BdXRvY29tcGxldGVMaXN0KFxuICAgIGl0ZW06IE1lbnRpb25BdXRjb21wbGV0ZUxpc3RJdGVtLFxuICAgIHRyaWdnZXJDaGFyID0gJycsXG4gICkge1xuICAgIGlmICh0cmlnZ2VyQ2hhciA9PT0gdGhpcy5tZW50aW9uVHJpZ2dlckNoYXIpIHtcbiAgICAgIHRoaXMubWVudGlvbmVkVXNlcnMucHVzaCgoaXRlbS51c2VyID8gaXRlbS51c2VyIDogaXRlbSkgYXMgVXNlclJlc3BvbnNlKTtcbiAgICAgIHRoaXMudXNlck1lbnRpb25zLm5leHQoWy4uLnRoaXMubWVudGlvbmVkVXNlcnNdKTtcbiAgICB9XG4gICAgdGhpcy5zZWFyY2hUZXJtJC5uZXh0KCcnKTtcbiAgICByZXR1cm4gdHJpZ2dlckNoYXIgKyBpdGVtLmF1dG9jb21wbGV0ZUxhYmVsICsgJyAnO1xuICB9XG5cbiAgYXV0Y29tcGxldGVTZWFyY2hUZXJtQ2hhbmdlZChzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICBpZiAoc2VhcmNoVGVybS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChzZWFyY2hUZXJtID09PSB0aGlzLm1lbnRpb25UcmlnZ2VyQ2hhcikge1xuICAgICAgICB2b2lkIHRoaXMudXBkYXRlTWVudGlvbk9wdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvaWQgdGhpcy51cGRhdGVDdXN0b21BdXRvY29tcGxldGVPcHRpb25zKHNlYXJjaFRlcm0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlYXJjaFRlcm0kLm5leHQoc2VhcmNoVGVybSk7XG4gIH1cblxuICBpbnB1dENoYW5nZWQoKSB7XG4gICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZT8uY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAnaW5mbycsXG4gICAgICAnW0F1dG9jb21wbGV0ZSB0ZXh0YXJlYV0gSW5wdXQgY2hhbmdlZCcsXG4gICAgKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gICAgdGhpcy5hZGp1c3RUZXh0YXJlYUhlaWdodCgpO1xuICB9XG5cbiAgaW5wdXRMZWZ0KCkge1xuICAgIHRoaXMudXBkYXRlTWVudGlvbmVkVXNlcnNGcm9tVGV4dCgpO1xuICB9XG5cbiAgZW50ZXJIaXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaW5wdXRNb2RlID09PSAnZGVza3RvcCcgJiYgIShldmVudCBhcyBLZXlib2FyZEV2ZW50KS5pc0NvbXBvc2luZykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMudXBkYXRlTWVudGlvbmVkVXNlcnNGcm9tVGV4dCgpO1xuICAgICAgdGhpcy5zZW5kLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkanVzdFRleHRhcmVhSGVpZ2h0KCkge1xuICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2U/LmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgJ2luZm8nLFxuICAgICAgYFtBdXRvY29tcGxldGUgdGV4dGFyZWFdIFRleHRhcmVhIGhlaWdodCBzZXQgZnJvbSAke3RoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0fSB0byAke3RoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0fXB4YCxcbiAgICApO1xuICAgIHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgdGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodH1weGA7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zbGl0ZXJhdGUoczogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMudHJhbnNsaXRlcmF0aW9uU2VydmljZSkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsaXRlcmF0aW9uU2VydmljZS50cmFuc2xpdGVyYXRlKHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU1lbnRpb25PcHRpb25zKHNlYXJjaFRlcm0/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYXJlTWVudGlvbnNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtPy5yZXBsYWNlKHRoaXMubWVudGlvblRyaWdnZXJDaGFyLCAnJyk7XG4gICAgY29uc3QgcmVxdWVzdCA9XG4gICAgICB0aGlzLm1lbnRpb25TY29wZSA9PT0gJ2FwcGxpY2F0aW9uJ1xuICAgICAgICA/IChzOiBzdHJpbmcpID0+IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuYXV0b2NvbXBsZXRlVXNlcnMocylcbiAgICAgICAgOiAoczogc3RyaW5nKSA9PiB0aGlzLmNoYW5uZWxTZXJ2aWNlLmF1dG9jb21wbGV0ZU1lbWJlcnMocyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdChzZWFyY2hUZXJtIHx8ICcnKTtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZmlsdGVyKFxuICAgICAgc2VhcmNoVGVybSB8fCAnJyxcbiAgICAgIHJlc3VsdC5tYXAoKGkpID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IChpLnVzZXIgPyBpLnVzZXIgOiBpKSBhcyBVc2VyUmVzcG9uc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaSxcbiAgICAgICAgICBhdXRvY29tcGxldGVMYWJlbDogdXNlci5uYW1lIHx8IHVzZXIuaWQsXG4gICAgICAgICAgdHlwZTogJ21lbnRpb24nLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnVzZXJNZW50aW9uQ29uZmlnLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5hdXRvY29tcGxldGVDb25maWcubWVudGlvbnMgPSBbXG4gICAgICAuLi4odGhpcy5hdXRvY29tcGxldGVDb25maWc/Lm1lbnRpb25zID8/IFtdKSxcbiAgICBdO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlQ29uZmlnID0geyAuLi50aGlzLmF1dG9jb21wbGV0ZUNvbmZpZyB9O1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNZW50aW9uZWRVc2Vyc0Zyb21UZXh0KCkge1xuICAgIGNvbnN0IHVwZGF0ZWRNZW50aW9uZWRVc2VyczogVXNlclJlc3BvbnNlW10gPSBbXTtcbiAgICB0aGlzLm1lbnRpb25lZFVzZXJzLmZvckVhY2goKHUpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHUubmFtZSB8fCB1LmlkO1xuICAgICAgaWYgKHRoaXMudmFsdWUuaW5jbHVkZXMoYCR7dGhpcy5tZW50aW9uVHJpZ2dlckNoYXJ9JHtrZXl9YCkpIHtcbiAgICAgICAgdXBkYXRlZE1lbnRpb25lZFVzZXJzLnB1c2godSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHVwZGF0ZWRNZW50aW9uZWRVc2Vycy5sZW5ndGggIT09IHRoaXMubWVudGlvbmVkVXNlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnVzZXJNZW50aW9ucy5uZXh0KFsuLi51cGRhdGVkTWVudGlvbmVkVXNlcnNdKTtcbiAgICAgIHRoaXMubWVudGlvbmVkVXNlcnMgPSB1cGRhdGVkTWVudGlvbmVkVXNlcnM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDdXN0b21BdXRvY29tcGxldGVPcHRpb25zKHNlYXJjaFRlcm06IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWVzc2FnZUlucHV0Q29uZmlnU2VydmljZS5jdXN0b21BdXRvY29tcGxldGVzJC5nZXRWYWx1ZSgpLmxlbmd0aCA9PT1cbiAgICAgIDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VzdG9tTWVudGlvbkNvbmZpZyA9IHRoaXMuYXV0b2NvbXBsZXRlQ29uZmlnLm1lbnRpb25zPy5maW5kKFxuICAgICAgKGMpID0+IGMudHJpZ2dlckNoYXIgJiYgc2VhcmNoVGVybS5zdGFydHNXaXRoKGMudHJpZ2dlckNoYXIpLFxuICAgICk7XG4gICAgY29uc3QgY3VzdG9tQXV0b2NvbXBsZXRlQ29uZmlnID0gY3VzdG9tTWVudGlvbkNvbmZpZ1xuICAgICAgPyB0aGlzLm1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UuY3VzdG9tQXV0b2NvbXBsZXRlcyRcbiAgICAgICAgICAuZ2V0VmFsdWUoKVxuICAgICAgICAgIC5maW5kKChjKSA9PiBjLnRyaWdnZXJDaGFyYWN0ZXIgPT09IGN1c3RvbU1lbnRpb25Db25maWc/LnRyaWdnZXJDaGFyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGN1c3RvbU1lbnRpb25Db25maWcgJiYgY3VzdG9tQXV0b2NvbXBsZXRlQ29uZmlnPy51cGRhdGVPcHRpb25zKSB7XG4gICAgICBjb25zdCBuZXdPcHRpb25zID0gYXdhaXQgY3VzdG9tQXV0b2NvbXBsZXRlQ29uZmlnLnVwZGF0ZU9wdGlvbnMoXG4gICAgICAgIHNlYXJjaFRlcm0ucmVwbGFjZShjdXN0b21NZW50aW9uQ29uZmlnLnRyaWdnZXJDaGFyIHx8ICcnLCAnJyksXG4gICAgICApO1xuICAgICAgY3VzdG9tTWVudGlvbkNvbmZpZy5pdGVtcyA9IG5ld09wdGlvbnMubWFwKChvKSA9PiAoe1xuICAgICAgICAuLi5vLFxuICAgICAgICB0ZW1wbGF0ZVJlZjogY3VzdG9tQXV0b2NvbXBsZXRlQ29uZmlnLnRlbXBsYXRlUmVmLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVDb25maWcgPSB7IC4uLnRoaXMuYXV0b2NvbXBsZXRlQ29uZmlnIH07XG4gICAgfVxuICB9XG59XG4iLCI8dGV4dGFyZWFcbiAgI2lucHV0XG4gIGRhdGEtdGVzdGlkPVwidGV4dGFyZWFcIlxuICBjbGFzcz1cInJ0YV9fdGV4dGFyZWEgc3RyLWNoYXRfX3RleHRhcmVhX190ZXh0YXJlYSBzdHItY2hhdF9fYW5ndWxhci10ZXh0YXJlYSBzdHItY2hhdF9fbWVzc2FnZS10ZXh0YXJlYVwiXG4gIHJvd3M9XCIxXCJcbiAgW3ZhbHVlXT1cInZhbHVlIHx8ICcnXCJcbiAgW2F1dG9mb2N1c109XCJhdXRvRm9jdXNcIlxuICBwbGFjZWhvbGRlcj1cInt7IHBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlIH19XCJcbiAgW21lbnRpb25Db25maWddPVwiYXV0b2NvbXBsZXRlQ29uZmlnXCJcbiAgW21lbnRpb25MaXN0VGVtcGxhdGVdPVwiYXV0b2NvbXBsZXRlSXRlbVwiXG4gIChpbnB1dCk9XCJpbnB1dENoYW5nZWQoKVwiXG4gIChrZXlkb3duLmVudGVyKT1cImVudGVySGl0KCRldmVudClcIlxuICAoc2VhcmNoVGVybSk9XCJhdXRjb21wbGV0ZVNlYXJjaFRlcm1DaGFuZ2VkKCRldmVudClcIlxuICAoYmx1cik9XCJpbnB1dExlZnQoKVwiXG4gIChwYXN0ZSk9XCJwYXN0ZUZyb21DbGlwYm9hcmQuZW1pdCgkZXZlbnQpXCJcbj48L3RleHRhcmVhPlxuPG5nLXRlbXBsYXRlICNhdXRvY29tcGxldGVJdGVtIGxldC1pdGVtPVwiaXRlbVwiPlxuICBAaWYgKGl0ZW0udGVtcGxhdGVSZWYpIHtcbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW0udGVtcGxhdGVSZWY7IGNvbnRleHQ6IHsgaXRlbTogaXRlbSB9XCJcbiAgICAvPlxuICB9IEBlbHNlIHtcbiAgICA8ZGl2IGNsYXNzPVwicnRhIHJ0YV9faXRlbSBzdHItY2hhdF9fZW1vamlzZWFyY2hfX2l0ZW1cIj5cbiAgICAgIEBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICBAY2FzZSAoXCJtZW50aW9uXCIpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnRhX19lbnRpdHlcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBtZW50aW9uQXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlIHx8IGRlZmF1bHRNZW50aW9uVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBpdGVtOiBpdGVtIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKFwiY29tbWFuZFwiKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ0YV9fZW50aXR5XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgY29tbWFuZEF1dG9jb21wbGV0ZUl0ZW1UZW1wbGF0ZSB8fCBkZWZhdWx0Q29tbWFuZFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgaXRlbTogaXRlbSB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbW1hbmRUZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cbiAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19zbGFzaC1jb21tYW5kXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fc2xhc2gtY29tbWFuZC1oZWFkZXJcIj5cbiAgICAgIDxzdHJvbmdcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fc2xhc2gtY29tbWFuZC1uYW1lXCJcbiAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJjb21tYW5kLW5hbWVcIlxuICAgICAgICA+e3sgaXRlbS5uYW1lIH19PC9zdHJvbmdcbiAgICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX3NsYXNoLWNvbW1hbmQtYXJnc1wiXG4gICAgICAgID4ve3sgaXRlbS5uYW1lIH19IHt7IGl0ZW0uYXJncyB9fTwvc3BhblxuICAgICAgPlxuICAgIDwvc3Bhbj5cbiAgICA8YnIgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRNZW50aW9uVGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCI+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fdXNlci1pdGVtXCI+XG4gICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgIGRhdGEtdGVzdGNsYXNzPVwiYXZhdGFyXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2F2YXRhciBzdHItY2hhdF9fYXZhdGFyLS1jaXJjbGVcIlxuICAgICAgdHlwZT1cInVzZXJcIlxuICAgICAgbG9jYXRpb249XCJhdXRvY29tcGxldGUtaXRlbVwiXG4gICAgICBbaW1hZ2VVcmxdPVwiaXRlbS5pbWFnZSB8fCBpdGVtLnVzZXI/LmltYWdlXCJcbiAgICAgIFtuYW1lXT1cIml0ZW0uYXV0b2NvbXBsZXRlTGFiZWxcIlxuICAgICAgW3VzZXJdPVwiaXRlbS51c2VyIHx8IGl0ZW1cIlxuICAgIC8+XG4gICAgPHNwYW4gZGF0YS10ZXN0Y2xhc3M9XCJ1c2VybmFtZVwiIGNsYXNzPVwic3RyLWNoYXRfX3VzZXItaXRlbS0tbmFtZVwiPnt7XG4gICAgICBpdGVtLmF1dG9jb21wbGV0ZUxhYmVsXG4gICAgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* The `MessageInputConfigService` is used to keep a consistent configuration among the different [`MessageInput`](/chat/docs/sdk/angular/components/MessageInputComponent/) components if your UI has more than one input component.
|
|
6
|
-
*/
|
|
7
|
-
export class MessageInputConfigService {
|
|
8
|
-
constructor() {
|
|
9
|
-
/**
|
|
10
|
-
* If file upload is enabled, the user can open a file selector from the input. Please note that the user also needs to have the necessary [channel capability](/chat/docs/javascript/channel_capabilities/).
|
|
11
|
-
*/
|
|
12
|
-
this.isFileUploadEnabled = true;
|
|
13
|
-
/**
|
|
14
|
-
* If true, users can mention other users in messages. You also [need to use the `AutocompleteTextarea`](/chat/docs/sdk/angular/concepts/opt-in-architecture/) for this feature to work.
|
|
15
|
-
*/
|
|
16
|
-
this.areMentionsEnabled = true;
|
|
17
|
-
/**
|
|
18
|
-
* If `false`, users can only upload one attachment per message
|
|
19
|
-
*/
|
|
20
|
-
this.isMultipleFileUploadEnabled = true;
|
|
21
|
-
/**
|
|
22
|
-
* The scope for user mentions, either members of the current channel of members of the application
|
|
23
|
-
*/
|
|
24
|
-
this.mentionScope = 'channel';
|
|
25
|
-
/**
|
|
26
|
-
* In `desktop` mode the `Enter` key will trigger message sending, in `mobile` mode the `Enter` key will insert a new line to the message input.
|
|
27
|
-
*/
|
|
28
|
-
this.inputMode = 'desktop';
|
|
29
|
-
/**
|
|
30
|
-
* If `true` the recording will be sent as a message immediately after the recording is completed.
|
|
31
|
-
* If `false`, the recording will added to the attachment preview, and users can continue composing the message.
|
|
32
|
-
*/
|
|
33
|
-
this.sendVoiceRecordingImmediately = true;
|
|
34
|
-
/**
|
|
35
|
-
* Add custom autocomplete configurations to the message input
|
|
36
|
-
*
|
|
37
|
-
* Only works when using StreamAutocompleteTextareaModule
|
|
38
|
-
*/
|
|
39
|
-
this.customAutocompletes$ = new BehaviorSubject([]);
|
|
40
|
-
}
|
|
41
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageInputConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
42
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageInputConfigService, providedIn: 'root' }); }
|
|
43
|
-
}
|
|
44
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: MessageInputConfigService, decorators: [{
|
|
45
|
-
type: Injectable,
|
|
46
|
-
args: [{
|
|
47
|
-
providedIn: 'root',
|
|
48
|
-
}]
|
|
49
|
-
}], ctorParameters: () => [] });
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1pbnB1dC1jb25maWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWlucHV0L21lc3NhZ2UtaW5wdXQtY29uZmlnLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUd2Qzs7R0FFRztBQUlILE1BQU0sT0FBTyx5QkFBeUI7SUErQ3BDO1FBOUNBOztXQUVHO1FBQ0gsd0JBQW1CLEdBQXdCLElBQUksQ0FBQztRQUNoRDs7V0FFRztRQUNILHVCQUFrQixHQUF3QixJQUFJLENBQUM7UUFDL0M7O1dBRUc7UUFDSCxnQ0FBMkIsR0FBd0IsSUFBSSxDQUFDO1FBQ3hEOztXQUVHO1FBQ0gsaUJBQVksR0FBMEMsU0FBUyxDQUFDO1FBQ2hFOztXQUVHO1FBQ0gsY0FBUyxHQUF5QixTQUFTLENBQUM7UUFDNUM7OztXQUdHO1FBQ0gsa0NBQTZCLEdBQUcsSUFBSSxDQUFDO1FBZXJDOzs7O1dBSUc7UUFDSCx5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsRUFBRSxDQUFDLENBQUM7SUFFdEQsQ0FBQzs4R0EvQ0wseUJBQXlCO2tIQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7MkZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lc3NhZ2VJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vbWVzc2FnZS1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDdXN0b21BdXRvY29tcGxldGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBNZXNzYWdlSW5wdXRDb25maWdTZXJ2aWNlYCBpcyB1c2VkIHRvIGtlZXAgYSBjb25zaXN0ZW50IGNvbmZpZ3VyYXRpb24gYW1vbmcgdGhlIGRpZmZlcmVudCBbYE1lc3NhZ2VJbnB1dGBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29tcG9uZW50cy9NZXNzYWdlSW5wdXRDb21wb25lbnQvKSBjb21wb25lbnRzIGlmIHlvdXIgVUkgaGFzIG1vcmUgdGhhbiBvbmUgaW5wdXQgY29tcG9uZW50LlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZSB7XG4gIC8qKlxuICAgKiBJZiBmaWxlIHVwbG9hZCBpcyBlbmFibGVkLCB0aGUgdXNlciBjYW4gb3BlbiBhIGZpbGUgc2VsZWN0b3IgZnJvbSB0aGUgaW5wdXQuIFBsZWFzZSBub3RlIHRoYXQgdGhlIHVzZXIgYWxzbyBuZWVkcyB0byBoYXZlIHRoZSBuZWNlc3NhcnkgW2NoYW5uZWwgY2FwYWJpbGl0eV0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLykuXG4gICAqL1xuICBpc0ZpbGVVcGxvYWRFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZTtcbiAgLyoqXG4gICAqIElmIHRydWUsIHVzZXJzIGNhbiBtZW50aW9uIG90aGVyIHVzZXJzIGluIG1lc3NhZ2VzLiBZb3UgYWxzbyBbbmVlZCB0byB1c2UgdGhlIGBBdXRvY29tcGxldGVUZXh0YXJlYWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29uY2VwdHMvb3B0LWluLWFyY2hpdGVjdHVyZS8pIGZvciB0aGlzIGZlYXR1cmUgdG8gd29yay5cbiAgICovXG4gIGFyZU1lbnRpb25zRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG4gIC8qKlxuICAgKiBJZiBgZmFsc2VgLCB1c2VycyBjYW4gb25seSB1cGxvYWQgb25lIGF0dGFjaG1lbnQgcGVyIG1lc3NhZ2VcbiAgICovXG4gIGlzTXVsdGlwbGVGaWxlVXBsb2FkRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG4gIC8qKlxuICAgKiBUaGUgc2NvcGUgZm9yIHVzZXIgbWVudGlvbnMsIGVpdGhlciBtZW1iZXJzIG9mIHRoZSBjdXJyZW50IGNoYW5uZWwgb2YgbWVtYmVycyBvZiB0aGUgYXBwbGljYXRpb25cbiAgICovXG4gIG1lbnRpb25TY29wZTogJ2NoYW5uZWwnIHwgJ2FwcGxpY2F0aW9uJyB8IHVuZGVmaW5lZCA9ICdjaGFubmVsJztcbiAgLyoqXG4gICAqIEluIGBkZXNrdG9wYCBtb2RlIHRoZSBgRW50ZXJgIGtleSB3aWxsIHRyaWdnZXIgbWVzc2FnZSBzZW5kaW5nLCBpbiBgbW9iaWxlYCBtb2RlIHRoZSBgRW50ZXJgIGtleSB3aWxsIGluc2VydCBhIG5ldyBsaW5lIHRvIHRoZSBtZXNzYWdlIGlucHV0LlxuICAgKi9cbiAgaW5wdXRNb2RlOiAnZGVza3RvcCcgfCAnbW9iaWxlJyA9ICdkZXNrdG9wJztcbiAgLyoqXG4gICAqIElmIGB0cnVlYCB0aGUgcmVjb3JkaW5nIHdpbGwgYmUgc2VudCBhcyBhIG1lc3NhZ2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHJlY29yZGluZyBpcyBjb21wbGV0ZWQuXG4gICAqIElmIGBmYWxzZWAsIHRoZSByZWNvcmRpbmcgd2lsbCBhZGRlZCB0byB0aGUgYXR0YWNobWVudCBwcmV2aWV3LCBhbmQgdXNlcnMgY2FuIGNvbnRpbnVlIGNvbXBvc2luZyB0aGUgbWVzc2FnZS5cbiAgICovXG4gIHNlbmRWb2ljZVJlY29yZGluZ0ltbWVkaWF0ZWx5ID0gdHJ1ZTtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBtZXNzYWdlIGlucHV0J3MgZGVmYXVsdCBldmVudCBoYW5kbGVyIGZvciBbcGFzdGUgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9wYXN0ZV9ldmVudClcbiAgICpcbiAgICogVGhlIGV2ZW50IGhhbmRsZXIgd2lsbCByZWNlaXZlIHRoZSBldmVudCBvYmplY3QsIGFuZCB0aGUgW21lc3NhZ2UgaW5wdXQgY29tcG9uZW50XSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL2NvbXBvbmVudHMvTWVzc2FnZUlucHV0Q29tcG9uZW50KS5cbiAgICpcbiAgICogWW91IGNhbiB1c2UgdGhlIHB1YmxpYyBBUEkgb2YgdGhlIG1lc3NhZ2UgaW5wdXQgY29tcG9uZW50IHRvIHVwZGF0ZSB0aGUgY29tcG9zZXIuIFR5cGljYWxseSB5b3Ugd2FudCB0byB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dCBhbmQvb3IgYXR0YWNobWVudHMsIHRoaXMgaXMgaG93IHlvdSBjYW4gZG8gdGhlc2U6XG4gICAqIC0gQ2hhbmdlIG1lc3NhZ2UgdGV4dDogYGlucHV0Q29tcG9uZW50LnRleHRhcmVhVmFsdWUgPSAnPG5ldyB2YWx1ZT4nYFxuICAgKiAtIFVwbG9hZCBmaWxlIG9yIGltYWdlIGF0dGFjaG1lbnRzOiBgaW5wdXRDb21wb25lbnQuYXR0YWNobWVudFNlcnZpY2UuZmlsZXNTZWxlY3RlZCg8ZmlsZXM+KWBcbiAgICogLSBVcGxvYWQgY3VzdG9tIGF0dGFjaG1lbnRzOiBgaW5wdXRDb21wb25lbnQuYXR0YWNobWVudFNlcnZpY2UuY3VzdG9tQXR0YWNobWVudHMkLm5leHQoPGN1c3RvbSBhdHRhY2htZW50cz4pYFxuICAgKi9cbiAgY3VzdG9tUGFzdGVFdmVudEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IENsaXBib2FyZEV2ZW50LFxuICAgIGlucHV0Q29tcG9uZW50OiBNZXNzYWdlSW5wdXRDb21wb25lbnQsXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEFkZCBjdXN0b20gYXV0b2NvbXBsZXRlIGNvbmZpZ3VyYXRpb25zIHRvIHRoZSBtZXNzYWdlIGlucHV0XG4gICAqXG4gICAqIE9ubHkgd29ya3Mgd2hlbiB1c2luZyBTdHJlYW1BdXRvY29tcGxldGVUZXh0YXJlYU1vZHVsZVxuICAgKi9cbiAgY3VzdG9tQXV0b2NvbXBsZXRlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEN1c3RvbUF1dG9jb21wbGV0ZVtdPihbXSk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxufVxuIl19
|