@design-system-rte/angular 1.3.0 → 1.4.1-rc1

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 (47) hide show
  1. package/esm2022/lib/components/badge/badge.component.mjs +7 -3
  2. package/esm2022/lib/components/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +1 -1
  3. package/esm2022/lib/components/breadcrumbs/breadcrumbs.component.mjs +2 -2
  4. package/esm2022/lib/components/chip/chip.component.mjs +4 -3
  5. package/esm2022/lib/components/dropdown/dropdown-item/dropdown-item.component.mjs +158 -14
  6. package/esm2022/lib/components/dropdown/dropdown-menu/dropdown-menu.component.mjs +71 -6
  7. package/esm2022/lib/components/dropdown/dropdown.directive.mjs +54 -40
  8. package/esm2022/lib/components/dropdown/dropdown.types.mjs +2 -0
  9. package/esm2022/lib/components/dropdown/index.mjs +1 -3
  10. package/esm2022/lib/components/icon/icon-map.mjs +117 -112
  11. package/esm2022/lib/components/segmented-control/segmented-control.component.mjs +5 -3
  12. package/esm2022/lib/components/select/select-footer.directive.mjs +17 -0
  13. package/esm2022/lib/components/select/select-header.directive.mjs +17 -0
  14. package/esm2022/lib/components/select/select.component.mjs +177 -39
  15. package/esm2022/lib/components/side-nav/nav-item/nav-item.component.mjs +2 -2
  16. package/esm2022/lib/components/side-nav/nav-menu/nav-menu.component.mjs +2 -2
  17. package/esm2022/lib/components/split-button/split-button.component.mjs +2 -2
  18. package/esm2022/lib/components/stepper/stepper.component.mjs +3 -3
  19. package/esm2022/lib/components/tab/tab-item/tab-item.component.mjs +3 -3
  20. package/esm2022/lib/components/tab/tab.component.mjs +2 -2
  21. package/esm2022/lib/components/tag/tag.component.mjs +4 -3
  22. package/esm2022/public-api.mjs +9 -1
  23. package/fesm2022/design-system-rte-angular.mjs +654 -265
  24. package/fesm2022/design-system-rte-angular.mjs.map +1 -1
  25. package/lib/components/badge/badge.component.d.ts +3 -1
  26. package/lib/components/badge/badge.directive.d.ts +1 -1
  27. package/lib/components/chip/chip.component.d.ts +2 -1
  28. package/lib/components/dropdown/dropdown-item/dropdown-item.component.d.ts +28 -16
  29. package/lib/components/dropdown/dropdown-menu/dropdown-menu.component.d.ts +14 -3
  30. package/lib/components/dropdown/dropdown.directive.d.ts +18 -5
  31. package/lib/components/dropdown/dropdown.types.d.ts +30 -0
  32. package/lib/components/dropdown/index.d.ts +1 -0
  33. package/lib/components/icon/icon-map.d.ts +5 -0
  34. package/lib/components/icon-button/icon-button.component.d.ts +3 -3
  35. package/lib/components/icon-button-toggle/icon-button-toggle.component.d.ts +2 -2
  36. package/lib/components/popover/popover.component.d.ts +1 -1
  37. package/lib/components/segmented-control/segmented-control.component.d.ts +3 -1
  38. package/lib/components/select/select-footer.directive.d.ts +7 -0
  39. package/lib/components/select/select-header.directive.d.ts +7 -0
  40. package/lib/components/select/select.component.d.ts +35 -16
  41. package/lib/components/split-button/split-button.component.d.ts +2 -2
  42. package/lib/components/tab/tab.component.d.ts +1 -1
  43. package/lib/components/tag/tag.component.d.ts +4 -3
  44. package/lib/components/text-input/base-text-input/base-text-input.component.d.ts +2 -2
  45. package/lib/components/tooltip/tooltip.component.d.ts +1 -1
  46. package/package.json +2 -2
  47. package/public-api.d.ts +8 -0
@@ -1,17 +1,35 @@
1
1
  import { CommonModule } from "@angular/common";
2
- import { Component, computed, input, output } from "@angular/core";
2
+ import { ChangeDetectorRef, Component, computed, ElementRef, inject, input, output, signal, } from "@angular/core";
3
3
  import { shouldDisplayBadge } from "@design-system-rte/core/components/badge/badge.utils";
4
+ import { DropdownManager } from "@design-system-rte/core/components/dropdown/DropdownManager";
4
5
  import { ENTER_KEY, SPACE_KEY } from "@design-system-rte/core/constants/keyboard/keyboard.constants";
5
6
  import { BadgeComponent } from "../../badge/badge.component";
7
+ import { CheckboxComponent } from "../../checkbox/checkbox.component";
6
8
  import { DividerComponent } from "../../divider/divider.component";
7
9
  import { IconComponent } from "../../icon/icon.component";
10
+ import { focusDropdownFirstElement } from "../dropdown.utils";
8
11
  import * as i0 from "@angular/core";
9
12
  import * as i1 from "@angular/common";
