@ctrl/ngx-emoji-mart 8.1.0 → 9.0.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 (54) hide show
  1. package/README.md +39 -14
  2. package/anchors.component.d.ts +1 -1
  3. package/category.component.d.ts +3 -3
  4. package/esm2022/anchors.component.mjs +100 -0
  5. package/esm2022/category.component.mjs +409 -0
  6. package/esm2022/emoji-frequently.service.mjs +90 -0
  7. package/esm2022/emoji-search.service.mjs +178 -0
  8. package/esm2022/ngx-emoji/emoji.component.mjs +299 -0
  9. package/esm2022/ngx-emoji/emoji.module.mjs +17 -0
  10. package/esm2022/ngx-emoji/emoji.service.mjs +145 -0
  11. package/esm2022/picker.component.mjs +522 -0
  12. package/esm2022/picker.module.mjs +40 -0
  13. package/esm2022/preview.component.mjs +206 -0
  14. package/esm2022/search.component.mjs +175 -0
  15. package/esm2022/skins.component.mjs +107 -0
  16. package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart-ngx-emoji.mjs +81 -68
  17. package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -1
  18. package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart.mjs +327 -261
  19. package/fesm2022/ctrl-ngx-emoji-mart.mjs.map +1 -0
  20. package/ngx-emoji/emoji.component.d.ts +10 -9
  21. package/ngx-emoji/emoji.module.d.ts +1 -2
  22. package/package.json +8 -16
  23. package/picker.component.d.ts +2 -2
  24. package/picker.module.d.ts +1 -4
  25. package/preview.component.d.ts +2 -2
  26. package/search.component.d.ts +1 -1
  27. package/skins.component.d.ts +2 -2
  28. package/esm2020/anchors.component.mjs +0 -83
  29. package/esm2020/category.component.mjs +0 -386
  30. package/esm2020/emoji-frequently.service.mjs +0 -88
  31. package/esm2020/emoji-search.service.mjs +0 -177
  32. package/esm2020/ngx-emoji/emoji.component.mjs +0 -283
  33. package/esm2020/ngx-emoji/emoji.module.mjs +0 -18
  34. package/esm2020/ngx-emoji/emoji.service.mjs +0 -144
  35. package/esm2020/picker.component.mjs +0 -508
  36. package/esm2020/picker.module.mjs +0 -49
  37. package/esm2020/preview.component.mjs +0 -187
  38. package/esm2020/search.component.mjs +0 -165
  39. package/esm2020/skins.component.mjs +0 -108
  40. package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs +0 -34325
  41. package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +0 -1
  42. package/fesm2015/ctrl-ngx-emoji-mart.mjs +0 -1763
  43. package/fesm2015/ctrl-ngx-emoji-mart.mjs.map +0 -1
  44. package/fesm2020/ctrl-ngx-emoji-mart.mjs.map +0 -1
  45. /package/{esm2020 → esm2022}/ctrl-ngx-emoji-mart.mjs +0 -0
  46. /package/{esm2020 → esm2022}/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.mjs +0 -0
  47. /package/{esm2020 → esm2022}/ngx-emoji/data/categories.mjs +0 -0
  48. /package/{esm2020 → esm2022}/ngx-emoji/data/data.interfaces.mjs +0 -0
  49. /package/{esm2020 → esm2022}/ngx-emoji/data/emojis.mjs +0 -0
  50. /package/{esm2020 → esm2022}/ngx-emoji/data/skins.mjs +0 -0
  51. /package/{esm2020 → esm2022}/ngx-emoji/index.mjs +0 -0
  52. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
  53. /package/{esm2020 → esm2022}/svgs/index.mjs +0 -0
  54. /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
