@rivet-health/design-system 31.0.1 → 31.2.0

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.
@@ -0,0 +1,370 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../../overlay/callout/callout.component";
5
+ /**
6
+ * A rich text input component that allows users to type text and mention other users by typing `@` followed by a name.
7
+ * Uses a `contenteditable` div instead of a traditional input/textarea.
8
+ *
9
+ * ## Data Model
10
+ * Works with a structured content model rather than plain strings:
11
+ * - **Input/Output**: `ContentItem[]` - an array of content pieces
12
+ * - **ContentItem types**:
13
+ * - `UserMention`: `{ type: 'mention', id: number, name: string }`
14
+ * - `Text`: `{ type: 'text', text: string }`
15
+ *
16
+ * ## Rendering Flow
17
+ * 1. **Content → DOM**: `renderContent()` converts the content input array to HTML. Mentions become `<span>` elements with `data-id` and `data-type` attributes. Text is escaped and rendered as plain text.
18
+ * 2. **DOM → Content**: `domToContentItems()` parses the DOM back into `ContentItem[]`, walking through child nodes extracting mentions and text. Emitted via `contentChange` event on input.
19
+ *
20
+ * ## User Interaction
21
+ * - **Typing `@` triggers mentions**: Monitors input for `@` character, extracts text after `@` (up to first space) as search text, positions a callout dropdown at the cursor location
22
+ * - **Keyboard navigation**: Arrow keys navigate filtered users list, Enter selects highlighted user, Escape closes mentions dropdown
23
+ * - **Selecting a mention**: Deletes the `@` and search text from DOM, creates a non-editable `<span>` element for the mention, inserts at cursor position, repositions cursor after the mention
24
+ *
25
+ * ## Technical Details
26
+ * - **Cursor management**: Uses Selection API and Range objects to track/manipulate cursor position
27
+ * - **Text extraction**: `getTextBeforeCursor()` gets plain text before cursor, treating mention spans as `@name`
28
+ * - **Character position mapping**: `findDomPositionAtCharIndex()` converts character indices to DOM node positions using TreeWalker
29
+ * - **Change detection**: Uses OnPush with manual `markForCheck()` calls
30
+ * - **Readonly mode**: Swaps between contenteditable and non-editable divs, styles mentions differently
31
+ *
32
+ * ## State
33
+ * - `mentionsVisible`: controls dropdown visibility
34
+ * - `mentionSearchText`: current filter text after @
35
+ * - `mentionAnchor`: DOMRect for positioning dropdown
36
+ * - `selectedUserIndex`: keyboard navigation state
37
+ * - `savedRange`: preserves cursor position for click-based selection
38
+ */
39
+ export class MentionsInputComponent {
40
+ constructor(cdr) {
41
+ this.cdr = cdr;
42
+ this.content = [];
43
+ this.users = [];
44
+ this.readonly = false;
45
+ this.placeholder = 'Add a comment';
46
+ this.contentChange = new EventEmitter();
47
+ this.mentionsVisible = false;
48
+ this.mentionSearchText = '';
49
+ this.mentionAnchor = null;
50
+ this.selectedUserIndex = 0;
51
+ this.savedRange = null;
52
+ }
53
+ ngAfterViewInit() {
54
+ this.renderContent();
55
+ }
56
+ //DAHNE NOTE - ngOnChanges is called whenever any @Input() property changes, where the changed input contains information about those changes
57
+ //So if @Input() content changes and it's not the first change (the first render is handled by ngAfterViewInit()), we render the content
58
+ ngOnChanges(changes) {
59
+ if (changes['content'] && !changes['content'].firstChange) {
60
+ this.renderContent();
61
+ }
62
+ }
63
+ renderContent() {
64
+ //This is necessary because the @ViewChild reference isn't available until after the view initializes
65
+ if (!this.inputElement?.nativeElement) {
66
+ return;
67
+ }
68
+ const html = this.content
69
+ .map(item => MentionsInputComponent.contentItemToHtml(item, this.readonly))
70
+ .join('');
71
+ this.inputElement.nativeElement.innerHTML = html;
72
+ }
73
+ static contentItemToHtml(item, readonly) {
74
+ switch (item.type) {
75
+ //DAHNE TODO - maybe we escape HTML here too? Although I don't think it will be possible for users to input an XSS attack in item.name
76
+ case 'mention':
77
+ return `<span class="${readonly ? 'readonly-mention' : 'mention'}" data-id="${item.id}" data-type="mention" contenteditable="false">@${MentionsInputComponent.escapeHtml(item.name)}</span>`;
78
+ case 'text':
79
+ return MentionsInputComponent.escapeHtml(item.text);
80
+ }
81
+ }
82
+ static escapeHtml(text) {
83
+ const div = document.createElement('div');
84
+ div.textContent = text;
85
+ return div.innerHTML;
86
+ }
87
+ onInput() {
88
+ this.checkForMentionTrigger();
89
+ this.emitContentChange();
90
+ }
91
+ onKeyDown(event) {
92
+ if (!this.mentionsVisible) {
93
+ return;
94
+ }
95
+ const filteredUsers = this.getFilteredUsers();
96
+ switch (event.key) {
97
+ case 'ArrowDown':
98
+ event.preventDefault();
99
+ this.selectedUserIndex = Math.min(this.selectedUserIndex + 1, filteredUsers.length - 1);
100
+ this.cdr.markForCheck();
101
+ break;
102
+ case 'ArrowUp':
103
+ event.preventDefault();
104
+ this.selectedUserIndex = Math.max(this.selectedUserIndex - 1, 0);
105
+ this.cdr.markForCheck();
106
+ break;
107
+ case 'Enter':
108
+ event.preventDefault();
109
+ if (filteredUsers[this.selectedUserIndex]) {
110
+ this.selectUser(filteredUsers[this.selectedUserIndex]);
111
+ }
112
+ break;
113
+ case 'Tab':
114
+ event.preventDefault();
115
+ if (filteredUsers[this.selectedUserIndex]) {
116
+ this.selectUser(filteredUsers[this.selectedUserIndex]);
117
+ }
118
+ break;
119
+ case 'Escape':
120
+ event.preventDefault();
121
+ this.closeMentions();
122
+ break;
123
+ }
124
+ }
125
+ checkForMentionTrigger() {
126
+ const selection = window.getSelection();
127
+ if (!selection || !selection.rangeCount || !this.inputElement) {
128
+ return;
129
+ }
130
+ const range = selection.getRangeAt(0);
131
+ const textBeforeCursor = this.getTextBeforeCursor(range);
132
+ const lastAtIndex = textBeforeCursor.lastIndexOf('@');
133
+ if (lastAtIndex === -1) {
134
+ this.closeMentions();
135
+ return;
136
+ }
137
+ //If we allow for a single space, we need to check to make sure that this logic won't pick up previous
138
+ //'@' mentions and keep the mention dropdown open
139
+ const atPosition = this.findDomPositionAtCharIndex(lastAtIndex);
140
+ if (atPosition && this.isInsideMentionSpan(atPosition.node)) {
141
+ this.closeMentions();
142
+ return;
143
+ }
144
+ const textAfterAt = textBeforeCursor.substring(lastAtIndex + 1);
145
+ const char1 = textAfterAt.charCodeAt(0);
146
+ const charN = textAfterAt.charCodeAt(textAfterAt.length - 1);
147
+ const charN_1 = textAfterAt.charCodeAt(textAfterAt.length - 2);
148
+ //These are the Unicode representations of normal space and non-breaking space
149
+ const unicodeSpaceChars = [32, 160];
150
+ // Close mentions if:
151
+ // - There's a double space (allows single spaces in the middle of search)
152
+ // - The text starts with a space (typing "@ " should not trigger mentions)
153
+ if (textAfterAt.includes(' ') ||
154
+ textAfterAt.startsWith(' ') ||
155
+ char1 == 160 ||
156
+ (unicodeSpaceChars.includes(charN) && unicodeSpaceChars.includes(charN_1))) {
157
+ this.closeMentions();
158
+ return;
159
+ }
160
+ // Trim trailing/leading spaces from search text while preserving spaces in the middle
161
+ this.mentionSearchText = textAfterAt.trim();
162
+ this.mentionsVisible = true;
163
+ this.selectedUserIndex = 0;
164
+ //Save the current range for later restoration (needed for click selection)
165
+ //DAHNE NOTE - this is annoyingly neceessary because clicks and enter keys have different effects on the
166
+ //focus of the contenteditable div
167
+ this.savedRange = range.cloneRange();
168
+ //This is how we calcluate the callout position
169
+ const cursorRect = range.getBoundingClientRect();
170
+ this.mentionAnchor = cursorRect;
171
+ this.cdr.markForCheck();
172
+ }
173
+ getTextBeforeCursor(range) {
174
+ const clonedRange = range.cloneRange();
175
+ //We select all of the input contents, and then move the end point to the current cursor position
176
+ clonedRange.selectNodeContents(this.inputElement.nativeElement);
177
+ clonedRange.setEnd(range.endContainer, range.endOffset);
178
+ //Create a temporary div so that we can extract text content from it
179
+ const fragment = clonedRange.cloneContents();
180
+ const div = document.createElement('div');
181
+ div.appendChild(fragment);
182
+ //Get text content, replacing mention spans with @name
183
+ return div.textContent || '';
184
+ }
185
+ getFilteredUsers() {
186
+ const users = !this.mentionSearchText
187
+ ? this.users
188
+ : this.users.filter(user => user.name
189
+ .toLowerCase()
190
+ .includes(this.mentionSearchText.toLowerCase()));
191
+ return users.slice().sort((a, b) => a.name.localeCompare(b.name));
192
+ }
193
+ selectUser(user) {
194
+ if (!this.inputElement) {
195
+ return;
196
+ }
197
+ //This gets DOM info from user (e.g. highlighted selections, and cursor position)
198
+ const selection = window.getSelection();
199
+ if (!selection) {
200
+ return;
201
+ }
202
+ // Restore the saved range if available (needed when selecting via click)
203
+ if (this.savedRange) {
204
+ selection.removeAllRanges();
205
+ selection.addRange(this.savedRange);
206
+ }
207
+ if (!selection.rangeCount) {
208
+ return;
209
+ }
210
+ // Delete the "@" and search text
211
+ this.deleteAtMentionSearch();
212
+ //DAHNE NOTE - this would ideally be the same as contentItemToHTML, but we need an actual element reference here in order to append it to the DOM
213
+ const mentionSpan = document.createElement('span');
214
+ mentionSpan.className = this.readonly ? 'readonly-mention' : 'mention';
215
+ mentionSpan.setAttribute('data-id', String(user.id));
216
+ mentionSpan.setAttribute('data-type', 'mention');
217
+ mentionSpan.setAttribute('contenteditable', 'false');
218
+ mentionSpan.textContent = `@${user.name}`;
219
+ //Find current cursor position
220
+ const newRange = window.getSelection()?.getRangeAt(0);
221
+ if (newRange) {
222
+ newRange.insertNode(mentionSpan);
223
+ //Set the range start and end to the same location (rendering the cursor in the right position)
224
+ newRange.setStartAfter(mentionSpan);
225
+ newRange.setEndAfter(mentionSpan);
226
+ selection.removeAllRanges();
227
+ //Apply this range to the DOM
228
+ selection.addRange(newRange);
229
+ }
230
+ this.closeMentions();
231
+ this.emitContentChange();
232
+ }
233
+ deleteAtMentionSearch() {
234
+ const selection = window.getSelection();
235
+ if (!selection || !selection.rangeCount) {
236
+ return;
237
+ }
238
+ //This represents the current position of the cursor
239
+ const cursorRange = selection.getRangeAt(0);
240
+ //This will return all of the raw text (HTML-stripped) before the cursor
241
+ const textBeforeCursor = this.getTextBeforeCursor(cursorRange);
242
+ //We do that^ so that we can find the correct index of the most recent '@'
243
+ const lastAtIndex = textBeforeCursor.lastIndexOf('@');
244
+ if (lastAtIndex === -1) {
245
+ return;
246
+ }
247
+ //Knowing the position of the last '@' character we can now find the actual DOM node + offset where "@" lives
248
+ const atPosition = this.findDomPositionAtCharIndex(lastAtIndex);
249
+ if (!atPosition) {
250
+ return;
251
+ }
252
+ // Create range from "@" to cursor and delete it
253
+ const deleteRange = document.createRange();
254
+ deleteRange.setStart(atPosition.node, atPosition.offset);
255
+ deleteRange.setEnd(cursorRange.endContainer, cursorRange.endOffset);
256
+ deleteRange.deleteContents();
257
+ }
258
+ isInsideMentionSpan(node) {
259
+ let currentNode = node;
260
+ while (currentNode && currentNode !== this.inputElement?.nativeElement) {
261
+ if (currentNode.nodeType === Node.ELEMENT_NODE &&
262
+ currentNode.getAttribute('data-type') === 'mention') {
263
+ return true;
264
+ }
265
+ currentNode = currentNode.parentNode;
266
+ }
267
+ return false;
268
+ }
269
+ //This will go text node by node looking for the
270
+ //@ mention and give its position in the context of that node
271
+ findDomPositionAtCharIndex(charIndex) {
272
+ if (!this.inputElement) {
273
+ return null;
274
+ }
275
+ // Walk through all text nodes in the input, counting characters
276
+ const treeWalker = document.createTreeWalker(this.inputElement.nativeElement, NodeFilter.SHOW_TEXT, null);
277
+ let charCount = 0;
278
+ while (treeWalker.nextNode()) {
279
+ const node = treeWalker.currentNode;
280
+ const text = node.textContent || '';
281
+ // Check if our target character is in this text node
282
+ if (charCount + text.length > charIndex) {
283
+ // The character at charIndex is in this node
284
+ const offsetInNode = charIndex - charCount;
285
+ return { node, offset: offsetInNode };
286
+ }
287
+ charCount += text.length;
288
+ }
289
+ return null;
290
+ }
291
+ closeMentions() {
292
+ this.mentionsVisible = false;
293
+ this.mentionSearchText = '';
294
+ this.mentionAnchor = null;
295
+ this.selectedUserIndex = 0;
296
+ this.savedRange = null;
297
+ this.cdr.markForCheck();
298
+ }
299
+ emitContentChange() {
300
+ if (!this.inputElement) {
301
+ return;
302
+ }
303
+ const contentItems = this.domToContentItems();
304
+ this.contentChange.emit(contentItems);
305
+ }
306
+ domToContentItems() {
307
+ if (!this.inputElement?.nativeElement) {
308
+ return [];
309
+ }
310
+ const items = [];
311
+ const childNodes = this.inputElement.nativeElement.childNodes;
312
+ for (const node of Array.from(childNodes)) {
313
+ if (node.nodeType === Node.ELEMENT_NODE) {
314
+ const element = node;
315
+ if (element.tagName === 'SPAN' &&
316
+ element.getAttribute('data-type') === 'mention') {
317
+ const id = Number(element.getAttribute('data-id'));
318
+ const name = element.textContent?.replace('@', '') || '';
319
+ items.push({ type: 'mention', id, name });
320
+ }
321
+ }
322
+ else if (node.nodeType === Node.TEXT_NODE) {
323
+ const text = node.textContent || '';
324
+ if (text) {
325
+ items.push({ type: 'text', text });
326
+ }
327
+ }
328
+ }
329
+ return items;
330
+ }
331
+ onCalloutClose() {
332
+ this.closeMentions();
333
+ }
334
+ }
335
+ MentionsInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MentionsInputComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
336
+ MentionsInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MentionsInputComponent, selector: "riv-mentions-input", inputs: { content: "content", users: "users", readonly: "readonly", placeholder: "placeholder" }, outputs: { contentChange: "contentChange" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"mentions-container\" #container>\n <div\n *ngIf=\"!readonly\"\n #input\n class=\"text-content editable\"\n contenteditable=\"true\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n ></div>\n\n <div *ngIf=\"readonly\" #input class=\"text-content\"></div>\n\n <riv-callout\n *ngIf=\"!readonly && mentionsVisible && mentionAnchor\"\n [anchor]=\"mentionAnchor\"\n [isModal]=\"false\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n (close)=\"onCalloutClose()\"\n >\n <div class=\"mentions-content\">\n <div class=\"mentions-header\">Mention someone</div>\n <ul class=\"mentions-list\">\n <li\n *ngFor=\"let user of getFilteredUsers(); let i = index\"\n [class.selected]=\"i === selectedUserIndex\"\n >\n <button (click)=\"selectUser(user)\">{{ user.name }}</button>\n </li>\n </ul>\n </div>\n </riv-callout>\n</div>\n", styles: [".mentions-container{position:relative;width:100%}.mentions-input{width:100%;min-height:100px;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);font:var(--input-medium);color:var(--type-light-high-contrast);padding:var(--size-large);overflow-y:auto;white-space:pre-wrap;word-wrap:break-word}.mentions-input:empty:before{content:attr(data-placeholder);color:var(--type-light-disabled);pointer-events:none}.mentions-input:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.mentions-input[contenteditable=false]{color:var(--type-light-disabled);background-color:var(--surface-light-1);cursor:not-allowed}span.mention{color:var(--type-light-link);font-weight:var(--font-weight-heavy)}span.readonly-mention{font-weight:var(--font-weight-heavy)}.mentions-input.warning{border-color:var(--surface-dark-caution)}.mentions-input.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.mentions-input.large{font:var(--input-large);padding:var(--size-medium)}.mentions-list{list-style:none;margin:0;padding:0;max-height:calc(var(--base-grid-size) * 50);overflow-y:auto;display:flex;flex-direction:column;gap:var(--size-xxsmall)}.mentions-list li{padding:var(--size-small) var(--size-small);border-radius:var(--border-radius-medium);cursor:pointer;transition:background-color .2s;font:var(--input-medium)}.mentions-list li:hover,.mentions-list li.selected{background-color:var(--surface-light-2)}.mentions-content{max-height:50vh;min-width:calc(var(--base-grid-size) * 62);max-width:50vw;padding:var(--size-large);display:flex;flex-direction:column}.mentions-header{padding:var(--size-small) var(--size-small);font:var(--input-medium);color:var(--type-light-low-contrast)}.text-content{width:100%;min-height:9em;border-radius:var(--border-radius-small);font:var(--input-medium);color:var(--type-light-high-contrast);padding:var(--size-large);resize:vertical}.editable{border:var(--border-width) solid var(--border-light)}.text-content::placeholder{color:var(--type-light-disabled)}.text-content.editable[data-placeholder]:empty:before{content:attr(data-placeholder);color:var(--type-light-disabled)}.text-content:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.text-content:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.text-content.warning{border-color:var(--surface-dark-caution)}.text-content.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.text-content.large{font:var(--input-large);padding:var(--size-medium)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
337
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MentionsInputComponent, decorators: [{
338
+ type: Component,
339
+ args: [{ selector: 'riv-mentions-input', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mentions-container\" #container>\n <div\n *ngIf=\"!readonly\"\n #input\n class=\"text-content editable\"\n contenteditable=\"true\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n ></div>\n\n <div *ngIf=\"readonly\" #input class=\"text-content\"></div>\n\n <riv-callout\n *ngIf=\"!readonly && mentionsVisible && mentionAnchor\"\n [anchor]=\"mentionAnchor\"\n [isModal]=\"false\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n (close)=\"onCalloutClose()\"\n >\n <div class=\"mentions-content\">\n <div class=\"mentions-header\">Mention someone</div>\n <ul class=\"mentions-list\">\n <li\n *ngFor=\"let user of getFilteredUsers(); let i = index\"\n [class.selected]=\"i === selectedUserIndex\"\n >\n <button (click)=\"selectUser(user)\">{{ user.name }}</button>\n </li>\n </ul>\n </div>\n </riv-callout>\n</div>\n", styles: [".mentions-container{position:relative;width:100%}.mentions-input{width:100%;min-height:100px;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);font:var(--input-medium);color:var(--type-light-high-contrast);padding:var(--size-large);overflow-y:auto;white-space:pre-wrap;word-wrap:break-word}.mentions-input:empty:before{content:attr(data-placeholder);color:var(--type-light-disabled);pointer-events:none}.mentions-input:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.mentions-input[contenteditable=false]{color:var(--type-light-disabled);background-color:var(--surface-light-1);cursor:not-allowed}span.mention{color:var(--type-light-link);font-weight:var(--font-weight-heavy)}span.readonly-mention{font-weight:var(--font-weight-heavy)}.mentions-input.warning{border-color:var(--surface-dark-caution)}.mentions-input.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.mentions-input.large{font:var(--input-large);padding:var(--size-medium)}.mentions-list{list-style:none;margin:0;padding:0;max-height:calc(var(--base-grid-size) * 50);overflow-y:auto;display:flex;flex-direction:column;gap:var(--size-xxsmall)}.mentions-list li{padding:var(--size-small) var(--size-small);border-radius:var(--border-radius-medium);cursor:pointer;transition:background-color .2s;font:var(--input-medium)}.mentions-list li:hover,.mentions-list li.selected{background-color:var(--surface-light-2)}.mentions-content{max-height:50vh;min-width:calc(var(--base-grid-size) * 62);max-width:50vw;padding:var(--size-large);display:flex;flex-direction:column}.mentions-header{padding:var(--size-small) var(--size-small);font:var(--input-medium);color:var(--type-light-low-contrast)}.text-content{width:100%;min-height:9em;border-radius:var(--border-radius-small);font:var(--input-medium);color:var(--type-light-high-contrast);padding:var(--size-large);resize:vertical}.editable{border:var(--border-width) solid var(--border-light)}.text-content::placeholder{color:var(--type-light-disabled)}.text-content.editable[data-placeholder]:empty:before{content:attr(data-placeholder);color:var(--type-light-disabled)}.text-content:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.text-content:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.text-content.warning{border-color:var(--surface-dark-caution)}.text-content.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.text-content.large{font:var(--input-large);padding:var(--size-medium)}\n"] }]
340
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { content: [{
341
+ type: Input
342
+ }], users: [{
343
+ type: Input
344
+ }], readonly: [{
345
+ type: Input
346
+ }], placeholder: [{
347
+ type: Input
348
+ }], contentChange: [{
349
+ type: Output
350
+ }], inputElement: [{
351
+ type: ViewChild,
352
+ args: ['input', { static: false }]
353
+ }] } });
354
+ (function (MentionsInputComponent) {
355
+ MentionsInputComponent.ContentTypes = ['mention', 'text'];
356
+ function contentToPlainText(content) {
357
+ return content
358
+ .map(item => {
359
+ switch (item.type) {
360
+ case 'mention':
361
+ return `@${item.name}`;
362
+ case 'text':
363
+ return item.text;
364
+ }
365
+ })
366
+ .join('');
367
+ }
368
+ MentionsInputComponent.contentToPlainText = contentToPlainText;
369
+ })(MentionsInputComponent || (MentionsInputComponent = {}));
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbnMtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvaW5wdXQvbWVudGlvbnMtaW5wdXQvbWVudGlvbnMtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvaW5wdXQvbWVudGlvbnMtaW5wdXQvbWVudGlvbnMtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQzs7OztBQUV2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBUUgsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxZQUE2QixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUUxQyxZQUFPLEdBQXlDLEVBQUUsQ0FBQztRQUNuRCxVQUFLLEdBQWtDLEVBQUUsQ0FBQztRQUMxQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGdCQUFXLEdBQVcsZUFBZSxDQUFDO1FBRTVCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBRWhELENBQUM7UUFLSixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixzQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDdkIsa0JBQWEsR0FBbUIsSUFBSSxDQUFDO1FBQ3JDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUNkLGVBQVUsR0FBaUIsSUFBSSxDQUFDO0lBbEJjLENBQUM7SUFvQnZELGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELDZJQUE2STtJQUM3SSx3SUFBd0k7SUFDeEksV0FBVyxDQUFDLE9BQXNCO1FBQ2hD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QUtVLFlBQVk7c0JBRDVCLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7QUFzWHZDLFdBQWlCLHNCQUFzQjtJQUN4QixtQ0FBWSxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBVSxDQUFDO0lBY3pELFNBQWdCLGtCQUFrQixDQUFDLE9BQXNCO1FBQ3ZELE9BQU8sT0FBTzthQUNYLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNWLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxTQUFTO29CQUNaLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssTUFBTTtvQkFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDcEI7UUFDSCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDO0lBWGUseUNBQWtCLHFCQVdqQyxDQUFBO0FBQ0gsQ0FBQyxFQTNCZ0Isc0JBQXNCLEtBQXRCLHNCQUFzQixRQTJCdEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEEgcmljaCB0ZXh0IGlucHV0IGNvbXBvbmVudCB0aGF0IGFsbG93cyB1c2VycyB0byB0eXBlIHRleHQgYW5kIG1lbnRpb24gb3RoZXIgdXNlcnMgYnkgdHlwaW5nIGBAYCBmb2xsb3dlZCBieSBhIG5hbWUuXG4gKiBVc2VzIGEgYGNvbnRlbnRlZGl0YWJsZWAgZGl2IGluc3RlYWQgb2YgYSB0cmFkaXRpb25hbCBpbnB1dC90ZXh0YXJlYS5cbiAqXG4gKiAjIyBEYXRhIE1vZGVsXG4gKiBXb3JrcyB3aXRoIGEgc3RydWN0dXJlZCBjb250ZW50IG1vZGVsIHJhdGhlciB0aGFuIHBsYWluIHN0cmluZ3M6XG4gKiAtICoqSW5wdXQvT3V0cHV0Kio6IGBDb250ZW50SXRlbVtdYCAtIGFuIGFycmF5IG9mIGNvbnRlbnQgcGllY2VzXG4gKiAtICoqQ29udGVudEl0ZW0gdHlwZXMqKjpcbiAqICAgLSBgVXNlck1lbnRpb25gOiBgeyB0eXBlOiAnbWVudGlvbicsIGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZyB9YFxuICogICAtIGBUZXh0YDogYHsgdHlwZTogJ3RleHQnLCB0ZXh0OiBzdHJpbmcgfWBcbiAqXG4gKiAjIyBSZW5kZXJpbmcgRmxvd1xuICogMS4gKipDb250ZW50IOKGkiBET00qKjogYHJlbmRlckNvbnRlbnQoKWAgY29udmVydHMgdGhlIGNvbnRlbnQgaW5wdXQgYXJyYXkgdG8gSFRNTC4gTWVudGlvbnMgYmVjb21lIGA8c3Bhbj5gIGVsZW1lbnRzIHdpdGggYGRhdGEtaWRgIGFuZCBgZGF0YS10eXBlYCBhdHRyaWJ1dGVzLiBUZXh0IGlzIGVzY2FwZWQgYW5kIHJlbmRlcmVkIGFzIHBsYWluIHRleHQuXG4gKiAyLiAqKkRPTSDihpIgQ29udGVudCoqOiBgZG9tVG9Db250ZW50SXRlbXMoKWAgcGFyc2VzIHRoZSBET00gYmFjayBpbnRvIGBDb250ZW50SXRlbVtdYCwgd2Fsa2luZyB0aHJvdWdoIGNoaWxkIG5vZGVzIGV4dHJhY3RpbmcgbWVudGlvbnMgYW5kIHRleHQuIEVtaXR0ZWQgdmlhIGBjb250ZW50Q2hhbmdlYCBldmVudCBvbiBpbnB1dC5cbiAqXG4gKiAjIyBVc2VyIEludGVyYWN0aW9uXG4gKiAtICoqVHlwaW5nIGBAYCB0cmlnZ2VycyBtZW50aW9ucyoqOiBNb25pdG9ycyBpbnB1dCBmb3IgYEBgIGNoYXJhY3RlciwgZXh0cmFjdHMgdGV4dCBhZnRlciBgQGAgKHVwIHRvIGZpcnN0IHNwYWNlKSBhcyBzZWFyY2ggdGV4dCwgcG9zaXRpb25zIGEgY2FsbG91dCBkcm9wZG93biBhdCB0aGUgY3Vyc29yIGxvY2F0aW9uXG4gKiAtICoqS2V5Ym9hcmQgbmF2aWdhdGlvbioqOiBBcnJvdyBrZXlzIG5hdmlnYXRlIGZpbHRlcmVkIHVzZXJzIGxpc3QsIEVudGVyIHNlbGVjdHMgaGlnaGxpZ2h0ZWQgdXNlciwgRXNjYXBlIGNsb3NlcyBtZW50aW9ucyBkcm9wZG93blxuICogLSAqKlNlbGVjdGluZyBhIG1lbnRpb24qKjogRGVsZXRlcyB0aGUgYEBgIGFuZCBzZWFyY2ggdGV4dCBmcm9tIERPTSwgY3JlYXRlcyBhIG5vbi1lZGl0YWJsZSBgPHNwYW4+YCBlbGVtZW50IGZvciB0aGUgbWVudGlvbiwgaW5zZXJ0cyBhdCBjdXJzb3IgcG9zaXRpb24sIHJlcG9zaXRpb25zIGN1cnNvciBhZnRlciB0aGUgbWVudGlvblxuICpcbiAqICMjIFRlY2huaWNhbCBEZXRhaWxzXG4gKiAtICoqQ3Vyc29yIG1hbmFnZW1lbnQqKjogVXNlcyBTZWxlY3Rpb24gQVBJIGFuZCBSYW5nZSBvYmplY3RzIHRvIHRyYWNrL21hbmlwdWxhdGUgY3Vyc29yIHBvc2l0aW9uXG4gKiAtICoqVGV4dCBleHRyYWN0aW9uKio6IGBnZXRUZXh0QmVmb3JlQ3Vyc29yKClgIGdldHMgcGxhaW4gdGV4dCBiZWZvcmUgY3Vyc29yLCB0cmVhdGluZyBtZW50aW9uIHNwYW5zIGFzIGBAbmFtZWBcbiAqIC0gKipDaGFyYWN0ZXIgcG9zaXRpb24gbWFwcGluZyoqOiBgZmluZERvbVBvc2l0aW9uQXRDaGFySW5kZXgoKWAgY29udmVydHMgY2hhcmFjdGVyIGluZGljZXMgdG8gRE9NIG5vZGUgcG9zaXRpb25zIHVzaW5nIFRyZWVXYWxrZXJcbiAqIC0gKipDaGFuZ2UgZGV0ZWN0aW9uKio6IFVzZXMgT25QdXNoIHdpdGggbWFudWFsIGBtYXJrRm9yQ2hlY2soKWAgY2FsbHNcbiAqIC0gKipSZWFkb25seSBtb2RlKio6IFN3YXBzIGJldHdlZW4gY29udGVudGVkaXRhYmxlIGFuZCBub24tZWRpdGFibGUgZGl2cywgc3R5bGVzIG1lbnRpb25zIGRpZmZlcmVudGx5XG4gKlxuICogIyMgU3RhdGVcbiAqIC0gYG1lbnRpb25zVmlzaWJsZWA6IGNvbnRyb2xzIGRyb3Bkb3duIHZpc2liaWxpdHlcbiAqIC0gYG1lbnRpb25TZWFyY2hUZXh0YDogY3VycmVudCBmaWx0ZXIgdGV4dCBhZnRlciBAXG4gKiAtIGBtZW50aW9uQW5jaG9yYDogRE9NUmVjdCBmb3IgcG9zaXRpb25pbmcgZHJvcGRvd25cbiAqIC0gYHNlbGVjdGVkVXNlckluZGV4YDoga2V5Ym9hcmQgbmF2aWdhdGlvbiBzdGF0ZVxuICogLSBgc2F2ZWRSYW5nZWA6IHByZXNlcnZlcyBjdXJzb3IgcG9zaXRpb24gZm9yIGNsaWNrLWJhc2VkIHNlbGVjdGlvblxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtbWVudGlvbnMtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogYC4vbWVudGlvbnMtaW5wdXQuY29tcG9uZW50Lmh0bWxgLFxuICBzdHlsZVVybHM6IFsnLi9tZW50aW9ucy1pbnB1dC5jb21wb25lbnQuY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNZW50aW9uc0lucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IE1lbnRpb25zSW5wdXRDb21wb25lbnQuQ29udGVudEl0ZW1bXSA9IFtdO1xuICBASW5wdXQoKSB1c2VyczogTWVudGlvbnNJbnB1dENvbXBvbmVudC5Vc2VyW10gPSBbXTtcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdBZGQgYSBjb21tZW50JztcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29udGVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgTWVudGlvbnNJbnB1dENvbXBvbmVudC5Db250ZW50SXRlbVtdXG4gID4oKTtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0RWxlbWVudD86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIG1lbnRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICBtZW50aW9uU2VhcmNoVGV4dCA9ICcnO1xuICBtZW50aW9uQW5jaG9yOiBET01SZWN0IHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkVXNlckluZGV4ID0gMDtcbiAgcHJpdmF0ZSBzYXZlZFJhbmdlOiBSYW5nZSB8IG51bGwgPSBudWxsO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgfVxuXG4gIC8vREFITkUgTk9URSAtIG5nT25DaGFuZ2VzIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgQElucHV0KCkgcHJvcGVydHkgY2hhbmdlcywgd2hlcmUgdGhlIGNoYW5nZWQgaW5wdXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhvc2UgY2hhbmdlc1xuICAvL1NvIGlmIEBJbnB1dCgpIGNvbnRlbnQgY2hhbmdlcyBhbmQgaXQncyBub3QgdGhlIGZpcnN0IGNoYW5nZSAodGhlIGZpcnN0IHJlbmRlciBpcyBoYW5kbGVkIGJ5IG5nQWZ0ZXJWaWV3SW5pdCgpKSwgd2UgcmVuZGVyIHRoZSBjb250ZW50XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29udGVudCddICYmICFjaGFuZ2VzWydjb250ZW50J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpOiB2b2lkIHtcbiAgICAvL1RoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIEBWaWV3Q2hpbGQgcmVmZXJlbmNlIGlzbid0IGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgdmlldyBpbml0aWFsaXplc1xuICAgIGlmICghdGhpcy5pbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBodG1sID0gdGhpcy5jb250ZW50XG4gICAgICAubWFwKGl0ZW0gPT5cbiAgICAgICAgTWVudGlvbnNJbnB1dENvbXBvbmVudC5jb250ZW50SXRlbVRvSHRtbChpdGVtLCB0aGlzLnJlYWRvbmx5KSxcbiAgICAgIClcbiAgICAgIC5qb2luKCcnKTtcbiAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb250ZW50SXRlbVRvSHRtbChcbiAgICBpdGVtOiBNZW50aW9uc0lucHV0Q29tcG9uZW50LkNvbnRlbnRJdGVtLFxuICAgIHJlYWRvbmx5OiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAvL0RBSE5FIFRPRE8gLSBtYXliZSB3ZSBlc2NhcGUgSFRNTCBoZXJlIHRvbz8gQWx0aG91Z2ggSSBkb24ndCB0aGluayBpdCB3aWxsIGJlIHBvc3NpYmxlIGZvciB1c2VycyB0byBpbnB1dCBhbiBYU1MgYXR0YWNrIGluIGl0ZW0ubmFtZVxuICAgICAgY2FzZSAnbWVudGlvbic6XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCIke1xuICAgICAgICAgIHJlYWRvbmx5ID8gJ3JlYWRvbmx5LW1lbnRpb24nIDogJ21lbnRpb24nXG4gICAgICAgIH1cIiBkYXRhLWlkPVwiJHtcbiAgICAgICAgICBpdGVtLmlkXG4gICAgICAgIH1cIiBkYXRhLXR5cGU9XCJtZW50aW9uXCIgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIj5AJHtNZW50aW9uc0lucHV0Q29tcG9uZW50LmVzY2FwZUh0bWwoXG4gICAgICAgICAgaXRlbS5uYW1lLFxuICAgICAgICApfTwvc3Bhbj5gO1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIHJldHVybiBNZW50aW9uc0lucHV0Q29tcG9uZW50LmVzY2FwZUh0bWwoaXRlbS50ZXh0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIG9uSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja0Zvck1lbnRpb25UcmlnZ2VyKCk7XG4gICAgdGhpcy5lbWl0Q29udGVudENoYW5nZSgpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lbnRpb25zVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkVXNlcnMgPSB0aGlzLmdldEZpbHRlcmVkVXNlcnMoKTtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmRleCArIDEsXG4gICAgICAgICAgZmlsdGVyZWRVc2Vycy5sZW5ndGggLSAxLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmRleCA9IE1hdGgubWF4KHRoaXMuc2VsZWN0ZWRVc2VySW5kZXggLSAxLCAwKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZmlsdGVyZWRVc2Vyc1t0aGlzLnNlbGVjdGVkVXNlckluZGV4XSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0VXNlcihmaWx0ZXJlZFVzZXJzW3RoaXMuc2VsZWN0ZWRVc2VySW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChmaWx0ZXJlZFVzZXJzW3RoaXMuc2VsZWN0ZWRVc2VySW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RVc2VyKGZpbHRlcmVkVXNlcnNbdGhpcy5zZWxlY3RlZFVzZXJJbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZU1lbnRpb25zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JNZW50aW9uVHJpZ2dlcigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50IHx8ICF0aGlzLmlucHV0RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IHRoaXMuZ2V0VGV4dEJlZm9yZUN1cnNvcihyYW5nZSk7XG5cbiAgICBjb25zdCBsYXN0QXRJbmRleCA9IHRleHRCZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoJ0AnKTtcblxuICAgIGlmIChsYXN0QXRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW50aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vSWYgd2UgYWxsb3cgZm9yIGEgc2luZ2xlIHNwYWNlLCB3ZSBuZWVkIHRvIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgbG9naWMgd29uJ3QgcGljayB1cCBwcmV2aW91c1xuICAgIC8vJ0AnIG1lbnRpb25zIGFuZCBrZWVwIHRoZSBtZW50aW9uIGRyb3Bkb3duIG9wZW5cbiAgICBjb25zdCBhdFBvc2l0aW9uID0gdGhpcy5maW5kRG9tUG9zaXRpb25BdENoYXJJbmRleChsYXN0QXRJbmRleCk7XG4gICAgaWYgKGF0UG9zaXRpb24gJiYgdGhpcy5pc0luc2lkZU1lbnRpb25TcGFuKGF0UG9zaXRpb24ubm9kZSkpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW50aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRBZnRlckF0ID0gdGV4dEJlZm9yZUN1cnNvci5zdWJzdHJpbmcobGFzdEF0SW5kZXggKyAxKTtcbiAgICBjb25zdCBjaGFyMSA9IHRleHRBZnRlckF0LmNoYXJDb2RlQXQoMCk7XG4gICAgY29uc3QgY2hhck4gPSB0ZXh0QWZ0ZXJBdC5jaGFyQ29kZUF0KHRleHRBZnRlckF0Lmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGNoYXJOXzEgPSB0ZXh0QWZ0ZXJBdC5jaGFyQ29kZUF0KHRleHRBZnRlckF0Lmxlbmd0aCAtIDIpO1xuICAgIC8vVGhlc2UgYXJlIHRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9ucyBvZiBub3JtYWwgc3BhY2UgYW5kIG5vbi1icmVha2luZyBzcGFjZVxuICAgIGNvbnN0IHVuaWNvZGVTcGFjZUNoYXJzID0gWzMyLCAxNjBdO1xuXG4gICAgLy8gQ2xvc2UgbWVudGlvbnMgaWY6XG4gICAgLy8gLSBUaGVyZSdzIGEgZG91YmxlIHNwYWNlIChhbGxvd3Mgc2luZ2xlIHNwYWNlcyBpbiB0aGUgbWlkZGxlIG9mIHNlYXJjaClcbiAgICAvLyAtIFRoZSB0ZXh0IHN0YXJ0cyB3aXRoIGEgc3BhY2UgKHR5cGluZyBcIkAgXCIgc2hvdWxkIG5vdCB0cmlnZ2VyIG1lbnRpb25zKVxuICAgIGlmIChcbiAgICAgIHRleHRBZnRlckF0LmluY2x1ZGVzKCcgICcpIHx8XG4gICAgICB0ZXh0QWZ0ZXJBdC5zdGFydHNXaXRoKCcgJykgfHxcbiAgICAgIGNoYXIxID09IDE2MCB8fFxuICAgICAgKHVuaWNvZGVTcGFjZUNoYXJzLmluY2x1ZGVzKGNoYXJOKSAmJiB1bmljb2RlU3BhY2VDaGFycy5pbmNsdWRlcyhjaGFyTl8xKSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2xvc2VNZW50aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyaW0gdHJhaWxpbmcvbGVhZGluZyBzcGFjZXMgZnJvbSBzZWFyY2ggdGV4dCB3aGlsZSBwcmVzZXJ2aW5nIHNwYWNlcyBpbiB0aGUgbWlkZGxlXG4gICAgdGhpcy5tZW50aW9uU2VhcmNoVGV4dCA9IHRleHRBZnRlckF0LnRyaW0oKTtcbiAgICB0aGlzLm1lbnRpb25zVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZFVzZXJJbmRleCA9IDA7XG5cbiAgICAvL1NhdmUgdGhlIGN1cnJlbnQgcmFuZ2UgZm9yIGxhdGVyIHJlc3RvcmF0aW9uIChuZWVkZWQgZm9yIGNsaWNrIHNlbGVjdGlvbilcbiAgICAvL0RBSE5FIE5PVEUgLSB0aGlzIGlzIGFubm95aW5nbHkgbmVjZWVzc2FyeSBiZWNhdXNlIGNsaWNrcyBhbmQgZW50ZXIga2V5cyBoYXZlIGRpZmZlcmVudCBlZmZlY3RzIG9uIHRoZVxuICAgIC8vZm9jdXMgb2YgdGhlIGNvbnRlbnRlZGl0YWJsZSBkaXZcbiAgICB0aGlzLnNhdmVkUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG5cbiAgICAvL1RoaXMgaXMgaG93IHdlIGNhbGNsdWF0ZSB0aGUgY2FsbG91dCBwb3NpdGlvblxuICAgIGNvbnN0IGN1cnNvclJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLm1lbnRpb25BbmNob3IgPSBjdXJzb3JSZWN0O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUZXh0QmVmb3JlQ3Vyc29yKHJhbmdlOiBSYW5nZSk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xvbmVkUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgLy9XZSBzZWxlY3QgYWxsIG9mIHRoZSBpbnB1dCBjb250ZW50cywgYW5kIHRoZW4gbW92ZSB0aGUgZW5kIHBvaW50IHRvIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvblxuICAgIGNsb25lZFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh0aGlzLmlucHV0RWxlbWVudCEubmF0aXZlRWxlbWVudCk7XG4gICAgY2xvbmVkUmFuZ2Uuc2V0RW5kKHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcblxuICAgIC8vQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpdiBzbyB0aGF0IHdlIGNhbiBleHRyYWN0IHRleHQgY29udGVudCBmcm9tIGl0XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjbG9uZWRSYW5nZS5jbG9uZUNvbnRlbnRzKCk7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcblxuICAgIC8vR2V0IHRleHQgY29udGVudCwgcmVwbGFjaW5nIG1lbnRpb24gc3BhbnMgd2l0aCBAbmFtZVxuICAgIHJldHVybiBkaXYudGV4dENvbnRlbnQgfHwgJyc7XG4gIH1cblxuICBnZXRGaWx0ZXJlZFVzZXJzKCk6IE1lbnRpb25zSW5wdXRDb21wb25lbnQuVXNlcltdIHtcbiAgICBjb25zdCB1c2VycyA9ICF0aGlzLm1lbnRpb25TZWFyY2hUZXh0XG4gICAgICA/IHRoaXMudXNlcnNcbiAgICAgIDogdGhpcy51c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgICAgIHVzZXIubmFtZVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLm1lbnRpb25TZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIH1cblxuICBzZWxlY3RVc2VyKHVzZXI6IE1lbnRpb25zSW5wdXRDb21wb25lbnQuVXNlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnB1dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL1RoaXMgZ2V0cyBET00gaW5mbyBmcm9tIHVzZXIgKGUuZy4gaGlnaGxpZ2h0ZWQgc2VsZWN0aW9ucywgYW5kIGN1cnNvciBwb3NpdGlvbilcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHRoZSBzYXZlZCByYW5nZSBpZiBhdmFpbGFibGUgKG5lZWRlZCB3aGVuIHNlbGVjdGluZyB2aWEgY2xpY2spXG4gICAgaWYgKHRoaXMuc2F2ZWRSYW5nZSkge1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHRoaXMuc2F2ZWRSYW5nZSk7XG4gICAgfVxuXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSB0aGUgXCJAXCIgYW5kIHNlYXJjaCB0ZXh0XG4gICAgdGhpcy5kZWxldGVBdE1lbnRpb25TZWFyY2goKTtcblxuICAgIC8vREFITkUgTk9URSAtIHRoaXMgd291bGQgaWRlYWxseSBiZSB0aGUgc2FtZSBhcyBjb250ZW50SXRlbVRvSFRNTCwgYnV0IHdlIG5lZWQgYW4gYWN0dWFsIGVsZW1lbnQgcmVmZXJlbmNlIGhlcmUgaW4gb3JkZXIgdG8gYXBwZW5kIGl0IHRvIHRoZSBET01cbiAgICBjb25zdCBtZW50aW9uU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBtZW50aW9uU3Bhbi5jbGFzc05hbWUgPSB0aGlzLnJlYWRvbmx5ID8gJ3JlYWRvbmx5LW1lbnRpb24nIDogJ21lbnRpb24nO1xuICAgIG1lbnRpb25TcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsIFN0cmluZyh1c2VyLmlkKSk7XG4gICAgbWVudGlvblNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnLCAnbWVudGlvbicpO1xuICAgIG1lbnRpb25TcGFuLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJyk7XG4gICAgbWVudGlvblNwYW4udGV4dENvbnRlbnQgPSBgQCR7dXNlci5uYW1lfWA7XG5cbiAgICAvL0ZpbmQgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cbiAgICBjb25zdCBuZXdSYW5nZSA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8uZ2V0UmFuZ2VBdCgwKTtcbiAgICBpZiAobmV3UmFuZ2UpIHtcbiAgICAgIG5ld1JhbmdlLmluc2VydE5vZGUobWVudGlvblNwYW4pO1xuICAgICAgLy9TZXQgdGhlIHJhbmdlIHN0YXJ0IGFuZCBlbmQgdG8gdGhlIHNhbWUgbG9jYXRpb24gKHJlbmRlcmluZyB0aGUgY3Vyc29yIGluIHRoZSByaWdodCBwb3NpdGlvbilcbiAgICAgIG5ld1JhbmdlLnNldFN0YXJ0QWZ0ZXIobWVudGlvblNwYW4pO1xuICAgICAgbmV3UmFuZ2Uuc2V0RW5kQWZ0ZXIobWVudGlvblNwYW4pO1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgLy9BcHBseSB0aGlzIHJhbmdlIHRvIHRoZSBET01cbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZU1lbnRpb25zKCk7XG4gICAgdGhpcy5lbWl0Q29udGVudENoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVBdE1lbnRpb25TZWFyY2goKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vVGhpcyByZXByZXNlbnRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBjdXJzb3JcbiAgICBjb25zdCBjdXJzb3JSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuXG4gICAgLy9UaGlzIHdpbGwgcmV0dXJuIGFsbCBvZiB0aGUgcmF3IHRleHQgKEhUTUwtc3RyaXBwZWQpIGJlZm9yZSB0aGUgY3Vyc29yXG4gICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IHRoaXMuZ2V0VGV4dEJlZm9yZUN1cnNvcihjdXJzb3JSYW5nZSk7XG4gICAgLy9XZSBkbyB0aGF0XiBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZSBjb3JyZWN0IGluZGV4IG9mIHRoZSBtb3N0IHJlY2VudCAnQCdcbiAgICBjb25zdCBsYXN0QXRJbmRleCA9IHRleHRCZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoJ0AnKTtcblxuICAgIGlmIChsYXN0QXRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL0tub3dpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0ICdAJyBjaGFyYWN0ZXIgd2UgY2FuIG5vdyBmaW5kIHRoZSBhY3R1YWwgRE9NIG5vZGUgKyBvZmZzZXQgd2hlcmUgXCJAXCIgbGl2ZXNcbiAgICBjb25zdCBhdFBvc2l0aW9uID0gdGhpcy5maW5kRG9tUG9zaXRpb25BdENoYXJJbmRleChsYXN0QXRJbmRleCk7XG5cbiAgICBpZiAoIWF0UG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcmFuZ2UgZnJvbSBcIkBcIiB0byBjdXJzb3IgYW5kIGRlbGV0ZSBpdFxuICAgIGNvbnN0IGRlbGV0ZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBkZWxldGVSYW5nZS5zZXRTdGFydChhdFBvc2l0aW9uLm5vZGUsIGF0UG9zaXRpb24ub2Zmc2V0KTtcbiAgICBkZWxldGVSYW5nZS5zZXRFbmQoY3Vyc29yUmFuZ2UuZW5kQ29udGFpbmVyLCBjdXJzb3JSYW5nZS5lbmRPZmZzZXQpO1xuICAgIGRlbGV0ZVJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlTWVudGlvblNwYW4obm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgPSBub2RlO1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZSAhPT0gdGhpcy5pbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmXG4gICAgICAgIChjdXJyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKSA9PT0gJ21lbnRpb24nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vVGhpcyB3aWxsIGdvIHRleHQgbm9kZSBieSBub2RlIGxvb2tpbmcgZm9yIHRoZVxuICAvL0AgbWVudGlvbiBhbmQgZ2l2ZSBpdHMgcG9zaXRpb24gaW4gdGhlIGNvbnRleHQgb2YgdGhhdCBub2RlXG4gIHByaXZhdGUgZmluZERvbVBvc2l0aW9uQXRDaGFySW5kZXgoXG4gICAgY2hhckluZGV4OiBudW1iZXIsXG4gICk6IHsgbm9kZTogTm9kZTsgb2Zmc2V0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5pbnB1dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhyb3VnaCBhbGwgdGV4dCBub2RlcyBpbiB0aGUgaW5wdXQsIGNvdW50aW5nIGNoYXJhY3RlcnNcbiAgICBjb25zdCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcbiAgICAgIG51bGwsXG4gICAgKTtcblxuICAgIGxldCBjaGFyQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKHRyZWVXYWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRyZWVXYWxrZXIuY3VycmVudE5vZGU7XG4gICAgICBjb25zdCB0ZXh0ID0gbm9kZS50ZXh0Q29udGVudCB8fCAnJztcblxuICAgICAgLy8gQ2hlY2sgaWYgb3VyIHRhcmdldCBjaGFyYWN0ZXIgaXMgaW4gdGhpcyB0ZXh0IG5vZGVcbiAgICAgIGlmIChjaGFyQ291bnQgKyB0ZXh0Lmxlbmd0aCA+IGNoYXJJbmRleCkge1xuICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGF0IGNoYXJJbmRleCBpcyBpbiB0aGlzIG5vZGVcbiAgICAgICAgY29uc3Qgb2Zmc2V0SW5Ob2RlID0gY2hhckluZGV4IC0gY2hhckNvdW50O1xuICAgICAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IG9mZnNldEluTm9kZSB9O1xuICAgICAgfVxuXG4gICAgICBjaGFyQ291bnQgKz0gdGV4dC5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlTWVudGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5tZW50aW9uc1Zpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLm1lbnRpb25TZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5tZW50aW9uQW5jaG9yID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkVXNlckluZGV4ID0gMDtcbiAgICB0aGlzLnNhdmVkUmFuZ2UgPSBudWxsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29udGVudENoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5kb21Ub0NvbnRlbnRJdGVtcygpO1xuICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KGNvbnRlbnRJdGVtcyk7XG4gIH1cblxuICBwcml2YXRlIGRvbVRvQ29udGVudEl0ZW1zKCk6IE1lbnRpb25zSW5wdXRDb21wb25lbnQuQ29udGVudEl0ZW1bXSB7XG4gICAgaWYgKCF0aGlzLmlucHV0RWxlbWVudD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zOiBNZW50aW9uc0lucHV0Q29tcG9uZW50LkNvbnRlbnRJdGVtW10gPSBbXTtcbiAgICBjb25zdCBjaGlsZE5vZGVzID0gdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIEFycmF5LmZyb20oY2hpbGROb2RlcykpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NQQU4nICYmXG4gICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpID09PSAnbWVudGlvbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgaWQgPSBOdW1iZXIoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSk7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW1lbnQudGV4dENvbnRlbnQ/LnJlcGxhY2UoJ0AnLCAnJykgfHwgJyc7XG4gICAgICAgICAgaXRlbXMucHVzaCh7IHR5cGU6ICdtZW50aW9uJywgaWQsIG5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IG5vZGUudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgaXRlbXMucHVzaCh7IHR5cGU6ICd0ZXh0JywgdGV4dCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIG9uQ2FsbG91dENsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VNZW50aW9ucygpO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTWVudGlvbnNJbnB1dENvbXBvbmVudCB7XG4gIGV4cG9ydCBjb25zdCBDb250ZW50VHlwZXMgPSBbJ21lbnRpb24nLCAndGV4dCddIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBDb250ZW50VHlwZSA9XG4gICAgKHR5cGVvZiBNZW50aW9uc0lucHV0Q29tcG9uZW50LkNvbnRlbnRUeXBlcylbbnVtYmVyXTtcbiAgZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgfVxuICBleHBvcnQgdHlwZSBDb250ZW50PFQgZXh0ZW5kcyBDb250ZW50VHlwZT4gPSB7IHR5cGU6IFQgfTtcblxuICBleHBvcnQgdHlwZSBVc2VyTWVudGlvbiA9IENvbnRlbnQ8J21lbnRpb24nPiAmIFVzZXI7XG4gIGV4cG9ydCB0eXBlIFRleHQgPSBDb250ZW50PCd0ZXh0Jz4gJiB7IHRleHQ6IHN0cmluZyB9O1xuXG4gIGV4cG9ydCB0eXBlIENvbnRlbnRJdGVtID0gVXNlck1lbnRpb24gfCBUZXh0O1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjb250ZW50VG9QbGFpblRleHQoY29udGVudDogQ29udGVudEl0ZW1bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnbWVudGlvbic6XG4gICAgICAgICAgICByZXR1cm4gYEAke2l0ZW0ubmFtZX1gO1xuICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udGV4dDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1lbnRpb25zLWNvbnRhaW5lclwiICNjb250YWluZXI+XG4gIDxkaXZcbiAgICAqbmdJZj1cIiFyZWFkb25seVwiXG4gICAgI2lucHV0XG4gICAgY2xhc3M9XCJ0ZXh0LWNvbnRlbnQgZWRpdGFibGVcIlxuICAgIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIlxuICAgIFthdHRyLmRhdGEtcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIChpbnB1dCk9XCJvbklucHV0KClcIlxuICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgPjwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJyZWFkb25seVwiICNpbnB1dCBjbGFzcz1cInRleHQtY29udGVudFwiPjwvZGl2PlxuXG4gIDxyaXYtY2FsbG91dFxuICAgICpuZ0lmPVwiIXJlYWRvbmx5ICYmIG1lbnRpb25zVmlzaWJsZSAmJiBtZW50aW9uQW5jaG9yXCJcbiAgICBbYW5jaG9yXT1cIm1lbnRpb25BbmNob3JcIlxuICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICBbc2hvd0NhcmV0XT1cImZhbHNlXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1yaWdodCdcIlxuICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICAoY2xvc2UpPVwib25DYWxsb3V0Q2xvc2UoKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibWVudGlvbnMtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1lbnRpb25zLWhlYWRlclwiPk1lbnRpb24gc29tZW9uZTwvZGl2PlxuICAgICAgPHVsIGNsYXNzPVwibWVudGlvbnMtbGlzdFwiPlxuICAgICAgICA8bGlcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgdXNlciBvZiBnZXRGaWx0ZXJlZFVzZXJzKCk7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpID09PSBzZWxlY3RlZFVzZXJJbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzZWxlY3RVc2VyKHVzZXIpXCI+e3sgdXNlci5uYW1lIH19PC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L3Jpdi1jYWxsb3V0PlxuPC9kaXY+XG4iXX0=
@@ -13,9 +13,10 @@ export class ToastComponent {
13
13
  ngOnInit() {
14
14
  setTimeout(() => {
15
15
  this.close.emit();
16
- }, 3000);
16
+ }, ToastComponent.DURATION);
17
17
  }
18
18
  }