13
+ const SUB_MENU_CLOSE_DELAY_MS = 300;
10
14
  export class DropdownItemComponent {
11
15
  constructor() {
16
+ this.elementRef = inject(ElementRef);
17
+ this.cdr = inject(ChangeDetectorRef);
12
18
  this.item = input();
13
19
  this.menuId = input();
14
20
  this.itemEvent = output();
21
+ this.submenuRequest = output();
22
+ this.subMenuOpen = signal(false);
23
+ this.subMenuRef = null;
24
+ this.closeSubMenuTimeout = null;
25
+ this.subMenuSubscriptions = [];
26
+ this.dropdownManagerUnsubscribe = null;
27
+ this.hasChildren = computed(() => (this.item()?.children?.length ?? 0) > 0);
28
+ this.childDropdownId = computed(() => {
29
+ const menuId = this.menuId();
30
+ const label = this.item()?.label ?? "";
31
+ return menuId && label ? `${menuId}-${label.replace(/\s+/g, "")}` : "";
32
+ });
15
33
  this.shouldDisplayBadge = computed(() => {
16
34
  const item = this.item();
17
35
  return shouldDisplayBadge({
@@ -21,6 +39,7 @@ export class DropdownItemComponent {
21
39
  badgeIcon: item?.badgeIcon,
22
40
  });
23
41
  });
42
+ this.boundHandleSubMenuMouseEnter = () => this.handleSubMenuMouseEnter();
24
43
  }
25
44
  handleClick(event) {
26
45
  if (this.item()?.disabled) {
@@ -28,31 +47,156 @@ export class DropdownItemComponent {
28
47
  event.stopPropagation();
29
48
  return;
30
49
  }
50
+ if (this.hasChildren()) {
51
+ event.preventDefault();
52
+ event.stopPropagation();
53
+ this.openSubMenu();
54
+ return;
55
+ }
31
56
  this.itemEvent.emit({
32
57
  event,
33
58
  id: this.item()?.id || this.item()?.label || "",
59
+ item: this.item(),
34
60
  });
35
61
  }
36
62
  handleKeyDown(event) {
37
63
  event.preventDefault();
38
- if ([SPACE_KEY, ENTER_KEY].includes(event.key)) {
39
- if (this.item()?.link) {
40
- const link = event.target.closest("li")?.querySelector("a");
41
- link?.click();
42
- }
43
- else {
44
- this.itemEvent.emit({
45
- event,
46
- id: this.item()?.id || this.item()?.label || "",
47
- });
64
+ if (this.item()?.link && [SPACE_KEY, ENTER_KEY].includes(event.key)) {
65
+ const link = event.target.closest("li")?.querySelector("a");
66
+ link?.click();
67
+ return;
68
+ }
69
+ if (this.hasChildren()) {
70
+ if (event.key === SPACE_KEY) {
71
+ this.openSubMenu();
72
+ const childId = this.childDropdownId();
73
+ if (childId) {
74
+ setTimeout(() => focusDropdownFirstElement(childId), 0);
75
+ }
48
76
  }
77
+ return;
78
+ }
79
+ if ([SPACE_KEY, ENTER_KEY].includes(event.key)) {
80
+ this.itemEvent.emit({
81
+ event,
82
+ id: this.item()?.id || this.item()?.label || "",
83
+ item: this.item(),
84
+ });
85
+ }
86
+ }
87
+ handleMouseEnter() {
88
+ if (this.item()?.disabled || !this.hasChildren())
89
+ return;
90
+ const menuId = this.menuId();
91
+ const childId = this.childDropdownId();
92
+ if (menuId) {
93
+ DropdownManager.closeSubMenus(menuId, childId);
94
+ this.openSubMenu();
95
+ }
96
+ }
97
+ handleFocus() {
98
+ if (this.item()?.disabled || !this.hasChildren())
99
+ return;
100
+ const menuId = this.menuId();
101
+ const childId = this.childDropdownId();
102
+ if (menuId) {
103
+ DropdownManager.closeSubMenus(menuId, childId);
104
+ }
105
+ }
106
+ handleMouseLeave() {
107
+ if (!this.hasChildren())
108
+ return;
109
+ this.scheduleCloseSubMenu();
110
+ }
111
+ handleSubMenuMouseEnter() {
112
+ this.cancelCloseSubMenu();
113
+ }
114
+ openSubMenuForKeyboard() {
115
+ this.openSubMenu();
116
+ const childId = this.childDropdownId();
117
+ if (childId) {
118
+ setTimeout(() => focusDropdownFirstElement(childId), 0);
119
+ }
120
+ }
121
+ openSubMenu() {
122
+ if (this.subMenuRef)
123
+ return;
124
+ const children = this.item()?.children;
125
+ const childId = this.childDropdownId();
126
+ if (!children?.length || !childId)
127
+ return;
128
+ const triggerElement = this.elementRef.nativeElement.querySelector("li.rte-dropdown-item");
129
+ if (!triggerElement)
130
+ return;
131
+ DropdownManager.open(childId);
132
+ this.submenuRequest.emit({
133
+ children,
134
+ childId,
135
+ triggerElement,
136
+ onCreated: (result) => this.wireSubmenu(result),
137
+ });
138
+ }
139
+ wireSubmenu(result) {
140
+ if (this.subMenuRef)
141
+ return;
142
+ this.subMenuRef = result.componentRef;
143
+ const hostElement = result.hostElement;
144
+ const childId = this.childDropdownId();
145
+ this.dropdownManagerUnsubscribe = DropdownManager.subscribe(childId ?? "", () => this.destroySubMenu());
146
+ const menuInstance = this.subMenuRef.instance;
147
+ const itemSub = menuInstance.itemEvent.subscribe((emittedItemEvent) => {
148
+ this.itemEvent.emit({ ...emittedItemEvent, item: emittedItemEvent.item });
149
+ });
150
+ const closeSub = menuInstance.closingMenu.subscribe(() => {
151
+ this.destroySubMenu();
152
+ });
153
+ this.subMenuSubscriptions.push(() => {
154
+ itemSub.unsubscribe();
155
+ closeSub.unsubscribe();
156
+ });
157
+ hostElement.addEventListener("mouseenter", this.boundHandleSubMenuMouseEnter);
158
+ this.subMenuOpen.set(true);
159
+ this.cdr.markForCheck();
160
+ }
161
+ scheduleCloseSubMenu() {
162
+ this.cancelCloseSubMenu();
163
+ this.closeSubMenuTimeout = setTimeout(() => {
164
+ this.closeSubMenuTimeout = null;
165
+ this.destroySubMenu();
166
+ }, SUB_MENU_CLOSE_DELAY_MS);
167
+ }
168
+ cancelCloseSubMenu() {
169
+ if (this.closeSubMenuTimeout) {
170
+ clearTimeout(this.closeSubMenuTimeout);
171
+ this.closeSubMenuTimeout = null;
49
172
  }
50
173
  }
174
+ destroySubMenu() {
175
+ this.cancelCloseSubMenu();
176
+ this.subMenuSubscriptions.forEach((unsubscribe) => unsubscribe());
177
+ this.subMenuSubscriptions = [];
178
+ if (this.subMenuRef) {
179
+ const hostElement = this.subMenuRef.location.nativeElement;
180
+ hostElement.removeEventListener("mouseenter", this.boundHandleSubMenuMouseEnter);
181
+ const childId = this.childDropdownId();
182
+ this.dropdownManagerUnsubscribe?.();
183
+ this.dropdownManagerUnsubscribe = null;
184
+ if (childId)
185
+ DropdownManager.close(childId);
186
+ this.subMenuRef.destroy();
187
+ this.subMenuRef = null;
188
+ }
189
+ this.subMenuOpen.set(false);
190
+ this.cdr.markForCheck();
191
+ }
192
+ ngOnDestroy() {
193
+ this.destroySubMenu();
194
+ }
51
195
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DropdownItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
52
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: DropdownItemComponent, isStandalone: true, selector: "rte-dropdown-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, menuId: { classPropertyName: "menuId", publicName: "menuId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemEvent: "itemEvent" }, ngImport: i0, template: "<ng-container>\n <li\n #itemRef\n class=\"rte-dropdown-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.data-disabled]=\"item()?.disabled\"\n [attr.data-active]=\"item()?.selected\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n >\n <span *ngIf=\"item()?.hasIndent && !item()?.leftIcon\" style=\"width: 20px\"></span>\n <rte-icon *ngIf=\"item()?.leftIcon\" [name]=\"item()?.leftIcon ?? ''\" />\n <ng-container [ngSwitch]=\"!!item()?.link\">\n <a *ngSwitchCase=\"true\" style=\"flex: 2; text-decoration: none; color: inherit\" [href]=\"item()?.link\"\n >{{ item()?.label }}\n </a>\n <span *ngSwitchDefault style=\"flex: 2\">{{ item()?.label }}</span>\n </ng-container>\n <div *ngIf=\"item()?.trailingText\">{{ item()?.trailingText }}</div>\n <rte-badge\n *ngIf=\"shouldDisplayBadge()\"\n [badgeType]=\"item()?.badgeType!\"\n [badgeContent]=\"item()?.badgeContent!\"\n [count]=\"item()?.badgeCount\"\n [simpleBadge]=\"true\"\n [icon]=\"item()?.badgeIcon ?? ''\"\n [badgeSize]=\"item()?.badgeSize!\"\n ></rte-badge>\n </li>\n <div *ngIf=\"item()?.hasSeparator\" class=\"dropdown-divider\">\n <rte-divider />\n </div>\n</ng-container>\n", styles: [".rte-dropdown-item{font-family:Arial;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0px;color:var(--content-secondary);display:flex;height:40px;padding:8px 12px;align-items:center;gap:12px;align-self:stretch;cursor:pointer;box-sizing:border-box}.rte-dropdown-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rte-dropdown-item:hover{background-color:var(--background-hover)}.rte-dropdown-item[data-disabled=true]{cursor:not-allowed;color:var(--content-disabled);background:var(--background-disabled)}.rte-dropdown-item[data-active=true]{background-color:var(--background-brand-inverse-pressed)}.rte-dropdown-item:focus-visible{outline:none;background-color:var(--background-hover)}.dropdown-divider{width:100%;padding:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: IconComponent, selector: "rte-icon", inputs: ["name", "size", "color", "classes", "appearance"] }, { kind: "component", type: DividerComponent, selector: "rte-divider", inputs: ["orientation", "thickness", "appearance", "endPoint"] }, { kind: "component", type: BadgeComponent, selector: "rte-badge", inputs: ["badgeType", "badgeSize", "badgeContent", "count", "icon", "simpleBadge"] }] }); }
196
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: DropdownItemComponent, isStandalone: true, selector: "rte-dropdown-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, menuId: { classPropertyName: "menuId", publicName: "menuId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemEvent: "itemEvent", submenuRequest: "submenuRequest" }, ngImport: i0, template: "<ng-container>\n <li\n #itemRef\n class=\"rte-dropdown-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.data-disabled]=\"item()?.disabled\"\n [attr.data-active]=\"hasChildren() ? subMenuOpen() : item()?.selected\"\n [attr.aria-haspopup]=\"hasChildren() ? 'menu' : null\"\n [attr.aria-expanded]=\"hasChildren() ? subMenuOpen() : null\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (mouseenter)=\"handleMouseEnter()\"\n (mouseleave)=\"handleMouseLeave()\"\n (focus)=\"handleFocus()\"\n >\n <rte-checkbox\n *ngIf=\"item()?.hasCheckbox\"\n [label]=\"item()?.label ?? ''\"\n [id]=\"menuId() + ':' + item()?.id\"\n [checked]=\"item()?.selected ?? false\"\n [disabled]=\"item()?.disabled ?? false\"\n [showLabel]=\"false\"\n [indeterminate]=\"item()?.isIndeterminate ?? false\"\n ></rte-checkbox>\n <span *ngIf=\"item()?.hasIndent && !item()?.leftIcon\" style=\"width: 20px\"></span>\n <rte-icon *ngIf=\"item()?.leftIcon\" [name]=\"item()?.leftIcon ?? ''\" />\n <ng-container [ngSwitch]=\"!!item()?.link\">\n <a *ngSwitchCase=\"true\" style=\"flex: 2; text-decoration: none; color: inherit\" [href]=\"item()?.link\"\n >{{ item()?.label }}\n </a>\n <span *ngSwitchDefault style=\"flex: 2\">{{ item()?.label }}</span>\n </ng-container>\n <rte-icon *ngIf=\"hasChildren()\" name=\"arrow-chevron-right\" />\n <div *ngIf=\"item()?.trailingText\">{{ item()?.trailingText }}</div>\n <rte-badge\n *ngIf=\"shouldDisplayBadge()\"\n [badgeType]=\"item()?.badgeType!\"\n [badgeContent]=\"item()?.badgeContent!\"\n [count]=\"item()?.badgeCount\"\n [simpleBadge]=\"true\"\n [icon]=\"item()?.badgeIcon ?? ''\"\n [badgeSize]=\"item()?.badgeSize!\"\n ></rte-badge>\n </li>\n <div *ngIf=\"item()?.hasSeparator\" class=\"dropdown-divider\">\n <rte-divider />\n </div>\n</ng-container>\n", styles: [".rte-dropdown-item{font-family:Arial;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0px;color:var(--content-secondary);display:flex;height:40px;padding:8px 12px;align-items:center;gap:12px;align-self:stretch;cursor:pointer;box-sizing:border-box}.rte-dropdown-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rte-dropdown-item:hover{background-color:var(--background-hover)}.rte-dropdown-item[data-disabled=true]{cursor:not-allowed;color:var(--content-disabled);background:var(--background-disabled)}.rte-dropdown-item[data-active=true]{background-color:var(--background-brand-inverse-pressed)}.rte-dropdown-item:focus-visible{outline:none;background-color:var(--background-hover)}.dropdown-divider{width:100%;padding:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: IconComponent, selector: "rte-icon", inputs: ["name", "size", "color", "classes", "appearance"] }, { kind: "component", type: DividerComponent, selector: "rte-divider", inputs: ["orientation", "thickness", "appearance", "endPoint"] }, { kind: "component", type: BadgeComponent, selector: "rte-badge", inputs: ["badgeType", "badgeSize", "badgeContent", "count", "icon", "simpleBadge", "withPlusSign"] }, { kind: "component", type: CheckboxComponent, selector: "rte-checkbox", inputs: ["id", "label", "value", "indeterminate", "description", "showLabel", "disabled", "error", "errorMessage", "readOnly", "checked"] }] }); }
53
197
  }
54
198
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DropdownItemComponent, decorators: [{
55
199
  type: Component,
56
- args: [{ selector: "rte-dropdown-item", imports: [CommonModule, IconComponent, DividerComponent, BadgeComponent], standalone: true, template: "<ng-container>\n <li\n #itemRef\n class=\"rte-dropdown-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.data-disabled]=\"item()?.disabled\"\n [attr.data-active]=\"item()?.selected\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n >\n <span *ngIf=\"item()?.hasIndent && !item()?.leftIcon\" style=\"width: 20px\"></span>\n <rte-icon *ngIf=\"item()?.leftIcon\" [name]=\"item()?.leftIcon ?? ''\" />\n <ng-container [ngSwitch]=\"!!item()?.link\">\n <a *ngSwitchCase=\"true\" style=\"flex: 2; text-decoration: none; color: inherit\" [href]=\"item()?.link\"\n >{{ item()?.label }}\n </a>\n <span *ngSwitchDefault style=\"flex: 2\">{{ item()?.label }}</span>\n </ng-container>\n <div *ngIf=\"item()?.trailingText\">{{ item()?.trailingText }}</div>\n <rte-badge\n *ngIf=\"shouldDisplayBadge()\"\n [badgeType]=\"item()?.badgeType!\"\n [badgeContent]=\"item()?.badgeContent!\"\n [count]=\"item()?.badgeCount\"\n [simpleBadge]=\"true\"\n [icon]=\"item()?.badgeIcon ?? ''\"\n [badgeSize]=\"item()?.badgeSize!\"\n ></rte-badge>\n </li>\n <div *ngIf=\"item()?.hasSeparator\" class=\"dropdown-divider\">\n <rte-divider />\n </div>\n</ng-container>\n", styles: [".rte-dropdown-item{font-family:Arial;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0px;color:var(--content-secondary);display:flex;height:40px;padding:8px 12px;align-items:center;gap:12px;align-self:stretch;cursor:pointer;box-sizing:border-box}.rte-dropdown-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rte-dropdown-item:hover{background-color:var(--background-hover)}.rte-dropdown-item[data-disabled=true]{cursor:not-allowed;color:var(--content-disabled);background:var(--background-disabled)}.rte-dropdown-item[data-active=true]{background-color:var(--background-brand-inverse-pressed)}.rte-dropdown-item:focus-visible{outline:none;background-color:var(--background-hover)}.dropdown-divider{width:100%;padding:8px 0}\n"] }]
200
+ args: [{ selector: "rte-dropdown-item", imports: [CommonModule, IconComponent, DividerComponent, BadgeComponent, CheckboxComponent], standalone: true, template: "<ng-container>\n <li\n #itemRef\n class=\"rte-dropdown-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.data-disabled]=\"item()?.disabled\"\n [attr.data-active]=\"hasChildren() ? subMenuOpen() : item()?.selected\"\n [attr.aria-haspopup]=\"hasChildren() ? 'menu' : null\"\n [attr.aria-expanded]=\"hasChildren() ? subMenuOpen() : null\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (mouseenter)=\"handleMouseEnter()\"\n (mouseleave)=\"handleMouseLeave()\"\n (focus)=\"handleFocus()\"\n >\n <rte-checkbox\n *ngIf=\"item()?.hasCheckbox\"\n [label]=\"item()?.label ?? ''\"\n [id]=\"menuId() + ':' + item()?.id\"\n [checked]=\"item()?.selected ?? false\"\n [disabled]=\"item()?.disabled ?? false\"\n [showLabel]=\"false\"\n [indeterminate]=\"item()?.isIndeterminate ?? false\"\n ></rte-checkbox>\n <span *ngIf=\"item()?.hasIndent && !item()?.leftIcon\" style=\"width: 20px\"></span>\n <rte-icon *ngIf=\"item()?.leftIcon\" [name]=\"item()?.leftIcon ?? ''\" />\n <ng-container [ngSwitch]=\"!!item()?.link\">\n <a *ngSwitchCase=\"true\" style=\"flex: 2; text-decoration: none; color: inherit\" [href]=\"item()?.link\"\n >{{ item()?.label }}\n </a>\n <span *ngSwitchDefault style=\"flex: 2\">{{ item()?.label }}</span>\n </ng-container>\n <rte-icon *ngIf=\"hasChildren()\" name=\"arrow-chevron-right\" />\n <div *ngIf=\"item()?.trailingText\">{{ item()?.trailingText }}</div>\n <rte-badge\n *ngIf=\"shouldDisplayBadge()\"\n [badgeType]=\"item()?.badgeType!\"\n [badgeContent]=\"item()?.badgeContent!\"\n [count]=\"item()?.badgeCount\"\n [simpleBadge]=\"true\"\n [icon]=\"item()?.badgeIcon ?? ''\"\n [badgeSize]=\"item()?.badgeSize!\"\n ></rte-badge>\n </li>\n <div *ngIf=\"item()?.hasSeparator\" class=\"dropdown-divider\">\n <rte-divider />\n </div>\n</ng-container>\n", styles: [".rte-dropdown-item{font-family:Arial;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0px;color:var(--content-secondary);display:flex;height:40px;padding:8px 12px;align-items:center;gap:12px;align-self:stretch;cursor:pointer;box-sizing:border-box}.rte-dropdown-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rte-dropdown-item:hover{background-color:var(--background-hover)}.rte-dropdown-item[data-disabled=true]{cursor:not-allowed;color:var(--content-disabled);background:var(--background-disabled)}.rte-dropdown-item[data-active=true]{background-color:var(--background-brand-inverse-pressed)}.rte-dropdown-item:focus-visible{outline:none;background-color:var(--background-hover)}.dropdown-divider{width:100%;padding:8px 0}\n"] }]
57
201
  }] });
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kcy1ydGUtbGliL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi1pdGVtL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24taXRlbS9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBZ0IsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUUxRixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBRXJHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQXNCMUQsTUFBTSxPQUFPLHFCQUFxQjtJQVBsQztRQVFXLFNBQUksR0FBRyxLQUFLLEVBQXNCLENBQUM7UUFDbkMsV0FBTSxHQUFHLEtBQUssRUFBVSxDQUFDO1FBQ3pCLGNBQVMsR0FBRyxNQUFNLEVBQWdDLENBQUM7UUFFbkQsdUJBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsT0FBTyxrQkFBa0IsQ0FBQztnQkFDeEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUztnQkFDNUIsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZO2dCQUNoQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVU7Z0JBQzVCLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUzthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztLQTZCSjtJQTNCQyxXQUFXLENBQUMsS0FBWTtRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsS0FBSztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRTtTQUNoRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQW9CO1FBQ2hDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLE1BQXNCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztvQkFDbEIsS0FBSztvQkFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7aUJBQ2hELENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0F6Q1UscUJBQXFCO21HQUFyQixxQkFBcUIsOFdDOUJsQywwdkNBa0NBLGt6QkRUWSxZQUFZLCtZQUFFLGFBQWEsaUhBQUUsZ0JBQWdCLHdIQUFFLGNBQWM7OzRGQUs1RCxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0UsbUJBQW1CLFdBQ3BCLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsY0FDNUQsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIEV2ZW50RW1pdHRlciwgaW5wdXQsIG91dHB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBzaG91bGREaXNwbGF5QmFkZ2UgfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29tcG9uZW50cy9iYWRnZS9iYWRnZS51dGlsc1wiO1xuaW1wb3J0IHsgRHJvcGRvd25JdGVtUHJvcHMgfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEVOVEVSX0tFWSwgU1BBQ0VfS0VZIH0gZnJvbSBcIkBkZXNpZ24tc3lzdGVtLXJ0ZS9jb3JlL2NvbnN0YW50cy9rZXlib2FyZC9rZXlib2FyZC5jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgQmFkZ2VDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYmFkZ2UvYmFkZ2UuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEaXZpZGVyQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2RpdmlkZXIvZGl2aWRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tIFwiLi4vLi4vaWNvbi9pY29uLmNvbXBvbmVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERyb3Bkb3duSXRlbUNvbmZpZyBleHRlbmRzIE9taXQ8RHJvcGRvd25JdGVtUHJvcHMsIFwib25DbGlja1wiPiB7XG4gIGlkPzogc3RyaW5nO1xuICBzZWxlY3RlZD86IGJvb2xlYW47XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxlZnRJY29uPzogc3RyaW5nO1xuICB0cmFpbGluZ1RleHQ/OiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgaGFzU2VwYXJhdG9yPzogYm9vbGVhbjtcbiAgaGFzSW5kZW50PzogYm9vbGVhbjtcbiAgbGluaz86IHN0cmluZztcbiAgY2xpY2s/OiBFdmVudEVtaXR0ZXI8RXZlbnQ+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwicnRlLWRyb3Bkb3duLWl0ZW1cIixcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgRGl2aWRlckNvbXBvbmVudCwgQmFkZ2VDb21wb25lbnRdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogXCIuL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5zY3NzXCIsXG59KVxuZXhwb3J0IGNsYXNzIERyb3Bkb3duSXRlbUNvbXBvbmVudCB7XG4gIHJlYWRvbmx5IGl0ZW0gPSBpbnB1dDxEcm9wZG93bkl0ZW1Db25maWc+KCk7XG4gIHJlYWRvbmx5IG1lbnVJZCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaXRlbUV2ZW50ID0gb3V0cHV0PHsgZXZlbnQ6IEV2ZW50OyBpZDogc3RyaW5nIH0+KCk7XG5cbiAgcmVhZG9ubHkgc2hvdWxkRGlzcGxheUJhZGdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW0oKTtcbiAgICByZXR1cm4gc2hvdWxkRGlzcGxheUJhZGdlKHtcbiAgICAgIHNob3dCYWRnZTogISFpdGVtPy5zaG93QmFkZ2UsXG4gICAgICBiYWRnZUNvbnRlbnQ6IGl0ZW0/LmJhZGdlQ29udGVudCxcbiAgICAgIGJhZGdlQ291bnQ6IGl0ZW0/LmJhZGdlQ291bnQsXG4gICAgICBiYWRnZUljb246IGl0ZW0/LmJhZGdlSWNvbixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbSgpPy5kaXNhYmxlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1FdmVudC5lbWl0KHtcbiAgICAgIGV2ZW50LFxuICAgICAgaWQ6IHRoaXMuaXRlbSgpPy5pZCB8fCB0aGlzLml0ZW0oKT8ubGFiZWwgfHwgXCJcIixcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKFtTUEFDRV9LRVksIEVOVEVSX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgaWYgKHRoaXMuaXRlbSgpPy5saW5rKSB7XG4gICAgICAgIGNvbnN0IGxpbmsgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwibGlcIik/LnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgICAgICBsaW5rPy5jbGljaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pdGVtRXZlbnQuZW1pdCh7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgaWQ6IHRoaXMuaXRlbSgpPy5pZCB8fCB0aGlzLml0ZW0oKT8ubGFiZWwgfHwgXCJcIixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyPlxuICA8bGlcbiAgICAjaXRlbVJlZlxuICAgIGNsYXNzPVwicnRlLWRyb3Bkb3duLWl0ZW1cIlxuICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgdGFiaW5kZXg9XCIwXCJcbiAgICBbYXR0ci5kYXRhLWRpc2FibGVkXT1cIml0ZW0oKT8uZGlzYWJsZWRcIlxuICAgIFthdHRyLmRhdGEtYWN0aXZlXT1cIml0ZW0oKT8uc2VsZWN0ZWRcIlxuICAgIChjbGljayk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlEb3duKCRldmVudClcIlxuICA+XG4gICAgPHNwYW4gKm5nSWY9XCJpdGVtKCk/Lmhhc0luZGVudCAmJiAhaXRlbSgpPy5sZWZ0SWNvblwiIHN0eWxlPVwid2lkdGg6IDIwcHhcIj48L3NwYW4+XG4gICAgPHJ0ZS1pY29uICpuZ0lmPVwiaXRlbSgpPy5sZWZ0SWNvblwiIFtuYW1lXT1cIml0ZW0oKT8ubGVmdEljb24gPz8gJydcIiAvPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIiEhaXRlbSgpPy5saW5rXCI+XG4gICAgICA8YSAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiIHN0eWxlPVwiZmxleDogMjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogaW5oZXJpdFwiIFtocmVmXT1cIml0ZW0oKT8ubGlua1wiXG4gICAgICAgID57eyBpdGVtKCk/LmxhYmVsIH19XG4gICAgICA8L2E+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IHN0eWxlPVwiZmxleDogMlwiPnt7IGl0ZW0oKT8ubGFiZWwgfX08L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cIml0ZW0oKT8udHJhaWxpbmdUZXh0XCI+e3sgaXRlbSgpPy50cmFpbGluZ1RleHQgfX08L2Rpdj5cbiAgICA8cnRlLWJhZGdlXG4gICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlCYWRnZSgpXCJcbiAgICAgIFtiYWRnZVR5cGVdPVwiaXRlbSgpPy5iYWRnZVR5cGUhXCJcbiAgICAgIFtiYWRnZUNvbnRlbnRdPVwiaXRlbSgpPy5iYWRnZUNvbnRlbnQhXCJcbiAgICAgIFtjb3VudF09XCJpdGVtKCk/LmJhZGdlQ291bnRcIlxuICAgICAgW3NpbXBsZUJhZGdlXT1cInRydWVcIlxuICAgICAgW2ljb25dPVwiaXRlbSgpPy5iYWRnZUljb24gPz8gJydcIlxuICAgICAgW2JhZGdlU2l6ZV09XCJpdGVtKCk/LmJhZGdlU2l6ZSFcIlxuICAgID48L3J0ZS1iYWRnZT5cbiAgPC9saT5cbiAgPGRpdiAqbmdJZj1cIml0ZW0oKT8uaGFzU2VwYXJhdG9yXCIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+XG4gICAgPHJ0ZS1kaXZpZGVyIC8+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kcy1ydGUtbGliL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi1pdGVtL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24taXRlbS9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDOUYsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUVyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFJOUQsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFTcEMsTUFBTSxPQUFPLHFCQUFx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QUFDLGNBQy9FLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IHNob3VsZERpc3BsYXlCYWRnZSB9IGZyb20gXCJAZGVzaWduLXN5c3RlbS1ydGUvY29yZS9jb21wb25lbnRzL2JhZGdlL2JhZGdlLnV0aWxzXCI7XG5pbXBvcnQgeyBEcm9wZG93bk1hbmFnZXIgfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29tcG9uZW50cy9kcm9wZG93bi9Ecm9wZG93bk1hbmFnZXJcIjtcbmltcG9ydCB7IEVOVEVSX0tFWSwgU1BBQ0VfS0VZIH0gZnJvbSBcIkBkZXNpZ24tc3lzdGVtLXJ0ZS9jb3JlL2NvbnN0YW50cy9rZXlib2FyZC9rZXlib2FyZC5jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgQmFkZ2VDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYmFkZ2UvYmFkZ2UuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnRcIjtcbmltcG9ydCB7IERpdmlkZXJDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vZGl2aWRlci9kaXZpZGVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9pY29uL2ljb24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEcm9wZG93bkl0ZW1Db25maWcsIFN1Ym1lbnVDcmVhdGVkUmVzdWx0LCBTdWJtZW51UmVxdWVzdEV2ZW50IH0gZnJvbSBcIi4uL2Ryb3Bkb3duLnR5cGVzXCI7XG5pbXBvcnQgeyBmb2N1c0Ryb3Bkb3duRmlyc3RFbGVtZW50IH0gZnJvbSBcIi4uL2Ryb3Bkb3duLnV0aWxzXCI7XG5cbmV4cG9ydCB0eXBlIHsgRHJvcGRvd25JdGVtQ29uZmlnIH07XG5cbmNvbnN0IFNVQl9NRU5VX0NMT1NFX0RFTEFZX01TID0gMzAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwicnRlLWRyb3Bkb3duLWl0ZW1cIixcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgRGl2aWRlckNvbXBvbmVudCwgQmFkZ2VDb21wb25lbnQsIENoZWNrYm94Q29tcG9uZW50XSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6IFwiLi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsOiBcIi4vZHJvcGRvd24taXRlbS5jb21wb25lbnQuc2Nzc1wiLFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgcmVhZG9ubHkgaXRlbSA9IGlucHV0PERyb3Bkb3duSXRlbUNvbmZpZz4oKTtcbiAgcmVhZG9ubHkgbWVudUlkID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpdGVtRXZlbnQgPSBvdXRwdXQ8eyBldmVudDogRXZlbnQ7IGlkOiBzdHJpbmc7IGl0ZW0/OiBEcm9wZG93bkl0ZW1Db25maWcgfT4oKTtcbiAgcmVhZG9ubHkgc3VibWVudVJlcXVlc3QgPSBvdXRwdXQ8U3VibWVudVJlcXVlc3RFdmVudD4oKTtcblxuICByZWFkb25seSBzdWJNZW51T3BlbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSBzdWJNZW51UmVmOiBpbXBvcnQoXCJAYW5ndWxhci9jb3JlXCIpLkNvbXBvbmVudFJlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNsb3NlU3ViTWVudVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3ViTWVudVN1YnNjcmlwdGlvbnM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgZHJvcGRvd25NYW5hZ2VyVW5zdWJzY3JpYmU6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIHJlYWRvbmx5IGhhc0NoaWxkcmVuID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuaXRlbSgpPy5jaGlsZHJlbj8ubGVuZ3RoID8/IDApID4gMCk7XG4gIHJlYWRvbmx5IGNoaWxkRHJvcGRvd25JZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBtZW51SWQgPSB0aGlzLm1lbnVJZCgpO1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5pdGVtKCk/LmxhYmVsID8/IFwiXCI7XG4gICAgcmV0dXJuIG1lbnVJZCAmJiBsYWJlbCA/IGAke21lbnVJZH0tJHtsYWJlbC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpfWAgOiBcIlwiO1xuICB9KTtcblxuICByZWFkb25seSBzaG91bGREaXNwbGF5QmFkZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbSgpO1xuICAgIHJldHVybiBzaG91bGREaXNwbGF5QmFkZ2Uoe1xuICAgICAgc2hvd0JhZGdlOiAhIWl0ZW0/LnNob3dCYWRnZSxcbiAgICAgIGJhZGdlQ29udGVudDogaXRlbT8uYmFkZ2VDb250ZW50LFxuICAgICAgYmFkZ2VDb3VudDogaXRlbT8uYmFkZ2VDb3VudCxcbiAgICAgIGJhZGdlSWNvbjogaXRlbT8uYmFkZ2VJY29uLFxuICAgIH0pO1xuICB9KTtcblxuICBoYW5kbGVDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVtKCk/LmRpc2FibGVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0NoaWxkcmVuKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMub3BlblN1Yk1lbnUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtRXZlbnQuZW1pdCh7XG4gICAgICBldmVudCxcbiAgICAgIGlkOiB0aGlzLml0ZW0oKT8uaWQgfHwgdGhpcy5pdGVtKCk/LmxhYmVsIHx8IFwiXCIsXG4gICAgICBpdGVtOiB0aGlzLml0ZW0oKSxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKHRoaXMuaXRlbSgpPy5saW5rICYmIFtTUEFDRV9LRVksIEVOVEVSX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgY29uc3QgbGluayA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJsaVwiKT8ucXVlcnlTZWxlY3RvcihcImFcIik7XG4gICAgICBsaW5rPy5jbGljaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0NoaWxkcmVuKCkpIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09IFNQQUNFX0tFWSkge1xuICAgICAgICB0aGlzLm9wZW5TdWJNZW51KCk7XG4gICAgICAgIGNvbnN0IGNoaWxkSWQgPSB0aGlzLmNoaWxkRHJvcGRvd25JZCgpO1xuICAgICAgICBpZiAoY2hpbGRJZCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZm9jdXNEcm9wZG93bkZpcnN0RWxlbWVudChjaGlsZElkKSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoW1NQQUNFX0tFWSwgRU5URVJfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICB0aGlzLml0ZW1FdmVudC5lbWl0KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGlkOiB0aGlzLml0ZW0oKT8uaWQgfHwgdGhpcy5pdGVtKCk/LmxhYmVsIHx8IFwiXCIsXG4gICAgICAgIGl0ZW06IHRoaXMuaXRlbSgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW91c2VFbnRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVtKCk/LmRpc2FibGVkIHx8ICF0aGlzLmhhc0NoaWxkcmVuKCkpIHJldHVybjtcbiAgICBjb25zdCBtZW51SWQgPSB0aGlzLm1lbnVJZCgpO1xuICAgIGNvbnN0IGNoaWxkSWQgPSB0aGlzLmNoaWxkRHJvcGRvd25JZCgpO1xuICAgIGlmIChtZW51SWQpIHtcbiAgICAgIERyb3Bkb3duTWFuYWdlci5jbG9zZVN1Yk1lbnVzKG1lbnVJZCwgY2hpbGRJZCk7XG4gICAgICB0aGlzLm9wZW5TdWJNZW51KCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbSgpPy5kaXNhYmxlZCB8fCAhdGhpcy5oYXNDaGlsZHJlbigpKSByZXR1cm47XG4gICAgY29uc3QgbWVudUlkID0gdGhpcy5tZW51SWQoKTtcbiAgICBjb25zdCBjaGlsZElkID0gdGhpcy5jaGlsZERyb3Bkb3duSWQoKTtcbiAgICBpZiAobWVudUlkKSB7XG4gICAgICBEcm9wZG93bk1hbmFnZXIuY2xvc2VTdWJNZW51cyhtZW51SWQsIGNoaWxkSWQpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0NoaWxkcmVuKCkpIHJldHVybjtcbiAgICB0aGlzLnNjaGVkdWxlQ2xvc2VTdWJNZW51KCk7XG4gIH1cblxuICBoYW5kbGVTdWJNZW51TW91c2VFbnRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbENsb3NlU3ViTWVudSgpO1xuICB9XG5cbiAgb3BlblN1Yk1lbnVGb3JLZXlib2FyZCgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5TdWJNZW51KCk7XG4gICAgY29uc3QgY2hpbGRJZCA9IHRoaXMuY2hpbGREcm9wZG93bklkKCk7XG4gICAgaWYgKGNoaWxkSWQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZm9jdXNEcm9wZG93bkZpcnN0RWxlbWVudChjaGlsZElkKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuU3ViTWVudSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWJNZW51UmVmKSByZXR1cm47XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLml0ZW0oKT8uY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGRJZCA9IHRoaXMuY2hpbGREcm9wZG93bklkKCk7XG4gICAgaWYgKCFjaGlsZHJlbj8ubGVuZ3RoIHx8ICFjaGlsZElkKSByZXR1cm47XG5cbiAgICBjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsaS5ydGUtZHJvcGRvd24taXRlbVwiKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCF0cmlnZ2VyRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgRHJvcGRvd25NYW5hZ2VyLm9wZW4oY2hpbGRJZCk7XG5cbiAgICB0aGlzLnN1Ym1lbnVSZXF1ZXN0LmVtaXQoe1xuICAgICAgY2hpbGRyZW4sXG4gICAgICBjaGlsZElkLFxuICAgICAgdHJpZ2dlckVsZW1lbnQsXG4gICAgICBvbkNyZWF0ZWQ6IChyZXN1bHQpID0+IHRoaXMud2lyZVN1Ym1lbnUocmVzdWx0KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd2lyZVN1Ym1lbnUocmVzdWx0OiBTdWJtZW51Q3JlYXRlZFJlc3VsdCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN1Yk1lbnVSZWYpIHJldHVybjtcbiAgICB0aGlzLnN1Yk1lbnVSZWYgPSByZXN1bHQuY29tcG9uZW50UmVmO1xuICAgIGNvbnN0IGhvc3RFbGVtZW50ID0gcmVzdWx0Lmhvc3RFbGVtZW50O1xuICAgIGNvbnN0IGNoaWxkSWQgPSB0aGlzLmNoaWxkRHJvcGRvd25JZCgpO1xuXG4gICAgdGhpcy5kcm9wZG93bk1hbmFnZXJVbnN1YnNjcmliZSA9IERyb3Bkb3duTWFuYWdlci5zdWJzY3JpYmUoY2hpbGRJZCA/PyBcIlwiLCAoKSA9PiB0aGlzLmRlc3Ryb3lTdWJNZW51KCkpO1xuXG4gICAgY29uc3QgbWVudUluc3RhbmNlID0gdGhpcy5zdWJNZW51UmVmLmluc3RhbmNlIGFzIHtcbiAgICAgIGl0ZW1FdmVudDoge1xuICAgICAgICBzdWJzY3JpYmU6IChjYWxsYmFjazogKGV2ZW50OiB7IGV2ZW50OiBFdmVudDsgaWQ6IHN0cmluZzsgaXRlbT86IERyb3Bkb3duSXRlbUNvbmZpZyB9KSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQ7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgY2xvc2luZ01lbnU6IHsgc3Vic2NyaWJlOiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSB9O1xuICAgIH07XG4gICAgY29uc3QgaXRlbVN1YiA9IG1lbnVJbnN0YW5jZS5pdGVtRXZlbnQuc3Vic2NyaWJlKFxuICAgICAgKGVtaXR0ZWRJdGVtRXZlbnQ6IHsgZXZlbnQ6IEV2ZW50OyBpZDogc3RyaW5nOyBpdGVtPzogRHJvcGRvd25JdGVtQ29uZmlnIH0pID0+IHtcbiAgICAgICAgdGhpcy5pdGVtRXZlbnQuZW1pdCh7IC4uLmVtaXR0ZWRJdGVtRXZlbnQsIGl0ZW06IGVtaXR0ZWRJdGVtRXZlbnQuaXRlbSB9KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBjbG9zZVN1YiA9IG1lbnVJbnN0YW5jZS5jbG9zaW5nTWVudS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5kZXN0cm95U3ViTWVudSgpO1xuICAgIH0pO1xuICAgIHRoaXMuc3ViTWVudVN1YnNjcmlwdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICBpdGVtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBjbG9zZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuXG4gICAgaG9zdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgdGhpcy5ib3VuZEhhbmRsZVN1Yk1lbnVNb3VzZUVudGVyKTtcblxuICAgIHRoaXMuc3ViTWVudU9wZW4uc2V0KHRydWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZUNsb3NlU3ViTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbENsb3NlU3ViTWVudSgpO1xuICAgIHRoaXMuY2xvc2VTdWJNZW51VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZVN1Yk1lbnVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMuZGVzdHJveVN1Yk1lbnUoKTtcbiAgICB9LCBTVUJfTUVOVV9DTE9TRV9ERUxBWV9NUyk7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbENsb3NlU3ViTWVudSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZVN1Yk1lbnVUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jbG9zZVN1Yk1lbnVUaW1lb3V0KTtcbiAgICAgIHRoaXMuY2xvc2VTdWJNZW51VGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZEhhbmRsZVN1Yk1lbnVNb3VzZUVudGVyID0gKCk6IHZvaWQgPT4gdGhpcy5oYW5kbGVTdWJNZW51TW91c2VFbnRlcigpO1xuXG4gIHByaXZhdGUgZGVzdHJveVN1Yk1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxDbG9zZVN1Yk1lbnUoKTtcbiAgICB0aGlzLnN1Yk1lbnVTdWJzY3JpcHRpb25zLmZvckVhY2goKHVuc3Vic2NyaWJlKSA9PiB1bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLnN1Yk1lbnVTdWJzY3JpcHRpb25zID0gW107XG4gICAgaWYgKHRoaXMuc3ViTWVudVJlZikge1xuICAgICAgY29uc3QgaG9zdEVsZW1lbnQgPSB0aGlzLnN1Yk1lbnVSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGhvc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHRoaXMuYm91bmRIYW5kbGVTdWJNZW51TW91c2VFbnRlcik7XG4gICAgICBjb25zdCBjaGlsZElkID0gdGhpcy5jaGlsZERyb3Bkb3duSWQoKTtcbiAgICAgIHRoaXMuZHJvcGRvd25NYW5hZ2VyVW5zdWJzY3JpYmU/LigpO1xuICAgICAgdGhpcy5kcm9wZG93bk1hbmFnZXJVbnN1YnNjcmliZSA9IG51bGw7XG4gICAgICBpZiAoY2hpbGRJZCkgRHJvcGRvd25NYW5hZ2VyLmNsb3NlKGNoaWxkSWQpO1xuICAgICAgdGhpcy5zdWJNZW51UmVmLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc3ViTWVudVJlZiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3ViTWVudU9wZW4uc2V0KGZhbHNlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVN1Yk1lbnUoKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGxpXG4gICAgI2l0ZW1SZWZcbiAgICBjbGFzcz1cInJ0ZS1kcm9wZG93bi1pdGVtXCJcbiAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgIHRhYmluZGV4PVwiMFwiXG4gICAgW2F0dHIuZGF0YS1kaXNhYmxlZF09XCJpdGVtKCk/LmRpc2FibGVkXCJcbiAgICBbYXR0ci5kYXRhLWFjdGl2ZV09XCJoYXNDaGlsZHJlbigpID8gc3ViTWVudU9wZW4oKSA6IGl0ZW0oKT8uc2VsZWN0ZWRcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiaGFzQ2hpbGRyZW4oKSA/ICdtZW51JyA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaGFzQ2hpbGRyZW4oKSA/IHN1Yk1lbnVPcGVuKCkgOiBudWxsXCJcbiAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soJGV2ZW50KVwiXG4gICAgKGtleWRvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQpXCJcbiAgICAobW91c2VlbnRlcik9XCJoYW5kbGVNb3VzZUVudGVyKClcIlxuICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZU1vdXNlTGVhdmUoKVwiXG4gICAgKGZvY3VzKT1cImhhbmRsZUZvY3VzKClcIlxuICA+XG4gICAgPHJ0ZS1jaGVja2JveFxuICAgICAgKm5nSWY9XCJpdGVtKCk/Lmhhc0NoZWNrYm94XCJcbiAgICAgIFtsYWJlbF09XCJpdGVtKCk/LmxhYmVsID8/ICcnXCJcbiAgICAgIFtpZF09XCJtZW51SWQoKSArICc6JyArIGl0ZW0oKT8uaWRcIlxuICAgICAgW2NoZWNrZWRdPVwiaXRlbSgpPy5zZWxlY3RlZCA/PyBmYWxzZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiaXRlbSgpPy5kaXNhYmxlZCA/PyBmYWxzZVwiXG4gICAgICBbc2hvd0xhYmVsXT1cImZhbHNlXCJcbiAgICAgIFtpbmRldGVybWluYXRlXT1cIml0ZW0oKT8uaXNJbmRldGVybWluYXRlID8/IGZhbHNlXCJcbiAgICA+PC9ydGUtY2hlY2tib3g+XG4gICAgPHNwYW4gKm5nSWY9XCJpdGVtKCk/Lmhhc0luZGVudCAmJiAhaXRlbSgpPy5sZWZ0SWNvblwiIHN0eWxlPVwid2lkdGg6IDIwcHhcIj48L3NwYW4+XG4gICAgPHJ0ZS1pY29uICpuZ0lmPVwiaXRlbSgpPy5sZWZ0SWNvblwiIFtuYW1lXT1cIml0ZW0oKT8ubGVmdEljb24gPz8gJydcIiAvPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIiEhaXRlbSgpPy5saW5rXCI+XG4gICAgICA8YSAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiIHN0eWxlPVwiZmxleDogMjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogaW5oZXJpdFwiIFtocmVmXT1cIml0ZW0oKT8ubGlua1wiXG4gICAgICAgID57eyBpdGVtKCk/LmxhYmVsIH19XG4gICAgICA8L2E+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IHN0eWxlPVwiZmxleDogMlwiPnt7IGl0ZW0oKT8ubGFiZWwgfX08L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPHJ0ZS1pY29uICpuZ0lmPVwiaGFzQ2hpbGRyZW4oKVwiIG5hbWU9XCJhcnJvdy1jaGV2cm9uLXJpZ2h0XCIgLz5cbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbSgpPy50cmFpbGluZ1RleHRcIj57eyBpdGVtKCk/LnRyYWlsaW5nVGV4dCB9fTwvZGl2PlxuICAgIDxydGUtYmFkZ2VcbiAgICAgICpuZ0lmPVwic2hvdWxkRGlzcGxheUJhZGdlKClcIlxuICAgICAgW2JhZGdlVHlwZV09XCJpdGVtKCk/LmJhZGdlVHlwZSFcIlxuICAgICAgW2JhZGdlQ29udGVudF09XCJpdGVtKCk/LmJhZGdlQ29udGVudCFcIlxuICAgICAgW2NvdW50XT1cIml0ZW0oKT8uYmFkZ2VDb3VudFwiXG4gICAgICBbc2ltcGxlQmFkZ2VdPVwidHJ1ZVwiXG4gICAgICBbaWNvbl09XCJpdGVtKCk/LmJhZGdlSWNvbiA/PyAnJ1wiXG4gICAgICBbYmFkZ2VTaXplXT1cIml0ZW0oKT8uYmFkZ2VTaXplIVwiXG4gICAgPjwvcnRlLWJhZGdlPlxuICA8L2xpPlxuICA8ZGl2ICpuZ0lmPVwiaXRlbSgpPy5oYXNTZXBhcmF0b3JcIiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj5cbiAgICA8cnRlLWRpdmlkZXIgLz5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -1,9 +1,14 @@
1
1
  import { CommonModule } from "@angular/common";
2
- import { Component, computed, contentChild, ElementRef, HostListener, inject, input, output, viewChild, } from "@angular/core";
3
- import { ARROW_DOWN_KEY, ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ESCAPE_KEY, TAB_KEY, } from "@design-system-rte/core/constants/keyboard/keyboard.constants";
2
+ import { Component, computed, contentChild, ElementRef, HostListener, inject, input, output, ViewContainerRef, viewChild, viewChildren, } from "@angular/core";
3
+ import { DropdownManager } from "@design-system-rte/core/components/dropdown/DropdownManager";
4
+ import { getAutoAlignment, getAutoPlacementDropdown, getCoordinates, } from "@design-system-rte/core/components/utils/auto-placement";
5
+ import { ARROW_DOWN_KEY, ARROW_UP_KEY, ESCAPE_KEY, TAB_KEY, } from "@design-system-rte/core/constants/keyboard/keyboard.constants";
6
+ import { logError, logWarn } from "@design-system-rte/core/utils/log-handlers";
4
7
  import { DropdownService } from "../../../services/dropdown.service";
8
+ import { OverlayService } from "../../../services/overlay.service";
5
9
  import { DividerComponent } from "../../divider/divider.component";
6
10
  import { DropdownItemComponent } from "../dropdown-item/dropdown-item.component";
11
+ import { focusParentDropdownFirstElement } from "../dropdown.utils";
7
12
  import { DropdownMenuFooterDirective } from "./dropdown-menu-footer.directive";
8
13
  import { DropdownMenuHeaderDirective } from "./dropdown-menu-header.directive";
9
14
  import * as i0 from "@angular/core";
@@ -11,7 +16,10 @@ import * as i1 from "@angular/common";
11
16
  export class DropdownMenuComponent {
12
17
  constructor() {
13
18
  this.elementRef = inject(ElementRef);
19
+ this.pendingPositioningFrameId = null;
14
20
  this.dropdownService = inject(DropdownService);
21
+ this.overlayService = inject(OverlayService);
22
+ this.viewContainerRef = inject(ViewContainerRef);
15
23
  this.items = input([]);
16
24
  this.menuId = input();
17
25
  this.itemEvent = output();
@@ -28,6 +36,7 @@ export class DropdownMenuComponent {
28
36
  this.footerTemplate = input(undefined);
29
37
  this.headerContentRef = viewChild("headerContent");
30
38
  this.footerContentRef = viewChild("footerContent");
39
+ this.itemComponents = viewChildren(DropdownItemComponent);
31
40
  this.hasHeaderContent = computed(() => {
32
41
  const hasTemplate = !!this.headerTemplate();
33
42
  const hasProjectedContent = !!this.headerContentRef()?.nativeElement?.children.length;
@@ -39,36 +48,92 @@ export class DropdownMenuComponent {
39
48
  return hasTemplate || hasProjectedContent;
40
49
  });
41
50
  }
51
+ static { this.SUB_MENU_OFFSET = 4; }
42
52
  getChildMenuId(itemIndex) {
43
53
  return `${this.menuId()}:${itemIndex + 1}`;
44
54
  }
45
55
  handleItemEvent(itemEvent) {
46
56
  this.itemEvent.emit(itemEvent);
47
57
  }
58
+ handleSubmenuRequest(event) {
59
+ const { children, childId, triggerElement, onCreated } = event;
60
+ const componentRef = this.overlayService.create(DropdownMenuComponent, this.viewContainerRef);
61
+ componentRef.setInput("items", children);
62
+ componentRef.setInput("menuId", childId);
63
+ componentRef.setInput("isOpen", true);
64
+ const hostElement = componentRef.location.nativeElement;
65
+ this.cancelPendingPositioningFrame();
66
+ this.pendingPositioningFrameId = requestAnimationFrame(() => {
67
+ this.pendingPositioningFrameId = null;
68
+ try {
69
+ const subMenuHost = componentRef.location?.nativeElement;
70
+ const menuElement = subMenuHost?.querySelector(".rte-dropdown-menu");
71
+ if (!triggerElement || !menuElement) {
72
+ logWarn("DropdownMenuComponent", "Unable to position submenu: required DOM elements not found.");
73
+ return;
74
+ }
75
+ const position = getAutoPlacementDropdown({
76
+ hostElement: triggerElement,
77
+ castedElement: menuElement,
78
+ defaultPosition: "right",
79
+ offset: DropdownMenuComponent.SUB_MENU_OFFSET,
80
+ hasDropdownParent: true,
81
+ });
82
+ const alignment = getAutoAlignment(triggerElement, menuElement, position);
83
+ const coords = getCoordinates(position, triggerElement, menuElement, DropdownMenuComponent.SUB_MENU_OFFSET, alignment);
84
+ hostElement.style.display = "block";
85
+ hostElement.style.position = "absolute";
86
+ hostElement.style.top = `${coords.top}px`;
87
+ hostElement.style.left = `${coords.left}px`;
88
+ hostElement.style.opacity = "1";
89
+ }
90
+ catch (error) {
91
+ logError("DropdownMenuComponent", "Error while positioning submenu:", error);
92
+ }
93
+ });
94
+ onCreated({ componentRef, hostElement });
95
+ }
96
+ ngOnDestroy() {
97
+ this.cancelPendingPositioningFrame();
98
+ }
99
+ cancelPendingPositioningFrame() {
100
+ if (this.pendingPositioningFrameId !== null) {
101
+ cancelAnimationFrame(this.pendingPositioningFrameId);
102
+ this.pendingPositioningFrameId = null;
103
+ }
104
+ }
48
105
  onKeyDown(event) {
49
106
  if (!event.target || !this.menuId()) {
50
107
  return;
51
108
  }
52
- if ([ARROW_UP_KEY, ARROW_DOWN_KEY, ARROW_LEFT_KEY, ARROW_RIGHT_KEY, TAB_KEY].includes(event.key)) {
109
+ if ([ARROW_UP_KEY, ARROW_DOWN_KEY, TAB_KEY].includes(event.key)) {
53
110
  event.preventDefault();
54
111
  }
55
112
  if (event.key === ESCAPE_KEY) {
56
113
  this.closingMenu.emit();
57
114
  }
58
115
  const menuId = this.menuId();
116
+ if (event.key === TAB_KEY && event.shiftKey) {
117
+ const parentMenuId = DropdownManager.getParentDropdownId(menuId);
118
+ if (parentMenuId) {
119
+ focusParentDropdownFirstElement(menuId);
120
+ this.closingMenu.emit();
121
+ return;
122
+ }
123
+ }
59
124
  this.dropdownService.handleKeyboardInput(event.key, {
60
125
  menuElement: this.elementRef,
61
126
  menuId,
62
127
  });
63
128
  }
64
129
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DropdownMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DropdownMenuComponent, isStandalone: true, selector: "rte-dropdown-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, menuId: { classPropertyName: "menuId", publicName: "menuId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, footerTemplate: { classPropertyName: "footerTemplate", publicName: "footerTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemEvent: "itemEvent", closingMenu: "closingMenu" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "attr.data-menu-id": "menuId()" } }, queries: [{ propertyName: "headerDirective", first: true, predicate: DropdownMenuHeaderDirective, descendants: true, isSignal: true }, { propertyName: "footerDirective", first: true, predicate: DropdownMenuFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "headerContentRef", first: true, predicate: ["headerContent"], descendants: true, isSignal: true }, { propertyName: "footerContentRef", first: true, predicate: ["footerContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rte-dropdown-menu {{ isOpen() ? 'open' : 'closed' }}\" [ngStyle]=\"menuStyle()\">\n @if (hasHeaderContent()) {\n <div class=\"rte-dropdown-menu-header\">\n @if (headerTemplate() || headerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(headerTemplate() || headerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #headerContent>\n <ng-content select=\"[dropdown-menu-header]\"></ng-content>\n </div>\n }\n <rte-divider />\n </div>\n }\n <div class=\"rte-dropdown-menu-content\">\n <ul class=\"rte-dropdown-items\" role=\"menu\" [attr.aria-activedescendant]=\"menuId()\">\n @for (item of items(); track item.label; let i = $index) {\n <rte-dropdown-item [item]=\"item\" (itemEvent)=\"handleItemEvent($event)\" />\n }\n </ul>\n </div>\n @if (hasFooterContent()) {\n <div class=\"rte-dropdown-menu-footer\">\n <rte-divider />\n @if (footerTemplate() || footerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(footerTemplate() || footerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #footerContent>\n <ng-content select=\"[dropdown-menu-footer]\"></ng-content>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{display:none;position:absolute}.rte-dropdown-menu{opacity:0;box-shadow:0 8px 16px 0 var(--elevation-shadow-key),0 0 2px 0 var(--elevation-shadow-ambient);background:linear-gradient(0deg,var(--elevation-surface-shadow-4) 0%,var(--elevation-surface-shadow-4) 100%);background-color:var(--background-default);position:absolute;top:0;left:0;display:flex;min-width:112px;max-width:280px;padding:8px 0;flex-direction:column;align-items:flex-start;gap:0px;border-radius:4px;transition:opacity .1s ease-in-out;pointer-events:auto;overflow-x:hidden;overflow-y:auto}.rte-dropdown-menu-header,.rte-dropdown-menu-content,.rte-dropdown-menu-footer{width:100%}.rte-dropdown-menu.open{opacity:1}.rte-dropdown-menu .rte-dropdown-items{width:100%;padding:0;margin:0}.rte-dropdown-menu .rte-dropdown-items li{list-style:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: DropdownItemComponent, selector: "rte-dropdown-item", inputs: ["item", "menuId"], outputs: ["itemEvent"] }, { kind: "component", type: DividerComponent, selector: "rte-divider", inputs: ["orientation", "thickness", "appearance", "endPoint"] }] }); }
130
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DropdownMenuComponent, isStandalone: true, selector: "rte-dropdown-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, menuId: { classPropertyName: "menuId", publicName: "menuId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, footerTemplate: { classPropertyName: "footerTemplate", publicName: "footerTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemEvent: "itemEvent", closingMenu: "closingMenu" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "attr.data-menu-id": "menuId()" } }, queries: [{ propertyName: "headerDirective", first: true, predicate: DropdownMenuHeaderDirective, descendants: true, isSignal: true }, { propertyName: "footerDirective", first: true, predicate: DropdownMenuFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "headerContentRef", first: true, predicate: ["headerContent"], descendants: true, isSignal: true }, { propertyName: "footerContentRef", first: true, predicate: ["footerContent"], descendants: true, isSignal: true }, { propertyName: "itemComponents", predicate: DropdownItemComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rte-dropdown-menu {{ isOpen() ? 'open' : 'closed' }}\" [ngStyle]=\"menuStyle()\">\n @if (hasHeaderContent()) {\n <div class=\"rte-dropdown-menu-header\">\n @if (headerTemplate() || headerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(headerTemplate() || headerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #headerContent>\n <ng-content select=\"[dropdown-menu-header]\"></ng-content>\n </div>\n }\n <rte-divider />\n </div>\n }\n <div class=\"rte-dropdown-menu-content\">\n <ul class=\"rte-dropdown-items\" role=\"menu\" [attr.aria-activedescendant]=\"menuId()\">\n @for (item of items(); track item.label; let i = $index) {\n <rte-dropdown-item\n [item]=\"item\"\n [menuId]=\"menuId()\"\n (itemEvent)=\"handleItemEvent($event)\"\n (submenuRequest)=\"handleSubmenuRequest($event)\"\n />\n }\n </ul>\n </div>\n @if (hasFooterContent()) {\n <div class=\"rte-dropdown-menu-footer\">\n <rte-divider />\n @if (footerTemplate() || footerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(footerTemplate() || footerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #footerContent>\n <ng-content select=\"[dropdown-menu-footer]\"></ng-content>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{display:none;position:absolute}.rte-dropdown-menu{opacity:0;box-shadow:0 8px 16px 0 var(--elevation-shadow-key),0 0 2px 0 var(--elevation-shadow-ambient);background:linear-gradient(0deg,var(--elevation-surface-shadow-4) 0%,var(--elevation-surface-shadow-4) 100%);background-color:var(--background-default);position:absolute;top:0;left:0;display:flex;min-width:112px;max-width:280px;padding:8px 0;flex-direction:column;align-items:flex-start;gap:0px;border-radius:4px;transition:opacity .1s ease-in-out;pointer-events:auto;overflow-x:hidden;overflow-y:auto}.rte-dropdown-menu-header,.rte-dropdown-menu-content,.rte-dropdown-menu-footer{width:100%}.rte-dropdown-menu.open{opacity:1}.rte-dropdown-menu .rte-dropdown-items{width:100%;padding:0;margin:0}.rte-dropdown-menu .rte-dropdown-items li{list-style:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: DropdownItemComponent, selector: "rte-dropdown-item", inputs: ["item", "menuId"], outputs: ["itemEvent", "submenuRequest"] }, { kind: "component", type: DividerComponent, selector: "rte-divider", inputs: ["orientation", "thickness", "appearance", "endPoint"] }] }); }
66
131
  }
67
132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DropdownMenuComponent, decorators: [{
68
133
  type: Component,
69
- args: [{ selector: "rte-dropdown-menu", imports: [CommonModule, DropdownItemComponent, DividerComponent], standalone: true, host: { "[attr.data-menu-id]": "menuId()" }, template: "<div class=\"rte-dropdown-menu {{ isOpen() ? 'open' : 'closed' }}\" [ngStyle]=\"menuStyle()\">\n @if (hasHeaderContent()) {\n <div class=\"rte-dropdown-menu-header\">\n @if (headerTemplate() || headerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(headerTemplate() || headerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #headerContent>\n <ng-content select=\"[dropdown-menu-header]\"></ng-content>\n </div>\n }\n <rte-divider />\n </div>\n }\n <div class=\"rte-dropdown-menu-content\">\n <ul class=\"rte-dropdown-items\" role=\"menu\" [attr.aria-activedescendant]=\"menuId()\">\n @for (item of items(); track item.label; let i = $index) {\n <rte-dropdown-item [item]=\"item\" (itemEvent)=\"handleItemEvent($event)\" />\n }\n </ul>\n </div>\n @if (hasFooterContent()) {\n <div class=\"rte-dropdown-menu-footer\">\n <rte-divider />\n @if (footerTemplate() || footerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(footerTemplate() || footerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #footerContent>\n <ng-content select=\"[dropdown-menu-footer]\"></ng-content>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{display:none;position:absolute}.rte-dropdown-menu{opacity:0;box-shadow:0 8px 16px 0 var(--elevation-shadow-key),0 0 2px 0 var(--elevation-shadow-ambient);background:linear-gradient(0deg,var(--elevation-surface-shadow-4) 0%,var(--elevation-surface-shadow-4) 100%);background-color:var(--background-default);position:absolute;top:0;left:0;display:flex;min-width:112px;max-width:280px;padding:8px 0;flex-direction:column;align-items:flex-start;gap:0px;border-radius:4px;transition:opacity .1s ease-in-out;pointer-events:auto;overflow-x:hidden;overflow-y:auto}.rte-dropdown-menu-header,.rte-dropdown-menu-content,.rte-dropdown-menu-footer{width:100%}.rte-dropdown-menu.open{opacity:1}.rte-dropdown-menu .rte-dropdown-items{width:100%;padding:0;margin:0}.rte-dropdown-menu .rte-dropdown-items li{list-style:none}\n"] }]
134
+ args: [{ selector: "rte-dropdown-menu", imports: [CommonModule, DropdownItemComponent, DividerComponent], standalone: true, host: { "[attr.data-menu-id]": "menuId()" }, template: "<div class=\"rte-dropdown-menu {{ isOpen() ? 'open' : 'closed' }}\" [ngStyle]=\"menuStyle()\">\n @if (hasHeaderContent()) {\n <div class=\"rte-dropdown-menu-header\">\n @if (headerTemplate() || headerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(headerTemplate() || headerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #headerContent>\n <ng-content select=\"[dropdown-menu-header]\"></ng-content>\n </div>\n }\n <rte-divider />\n </div>\n }\n <div class=\"rte-dropdown-menu-content\">\n <ul class=\"rte-dropdown-items\" role=\"menu\" [attr.aria-activedescendant]=\"menuId()\">\n @for (item of items(); track item.label; let i = $index) {\n <rte-dropdown-item\n [item]=\"item\"\n [menuId]=\"menuId()\"\n (itemEvent)=\"handleItemEvent($event)\"\n (submenuRequest)=\"handleSubmenuRequest($event)\"\n />\n }\n </ul>\n </div>\n @if (hasFooterContent()) {\n <div class=\"rte-dropdown-menu-footer\">\n <rte-divider />\n @if (footerTemplate() || footerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(footerTemplate() || footerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #footerContent>\n <ng-content select=\"[dropdown-menu-footer]\"></ng-content>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{display:none;position:absolute}.rte-dropdown-menu{opacity:0;box-shadow:0 8px 16px 0 var(--elevation-shadow-key),0 0 2px 0 var(--elevation-shadow-ambient);background:linear-gradient(0deg,var(--elevation-surface-shadow-4) 0%,var(--elevation-surface-shadow-4) 100%);background-color:var(--background-default);position:absolute;top:0;left:0;display:flex;min-width:112px;max-width:280px;padding:8px 0;flex-direction:column;align-items:flex-start;gap:0px;border-radius:4px;transition:opacity .1s ease-in-out;pointer-events:auto;overflow-x:hidden;overflow-y:auto}.rte-dropdown-menu-header,.rte-dropdown-menu-content,.rte-dropdown-menu-footer{width:100%}.rte-dropdown-menu.open{opacity:1}.rte-dropdown-menu .rte-dropdown-items{width:100%;padding:0;margin:0}.rte-dropdown-menu .rte-dropdown-items li{list-style:none}\n"] }]
70
135
  }], propDecorators: { onKeyDown: [{
71
136
  type: HostListener,
72
137
  args: ["keydown", ["$event"]]
73
138
  }] } });
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kcy1ydGUtbGliL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24tbWVudS9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZUFBZSxFQUNmLFlBQVksRUFDWixVQUFVLEVBQ1YsT0FBTyxHQUNSLE1BQU0sK0RBQStELENBQUM7QUFFdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBc0IsTUFBTSwwQ0FBMEMsQ0FBQztBQUVyRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBVS9FLE1BQU0sT0FBTyxxQkFBcUI7SUFSbEM7UUFTbUIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxvQkFBZSxHQUFHLE1BQU0s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ekIsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2xELFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUM1QixNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FsRVUscUJBQXFCO21HQUFyQixxQkFBcUIsNmpDQWtCUSwyQkFBMkIsa0dBQzNCLDJCQUEyQix1VEN4RHJFLDZ5Q0FpQ0EsdzJCREZZLFlBQVksMlJBQUUscUJBQXFCLGtIQUFFLGdCQUFnQjs7NEZBTXBELHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDRSxtQkFBbUIsV0FDcEIsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsY0FDcEQsSUFBSSxRQUdWLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFOzhCQWtEM0MsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGNvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBBUlJPV19ET1dOX0tFWSxcbiAgQVJST1dfTEVGVF9LRVksXG4gIEFSUk9XX1JJR0hUX0tFWSxcbiAgQVJST1dfVVBfS0VZLFxuICBFU0NBUEVfS0VZLFxuICBUQUJfS0VZLFxufSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29uc3RhbnRzL2tleWJvYXJkL2tleWJvYXJkLmNvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBEcm9wZG93blNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvZHJvcGRvd24uc2VydmljZVwiO1xuaW1wb3J0IHsgRGl2aWRlckNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9kaXZpZGVyL2RpdmlkZXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEcm9wZG93bkl0ZW1Db21wb25lbnQsIERyb3Bkb3duSXRlbUNvbmZpZyB9IGZyb20gXCIuLi9kcm9wZG93bi1pdGVtL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50XCI7XG5cbmltcG9ydCB7IERyb3Bkb3duTWVudUZvb3RlckRpcmVjdGl2ZSB9IGZyb20gXCIuL2Ryb3Bkb3duLW1lbnUtZm9vdGVyLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgRHJvcGRvd25NZW51SGVhZGVyRGlyZWN0aXZlIH0gZnJvbSBcIi4vZHJvcGRvd24tbWVudS1oZWFkZXIuZGlyZWN0aXZlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJydGUtZHJvcGRvd24tbWVudVwiLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEcm9wZG93bkl0ZW1Db21wb25lbnQsIERpdmlkZXJDb21wb25lbnRdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogXCIuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5zY3NzXCIsXG4gIGhvc3Q6IHsgXCJbYXR0ci5kYXRhLW1lbnUtaWRdXCI6IFwibWVudUlkKClcIiB9LFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd25TZXJ2aWNlID0gaW5qZWN0KERyb3Bkb3duU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgaXRlbXMgPSBpbnB1dDxEcm9wZG93bkl0ZW1Db25maWdbXT4oW10pO1xuICByZWFkb25seSBtZW51SWQgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgcmVhZG9ubHkgaXRlbUV2ZW50ID0gb3V0cHV0PHsgZXZlbnQ6IEV2ZW50OyBpZDogc3RyaW5nIH0+KCk7XG5cbiAgcmVhZG9ubHkgd2lkdGhTdHlsZSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLndpZHRoKCkgIT09IHVuZGVmaW5lZCA/IGAke3RoaXMud2lkdGgoKX1weGAgOiB1bmRlZmluZWQpKTtcbiAgcmVhZG9ubHkgaXNPcGVuID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSB3aWR0aCA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBjbG9zaW5nTWVudSA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IG1lbnVTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy53aWR0aCgpID8geyB3aWR0aDogdGhpcy53aWR0aCgpICsgXCJweFwiLCBcIm1heC13aWR0aFwiOiB0aGlzLndpZHRoKCkgKyBcInB4XCIgfSA6IHt9O1xuICB9KTtcblxuICByZWFkb25seSBoZWFkZXJEaXJlY3RpdmUgPSBjb250ZW50Q2hpbGQoRHJvcGRvd25NZW51SGVhZGVyRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgZm9vdGVyRGlyZWN0aXZlID0gY29udGVudENoaWxkKERyb3Bkb3duTWVudUZvb3RlckRpcmVjdGl2ZSk7XG5cbiAgcmVhZG9ubHkgaGVhZGVyVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGZvb3RlclRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IGhlYWRlckNvbnRlbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KFwiaGVhZGVyQ29udGVudFwiKTtcbiAgcmVhZG9ubHkgZm9vdGVyQ29udGVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oXCJmb290ZXJDb250ZW50XCIpO1xuXG4gIHJlYWRvbmx5IGhhc0hlYWRlckNvbnRlbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVGVtcGxhdGUgPSAhIXRoaXMuaGVhZGVyVGVtcGxhdGUoKTtcbiAgICBjb25zdCBoYXNQcm9qZWN0ZWRDb250ZW50ID0gISF0aGlzLmhlYWRlckNvbnRlbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHJldHVybiBoYXNUZW1wbGF0ZSB8fCBoYXNQcm9qZWN0ZWRDb250ZW50O1xuICB9KTtcblxuICByZWFkb25seSBoYXNGb290ZXJDb250ZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1RlbXBsYXRlID0gISF0aGlzLmZvb3RlclRlbXBsYXRlKCk7XG4gICAgY29uc3QgaGFzUHJvamVjdGVkQ29udGVudCA9ICEhdGhpcy5mb290ZXJDb250ZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNoaWxkcmVuLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzVGVtcGxhdGUgfHwgaGFzUHJvamVjdGVkQ29udGVudDtcbiAgfSk7XG5cbiAgZ2V0Q2hpbGRNZW51SWQoaXRlbUluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1lbnVJZCgpfToke2l0ZW1JbmRleCArIDF9YDtcbiAgfVxuXG4gIGhhbmRsZUl0ZW1FdmVudChpdGVtRXZlbnQ6IHsgZXZlbnQ6IEV2ZW50OyBpZDogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1FdmVudC5lbWl0KGl0ZW1FdmVudCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwia2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQudGFyZ2V0IHx8ICF0aGlzLm1lbnVJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFtBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBUQUJfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgIHRoaXMuY2xvc2luZ01lbnUuZW1pdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnVJZCA9IHRoaXMubWVudUlkKCkgYXMgc3RyaW5nO1xuICAgIHRoaXMuZHJvcGRvd25TZXJ2aWNlLmhhbmRsZUtleWJvYXJkSW5wdXQoZXZlbnQua2V5LCB7XG4gICAgICBtZW51RWxlbWVudDogdGhpcy5lbGVtZW50UmVmLFxuICAgICAgbWVudUlkLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUge3sgaXNPcGVuKCkgPyAnb3BlbicgOiAnY2xvc2VkJyB9fVwiIFtuZ1N0eWxlXT1cIm1lbnVTdHlsZSgpXCI+XG4gIEBpZiAoaGFzSGVhZGVyQ29udGVudCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cInJ0ZS1kcm9wZG93bi1tZW51LWhlYWRlclwiPlxuICAgICAgQGlmIChoZWFkZXJUZW1wbGF0ZSgpIHx8IGhlYWRlckRpcmVjdGl2ZSgpPy50ZW1wbGF0ZVJlZikge1xuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIihoZWFkZXJUZW1wbGF0ZSgpIHx8IGhlYWRlckRpcmVjdGl2ZSgpPy50ZW1wbGF0ZVJlZikgPz8gbnVsbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgI2hlYWRlckNvbnRlbnQ+XG4gICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Ryb3Bkb3duLW1lbnUtaGVhZGVyXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8cnRlLWRpdmlkZXIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUtY29udGVudFwiPlxuICAgIDx1bCBjbGFzcz1cInJ0ZS1kcm9wZG93bi1pdGVtc1wiIHJvbGU9XCJtZW51XCIgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cIm1lbnVJZCgpXCI+XG4gICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0ubGFiZWw7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxydGUtZHJvcGRvd24taXRlbSBbaXRlbV09XCJpdGVtXCIgKGl0ZW1FdmVudCk9XCJoYW5kbGVJdGVtRXZlbnQoJGV2ZW50KVwiIC8+XG4gICAgICB9XG4gICAgPC91bD5cbiAgPC9kaXY+XG4gIEBpZiAoaGFzRm9vdGVyQ29udGVudCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cInJ0ZS1kcm9wZG93bi1tZW51LWZvb3RlclwiPlxuICAgICAgPHJ0ZS1kaXZpZGVyIC8+XG4gICAgICBAaWYgKGZvb3RlclRlbXBsYXRlKCkgfHwgZm9vdGVyRGlyZWN0aXZlKCk/LnRlbXBsYXRlUmVmKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiKGZvb3RlclRlbXBsYXRlKCkgfHwgZm9vdGVyRGlyZWN0aXZlKCk/LnRlbXBsYXRlUmVmKSA/PyBudWxsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiAjZm9vdGVyQ29udGVudD5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZHJvcGRvd24tbWVudS1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kcy1ydGUtbGliL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24tbWVudS9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFFTixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDOUYsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsY0FBYyxHQUNmLE1BQU0seURBQXlELENBQUM7QUFDakUsT0FBTyxFQUNMLGNBQWMsRUFDZCxZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sR0FDUixNQUFNLCtEQUErRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJB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QixNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0EvSVUscUJBQXFCO21HQUFyQixxQkFBcUIsNmpDQXNCUSwyQkFBMkIsa0dBQzNCLDJCQUEyQiwyVUFPNUIscUJBQXFCLGdFQzlFOUQsMDZDQXNDQSx3MkJESVksWUFBWSwyUkFBRSxxQkFBcUIsb0lBQUUsZ0JBQWdCOzs0RkFNcEQscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLG1CQUFtQixXQUNwQixDQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsQ0FBQyxjQUNwRCxJQUFJLFFBR1YsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUU7OEJBcUgzQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgY29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgdmlld0NoaWxkLFxuICB2aWV3Q2hpbGRyZW4sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBEcm9wZG93bk1hbmFnZXIgfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29tcG9uZW50cy9kcm9wZG93bi9Ecm9wZG93bk1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGdldEF1dG9BbGlnbm1lbnQsXG4gIGdldEF1dG9QbGFjZW1lbnREcm9wZG93bixcbiAgZ2V0Q29vcmRpbmF0ZXMsXG59IGZyb20gXCJAZGVzaWduLXN5c3RlbS1ydGUvY29yZS9jb21wb25lbnRzL3V0aWxzL2F1dG8tcGxhY2VtZW50XCI7XG5pbXBvcnQge1xuICBBUlJPV19ET1dOX0tFWSxcbiAgQVJST1dfVVBfS0VZLFxuICBFU0NBUEVfS0VZLFxuICBUQUJfS0VZLFxufSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29uc3RhbnRzL2tleWJvYXJkL2tleWJvYXJkLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9nRXJyb3IsIGxvZ1dhcm4gfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvdXRpbHMvbG9nLWhhbmRsZXJzXCI7XG5cbmltcG9ydCB7IERyb3Bkb3duU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9kcm9wZG93bi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPdmVybGF5U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9vdmVybGF5LnNlcnZpY2VcIjtcbmltcG9ydCB7IERpdmlkZXJDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vZGl2aWRlci9kaXZpZGVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHJvcGRvd25JdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4uL2Ryb3Bkb3duLWl0ZW0vZHJvcGRvd24taXRlbS5jb21wb25lbnRcIjtcbmltcG9ydCB7IERyb3Bkb3duSXRlbUNvbmZpZywgU3VibWVudVJlcXVlc3RFdmVudCB9IGZyb20gXCIuLi9kcm9wZG93bi50eXBlc1wiO1xuaW1wb3J0IHsgZm9jdXNQYXJlbnREcm9wZG93bkZpcnN0RWxlbWVudCB9IGZyb20gXCIuLi9kcm9wZG93bi51dGlsc1wiO1xuXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVGb290ZXJEaXJlY3RpdmUgfSBmcm9tIFwiLi9kcm9wZG93bi1tZW51LWZvb3Rlci5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IERyb3Bkb3duTWVudUhlYWRlckRpcmVjdGl2ZSB9IGZyb20gXCIuL2Ryb3Bkb3duLW1lbnUtaGVhZGVyLmRpcmVjdGl2ZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwicnRlLWRyb3Bkb3duLW1lbnVcIixcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHJvcGRvd25JdGVtQ29tcG9uZW50LCBEaXZpZGVyQ29tcG9uZW50XSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6IFwiLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsOiBcIi4vZHJvcGRvd24tbWVudS5jb21wb25lbnQuc2Nzc1wiLFxuICBob3N0OiB7IFwiW2F0dHIuZGF0YS1tZW51LWlkXVwiOiBcIm1lbnVJZCgpXCIgfSxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1VCX01FTlVfT0ZGU0VUID0gNDtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHBlbmRpbmdQb3NpdGlvbmluZ0ZyYW1lSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duU2VydmljZSA9IGluamVjdChEcm9wZG93blNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXlTZXJ2aWNlID0gaW5qZWN0KE92ZXJsYXlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuXG4gIHJlYWRvbmx5IGl0ZW1zID0gaW5wdXQ8RHJvcGRvd25JdGVtQ29uZmlnW10+KFtdKTtcbiAgcmVhZG9ubHkgbWVudUlkID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gIHJlYWRvbmx5IGl0ZW1FdmVudCA9IG91dHB1dDx7IGV2ZW50OiBFdmVudDsgaWQ6IHN0cmluZzsgaXRlbT86IERyb3Bkb3duSXRlbUNvbmZpZyB9PigpO1xuXG4gIHJlYWRvbmx5IHdpZHRoU3R5bGUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy53aWR0aCgpICE9PSB1bmRlZmluZWQgPyBgJHt0aGlzLndpZHRoKCl9cHhgIDogdW5kZWZpbmVkKSk7XG4gIHJlYWRvbmx5IGlzT3BlbiA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgd2lkdGggPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgY2xvc2luZ01lbnUgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICByZWFkb25seSBtZW51U3R5bGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGgoKSA/IHsgd2lkdGg6IHRoaXMud2lkdGgoKSArIFwicHhcIiwgXCJtYXgtd2lkdGhcIjogdGhpcy53aWR0aCgpICsgXCJweFwiIH0gOiB7fTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGVhZGVyRGlyZWN0aXZlID0gY29udGVudENoaWxkKERyb3Bkb3duTWVudUhlYWRlckRpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGZvb3RlckRpcmVjdGl2ZSA9IGNvbnRlbnRDaGlsZChEcm9wZG93bk1lbnVGb290ZXJEaXJlY3RpdmUpO1xuXG4gIHJlYWRvbmx5IGhlYWRlclRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb290ZXJUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICByZWFkb25seSBoZWFkZXJDb250ZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihcImhlYWRlckNvbnRlbnRcIik7XG4gIHJlYWRvbmx5IGZvb3RlckNvbnRlbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KFwiZm9vdGVyQ29udGVudFwiKTtcbiAgcmVhZG9ubHkgaXRlbUNvbXBvbmVudHMgPSB2aWV3Q2hpbGRyZW4oRHJvcGRvd25JdGVtQ29tcG9uZW50KTtcblxuICByZWFkb25seSBoYXNIZWFkZXJDb250ZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1RlbXBsYXRlID0gISF0aGlzLmhlYWRlclRlbXBsYXRlKCk7XG4gICAgY29uc3QgaGFzUHJvamVjdGVkQ29udGVudCA9ICEhdGhpcy5oZWFkZXJDb250ZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNoaWxkcmVuLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzVGVtcGxhdGUgfHwgaGFzUHJvamVjdGVkQ29udGVudDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGFzRm9vdGVyQ29udGVudCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBoYXNUZW1wbGF0ZSA9ICEhdGhpcy5mb290ZXJUZW1wbGF0ZSgpO1xuICAgIGNvbnN0IGhhc1Byb2plY3RlZENvbnRlbnQgPSAhIXRoaXMuZm9vdGVyQ29udGVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jaGlsZHJlbi5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc1RlbXBsYXRlIHx8IGhhc1Byb2plY3RlZENvbnRlbnQ7XG4gIH0pO1xuXG4gIGdldENoaWxkTWVudUlkKGl0ZW1JbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5tZW51SWQoKX06JHtpdGVtSW5kZXggKyAxfWA7XG4gIH1cblxuICBoYW5kbGVJdGVtRXZlbnQoaXRlbUV2ZW50OiB7IGV2ZW50OiBFdmVudDsgaWQ6IHN0cmluZzsgaXRlbT86IERyb3Bkb3duSXRlbUNvbmZpZyB9KTogdm9pZCB7XG4gICAgdGhpcy5pdGVtRXZlbnQuZW1pdChpdGVtRXZlbnQpO1xuICB9XG5cbiAgaGFuZGxlU3VibWVudVJlcXVlc3QoZXZlbnQ6IFN1Ym1lbnVSZXF1ZXN0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNoaWxkcmVuLCBjaGlsZElkLCB0cmlnZ2VyRWxlbWVudCwgb25DcmVhdGVkIH0gPSBldmVudDtcblxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheVNlcnZpY2UuY3JlYXRlKERyb3Bkb3duTWVudUNvbXBvbmVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICBjb21wb25lbnRSZWYuc2V0SW5wdXQoXCJpdGVtc1wiLCBjaGlsZHJlbik7XG4gICAgY29tcG9uZW50UmVmLnNldElucHV0KFwibWVudUlkXCIsIGNoaWxkSWQpO1xuICAgIGNvbXBvbmVudFJlZi5zZXRJbnB1dChcImlzT3BlblwiLCB0cnVlKTtcblxuICAgIGNvbnN0IGhvc3RFbGVtZW50ID0gY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICB0aGlzLmNhbmNlbFBlbmRpbmdQb3NpdGlvbmluZ0ZyYW1lKCk7XG4gICAgdGhpcy5wZW5kaW5nUG9zaXRpb25pbmdGcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1Bvc2l0aW9uaW5nRnJhbWVJZCA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdWJNZW51SG9zdCA9IGNvbXBvbmVudFJlZi5sb2NhdGlvbj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgIGNvbnN0IG1lbnVFbGVtZW50ID0gc3ViTWVudUhvc3Q/LnF1ZXJ5U2VsZWN0b3IoXCIucnRlLWRyb3Bkb3duLW1lbnVcIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgICAgIGlmICghdHJpZ2dlckVsZW1lbnQgfHwgIW1lbnVFbGVtZW50KSB7XG4gICAgICAgICAgbG9nV2FybihcIkRyb3Bkb3duTWVudUNvbXBvbmVudFwiLCBcIlVuYWJsZSB0byBwb3NpdGlvbiBzdWJtZW51OiByZXF1aXJlZCBET00gZWxlbWVudHMgbm90IGZvdW5kLlwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldEF1dG9QbGFjZW1lbnREcm9wZG93bih7XG4gICAgICAgICAgaG9zdEVsZW1lbnQ6IHRyaWdnZXJFbGVtZW50LFxuICAgICAgICAgIGNhc3RlZEVsZW1lbnQ6IG1lbnVFbGVtZW50LFxuICAgICAgICAgIGRlZmF1bHRQb3NpdGlvbjogXCJyaWdodFwiLFxuICAgICAgICAgIG9mZnNldDogRHJvcGRvd25NZW51Q29tcG9uZW50LlNVQl9NRU5VX09GRlNFVCxcbiAgICAgICAgICBoYXNEcm9wZG93blBhcmVudDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGdldEF1dG9BbGlnbm1lbnQodHJpZ2dlckVsZW1lbnQsIG1lbnVFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IGdldENvb3JkaW5hdGVzKFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRyaWdnZXJFbGVtZW50LFxuICAgICAgICAgIG1lbnVFbGVtZW50LFxuICAgICAgICAgIERyb3Bkb3duTWVudUNvbXBvbmVudC5TVUJfTUVOVV9PRkZTRVQsXG4gICAgICAgICAgYWxpZ25tZW50LFxuICAgICAgICApO1xuXG4gICAgICAgIGhvc3RFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIGhvc3RFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBob3N0RWxlbWVudC5zdHlsZS50b3AgPSBgJHtjb29yZHMudG9wfXB4YDtcbiAgICAgICAgaG9zdEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2Nvb3Jkcy5sZWZ0fXB4YDtcbiAgICAgICAgaG9zdEVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nRXJyb3IoXCJEcm9wZG93bk1lbnVDb21wb25lbnRcIiwgXCJFcnJvciB3aGlsZSBwb3NpdGlvbmluZyBzdWJtZW51OlwiLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvbkNyZWF0ZWQoeyBjb21wb25lbnRSZWYsIGhvc3RFbGVtZW50IH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxQZW5kaW5nUG9zaXRpb25pbmdGcmFtZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxQZW5kaW5nUG9zaXRpb25pbmdGcmFtZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nUG9zaXRpb25pbmdGcmFtZUlkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnBlbmRpbmdQb3NpdGlvbmluZ0ZyYW1lSWQpO1xuICAgICAgdGhpcy5wZW5kaW5nUG9zaXRpb25pbmdGcmFtZUlkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwia2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQudGFyZ2V0IHx8ICF0aGlzLm1lbnVJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFtBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBUQUJfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgIHRoaXMuY2xvc2luZ01lbnUuZW1pdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnVJZCA9IHRoaXMubWVudUlkKCkgYXMgc3RyaW5nO1xuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gVEFCX0tFWSAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgY29uc3QgcGFyZW50TWVudUlkID0gRHJvcGRvd25NYW5hZ2VyLmdldFBhcmVudERyb3Bkb3duSWQobWVudUlkKTtcbiAgICAgIGlmIChwYXJlbnRNZW51SWQpIHtcbiAgICAgICAgZm9jdXNQYXJlbnREcm9wZG93bkZpcnN0RWxlbWVudChtZW51SWQpO1xuICAgICAgICB0aGlzLmNsb3NpbmdNZW51LmVtaXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHJvcGRvd25TZXJ2aWNlLmhhbmRsZUtleWJvYXJkSW5wdXQoZXZlbnQua2V5LCB7XG4gICAgICBtZW51RWxlbWVudDogdGhpcy5lbGVtZW50UmVmLFxuICAgICAgbWVudUlkLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUge3sgaXNPcGVuKCkgPyAnb3BlbicgOiAnY2xvc2VkJyB9fVwiIFtuZ1N0eWxlXT1cIm1lbnVTdHlsZSgpXCI+XG4gIEBpZiAoaGFzSGVhZGVyQ29udGVudCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cInJ0ZS1kcm9wZG93bi1tZW51LWhlYWRlclwiPlxuICAgICAgQGlmIChoZWFkZXJUZW1wbGF0ZSgpIHx8IGhlYWRlckRpcmVjdGl2ZSgpPy50ZW1wbGF0ZVJlZikge1xuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIihoZWFkZXJUZW1wbGF0ZSgpIHx8IGhlYWRlckRpcmVjdGl2ZSgpPy50ZW1wbGF0ZVJlZikgPz8gbnVsbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgI2hlYWRlckNvbnRlbnQ+XG4gICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Ryb3Bkb3duLW1lbnUtaGVhZGVyXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8cnRlLWRpdmlkZXIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUtY29udGVudFwiPlxuICAgIDx1bCBjbGFzcz1cInJ0ZS1kcm9wZG93bi1pdGVtc1wiIHJvbGU9XCJtZW51XCIgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cIm1lbnVJZCgpXCI+XG4gICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0ubGFiZWw7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxydGUtZHJvcGRvd24taXRlbVxuICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgIFttZW51SWRdPVwibWVudUlkKClcIlxuICAgICAgICAgIChpdGVtRXZlbnQpPVwiaGFuZGxlSXRlbUV2ZW50KCRldmVudClcIlxuICAgICAgICAgIChzdWJtZW51UmVxdWVzdCk9XCJoYW5kbGVTdWJtZW51UmVxdWVzdCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgIH1cbiAgICA8L3VsPlxuICA8L2Rpdj5cbiAgQGlmIChoYXNGb290ZXJDb250ZW50KCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUtZm9vdGVyXCI+XG4gICAgICA8cnRlLWRpdmlkZXIgLz5cbiAgICAgIEBpZiAoZm9vdGVyVGVtcGxhdGUoKSB8fCBmb290ZXJEaXJlY3RpdmUoKT8udGVtcGxhdGVSZWYpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCIoZm9vdGVyVGVtcGxhdGUoKSB8fCBmb290ZXJEaXJlY3RpdmUoKT8udGVtcGxhdGVSZWYpID8/IG51bGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2ICNmb290ZXJDb250ZW50PlxuICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltkcm9wZG93bi1tZW51LWZvb3Rlcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==