@ctrl/ngx-emoji-mart 5.1.1 → 6.1.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.
Files changed (72) hide show
  1. package/README.md +11 -19
  2. package/anchors.component.d.ts +3 -0
  3. package/category.component.d.ts +7 -2
  4. package/ctrl-ngx-emoji-mart.d.ts +1 -0
  5. package/emoji-frequently.service.d.ts +3 -0
  6. package/emoji-search.service.d.ts +3 -0
  7. package/esm2020/anchors.component.mjs +83 -0
  8. package/esm2020/category.component.mjs +386 -0
  9. package/{esm2015/ctrl-ngx-emoji-mart.js → esm2020/ctrl-ngx-emoji-mart.mjs} +0 -0
  10. package/{esm2015/emoji-frequently.service.js → esm2020/emoji-frequently.service.mjs} +10 -8
  11. package/esm2020/emoji-search.service.mjs +177 -0
  12. package/{esm2015/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.js → esm2020/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.mjs} +0 -0
  13. package/{esm2015/ngx-emoji/data/categories.js → esm2020/ngx-emoji/data/categories.mjs} +4 -4
  14. package/{esm2015/ngx-emoji/data/data.interfaces.js → esm2020/ngx-emoji/data/data.interfaces.mjs} +0 -0
  15. package/esm2020/ngx-emoji/data/emojis.mjs +29543 -0
  16. package/{esm2015/ngx-emoji/data/skins.js → esm2020/ngx-emoji/data/skins.mjs} +0 -0
  17. package/esm2020/ngx-emoji/emoji.component.mjs +236 -0
  18. package/esm2020/ngx-emoji/emoji.module.mjs +18 -0
  19. package/esm2020/ngx-emoji/emoji.service.mjs +144 -0
  20. package/{esm2015/ngx-emoji/index.js → esm2020/ngx-emoji/index.mjs} +0 -0
  21. package/esm2020/picker.component.mjs +505 -0
  22. package/esm2020/picker.module.mjs +49 -0
  23. package/esm2020/preview.component.mjs +181 -0
  24. package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
  25. package/esm2020/search.component.mjs +165 -0
  26. package/esm2020/skins.component.mjs +108 -0
  27. package/esm2020/svgs/index.mjs +18 -0
  28. package/{esm2015/utils/index.js → esm2020/utils/index.mjs} +0 -0
  29. package/fesm2015/{ctrl-ngx-emoji-mart-ngx-emoji.js → ctrl-ngx-emoji-mart-ngx-emoji.mjs} +24809 -18497
  30. package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -0
  31. package/fesm2015/{ctrl-ngx-emoji-mart.js → ctrl-ngx-emoji-mart.mjs} +666 -325
  32. package/fesm2015/ctrl-ngx-emoji-mart.mjs.map +1 -0
  33. package/fesm2020/ctrl-ngx-emoji-mart-ngx-emoji.mjs +31829 -0
  34. package/fesm2020/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -0
  35. package/fesm2020/ctrl-ngx-emoji-mart.mjs +1751 -0
  36. package/fesm2020/ctrl-ngx-emoji-mart.mjs.map +1 -0
  37. package/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.d.ts +1 -0
  38. package/ngx-emoji/emoji.component.d.ts +3 -0
  39. package/ngx-emoji/emoji.module.d.ts +6 -0
  40. package/ngx-emoji/emoji.service.d.ts +3 -0
  41. package/ngx-emoji/package.json +6 -7
  42. package/package.json +29 -10
  43. package/picker.component.d.ts +3 -0
  44. package/picker.module.d.ts +13 -0
  45. package/preview.component.d.ts +4 -1
  46. package/search.component.d.ts +3 -0
  47. package/skins.component.d.ts +6 -3
  48. package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js +0 -25819
  49. package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js.map +0 -1
  50. package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.min.js +0 -2
  51. package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.min.js.map +0 -1
  52. package/bundles/ctrl-ngx-emoji-mart.umd.js +0 -1692
  53. package/bundles/ctrl-ngx-emoji-mart.umd.js.map +0 -1
  54. package/bundles/ctrl-ngx-emoji-mart.umd.min.js +0 -2
  55. package/bundles/ctrl-ngx-emoji-mart.umd.min.js.map +0 -1
  56. package/ctrl-ngx-emoji-mart.metadata.json +0 -1
  57. package/esm2015/anchors.component.js +0 -54
  58. package/esm2015/category.component.js +0 -275
  59. package/esm2015/emoji-search.service.js +0 -179
  60. package/esm2015/ngx-emoji/data/emojis.js +0 -23289
  61. package/esm2015/ngx-emoji/emoji.component.js +0 -174
  62. package/esm2015/ngx-emoji/emoji.module.js +0 -13
  63. package/esm2015/ngx-emoji/emoji.service.js +0 -143
  64. package/esm2015/picker.component.js +0 -459
  65. package/esm2015/picker.module.js +0 -34
  66. package/esm2015/preview.component.js +0 -113
  67. package/esm2015/search.component.js +0 -115
  68. package/esm2015/skins.component.js +0 -76
  69. package/esm2015/svgs/index.js +0 -18
  70. package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js.map +0 -1
  71. package/fesm2015/ctrl-ngx-emoji-mart.js.map +0 -1
  72. package/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.metadata.json +0 -1