package/README.md CHANGED
@@ -13,6 +13,10 @@ This project is a port of [emoji-mart](https://github.com/missive/emoji-mart) by
13
13
 
14
14
  ```sh
15
15
  npm install @ctrl/ngx-emoji-mart
16
+ # Or if you're using yarn
17
+ yarn add @ctrl/ngx-emoji-mart
18
+ # Or if you're using pnpm
19
+ pnpm install @ctrl/ngx-emoji-mart
16
20
  ```
17
21
 
18
22
  ## Dependencies
@@ -26,34 +30,52 @@ Latest version available for each version of Angular
26
30
  | 5.1.2 | 10.x 11.x |
27
31
  | 6.2.0 | 12.x 13.x |
28
32
  | 7.1.0 | 14.x |
29
- | current | >=15.x |
33
+ | 8.2.0 | 15.x |
34
+ | current | >=16.x |
30
35
 
31
36
  ## Components
32
37
 
33
38
  ### Picker
34
39
 
35
- Import Module in ngModule
40
+ Add `PickerComponent` to your module imports:
36
41
 
37
42
  ```ts
38
- import { PickerModule } from '@ctrl/ngx-emoji-mart';
43
+ import { PickerComponent } from '@ctrl/ngx-emoji-mart';
44
+
45
+ @NgModule({
46
+ imports: [PickerComponent],
47
+ })
48
+ export class AppModule {}
49
+
50
+ // Or if using standalone components
51
+
52
+ @Component({
53
+ standalone: true,
54
+ imports: [PickerComponent],
55
+ })
56
+ export class AppComponent {}
39
57
  ```
40
58
 
41
- Import styles in styles.scss if using SASS
59
+ Import styles in `styles.scss`:
42
60
 
43
61
  ```scss
44
- @import '~@ctrl/ngx-emoji-mart/picker';
62
+ @import '@ctrl/ngx-emoji-mart/picker';
45
63
  ```
46
64
 
47
- Or angular-cli can also include it via angular-cli.json
65
+ Or bundle those styles through `angular.json` configuration:
48
66
 
49
- ```
50
- "styles": [
51
- "styles.scss",
52
- "node_modules/@ctrl/ngx-emoji-mart/picker.css"
53
- ]
67
+ ```json
68
+ "build": {
69
+ "options": {
70
+ "styles": [
71
+ "src/styles.scss",
72
+ "node_modules/@ctrl/ngx-emoji-mart/picker.css"
73
+ ]
74
+ }
75
+ }
54
76
  ```
55
77
 
56
- use component
78
+ Now we can use the `emoji-mart` component:
57
79
 
58
80
  ```html
59
81
  <emoji-mart title="Pick your emoji…" emoji="point_up"></emoji-mart>
@@ -195,8 +217,10 @@ Sheets are served from [unpkg](https://unpkg.com), a global CDN that serves file
195
217
 
196
218
  ### Emoji
197
219
 
220
+ Add `EmojiComponent` to your module or standalone component `imports`:
221
+
198
222
  ```ts
199
- import { EmojiModule } from '@ctrl/ngx-emoji-mart/ngx-emoji';
223
+ import { EmojiComponent } from '@ctrl/ngx-emoji-mart/ngx-emoji';
200
224
  ```
201
225
 
202
226
  ```html
@@ -206,7 +230,7 @@ import { EmojiModule } from '@ctrl/ngx-emoji-mart/ngx-emoji';
206
230
  ```
207
231
 
208
232
  | Prop | Required | Default | Description |
209
- | -------------------------------------------- | :------: | ------------------------- | ------------------------------------------------------------------------------ |
233
+ | -------------------------------------------- | :------: | ------------------------- | ---------------------------------------------------------------------------------------------------------------- | --- |
210
234
  | **emoji** | ✓ | | Either a string or an `emoji` object |
211
235
  | **size** | ✓ | | The emoji width and height. |
212
236
  | **isNative** | | `false` | Renders the native unicode emoji |
@@ -276,6 +300,7 @@ The `Picker` doesn’t have to be mounted for you to take advantage of the advan
276
300
 
277
301
  ```ts
278
302
  import { EmojiSearch } from '@ctrl/ngx-emoji-mart';
303
+
279
304
  class ex {
280
305
  constructor(private emojiSearch: EmojiSearch) {
281
306
  this.emojiSearch.search('christmas').map(o => o.native);
@@ -16,5 +16,5 @@ export declare class AnchorsComponent {
16
16
  trackByFn(idx: number, cat: EmojiCategory): string;
17
17
  handleClick($event: Event, index: number): void;
18
18
  static ɵfac: i0.ɵɵFactoryDeclaration<AnchorsComponent, never>;
19
- static ɵcmp: i0.ɵɵComponentDeclaration<AnchorsComponent, "emoji-mart-anchors", never, { "categories": "categories"; "color": "color"; "selected": "selected"; "i18n": "i18n"; "icons": "icons"; }, { "anchorClick": "anchorClick"; }, never, never, false, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<AnchorsComponent, "emoji-mart-anchors", never, { "categories": { "alias": "categories"; "required": false; }; "color": { "alias": "color"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "i18n": { "alias": "i18n"; "required": false; }; "icons": { "alias": "icons"; "required": false; }; }, { "anchorClick": "anchorClick"; }, never, never, true, never>;
20
20
  }
@@ -30,12 +30,12 @@ export declare class CategoryComponent implements OnChanges, OnInit, AfterViewIn
30
30
  emojiBackgroundImageFn?: Emoji['backgroundImageFn'];
31
31
  emojiImageUrlFn?: Emoji['imageUrlFn'];
32
32
  emojiUseButton?: boolean;
33
- emojiOver: Emoji['emojiOver'];
33
+ emojiClick: Emoji['emojiClick'];
34
34
  /**
35
35
  * Note: the suffix is added explicitly so we know the event is dispatched outside of the Angular zone.
36
36
  */
37
+ emojiOverOutsideAngular: Emoji['emojiOver'];
37
38
  emojiLeaveOutsideAngular: Emoji['emojiLeave'];
38
- emojiClick: Emoji['emojiClick'];
39
39
  container: ElementRef;
40
40
  label: ElementRef;
41
41
  containerStyles: any;
@@ -61,5 +61,5 @@ export declare class CategoryComponent implements OnChanges, OnInit, AfterViewIn
61
61
  trackById(index: number, item: any): any;
62
62
  private filterEmojis;
63
63
  static ɵfac: i0.ɵɵFactoryDeclaration<CategoryComponent, never>;
64
- static ɵcmp: i0.ɵɵComponentDeclaration<CategoryComponent, "emoji-category", never, { "emojis": "emojis"; "hasStickyPosition": "hasStickyPosition"; "name": "name"; "perLine": "perLine"; "totalFrequentLines": "totalFrequentLines"; "recent": "recent"; "custom": "custom"; "i18n": "i18n"; "id": "id"; "hideObsolete": "hideObsolete"; "notFoundEmoji": "notFoundEmoji"; "virtualize": "virtualize"; "virtualizeOffset": "virtualizeOffset"; "emojiIsNative": "emojiIsNative"; "emojiSkin": "emojiSkin"; "emojiSize": "emojiSize"; "emojiSet": "emojiSet"; "emojiSheetSize": "emojiSheetSize"; "emojiForceSize": "emojiForceSize"; "emojiTooltip": "emojiTooltip"; "emojiBackgroundImageFn": "emojiBackgroundImageFn"; "emojiImageUrlFn": "emojiImageUrlFn"; "emojiUseButton": "emojiUseButton"; }, { "emojiOver": "emojiOver"; "emojiLeaveOutsideAngular": "emojiLeaveOutsideAngular"; "emojiClick": "emojiClick"; }, never, never, false, never>;
64
+ static ɵcmp: i0.ɵɵComponentDeclaration<CategoryComponent, "emoji-category", never, { "emojis": { "alias": "emojis"; "required": false; }; "hasStickyPosition": { "alias": "hasStickyPosition"; "required": false; }; "name": { "alias": "name"; "required": false; }; "perLine": { "alias": "perLine"; "required": false; }; "totalFrequentLines": { "alias": "totalFrequentLines"; "required": false; }; "recent": { "alias": "recent"; "required": false; }; "custom": { "alias": "custom"; "required": false; }; "i18n": { "alias": "i18n"; "required": false; }; "id": { "alias": "id"; "required": false; }; "hideObsolete": { "alias": "hideObsolete"; "required": false; }; "notFoundEmoji": { "alias": "notFoundEmoji"; "required": false; }; "virtualize": { "alias": "virtualize"; "required": false; }; "virtualizeOffset": { "alias": "virtualizeOffset"; "required": false; }; "emojiIsNative": { "alias": "emojiIsNative"; "required": false; }; "emojiSkin": { "alias": "emojiSkin"; "required": false; }; "emojiSize": { "alias": "emojiSize"; "required": false; }; "emojiSet": { "alias": "emojiSet"; "required": false; }; "emojiSheetSize": { "alias": "emojiSheetSize"; "required": false; }; "emojiForceSize": { "alias": "emojiForceSize"; "required": false; }; "emojiTooltip": { "alias": "emojiTooltip"; "required": false; }; "emojiBackgroundImageFn": { "alias": "emojiBackgroundImageFn"; "required": false; }; "emojiImageUrlFn": { "alias": "emojiImageUrlFn"; "required": false; }; "emojiUseButton": { "alias": "emojiUseButton"; "required": false; }; }, { "emojiClick": "emojiClick"; "emojiOverOutsideAngular": "emojiOverOutsideAngular"; "emojiLeaveOutsideAngular": "emojiLeaveOutsideAngular"; }, never, never, true, never>;
65
65
  }
@@ -0,0 +1,100 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ class AnchorsComponent {
6
+ categories = [];
7
+ color;
8
+ selected;
9
+ i18n;
10
+ icons = {};
11
+ anchorClick = new EventEmitter();
12
+ trackByFn(idx, cat) {
13
+ return cat.id;
14
+ }
15
+ handleClick($event, index) {
16
+ this.anchorClick.emit({
17
+ category: this.categories[index],
18
+ index,
19
+ });
20
+ }
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AnchorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
22
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: AnchorsComponent, isStandalone: true, selector: "emoji-mart-anchors", inputs: { categories: "categories", color: "color", selected: "selected", i18n: "i18n", icons: "icons" }, outputs: { anchorClick: "anchorClick" }, ngImport: i0, template: `
23
+ <div class="emoji-mart-anchors">
24
+ <ng-template
25
+ ngFor
26
+ let-category
27
+ [ngForOf]="categories"
28
+ let-idx="index"
29
+ [ngForTrackBy]="trackByFn"
30
+ >
31
+ <span
32
+ *ngIf="category.anchor !== false"
33
+ [attr.title]="i18n.categories[category.id]"
34
+ (click)="this.handleClick($event, idx)"
35
+ class="emoji-mart-anchor"
36
+ [class.emoji-mart-anchor-selected]="category.name === selected"
37
+ [style.color]="category.name === selected ? color : null"
38
+ >
39
+ <div>
40
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
41
+ <path [attr.d]="icons[category.id]" />
42
+ </svg>
43
+ </div>
44
+ <span class="emoji-mart-anchor-bar" [style.background-color]="color"></span>
45
+ </span>
46
+ </ng-template>
47
+ </div>
48
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
49
+ }
50
+ export { AnchorsComponent };
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AnchorsComponent, decorators: [{
52
+ type: Component,
53
+ args: [{
54
+ selector: 'emoji-mart-anchors',
55
+ template: `
56
+ <div class="emoji-mart-anchors">
57
+ <ng-template
58
+ ngFor
59
+ let-category
60
+ [ngForOf]="categories"
61
+ let-idx="index"
62
+ [ngForTrackBy]="trackByFn"
63
+ >
64
+ <span
65
+ *ngIf="category.anchor !== false"
66
+ [attr.title]="i18n.categories[category.id]"
67
+ (click)="this.handleClick($event, idx)"
68
+ class="emoji-mart-anchor"
69
+ [class.emoji-mart-anchor-selected]="category.name === selected"
70
+ [style.color]="category.name === selected ? color : null"
71
+ >
72
+ <div>
73
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
74
+ <path [attr.d]="icons[category.id]" />
75
+ </svg>
76
+ </div>
77
+ <span class="emoji-mart-anchor-bar" [style.background-color]="color"></span>
78
+ </span>
79
+ </ng-template>
80
+ </div>
81
+ `,
82
+ changeDetection: ChangeDetectionStrategy.OnPush,
83
+ preserveWhitespaces: false,
84
+ standalone: true,
85
+ imports: [CommonModule],
86
+ }]
87
+ }], propDecorators: { categories: [{
88
+ type: Input
89
+ }], color: [{
90
+ type: Input
91
+ }], selected: [{
92
+ type: Input
93
+ }], i18n: [{
94
+ type: Input
95
+ }], icons: [{
96
+ type: Input
97
+ }], anchorClick: [{
98
+ type: Output
99
+ }] } });
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9ycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3BpY2tlci9hbmNob3JzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBSWhHLE1Ba0NhLGdCQUFnQjtJQUNsQixVQUFVLEdBQW9CLEVBQUUsQ0FBQztJQUNqQyxLQUFLLENBQVU7SUFDZixRQUFRLENBQVU7SUFDbEIsSUFBSSxDQUFNO0lBQ1YsS0FBSyxHQUE4QixFQUFFLENBQUM7SUFDckMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUE4QyxDQUFDO0lBRXZGLFNBQVMsQ0FBQyxHQUFXLEVBQUUsR0FBa0I7UUFDdkMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBYSxFQUFFLEtBQWE7UUFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ2hDLEtBQUs7U0FDTixDQUFDLENBQUM7SUFDTCxDQUFDO3VHQWpCVSxnQkFBZ0I7MkZBQWhCLGdCQUFnQixpT0FoQ2pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVCwyREFJUyxZQUFZOztTQUVYLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQWxDNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxtQkFBbUIsRUFBRSxLQUFLO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4Qjs4QkFFVSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW1vamlDYXRlZ29yeSB9IGZyb20gJ0BjdHJsL25neC1lbW9qaS1tYXJ0L25neC1lbW9qaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Vtb2ppLW1hcnQtYW5jaG9ycycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImVtb2ppLW1hcnQtYW5jaG9yc1wiPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIG5nRm9yXG4gICAgICAgIGxldC1jYXRlZ29yeVxuICAgICAgICBbbmdGb3JPZl09XCJjYXRlZ29yaWVzXCJcbiAgICAgICAgbGV0LWlkeD1cImluZGV4XCJcbiAgICAgICAgW25nRm9yVHJhY2tCeV09XCJ0cmFja0J5Rm5cIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwiY2F0ZWdvcnkuYW5jaG9yICE9PSBmYWxzZVwiXG4gICAgICAgICAgW2F0dHIudGl0bGVdPVwiaTE4bi5jYXRlZ29yaWVzW2NhdGVnb3J5LmlkXVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRoaXMuaGFuZGxlQ2xpY2soJGV2ZW50LCBpZHgpXCJcbiAgICAgICAgICBjbGFzcz1cImVtb2ppLW1hcnQtYW5jaG9yXCJcbiAgICAgICAgICBbY2xhc3MuZW1vamktbWFydC1hbmNob3Itc2VsZWN0ZWRdPVwiY2F0ZWdvcnkubmFtZSA9PT0gc2VsZWN0ZWRcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJjYXRlZ29yeS5uYW1lID09PSBzZWxlY3RlZCA/IGNvbG9yIDogbnVsbFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiPlxuICAgICAgICAgICAgICA8cGF0aCBbYXR0ci5kXT1cImljb25zW2NhdGVnb3J5LmlkXVwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtb2ppLW1hcnQtYW5jaG9yLWJhclwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNvbG9yXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBBbmNob3JzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgY2F0ZWdvcmllczogRW1vamlDYXRlZ29yeVtdID0gW107XG4gIEBJbnB1dCgpIGNvbG9yPzogc3RyaW5nO1xuICBASW5wdXQoKSBzZWxlY3RlZD86IHN0cmluZztcbiAgQElucHV0KCkgaTE4bjogYW55O1xuICBASW5wdXQoKSBpY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBAT3V0cHV0KCkgYW5jaG9yQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY2F0ZWdvcnk6IEVtb2ppQ2F0ZWdvcnk7IGluZGV4OiBudW1iZXIgfT4oKTtcblxuICB0cmFja0J5Rm4oaWR4OiBudW1iZXIsIGNhdDogRW1vamlDYXRlZ29yeSkge1xuICAgIHJldHVybiBjYXQuaWQ7XG4gIH1cblxuICBoYW5kbGVDbGljaygkZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5hbmNob3JDbGljay5lbWl0KHtcbiAgICAgIGNhdGVnb3J5OiB0aGlzLmNhdGVnb3JpZXNbaW5kZXhdLFxuICAgICAgaW5kZXgsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==