19
+ ToastComponent.DURATION = 5000;
19
20
  ToastComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
21
  ToastComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ToastComponent, selector: "riv-toast", inputs: { variant: "variant", icon: "icon" }, outputs: { close: "close" }, ngImport: i0, template: "<div *riv-overlay class=\"wrapper\" [attr.data-animation-hook]=\"hook\">\n <div class=\"toast\" [ngClass]=\"variant\">\n <riv-icon *ngIf=\"icon\" [name]=\"icon\" [size]=\"16\"></riv-icon>\n <div class=\"content\"><ng-content></ng-content></div>\n </div>\n</div>\n", styles: [".wrapper{position:fixed;top:calc(var(--base-grid-size) * 20);left:50%}.toast{transform:translate(-50%);display:inline-flex;align-items:center;justify-content:center;gap:var(--size-small);padding:var(--size-xsmall) var(--size-large);border-radius:calc(var(--base-grid-size) * 8);box-shadow:var(--depth-1);font:var(--body-medium)}.toast.basic{background-color:var(--surface-dark-0);color:var(--type-dark-high-contrast);border:var(--border-width) solid var(--surface-dark-0)}.toast.danger{background-color:var(--danger-main);color:var(--type-dark-high-contrast);border:var(--border-width) solid var(--danger-main)}.toast.safety{background-color:var(--safety-main);color:var(--type-dark-high-contrast);border:var(--border-width) solid var(--safety-main)}.toast.safety-dark{background-color:var(--baja-blast-90);color:var(--type-dark-high-contrast);border:var(--border-width) solid var(--baja-blast-90)}.toast.safety-inverse{background-color:var(--surface-light-safety);color:var(--type-light-safety);border:var(--border-width) solid currentColor}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "directive", type: i3.OverlayDirective, selector: "[riv-overlay]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21
22
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ToastComponent, decorators: [{
@@ -37,4 +38,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
37
38
  'safety-inverse',
38
39
  ];
39
40
  })(ToastComponent || (ToastComponent = {}));
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvb3ZlcmxheS90b2FzdC90b2FzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9vdmVybGF5L3RvYXN0L3RvYXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7OztBQVFsRSxNQUFNLE9BQU8sY0FBYztJQU4zQjtRQVFFLFlBQU8sR0FBMkIsT0FBTyxDQUFDO1FBWTFDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXhCLFNBQUksR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0tBQ2hEO0lBVkMsUUFBUTtRQUNOLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7OzJHQVhVLGNBQWM7K0ZBQWQsY0FBYyw0SENqQjNCLGlSQU1BOzJGRFdhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsV0FBVyxtQkFHSix1QkFBdUIsQ0FBQyxNQUFNOzhCQUkvQyxPQUFPO3NCQUROLEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxLQUFLO2dCQVVOLEtBQUs7c0JBREosTUFBTTs7QUFNVCxXQUFpQixjQUFjO0lBQ2hCLHVCQUFRLEdBQUc7UUFDdEIsT0FBTztRQUNQLFFBQVE7UUFDUixRQUFRO1FBQ1IsYUFBYTtRQUNiLGdCQUFnQjtLQUNSLENBQUM7QUFFYixDQUFDLEVBVGdCLGNBQWMsS0FBZCxjQUFjLFFBUzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQU5JTUFUSU9OX0NPTlNUQU5UUyB9IGZyb20gJy4uL292ZXJsYXktb3V0bGV0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi10b2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90b2FzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RvYXN0LmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRvYXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgdmFyaWFudDogVG9hc3RDb21wb25lbnQuVmFyaWFudCA9ICdiYXNpYyc7XG5cbiAgQElucHV0KClcbiAgaWNvbj86IEljb25Db21wb25lbnQuTmFtZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICAgIH0sIDMwMDApO1xuICB9XG5cbiAgQE91dHB1dCgpXG4gIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IGhvb2sgPSBBTklNQVRJT05fQ09OU1RBTlRTLlRPQVNULkhPT0s7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVG9hc3RDb21wb25lbnQge1xuICBleHBvcnQgY29uc3QgVmFyaWFudHMgPSBbXG4gICAgJ2Jhc2ljJyxcbiAgICAnZGFuZ2VyJyxcbiAgICAnc2FmZXR5JyxcbiAgICAnc2FmZXR5LWRhcmsnLFxuICAgICdzYWZldHktaW52ZXJzZScsXG4gIF0gYXMgY29uc3Q7XG4gIGV4cG9ydCB0eXBlIFZhcmlhbnQgPSAodHlwZW9mIFZhcmlhbnRzKVtudW1iZXJdO1xufVxuIiwiPGRpdiAqcml2LW92ZXJsYXkgY2xhc3M9XCJ3cmFwcGVyXCIgW2F0dHIuZGF0YS1hbmltYXRpb24taG9va109XCJob29rXCI+XG4gIDxkaXYgY2xhc3M9XCJ0b2FzdFwiIFtuZ0NsYXNzXT1cInZhcmlhbnRcIj5cbiAgICA8cml2LWljb24gKm5nSWY9XCJpY29uXCIgW25hbWVdPVwiaWNvblwiIFtzaXplXT1cIjE2XCI+PC9yaXYtaWNvbj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvb3ZlcmxheS90b2FzdC90b2FzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9vdmVybGF5L3RvYXN0L3RvYXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7OztBQVFsRSxNQUFNLE9BQU8sY0FBYztJQU4zQjtRQVVFLFlBQU8sR0FBMkIsT0FBTyxDQUFDO1FBWTFDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXhCLFNBQUksR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0tBQ2hEO0lBVkMsUUFBUTtRQUNOLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQzs7QUFaTSx1QkFBUSxHQUFHLElBQUksQ0FBQzsyR0FEWixjQUFjOytGQUFkLGNBQWMsNEhDakIzQixpUkFNQTsyRkRXYSxjQUFjO2tCQU4xQixTQUFTOytCQUNFLFdBQVcsbUJBR0osdUJBQXVCLENBQUMsTUFBTTs4QkFNL0MsT0FBTztzQkFETixLQUFLO2dCQUlOLElBQUk7c0JBREgsS0FBSztnQkFVTixLQUFLO3NCQURKLE1BQU07O0FBTVQsV0FBaUIsY0FBYztJQUNoQix1QkFBUSxHQUFHO1FBQ3RCLE9BQU87UUFDUCxRQUFRO1FBQ1IsUUFBUTtRQUNSLGFBQWE7UUFDYixnQkFBZ0I7S0FDUixDQUFDO0FBRWIsQ0FBQyxFQVRnQixjQUFjLEtBQWQsY0FBYyxRQVM5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IEFOSU1BVElPTl9DT05TVEFOVFMgfSBmcm9tICcuLi9vdmVybGF5LW91dGxldC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtdG9hc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9hc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90b2FzdC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHN0YXRpYyBEVVJBVElPTiA9IDUwMDA7XG5cbiAgQElucHV0KClcbiAgdmFyaWFudDogVG9hc3RDb21wb25lbnQuVmFyaWFudCA9ICdiYXNpYyc7XG5cbiAgQElucHV0KClcbiAgaWNvbj86IEljb25Db21wb25lbnQuTmFtZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICAgIH0sIFRvYXN0Q29tcG9uZW50LkRVUkFUSU9OKTtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICByZWFkb25seSBob29rID0gQU5JTUFUSU9OX0NPTlNUQU5UUy5UT0FTVC5IT09LO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRvYXN0Q29tcG9uZW50IHtcbiAgZXhwb3J0IGNvbnN0IFZhcmlhbnRzID0gW1xuICAgICdiYXNpYycsXG4gICAgJ2RhbmdlcicsXG4gICAgJ3NhZmV0eScsXG4gICAgJ3NhZmV0eS1kYXJrJyxcbiAgICAnc2FmZXR5LWludmVyc2UnLFxuICBdIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBWYXJpYW50ID0gKHR5cGVvZiBWYXJpYW50cylbbnVtYmVyXTtcbn1cbiIsIjxkaXYgKnJpdi1vdmVybGF5IGNsYXNzPVwid3JhcHBlclwiIFthdHRyLmRhdGEtYW5pbWF0aW9uLWhvb2tdPVwiaG9va1wiPlxuICA8ZGl2IGNsYXNzPVwidG9hc3RcIiBbbmdDbGFzc109XCJ2YXJpYW50XCI+XG4gICAgPHJpdi1pY29uICpuZ0lmPVwiaWNvblwiIFtuYW1lXT1cImljb25cIiBbc2l6ZV09XCIxNlwiPjwvcml2LWljb24+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=