@@ -0,0 +1,505 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewChildren, } from '@angular/core';
3
+ import { categories, } from '@ctrl/ngx-emoji-mart/ngx-emoji';
4
+ import { CategoryComponent } from './category.component';
5
+ import { PreviewComponent } from './preview.component';
6
+ import { SearchComponent } from './search.component';
7
+ import * as icons from './svgs';
8
+ import { measureScrollbar } from './utils';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "./emoji-frequently.service";
11
+ import * as i2 from "./anchors.component";
12
+ import * as i3 from "./search.component";
13
+ import * as i4 from "./category.component";
14
+ import * as i5 from "./preview.component";
15
+ import * as i6 from "@angular/common";
16
+ const I18N = {
17
+ search: 'Search',
18
+ emojilist: 'List of emoji',
19
+ notfound: 'No Emoji Found',
20
+ clear: 'Clear',
21
+ categories: {
22
+ search: 'Search Results',
23
+ recent: 'Frequently Used',
24
+ people: 'Smileys & People',
25
+ nature: 'Animals & Nature',
26
+ foods: 'Food & Drink',
27
+ activity: 'Activity',
28
+ places: 'Travel & Places',
29
+ objects: 'Objects',
30
+ symbols: 'Symbols',
31
+ flags: 'Flags',
32
+ custom: 'Custom',
33
+ },
34
+ skintones: {
35
+ 1: 'Default Skin Tone',
36
+ 2: 'Light Skin Tone',
37
+ 3: 'Medium-Light Skin Tone',
38
+ 4: 'Medium Skin Tone',
39
+ 5: 'Medium-Dark Skin Tone',
40
+ 6: 'Dark Skin Tone',
41
+ },
42
+ };
43
+ export class PickerComponent {
44
+ constructor(ngZone, renderer, ref, frequently, platformId) {
45
+ this.ngZone = ngZone;
46
+ this.renderer = renderer;
47
+ this.ref = ref;
48
+ this.frequently = frequently;
49
+ this.platformId = platformId;
50
+ this.perLine = 9;
51
+ this.totalFrequentLines = 4;
52
+ this.i18n = {};
53
+ this.style = {};
54
+ this.title = 'Emoji Mart™';
55
+ this.emoji = 'department_store';
56
+ this.darkMode = !!(typeof matchMedia === 'function' && matchMedia('(prefers-color-scheme: dark)').matches);
57
+ this.color = '#ae65c5';
58
+ this.hideObsolete = true;
59
+ /** all categories shown */
60
+ this.categories = [];
61
+ /** used to temporarily draw categories */
62
+ this.activeCategories = [];
63
+ this.set = 'apple';
64
+ this.skin = 1;
65
+ /** Renders the native unicode emoji */
66
+ this.isNative = false;
67
+ this.emojiSize = 24;
68
+ this.sheetSize = 64;
69
+ this.showPreview = true;
70
+ this.emojiTooltip = false;
71
+ this.autoFocus = false;
72
+ this.custom = [];
73
+ this.hideRecent = true;
74
+ this.notFoundEmoji = 'sleuth_or_spy';
75
+ this.categoriesIcons = icons.categories;
76
+ this.searchIcons = icons.search;
77
+ this.useButton = false;
78
+ this.enableFrequentEmojiSort = false;
79
+ this.enableSearch = true;
80
+ this.showSingleCategory = false;
81
+ this.virtualize = false;
82
+ this.virtualizeOffset = 0;
83
+ this.emojiClick = new EventEmitter();
84
+ this.emojiSelect = new EventEmitter();
85
+ this.skinChange = new EventEmitter();
86
+ this.scrollHeight = 0;
87
+ this.clientHeight = 0;
88
+ this.clientWidth = 0;
89
+ this.firstRender = true;
90
+ this.animationFrameRequestId = null;
91
+ this.NAMESPACE = 'emoji-mart';
92
+ this.measureScrollbar = 0;
93
+ this.RECENT_CATEGORY = {
94
+ id: 'recent',
95
+ name: 'Recent',
96
+ emojis: null,
97
+ };
98
+ this.SEARCH_CATEGORY = {
99
+ id: 'search',
100
+ name: 'Search',
101
+ emojis: null,
102
+ anchor: false,
103
+ };
104
+ this.CUSTOM_CATEGORY = {
105
+ id: 'custom',
106
+ name: 'Custom',
107
+ emojis: [],
108
+ };
109
+ this.backgroundImageFn = (set, sheetSize) => `https://unpkg.com/emoji-datasource-${this.set}@6.0.1/img/${this.set}/sheets-256/${this.sheetSize}.png`;
110
+ }
111
+ ngOnInit() {
112
+ // measure scroll
113
+ this.measureScrollbar = measureScrollbar();
114
+ this.i18n = { ...I18N, ...this.i18n };
115
+ this.i18n.categories = { ...I18N.categories, ...this.i18n.categories };
116
+ this.skin =
117
+ JSON.parse((isPlatformBrowser(this.platformId) && localStorage.getItem(`${this.NAMESPACE}.skin`)) ||
118
+ 'null') || this.skin;
119
+ const allCategories = [...categories];
120
+ if (this.custom.length > 0) {
121
+ this.CUSTOM_CATEGORY.emojis = this.custom.map(emoji => {
122
+ return {
123
+ ...emoji,
124
+ // `<Category />` expects emoji to have an `id`.
125
+ id: emoji.shortNames[0],
126
+ custom: true,
127
+ };
128
+ });
129
+ allCategories.push(this.CUSTOM_CATEGORY);
130
+ }
131
+ if (this.include !== undefined) {
132
+ allCategories.sort((a, b) => {
133
+ if (this.include.indexOf(a.id) > this.include.indexOf(b.id)) {
134
+ return 1;
135
+ }
136
+ return -1;
137
+ });
138
+ }
139
+ for (const category of allCategories) {
140
+ const isIncluded = this.include && this.include.length ? this.include.indexOf(category.id) > -1 : true;
141
+ const isExcluded = this.exclude && this.exclude.length ? this.exclude.indexOf(category.id) > -1 : false;
142
+ if (!isIncluded || isExcluded) {
143
+ continue;
144
+ }
145
+ if (this.emojisToShowFilter) {
146
+ const newEmojis = [];
147
+ const { emojis } = category;
148
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
149
+ for (let emojiIndex = 0; emojiIndex < emojis.length; emojiIndex++) {
150
+ const emoji = emojis[emojiIndex];
151
+ if (this.emojisToShowFilter(emoji)) {
152
+ newEmojis.push(emoji);
153
+ }
154
+ }
155
+ if (newEmojis.length) {
156
+ const newCategory = {
157
+ emojis: newEmojis,
158
+ name: category.name,
159
+ id: category.id,
160
+ };
161
+ this.categories.push(newCategory);
162
+ }
163
+ }
164
+ else {
165
+ this.categories.push(category);
166
+ }
167
+ this.categoriesIcons = { ...icons.categories, ...this.categoriesIcons };
168
+ this.searchIcons = { ...icons.search, ...this.searchIcons };
169
+ }
170
+ const includeRecent = this.include && this.include.length
171
+ ? this.include.indexOf(this.RECENT_CATEGORY.id) > -1
172
+ : true;
173
+ const excludeRecent = this.exclude && this.exclude.length
174
+ ? this.exclude.indexOf(this.RECENT_CATEGORY.id) > -1
175
+ : false;
176
+ if (includeRecent && !excludeRecent) {
177
+ this.hideRecent = false;
178
+ this.categories.unshift(this.RECENT_CATEGORY);
179
+ }
180
+ if (this.categories[0]) {
181
+ this.categories[0].first = true;
182
+ }
183
+ this.categories.unshift(this.SEARCH_CATEGORY);
184
+ this.selected = this.categories.filter(category => category.first)[0].name;
185
+ // Need to be careful if small number of categories
186
+ const categoriesToLoadFirst = Math.min(this.categories.length, 3);
187
+ this.setActiveCategories((this.activeCategories = this.categories.slice(0, categoriesToLoadFirst)));
188
+ // Trim last active category
189
+ const lastActiveCategoryEmojis = this.categories[categoriesToLoadFirst - 1].emojis.slice();
190
+ this.categories[categoriesToLoadFirst - 1].emojis = lastActiveCategoryEmojis.slice(0, 60);
191
+ setTimeout(() => {
192
+ // Restore last category
193
+ this.categories[categoriesToLoadFirst - 1].emojis = lastActiveCategoryEmojis;
194
+ this.setActiveCategories(this.categories);
195
+ // The `setTimeout` will trigger the change detection, but since we're inside
196
+ // the OnPush component we can run change detection locally starting from this
197
+ // component and going down to the children.
198
+ this.ref.detectChanges();
199
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
200
+ isPlatformBrowser(this.platformId) &&
201
+ this.ngZone.runOutsideAngular(() => {
202
+ // The `updateCategoriesSize` doesn't change properties that are used
203
+ // in templates, thus this is run in the context of the root zone to avoid
204
+ // running change detection.
205
+ requestAnimationFrame(() => {
206
+ this.updateCategoriesSize();
207
+ });
208
+ });
209
+ });
210
+ this.ngZone.runOutsideAngular(() => {
211
+ // DOM events that are listened by Angular inside the template trigger change detection
212
+ // and also wrapped into additional functions that call `markForCheck()`. We listen `scroll`
213
+ // in the context of the root zone since it will not trigger change detection each time
214
+ // the `scroll` event is dispatched.
215
+ this.scrollListener = this.renderer.listen(this.scrollRef.nativeElement, 'scroll', () => {
216
+ this.handleScroll();
217
+ });
218
+ });
219
+ }
220
+ ngOnDestroy() {
221
+ this.scrollListener();
222
+ // This is called here because the component might be destroyed
223
+ // but there will still be a `requestAnimationFrame` callback in the queue
224
+ // that calls `detectChanges()` on the `ViewRef`. This will lead to a runtime
225
+ // exception if the `detectChanges()` is called after the `ViewRef` is destroyed.
226
+ this.cancelAnimationFrame();
227
+ }
228
+ setActiveCategories(categoriesToMakeActive) {
229
+ if (this.showSingleCategory) {
230
+ this.activeCategories = categoriesToMakeActive.filter(x => x.name === this.selected || x === this.SEARCH_CATEGORY);
231
+ }
232
+ else {
233
+ this.activeCategories = categoriesToMakeActive;
234
+ }
235
+ }
236
+ updateCategoriesSize() {
237
+ this.categoryRefs.forEach(component => component.memoizeSize());
238
+ if (this.scrollRef) {
239
+ const target = this.scrollRef.nativeElement;
240
+ this.scrollHeight = target.scrollHeight;
241
+ this.clientHeight = target.clientHeight;
242
+ this.clientWidth = target.clientWidth;
243
+ }
244
+ }
245
+ handleAnchorClick($event) {
246
+ this.updateCategoriesSize();
247
+ this.selected = $event.category.name;
248
+ this.setActiveCategories(this.categories);
249
+ if (this.SEARCH_CATEGORY.emojis) {
250
+ this.handleSearch(null);
251
+ this.searchRef?.clear();
252
+ this.handleAnchorClick($event);
253
+ return;
254
+ }
255
+ const component = this.categoryRefs.find(n => n.id === $event.category.id);
256
+ if (component) {
257
+ let { top } = component;
258
+ if ($event.category.first) {
259
+ top = 0;
260
+ }
261
+ else {
262
+ top += 1;
263
+ }
264
+ this.scrollRef.nativeElement.scrollTop = top;
265
+ }
266
+ this.nextScroll = $event.category.name;
267
+ // handle component scrolling to load emojis
268
+ for (const category of this.categories) {
269
+ const componentToScroll = this.categoryRefs.find(({ id }) => id === category.id);
270
+ componentToScroll?.handleScroll(this.scrollRef.nativeElement.scrollTop);
271
+ }
272
+ }
273
+ categoryTrack(index, item) {
274
+ return item.id;
275
+ }
276
+ handleScroll(noSelectionChange = false) {
277
+ if (this.nextScroll) {
278
+ this.selected = this.nextScroll;
279
+ this.nextScroll = undefined;
280
+ this.ref.detectChanges();
281
+ return;
282
+ }
283
+ if (!this.scrollRef) {
284
+ return;
285
+ }
286
+ if (this.showSingleCategory) {
287
+ return;
288
+ }
289
+ let activeCategory;
290
+ if (this.SEARCH_CATEGORY.emojis) {
291
+ activeCategory = this.SEARCH_CATEGORY;
292
+ }
293
+ else {
294
+ const target = this.scrollRef.nativeElement;
295
+ // check scroll is not at bottom
296
+ if (target.scrollTop === 0) {
297
+ // hit the TOP
298
+ activeCategory = this.categories.find(n => n.first === true);
299
+ }
300
+ else if (target.scrollHeight - target.scrollTop === this.clientHeight) {
301
+ // scrolled to bottom activate last category
302
+ activeCategory = this.categories[this.categories.length - 1];
303
+ }
304
+ else {
305
+ // scrolling
306
+ for (const category of this.categories) {
307
+ const component = this.categoryRefs.find(({ id }) => id === category.id);
308
+ const active = component?.handleScroll(target.scrollTop);
309
+ if (active) {
310
+ activeCategory = category;
311
+ }
312
+ }
313
+ }
314
+ this.scrollTop = target.scrollTop;
315
+ }
316
+ // This will allow us to run the change detection only when the category changes.
317
+ if (!noSelectionChange && activeCategory && activeCategory.name !== this.selected) {
318
+ this.selected = activeCategory.name;
319
+ this.ref.detectChanges();
320
+ }
321
+ else if (noSelectionChange) {
322
+ this.ref.detectChanges();
323
+ }
324
+ }
325
+ handleSearch($emojis) {
326
+ this.SEARCH_CATEGORY.emojis = $emojis;
327
+ for (const component of this.categoryRefs.toArray()) {
328
+ if (component.name === 'Search') {
329
+ component.emojis = $emojis;
330
+ component.updateDisplay($emojis ? 'block' : 'none');
331
+ }
332
+ else {
333
+ component.updateDisplay($emojis ? 'none' : 'block');
334
+ }
335
+ }
336
+ this.scrollRef.nativeElement.scrollTop = 0;
337
+ this.handleScroll();
338
+ }
339
+ handleEnterKey($event, emoji) {
340
+ if (!emoji) {
341
+ if (this.SEARCH_CATEGORY.emojis !== null && this.SEARCH_CATEGORY.emojis.length) {
342
+ emoji = this.SEARCH_CATEGORY.emojis[0];
343
+ if (emoji) {
344
+ this.emojiSelect.emit({ $event, emoji });
345
+ }
346
+ else {
347
+ return;
348
+ }
349
+ }
350
+ }
351
+ if (!this.hideRecent && !this.recent && emoji) {
352
+ this.frequently.add(emoji);
353
+ }
354
+ const component = this.categoryRefs.toArray()[1];
355
+ if (component && this.enableFrequentEmojiSort) {
356
+ component.updateRecentEmojis();
357
+ component.ref.markForCheck();
358
+ }
359
+ }
360
+ handleEmojiOver($event) {
361
+ if (!this.showPreview || !this.previewRef) {
362
+ return;
363
+ }
364
+ const emojiData = this.CUSTOM_CATEGORY.emojis.find((customEmoji) => customEmoji.id === $event.emoji.id);
365
+ if (emojiData) {
366
+ $event.emoji = { ...emojiData };
367
+ }
368
+ this.previewEmoji = $event.emoji;
369
+ this.cancelAnimationFrame();
370
+ this.ref?.detectChanges();
371
+ }
372
+ handleEmojiLeave() {
373
+ if (!this.showPreview || !this.previewRef) {
374
+ return;
375
+ }
376
+ this.ngZone.runOutsideAngular(() => {
377
+ this.animationFrameRequestId = requestAnimationFrame(() => {
378
+ this.previewEmoji = null;
379
+ this.ref.detectChanges();
380
+ });
381
+ });
382
+ }
383
+ handleEmojiClick($event) {
384
+ this.emojiClick.emit($event);
385
+ this.emojiSelect.emit($event);
386
+ this.handleEnterKey($event.$event, $event.emoji);
387
+ }
388
+ handleSkinChange(skin) {
389
+ this.skin = skin;
390
+ localStorage.setItem(`${this.NAMESPACE}.skin`, String(skin));
391
+ this.skinChange.emit(skin);
392
+ }
393
+ getWidth() {
394
+ if (this.style && this.style.width) {
395
+ return this.style.width;
396
+ }
397
+ return this.perLine * (this.emojiSize + 12) + 12 + 2 + this.measureScrollbar + 'px';
398
+ }
399
+ cancelAnimationFrame() {
400
+ if (this.animationFrameRequestId !== null) {
401
+ cancelAnimationFrame(this.animationFrameRequestId);
402
+ this.animationFrameRequestId = null;
403
+ }
404
+ }
405
+ }
406
+ PickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: PickerComponent, deps: [{ token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.EmojiFrequentlyService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
407
+ PickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: PickerComponent, selector: "emoji-mart", inputs: { perLine: "perLine", totalFrequentLines: "totalFrequentLines", i18n: "i18n", style: "style", title: "title", emoji: "emoji", darkMode: "darkMode", color: "color", hideObsolete: "hideObsolete", categories: "categories", activeCategories: "activeCategories", set: "set", skin: "skin", isNative: "isNative", emojiSize: "emojiSize", sheetSize: "sheetSize", emojisToShowFilter: "emojisToShowFilter", showPreview: "showPreview", emojiTooltip: "emojiTooltip", autoFocus: "autoFocus", custom: "custom", hideRecent: "hideRecent", imageUrlFn: "imageUrlFn", include: "include", exclude: "exclude", notFoundEmoji: "notFoundEmoji", categoriesIcons: "categoriesIcons", searchIcons: "searchIcons", useButton: "useButton", enableFrequentEmojiSort: "enableFrequentEmojiSort", enableSearch: "enableSearch", showSingleCategory: "showSingleCategory", virtualize: "virtualize", virtualizeOffset: "virtualizeOffset", recent: "recent", backgroundImageFn: "backgroundImageFn" }, outputs: { emojiClick: "emojiClick", emojiSelect: "emojiSelect", skinChange: "skinChange" }, viewQueries: [{ propertyName: "scrollRef", first: true, predicate: ["scrollRef"], descendants: true, static: true }, { propertyName: "previewRef", first: true, predicate: PreviewComponent, descendants: true }, { propertyName: "searchRef", first: true, predicate: SearchComponent, descendants: true }, { propertyName: "categoryRefs", predicate: CategoryComponent, descendants: true }], ngImport: i0, template: "<section\n class=\"emoji-mart {{ darkMode ? 'emoji-mart-dark' : '' }}\"\n [style.width]=\"getWidth()\"\n [ngStyle]=\"style\"\n>\n <div class=\"emoji-mart-bar\">\n <emoji-mart-anchors\n [categories]=\"categories\"\n (anchorClick)=\"handleAnchorClick($event)\"\n [color]=\"color\"\n [selected]=\"selected\"\n [i18n]=\"i18n\"\n [icons]=\"categoriesIcons\"\n ></emoji-mart-anchors>\n </div>\n <emoji-search\n *ngIf=\"enableSearch\"\n [i18n]=\"i18n\"\n (searchResults)=\"handleSearch($event)\"\n (enterKey)=\"handleEnterKey($event)\"\n [include]=\"include\"\n [exclude]=\"exclude\"\n [custom]=\"custom\"\n [autoFocus]=\"autoFocus\"\n [icons]=\"searchIcons\"\n [emojisToShowFilter]=\"emojisToShowFilter\"\n ></emoji-search>\n <section #scrollRef class=\"emoji-mart-scroll\" [attr.aria-label]=\"i18n.emojilist\">\n <emoji-category\n *ngFor=\"let category of activeCategories; let idx = index; trackBy: categoryTrack\"\n [id]=\"category.id\"\n [name]=\"category.name\"\n [emojis]=\"category.emojis\"\n [perLine]=\"perLine\"\n [totalFrequentLines]=\"totalFrequentLines\"\n [hasStickyPosition]=\"isNative\"\n [i18n]=\"i18n\"\n [hideObsolete]=\"hideObsolete\"\n [notFoundEmoji]=\"notFoundEmoji\"\n [custom]=\"category.id === RECENT_CATEGORY.id ? CUSTOM_CATEGORY.emojis : undefined\"\n [recent]=\"category.id === RECENT_CATEGORY.id ? recent : undefined\"\n [virtualize]=\"virtualize\"\n [virtualizeOffset]=\"virtualizeOffset\"\n [emojiIsNative]=\"isNative\"\n [emojiSkin]=\"skin\"\n [emojiSize]=\"emojiSize\"\n [emojiSet]=\"set\"\n [emojiSheetSize]=\"sheetSize\"\n [emojiForceSize]=\"isNative\"\n [emojiTooltip]=\"emojiTooltip\"\n [emojiBackgroundImageFn]=\"backgroundImageFn\"\n [emojiImageUrlFn]=\"imageUrlFn\"\n [emojiUseButton]=\"useButton\"\n (emojiOver)=\"handleEmojiOver($event)\"\n (emojiLeave)=\"handleEmojiLeave()\"\n (emojiClick)=\"handleEmojiClick($event)\"\n ></emoji-category>\n </section>\n <div class=\"emoji-mart-bar\" *ngIf=\"showPreview\">\n <emoji-preview\n [title]=\"title\"\n [emoji]=\"previewEmoji\"\n [idleEmoji]=\"emoji\"\n [emojiIsNative]=\"isNative\"\n [emojiSize]=\"38\"\n [emojiSkin]=\"skin\"\n [emojiSet]=\"set\"\n [i18n]=\"i18n\"\n [emojiSheetSize]=\"sheetSize\"\n [emojiBackgroundImageFn]=\"backgroundImageFn\"\n [emojiImageUrlFn]=\"imageUrlFn\"\n (skinChange)=\"handleSkinChange($event)\"\n ></emoji-preview>\n </div>\n</section>\n", components: [{ type: i2.AnchorsComponent, selector: "emoji-mart-anchors", inputs: ["categories", "color", "selected", "i18n", "icons"], outputs: ["anchorClick"] }, { type: i3.SearchComponent, selector: "emoji-search", inputs: ["maxResults", "autoFocus", "i18n", "include", "exclude", "custom", "icons", "emojisToShowFilter"], outputs: ["searchResults", "enterKey"] }, { type: i4.CategoryComponent, selector: "emoji-category", inputs: ["emojis", "hasStickyPosition", "name", "perLine", "totalFrequentLines", "recent", "custom", "i18n", "id", "hideObsolete", "notFoundEmoji", "virtualize", "virtualizeOffset", "emojiIsNative", "emojiSkin", "emojiSize", "emojiSet", "emojiSheetSize", "emojiForceSize", "emojiTooltip", "emojiBackgroundImageFn", "emojiImageUrlFn", "emojiUseButton"], outputs: ["emojiOver", "emojiLeave", "emojiClick"] }, { type: i5.PreviewComponent, selector: "emoji-preview", inputs: ["title", "emoji", "idleEmoji", "i18n", "emojiIsNative", "emojiSkin", "emojiSize", "emojiSet", "emojiSheetSize", "emojiBackgroundImageFn", "emojiImageUrlFn"], outputs: ["skinChange"] }], directives: [{ type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
408
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: PickerComponent, decorators: [{
409
+ type: Component,
410
+ args: [{ selector: 'emoji-mart', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<section\n class=\"emoji-mart {{ darkMode ? 'emoji-mart-dark' : '' }}\"\n [style.width]=\"getWidth()\"\n [ngStyle]=\"style\"\n>\n <div class=\"emoji-mart-bar\">\n <emoji-mart-anchors\n [categories]=\"categories\"\n (anchorClick)=\"handleAnchorClick($event)\"\n [color]=\"color\"\n [selected]=\"selected\"\n [i18n]=\"i18n\"\n [icons]=\"categoriesIcons\"\n ></emoji-mart-anchors>\n </div>\n <emoji-search\n *ngIf=\"enableSearch\"\n [i18n]=\"i18n\"\n (searchResults)=\"handleSearch($event)\"\n (enterKey)=\"handleEnterKey($event)\"\n [include]=\"include\"\n [exclude]=\"exclude\"\n [custom]=\"custom\"\n [autoFocus]=\"autoFocus\"\n [icons]=\"searchIcons\"\n [emojisToShowFilter]=\"emojisToShowFilter\"\n ></emoji-search>\n <section #scrollRef class=\"emoji-mart-scroll\" [attr.aria-label]=\"i18n.emojilist\">\n <emoji-category\n *ngFor=\"let category of activeCategories; let idx = index; trackBy: categoryTrack\"\n [id]=\"category.id\"\n [name]=\"category.name\"\n [emojis]=\"category.emojis\"\n [perLine]=\"perLine\"\n [totalFrequentLines]=\"totalFrequentLines\"\n [hasStickyPosition]=\"isNative\"\n [i18n]=\"i18n\"\n [hideObsolete]=\"hideObsolete\"\n [notFoundEmoji]=\"notFoundEmoji\"\n [custom]=\"category.id === RECENT_CATEGORY.id ? CUSTOM_CATEGORY.emojis : undefined\"\n [recent]=\"category.id === RECENT_CATEGORY.id ? recent : undefined\"\n [virtualize]=\"virtualize\"\n [virtualizeOffset]=\"virtualizeOffset\"\n [emojiIsNative]=\"isNative\"\n [emojiSkin]=\"skin\"\n [emojiSize]=\"emojiSize\"\n [emojiSet]=\"set\"\n [emojiSheetSize]=\"sheetSize\"\n [emojiForceSize]=\"isNative\"\n [emojiTooltip]=\"emojiTooltip\"\n [emojiBackgroundImageFn]=\"backgroundImageFn\"\n [emojiImageUrlFn]=\"imageUrlFn\"\n [emojiUseButton]=\"useButton\"\n (emojiOver)=\"handleEmojiOver($event)\"\n (emojiLeave)=\"handleEmojiLeave()\"\n (emojiClick)=\"handleEmojiClick($event)\"\n ></emoji-category>\n </section>\n <div class=\"emoji-mart-bar\" *ngIf=\"showPreview\">\n <emoji-preview\n [title]=\"title\"\n [emoji]=\"previewEmoji\"\n [idleEmoji]=\"emoji\"\n [emojiIsNative]=\"isNative\"\n [emojiSize]=\"38\"\n [emojiSkin]=\"skin\"\n [emojiSet]=\"set\"\n [i18n]=\"i18n\"\n [emojiSheetSize]=\"sheetSize\"\n [emojiBackgroundImageFn]=\"backgroundImageFn\"\n [emojiImageUrlFn]=\"imageUrlFn\"\n (skinChange)=\"handleSkinChange($event)\"\n ></emoji-preview>\n </div>\n</section>\n" }]
411
+ }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.EmojiFrequentlyService }, { type: undefined, decorators: [{
412
+ type: Inject,
413
+ args: [PLATFORM_ID]
414
+ }] }]; }, propDecorators: { perLine: [{
415
+ type: Input
416
+ }], totalFrequentLines: [{
417
+ type: Input
418
+ }], i18n: [{
419
+ type: Input
420
+ }], style: [{
421
+ type: Input
422
+ }], title: [{
423
+ type: Input
424
+ }], emoji: [{
425
+ type: Input
426
+ }], darkMode: [{
427
+ type: Input
428
+ }], color: [{
429
+ type: Input
430
+ }], hideObsolete: [{
431
+ type: Input
432
+ }], categories: [{
433
+ type: Input
434
+ }], activeCategories: [{
435
+ type: Input
436
+ }], set: [{
437
+ type: Input
438
+ }], skin: [{
439
+ type: Input
440
+ }], isNative: [{
441
+ type: Input
442
+ }], emojiSize: [{
443
+ type: Input
444
+ }], sheetSize: [{
445
+ type: Input
446
+ }], emojisToShowFilter: [{
447
+ type: Input
448
+ }], showPreview: [{
449
+ type: Input
450
+ }], emojiTooltip: [{
451
+ type: Input
452
+ }], autoFocus: [{
453
+ type: Input
454
+ }], custom: [{
455
+ type: Input
456
+ }], hideRecent: [{
457
+ type: Input
458
+ }], imageUrlFn: [{
459
+ type: Input
460
+ }], include: [{
461
+ type: Input
462
+ }], exclude: [{
463
+ type: Input
464
+ }], notFoundEmoji: [{
465
+ type: Input
466
+ }], categoriesIcons: [{
467
+ type: Input
468
+ }], searchIcons: [{
469
+ type: Input
470
+ }], useButton: [{
471
+ type: Input
472
+ }], enableFrequentEmojiSort: [{
473
+ type: Input
474
+ }], enableSearch: [{
475
+ type: Input
476
+ }], showSingleCategory: [{
477
+ type: Input
478
+ }], virtualize: [{
479
+ type: Input
480
+ }], virtualizeOffset: [{
481
+ type: Input
482
+ }], recent: [{
483
+ type: Input
484
+ }], emojiClick: [{
485
+ type: Output
486
+ }], emojiSelect: [{
487
+ type: Output
488
+ }], skinChange: [{
489
+ type: Output
490
+ }], scrollRef: [{
491
+ type: ViewChild,
492
+ args: ['scrollRef', { static: true }]
493
+ }], previewRef: [{
494
+ type: ViewChild,
495
+ args: [PreviewComponent, { static: false }]
496
+ }], searchRef: [{
497
+ type: ViewChild,
498
+ args: [SearchComponent, { static: false }]
499
+ }], categoryRefs: [{
500
+ type: ViewChildren,
501
+ args: [CategoryComponent]
502
+ }], backgroundImageFn: [{
503
+ type: Input
504
+ }] } });
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGlja2VyL3BpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi9zcmMvbGliL3BpY2tlci9waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsTUFBTSxFQUNOLFdBQVcsRUFHWCxTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxVQUFVLEdBS1gsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxLQUFLLEtBQUssTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDOzs7Ozs7OztBQUUzQyxNQUFNLElBQUksR0FBUTtJQUNoQixNQUFNLEVBQUUsUUFBUTtJQUNoQixTQUFTLEVBQUUsZUFBZTtJQUMxQixRQUFRLEVBQUUsZ0JBQWdCO0lBQzFCLEtBQUssRUFBRSxPQUFPO0lBQ2QsVUFBVSxFQUFFO1FBQ1YsTUFBTSxFQUFFLGdCQUFnQjtRQUN4QixNQUFNLEVBQUUsaUJBQWlCO1FBQ3pCLE1BQU0sRUFBRSxrQkFBa0I7UUFDMUIsTUFBTSxFQUFFLGtCQUFrQjtRQUMxQixLQUFLLEVBQUUsY0FBYztRQUNyQixRQUFRLEVBQUUsVUFBVTtRQUNwQixNQUFNLEVBQUUsaUJBQWlCO1FBQ3pCLE9BQU8s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O2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDMkMsU0FBUztzQkFBMUQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNRLFVBQVU7c0JBQXpELFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNDLFNBQVM7c0JBQXZELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDWixZQUFZO3NCQUE1QyxZQUFZO3VCQUFDLGlCQUFpQjtnQkErQi9CLGlCQUFpQjtzQkFEaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIGNhdGVnb3JpZXMsXG4gIEVtb2ppLFxuICBFbW9qaUNhdGVnb3J5LFxuICBFbW9qaURhdGEsXG4gIEVtb2ppRXZlbnQsXG59IGZyb20gJ0BjdHJsL25neC1lbW9qaS1tYXJ0L25neC1lbW9qaSc7XG5pbXBvcnQgeyBDYXRlZ29yeUNvbXBvbmVudCB9IGZyb20gJy4vY2F0ZWdvcnkuY29tcG9uZW50JztcbmltcG9ydCB7IEVtb2ppRnJlcXVlbnRseVNlcnZpY2UgfSBmcm9tICcuL2Vtb2ppLWZyZXF1ZW50bHkuc2VydmljZSc7XG5pbXBvcnQgeyBQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi9wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hDb21wb25lbnQgfSBmcm9tICcuL3NlYXJjaC5jb21wb25lbnQnO1xuaW1wb3J0ICogYXMgaWNvbnMgZnJvbSAnLi9zdmdzJztcbmltcG9ydCB7IG1lYXN1cmVTY3JvbGxiYXIgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgSTE4TjogYW55ID0ge1xuICBzZWFyY2g6ICdTZWFyY2gnLFxuICBlbW9qaWxpc3Q6ICdMaXN0IG9mIGVtb2ppJyxcbiAgbm90Zm91bmQ6ICdObyBFbW9qaSBGb3VuZCcsXG4gIGNsZWFyOiAnQ2xlYXInLFxuICBjYXRlZ29yaWVzOiB7XG4gICAgc2VhcmNoOiAnU2VhcmNoIFJlc3VsdHMnLFxuICAgIHJlY2VudDogJ0ZyZXF1ZW50bHkgVXNlZCcsXG4gICAgcGVvcGxlOiAnU21pbGV5cyAmIFBlb3BsZScsXG4gICAgbmF0dXJlOiAnQW5pbWFscyAmIE5hdHVyZScsXG4gICAgZm9vZHM6ICdGb29kICYgRHJpbmsnLFxuICAgIGFjdGl2aXR5OiAnQWN0aXZpdHknLFxuICAgIHBsYWNlczogJ1RyYXZlbCAmIFBsYWNlcycsXG4gICAgb2JqZWN0czogJ09iamVjdHMnLFxuICAgIHN5bWJvbHM6ICdTeW1ib2xzJyxcbiAgICBmbGFnczogJ0ZsYWdzJyxcbiAgICBjdXN0b206ICdDdXN0b20nLFxuICB9LFxuICBza2ludG9uZXM6IHtcbiAgICAxOiAnRGVmYXVsdCBTa2luIFRvbmUnLFxuICAgIDI6ICdMaWdodCBTa2luIFRvbmUnLFxuICAgIDM6ICdNZWRpdW0tTGlnaHQgU2tpbiBUb25lJyxcbiAgICA0OiAnTWVkaXVtIFNraW4gVG9uZScsXG4gICAgNTogJ01lZGl1bS1EYXJrIFNraW4gVG9uZScsXG4gICAgNjogJ0RhcmsgU2tpbiBUb25lJyxcbiAgfSxcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Vtb2ppLW1hcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBlckxpbmUgPSA5O1xuICBASW5wdXQoKSB0b3RhbEZyZXF1ZW50TGluZXMgPSA0O1xuICBASW5wdXQoKSBpMThuOiBhbnkgPSB7fTtcbiAgQElucHV0KCkgc3R5bGU6IGFueSA9IHt9O1xuICBASW5wdXQoKSB0aXRsZSA9ICdFbW9qaSBNYXJ04oSiJztcbiAgQElucHV0KCkgZW1vamkgPSAnZGVwYXJ0bWVudF9zdG9yZSc7XG4gIEBJbnB1dCgpIGRhcmtNb2RlID0gISEoXG4gICAgdHlwZW9mIG1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbicgJiYgbWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXNcbiAgKTtcbiAgQElucHV0KCkgY29sb3IgPSAnI2FlNjVjNSc7XG4gIEBJbnB1dCgpIGhpZGVPYnNvbGV0ZSA9IHRydWU7XG4gIC8qKiBhbGwgY2F0ZWdvcmllcyBzaG93biAqL1xuICBASW5wdXQoKSBjYXRlZ29yaWVzOiBFbW9qaUNhdGVnb3J5W10gPSBbXTtcbiAgLyoqIHVzZWQgdG8gdGVtcG9yYXJpbHkgZHJhdyBjYXRlZ29yaWVzICovXG4gIEBJbnB1dCgpIGFjdGl2ZUNhdGVnb3JpZXM6IEVtb2ppQ2F0ZWdvcnlbXSA9IFtdO1xuICBASW5wdXQoKSBzZXQ6IEVtb2ppWydzZXQnXSA9ICdhcHBsZSc7XG4gIEBJbnB1dCgpIHNraW46IEVtb2ppWydza2luJ10gPSAxO1xuICAvKiogUmVuZGVycyB0aGUgbmF0aXZlIHVuaWNvZGUgZW1vamkgKi9cbiAgQElucHV0KCkgaXNOYXRpdmU6IEVtb2ppWydpc05hdGl2ZSddID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVtb2ppU2l6ZTogRW1vamlbJ3NpemUnXSA9IDI0O1xuICBASW5wdXQoKSBzaGVldFNpemU6IEVtb2ppWydzaGVldFNpemUnXSA9IDY0O1xuICBASW5wdXQoKSBlbW9qaXNUb1Nob3dGaWx0ZXI/OiAoeDogc3RyaW5nKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93UHJldmlldyA9IHRydWU7XG4gIEBJbnB1dCgpIGVtb2ppVG9vbHRpcCA9IGZhbHNlO1xuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcbiAgQElucHV0KCkgY3VzdG9tOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBoaWRlUmVjZW50ID0gdHJ1ZTtcbiAgQElucHV0KCkgaW1hZ2VVcmxGbjogRW1vamlbJ2ltYWdlVXJsRm4nXTtcbiAgQElucHV0KCkgaW5jbHVkZT86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBleGNsdWRlPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIG5vdEZvdW5kRW1vamkgPSAnc2xldXRoX29yX3NweSc7XG4gIEBJbnB1dCgpIGNhdGVnb3JpZXNJY29ucyA9IGljb25zLmNhdGVnb3JpZXM7XG4gIEBJbnB1dCgpIHNlYXJjaEljb25zID0gaWNvbnMuc2VhcmNoO1xuICBASW5wdXQoKSB1c2VCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KCkgZW5hYmxlRnJlcXVlbnRFbW9qaVNvcnQgPSBmYWxzZTtcbiAgQElucHV0KCkgZW5hYmxlU2VhcmNoID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd1NpbmdsZUNhdGVnb3J5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZpcnR1YWxpemUgPSBmYWxzZTtcbiAgQElucHV0KCkgdmlydHVhbGl6ZU9mZnNldCA9IDA7XG4gIEBJbnB1dCgpIHJlY2VudD86IHN0cmluZ1tdO1xuICBAT3V0cHV0KCkgZW1vamlDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgZW1vamlTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNraW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEVtb2ppWydza2luJ10+KCk7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbFJlZicsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgc2Nyb2xsUmVmITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChQcmV2aWV3Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgcHJldmlld1JlZj86IFByZXZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoU2VhcmNoQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgc2VhcmNoUmVmPzogU2VhcmNoQ29tcG9uZW50O1xuICBAVmlld0NoaWxkcmVuKENhdGVnb3J5Q29tcG9uZW50KSBjYXRlZ29yeVJlZnMhOiBRdWVyeUxpc3Q8Q2F0ZWdvcnlDb21wb25lbnQ+O1xuICBzY3JvbGxIZWlnaHQgPSAwO1xuICBjbGllbnRIZWlnaHQgPSAwO1xuICBjbGllbnRXaWR0aCA9IDA7XG4gIHNlbGVjdGVkPzogc3RyaW5nO1xuICBuZXh0U2Nyb2xsPzogc3RyaW5nO1xuICBzY3JvbGxUb3A/OiBudW1iZXI7XG4gIGZpcnN0UmVuZGVyID0gdHJ1ZTtcbiAgcHJldmlld0Vtb2ppOiBhbnk7XG4gIGFuaW1hdGlvbkZyYW1lUmVxdWVzdElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgTkFNRVNQQUNFID0gJ2Vtb2ppLW1hcnQnO1xuICBtZWFzdXJlU2Nyb2xsYmFyID0gMDtcbiAgUkVDRU5UX0NBVEVHT1JZOiBFbW9qaUNhdGVnb3J5ID0ge1xuICAgIGlkOiAncmVjZW50JyxcbiAgICBuYW1lOiAnUmVjZW50JyxcbiAgICBlbW9qaXM6IG51bGwsXG4gIH07XG4gIFNFQVJDSF9DQVRFR09SWTogRW1vamlDYXRlZ29yeSA9IHtcbiAgICBpZDogJ3NlYXJjaCcsXG4gICAgbmFtZTogJ1NlYXJjaCcsXG4gICAgZW1vamlzOiBudWxsLFxuICAgIGFuY2hvcjogZmFsc2UsXG4gIH07XG4gIENVU1RPTV9DQVRFR09SWTogRW1vamlDYXRlZ29yeSA9IHtcbiAgICBpZDogJ2N1c3RvbScsXG4gICAgbmFtZTogJ0N1c3RvbScsXG4gICAgZW1vamlzOiBbXSxcbiAgfTtcbiAgcHJpdmF0ZSBzY3JvbGxMaXN0ZW5lciE6ICgpID0+IHZvaWQ7XG5cbiAgQElucHV0KClcbiAgYmFja2dyb3VuZEltYWdlRm46IEVtb2ppWydiYWNrZ3JvdW5kSW1hZ2VGbiddID0gKHNldDogc3RyaW5nLCBzaGVldFNpemU6IG51bWJlcikgPT5cbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vZW1vamktZGF0YXNvdXJjZS0ke3RoaXMuc2V0fUA2LjAuMS9pbWcvJHt0aGlzLnNldH0vc2hlZXRzLTI1Ni8ke3RoaXMuc2hlZXRTaXplfS5wbmdgXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZnJlcXVlbnRseTogRW1vamlGcmVxdWVudGx5U2VydmljZSxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IHN0cmluZyxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIG1lYXN1cmUgc2Nyb2xsXG4gICAgdGhpcy5tZWFzdXJlU2Nyb2xsYmFyID0gbWVhc3VyZVNjcm9sbGJhcigpO1xuXG4gICAgdGhpcy5pMThuID0geyAuLi5JMThOLCAuLi50aGlzLmkxOG4gfTtcbiAgICB0aGlzLmkxOG4uY2F0ZWdvcmllcyA9IHsgLi4uSTE4Ti5jYXRlZ29yaWVzLCAuLi50aGlzLmkxOG4uY2F0ZWdvcmllcyB9O1xuICAgIHRoaXMuc2tpbiA9XG4gICAgICBKU09OLnBhcnNlKFxuICAgICAgICAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLk5BTUVTUEFDRX0uc2tpbmApKSB8fFxuICAgICAgICAgICdudWxsJyxcbiAgICAgICkgfHwgdGhpcy5za2luO1xuXG4gICAgY29uc3QgYWxsQ2F0ZWdvcmllcyA9IFsuLi5jYXRlZ29yaWVzXTtcblxuICAgIGlmICh0aGlzLmN1c3RvbS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLkNVU1RPTV9DQVRFR09SWS5lbW9qaXMgPSB0aGlzLmN1c3RvbS5tYXAoZW1vamkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmVtb2ppLFxuICAgICAgICAgIC8vIGA8Q2F0ZWdvcnkgLz5gIGV4cGVjdHMgZW1vamkgdG8gaGF2ZSBhbiBgaWRgLlxuICAgICAgICAgIGlkOiBlbW9qaS5zaG9ydE5hbWVzWzBdLFxuICAgICAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBhbGxDYXRlZ29yaWVzLnB1c2godGhpcy5DVVNUT01fQ0FURUdPUlkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluY2x1ZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWxsQ2F0ZWdvcmllcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGUhLmluZGV4T2YoYS5pZCkgPiB0aGlzLmluY2x1ZGUhLmluZGV4T2YoYi5pZCkpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGFsbENhdGVnb3JpZXMpIHtcbiAgICAgIGNvbnN0IGlzSW5jbHVkZWQgPVxuICAgICAgICB0aGlzLmluY2x1ZGUgJiYgdGhpcy5pbmNsdWRlLmxlbmd0aCA/IHRoaXMuaW5jbHVkZS5pbmRleE9mKGNhdGVnb3J5LmlkKSA+IC0xIDogdHJ1ZTtcbiAgICAgIGNvbnN0IGlzRXhjbHVkZWQgPVxuICAgICAgICB0aGlzLmV4Y2x1ZGUgJiYgdGhpcy5leGNsdWRlLmxlbmd0aCA/IHRoaXMuZXhjbHVkZS5pbmRleE9mKGNhdGVnb3J5LmlkKSA+IC0xIDogZmFsc2U7XG4gICAgICBpZiAoIWlzSW5jbHVkZWQgfHwgaXNFeGNsdWRlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZW1vamlzVG9TaG93RmlsdGVyKSB7XG4gICAgICAgIGNvbnN0IG5ld0Vtb2ppcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHsgZW1vamlzIH0gPSBjYXRlZ29yeTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZm9yLW9mXG4gICAgICAgIGZvciAobGV0IGVtb2ppSW5kZXggPSAwOyBlbW9qaUluZGV4IDwgZW1vamlzIS5sZW5ndGg7IGVtb2ppSW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IGVtb2ppID0gZW1vamlzIVtlbW9qaUluZGV4XTtcbiAgICAgICAgICBpZiAodGhpcy5lbW9qaXNUb1Nob3dGaWx0ZXIoZW1vamkpKSB7XG4gICAgICAgICAgICBuZXdFbW9qaXMucHVzaChlbW9qaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0Vtb2ppcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBuZXdDYXRlZ29yeSA9IHtcbiAgICAgICAgICAgIGVtb2ppczogbmV3RW1vamlzLFxuICAgICAgICAgICAgbmFtZTogY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgIGlkOiBjYXRlZ29yeS5pZCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzLnB1c2gobmV3Q2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhdGVnb3JpZXMucHVzaChjYXRlZ29yeSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2F0ZWdvcmllc0ljb25zID0geyAuLi5pY29ucy5jYXRlZ29yaWVzLCAuLi50aGlzLmNhdGVnb3JpZXNJY29ucyB9O1xuICAgICAgdGhpcy5zZWFyY2hJY29ucyA9IHsgLi4uaWNvbnMuc2VhcmNoLCAuLi50aGlzLnNlYXJjaEljb25zIH07XG4gICAgfVxuXG4gICAgY29uc3QgaW5jbHVkZVJlY2VudCA9XG4gICAgICB0aGlzLmluY2x1ZGUgJiYgdGhpcy5pbmNsdWRlLmxlbmd0aFxuICAgICAgICA/IHRoaXMuaW5jbHVkZS5pbmRleE9mKHRoaXMuUkVDRU5UX0NBVEVHT1JZLmlkKSA+IC0xXG4gICAgICAgIDogdHJ1ZTtcbiAgICBjb25zdCBleGNsdWRlUmVjZW50ID1cbiAgICAgIHRoaXMuZXhjbHVkZSAmJiB0aGlzLmV4Y2x1ZGUubGVuZ3RoXG4gICAgICAgID8gdGhpcy5leGNsdWRlLmluZGV4T2YodGhpcy5SRUNFTlRfQ0FURUdPUlkuaWQpID4gLTFcbiAgICAgICAgOiBmYWxzZTtcbiAgICBpZiAoaW5jbHVkZVJlY2VudCAmJiAhZXhjbHVkZVJlY2VudCkge1xuICAgICAgdGhpcy5oaWRlUmVjZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMudW5zaGlmdCh0aGlzLlJFQ0VOVF9DQVRFR09SWSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2F0ZWdvcmllc1swXSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzWzBdLmZpcnN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmNhdGVnb3JpZXMudW5zaGlmdCh0aGlzLlNFQVJDSF9DQVRFR09SWSk7XG4gICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoY2F0ZWdvcnkgPT4gY2F0ZWdvcnkuZmlyc3QpWzBdLm5hbWU7XG5cbiAgICAvLyBOZWVkIHRvIGJlIGNhcmVmdWwgaWYgc21hbGwgbnVtYmVyIG9mIGNhdGVnb3JpZXNcbiAgICBjb25zdCBjYXRlZ29yaWVzVG9Mb2FkRmlyc3QgPSBNYXRoLm1pbih0aGlzLmNhdGVnb3JpZXMubGVuZ3RoLCAzKTtcbiAgICB0aGlzLnNldEFjdGl2ZUNhdGVnb3JpZXMoXG4gICAgICAodGhpcy5hY3RpdmVDYXRlZ29yaWVzID0gdGhpcy5jYXRlZ29yaWVzLnNsaWNlKDAsIGNhdGVnb3JpZXNUb0xvYWRGaXJzdCkpLFxuICAgICk7XG5cbiAgICAvLyBUcmltIGxhc3QgYWN0aXZlIGNhdGVnb3J5XG4gICAgY29uc3QgbGFzdEFjdGl2ZUNhdGVnb3J5RW1vamlzID0gdGhpcy5jYXRlZ29yaWVzW2NhdGVnb3JpZXNUb0xvYWRGaXJzdCAtIDFdLmVtb2ppcyEuc2xpY2UoKTtcbiAgICB0aGlzLmNhdGVnb3JpZXNbY2F0ZWdvcmllc1RvTG9hZEZpcnN0IC0gMV0uZW1vamlzID0gbGFzdEFjdGl2ZUNhdGVnb3J5RW1vamlzLnNsaWNlKDAsIDYwKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gUmVzdG9yZSBsYXN0IGNhdGVnb3J5XG4gICAgICB0aGlzLmNhdGVnb3JpZXNbY2F0ZWdvcmllc1RvTG9hZEZpcnN0IC0gMV0uZW1vamlzID0gbGFzdEFjdGl2ZUNhdGVnb3J5RW1vamlzO1xuICAgICAgdGhpcy5zZXRBY3RpdmVDYXRlZ29yaWVzKHRoaXMuY2F0ZWdvcmllcyk7XG4gICAgICAvLyBUaGUgYHNldFRpbWVvdXRgIHdpbGwgdHJpZ2dlciB0aGUgY2hhbmdlIGRldGVjdGlvbiwgYnV0IHNpbmNlIHdlJ3JlIGluc2lkZVxuICAgICAgLy8gdGhlIE9uUHVzaCBjb21wb25lbnQgd2UgY2FuIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGxvY2FsbHkgc3RhcnRpbmcgZnJvbSB0aGlzXG4gICAgICAvLyBjb21wb25lbnQgYW5kIGdvaW5nIGRvd24gdG8gdGhlIGNoaWxkcmVuLlxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSAmJlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgLy8gVGhlIGB1cGRhdGVDYXRlZ29yaWVzU2l6ZWAgZG9lc24ndCBjaGFuZ2UgcHJvcGVydGllcyB0aGF0IGFyZSB1c2VkXG4gICAgICAgICAgLy8gaW4gdGVtcGxhdGVzLCB0aHVzIHRoaXMgaXMgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSByb290IHpvbmUgdG8gYXZvaWRcbiAgICAgICAgICAvLyBydW5uaW5nIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2F0ZWdvcmllc1NpemUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAvLyBET00gZXZlbnRzIHRoYXQgYXJlIGxpc3RlbmVkIGJ5IEFuZ3VsYXIgaW5zaWRlIHRoZSB0ZW1wbGF0ZSB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIC8vIGFuZCBhbHNvIHdyYXBwZWQgaW50byBhZGRpdGlvbmFsIGZ1bmN0aW9ucyB0aGF0IGNhbGwgYG1hcmtGb3JDaGVjaygpYC4gV2UgbGlzdGVuIGBzY3JvbGxgXG4gICAgICAvLyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcm9vdCB6b25lIHNpbmNlIGl0IHdpbGwgbm90IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBlYWNoIHRpbWVcbiAgICAgIC8vIHRoZSBgc2Nyb2xsYCBldmVudCBpcyBkaXNwYXRjaGVkLlxuICAgICAgdGhpcy5zY3JvbGxMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuc2Nyb2xsUmVmLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsTGlzdGVuZXIoKTtcbiAgICAvLyBUaGlzIGlzIGNhbGxlZCBoZXJlIGJlY2F1c2UgdGhlIGNvbXBvbmVudCBtaWdodCBiZSBkZXN0cm95ZWRcbiAgICAvLyBidXQgdGhlcmUgd2lsbCBzdGlsbCBiZSBhIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrIGluIHRoZSBxdWV1ZVxuICAgIC8vIHRoYXQgY2FsbHMgYGRldGVjdENoYW5nZXMoKWAgb24gdGhlIGBWaWV3UmVmYC4gVGhpcyB3aWxsIGxlYWQgdG8gYSBydW50aW1lXG4gICAgLy8gZXhjZXB0aW9uIGlmIHRoZSBgZGV0ZWN0Q2hhbmdlcygpYCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGBWaWV3UmVmYCBpcyBkZXN0cm95ZWQuXG4gICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSgpO1xuICB9XG5cbiAgc2V0QWN0aXZlQ2F0ZWdvcmllcyhjYXRlZ29yaWVzVG9NYWtlQWN0aXZlOiBBcnJheTxFbW9qaUNhdGVnb3J5Pikge1xuICAgIGlmICh0aGlzLnNob3dTaW5nbGVDYXRlZ29yeSkge1xuICAgICAgdGhpcy5hY3RpdmVDYXRlZ29yaWVzID0gY2F0ZWdvcmllc1RvTWFrZUFjdGl2ZS5maWx0ZXIoXG4gICAgICAgIHggPT4geC5uYW1lID09PSB0aGlzLnNlbGVjdGVkIHx8IHggPT09IHRoaXMuU0VBUkNIX0NBVEVHT1JZLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVDYXRlZ29yaWVzID0gY2F0ZWdvcmllc1RvTWFrZUFjdGl2ZTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlQ2F0ZWdvcmllc1NpemUoKSB7XG4gICAgdGhpcy5jYXRlZ29yeVJlZnMuZm9yRWFjaChjb21wb25lbnQgPT4gY29tcG9uZW50Lm1lbW9pemVTaXplKCkpO1xuXG4gICAgaWYgKHRoaXMuc2Nyb2xsUmVmKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnNjcm9sbFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgdGhpcy5zY3JvbGxIZWlnaHQgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgdGhpcy5jbGllbnRIZWlnaHQgPSB0YXJnZXQuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5jbGllbnRXaWR0aCA9IHRhcmdldC5jbGllbnRXaWR0aDtcbiAgICB9XG4gIH1cbiAgaGFuZGxlQW5jaG9yQ2xpY2soJGV2ZW50OiB7IGNhdGVnb3J5OiBFbW9qaUNhdGVnb3J5OyBpbmRleDogbnVtYmVyIH0pIHtcbiAgICB0aGlzLnVwZGF0ZUNhdGVnb3JpZXNTaXplKCk7XG4gICAgdGhpcy5zZWxlY3RlZCA9ICRldmVudC5jYXRlZ29yeS5uYW1lO1xuICAgIHRoaXMuc2V0QWN0aXZlQ2F0ZWdvcmllcyh0aGlzLmNhdGVnb3JpZXMpO1xuXG4gICAgaWYgKHRoaXMuU0VBUkNIX0NBVEVHT1JZLmVtb2ppcykge1xuICAgICAgdGhpcy5oYW5kbGVTZWFyY2gobnVsbCk7XG4gICAgICB0aGlzLnNlYXJjaFJlZj8uY2xlYXIoKTtcbiAgICAgIHRoaXMuaGFuZGxlQW5jaG9yQ2xpY2soJGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNhdGVnb3J5UmVmcy5maW5kKG4gPT4gbi5pZCA9PT0gJGV2ZW50LmNhdGVnb3J5LmlkKTtcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBsZXQgeyB0b3AgfSA9IGNvbXBvbmVudDtcblxuICAgICAgaWYgKCRldmVudC5jYXRlZ29yeS5maXJzdCkge1xuICAgICAgICB0b3AgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9wICs9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLnNjcm9sbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRvcDtcbiAgICB9XG4gICAgdGhpcy5uZXh0U2Nyb2xsID0gJGV2ZW50LmNhdGVnb3J5Lm5hbWU7XG5cbiAgICAvLyBoYW5kbGUgY29tcG9uZW50IHNjcm9sbGluZyB0byBsb2FkIGVtb2ppc1xuICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgdGhpcy5jYXRlZ29yaWVzKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRUb1Njcm9sbCA9IHRoaXMuY2F0ZWdvcnlSZWZzLmZpbmQoKHsgaWQgfSkgPT4gaWQgPT09IGNhdGVnb3J5LmlkKTtcbiAgICAgIGNvbXBvbmVudFRvU2Nyb2xsPy5oYW5kbGVTY3JvbGwodGhpcy5zY3JvbGxSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxUb3ApO1xuICAgIH1cbiAgfVxuICBjYXRlZ29yeVRyYWNrKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG4gIGhhbmRsZVNjcm9sbChub1NlbGVjdGlvbkNoYW5nZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMubmV4dFNjcm9sbCkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMubmV4dFNjcm9sbDtcbiAgICAgIHRoaXMubmV4dFNjcm9sbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNjcm9sbFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93U2luZ2xlQ2F0ZWdvcnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYWN0aXZlQ2F0ZWdvcnk6IEVtb2ppQ2F0ZWdvcnkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuU0VBUkNIX0NBVEVHT1JZLmVtb2ppcykge1xuICAgICAgYWN0aXZlQ2F0ZWdvcnkgPSB0aGlzLlNFQVJDSF9DQVRFR09SWTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5zY3JvbGxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIC8vIGNoZWNrIHNjcm9sbCBpcyBub3QgYXQgYm90dG9tXG4gICAgICBpZiAodGFyZ2V0LnNjcm9sbFRvcCA9PT0gMCkge1xuICAgICAgICAvLyBoaXQgdGhlIFRPUFxuICAgICAgICBhY3RpdmVDYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcmllcy5maW5kKG4gPT4gbi5maXJzdCA9PT0gdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRhcmdldC5zY3JvbGxIZWlnaHQgLSB0YXJnZXQuc2Nyb2xsVG9wID09PSB0aGlzLmNsaWVudEhlaWdodCkge1xuICAgICAgICAvLyBzY3JvbGxlZCB0byBib3R0b20gYWN0aXZhdGUgbGFzdCBjYXRlZ29yeVxuICAgICAgICBhY3RpdmVDYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcmllc1t0aGlzLmNhdGVnb3JpZXMubGVuZ3RoIC0gMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzY3JvbGxpbmdcbiAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiB0aGlzLmNhdGVnb3JpZXMpIHtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNhdGVnb3J5UmVmcy5maW5kKCh7IGlkIH0pID0+IGlkID09PSBjYXRlZ29yeS5pZCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gY29tcG9uZW50Py5oYW5kbGVTY3JvbGwodGFyZ2V0LnNjcm9sbFRvcCk7XG4gICAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgYWN0aXZlQ2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsVG9wO1xuICAgIH1cbiAgICAvLyBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gcnVuIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIG9ubHkgd2hlbiB0aGUgY2F0ZWdvcnkgY2hhbmdlcy5cbiAgICBpZiAoIW5vU2VsZWN0aW9uQ2hhbmdlICYmIGFjdGl2ZUNhdGVnb3J5ICYmIGFjdGl2ZUNhdGVnb3J5Lm5hbWUgIT09IHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBhY3RpdmVDYXRlZ29yeS5uYW1lO1xuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSBpZiAobm9TZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlU2VhcmNoKCRlbW9qaXM6IGFueVtdIHwgbnVsbCkge1xuICAgIHRoaXMuU0VBUkNIX0NBVEVHT1JZLmVtb2ppcyA9ICRlbW9qaXM7XG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5jYXRlZ29yeVJlZnMudG9BcnJheSgpKSB7XG4gICAgICBpZiAoY29tcG9uZW50Lm5hbWUgPT09ICdTZWFyY2gnKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbW9qaXMgPSAkZW1vamlzO1xuICAgICAgICBjb21wb25lbnQudXBkYXRlRGlzcGxheSgkZW1vamlzID8gJ2Jsb2NrJyA6ICdub25lJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudXBkYXRlRGlzcGxheSgkZW1vamlzID8gJ25vbmUnIDogJ2Jsb2NrJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIHRoaXMuaGFuZGxlU2Nyb2xsKCk7XG4gIH1cblxuICBoYW5kbGVFbnRlcktleSgkZXZlbnQ6IEV2ZW50LCBlbW9qaT86IEVtb2ppRGF0YSkge1xuICAgIGlmICghZW1vamkpIHtcbiAgICAgIGlmICh0aGlzLlNFQVJDSF9DQVRFR09SWS5lbW9qaXMgIT09IG51bGwgJiYgdGhpcy5TRUFSQ0hfQ0FURUdPUlkuZW1vamlzLmxlbmd0aCkge1xuICAgICAgICBlbW9qaSA9IHRoaXMuU0VBUkNIX0NBVEVHT1JZLmVtb2ppc1swXTtcbiAgICAgICAgaWYgKGVtb2ppKSB7XG4gICAgICAgICAgdGhpcy5lbW9qaVNlbGVjdC5lbWl0KHsgJGV2ZW50LCBlbW9qaSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGlkZVJlY2VudCAmJiAhdGhpcy5yZWNlbnQgJiYgZW1vamkpIHtcbiAgICAgIHRoaXMuZnJlcXVlbnRseS5hZGQoZW1vamkpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY2F0ZWdvcnlSZWZzLnRvQXJyYXkoKVsxXTtcbiAgICBpZiAoY29tcG9uZW50ICYmIHRoaXMuZW5hYmxlRnJlcXVlbnRFbW9qaVNvcnQpIHtcbiAgICAgIGNvbXBvbmVudC51cGRhdGVSZWNlbnRFbW9qaXMoKTtcbiAgICAgIGNvbXBvbmVudC5yZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIGhhbmRsZUVtb2ppT3ZlcigkZXZlbnQ6IEVtb2ppRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuc2hvd1ByZXZpZXcgfHwgIXRoaXMucHJldmlld1JlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVtb2ppRGF0YSA9IHRoaXMuQ1VTVE9NX0NBVEVHT1JZLmVtb2ppcyEuZmluZChcbiAgICAgIChjdXN0b21FbW9qaTogYW55KSA9PiBjdXN0b21FbW9qaS5pZCA9PT0gJGV2ZW50LmVtb2ppLmlkLFxuICAgICk7XG4gICAgaWYgKGVtb2ppRGF0YSkge1xuICAgICAgJGV2ZW50LmVtb2ppID0geyAuLi5lbW9qaURhdGEgfTtcbiAgICB9XG5cbiAgICB0aGlzLnByZXZpZXdFbW9qaSA9ICRldmVudC5lbW9qaTtcbiAgICB0aGlzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKCk7XG4gICAgdGhpcy5yZWY/LmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICBoYW5kbGVFbW9qaUxlYXZlKCkge1xuICAgIGlmICghdGhpcy5zaG93UHJldmlldyB8fCAhdGhpcy5wcmV2aWV3UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZVJlcXVlc3RJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucHJldmlld0Vtb2ppID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlRW1vamlDbGljaygkZXZlbnQ6IEVtb2ppRXZlbnQpIHtcbiAgICB0aGlzLmVtb2ppQ2xpY2suZW1pdCgkZXZlbnQpO1xuICAgIHRoaXMuZW1vamlTZWxlY3QuZW1pdCgkZXZlbnQpO1xuICAgIHRoaXMuaGFuZGxlRW50ZXJLZXkoJGV2ZW50LiRldmVudCwgJGV2ZW50LmVtb2ppKTtcbiAgfVxuICBoYW5kbGVTa2luQ2hhbmdlKHNraW46IEVtb2ppWydza2luJ10pIHtcbiAgICB0aGlzLnNraW4gPSBza2luO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuTkFNRVNQQUNFfS5za2luYCwgU3RyaW5nKHNraW4pKTtcbiAgICB0aGlzLnNraW5DaGFuZ2UuZW1pdChza2luKTtcbiAgfVxuICBnZXRXaWR0aCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUud2lkdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0eWxlLndpZHRoO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wZXJMaW5lICogKHRoaXMuZW1vamlTaXplICsgMTIpICsgMTIgKyAyICsgdGhpcy5tZWFzdXJlU2Nyb2xsYmFyICsgJ3B4JztcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsQW5pbWF0aW9uRnJhbWUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRnJhbWVSZXF1ZXN0SWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVSZXF1ZXN0SWQpO1xuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZVJlcXVlc3RJZCA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iLCI8c2VjdGlvblxuICBjbGFzcz1cImVtb2ppLW1hcnQge3sgZGFya01vZGUgPyAnZW1vamktbWFydC1kYXJrJyA6ICcnIH19XCJcbiAgW3N0eWxlLndpZHRoXT1cImdldFdpZHRoKClcIlxuICBbbmdTdHlsZV09XCJzdHlsZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJlbW9qaS1tYXJ0LWJhclwiPlxuICAgIDxlbW9qaS1tYXJ0LWFuY2hvcnNcbiAgICAgIFtjYXRlZ29yaWVzXT1cImNhdGVnb3JpZXNcIlxuICAgICAgKGFuY2hvckNsaWNrKT1cImhhbmRsZUFuY2hvckNsaWNrKCRldmVudClcIlxuICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZFwiXG4gICAgICBbaTE4bl09XCJpMThuXCJcbiAgICAgIFtpY29uc109XCJjYXRlZ29yaWVzSWNvbnNcIlxuICAgID48L2Vtb2ppLW1hcnQtYW5jaG9ycz5cbiAgPC9kaXY+XG4gIDxlbW9qaS1zZWFyY2hcbiAgICAqbmdJZj1cImVuYWJsZVNlYXJjaFwiXG4gICAgW2kxOG5dPVwiaTE4blwiXG4gICAgKHNlYXJjaFJlc3VsdHMpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIlxuICAgIChlbnRlcktleSk9XCJoYW5kbGVFbnRlcktleSgkZXZlbnQpXCJcbiAgICBbaW5jbHVkZV09XCJpbmNsdWRlXCJcbiAgICBbZXhjbHVkZV09XCJleGNsdWRlXCJcbiAgICBbY3VzdG9tXT1cImN1c3RvbVwiXG4gICAgW2F1dG9Gb2N1c109XCJhdXRvRm9jdXNcIlxuICAgIFtpY29uc109XCJzZWFyY2hJY29uc1wiXG4gICAgW2Vtb2ppc1RvU2hvd0ZpbHRlcl09XCJlbW9qaXNUb1Nob3dGaWx0ZXJcIlxuICA+PC9lbW9qaS1zZWFyY2g+XG4gIDxzZWN0aW9uICNzY3JvbGxSZWYgY2xhc3M9XCJlbW9qaS1tYXJ0LXNjcm9sbFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaTE4bi5lbW9qaWxpc3RcIj5cbiAgICA8ZW1vamktY2F0ZWdvcnlcbiAgICAgICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBhY3RpdmVDYXRlZ29yaWVzOyBsZXQgaWR4ID0gaW5kZXg7IHRyYWNrQnk6IGNhdGVnb3J5VHJhY2tcIlxuICAgICAgW2lkXT1cImNhdGVnb3J5LmlkXCJcbiAgICAgIFtuYW1lXT1cImNhdGVnb3J5Lm5hbWVcIlxuICAgICAgW2Vtb2ppc109XCJjYXRlZ29yeS5lbW9qaXNcIlxuICAgICAgW3BlckxpbmVdPVwicGVyTGluZVwiXG4gICAgICBbdG90YWxGcmVxdWVudExpbmVzXT1cInRvdGFsRnJlcXVlbnRMaW5lc1wiXG4gICAgICBbaGFzU3RpY2t5UG9zaXRpb25dPVwiaXNOYXRpdmVcIlxuICAgICAgW2kxOG5dPVwiaTE4blwiXG4gICAgICBbaGlkZU9ic29sZXRlXT1cImhpZGVPYnNvbGV0ZVwiXG4gICAgICBbbm90Rm91bmRFbW9qaV09XCJub3RGb3VuZEVtb2ppXCJcbiAgICAgIFtjdXN0b21dPVwiY2F0ZWdvcnkuaWQgPT09IFJFQ0VOVF9DQVRFR09SWS5pZCA/IENVU1RPTV9DQVRFR09SWS5lbW9qaXMgOiB1bmRlZmluZWRcIlxuICAgICAgW3JlY2VudF09XCJjYXRlZ29yeS5pZCA9PT0gUkVDRU5UX0NBVEVHT1JZLmlkID8gcmVjZW50IDogdW5kZWZpbmVkXCJcbiAgICAgIFt2aXJ0dWFsaXplXT1cInZpcnR1YWxpemVcIlxuICAgICAgW3ZpcnR1YWxpemVPZmZzZXRdPVwidmlydHVhbGl6ZU9mZnNldFwiXG4gICAgICBbZW1vamlJc05hdGl2ZV09XCJpc05hdGl2ZVwiXG4gICAgICBbZW1vamlTa2luXT1cInNraW5cIlxuICAgICAgW2Vtb2ppU2l6ZV09XCJlbW9qaVNpemVcIlxuICAgICAgW2Vtb2ppU2V0XT1cInNldFwiXG4gICAgICBbZW1vamlTaGVldFNpemVdPVwic2hlZXRTaXplXCJcbiAgICAgIFtlbW9qaUZvcmNlU2l6ZV09XCJpc05hdGl2ZVwiXG4gICAgICBbZW1vamlUb29sdGlwXT1cImVtb2ppVG9vbHRpcFwiXG4gICAgICBbZW1vamlCYWNrZ3JvdW5kSW1hZ2VGbl09XCJiYWNrZ3JvdW5kSW1hZ2VGblwiXG4gICAgICBbZW1vamlJbWFnZVVybEZuXT1cImltYWdlVXJsRm5cIlxuICAgICAgW2Vtb2ppVXNlQnV0dG9uXT1cInVzZUJ1dHRvblwiXG4gICAgICAoZW1vamlPdmVyKT1cImhhbmRsZUVtb2ppT3ZlcigkZXZlbnQpXCJcbiAgICAgIChlbW9qaUxlYXZlKT1cImhhbmRsZUVtb2ppTGVhdmUoKVwiXG4gICAgICAoZW1vamlDbGljayk9XCJoYW5kbGVFbW9qaUNsaWNrKCRldmVudClcIlxuICAgID48L2Vtb2ppLWNhdGVnb3J5PlxuICA8L3NlY3Rpb24+XG4gIDxkaXYgY2xhc3M9XCJlbW9qaS1tYXJ0LWJhclwiICpuZ0lmPVwic2hvd1ByZXZpZXdcIj5cbiAgICA8ZW1vamktcHJldmlld1xuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFtlbW9qaV09XCJwcmV2aWV3RW1vamlcIlxuICAgICAgW2lkbGVFbW9qaV09XCJlbW9qaVwiXG4gICAgICBbZW1vamlJc05hdGl2ZV09XCJpc05hdGl2ZVwiXG4gICAgICBbZW1vamlTaXplXT1cIjM4XCJcbiAgICAgIFtlbW9qaVNraW5dPVwic2tpblwiXG4gICAgICBbZW1vamlTZXRdPVwic2V0XCJcbiAgICAgIFtpMThuXT1cImkxOG5cIlxuICAgICAgW2Vtb2ppU2hlZXRTaXplXT1cInNoZWV0U2l6ZVwiXG4gICAgICBbZW1vamlCYWNrZ3JvdW5kSW1hZ2VGbl09XCJiYWNrZ3JvdW5kSW1hZ2VGblwiXG4gICAgICBbZW1vamlJbWFnZVVybEZuXT1cImltYWdlVXJsRm5cIlxuICAgICAgKHNraW5DaGFuZ2UpPVwiaGFuZGxlU2tpbkNoYW5nZSgkZXZlbnQpXCJcbiAgICA+PC9lbW9qaS1wcmV2aWV3PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj5cbiJdfQ==