@k8slens/drop-down-menu-contracts 1.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.
@@ -0,0 +1,21 @@
1
+ export { getDropDownMenuKind } from "./src/drop-down-menu-kind";
2
+ export { type DropDownMenuKindDeclaration, type DropDownMenuKindDeclarationFactory, type DropDownMenuKindInjectableParams, dropDownMenuKindInjectionToken, getDropDownMenuKindInjectableBunch, } from "./src/drop-down-menu-kind-injection-token";
3
+ export type { DropDownMenuData, DropDownMenuKind } from "./src/drop-down-menu-kind";
4
+ export { dropDownMenuItemInjectionToken, getDropDownMenuItemInjectableBunch, } from "./src/drop-down-menu-item";
5
+ export type { DropDownMenuItem, DropDownMenuItemBunchParams, DropDownMenuItemFactory, DropDownMenuItemTokenFor, } from "./src/drop-down-menu-item";
6
+ export { dropDownMenu } from "./src/drop-down-menu-spec";
7
+ export type { DropDownMenuGap, DropDownMenuOpenOn, DropDownMenuOptions, DropDownMenuPosition, DropDownMenuSpec, } from "./src/drop-down-menu-spec";
8
+ export { DefaultDropDownMenuContainer, dropDownMenuContainerComponentInjectionToken, } from "./src/drop-down-menu-container-component";
9
+ export type { DropDownMenuContainerComponent, DropDownMenuContainerProps, DropDownMenuContainerTokenFor, } from "./src/drop-down-menu-container-component";
10
+ export { DropDownMenu } from "./src/drop-down-menu-component";
11
+ export type { DropDownMenuProps } from "./src/drop-down-menu-component";
12
+ export { closeAllDropDownMenusInjectionToken, closeDropDownMenuInjectionToken, } from "./src/close-drop-down-menu";
13
+ export type { CloseAllDropDownMenus, CloseDropDownMenu } from "./src/close-drop-down-menu";
14
+ export { contextForClosingDropDownMenu, useCloseDropDownMenu } from "./src/close-drop-down-menu-context";
15
+ /**
16
+ * The authoring model of the context menu and the anchored menu, which draw their own rows.
17
+ * Drop-down menus proper have no such model — their items are arbitrary components.
18
+ */
19
+ export type { ActionMenuItem, ComponentLabelable, ComponentMenuItem, GroupOfMenuItems, LabelPropsFor, MenuItem, ReactLabelable, SubMenuItem, TextLabelable, } from "./src/context-menu-items";
20
+ export { menuItemActivatedContext } from "./src/menu-item-activated-context";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EACvC,KAAK,gCAAgC,EACrC,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,2CAA2C,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,4BAA4B,EAC5B,4CAA4C,GAC7C,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,8BAA8B,EAC9B,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EACL,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAEzG;;;GAGG;AACH,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ DefaultDropDownMenuContainer: () => DefaultDropDownMenuContainer,
24
+ DropDownMenu: () => DropDownMenu,
25
+ closeAllDropDownMenusInjectionToken: () => closeAllDropDownMenusInjectionToken,
26
+ closeDropDownMenuInjectionToken: () => closeDropDownMenuInjectionToken,
27
+ contextForClosingDropDownMenu: () => contextForClosingDropDownMenu,
28
+ dropDownMenu: () => dropDownMenu,
29
+ dropDownMenuContainerComponentInjectionToken: () => dropDownMenuContainerComponentInjectionToken,
30
+ dropDownMenuItemInjectionToken: () => dropDownMenuItemInjectionToken,
31
+ dropDownMenuKindInjectionToken: () => dropDownMenuKindInjectionToken,
32
+ getDropDownMenuItemInjectableBunch: () => getDropDownMenuItemInjectableBunch,
33
+ getDropDownMenuKind: () => getDropDownMenuKind,
34
+ getDropDownMenuKindInjectableBunch: () => getDropDownMenuKindInjectableBunch,
35
+ menuItemActivatedContext: () => menuItemActivatedContext,
36
+ useCloseDropDownMenu: () => useCloseDropDownMenu
37
+ });
38
+ module.exports = __toCommonJS(index_exports);
39
+
40
+ // src/drop-down-menu-kind.ts
41
+ var import_injectable = require("@k8slens/injectable");
42
+ var getDropDownMenuKind = () => (specifier) => (0, import_injectable.getTypedSpecifier)()(specifier);
43
+
44
+ // src/drop-down-menu-kind-injection-token.ts
45
+ var import_injectable2 = require("@k8slens/injectable");
46
+ var dropDownMenuKindInjectionToken = (0, import_injectable2.getInjectionToken2)({
47
+ id: "drop-down-menu-kind",
48
+ cardinality: "zero-or-many"
49
+ })();
50
+ var getDropDownMenuKindInjectableBunch = (params) => (0, import_injectable2.getInjectableBunch)({
51
+ dropDownMenuKind: (0, import_injectable2.getInjectable2)({
52
+ id: params.id,
53
+ instantiate: () => () => ({
54
+ kind: params.kind,
55
+ description: params.description
56
+ }),
57
+ injectionToken: dropDownMenuKindInjectionToken
58
+ })
59
+ });
60
+
61
+ // src/drop-down-menu-item.ts
62
+ var import_injectable3 = require("@k8slens/injectable");
63
+ var dropDownMenuItemTokenFor = (kind) => (0, import_injectable3.getInjectionToken2)({
64
+ id: `drop-down-menu-item-${kind}`,
65
+ speciality: kind,
66
+ cardinality: "one-or-many"
67
+ })();
68
+ var dropDownMenuItemInjectionToken = (0, import_injectable3.getInjectionToken2)({
69
+ id: "drop-down-menu-item",
70
+ cardinality: "zero-or-many"
71
+ })(dropDownMenuItemTokenFor);
72
+ var getDropDownMenuItemInjectableBunch = (params) => (0, import_injectable3.getInjectableBunch)({
73
+ dropDownMenuItem: (0, import_injectable3.getInjectable2)({
74
+ id: params.id,
75
+ instantiate: () => () => ({
76
+ id: params.id,
77
+ orderNumber: params.orderNumber,
78
+ isVisible: params.isVisible,
79
+ Component: params.Component
80
+ }),
81
+ injectionToken: dropDownMenuItemInjectionToken.for(params.kind)
82
+ })
83
+ });
84
+
85
+ // src/drop-down-menu-spec.ts
86
+ function dropDownMenu(kind, options) {
87
+ return { kind, ...options };
88
+ }
89
+
90
+ // src/drop-down-menu-container-component.ts
91
+ var import_injectable4 = require("@k8slens/injectable");
92
+ var import_injectable_react = require("@k8slens/injectable-react");
93
+ var DefaultDropDownMenuContainer = (0, import_injectable_react.getInjectionTokenComponent2)({
94
+ id: "default-drop-down-menu-container"
95
+ })();
96
+ var dropDownMenuContainerComponentTokenFor = (kind) => (0, import_injectable4.getInjectionToken2)({
97
+ id: `drop-down-menu-container-component-${kind}`,
98
+ speciality: kind,
99
+ cardinality: "zero-or-one"
100
+ })();
101
+ var dropDownMenuContainerComponentInjectionToken = (0, import_injectable4.getInjectionToken2)({
102
+ id: "drop-down-menu-container-component",
103
+ cardinality: "zero-or-one"
104
+ })(dropDownMenuContainerComponentTokenFor);
105
+
106
+ // src/drop-down-menu-component.ts
107
+ var import_injectable_react2 = require("@k8slens/injectable-react");
108
+ var DropDownMenu = (0, import_injectable_react2.getInjectionTokenComponent2)({
109
+ id: "drop-down-menu"
110
+ })();
111
+
112
+ // src/close-drop-down-menu.ts
113
+ var import_injectable5 = require("@k8slens/injectable");
114
+ var closeDropDownMenuInjectionToken = (0, import_injectable5.getInjectionToken2)({
115
+ id: "close-drop-down-menu",
116
+ cardinality: "one"
117
+ })();
118
+ var closeAllDropDownMenusInjectionToken = (0, import_injectable5.getInjectionToken2)({
119
+ id: "close-all-drop-down-menus",
120
+ cardinality: "one"
121
+ })();
122
+
123
+ // src/close-drop-down-menu-context.ts
124
+ var import_public_utilities = require("@k8slens/public-utilities");
125
+ var import_react = require("react");
126
+ var contextForClosingDropDownMenu = (0, import_react.createContext)(void 0);
127
+ var useCloseDropDownMenu = () => (0, import_public_utilities.expectDefined)((0, import_react.useContext)(contextForClosingDropDownMenu), "Tried to close a drop-down menu while not inside one.");
128
+
129
+ // src/menu-item-activated-context.ts
130
+ var import_react2 = require("react");
131
+ var menuItemActivatedContext = (0, import_react2.createContext)(void 0);
132
+ // Annotate the CommonJS export names for ESM import in node:
133
+ 0 && (module.exports = {
134
+ DefaultDropDownMenuContainer,
135
+ DropDownMenu,
136
+ closeAllDropDownMenusInjectionToken,
137
+ closeDropDownMenuInjectionToken,
138
+ contextForClosingDropDownMenu,
139
+ dropDownMenu,
140
+ dropDownMenuContainerComponentInjectionToken,
141
+ dropDownMenuItemInjectionToken,
142
+ dropDownMenuKindInjectionToken,
143
+ getDropDownMenuItemInjectableBunch,
144
+ getDropDownMenuKind,
145
+ getDropDownMenuKindInjectableBunch,
146
+ menuItemActivatedContext,
147
+ useCloseDropDownMenu
148
+ });
149
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiLCAiLi4vc3JjL2Ryb3AtZG93bi1tZW51LWtpbmQudHMiLCAiLi4vc3JjL2Ryb3AtZG93bi1tZW51LWtpbmQtaW5qZWN0aW9uLXRva2VuLnRzIiwgIi4uL3NyYy9kcm9wLWRvd24tbWVudS1pdGVtLnRzIiwgIi4uL3NyYy9kcm9wLWRvd24tbWVudS1zcGVjLnRzIiwgIi4uL3NyYy9kcm9wLWRvd24tbWVudS1jb250YWluZXItY29tcG9uZW50LnRzIiwgIi4uL3NyYy9kcm9wLWRvd24tbWVudS1jb21wb25lbnQudHMiLCAiLi4vc3JjL2Nsb3NlLWRyb3AtZG93bi1tZW51LnRzIiwgIi4uL3NyYy9jbG9zZS1kcm9wLWRvd24tbWVudS1jb250ZXh0LnRzIiwgIi4uL3NyYy9tZW51LWl0ZW0tYWN0aXZhdGVkLWNvbnRleHQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGdldERyb3BEb3duTWVudUtpbmQgfSBmcm9tIFwiLi9zcmMvZHJvcC1kb3duLW1lbnUta2luZFwiO1xuZXhwb3J0IHtcbiAgdHlwZSBEcm9wRG93bk1lbnVLaW5kRGVjbGFyYXRpb24sXG4gIHR5cGUgRHJvcERvd25NZW51S2luZERlY2xhcmF0aW9uRmFjdG9yeSxcbiAgdHlwZSBEcm9wRG93bk1lbnVLaW5kSW5qZWN0YWJsZVBhcmFtcyxcbiAgZHJvcERvd25NZW51S2luZEluamVjdGlvblRva2VuLFxuICBnZXREcm9wRG93bk1lbnVLaW5kSW5qZWN0YWJsZUJ1bmNoLFxufSBmcm9tIFwiLi9zcmMvZHJvcC1kb3duLW1lbnUta2luZC1pbmplY3Rpb24tdG9rZW5cIjtcbmV4cG9ydCB0eXBlIHsgRHJvcERvd25NZW51RGF0YSwgRHJvcERvd25NZW51S2luZCB9IGZyb20gXCIuL3NyYy9kcm9wLWRvd24tbWVudS1raW5kXCI7XG5leHBvcnQge1xuICBkcm9wRG93bk1lbnVJdGVtSW5qZWN0aW9uVG9rZW4sXG4gIGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2gsXG59IGZyb20gXCIuL3NyYy9kcm9wLWRvd24tbWVudS1pdGVtXCI7XG5leHBvcnQgdHlwZSB7XG4gIERyb3BEb3duTWVudUl0ZW0sXG4gIERyb3BEb3duTWVudUl0ZW1CdW5jaFBhcmFtcyxcbiAgRHJvcERvd25NZW51SXRlbUZhY3RvcnksXG4gIERyb3BEb3duTWVudUl0ZW1Ub2tlbkZvcixcbn0gZnJvbSBcIi4vc3JjL2Ryb3AtZG93bi1tZW51LWl0ZW1cIjtcbmV4cG9ydCB7IGRyb3BEb3duTWVudSB9IGZyb20gXCIuL3NyYy9kcm9wLWRvd24tbWVudS1zcGVjXCI7XG5leHBvcnQgdHlwZSB7XG4gIERyb3BEb3duTWVudUdhcCxcbiAgRHJvcERvd25NZW51T3Blbk9uLFxuICBEcm9wRG93bk1lbnVPcHRpb25zLFxuICBEcm9wRG93bk1lbnVQb3NpdGlvbixcbiAgRHJvcERvd25NZW51U3BlYyxcbn0gZnJvbSBcIi4vc3JjL2Ryb3AtZG93bi1tZW51LXNwZWNcIjtcbmV4cG9ydCB7XG4gIERlZmF1bHREcm9wRG93bk1lbnVDb250YWluZXIsXG4gIGRyb3BEb3duTWVudUNvbnRhaW5lckNvbXBvbmVudEluamVjdGlvblRva2VuLFxufSBmcm9tIFwiLi9zcmMvZHJvcC1kb3duLW1lbnUtY29udGFpbmVyLWNvbXBvbmVudFwiO1xuZXhwb3J0IHR5cGUge1xuICBEcm9wRG93bk1lbnVDb250YWluZXJDb21wb25lbnQsXG4gIERyb3BEb3duTWVudUNvbnRhaW5lclByb3BzLFxuICBEcm9wRG93bk1lbnVDb250YWluZXJUb2tlbkZvcixcbn0gZnJvbSBcIi4vc3JjL2Ryb3AtZG93bi1tZW51LWNvbnRhaW5lci1jb21wb25lbnRcIjtcbmV4cG9ydCB7IERyb3BEb3duTWVudSB9IGZyb20gXCIuL3NyYy9kcm9wLWRvd24tbWVudS1jb21wb25lbnRcIjtcbmV4cG9ydCB0eXBlIHsgRHJvcERvd25NZW51UHJvcHMgfSBmcm9tIFwiLi9zcmMvZHJvcC1kb3duLW1lbnUtY29tcG9uZW50XCI7XG5leHBvcnQge1xuICBjbG9zZUFsbERyb3BEb3duTWVudXNJbmplY3Rpb25Ub2tlbixcbiAgY2xvc2VEcm9wRG93bk1lbnVJbmplY3Rpb25Ub2tlbixcbn0gZnJvbSBcIi4vc3JjL2Nsb3NlLWRyb3AtZG93bi1tZW51XCI7XG5leHBvcnQgdHlwZSB7IENsb3NlQWxsRHJvcERvd25NZW51cywgQ2xvc2VEcm9wRG93bk1lbnUgfSBmcm9tIFwiLi9zcmMvY2xvc2UtZHJvcC1kb3duLW1lbnVcIjtcbmV4cG9ydCB7IGNvbnRleHRGb3JDbG9zaW5nRHJvcERvd25NZW51LCB1c2VDbG9zZURyb3BEb3duTWVudSB9IGZyb20gXCIuL3NyYy9jbG9zZS1kcm9wLWRvd24tbWVudS1jb250ZXh0XCI7XG5cbi8qKlxuICogVGhlIGF1dGhvcmluZyBtb2RlbCBvZiB0aGUgY29udGV4dCBtZW51IGFuZCB0aGUgYW5jaG9yZWQgbWVudSwgd2hpY2ggZHJhdyB0aGVpciBvd24gcm93cy5cbiAqIERyb3AtZG93biBtZW51cyBwcm9wZXIgaGF2ZSBubyBzdWNoIG1vZGVsIFx1MjAxNCB0aGVpciBpdGVtcyBhcmUgYXJiaXRyYXJ5IGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQWN0aW9uTWVudUl0ZW0sXG4gIENvbXBvbmVudExhYmVsYWJsZSxcbiAgQ29tcG9uZW50TWVudUl0ZW0sXG4gIEdyb3VwT2ZNZW51SXRlbXMsXG4gIExhYmVsUHJvcHNGb3IsXG4gIE1lbnVJdGVtLFxuICBSZWFjdExhYmVsYWJsZSxcbiAgU3ViTWVudUl0ZW0sXG4gIFRleHRMYWJlbGFibGUsXG59IGZyb20gXCIuL3NyYy9jb250ZXh0LW1lbnUtaXRlbXNcIjtcbmV4cG9ydCB7IG1lbnVJdGVtQWN0aXZhdGVkQ29udGV4dCB9IGZyb20gXCIuL3NyYy9tZW51LWl0ZW0tYWN0aXZhdGVkLWNvbnRleHRcIjtcbiIsICJpbXBvcnQgeyBnZXRUeXBlZFNwZWNpZmllciwgdHlwZSBUeXBlZFNwZWNpZmllciwgdHlwZSBUeXBlZFNwZWNpZmllclR5cGUgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuXG4vKipcbiAqIElkZW50aWZpZXMgb25lIGZhbWlseSBvZiBkcm9wLWRvd24gbWVudSBpdGVtcy4gSXRlbXMgYXJlIGNvbnRyaWJ1dGVkIGFnYWluc3RcbiAqIGEga2luZCB2aWEgYGRyb3BEb3duTWVudUl0ZW1JbmplY3Rpb25Ub2tlbi5mb3Ioa2luZClgLCBhbmQgYSBob3N0IGVsZW1lbnRcbiAqIG9wZW5zIHRoZSBtZW51IG9mIGEga2luZCB3aXRoIGAkZHJvcERvd25NZW51PXtkcm9wRG93bk1lbnUoa2luZCl9YC5cbiAqXG4gKiBgVERhdGFgIGlzIHRoZSBkYXRhIHRoZSBob3N0IGVsZW1lbnQgc3VwcGxpZXMgd2hlbiBvcGVuaW5nIHRoZSBtZW51OyBpdGVtXG4gKiBmYWN0b3JpZXMgb2YgdGhlIGtpbmQgcmVjZWl2ZSBpdC4gQSBraW5kIGNyZWF0ZWQgd2l0aG91dCBgVERhdGFgIG5lZWRzIG5vXG4gKiBkYXRhLlxuICpcbiAqIEF0IHJ1bnRpbWUgYSBraW5kIGlzIGEgYnJhbmRlZCBzdHJpbmcsIHNvIGl0IGlzIHVzYWJsZSBhcyBhIGAuZm9yKClgIGtleS5cbiAqL1xuZXhwb3J0IHR5cGUgRHJvcERvd25NZW51S2luZDxURGF0YSA9IHZvaWQ+ID0gVHlwZWRTcGVjaWZpZXI8c3RyaW5nLCB7IGRyb3BEb3duTWVudURhdGE6IFREYXRhIH0+O1xuXG4vKipcbiAqIFJlY292ZXJzIHRoZSBkYXRhIHR5cGUgYm91bmQgdG8gYSB7QGxpbmsgRHJvcERvd25NZW51S2luZH0uXG4gKi9cbmV4cG9ydCB0eXBlIERyb3BEb3duTWVudURhdGE8SyBleHRlbmRzIERyb3BEb3duTWVudUtpbmQ8YW55Pj4gPSBUeXBlZFNwZWNpZmllclR5cGU8XCJkcm9wRG93bk1lbnVEYXRhXCIsIEs+O1xuXG4vKipcbiAqIEN1cnJpZWQgY3JlYXRvciBmb3IgYSB7QGxpbmsgRHJvcERvd25NZW51S2luZH0uIFRoZSBmaXJzdCBjYWxsIGJpbmRzIHRoZSBkYXRhXG4gKiB0eXBlOyB0aGUgc2Vjb25kIHRoZSBnbG9iYWxseSB1bmlxdWUgc3BlY2lmaWVyIHN0cmluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEEgbWVudSB3aG9zZSBpdGVtcyBuZWVkIG5vIGRhdGE6XG4gKiBleHBvcnQgY29uc3QgYWlUb29sc01lbnVLaW5kID0gZ2V0RHJvcERvd25NZW51S2luZCgpKFwiYWktdG9vbHMtbWVudVwiKTtcbiAqXG4gKiAvLyBBIG1lbnUgd2hvc2UgaXRlbXMgZGVyaXZlIGZyb20gdGhlIGhvc3QgZWxlbWVudCdzIGRhdGE6XG4gKiBleHBvcnQgY29uc3QgcG9kQWN0aW9uc01lbnVLaW5kID0gZ2V0RHJvcERvd25NZW51S2luZDx7IHBvZE5hbWU6IHN0cmluZyB9PigpKFwicG9kLWFjdGlvbnMtbWVudVwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgZ2V0RHJvcERvd25NZW51S2luZCA9XG4gIDxURGF0YSA9IHZvaWQ+KCkgPT5cbiAgPFMgZXh0ZW5kcyBzdHJpbmc+KHNwZWNpZmllcjogUykgPT5cbiAgICBnZXRUeXBlZFNwZWNpZmllcjx7IGRyb3BEb3duTWVudURhdGE6IFREYXRhIH0+KCkoc3BlY2lmaWVyKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3RhYmxlMiwgZ2V0SW5qZWN0YWJsZUJ1bmNoLCBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBEcm9wRG93bk1lbnVLaW5kIH0gZnJvbSBcIi4vZHJvcC1kb3duLW1lbnUta2luZFwiO1xuXG4vKipcbiAqIE9uZSBkcm9wLWRvd24gbWVudSB0aGF0IGV4aXN0cywgYW5ub3VuY2VkIHNvIGl0IGNhbiBiZSBkaXNjb3ZlcmVkIHJhdGhlclxuICogdGhhbiBmb3VuZCBieSByZWFkaW5nIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcERvd25NZW51S2luZERlY2xhcmF0aW9uIHtcbiAgLyoqIFRoZSBraW5kIGl0c2VsZiwgYXMgYGRyb3BEb3duTWVudUl0ZW1JbmplY3Rpb25Ub2tlbi5mb3Ioa2luZClgIHRha2VzIGl0LiAqL1xuICByZWFkb25seSBraW5kOiBEcm9wRG93bk1lbnVLaW5kPGFueT47XG4gIC8qKiBPbmUgbGluZSBvbiB3aGF0IHRoZSBtZW51IGlzLCBmb3IgYSByZWFkZXIgZGVjaWRpbmcgd2hldGhlciB0byBjb250cmlidXRlLiAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG4vKiogUHJvZHVjZXMgb25lIGRlY2xhcmF0aW9uLCBwb3NzaWJseSBsYXRlci4gKi9cbmV4cG9ydCB0eXBlIERyb3BEb3duTWVudUtpbmREZWNsYXJhdGlvbkZhY3RvcnkgPSAoKSA9PiBEcm9wRG93bk1lbnVLaW5kRGVjbGFyYXRpb247XG5cbi8qKlxuICogRXZlcnkgZHJvcC1kb3duIG1lbnUga2luZCB0aGUgcnVubmluZyBidWlsZCBrbm93cyBhYm91dC5cbiAqXG4gKiBJbmplY3RpbmcgbWFueSBvZiB0aGVzZSBpcyBob3cgYSBzdXJmYWNlIGVudW1lcmF0ZXMgdGhlIG1lbnVzIHRoYXQgZXhpc3QgXHUyMDE0XG4gKiB0aGUgZXh0ZW5zaW9uLWRldmVsb3BtZW50IGluc3RydWN0aW9ucyByZW5kZXIgdGhlaXIgbGlzdCBmcm9tIGl0LCBzbyBhIG5ld1xuICogbWVudSBiZWNvbWVzIGRvY3VtZW50ZWQgYnkgcmVnaXN0ZXJpbmcgaGVyZSByYXRoZXIgdGhhbiBieSBzb21lb25lXG4gKiByZW1lbWJlcmluZyB0byBlZGl0IHByb3NlLlxuICovXG5leHBvcnQgY29uc3QgZHJvcERvd25NZW51S2luZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogRHJvcERvd25NZW51S2luZERlY2xhcmF0aW9uRmFjdG9yeTtcbn0+KHtcbiAgaWQ6IFwiZHJvcC1kb3duLW1lbnUta2luZFwiLFxuICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbn0pKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcERvd25NZW51S2luZEluamVjdGFibGVQYXJhbXMge1xuICAvKiogVW5pcXVlIGlkIGZvciB0aGUgcmVnaXN0ZXJlZCBpbmplY3RhYmxlLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogVGhlIGtpbmQgYmVpbmcgYW5ub3VuY2VkLiAqL1xuICByZWFkb25seSBraW5kOiBEcm9wRG93bk1lbnVLaW5kPGFueT47XG4gIC8qKiBPbmUgbGluZSBvbiB3aGF0IHRoZSBtZW51IGlzLiAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFubm91bmNlIGEgZHJvcC1kb3duIG1lbnUga2luZCwgc28gYW55dGhpbmcgZW51bWVyYXRpbmcgdGhlIG1lbnVzIGZpbmRzIGl0LlxuICpcbiAqIFJlZ2lzdGVyIHRoaXMgd2hlcmV2ZXIgdGhlIG1lbnUncyBvd24gc3VyZmFjZSBpcyByZWdpc3RlcmVkIFx1MjAxNCBhIGNvbnRyYWN0c1xuICogcGFja2FnZSBleHBvcnRzIHRoZSBraW5kLCBidXQgbm90IHRoZSByZWdpc3RyYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBleHBvcnQgZGVmYXVsdCBnZXREcm9wRG93bk1lbnVLaW5kSW5qZWN0YWJsZUJ1bmNoKHtcbiAqICAgaWQ6IFwiYWktdG9vbC10b3AtYmFyLW1lbnUta2luZFwiLFxuICogICBraW5kOiBhaVRvb2xUb3BCYXJNZW51S2luZCxcbiAqICAgZGVzY3JpcHRpb246IFwiVGhlIG1lbnUgb2YgdGhlIEFJIHRvb2wgYnV0dG9uIGluIHRoZSB0b3AgYmFyLlwiLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERyb3BEb3duTWVudUtpbmRJbmplY3RhYmxlQnVuY2ggPSAocGFyYW1zOiBEcm9wRG93bk1lbnVLaW5kSW5qZWN0YWJsZVBhcmFtcykgPT5cbiAgZ2V0SW5qZWN0YWJsZUJ1bmNoKHtcbiAgICBkcm9wRG93bk1lbnVLaW5kOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogcGFyYW1zLmlkLFxuXG4gICAgICBpbnN0YW50aWF0ZTogKCkgPT4gKCk6IERyb3BEb3duTWVudUtpbmREZWNsYXJhdGlvbiA9PiAoe1xuICAgICAgICBraW5kOiBwYXJhbXMua2luZCxcbiAgICAgICAgZGVzY3JpcHRpb246IHBhcmFtcy5kZXNjcmlwdGlvbixcbiAgICAgIH0pLFxuXG4gICAgICBpbmplY3Rpb25Ub2tlbjogZHJvcERvd25NZW51S2luZEluamVjdGlvblRva2VuLFxuICAgIH0pLFxuICB9KTtcbiIsICJpbXBvcnQge1xuICBnZXRJbmplY3RhYmxlMixcbiAgZ2V0SW5qZWN0YWJsZUJ1bmNoLFxuICBnZXRJbmplY3Rpb25Ub2tlbjIsXG4gIHR5cGUgTWFueUZhY3RvcnksXG4gIHR5cGUgTm9uRW1wdHlNYW55RmFjdG9yeSxcbiAgdHlwZSBTcGVjaWZpY0luamVjdGlvblRva2VuMixcbn0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgSWRlbnRpZmlhYmxlLFxuICBNYXliZUNvbXB1dGVkLFxuICBNYXliZUNvbXB1dGVkU2hvd2FibGUsXG4gIE9yZGVyYWJsZSxcbn0gZnJvbSBcIkBrOHNsZW5zL2NvbXBvc2FibGUtcmVzcG9uc2liaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBNYXliZVByb21pc2UgfSBmcm9tIFwiQGs4c2xlbnMvcHVibGljLXV0aWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IERyb3BEb3duTWVudURhdGEsIERyb3BEb3duTWVudUtpbmQgfSBmcm9tIFwiLi9kcm9wLWRvd24tbWVudS1raW5kXCI7XG5cbi8qKlxuICogT25lIGl0ZW0gb2YgYSBkcm9wLWRvd24gbWVudTogYSBjb21wb25lbnQsIHdoZXJlIGl0IHNpdHMgYW1vbmcgdGhlIG90aGVycywgYW5kIHdoZXRoZXIgaXQgaXNcbiAqIHNob3duIGF0IGFsbC4gV2hhdCB0aGUgaXRlbSBsb29rcyBsaWtlIGFuZCB3aGF0IGl0IGRvZXMgYXJlIGl0cyBvd24gYnVzaW5lc3MgXHUyMDE0IGEgbWVudSBuZWl0aGVyXG4gKiBkcmF3cyBpdCBub3IgZGVjaWRlcyBhbnl0aGluZyBhYm91dCBpdC5cbiAqXG4gKiBUaGUgY29tcG9uZW50IGlzIGdpdmVuIHRoZSBkYXRhIHRoZSBob3N0IGVsZW1lbnQgb3BlbmVkIHRoZSBtZW51IHdpdGgsIGFuZCBtdXN0IGJlIGRlZmluZWQgYXRcbiAqIG1vZHVsZSBzY29wZTsgY2FwdHVyaW5nIGRhdGEgaW4gYSBjbG9zdXJlIHdvdWxkIGNyZWF0ZSBhIG5ldyBjb21wb25lbnQgcmVmZXJlbmNlIG9uIGV2ZXJ5XG4gKiBpbnZvY2F0aW9uIGFuZCBicmVhayBSZWFjdCByZWNvbmNpbGlhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcm9wRG93bk1lbnVJdGVtPFREYXRhID0gdm9pZD4gZXh0ZW5kcyBJZGVudGlmaWFibGUsIE9yZGVyYWJsZSwgTWF5YmVDb21wdXRlZFNob3dhYmxlIHtcbiAgcmVhZG9ubHkgQ29tcG9uZW50OiBSZWFjdC5Db21wb25lbnRUeXBlPHsgcmVhZG9ubHkgZGF0YTogVERhdGEgfT47XG59XG5cbi8qKiBQcm9kdWNlcyBvbmUgaXRlbSwgcG9zc2libHkgbGF0ZXIuICovXG5leHBvcnQgdHlwZSBEcm9wRG93bk1lbnVJdGVtRmFjdG9yeTxURGF0YSA9IGFueT4gPSAoKSA9PiBNYXliZVByb21pc2U8RHJvcERvd25NZW51SXRlbTxURGF0YT4+O1xuXG4vKipcbiAqIFRoZSBzcGVjaWZpYyB0b2tlbiBgLmZvcihraW5kKWAgeWllbGRzOiB0aGUgaXRlbXMgY29udHJpYnV0ZWQgdG8gb25lIG1lbnUga2luZC4gQXQgbGVhc3Qgb25lIG9mXG4gKiB0aGVtLCBzbyB0aGF0IGEga2luZCBub2JvZHkgY29udHJpYnV0ZXMgdG8gaXMgYSBjb21wb3NpdGlvbiBlcnJvciByYXRoZXIgdGhhbiBhIG1lbnUgdGhhdCBuZXZlclxuICogb3BlbnMuXG4gKi9cbmV4cG9ydCB0eXBlIERyb3BEb3duTWVudUl0ZW1Ub2tlbkZvcjxURGF0YT4gPSBTcGVjaWZpY0luamVjdGlvblRva2VuMjx7XG4gIHNpbmdsZUZhY3Rvcnk6IERyb3BEb3duTWVudUl0ZW1GYWN0b3J5PFREYXRhPjtcbiAgbWFueUZhY3Rvcnk6IE5vbkVtcHR5TWFueUZhY3Rvcnk8RHJvcERvd25NZW51SXRlbUZhY3Rvcnk8VERhdGE+PjtcbiAgc3BlY2lmaWNUb2tlbkZhY3Rvcnk6IHVuZGVmaW5lZDtcbiAgY2FyZGluYWxpdHk6IFwib25lLW9yLW1hbnlcIjtcbn0+O1xuXG4vKipcbiAqIFRoZSBgLmZvcigpYCBmYWN0b3J5LCBhbm5vdGF0ZWQgc28gYSBraW5kJ3Mgb3duIGRhdGEgdHlwZSBzdXJ2aXZlcyBpbnRvIHRoZSBzcGVjaWZpYyB0b2tlbi4gVGhlXG4gKiBhbm5vdGF0aW9uIGNhcnJpZXMgd2hhdCB0aGUgcmV0aXJlZCB0aGlyZCB0eXBlIHBhcmFtZXRlciB1c2VkIHRvOiBpbmZlcmVuY2UgZnJvbSB0aGUgdmFsdWUgYWxvbmVcbiAqIGNhbm5vdCByZWNvbnN0cnVjdCBhIHJldHVybiB0eXBlIHRoYXQgbWVudGlvbnMgdGhlIHNwZWNpZmllcidzIG93biB0eXBlIHBhcmFtZXRlci5cbiAqL1xuY29uc3QgZHJvcERvd25NZW51SXRlbVRva2VuRm9yID0gPEsgZXh0ZW5kcyBEcm9wRG93bk1lbnVLaW5kPGFueT4+KFxuICBraW5kOiBLLFxuKTogRHJvcERvd25NZW51SXRlbVRva2VuRm9yPERyb3BEb3duTWVudURhdGE8Sz4+ID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7XG4gICAgc2luZ2xlRmFjdG9yeTogRHJvcERvd25NZW51SXRlbUZhY3Rvcnk8RHJvcERvd25NZW51RGF0YTxLPj47XG4gICAgbWFueUZhY3Rvcnk6IE5vbkVtcHR5TWFueUZhY3Rvcnk8RHJvcERvd25NZW51SXRlbUZhY3Rvcnk8RHJvcERvd25NZW51RGF0YTxLPj4+O1xuICB9Pih7XG4gICAgaWQ6IGBkcm9wLWRvd24tbWVudS1pdGVtLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwib25lLW9yLW1hbnlcIixcbiAgfSkoKTtcblxuLyoqXG4gKiBUaGUgY29udHJpYnV0aW9uIHN1cmZhY2Ugb2YgZHJvcC1kb3duIG1lbnVzOiBvbmUgaXRlbSBwZXIgY29udHJpYnV0aW9uLCByZWdpc3RlcmVkIGFnYWluc3QgYVxuICoge0BsaW5rIERyb3BEb3duTWVudUtpbmR9IHZpYSBgLmZvcihraW5kKWAuIFByZWZlciB7QGxpbmsgZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaH1cbiAqIG92ZXIgcmVnaXN0ZXJpbmcgYnkgaGFuZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRyb3BEb3duTWVudUl0ZW1JbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuMjx7XG4gIHNpbmdsZUZhY3Rvcnk6IERyb3BEb3duTWVudUl0ZW1GYWN0b3J5PGFueT47XG4gIG1hbnlGYWN0b3J5OiBNYW55RmFjdG9yeTxEcm9wRG93bk1lbnVJdGVtRmFjdG9yeTxhbnk+Pjtcbn0+KHtcbiAgaWQ6IFwiZHJvcC1kb3duLW1lbnUtaXRlbVwiLFxuICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbn0pKGRyb3BEb3duTWVudUl0ZW1Ub2tlbkZvcik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcERvd25NZW51SXRlbUJ1bmNoUGFyYW1zPEsgZXh0ZW5kcyBEcm9wRG93bk1lbnVLaW5kPGFueT4+IHtcbiAgLyoqIFVuaXF1ZSBpZCBmb3IgdGhlIHJlZ2lzdGVyZWQgaW5qZWN0YWJsZTsgZG91YmxlcyBhcyB0aGUgaXRlbSdzIGlkLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogVGhlIG1lbnUga2luZCB0aGUgaXRlbSBiZWxvbmdzIHRvLiAqL1xuICByZWFkb25seSBraW5kOiBLO1xuICAvKiogTG93ZXIgY29tZXMgZmlyc3QgYW1vbmcgdGhlIGtpbmQncyBpdGVtcy4gKi9cbiAgcmVhZG9ubHkgb3JkZXJOdW1iZXI6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2hvd24gYXQgYWxsOyB0aGUgbWVudSByZWFjdHMgdG8gdGhpcyB3aGlsZSBvcGVuLiAqL1xuICByZWFkb25seSBpc1Zpc2libGU/OiBNYXliZUNvbXB1dGVkPGJvb2xlYW4+O1xuICAvKiogUmVuZGVycyB0aGUgaXRlbS4gUmVjZWl2ZXMgdGhlIGRhdGEgdGhlIG1lbnUgd2FzIG9wZW5lZCB3aXRoLiAqL1xuICByZWFkb25seSBDb21wb25lbnQ6IFJlYWN0LkNvbXBvbmVudFR5cGU8eyByZWFkb25seSBkYXRhOiBEcm9wRG93bk1lbnVEYXRhPEs+IH0+O1xufVxuXG4vKipcbiAqIENvbnRyaWJ1dGUgb25lIGl0ZW0gdG8gYSBkcm9wLWRvd24gbWVudSBraW5kLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IFJlc3RhcnRQb2QgPSAoeyBkYXRhIH06IHsgZGF0YTogeyBwb2ROYW1lOiBzdHJpbmcgfSB9KSA9PiAoXG4gKiAgIDxDbGlja2FibGVMaSAkb25DbGljaz17KCkgPT4gcmVzdGFydChkYXRhLnBvZE5hbWUpfT5SZXN0YXJ0IHtkYXRhLnBvZE5hbWV9PC9DbGlja2FibGVMaT5cbiAqICk7XG4gKlxuICogZXhwb3J0IGNvbnN0IHJlc3RhcnRQb2RCdW5jaCA9IGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2goe1xuICogICBpZDogXCJyZXN0YXJ0LXBvZFwiLFxuICogICBraW5kOiBwb2RBY3Rpb25zTWVudUtpbmQsXG4gKiAgIG9yZGVyTnVtYmVyOiAxMCxcbiAqICAgaXNWaXNpYmxlOiBjb21wdXRlZCgoKSA9PiBjYW5SZXN0YXJ0LmdldCgpKSxcbiAqICAgQ29tcG9uZW50OiBSZXN0YXJ0UG9kLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2ggPSA8SyBleHRlbmRzIERyb3BEb3duTWVudUtpbmQ8YW55Pj4oXG4gIHBhcmFtczogRHJvcERvd25NZW51SXRlbUJ1bmNoUGFyYW1zPEs+LFxuKSA9PlxuICBnZXRJbmplY3RhYmxlQnVuY2goe1xuICAgIGRyb3BEb3duTWVudUl0ZW06IGdldEluamVjdGFibGUyKHtcbiAgICAgIGlkOiBwYXJhbXMuaWQsXG5cbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKTogRHJvcERvd25NZW51SXRlbTxEcm9wRG93bk1lbnVEYXRhPEs+PiA9PiAoe1xuICAgICAgICBpZDogcGFyYW1zLmlkLFxuICAgICAgICBvcmRlck51bWJlcjogcGFyYW1zLm9yZGVyTnVtYmVyLFxuICAgICAgICBpc1Zpc2libGU6IHBhcmFtcy5pc1Zpc2libGUsXG4gICAgICAgIENvbXBvbmVudDogcGFyYW1zLkNvbXBvbmVudCxcbiAgICAgIH0pLFxuXG4gICAgICBpbmplY3Rpb25Ub2tlbjogZHJvcERvd25NZW51SXRlbUluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgfSksXG4gIH0pO1xuIiwgImltcG9ydCB0eXBlIHsgRHJvcERvd25NZW51RGF0YSwgRHJvcERvd25NZW51S2luZCB9IGZyb20gXCIuL2Ryb3AtZG93bi1tZW51LWtpbmRcIjtcblxuLyoqXG4gKiBIb3cgdGhlIG1lbnUgb3BlbnMgZnJvbSBpdHMgaG9zdCBlbGVtZW50LlxuICpcbiAqIC0gYFwiY2xpY2tcImAgKHRoZSBkZWZhdWx0KTogY2xpY2tpbmcgdGhlIGVsZW1lbnQgdG9nZ2xlcyB0aGUgbWVudS5cbiAqIC0gYFwiaG92ZXJcImA6IHRoZSBtZW51IG9wZW5zIHdoaWxlIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhlIGVsZW1lbnQgb3IgdGhlIG1lbnUuXG4gKiAtIGBcInJpZ2h0LWNsaWNrXCJgOiByaWdodC1jbGlja2luZyB0aGUgZWxlbWVudCB0b2dnbGVzIHRoZSBtZW51LiBUaGUgbWVudSBzdGF5cyBhbmNob3JlZCB0byB0aGVcbiAqICAgZWxlbWVudDsgY3Vyc29yLWFuY2hvcmVkIHJpZ2h0LWNsaWNrIG1lbnVzIGFyZSB0aGUgY29uY2VybiBvZiBgQGxlbnNhcHAvY29udGV4dC1tZW51YC5cbiAqL1xuZXhwb3J0IHR5cGUgRHJvcERvd25NZW51T3Blbk9uID0gXCJjbGlja1wiIHwgXCJob3ZlclwiIHwgXCJyaWdodC1jbGlja1wiO1xuXG4vKipcbiAqIFdoZXJlIHRoZSBtZW51IHNpdHMgcmVsYXRpdmUgdG8gaXRzIGhvc3QgZWxlbWVudDogYSBzaWRlIG9mIHRoZSBob3N0LCBvcHRpb25hbGx5IHJlZmluZWQgd2l0aCBob3dcbiAqIHRoZSBtZW51IGV4dGVuZHMgYWxvbmcgdGhhdCBzaWRlLiBBIGJhcmUgc2lkZSBjZW50ZXJzIHRoZSBtZW51IG9uIGl0OyBgc3Bhbi08ZGlyZWN0aW9uPmAgYWxpZ25zXG4gKiB0aGVpciBlZGdlcyBhbmQgbGV0cyB0aGUgbWVudSBleHRlbmQgdG93YXJkIHRoYXQgZGlyZWN0aW9uLlxuICpcbiAqIERlZmF1bHRzIHRvIGBcImJvdHRvbSBzcGFuLXJpZ2h0XCJgLiBXaGVuIHRoZSBtZW51IHdvdWxkIG5vdCBmaXQgdGhlIHZpZXdwb3J0LCBpdCBmYWxscyBiYWNrIHRvIHRoZVxuICogbWlycm9yZWQgcG9zaXRpb25zLlxuICpcbiAqIE5vdGU6IGtlcHQgaWRlbnRpY2FsIHRvIGBBbmNob3JQb3NpdGlvbmAgb2YgYEBrOHNsZW5zL2VsZW1lbnQtY29tcG9uZW50c2AsIHdoaWNoIGNhbm5vdCBiZVxuICogaW1wb3J0ZWQgaGVyZSBcdTIwMTQgaXQgZGVwZW5kcyBvbiB0aGlzIHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIERyb3BEb3duTWVudVBvc2l0aW9uID1cbiAgfCBcInRvcFwiXG4gIHwgXCJib3R0b21cIlxuICB8IFwibGVmdFwiXG4gIHwgXCJyaWdodFwiXG4gIHwgXCJ0b3Agc3Bhbi1sZWZ0XCJcbiAgfCBcInRvcCBzcGFuLXJpZ2h0XCJcbiAgfCBcImJvdHRvbSBzcGFuLWxlZnRcIlxuICB8IFwiYm90dG9tIHNwYW4tcmlnaHRcIlxuICB8IFwibGVmdCBzcGFuLXRvcFwiXG4gIHwgXCJsZWZ0IHNwYW4tYm90dG9tXCJcbiAgfCBcInJpZ2h0IHNwYW4tdG9wXCJcbiAgfCBcInJpZ2h0IHNwYW4tYm90dG9tXCI7XG5cbi8qKlxuICogSG93IGZhciBmcm9tIGl0cyBob3N0IHRoZSBtZW51IHNpdHMsIG9uIHRoZSBzaGFyZWQgdC1zaGlydCBzY2FsZS4gRGVmYXVsdHMgdG8gYFwieHNcImAuXG4gKlxuICogTm90ZToga2VwdCBpZGVudGljYWwgdG8gYFRTaGlydFNpemVgIG9mIGBAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNgLCB3aGljaCBjYW5ub3QgYmUgaW1wb3J0ZWRcbiAqIGhlcmUgXHUyMDE0IGl0IGRlcGVuZHMgb24gdGhpcyBwYWNrYWdlLlxuICovXG5leHBvcnQgdHlwZSBEcm9wRG93bk1lbnVHYXAgPVxuICB8IFwiemVyb1wiXG4gIHwgXCI0eHNcIlxuICB8IFwiM3hzXCJcbiAgfCBcInh4c1wiXG4gIHwgXCJ4c1wiXG4gIHwgXCJzXCJcbiAgfCBcIm1cIlxuICB8IFwibFwiXG4gIHwgXCJ4bFwiXG4gIHwgXCJ4eGxcIlxuICB8IFwiM3hsXCJcbiAgfCBcIjR4bFwiXG4gIHwgXCI1eGxcIlxuICB8IFwiNnhsXCJcbiAgfCBcIjd4bFwiXG4gIHwgXCI4eGxcIlxuICB8IFwiOXhsXCJcbiAgfCBcIjEweGxcIlxuICB8IFwiMTF4bFwiO1xuXG4vKipcbiAqIFRoZSB2YWx1ZSBvZiB0aGUgYCRkcm9wRG93bk1lbnVgIGVsZW1lbnQgcHJvcDogd2hpY2ggbWVudSBraW5kIHRvIG9wZW4sIHRoZSBkYXRhIGl0cyBpdGVtXG4gKiBmYWN0b3JpZXMgcmVjZWl2ZSwgaG93IHRoZSBtZW51IG9wZW5zIGFuZCB3aGVyZSBpdCBzaXRzLiBDcmVhdGUgd2l0aCB7QGxpbmsgZHJvcERvd25NZW51fSBzbyB0aGVcbiAqIGRhdGEgaXMgdHlwZWQgYnkgdGhlIGtpbmQuXG4gKi9cbmV4cG9ydCB0eXBlIERyb3BEb3duTWVudVNwZWMgPSB7XG4gIHJlYWRvbmx5IGtpbmQ6IERyb3BEb3duTWVudUtpbmQ8YW55PjtcbiAgcmVhZG9ubHkgZGF0YT86IHVua25vd247XG4gIHJlYWRvbmx5IG9wZW5Pbj86IERyb3BEb3duTWVudU9wZW5PbjtcbiAgcmVhZG9ubHkgcG9zaXRpb24/OiBEcm9wRG93bk1lbnVQb3NpdGlvbjtcbiAgcmVhZG9ubHkgZ2FwPzogRHJvcERvd25NZW51R2FwO1xufTtcblxuZXhwb3J0IHR5cGUgRHJvcERvd25NZW51T3B0aW9ucyA9IHtcbiAgcmVhZG9ubHkgb3Blbk9uPzogRHJvcERvd25NZW51T3Blbk9uO1xuICByZWFkb25seSBwb3NpdGlvbj86IERyb3BEb3duTWVudVBvc2l0aW9uO1xuICByZWFkb25seSBnYXA/OiBEcm9wRG93bk1lbnVHYXA7XG59O1xuXG4vKipcbiAqIFR5cGVkIGNvbnN0cnVjdG9yIGZvciBhIHtAbGluayBEcm9wRG93bk1lbnVTcGVjfTogYSBraW5kIGNyZWF0ZWQgZm9yIGEgZGF0YSB0eXBlIG1ha2VzIGBkYXRhYFxuICogcmVxdWlyZWQgYW5kIHR5cGVkOyBhIGtpbmQgd2l0aG91dCBkYXRhIGZvcmJpZHMgaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogPEJ1dHRvbiAkZHJvcERvd25NZW51PXtkcm9wRG93bk1lbnUoYWlUb29sc01lbnVLaW5kKX0+T3BlbjwvQnV0dG9uPlxuICogPEJ1dHRvbiAkZHJvcERvd25NZW51PXtkcm9wRG93bk1lbnUocG9kQWN0aW9uc01lbnVLaW5kLCB7IGRhdGE6IHsgcG9kTmFtZSB9IH0pfT5Qb2Q8L0J1dHRvbj5cbiAqIDxCdXR0b24gJGRyb3BEb3duTWVudT17ZHJvcERvd25NZW51KHJvd0FjdGlvbnNNZW51S2luZCwgeyBwb3NpdGlvbjogXCJib3R0b20gc3Bhbi1sZWZ0XCIgfSl9Plx1MjJFRTwvQnV0dG9uPlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcm9wRG93bk1lbnU8SyBleHRlbmRzIERyb3BEb3duTWVudUtpbmQ8dm9pZD4+KFxuICBraW5kOiBLLFxuICBvcHRpb25zPzogRHJvcERvd25NZW51T3B0aW9ucyxcbik6IERyb3BEb3duTWVudVNwZWM7XG5leHBvcnQgZnVuY3Rpb24gZHJvcERvd25NZW51PEsgZXh0ZW5kcyBEcm9wRG93bk1lbnVLaW5kPGFueT4+KFxuICBraW5kOiBLLFxuICBvcHRpb25zOiBEcm9wRG93bk1lbnVPcHRpb25zICYgeyByZWFkb25seSBkYXRhOiBEcm9wRG93bk1lbnVEYXRhPEs+IH0sXG4pOiBEcm9wRG93bk1lbnVTcGVjO1xuZXhwb3J0IGZ1bmN0aW9uIGRyb3BEb3duTWVudShcbiAga2luZDogRHJvcERvd25NZW51S2luZDxhbnk+LFxuICBvcHRpb25zPzogRHJvcERvd25NZW51T3B0aW9ucyAmIHsgcmVhZG9ubHkgZGF0YT86IHVua25vd24gfSxcbik6IERyb3BEb3duTWVudVNwZWMge1xuICByZXR1cm4geyBraW5kLCAuLi5vcHRpb25zIH07XG59XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yLCB0eXBlIE1heWJlUmVzdWx0RmFjdG9yeSwgdHlwZSBTcGVjaWZpY0luamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbkNvbXBvbmVudDIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZS1yZWFjdFwiO1xuaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IERyb3BEb3duTWVudURhdGEsIERyb3BEb3duTWVudUtpbmQgfSBmcm9tIFwiLi9kcm9wLWRvd24tbWVudS1raW5kXCI7XG5pbXBvcnQgdHlwZSB7IERyb3BEb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9kcm9wLWRvd24tbWVudS1pdGVtXCI7XG5cbi8qKlxuICogVGhlIHByb3BzIHRoZSBtZW51IGhhbmRzIGl0cyBjb250YWluZXIuIFRoZXkgcG9zaXRpb24gdGhlIGNvbnRhaW5lciwgcHV0IGl0IGFib3ZlIGV2ZXJ5dGhpbmdcbiAqIGVsc2UsIGFuZCBsZXQgYSBtZW51IG9wZW5lZCBieSBob3ZlcmluZyBrbm93IHRoZSBwb2ludGVyIGlzIG9uIGl0IFx1MjAxNCBzbyB0aGUgY29udGFpbmVyIG11c3Qgc3ByZWFkXG4gKiB0aGVtIG9udG8gd2hpY2hldmVyIGVsZW1lbnQgaXQgcmVuZGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgRHJvcERvd25NZW51Q29udGFpbmVyUHJvcHM8VERhdGEgPSB2b2lkPiA9IHtcbiAgcmVhZG9ubHkgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcblxuICAvKipcbiAgICogVGhlIGl0ZW1zIG9mIHRoZSBtZW51LCBhcyBpdHMga2luZCBkZWNsYXJlcyB0aGVtLCBmb3IgYSBjb250YWluZXIgdGhhdCBsYXlzIHRoZW0gb3V0IGl0c2VsZlxuICAgKiByYXRoZXIgdGhhbiByZW5kZXJpbmcgd2hhdCB0aGUgbWVudSBnYXZlIGl0IGFzIGNoaWxkcmVuLlxuICAgKi9cbiAgcmVhZG9ubHkgaXRlbXM/OiByZWFkb25seSBEcm9wRG93bk1lbnVJdGVtPFREYXRhPltdO1xufSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgdHlwZSBEcm9wRG93bk1lbnVDb250YWluZXJDb21wb25lbnQ8VERhdGEgPSB2b2lkPiA9ICgpID0+IFJlYWN0LkNvbXBvbmVudFR5cGU8RHJvcERvd25NZW51Q29udGFpbmVyUHJvcHM8VERhdGE+PjtcblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGEgbWVudSByZW5kZXJzIGFzIHdoZW4gaXRzIGtpbmQgY29udHJpYnV0ZXMgbm9uZSBvZiBpdHMgb3duLiBJbXBsZW1lbnRlZCBieVxuICogYEBsZW5zYXBwL2Ryb3AtZG93bi1tZW51YDsgb3ZlcnJpZGUgaXQgdG8gY2hhbmdlIHdoYXQgZXZlcnkgbWVudSBpcyBtYWRlIG9mLlxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdERyb3BEb3duTWVudUNvbnRhaW5lciA9IGdldEluamVjdGlvblRva2VuQ29tcG9uZW50MjxcbiAgUmVhY3QuQ29tcG9uZW50VHlwZTxEcm9wRG93bk1lbnVDb250YWluZXJQcm9wcz5cbj4oe1xuICBpZDogXCJkZWZhdWx0LWRyb3AtZG93bi1tZW51LWNvbnRhaW5lclwiLFxufSkoKTtcblxuLyoqIFRoZSBzcGVjaWZpYyB0b2tlbiBgLmZvcihraW5kKWAgeWllbGRzOiBhdCBtb3N0IG9uZSBjb250YWluZXIgZm9yIGEgbWVudSBraW5kLCB0eXBlZCBieSBpdC4gKi9cbmV4cG9ydCB0eXBlIERyb3BEb3duTWVudUNvbnRhaW5lclRva2VuRm9yPFREYXRhPiA9IFNwZWNpZmljSW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogRHJvcERvd25NZW51Q29udGFpbmVyQ29tcG9uZW50PFREYXRhPjtcbiAgbWF5YmVGYWN0b3J5OiBNYXliZVJlc3VsdEZhY3Rvcnk8RHJvcERvd25NZW51Q29udGFpbmVyQ29tcG9uZW50PFREYXRhPj47XG4gIHNwZWNpZmljVG9rZW5GYWN0b3J5OiB1bmRlZmluZWQ7XG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3Itb25lXCI7XG59PjtcblxuLyoqXG4gKiBUaGUgYC5mb3IoKWAgZmFjdG9yeSwgYW5ub3RhdGVkIHNvIGEga2luZCdzIG93biBkYXRhIHR5cGUgc3Vydml2ZXMgaW50byB0aGUgc3BlY2lmaWMgdG9rZW4uIFRoZVxuICogYW5ub3RhdGlvbiBjYXJyaWVzIHdoYXQgdGhlIHJldGlyZWQgdGhpcmQgdHlwZSBwYXJhbWV0ZXIgdXNlZCB0bzogaW5mZXJlbmNlIGZyb20gdGhlIHZhbHVlIGFsb25lXG4gKiBjYW5ub3QgcmVjb25zdHJ1Y3QgYSByZXR1cm4gdHlwZSB0aGF0IG1lbnRpb25zIHRoZSBzcGVjaWZpZXIncyBvd24gdHlwZSBwYXJhbWV0ZXIuXG4gKi9cbmNvbnN0IGRyb3BEb3duTWVudUNvbnRhaW5lckNvbXBvbmVudFRva2VuRm9yID0gPEsgZXh0ZW5kcyBEcm9wRG93bk1lbnVLaW5kPGFueT4+KFxuICBraW5kOiBLLFxuKTogRHJvcERvd25NZW51Q29udGFpbmVyVG9rZW5Gb3I8RHJvcERvd25NZW51RGF0YTxLPj4gPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgICBzaW5nbGVGYWN0b3J5OiBEcm9wRG93bk1lbnVDb250YWluZXJDb21wb25lbnQ8RHJvcERvd25NZW51RGF0YTxLPj47XG4gICAgbWF5YmVGYWN0b3J5OiBNYXliZVJlc3VsdEZhY3Rvcnk8RHJvcERvd25NZW51Q29udGFpbmVyQ29tcG9uZW50PERyb3BEb3duTWVudURhdGE8Sz4+PjtcbiAgfT4oe1xuICAgIGlkOiBgZHJvcC1kb3duLW1lbnUtY29udGFpbmVyLWNvbXBvbmVudC0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcInplcm8tb3Itb25lXCIsXG4gIH0pKCk7XG5cbi8qKlxuICogVGhlIGVsZW1lbnQgYSBtZW51IG9mIHNvbWUga2luZCByZW5kZXJzIGFzLiBXaXRob3V0IG9uZSwgYSBtZW51IGlzIGEgbGlzdCBcdTIwMTQgd2hpY2ggaXMgd2hhdCBhIG1lbnVcbiAqIG9mIG9yZGluYXJ5IGl0ZW1zIHNob3VsZCBiZS4gQ29udHJpYnV0ZSBvbmUgd2hlbiB0aGUgaXRlbXMgYXJlIG5vdCBhIGxpc3Q6IGEgZ3JpZCBvZiBpY29ucywgc2F5LFxuICogb3IgYSBwYW5lbCB0aGF0IGhhcHBlbnMgdG8gb3BlbiBsaWtlIGEgbWVudS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiAvLyBJdGVtcyB0eXBlZCBieSB0aGUga2luZCwgZm9yIGEgY29udGFpbmVyIHRoYXQgbGF5cyB0aGVtIG91dCBpdHNlbGYuXG4gKiBjb25zdCBJY29uR3JpZCA9ICh7IGl0ZW1zID0gW10sIC4uLm1lbnVQcm9wcyB9OiBEcm9wRG93bk1lbnVDb250YWluZXJQcm9wcykgPT4gKFxuICogICA8RGl2IHsuLi5tZW51UHJvcHN9ICRncmlkPXt7IGNvbHVtbnM6IDMgfX0+XG4gKiAgICAge2l0ZW1zLm1hcCgoaXRlbSkgPT4gKFxuICogICAgICAgPGl0ZW0uQ29tcG9uZW50IGtleT17aXRlbS5pZH0gZGF0YT17dW5kZWZpbmVkfSAvPlxuICogICAgICkpfVxuICogICA8L0Rpdj5cbiAqICk7XG4gKlxuICogZXhwb3J0IGNvbnN0IGljb25HcmlkQ29udGFpbmVySW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAqICAgaWQ6IFwiaWNvbi1ncmlkLWNvbnRhaW5lclwiLFxuICogICBpbnN0YW50aWF0ZTogKCkgPT4gKCkgPT4gSWNvbkdyaWQsXG4gKiAgIGluamVjdGlvblRva2VuOiBkcm9wRG93bk1lbnVDb250YWluZXJDb21wb25lbnRJbmplY3Rpb25Ub2tlbi5mb3IoaWNvbnNNZW51S2luZCksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgZHJvcERvd25NZW51Q29udGFpbmVyQ29tcG9uZW50SW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiBEcm9wRG93bk1lbnVDb250YWluZXJDb21wb25lbnQ8YW55PjtcbiAgbWF5YmVGYWN0b3J5OiBNYXliZVJlc3VsdEZhY3Rvcnk8RHJvcERvd25NZW51Q29udGFpbmVyQ29tcG9uZW50PGFueT4+O1xufT4oe1xuICBpZDogXCJkcm9wLWRvd24tbWVudS1jb250YWluZXItY29tcG9uZW50XCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3Itb25lXCIsXG59KShkcm9wRG93bk1lbnVDb250YWluZXJDb21wb25lbnRUb2tlbkZvcik7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW5Db21wb25lbnQyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGUtcmVhY3RcIjtcbmltcG9ydCB0eXBlIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBEcm9wRG93bk1lbnVTcGVjIH0gZnJvbSBcIi4vZHJvcC1kb3duLW1lbnUtc3BlY1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERyb3BEb3duTWVudVByb3BzIHtcbiAgLyoqIFdoaWNoIG1lbnUgdG8gc2hvdzogdGhlIGtpbmQsIGl0cyBkYXRhLCBob3cgaXQgb3BlbnMgYW5kIHdoZXJlIGl0IHNpdHMuICovXG4gIHJlYWRvbmx5IHNwZWM6IERyb3BEb3duTWVudVNwZWM7XG5cbiAgLyoqXG4gICAqIFZpZXdwb3J0IHBvaW50IHRvIHNpdCBhdCwgaW5zdGVhZCBvZiB0aGUgaG9zdCBlbGVtZW50IFx1MjAxNCBob3cgYSBtZW51IG9wZW5lZCBieSByaWdodC1jbGlja2luZ1xuICAgKiBlbmRzIHVwIGF0IHRoZSBjdXJzb3IuXG4gICAqL1xuICByZWFkb25seSBhbmNob3JQb2ludD86IHsgcmVhZG9ubHkgeDogbnVtYmVyOyByZWFkb25seSB5OiBudW1iZXIgfTtcblxuICAvKiogQ2FsbGVkIHdoZW4gdGhlIG1lbnUgY2xvc2VzIGl0c2VsZiAoaXRlbSBhY3RpdmF0aW9uLCBvdXRzaWRlIGNsaWNrLCBFc2NhcGUsIG5vIGl0ZW1zKS4gKi9cbiAgcmVhZG9ubHkgb25DbG9zZTogVm9pZEZ1bmN0aW9uO1xuXG4gIC8qKiBSZXBvcnRzIHBvaW50ZXIgcHJlc2VuY2Ugb3ZlciB0aGUgbWVudSBzdXJmYWNlOyBob3Zlci1vcGVuZWQgaG9zdHMgc3RheSBvcGVuIHdoaWxlIHRydWUuICovXG4gIHJlYWRvbmx5IG9uTWVudUhvdmVyQ2hhbmdlPzogKGlzSG92ZXJlZDogYm9vbGVhbikgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgbWVudSBjb21wb25lbnQgdGhlIGAkZHJvcERvd25NZW51YCBlbGVtZW50IHByb3AgcmVuZGVycyB3aGlsZSBvcGVuLiBJdCByZW5kZXJzIGluc2lkZSB0aGVcbiAqIGhvc3QgZWxlbWVudCBhbmQgYW5jaG9ycyBpdHNlbGYgdG8gaXQsIHNvIHRoZSBob3N0IG5lZWRzIG5vIHJlZiBhbmQgdGhlIG1lbnUgbmVlZHMgbm8gcG9ydGFsLlxuICpcbiAqIEltcGxlbWVudGVkIGJ5IGBAbGVuc2FwcC9kcm9wLWRvd24tbWVudWAsIHdob3NlIGZlYXR1cmUgbXVzdCBiZSByZWdpc3RlcmVkIGZvciB0aGUgcHJvcCB0byB3b3JrO1xuICogcmVzb2x2ZWQgdGhyb3VnaCB0aGlzIHRva2VuIHNvIGVsZW1lbnQtY29tcG9uZW50cyBuZWVkcyBubyBkZXBlbmRlbmN5IG9uIHRoZSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BEb3duTWVudSA9IGdldEluamVjdGlvblRva2VuQ29tcG9uZW50MjxSZWFjdC5Db21wb25lbnRUeXBlPERyb3BEb3duTWVudVByb3BzPj4oe1xuICBpZDogXCJkcm9wLWRvd24tbWVudVwiLFxufSkoKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBEcm9wRG93bk1lbnVLaW5kIH0gZnJvbSBcIi4vZHJvcC1kb3duLW1lbnUta2luZFwiO1xuXG4vKiogQ2xvc2VzIHRoZSBvcGVuIGRyb3AtZG93biBtZW51IG9mIHRoZSBnaXZlbiBraW5kLiAqL1xuZXhwb3J0IHR5cGUgQ2xvc2VEcm9wRG93bk1lbnUgPSAoa2luZDogRHJvcERvd25NZW51S2luZDxhbnk+KSA9PiB2b2lkO1xuXG4vKipcbiAqIFByb2dyYW1tYXRpY2FsbHkgY2xvc2UgdGhlIG9wZW4gZHJvcC1kb3duIG1lbnUgb2Ygb25lIGtpbmQuIE1lbnVzIG9mIG90aGVyIGtpbmRzIHN0YXkgb3Blbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNsb3NlRHJvcERvd25NZW51ID0gZGkuaW5qZWN0KGNsb3NlRHJvcERvd25NZW51SW5qZWN0aW9uVG9rZW4pKCk7XG4gKlxuICogY2xvc2VEcm9wRG93bk1lbnUocG9kQWN0aW9uc01lbnVLaW5kKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgY2xvc2VEcm9wRG93bk1lbnVJbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6ICgpID0+IENsb3NlRHJvcERvd25NZW51IH0+KHtcbiAgaWQ6IFwiY2xvc2UtZHJvcC1kb3duLW1lbnVcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuXG4vKiogQ2xvc2VzIGV2ZXJ5IG9wZW4gZHJvcC1kb3duIG1lbnUuICovXG5leHBvcnQgdHlwZSBDbG9zZUFsbERyb3BEb3duTWVudXMgPSBWb2lkRnVuY3Rpb247XG5cbi8qKlxuICogUHJvZ3JhbW1hdGljYWxseSBjbG9zZSBhbGwgb3BlbiBkcm9wLWRvd24gbWVudXMsIHJlZ2FyZGxlc3Mgb2Yga2luZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNsb3NlQWxsRHJvcERvd25NZW51cyA9IGRpLmluamVjdChjbG9zZUFsbERyb3BEb3duTWVudXNJbmplY3Rpb25Ub2tlbikoKTtcbiAqXG4gKiBjbG9zZUFsbERyb3BEb3duTWVudXMoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgY2xvc2VBbGxEcm9wRG93bk1lbnVzSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiAoKSA9PiBDbG9zZUFsbERyb3BEb3duTWVudXMgfT4oe1xuICBpZDogXCJjbG9zZS1hbGwtZHJvcC1kb3duLW1lbnVzXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcbiIsICJpbXBvcnQgeyBleHBlY3REZWZpbmVkIH0gZnJvbSBcIkBrOHNsZW5zL3B1YmxpYy11dGlsaXRpZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBDYXJyaWVzIHRoZSBjbG9zZSBmdW5jdGlvbiBvZiB0aGUgZHJvcC1kb3duIG1lbnUgYSBjb21wb25lbnQgaXMgcmVuZGVyZWQgaW4uIFByb3ZpZGVkIGJ5IHRoZVxuICogbWVudSBpbXBsZW1lbnRhdGlvbiBhcm91bmQgaXRzIGl0ZW1zOyBjb25zdW1lIHRocm91Z2gge0BsaW5rIHVzZUNsb3NlRHJvcERvd25NZW51fS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnRleHRGb3JDbG9zaW5nRHJvcERvd25NZW51ID0gY3JlYXRlQ29udGV4dDxWb2lkRnVuY3Rpb24gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbi8qKlxuICogSW5zaWRlIG1lbnUgY29udGVudDogcmV0dXJucyBhIGZ1bmN0aW9uIGNsb3NpbmcgdGhlIG1lbnUgdGhpcyBjb21wb25lbnQgaXMgcmVuZGVyZWQgaW4gXHUyMDE0IG9ubHlcbiAqIHRoYXQgbWVudSwgbm90IGl0cyBhbmNlc3RvcnMuIFRocm93cyB3aGVuIHVzZWQgb3V0c2lkZSBhIGRyb3AtZG93biBtZW51LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IEN1c3RvbVJvdyA9ICgpID0+IHtcbiAqICAgY29uc3QgY2xvc2VEcm9wRG93bk1lbnUgPSB1c2VDbG9zZURyb3BEb3duTWVudSgpO1xuICpcbiAqICAgcmV0dXJuIDxDbGlja2FibGVEaXYgJG9uQ2xpY2s9e2Nsb3NlRHJvcERvd25NZW51fT5Eb25lPC9DbGlja2FibGVEaXY+O1xuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdXNlQ2xvc2VEcm9wRG93bk1lbnUgPSAoKSA9PlxuICBleHBlY3REZWZpbmVkKHVzZUNvbnRleHQoY29udGV4dEZvckNsb3NpbmdEcm9wRG93bk1lbnUpLCBcIlRyaWVkIHRvIGNsb3NlIGEgZHJvcC1kb3duIG1lbnUgd2hpbGUgbm90IGluc2lkZSBvbmUuXCIpO1xuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBUb2xkIGJ5IGFuIGl0ZW0gd2hlbiBpdCBpcyBhY3RpdmF0ZWQsIHNvIHRoZSBtZW51IGl0IGJlbG9uZ3MgdG8gXHUyMDE0IGFuZCB0aGUgbWVudXMgaXQgd2FzIG9wZW5lZFxuICogZnJvbSBcdTIwMTQgY2FuIGNsb3NlLiBJdGVtcyB0aGVtc2VsdmVzIGtub3cgbm90aGluZyBvZiBtZW51cy5cbiAqL1xuZXhwb3J0IGNvbnN0IG1lbnVJdGVtQWN0aXZhdGVkQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Vm9pZEZ1bmN0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBLHdCQUFnRjtBQWlDekUsSUFBTSxzQkFDWCxNQUNBLENBQW1CLGtCQUNqQixxQ0FBK0MsRUFBRSxTQUFTOzs7QUNwQzlELElBQUFBLHFCQUF1RTtBQXlCaEUsSUFBTSxxQ0FBaUMsdUNBRTNDO0FBQUEsRUFDRCxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBMEJJLElBQU0scUNBQXFDLENBQUMsZUFDakQsdUNBQW1CO0FBQUEsRUFDakIsc0JBQWtCLG1DQUFlO0FBQUEsSUFDL0IsSUFBSSxPQUFPO0FBQUEsSUFFWCxhQUFhLE1BQU0sT0FBb0M7QUFBQSxNQUNyRCxNQUFNLE9BQU87QUFBQSxNQUNiLGFBQWEsT0FBTztBQUFBLElBQ3RCO0FBQUEsSUFFQSxnQkFBZ0I7QUFBQSxFQUNsQixDQUFDO0FBQ0gsQ0FBQzs7O0FDcEVILElBQUFDLHFCQU9PO0FBNENQLElBQU0sMkJBQTJCLENBQy9CLGFBRUEsdUNBR0c7QUFBQSxFQUNELElBQUksdUJBQXVCLElBQUk7QUFBQSxFQUMvQixZQUFZO0FBQUEsRUFDWixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBT0UsSUFBTSxxQ0FBaUMsdUNBRzNDO0FBQUEsRUFDRCxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFLHdCQUF3QjtBQWlDcEIsSUFBTSxxQ0FBcUMsQ0FDaEQsZUFFQSx1Q0FBbUI7QUFBQSxFQUNqQixzQkFBa0IsbUNBQWU7QUFBQSxJQUMvQixJQUFJLE9BQU87QUFBQSxJQUVYLGFBQWEsTUFBTSxPQUE4QztBQUFBLE1BQy9ELElBQUksT0FBTztBQUFBLE1BQ1gsYUFBYSxPQUFPO0FBQUEsTUFDcEIsV0FBVyxPQUFPO0FBQUEsTUFDbEIsV0FBVyxPQUFPO0FBQUEsSUFDcEI7QUFBQSxJQUVBLGdCQUFnQiwrQkFBK0IsSUFBSSxPQUFPLElBQUk7QUFBQSxFQUNoRSxDQUFDO0FBQ0gsQ0FBQzs7O0FDckJJLFNBQVMsYUFDZCxNQUNBLFNBQ2tCO0FBQ2xCLFNBQU8sRUFBRSxNQUFNLEdBQUcsUUFBUTtBQUM1Qjs7O0FDM0dBLElBQUFDLHFCQUEwRjtBQUMxRiw4QkFBNEM7QUEwQnJDLElBQU0sbUNBQStCLHFEQUUxQztBQUFBLEVBQ0EsSUFBSTtBQUNOLENBQUMsRUFBRTtBQWVILElBQU0seUNBQXlDLENBQzdDLGFBRUEsdUNBR0c7QUFBQSxFQUNELElBQUksc0NBQXNDLElBQUk7QUFBQSxFQUM5QyxZQUFZO0FBQUEsRUFDWixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBeUJFLElBQU0sbURBQStDLHVDQUd6RDtBQUFBLEVBQ0QsSUFBSTtBQUFBLEVBQ0osYUFBYTtBQUNmLENBQUMsRUFBRSxzQ0FBc0M7OztBQ3ZGekMsSUFBQUMsMkJBQTRDO0FBNEJyQyxJQUFNLG1CQUFlLHNEQUFvRTtBQUFBLEVBQzlGLElBQUk7QUFDTixDQUFDLEVBQUU7OztBQzlCSCxJQUFBQyxxQkFBbUM7QUFnQjVCLElBQU0sc0NBQWtDLHVDQUErRDtBQUFBLEVBQzVHLElBQUk7QUFBQSxFQUNKLGFBQWE7QUFDZixDQUFDLEVBQUU7QUFlSSxJQUFNLDBDQUFzQyx1Q0FBbUU7QUFBQSxFQUNwSCxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFOzs7QUNyQ0gsOEJBQThCO0FBQzlCLG1CQUEwQztBQU1uQyxJQUFNLG9DQUFnQyw0QkFBd0MsTUFBUztBQWV2RixJQUFNLHVCQUF1QixVQUNsQywyQ0FBYyx5QkFBVyw2QkFBNkIsR0FBRyx1REFBdUQ7OztBQ3ZCbEgsSUFBQUMsZ0JBQThCO0FBTXZCLElBQU0sK0JBQTJCLDZCQUF3QyxNQUFTOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfaW5qZWN0YWJsZV9yZWFjdCIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfcmVhY3QiXQp9Cg==
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Carries the close function of the drop-down menu a component is rendered in. Provided by the
3
+ * menu implementation around its items; consume through {@link useCloseDropDownMenu}.
4
+ */
5
+ export declare const contextForClosingDropDownMenu: import("react").Context<VoidFunction | undefined>;
6
+ /**
7
+ * Inside menu content: returns a function closing the menu this component is rendered in — only
8
+ * that menu, not its ancestors. Throws when used outside a drop-down menu.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * const CustomRow = () => {
13
+ * const closeDropDownMenu = useCloseDropDownMenu();
14
+ *
15
+ * return <ClickableDiv $onClick={closeDropDownMenu}>Done</ClickableDiv>;
16
+ * };
17
+ * ```
18
+ */
19
+ export declare const useCloseDropDownMenu: () => VoidFunction;
20
+ //# sourceMappingURL=close-drop-down-menu-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-drop-down-menu-context.d.ts","sourceRoot":"","sources":["../../src/close-drop-down-menu-context.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,6BAA6B,mDAAqD,CAAC;AAEhG;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,oBACkF,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { DropDownMenuKind } from "./drop-down-menu-kind";
2
+ /** Closes the open drop-down menu of the given kind. */
3
+ export type CloseDropDownMenu = (kind: DropDownMenuKind<any>) => void;
4
+ /**
5
+ * Programmatically close the open drop-down menu of one kind. Menus of other kinds stay open.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const closeDropDownMenu = di.inject(closeDropDownMenuInjectionToken)();
10
+ *
11
+ * closeDropDownMenu(podActionsMenuKind);
12
+ * ```
13
+ */
14
+ export declare const closeDropDownMenuInjectionToken: import("@k8slens/injectable").InjectionToken2Base<() => CloseDropDownMenu, () => CloseDropDownMenu[], "one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<CloseDropDownMenu>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<CloseDropDownMenu>[]> & {
15
+ readonly __abstract?: never;
16
+ };
17
+ /** Closes every open drop-down menu. */
18
+ export type CloseAllDropDownMenus = VoidFunction;
19
+ /**
20
+ * Programmatically close all open drop-down menus, regardless of kind.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const closeAllDropDownMenus = di.inject(closeAllDropDownMenusInjectionToken)();
25
+ *
26
+ * closeAllDropDownMenus();
27
+ * ```
28
+ */
29
+ export declare const closeAllDropDownMenusInjectionToken: import("@k8slens/injectable").InjectionToken2Base<() => CloseAllDropDownMenus, () => VoidFunction[], "one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<VoidFunction>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<VoidFunction>[]> & {
30
+ readonly __abstract?: never;
31
+ };
32
+ //# sourceMappingURL=close-drop-down-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-drop-down-menu.d.ts","sourceRoot":"","sources":["../../src/close-drop-down-menu.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,wDAAwD;AACxD,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAEtE;;;;;;;;;GASG;AACH,eAAO,MAAM,+BAA+B,0DAA6C,iBAAiB;;CAGtG,CAAC;AAEL,wCAAwC;AACxC,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAEjD;;;;;;;;;GASG;AACH,eAAO,MAAM,mCAAmC,0DAA6C,qBAAqB;;CAG9G,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { Discriminable, Orderable, MaybeComputedShowable, MaybeComputedEnableable, Identifiable } from "@k8slens/composable-responsibilities";
2
+ import type { MaybeAsyncVoidFunction, MaybePromise } from "@k8slens/public-utilities";
3
+ import type React from "react";
4
+ /**
5
+ * A label given as plain text.
6
+ */
7
+ export type TextLabelable = {
8
+ readonly labelText: string;
9
+ readonly Label?: undefined;
10
+ readonly labelProps?: undefined;
11
+ };
12
+ /**
13
+ * When the label component requires props, providing them is mandatory; when all of its props are
14
+ * optional, so is providing them.
15
+ */
16
+ export type LabelPropsFor<P extends object> = {} extends P ? {
17
+ readonly labelProps?: P;
18
+ } : {
19
+ readonly labelProps: P;
20
+ };
21
+ /**
22
+ * A label given as a component type the menu renders where and when the label is shown. The
23
+ * component must be defined at module scope; any data it needs arrives as props through
24
+ * `labelProps`. Capturing data in a closure instead would create a new component reference on
25
+ * every invocation and break React reconciliation.
26
+ */
27
+ export type ComponentLabelable<P extends object = any> = {
28
+ readonly labelText?: undefined;
29
+ readonly Label: React.ComponentType<P>;
30
+ } & LabelPropsFor<P>;
31
+ /**
32
+ * Exactly one of `labelText` and `Label` must be provided.
33
+ */
34
+ export type ReactLabelable<P extends object = any> = TextLabelable | ComponentLabelable<P>;
35
+ /**
36
+ * A clickable menu item. Visibility (`isVisible`/`isHidden`) and enablement (`isEnabled`) may be
37
+ * given as computeds, in which case the menu reacts to their changes while open.
38
+ */
39
+ export type ActionMenuItem<P extends object = any> = Discriminable<"action"> & Identifiable & Orderable & ReactLabelable<P> & MaybeComputedShowable & MaybeComputedEnableable & {
40
+ /**
41
+ * This function will be called when the user clicks on this menu item
42
+ */
43
+ readonly onClick: MaybePromise<MaybeAsyncVoidFunction>;
44
+ readonly parentId: string | undefined;
45
+ };
46
+ /**
47
+ * A menu item that reveals nested items on hover.
48
+ */
49
+ export type SubMenuItem<P extends object = any> = Discriminable<"sub-menu"> & Identifiable & Orderable & ReactLabelable<P> & MaybeComputedShowable & MaybeComputedEnableable & {
50
+ readonly parentId: string | undefined;
51
+ readonly onClick?: MaybePromise<MaybeAsyncVoidFunction>;
52
+ };
53
+ /**
54
+ * An item that renders itself entirely — the element it lives in included. The menu puts the
55
+ * component in its list and stays out of the way, so the item decides its own markup, whether it
56
+ * anchors anything, and whether it takes part in keyboard navigation.
57
+ *
58
+ * The component must be defined at module scope; capturing data in a closure would create a new
59
+ * component reference on every invocation and break React reconciliation.
60
+ */
61
+ export interface ComponentMenuItem extends Discriminable<"component">, Identifiable, Orderable, MaybeComputedShowable {
62
+ readonly Component: React.ComponentType;
63
+ readonly parentId: string | undefined;
64
+ }
65
+ /**
66
+ * A group of items that should have separators before the first item (if applicable) and after the last item (if applicable)
67
+ */
68
+ export interface GroupOfMenuItems extends Discriminable<"group">, MaybeComputedShowable, Identifiable, Orderable {
69
+ readonly parentId: string | undefined;
70
+ }
71
+ /**
72
+ * The authoring model of a menu item: a clickable action, a sub-menu, or a group. Items reference
73
+ * each other by `id`/`parentId`; siblings are ordered by `orderNumber`, and separators appear
74
+ * between adjacent groups.
75
+ */
76
+ export type MenuItem = ActionMenuItem | SubMenuItem | ComponentMenuItem | GroupOfMenuItems;
77
+ //# sourceMappingURL=context-menu-items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu-items.d.ts","sourceRoot":"","sources":["../../src/context-menu-items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,uBAAuB,EACvB,YAAY,EACb,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC;CACjC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,IAAI,EAAE,SAAS,CAAC,GAAG;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;CAAE,CAAC;AAEtH;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,IAAI;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CACxC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAErB;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,IAAI,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAE3F;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,GAC1E,YAAY,GACZ,SAAS,GACT,cAAc,CAAC,CAAC,CAAC,GACjB,qBAAqB,GACrB,uBAAuB,GAAG;IACxB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,GACzE,YAAY,GACZ,SAAS,GACT,cAAc,CAAC,CAAC,CAAC,GACjB,qBAAqB,GACrB,uBAAuB,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;CACzD,CAAC;AAEJ;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,qBAAqB;IACnH,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,aAAa,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,YAAY,EAAE,SAAS;IAC9G,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,WAAW,GAAG,iBAAiB,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type React from "react";
2
+ import type { DropDownMenuSpec } from "./drop-down-menu-spec";
3
+ export interface DropDownMenuProps {
4
+ /** Which menu to show: the kind, its data, how it opens and where it sits. */
5
+ readonly spec: DropDownMenuSpec;
6
+ /**
7
+ * Viewport point to sit at, instead of the host element — how a menu opened by right-clicking
8
+ * ends up at the cursor.
9
+ */
10
+ readonly anchorPoint?: {
11
+ readonly x: number;
12
+ readonly y: number;
13
+ };
14
+ /** Called when the menu closes itself (item activation, outside click, Escape, no items). */
15
+ readonly onClose: VoidFunction;
16
+ /** Reports pointer presence over the menu surface; hover-opened hosts stay open while true. */
17
+ readonly onMenuHoverChange?: (isHovered: boolean) => void;
18
+ }
19
+ /**
20
+ * The menu component the `$dropDownMenu` element prop renders while open. It renders inside the
21
+ * host element and anchors itself to it, so the host needs no ref and the menu needs no portal.
22
+ *
23
+ * Implemented by `@lensapp/drop-down-menu`, whose feature must be registered for the prop to work;
24
+ * resolved through this token so element-components needs no dependency on the implementation.
25
+ */
26
+ export declare const DropDownMenu: React.ComponentType<DropDownMenuProps> & import("@k8slens/injectable").InjectionToken2Base<() => React.ComponentType<DropDownMenuProps>, () => React.ComponentType<DropDownMenuProps>[], "one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<DropDownMenuProps>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<DropDownMenuProps>>[]> & {
27
+ readonly __abstract?: never;
28
+ };
29
+ //# sourceMappingURL=drop-down-menu-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-down-menu-component.d.ts","sourceRoot":"","sources":["../../src/drop-down-menu-component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAElE,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAE/B,+FAA+F;IAC/F,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3D;AAED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;;CAErB,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { type MaybeResultFactory, type SpecificInjectionToken2 } from "@k8slens/injectable";
2
+ import type React from "react";
3
+ import type { DropDownMenuData, DropDownMenuKind } from "./drop-down-menu-kind";
4
+ import type { DropDownMenuItem } from "./drop-down-menu-item";
5
+ /**
6
+ * The props the menu hands its container. They position the container, put it above everything
7
+ * else, and let a menu opened by hovering know the pointer is on it — so the container must spread
8
+ * them onto whichever element it renders.
9
+ */
10
+ export type DropDownMenuContainerProps<TData = void> = {
11
+ readonly children: React.ReactNode;
12
+ /**
13
+ * The items of the menu, as its kind declares them, for a container that lays them out itself
14
+ * rather than rendering what the menu gave it as children.
15
+ */
16
+ readonly items?: readonly DropDownMenuItem<TData>[];
17
+ } & Record<string, unknown>;
18
+ export type DropDownMenuContainerComponent<TData = void> = () => React.ComponentType<DropDownMenuContainerProps<TData>>;
19
+ /**
20
+ * The container a menu renders as when its kind contributes none of its own. Implemented by
21
+ * `@lensapp/drop-down-menu`; override it to change what every menu is made of.
22
+ */
23
+ export declare const DefaultDropDownMenuContainer: React.ComponentType<DropDownMenuContainerProps<void>> & import("@k8slens/injectable").InjectionToken2Base<() => React.ComponentType<DropDownMenuContainerProps<void>>, () => React.ComponentType<DropDownMenuContainerProps<void>>[], "one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<DropDownMenuContainerProps<void>>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<DropDownMenuContainerProps<void>>>[]> & {
24
+ readonly __abstract?: never;
25
+ };
26
+ /** The specific token `.for(kind)` yields: at most one container for a menu kind, typed by it. */
27
+ export type DropDownMenuContainerTokenFor<TData> = SpecificInjectionToken2<{
28
+ singleFactory: DropDownMenuContainerComponent<TData>;
29
+ maybeFactory: MaybeResultFactory<DropDownMenuContainerComponent<TData>>;
30
+ specificTokenFactory: undefined;
31
+ cardinality: "zero-or-one";
32
+ }>;
33
+ /**
34
+ * The `.for()` factory, annotated so a kind's own data type survives into the specific token. The
35
+ * annotation carries what the retired third type parameter used to: inference from the value alone
36
+ * cannot reconstruct a return type that mentions the specifier's own type parameter.
37
+ */
38
+ declare const dropDownMenuContainerComponentTokenFor: <K extends DropDownMenuKind<any>>(kind: K) => DropDownMenuContainerTokenFor<DropDownMenuData<K>>;
39
+ /**
40
+ * The element a menu of some kind renders as. Without one, a menu is a list — which is what a menu
41
+ * of ordinary items should be. Contribute one when the items are not a list: a grid of icons, say,
42
+ * or a panel that happens to open like a menu.
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * // Items typed by the kind, for a container that lays them out itself.
47
+ * const IconGrid = ({ items = [], ...menuProps }: DropDownMenuContainerProps) => (
48
+ * <Div {...menuProps} $grid={{ columns: 3 }}>
49
+ * {items.map((item) => (
50
+ * <item.Component key={item.id} data={undefined} />
51
+ * ))}
52
+ * </Div>
53
+ * );
54
+ *
55
+ * export const iconGridContainerInjectable = getInjectable2({
56
+ * id: "icon-grid-container",
57
+ * instantiate: () => () => IconGrid,
58
+ * injectionToken: dropDownMenuContainerComponentInjectionToken.for(iconsMenuKind),
59
+ * });
60
+ * ```
61
+ */
62
+ export declare const dropDownMenuContainerComponentInjectionToken: import("@k8slens/injectable").InjectionToken2Base<DropDownMenuContainerComponent<any>, () => React.ComponentType<DropDownMenuContainerProps<any>> | undefined, "zero-or-one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<DropDownMenuContainerProps<any>>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<DropDownMenuContainerProps<any>>> | undefined> & {
63
+ readonly __abstract: true;
64
+ for: typeof dropDownMenuContainerComponentTokenFor;
65
+ };
66
+ export {};
67
+ //# sourceMappingURL=drop-down-menu-container-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-down-menu-container-component.d.ts","sourceRoot":"","sources":["../../src/drop-down-menu-container-component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEhH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,CAAC,KAAK,GAAG,IAAI,IAAI;IACrD,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAEnC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;CACrD,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,8BAA8B,CAAC,KAAK,GAAG,IAAI,IAAI,MAAM,KAAK,CAAC,aAAa,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC;AAExH;;;GAGG;AACH,eAAO,MAAM,4BAA4B;;CAIrC,CAAC;AAEL,kGAAkG;AAClG,MAAM,MAAM,6BAA6B,CAAC,KAAK,IAAI,uBAAuB,CAAC;IACzE,aAAa,EAAE,8BAA8B,CAAC,KAAK,CAAC,CAAC;IACrD,YAAY,EAAE,kBAAkB,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,oBAAoB,EAAE,SAAS,CAAC;IAChC,WAAW,EAAE,aAAa,CAAC;CAC5B,CAAC,CAAC;AAEH;;;;GAIG;AACH,QAAA,MAAM,sCAAsC,GAAI,CAAC,SAAS,gBAAgB,CAAC,GAAG,CAAC,QACvE,CAAC,KACN,6BAA6B,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAQ9C,CAAC;AAEP;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,4CAA4C;;;CAMf,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { type NonEmptyManyFactory, type SpecificInjectionToken2 } from "@k8slens/injectable";
2
+ import type { Identifiable, MaybeComputed, MaybeComputedShowable, Orderable } from "@k8slens/composable-responsibilities";
3
+ import type { MaybePromise } from "@k8slens/public-utilities";
4
+ import type React from "react";
5
+ import type { DropDownMenuData, DropDownMenuKind } from "./drop-down-menu-kind";
6
+ /**
7
+ * One item of a drop-down menu: a component, where it sits among the others, and whether it is
8
+ * shown at all. What the item looks like and what it does are its own business — a menu neither
9
+ * draws it nor decides anything about it.
10
+ *
11
+ * The component is given the data the host element opened the menu with, and must be defined at
12
+ * module scope; capturing data in a closure would create a new component reference on every
13
+ * invocation and break React reconciliation.
14
+ */
15
+ export interface DropDownMenuItem<TData = void> extends Identifiable, Orderable, MaybeComputedShowable {
16
+ readonly Component: React.ComponentType<{
17
+ readonly data: TData;
18
+ }>;
19
+ }
20
+ /** Produces one item, possibly later. */
21
+ export type DropDownMenuItemFactory<TData = any> = () => MaybePromise<DropDownMenuItem<TData>>;
22
+ /**
23
+ * The specific token `.for(kind)` yields: the items contributed to one menu kind. At least one of
24
+ * them, so that a kind nobody contributes to is a composition error rather than a menu that never
25
+ * opens.
26
+ */
27
+ export type DropDownMenuItemTokenFor<TData> = SpecificInjectionToken2<{
28
+ singleFactory: DropDownMenuItemFactory<TData>;
29
+ manyFactory: NonEmptyManyFactory<DropDownMenuItemFactory<TData>>;
30
+ specificTokenFactory: undefined;
31
+ cardinality: "one-or-many";
32
+ }>;
33
+ /**
34
+ * The `.for()` factory, annotated so a kind's own data type survives into the specific token. The
35
+ * annotation carries what the retired third type parameter used to: inference from the value alone
36
+ * cannot reconstruct a return type that mentions the specifier's own type parameter.
37
+ */
38
+ declare const dropDownMenuItemTokenFor: <K extends DropDownMenuKind<any>>(kind: K) => DropDownMenuItemTokenFor<DropDownMenuData<K>>;
39
+ /**
40
+ * The contribution surface of drop-down menus: one item per contribution, registered against a
41
+ * {@link DropDownMenuKind} via `.for(kind)`. Prefer {@link getDropDownMenuItemInjectableBunch}
42
+ * over registering by hand.
43
+ */
44
+ export declare const dropDownMenuItemInjectionToken: import("@k8slens/injectable").InjectionToken2Base<DropDownMenuItemFactory<any>, () => MaybePromise<DropDownMenuItem<any>>[], "zero-or-many", () => import("@k8slens/injectable").InjectionInstanceWithMeta<MaybePromise<DropDownMenuItem<any>>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<MaybePromise<DropDownMenuItem<any>>>[]> & {
45
+ readonly __abstract: true;
46
+ for: typeof dropDownMenuItemTokenFor;
47
+ };
48
+ export interface DropDownMenuItemBunchParams<K extends DropDownMenuKind<any>> {
49
+ /** Unique id for the registered injectable; doubles as the item's id. */
50
+ readonly id: string;
51
+ /** The menu kind the item belongs to. */
52
+ readonly kind: K;
53
+ /** Lower comes first among the kind's items. */
54
+ readonly orderNumber: number;
55
+ /** Whether the item is shown at all; the menu reacts to this while open. */
56
+ readonly isVisible?: MaybeComputed<boolean>;
57
+ /** Renders the item. Receives the data the menu was opened with. */
58
+ readonly Component: React.ComponentType<{
59
+ readonly data: DropDownMenuData<K>;
60
+ }>;
61
+ }
62
+ /**
63
+ * Contribute one item to a drop-down menu kind.
64
+ *
65
+ * @example
66
+ * ```tsx
67
+ * const RestartPod = ({ data }: { data: { podName: string } }) => (
68
+ * <ClickableLi $onClick={() => restart(data.podName)}>Restart {data.podName}</ClickableLi>
69
+ * );
70
+ *
71
+ * export const restartPodBunch = getDropDownMenuItemInjectableBunch({
72
+ * id: "restart-pod",
73
+ * kind: podActionsMenuKind,
74
+ * orderNumber: 10,
75
+ * isVisible: computed(() => canRestart.get()),
76
+ * Component: RestartPod,
77
+ * });
78
+ * ```
79
+ */
80
+ export declare const getDropDownMenuItemInjectableBunch: <K extends DropDownMenuKind<any>>(params: DropDownMenuItemBunchParams<K>) => {
81
+ dropDownMenuItem: import("@k8slens/injectable").Injectable2<() => DropDownMenuItem<DropDownMenuData<K>>>;
82
+ };
83
+ export {};
84
+ //# sourceMappingURL=drop-down-menu-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-down-menu-item.d.ts","sourceRoot":"","sources":["../../src/drop-down-menu-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,SAAS,EACV,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEhF;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,IAAI,CAAE,SAAQ,YAAY,EAAE,SAAS,EAAE,qBAAqB;IACpG,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,yCAAyC;AACzC,MAAM,MAAM,uBAAuB,CAAC,KAAK,GAAG,GAAG,IAAI,MAAM,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;AAE/F;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,CAAC,KAAK,IAAI,uBAAuB,CAAC;IACpE,aAAa,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC9C,WAAW,EAAE,mBAAmB,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,oBAAoB,EAAE,SAAS,CAAC;IAChC,WAAW,EAAE,aAAa,CAAC;CAC5B,CAAC,CAAC;AAEH;;;;GAIG;AACH,QAAA,MAAM,wBAAwB,GAAI,CAAC,SAAS,gBAAgB,CAAC,GAAG,CAAC,QACzD,CAAC,KACN,wBAAwB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAQzC,CAAC;AAEP;;;;GAIG;AACH,eAAO,MAAM,8BAA8B;;;CAMf,CAAC;AAE7B,MAAM,WAAW,2BAA2B,CAAC,CAAC,SAAS,gBAAgB,CAAC,GAAG,CAAC;IAC1E,yEAAyE;IACzE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,gDAAgD;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;CACjF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kCAAkC,GAAI,CAAC,SAAS,gBAAgB,CAAC,GAAG,CAAC,UACxE,2BAA2B,CAAC,CAAC,CAAC;sEAMX,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAS9D,CAAC"}