@rooted/elements 1.0.0-alpha.7 → 1.0.0-alpha.9

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.
@@ -43,13 +43,52 @@ type AriaIdReferenceProperties = {
43
43
  */
44
44
  type Aria = AriaStringProperties & AriaIdReferenceProperties;
45
45
  //#endregion
46
+ //#region src/children.d.mts
47
+ /**
48
+ * A single child of an element: a `Node` or a string of text. `undefined` and
49
+ * `null` are allowed too, and get skipped when the children are appended, so
50
+ * conditional children don't need a guard.
51
+ */
52
+ export type ElementChild = Node | string | undefined | null;
53
+ /**
54
+ * One or more children accepted by the `children` prop of every element
55
+ * created via `element()`, `create()` or `append()`.
56
+ *
57
+ * - A single `Node` or string is appended as-is.
58
+ * - An array is appended in order, skipping `undefined` and `null` entries.
59
+ *
60
+ * Because those entries are skipped, conditional children can be written
61
+ * inline with `optional()`. A plain ternary ending in `undefined` works too,
62
+ * it just reads worse.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * import { optional } from '@rooted/components'
67
+ *
68
+ * element('label', {
69
+ * children: [
70
+ * element('span', {
71
+ * textContent: 'Name',
72
+ * }),
73
+ * optional(required,
74
+ * element('abbr', {
75
+ * title: 'required',
76
+ * textContent: '*',
77
+ * })
78
+ * ),
79
+ * ],
80
+ * })
81
+ * ```
82
+ */
83
+ export type ElementChildren = Array<ElementChild> | ElementChild;
84
+ //#endregion
46
85
  //#region src/classes.d.mts
47
86
  /**
48
87
  * A single CSS class value. Falsy variants (`undefined` and `null`) are
49
88
  * automatically filtered out when building a class list, so conditional
50
89
  * classes can be expressed without explicit guards.
51
90
  */
52
- type CssClass = string | undefined | null;
91
+ export type CssClass = string | undefined | null;
53
92
  /**
54
93
  * One or more CSS class values accepted by the `classes` prop of every HTML
55
94
  * element created via `create()` or `append()`.
@@ -60,33 +99,77 @@ type CssClass = string | undefined | null;
60
99
  *
61
100
  * @see {@link cssClass} for composing conditional class names.
62
101
  */
63
- type CssClasses = Array<CssClass> | CssClass;
102
+ export type CssClasses = Array<CssClass> | CssClass;
103
+ /**
104
+ * Class names mapped to whether they apply. Only `true` includes the class,
105
+ * anything else leaves it out.
106
+ *
107
+ * Keys have to be strings, so this doesn't work with a `CssModule` value that
108
+ * TypeScript thinks might be `undefined`. Use the list form of
109
+ * {@link cssClasses} for those.
110
+ *
111
+ * @see {@link cssClasses} for the function that reads this.
112
+ */
113
+ export type CssClassDictionary = Record<string, boolean | null | undefined>;
64
114
  /**
65
- * Returns `className` when `visible` is truthy, otherwise `undefined`.
115
+ * Returns `className` when `visible` is `true`, otherwise `undefined`.
66
116
  *
67
117
  * Designed to compose cleanly with {@link CssClasses}: falsy values are
68
118
  * filtered out automatically, so static and conditional classes can be mixed
69
- * in a single array without branching.
119
+ * in a single array without branching. Called with just a class name it
120
+ * returns that name, which is handy when the rest of the array is conditional.
70
121
  *
122
+ * The condition comes first, same as `optional()`.
123
+ *
124
+ * @param visible - When `true` the class is returned, any other value produces
125
+ * `undefined`.
71
126
  * @param className - The CSS class to apply.
72
- * @param visible - When `true` (the default) the class is returned; any other
73
- * value produces `undefined`.
74
127
  *
75
128
  * @example
76
129
  * ```ts
77
130
  * append('button', {
78
131
  * classes: [
79
132
  * 'btn',
80
- * cssClass('btn--active', isActive),
81
- * cssClass('btn--disabled', isDisabled),
133
+ * cssClass(isActive, 'btn--active'),
134
+ * cssClass(isDisabled, 'btn--disabled'),
135
+ * ],
136
+ * })
137
+ * ```
138
+ */
139
+ export declare function cssClass(className: CssClass): CssClass;
140
+ export declare function cssClass(visible: boolean | null | undefined, className: CssClass): CssClass;
141
+ /**
142
+ * Joins several class names into one {@link CssClass}, dropping the falsy
143
+ * ones. Returns `undefined` when nothing is left, so the result disappears
144
+ * from a `classes` array instead of adding an empty string.
145
+ *
146
+ * Three ways to call it:
147
+ *
148
+ * - `cssClasses('a', 'b')` joins what you pass.
149
+ * - `cssClasses(visible, 'a', 'b')` joins them only when `visible` is `true`.
150
+ * - `cssClasses({ a: true, b: false })` keeps the keys mapped to `true`.
151
+ *
152
+ * Watch out for one overlap: a leading `undefined` or `null` is read as the
153
+ * condition, so `cssClasses(undefined, 'a')` is `undefined` and not `'a'`.
154
+ * A class name that might be `undefined`, like anything off a `CssModule`,
155
+ * belongs after the condition rather than first.
156
+ *
157
+ * @example
158
+ * ```ts
159
+ * append('button', {
160
+ * classes: [
161
+ * cssClasses(styles.button, styles.rounded),
162
+ * cssClasses(isActive, styles.active, styles.raised),
163
+ * cssClasses({
164
+ * 'btn--disabled': isDisabled,
165
+ * }),
82
166
  * ],
83
167
  * })
84
168
  * ```
85
169
  */
86
- declare function cssClass(className: string): CssClass;
87
- declare function cssClass(className: string, visible: boolean | null | undefined): CssClass;
88
- declare function cssClass(className: CssClass): CssClass;
89
- declare function cssClass(className: CssClass, visible: boolean | null | undefined): CssClass;
170
+ export declare function cssClasses(visible: boolean | null | undefined, ...classNames: Array<CssClass>): CssClass;
171
+ export declare function cssClasses(...classNames: Array<CssClass>): CssClass;
172
+ export declare function cssClasses(classNames: CssClassDictionary): CssClass;
90
173
  //#endregion
91
174
  //#region src/element-type-utilities.d.mts
92
175
  type IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? A : B;
@@ -100,7 +183,7 @@ type InlineStyle = { [K in keyof CSSStyleDeclaration as CSSStyleDeclaration[K] e
100
183
  type SanitizedHtmlProperties<TElement extends HTMLElement> = Omit<TElement, NonWritableKeys<TElement> | FunctionKeys<TElement> | Exclude<keyof ARIAMixin, 'role'> | OnHandlerKeys<TElement> | 'children' | 'className' | 'classList' | 'style'>;
101
184
  type HtmlElementPropertiesMapped<TElement extends HTMLElement> = Partial<SanitizedHtmlProperties<TElement>> & {
102
185
  [key: string]: unknown;
103
- children?: Array<Node | string> | Node | string;
186
+ children?: ElementChildren;
104
187
  classes?: CssClasses;
105
188
  style?: InlineStyle;
106
189
  aria?: Aria;
@@ -130,7 +213,7 @@ type SvgElementPropertiesMapped<TElement extends SVGElement> = Partial<Sanitized
130
213
  [key: string]: unknown;
131
214
  classes?: CssClasses;
132
215
  style?: InlineStyle;
133
- children?: Array<Node | string> | Node | string;
216
+ children?: ElementChildren;
134
217
  aria?: Aria;
135
218
  on?: ElementOnHandlers<TElement>;
136
219
  };
@@ -143,18 +226,18 @@ type SvgElementPropertiesMapped<TElement extends SVGElement> = Partial<Sanitized
143
226
  type SvgElementProperties<K extends SvgTagName> = SvgElementPropertiesMapped<SvgTagElement<K> & SVGElement>;
144
227
  //#endregion
145
228
  //#region src/element-factory.d.mts
146
- type ElementCreator = (key: string, ns?: string) => Element;
229
+ export type ElementCreator = (key: string, ns?: string) => Element;
147
230
  /**
148
231
  * The overloaded function type returned by {@link createElementFactory}.
149
232
  * Accepts HTML or SVG tag names and returns the matching element type.
150
233
  */
151
- interface ElementCreatorFunction {
234
+ export interface ElementCreatorFunction {
152
235
  (tag: 'svg', properties?: SvgElementProperties<'svg'>): SVGSVGElement;
153
236
  <K extends Exclude<SvgTagName, 'svg'>>(tag: K, properties?: SvgElementProperties<K>): SvgTagElement<K>;
154
237
  <K extends keyof HTMLElementTagNameMap>(tag: K, properties?: NoInfer<HtmlElementProperties<K>>): HTMLElementTagNameMap[K];
155
238
  }
156
- type ElementFactory = ElementCreatorFunction;
157
- declare function createElementFactory(constructElement: ElementCreator, signal: AbortSignal): ElementCreatorFunction;
239
+ export type ElementFactory = ElementCreatorFunction;
240
+ export declare function createElementFactory(constructElement: ElementCreator, signal: AbortSignal): ElementCreatorFunction;
158
241
  //#endregion
159
- export { type Aria, CssClass, CssClasses, ElementCreator, ElementCreatorFunction, ElementFactory, type HtmlElementProperties, type SvgElementProperties, type SvgTagElement, type SvgTagName, createElementFactory, cssClass };
160
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMuZC5tdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2FyaWEubXRzIiwiLi4vc3JjL2NsYXNzZXMubXRzIiwiLi4vc3JjL2VsZW1lbnQtdHlwZS11dGlsaXRpZXMubXRzIiwiLi4vc3JjL2h0bWwtZWxlbWVudC1wcm9wZXJ0aWVzLm10cyIsIi4uL3NyYy9zdmctZWxlbWVudC1wcm9wZXJ0aWVzLm10cyIsIi4uL3NyYy9lbGVtZW50LWZhY3RvcnkubXRzIl0sIm1hcHBpbmdzIjoiOztLQUFLLFVBQVUsb0JBQW9CLHVCQUF1QixTQUFTLGFBQWEsUUFBUTtLQUVuRiwwQkFDSCxXQUFXLGFBQWEsVUFBVSwyQkFBMkIsbUJBQW1CO0tBSTdFOztFQUVKLDRCQUE0Qjs7RUFFNUIsb0JBQW9COztFQUVwQix1QkFBdUI7O0VBRXZCLG1CQUFtQjs7RUFFbkIsd0JBQXdCOztFQUV4QixrQkFBa0I7O0VBRWxCLHNCQUFzQjs7RUFFdEIsZ0JBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXdCTCxPQUFPLHVCQUF1Qjs7Ozs7Ozs7S0MxQzlCOzs7Ozs7Ozs7OztLQVlBLGFBQWEsTUFBTSxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkF3QjNCLFNBQVMsb0JBQW9CO2lCQUM3QixTQUFTLG1CQUFtQixzQ0FBc0M7aUJBQ2xFLFNBQVMsV0FBVyxXQUFXO2lCQUMvQixTQUFTLFdBQVcsVUFBVSxzQ0FBc0M7OztLQzVDeEUsU0FBUyxHQUFHLEdBQUcsSUFBSSxHQUFHLGVBQWUsUUFBUSxVQUFVLHFCQUFxQixRQUFRLFVBQVUsYUFBYSxJQUFJO0tBQy9HLGdCQUFnQixRQUMxQixXQUFXLE1BQU0sWUFBWSxLQUFLLElBQUksRUFBRSxvQkFBbUIsS0FBSyxJQUFJLEVBQUUsY0FBYSxZQUM3RTtLQUNJLGFBQWEsUUFDdkIsV0FBVyxJQUFJLFlBQVksRUFBRSxpQkFBZ0IsbUNBQWtDLG1CQUN6RTtLQUNJLGNBQWMsUUFBUSxXQUFXLElBQUksMEJBQTBCLG1CQUFrQjs7S0FHakYsaUJBQWlCLFdBQVcsdUJBQXVCLG9CQUFvQixvQkFBb0IsOEJBQThCOzs7S0NKaEksd0JBQXdCLGlCQUFpQixlQUFlLEtBQzVELFVBQ0UsZ0JBQWdCLFlBQ2hCLGFBQWEsWUFDYixjQUFjLHFCQUNkLGNBQWM7S0FJWiw0QkFBNEIsaUJBQWlCLGVBQy9DLFFBQVEsd0JBQXdCO0dBR2hDO0VBQ0QsV0FBVyxNQUFNLGlCQUFpQjtFQUNsQyxVQUFVO0VBQ1YsUUFBUTtFQUNSLE9BQU87RUFDUCxLQUFLLGtCQUFrQjs7Ozs7Ozs7OztLQVdiLHNCQUFzQix1QkFBdUIseUJBQ3RELDRCQUE0QixzQkFBc0I7Ozs7Ozs7O0tDekJ6Qyw0QkFBNEIsY0FBYzs7S0FHMUMsY0FBYyxVQUFVLGNBQ2pDLGtCQUFrQixnQkFDbEIsdUJBQXVCLGdCQUFnQix5QkFBeUIscUJBQXFCO0tBR25GLHVCQUF1QixpQkFBaUIsY0FBYyxLQUMxRCxVQUNFLGdCQUFnQixZQUNoQixhQUFhLFlBQ2IsY0FBYyxxQkFDZCxjQUFjO0tBSVosMkJBQTJCLGlCQUFpQixjQUM5QyxRQUFRLHVCQUF1QjtHQUcvQjtFQUNELFVBQVU7RUFDVixRQUFRO0VBQ1IsV0FBVyxNQUFNLGlCQUFpQjtFQUNsQyxPQUFPO0VBQ1AsS0FBSyxrQkFBa0I7Ozs7Ozs7O0tBU2IscUJBQXFCLFVBQVUsY0FDeEMsMkJBQTJCLGNBQWMsS0FBSzs7O0tDUHJDLGtCQUFrQixhQUFhLGdCQUFnQjs7Ozs7VUFNMUM7R0FDZixZQUFZLGFBQWEsOEJBQThCO0dBQ3ZELFVBQVUsUUFBUSxvQkFBb0IsS0FBSyxHQUFHLGFBQWEscUJBQXFCLEtBQUssY0FBYztHQUNuRyxnQkFBZ0IsdUJBQXVCLEtBQUssR0FBRyxhQUFhLFFBQVEsc0JBQXNCLE1BQU0sc0JBQXNCOztLQUc1RyxpQkFBaUI7aUJBQ2IscUJBQXFCLGtCQUFrQixnQkFBZ0IsUUFBUSxjQUFjIn0=
242
+ export type { Aria, HtmlElementProperties, SvgElementProperties, SvgTagElement, SvgTagName };
243
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMuZC5tdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2FyaWEubXRzIiwiLi4vc3JjL2NoaWxkcmVuLm10cyIsIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9lbGVtZW50LXR5cGUtdXRpbGl0aWVzLm10cyIsIi4uL3NyYy9odG1sLWVsZW1lbnQtcHJvcGVydGllcy5tdHMiLCIuLi9zcmMvc3ZnLWVsZW1lbnQtcHJvcGVydGllcy5tdHMiLCIuLi9zcmMvZWxlbWVudC1mYWN0b3J5Lm10cyJdLCJtYXBwaW5ncyI6Ijs7S0FBSyxVQUFVLG9CQUFvQix1QkFBdUIsU0FBUyxhQUFhLFFBQVE7S0FFbkYsMEJBQ0gsV0FBVyxhQUFhLFVBQVUsMkJBQTJCLG1CQUFtQjtLQUk3RTs7RUFFSiw0QkFBNEI7O0VBRTVCLG9CQUFvQjs7RUFFcEIsdUJBQXVCOztFQUV2QixtQkFBbUI7O0VBRW5CLHdCQUF3Qjs7RUFFeEIsa0JBQWtCOztFQUVsQixzQkFBc0I7O0VBRXRCLGdCQUFnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F3QkwsT0FBTyx1QkFBdUI7Ozs7Ozs7O1lDMUM5QixlQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBZ0NmLGtCQUFrQixNQUFNLGdCQUFnQjs7Ozs7Ozs7WUNoQ3hDOzs7Ozs7Ozs7OztZQVlBLGFBQWEsTUFBTSxZQUFZOzs7Ozs7Ozs7OztZQVkvQixxQkFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3dCQTJCakIsU0FBUyxXQUFXLFdBQVc7d0JBQy9CLFNBQVMscUNBQXFDLFdBQVcsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3dCQXNDcEUsV0FBVyx3Q0FBd0MsWUFBWSxNQUFNLFlBQVk7d0JBQ2pGLGNBQWMsWUFBWSxNQUFNLFlBQVk7d0JBQzVDLFdBQVcsWUFBWSxxQkFBcUI7OztLQ2pHaEQsU0FBUyxHQUFHLEdBQUcsSUFBSSxHQUFHLGVBQWUsUUFBUSxVQUFVLHFCQUFxQixRQUFRLFVBQVUsYUFBYSxJQUFJO0tBQy9HLGdCQUFnQixRQUMxQixXQUFXLE1BQU0sWUFBWSxLQUFLLElBQUksRUFBRSxvQkFBbUIsS0FBSyxJQUFJLEVBQUUsY0FBYSxZQUM3RTtLQUNJLGFBQWEsUUFDdkIsV0FBVyxJQUFJLFlBQVksRUFBRSxpQkFBZ0IsbUNBQWtDLG1CQUN6RTtLQUNJLGNBQWMsUUFBUSxXQUFXLElBQUksMEJBQTBCLG1CQUFrQjs7S0FHakYsaUJBQWlCLFdBQVcsdUJBQXVCLG9CQUFvQixvQkFBb0IsOEJBQThCOzs7S0NIaEksd0JBQXdCLGlCQUFpQixlQUFlLEtBQzVELFVBQ0UsZ0JBQWdCLFlBQ2hCLGFBQWEsWUFDYixjQUFjLHFCQUNkLGNBQWM7S0FJWiw0QkFBNEIsaUJBQWlCLGVBQy9DLFFBQVEsd0JBQXdCO0dBR2hDO0VBQ0QsV0FBVztFQUNYLFVBQVU7RUFDVixRQUFRO0VBQ1IsT0FBTztFQUNQLEtBQUssa0JBQWtCOzs7Ozs7Ozs7O0tBV2Isc0JBQXNCLHVCQUF1Qix5QkFDdEQsNEJBQTRCLHNCQUFzQjs7Ozs7Ozs7S0N6QnpDLDRCQUE0QixjQUFjOztLQUcxQyxjQUFjLFVBQVUsY0FDakMsa0JBQWtCLGdCQUNsQix1QkFBdUIsZ0JBQWdCLHlCQUF5QixxQkFBcUI7S0FHbkYsdUJBQXVCLGlCQUFpQixjQUFjLEtBQzFELFVBQ0UsZ0JBQWdCLFlBQ2hCLGFBQWEsWUFDYixjQUFjLHFCQUNkLGNBQWM7S0FJWiwyQkFBMkIsaUJBQWlCLGNBQzlDLFFBQVEsdUJBQXVCO0dBRy9CO0VBQ0QsVUFBVTtFQUNWLFFBQVE7RUFDUixXQUFXO0VBQ1gsT0FBTztFQUNQLEtBQUssa0JBQWtCOzs7Ozs7OztLQVNiLHFCQUFxQixVQUFVLGNBQ3hDLDJCQUEyQixjQUFjLEtBQUs7OztZQ1ByQyxrQkFBa0IsYUFBYSxnQkFBZ0I7Ozs7O2lCQU0xQztHQUNmLFlBQVksYUFBYSw4QkFBOEI7R0FDdkQsVUFBVSxRQUFRLG9CQUFvQixLQUFLLEdBQUcsYUFBYSxxQkFBcUIsS0FBSyxjQUFjO0dBQ25HLGdCQUFnQix1QkFBdUIsS0FBSyxHQUFHLGFBQWEsUUFBUSxzQkFBc0IsTUFBTSxzQkFBc0I7O1lBRzVHLGlCQUFpQjt3QkFDYixxQkFBcUIsa0JBQWtCLGdCQUFnQixRQUFRLGNBQWMifQ==
package/dist/elements.mjs CHANGED
@@ -1,8 +1,24 @@
1
1
  //#region src/classes.mts
2
- function cssClass(className, visible = true) {
2
+ function cssClass(...arguments_) {
3
+ if (arguments_.length === 1) return arguments_[0];
4
+ const [visible, className] = arguments_;
3
5
  if (visible !== true) return;
4
6
  return className;
5
7
  }
8
+ function cssClasses(...arguments_) {
9
+ const [first, ...rest] = arguments_;
10
+ if (typeof first === "string") return joinClassNames([first, ...rest]);
11
+ if (first === void 0 || first === null || typeof first === "boolean") {
12
+ if (first !== true) return;
13
+ return joinClassNames(rest);
14
+ }
15
+ return joinClassNames(Object.entries(first).filter(([, visible]) => visible === true).map(([className]) => className));
16
+ }
17
+ function joinClassNames(classNames) {
18
+ const className = classNames.filter(Boolean).join(" ");
19
+ if (!className) return;
20
+ return className;
21
+ }
6
22
  //#endregion
7
23
  //#region src/aria.mts
8
24
  const ariaIdReferenceAttributes = {
@@ -62,11 +78,11 @@ function buildClassList(classes) {
62
78
  return { className: String(classes) };
63
79
  }
64
80
  function isWritableDomProperty(element, key) {
65
- let proto = element;
66
- while (proto) {
67
- const desc = Object.getOwnPropertyDescriptor(proto, key);
81
+ let prototype = element;
82
+ while (prototype) {
83
+ const desc = Object.getOwnPropertyDescriptor(prototype, key);
68
84
  if (desc) return !!(desc.writable || desc.set);
69
- proto = Object.getPrototypeOf(proto);
85
+ prototype = Object.getPrototypeOf(prototype);
70
86
  }
71
87
  return false;
72
88
  }
@@ -107,10 +123,13 @@ function createElementFactory(constructElement, signal) {
107
123
  return createElement;
108
124
  }
109
125
  function appendChildren(element, children) {
110
- if (Array.isArray(children)) for (const child of children) element.append(child);
126
+ if (Array.isArray(children)) for (const child of children) {
127
+ if (child === void 0 || child === null) continue;
128
+ element.append(child);
129
+ }
111
130
  else if (children) element.append(children);
112
131
  }
113
132
  //#endregion
114
- export { createElementFactory, cssClass };
133
+ export { createElementFactory, cssClass, cssClasses };
115
134
 
116
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMubWpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9hcmlhLm10cyIsIi4uL3NyYy9lbGVtZW50LWZhY3RvcnkubXRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzaW5nbGUgQ1NTIGNsYXNzIHZhbHVlLiBGYWxzeSB2YXJpYW50cyAoYHVuZGVmaW5lZGAgYW5kIGBudWxsYCkgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IGZpbHRlcmVkIG91dCB3aGVuIGJ1aWxkaW5nIGEgY2xhc3MgbGlzdCwgc28gY29uZGl0aW9uYWxcbiAqIGNsYXNzZXMgY2FuIGJlIGV4cHJlc3NlZCB3aXRob3V0IGV4cGxpY2l0IGd1YXJkcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3MgPSBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsXG5cbi8qKlxuICogT25lIG9yIG1vcmUgQ1NTIGNsYXNzIHZhbHVlcyBhY2NlcHRlZCBieSB0aGUgYGNsYXNzZXNgIHByb3Agb2YgZXZlcnkgSFRNTFxuICogZWxlbWVudCBjcmVhdGVkIHZpYSBgY3JlYXRlKClgIG9yIGBhcHBlbmQoKWAuXG4gKlxuICogLSBBIHNpbmdsZSBzdHJpbmcgaXMgdXNlZCBhcy1pcy5cbiAqIC0gQW4gYXJyYXkgb2Yge0BsaW5rIENzc0NsYXNzfSB2YWx1ZXMgaXMgam9pbmVkIHdpdGggc3BhY2VzIGFmdGVyIGZhbHN5XG4gKiAgIGVudHJpZXMgYXJlIHJlbW92ZWQuXG4gKlxuICogQHNlZSB7QGxpbmsgY3NzQ2xhc3N9IGZvciBjb21wb3NpbmcgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIENzc0NsYXNzZXMgPSBBcnJheTxDc3NDbGFzcz4gfCBDc3NDbGFzc1xuXG4vKipcbiAqIFJldHVybnMgYGNsYXNzTmFtZWAgd2hlbiBgdmlzaWJsZWAgaXMgdHJ1dGh5LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gKlxuICogRGVzaWduZWQgdG8gY29tcG9zZSBjbGVhbmx5IHdpdGgge0BsaW5rIENzc0NsYXNzZXN9OiBmYWxzeSB2YWx1ZXMgYXJlXG4gKiBmaWx0ZXJlZCBvdXQgYXV0b21hdGljYWxseSwgc28gc3RhdGljIGFuZCBjb25kaXRpb25hbCBjbGFzc2VzIGNhbiBiZSBtaXhlZFxuICogaW4gYSBzaW5nbGUgYXJyYXkgd2l0aG91dCBicmFuY2hpbmcuXG4gKlxuICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkuXG4gKiBAcGFyYW0gdmlzaWJsZSAtIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCkgdGhlIGNsYXNzIGlzIHJldHVybmVkOyBhbnkgb3RoZXJcbiAqICAgdmFsdWUgcHJvZHVjZXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBhcHBlbmQoJ2J1dHRvbicsIHtcbiAqICAgY2xhc3NlczogW1xuICogICAgICdidG4nLFxuICogICAgIGNzc0NsYXNzKCdidG4tLWFjdGl2ZScsIGlzQWN0aXZlKSxcbiAqICAgICBjc3NDbGFzcygnYnRuLS1kaXNhYmxlZCcsIGlzRGlzYWJsZWQpLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzKGNsYXNzTmFtZTogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBDc3NDbGFzcyk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBDc3NDbGFzcywgdmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzKGNsYXNzTmFtZTogQ3NzQ2xhc3MsIHZpc2libGU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkID0gdHJ1ZSk6IENzc0NsYXNzIHtcblx0aWYgKHZpc2libGUgIT09IHRydWUpIHJldHVyblxuXHRyZXR1cm4gY2xhc3NOYW1lXG59XG4iLCJ0eXBlIFN0cmlwQXJpYTxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgYXJpYSR7aW5mZXIgUmVzdH1gID8gVW5jYXBpdGFsaXplPFJlc3Q+IDogU1xuXG50eXBlIEFyaWFTdHJpbmdQcm9wZXJ0aWVzID0ge1xuXHRbUCBpbiBrZXlvZiBBUklBTWl4aW4gYXMgQVJJQU1peGluW1BdIGV4dGVuZHMgc3RyaW5nIHwgbnVsbCA/IFN0cmlwQXJpYTxzdHJpbmcgJiBQPiA6IG5ldmVyXT86IHN0cmluZyB8IG51bGxcbn1cblxuLy8gUHJvcGVydGllcyB0aGF0IG9ubHkgZXhpc3QgYXMgRWxlbWVudFtdIGluIEFSSUFNaXhpbi4gQWNjZXB0cyBhIHN0cmluZyBJRCBvciBhbiBFbGVtZW50IGRpcmVjdGx5LlxudHlwZSBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzID0ge1xuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50J119ICovXG5cdGFjdGl2ZURlc2NlbmRhbnQ/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUNvbnRyb2xzRWxlbWVudHMnXX0gKi9cblx0Y29udHJvbHM/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnXX0gKi9cblx0ZGVzY3JpYmVkQnk/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYURldGFpbHNFbGVtZW50cyddfSAqL1xuXHRkZXRhaWxzPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cyddfSAqL1xuXHRlcnJvck1lc3NhZ2U/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUZsb3dUb0VsZW1lbnRzJ119ICovXG5cdGZsb3dUbz86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJ119ICovXG5cdGxhYmVsbGVkQnk/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYU93bnNFbGVtZW50cyddfSAqL1xuXHRvd25zPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcbn1cblxuLyoqXG4gKiBTaGFwZSBvZiB0aGUgYGFyaWFgIHByb3Agb24gYGVsZW1lbnQoLi4uKWAuIEFjY2VwdHMgZXZlcnkgQVJJQSBhdHRyaWJ1dGVcbiAqIGRlZmluZWQgb24gYEFSSUFNaXhpbmAsIHdpdGggdGhlIGBhcmlhYCBwcmVmaXggc3RyaXBwZWQgKHNvIGBhcmlhLWxhYmVsYFxuICogYmVjb21lcyBgbGFiZWxgLCBgYXJpYS1kZXNjcmliZWRieWAgYmVjb21lcyBgZGVzY3JpYmVkQnlgKS5cbiAqXG4gKiBGb3IgSUQtcmVmZXJlbmNlIGF0dHJpYnV0ZXMgKGBhcmlhLWxhYmVsbGVkYnlgLCBgYXJpYS1jb250cm9sc2AsIGV0Yy4pIHRoZVxuICogdmFsdWUgY2FuIGJlIGEgc3RyaW5nIElEIG9yIGFuIGBFbGVtZW50YCByZWZlcmVuY2UuIEVsZW1lbnQgcmVmZXJlbmNlcyBhcmVcbiAqIHNldCB2aWEgdGhlIElETCByZWZsZWN0aW9uIHByb3BlcnR5IHdoZW4gc3VwcG9ydGVkLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gKiBhdHRyaWJ1dGUgdmFsdWUgb3RoZXJ3aXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZWxlbWVudCgnYnV0dG9uJywge1xuICogICBhcmlhOiB7XG4gKiAgICAgbGFiZWw6ICdTYXZlJyxcbiAqICAgICBkZXNjcmliZWRCeTogaGVscFRleHRFbGVtZW50LFxuICogICAgIHByZXNzZWQ6ICdmYWxzZScsXG4gKiAgIH0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFyaWEgPSBBcmlhU3RyaW5nUHJvcGVydGllcyAmIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNcblxuY29uc3QgYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlczogUmVjb3JkPGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXMsIHN0cmluZz4gPSB7XG5cdGFjdGl2ZURlc2NlbmRhbnQ6ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLFxuXHRjb250cm9sczogJ2FyaWEtY29udHJvbHMnLFxuXHRkZXNjcmliZWRCeTogJ2FyaWEtZGVzY3JpYmVkYnknLFxuXHRkZXRhaWxzOiAnYXJpYS1kZXRhaWxzJyxcblx0ZXJyb3JNZXNzYWdlOiAnYXJpYS1lcnJvcm1lc3NhZ2UnLFxuXHRmbG93VG86ICdhcmlhLWZsb3d0bycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhLWxhYmVsbGVkYnknLFxuXHRvd25zOiAnYXJpYS1vd25zJyxcbn1cblxuLy8gYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50IGlzIHNpbmd1bGFyOyB0aGUgcmVzdCB0YWtlIEVsZW1lbnRbXVxuY29uc3QgYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXM6IFJlY29yZDxrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzLCBzdHJpbmc+ID0ge1xuXHRhY3RpdmVEZXNjZW5kYW50OiAnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50Jyxcblx0Y29udHJvbHM6ICdhcmlhQ29udHJvbHNFbGVtZW50cycsXG5cdGRlc2NyaWJlZEJ5OiAnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnLFxuXHRkZXRhaWxzOiAnYXJpYURldGFpbHNFbGVtZW50cycsXG5cdGVycm9yTWVzc2FnZTogJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cycsXG5cdGZsb3dUbzogJ2FyaWFGbG93VG9FbGVtZW50cycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJyxcblx0b3duczogJ2FyaWFPd25zRWxlbWVudHMnLFxufVxuXG5mdW5jdGlvbiBzZXRQcm9wZXJ0eShlbGVtZW50OiBFbGVtZW50LCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcblx0KGVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFyaWFQcm9wZXJ0aWVzKGFyaWE6IEFyaWEgfCB1bmRlZmluZWQsIGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcblx0aWYgKCFhcmlhKSByZXR1cm5cblx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJpYSkpIHtcblx0XHRpZiAoIShrZXkgaW4gYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlcykpIHtcblx0XHRcdGNvbnN0IGRvbUtleSA9IGBhcmlhJHtrZXlbMF0udG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBkb21LZXksIHZhbHVlKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdFx0Y29uc3QgaWRsS2V5ID0gYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBpZGxLZXksIGlkbEtleS5lbmRzV2l0aCgnRWxlbWVudHMnKSA/IFt2YWx1ZV0gOiB2YWx1ZSlcblx0XHRcdGNvbnRpbnVlXG5cdFx0fVxuXHRcdGVsZW1lbnQuc2V0QXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdLCB2YWx1ZSlcblx0fVxufVxuIiwiaW1wb3J0IHsgRWxlbWVudE9uSGFuZGxlcnMgfSBmcm9tICdAcm9vdGVkL2V2ZW50cydcblxuaW1wb3J0IHsgdHlwZSBBcmlhLCBidWlsZEFyaWFQcm9wZXJ0aWVzIH0gZnJvbSAnLi9hcmlhLm10cydcbmltcG9ydCB7IENzc0NsYXNzZXMgfSBmcm9tICcuL2NsYXNzZXMubXRzJ1xuaW1wb3J0IHsgSHRtbEVsZW1lbnRQcm9wZXJ0aWVzIH0gZnJvbSAnLi9odG1sLWVsZW1lbnQtcHJvcGVydGllcy5tdHMnXG5pbXBvcnQgeyBTdmdFbGVtZW50UHJvcGVydGllcywgU3ZnVGFnRWxlbWVudCwgU3ZnVGFnTmFtZSB9IGZyb20gJy4vc3ZnLWVsZW1lbnQtcHJvcGVydGllcy5tdHMnXG5cbmZ1bmN0aW9uIGJ1aWxkT25IYW5kbGVyczxURWxlbWVudCBleHRlbmRzIEVsZW1lbnQ+KFxuXHRvbjogRWxlbWVudE9uSGFuZGxlcnM8VEVsZW1lbnQ+IHwgdW5kZWZpbmVkLFxuXHRlbGVtZW50OiBURWxlbWVudCxcblx0c2lnbmFsOiBBYm9ydFNpZ25hbCxcbik6IHZvaWQge1xuXHRpZiAoIW9uKSByZXR1cm5cblx0Zm9yIChjb25zdCBba2V5LCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhvbikpIHtcblx0XHRpZiAoIWhhbmRsZXIpIGNvbnRpbnVlXG5cdFx0ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0a2V5LFxuXHRcdFx0ZXZlbnQgPT4gdm9pZCAoaGFuZGxlciBhcyAoZXZlbnQ/OiBFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pKGV2ZW50KSxcblx0XHRcdHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB1bmRlZmluZWQsXG5cdFx0KVxuXHR9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2xhc3NMaXN0KGNsYXNzZXM6IENzc0NsYXNzZXMgfCB1bmRlZmluZWQpIHtcblx0aWYgKGNsYXNzZXMgPT09IG51bGwgfHwgY2xhc3NlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4ge31cblx0aWYgKEFycmF5LmlzQXJyYXkoY2xhc3NlcykpIHJldHVybiB7IGNsYXNzTmFtZTogY2xhc3Nlcy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpIH1cblxuXHRyZXR1cm4geyBjbGFzc05hbWU6IFN0cmluZyhjbGFzc2VzKSB9XG59XG5cbmZ1bmN0aW9uIGlzV3JpdGFibGVEb21Qcm9wZXJ0eShlbGVtZW50OiBFbGVtZW50LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRsZXQgcHJvdG86IG9iamVjdCB8IG51bGwgPSBlbGVtZW50XG5cdHdoaWxlIChwcm90bykge1xuXHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBrZXkpXG5cdFx0aWYgKGRlc2MpIHJldHVybiAhIShkZXNjLndyaXRhYmxlIHx8IGRlc2Muc2V0KVxuXHRcdHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSBhcyBvYmplY3QgfCBudWxsXG5cdH1cblx0cmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCB0eXBlIEVsZW1lbnRDcmVhdG9yID0gKGtleTogc3RyaW5nLCBucz86IHN0cmluZykgPT4gRWxlbWVudFxuXG4vKipcbiAqIFRoZSBvdmVybG9hZGVkIGZ1bmN0aW9uIHR5cGUgcmV0dXJuZWQgYnkge0BsaW5rIGNyZWF0ZUVsZW1lbnRGYWN0b3J5fS5cbiAqIEFjY2VwdHMgSFRNTCBvciBTVkcgdGFnIG5hbWVzIGFuZCByZXR1cm5zIHRoZSBtYXRjaGluZyBlbGVtZW50IHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudENyZWF0b3JGdW5jdGlvbiB7XG5cdCh0YWc6ICdzdmcnLCBwcm9wZXJ0aWVzPzogU3ZnRWxlbWVudFByb3BlcnRpZXM8J3N2Zyc+KTogU1ZHU1ZHRWxlbWVudFxuXHQ8SyBleHRlbmRzIEV4Y2x1ZGU8U3ZnVGFnTmFtZSwgJ3N2Zyc+Pih0YWc6IEssIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczxLPik6IFN2Z1RhZ0VsZW1lbnQ8Sz5cblx0PEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXA+KHRhZzogSywgcHJvcGVydGllcz86IE5vSW5mZXI8SHRtbEVsZW1lbnRQcm9wZXJ0aWVzPEs+Pik6IEhUTUxFbGVtZW50VGFnTmFtZU1hcFtLXVxufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50RmFjdG9yeSA9IEVsZW1lbnRDcmVhdG9yRnVuY3Rpb25cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50RmFjdG9yeShjb25zdHJ1Y3RFbGVtZW50OiBFbGVtZW50Q3JlYXRvciwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEVsZW1lbnRDcmVhdG9yRnVuY3Rpb24ge1xuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBIVE1MIG9yIFNWRyBlbGVtZW50LiBUaGUgZWxlbWVudCBpcyBOT1QgYXBwZW5kZWQgdG8gdGhlXG5cdCAqIGRvY3VtZW50OyBwYXNzIGl0IHRvIGBhcHBlbmRgLCBgcHJlcGVuZGAsIG9yIHNldCBpdCBhcyBgY2hpbGRyZW5gIG9mXG5cdCAqIGFub3RoZXIgZWxlbWVudC5cblx0ICpcblx0ICogSFRNTCB0YWdzIHVzZSB0aGUgcmVndWxhciBgSFRNTEVsZW1lbnRUYWdOYW1lTWFwYCBrZXlzLiBTVkcgdGFncyB1c2Vcblx0ICogYCdzdmcnYCBmb3IgdGhlIHJvb3QgYW5kIGAnc3ZnOjxuYW1lPidgIGZvciBldmVyeXRoaW5nIGVsc2UgKHRoZSBwcmVmaXhcblx0ICoga2VlcHMgdGhlbSBmcm9tIGNvbGxpZGluZyB3aXRoIHNhbWUtbmFtZWQgSFRNTCB0YWdzKS5cblx0ICpcblx0ICogUHJvcGVydGllczpcblx0ICogLSBgY2xhc3Nlc2A6IGEgY2xhc3Mgc3RyaW5nIG9yIGEge0BsaW5rIENzc0NsYXNzZXN9IGFycmF5LiBGYWxzeVxuXHQgKiAgIGVudHJpZXMgYXJlIGZpbHRlcmVkIG91dC5cblx0ICogLSBgYXJpYWA6IEFSSUEgYXR0cmlidXRlcy4gQWNjZXB0cyBzdHJpbmcgSURzIG9yIGBFbGVtZW50YCByZWZlcmVuY2VzXG5cdCAqICAgZm9yIElETCByZWZsZWN0aW9uIHByb3BlcnRpZXMgKGUuZy4gYGFyaWEtbGFiZWxsZWRieWApLlxuXHQgKiAtIGBvbmA6IGFuIG9iamVjdCBvZiBldmVudCBoYW5kbGVycy4gRWFjaCBsaXN0ZW5lciBpcyByZW1vdmVkIHdoZW4gdGhlXG5cdCAqICAgY29tcG9uZW50IHVubW91bnRzLlxuXHQgKiAgIGBjaGlsZHJlbmA6IGEgc2luZ2xlIGBOb2RlYCBvciBhbiBhcnJheTsgYXBwZW5kZWQgaW4gb3JkZXIuXG5cdCAqIC0gT3RoZXIgcHJvcHMgYXJlIHNldCBhcyBET00gcHJvcGVydGllcyAoc28gYGh0bWxGb3JgIG5vdCBgZm9yYCxcblx0ICogICBgcmVhZE9ubHlgIG5vdCBgcmVhZG9ubHlgKS4gT24gU1ZHLCBhbnl0aGluZyB0aGF0IGlzbid0IGEgd3JpdGFibGVcblx0ICogICBET00gcHJvcGVydHkgZmFsbHMgYmFjayB0byBgc2V0QXR0cmlidXRlYC5cblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogYGBgdHNcblx0ICogY29uc3QgZGl2ID0gZWxlbWVudCgnZGl2Jywge1xuXHQgKiAgIGNsYXNzZXM6ICdjYXJkJyxcblx0ICogICBhcmlhOiB7IGxhYmVsOiAnQ2FyZCcsIGxhYmVsbGVkQnk6IGhlYWRpbmdFbCB9LFxuXHQgKiAgIGNoaWxkcmVuOiBbXG5cdCAqICAgICBlbGVtZW50KCdoMicsIHsgdGV4dENvbnRlbnQ6ICdUaXRsZScgfSksXG5cdCAqICAgICBlbGVtZW50KCdwJywgIHsgdGV4dENvbnRlbnQ6ICdCb2R5JyAgfSksXG5cdCAqICAgXSxcblx0ICogfSlcblx0ICpcblx0ICogY29uc3QgaWNvbiA9IGVsZW1lbnQoJ3N2ZycsIHtcblx0ICogICB2aWV3Qm94OiAnMCAwIDI0IDI0Jyxcblx0ICogICBhcmlhOiB7IGhpZGRlbjogJ3RydWUnIH0sXG5cdCAqICAgY2hpbGRyZW46IGVsZW1lbnQoJ3N2Zzp1c2UnLCB7IGhyZWY6IHNwcml0ZVVybCB9KSxcblx0ICogfSlcblx0ICogYGBgXG5cdCAqL1xuXHRmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZzogJ3N2ZycsIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczwnc3ZnJz4pOiBTVkdTVkdFbGVtZW50XG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQ8SyBleHRlbmRzIEV4Y2x1ZGU8U3ZnVGFnTmFtZSwgJ3N2Zyc+Pih0YWc6IEssIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczxLPik6IFN2Z1RhZ0VsZW1lbnQ8Sz5cblx0ZnVuY3Rpb24gY3JlYXRlRWxlbWVudDxLRWxlbWVudCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcD4odGFnOiBLRWxlbWVudCwgcHJvcGVydGllcz86IE5vSW5mZXI8SHRtbEVsZW1lbnRQcm9wZXJ0aWVzPEtFbGVtZW50Pj4pOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS0VsZW1lbnRdXG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IEVsZW1lbnQge1xuXHRcdGlmICh0YWcgPT09ICdzdmcnIHx8IHRhZy5zdGFydHNXaXRoKCdzdmc6JykpIHtcblx0XHRcdGNvbnN0IGFjdHVhbFRhZyA9IHRhZyA9PT0gJ3N2ZycgPyAnc3ZnJyA6IHRhZy5zbGljZSg0KVxuXHRcdFx0Y29uc3QgeyBjbGFzc2VzLCBjaGlsZHJlbiwgYXJpYSwgb24sIHN0eWxlLCAuLi5hdHRyaWJ1dGVzIH0gPSBwcm9wZXJ0aWVzID8/IHt9XG5cdFx0XHRjb25zdCBuZXdFbGVtZW50ID0gY29uc3RydWN0RWxlbWVudChhY3R1YWxUYWcsICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpIGFzIFNWR0VsZW1lbnRcblxuXHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcblx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIGNvbnRpbnVlXG5cdFx0XHRcdGlmIChpc1dyaXRhYmxlRG9tUHJvcGVydHkobmV3RWxlbWVudCwga2V5KSkge1xuXHRcdFx0XHRcdDsobmV3RWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWVcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0XHRuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgeyBjbGFzc05hbWUgfSA9IGJ1aWxkQ2xhc3NMaXN0KGNsYXNzZXMgYXMgQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZClcblx0XHRcdGlmIChjbGFzc05hbWUpIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIGNsYXNzTmFtZSlcblxuXHRcdFx0aWYgKHN0eWxlKSBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXHRcdFx0YnVpbGRBcmlhUHJvcGVydGllcyhhcmlhIGFzIEFyaWEgfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQpXG5cdFx0XHRidWlsZE9uSGFuZGxlcnMob24gYXMgRWxlbWVudE9uSGFuZGxlcnM8RWxlbWVudD4gfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQsIHNpZ25hbClcblxuXHRcdFx0YXBwZW5kQ2hpbGRyZW4obmV3RWxlbWVudCwgY2hpbGRyZW4gYXMgQXJyYXk8Tm9kZSB8IHN0cmluZz4gfCBOb2RlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKVxuXG5cdFx0XHRyZXR1cm4gbmV3RWxlbWVudFxuXHRcdH1cblxuXHRcdGNvbnN0IHsgYXJpYSwgY2hpbGRyZW4sIGNsYXNzZXMsIG9uLCBzdHlsZSwgLi4uYXNzaWduYWJsZVByb3BlcnRpZXMgfSA9IHByb3BlcnRpZXMgPz8ge31cblx0XHRjb25zdCBuZXdFbGVtZW50ID0gY29uc3RydWN0RWxlbWVudCh0YWcpIGFzIEhUTUxFbGVtZW50XG5cblx0XHRjb25zdCB7IGNsYXNzTmFtZSB9ID0gYnVpbGRDbGFzc0xpc3QoY2xhc3NlcyBhcyBDc3NDbGFzc2VzIHwgdW5kZWZpbmVkKVxuXHRcdGlmIChjbGFzc05hbWUpIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lXG5cblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhc3NpZ25hYmxlUHJvcGVydGllcykpIHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSBjb250aW51ZVxuXHRcdFx0aWYgKGlzV3JpdGFibGVEb21Qcm9wZXJ0eShuZXdFbGVtZW50LCBrZXkpKSB7XG5cdFx0XHRcdDsobmV3RWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWVcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuXHRcdFx0XHRuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHN0eWxlKSBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXHRcdGJ1aWxkQXJpYVByb3BlcnRpZXMoYXJpYSBhcyBBcmlhIHwgdW5kZWZpbmVkLCBuZXdFbGVtZW50KVxuXHRcdGJ1aWxkT25IYW5kbGVycyhvbiBhcyBFbGVtZW50T25IYW5kbGVyczxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQsIHNpZ25hbClcblx0XHRhcHBlbmRDaGlsZHJlbihuZXdFbGVtZW50LCBjaGlsZHJlbiBhcyBBcnJheTxOb2RlIHwgc3RyaW5nPiB8IE5vZGUgfCBzdHJpbmcgfCB1bmRlZmluZWQpXG5cblx0XHRyZXR1cm4gbmV3RWxlbWVudFxuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZUVsZW1lbnRcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWxlbWVudDogRWxlbWVudCwgY2hpbGRyZW46IEFycmF5PE5vZGUgfCBzdHJpbmc+IHwgTm9kZSB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRlbGVtZW50LmFwcGVuZChjaGlsZClcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAoY2hpbGRyZW4pIHtcblx0XHRlbGVtZW50LmFwcGVuZChjaGlsZHJlbilcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBNkNBLFNBQWdCLFNBQVMsV0FBcUIsVUFBc0MsTUFBZ0I7Q0FDbkcsSUFBSSxZQUFZLE1BQU07Q0FDdEIsT0FBTztBQUNSOzs7QUNDQSxNQUFNLDRCQUE2RTtDQUNsRixrQkFBa0I7Q0FDbEIsVUFBVTtDQUNWLGFBQWE7Q0FDYixTQUFTO0NBQ1QsY0FBYztDQUNkLFFBQVE7Q0FDUixZQUFZO0NBQ1osTUFBTTtBQUNQ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
135
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMubWpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9hcmlhLm10cyIsIi4uL3NyYy9lbGVtZW50LWZhY3RvcnkubXRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzaW5nbGUgQ1NTIGNsYXNzIHZhbHVlLiBGYWxzeSB2YXJpYW50cyAoYHVuZGVmaW5lZGAgYW5kIGBudWxsYCkgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IGZpbHRlcmVkIG91dCB3aGVuIGJ1aWxkaW5nIGEgY2xhc3MgbGlzdCwgc28gY29uZGl0aW9uYWxcbiAqIGNsYXNzZXMgY2FuIGJlIGV4cHJlc3NlZCB3aXRob3V0IGV4cGxpY2l0IGd1YXJkcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3MgPSBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsXG5cbi8qKlxuICogT25lIG9yIG1vcmUgQ1NTIGNsYXNzIHZhbHVlcyBhY2NlcHRlZCBieSB0aGUgYGNsYXNzZXNgIHByb3Agb2YgZXZlcnkgSFRNTFxuICogZWxlbWVudCBjcmVhdGVkIHZpYSBgY3JlYXRlKClgIG9yIGBhcHBlbmQoKWAuXG4gKlxuICogLSBBIHNpbmdsZSBzdHJpbmcgaXMgdXNlZCBhcy1pcy5cbiAqIC0gQW4gYXJyYXkgb2Yge0BsaW5rIENzc0NsYXNzfSB2YWx1ZXMgaXMgam9pbmVkIHdpdGggc3BhY2VzIGFmdGVyIGZhbHN5XG4gKiAgIGVudHJpZXMgYXJlIHJlbW92ZWQuXG4gKlxuICogQHNlZSB7QGxpbmsgY3NzQ2xhc3N9IGZvciBjb21wb3NpbmcgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIENzc0NsYXNzZXMgPSBBcnJheTxDc3NDbGFzcz4gfCBDc3NDbGFzc1xuXG4vKipcbiAqIENsYXNzIG5hbWVzIG1hcHBlZCB0byB3aGV0aGVyIHRoZXkgYXBwbHkuIE9ubHkgYHRydWVgIGluY2x1ZGVzIHRoZSBjbGFzcyxcbiAqIGFueXRoaW5nIGVsc2UgbGVhdmVzIGl0IG91dC5cbiAqXG4gKiBLZXlzIGhhdmUgdG8gYmUgc3RyaW5ncywgc28gdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBhIGBDc3NNb2R1bGVgIHZhbHVlIHRoYXRcbiAqIFR5cGVTY3JpcHQgdGhpbmtzIG1pZ2h0IGJlIGB1bmRlZmluZWRgLiBVc2UgdGhlIGxpc3QgZm9ybSBvZlxuICoge0BsaW5rIGNzc0NsYXNzZXN9IGZvciB0aG9zZS5cbiAqXG4gKiBAc2VlIHtAbGluayBjc3NDbGFzc2VzfSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgcmVhZHMgdGhpcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3NEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ+XG5cbi8qKlxuICogUmV0dXJucyBgY2xhc3NOYW1lYCB3aGVuIGB2aXNpYmxlYCBpcyBgdHJ1ZWAsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAqXG4gKiBEZXNpZ25lZCB0byBjb21wb3NlIGNsZWFubHkgd2l0aCB7QGxpbmsgQ3NzQ2xhc3Nlc306IGZhbHN5IHZhbHVlcyBhcmVcbiAqIGZpbHRlcmVkIG91dCBhdXRvbWF0aWNhbGx5LCBzbyBzdGF0aWMgYW5kIGNvbmRpdGlvbmFsIGNsYXNzZXMgY2FuIGJlIG1peGVkXG4gKiBpbiBhIHNpbmdsZSBhcnJheSB3aXRob3V0IGJyYW5jaGluZy4gQ2FsbGVkIHdpdGgganVzdCBhIGNsYXNzIG5hbWUgaXRcbiAqIHJldHVybnMgdGhhdCBuYW1lLCB3aGljaCBpcyBoYW5keSB3aGVuIHRoZSByZXN0IG9mIHRoZSBhcnJheSBpcyBjb25kaXRpb25hbC5cbiAqXG4gKiBUaGUgY29uZGl0aW9uIGNvbWVzIGZpcnN0LCBzYW1lIGFzIGBvcHRpb25hbCgpYC5cbiAqXG4gKiBAcGFyYW0gdmlzaWJsZSAtIFdoZW4gYHRydWVgIHRoZSBjbGFzcyBpcyByZXR1cm5lZCwgYW55IG90aGVyIHZhbHVlIHByb2R1Y2VzXG4gKiAgIGB1bmRlZmluZWRgLlxuICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBhcHBlbmQoJ2J1dHRvbicsIHtcbiAqICAgY2xhc3NlczogW1xuICogICAgICdidG4nLFxuICogICAgIGNzc0NsYXNzKGlzQWN0aXZlLCAnYnRuLS1hY3RpdmUnKSxcbiAqICAgICBjc3NDbGFzcyhpc0Rpc2FibGVkLCAnYnRuLS1kaXNhYmxlZCcpLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBDc3NDbGFzcyk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3ModmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIGNsYXNzTmFtZTogQ3NzQ2xhc3MpOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzKC4uLmFyZ3VtZW50c186IFtDc3NDbGFzc10gfCBbYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIENzc0NsYXNzXSk6IENzc0NsYXNzIHtcblx0aWYgKGFyZ3VtZW50c18ubGVuZ3RoID09PSAxKSByZXR1cm4gYXJndW1lbnRzX1swXVxuXG5cdGNvbnN0IFt2aXNpYmxlLCBjbGFzc05hbWVdID0gYXJndW1lbnRzX1xuXHRpZiAodmlzaWJsZSAhPT0gdHJ1ZSkgcmV0dXJuXG5cdHJldHVybiBjbGFzc05hbWVcbn1cblxuLyoqXG4gKiBKb2lucyBzZXZlcmFsIGNsYXNzIG5hbWVzIGludG8gb25lIHtAbGluayBDc3NDbGFzc30sIGRyb3BwaW5nIHRoZSBmYWxzeVxuICogb25lcy4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIG5vdGhpbmcgaXMgbGVmdCwgc28gdGhlIHJlc3VsdCBkaXNhcHBlYXJzXG4gKiBmcm9tIGEgYGNsYXNzZXNgIGFycmF5IGluc3RlYWQgb2YgYWRkaW5nIGFuIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBUaHJlZSB3YXlzIHRvIGNhbGwgaXQ6XG4gKlxuICogLSBgY3NzQ2xhc3NlcygnYScsICdiJylgIGpvaW5zIHdoYXQgeW91IHBhc3MuXG4gKiAtIGBjc3NDbGFzc2VzKHZpc2libGUsICdhJywgJ2InKWAgam9pbnMgdGhlbSBvbmx5IHdoZW4gYHZpc2libGVgIGlzIGB0cnVlYC5cbiAqIC0gYGNzc0NsYXNzZXMoeyBhOiB0cnVlLCBiOiBmYWxzZSB9KWAga2VlcHMgdGhlIGtleXMgbWFwcGVkIHRvIGB0cnVlYC5cbiAqXG4gKiBXYXRjaCBvdXQgZm9yIG9uZSBvdmVybGFwOiBhIGxlYWRpbmcgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGlzIHJlYWQgYXMgdGhlXG4gKiBjb25kaXRpb24sIHNvIGBjc3NDbGFzc2VzKHVuZGVmaW5lZCwgJ2EnKWAgaXMgYHVuZGVmaW5lZGAgYW5kIG5vdCBgJ2EnYC5cbiAqIEEgY2xhc3MgbmFtZSB0aGF0IG1pZ2h0IGJlIGB1bmRlZmluZWRgLCBsaWtlIGFueXRoaW5nIG9mZiBhIGBDc3NNb2R1bGVgLFxuICogYmVsb25ncyBhZnRlciB0aGUgY29uZGl0aW9uIHJhdGhlciB0aGFuIGZpcnN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogYXBwZW5kKCdidXR0b24nLCB7XG4gKiAgIGNsYXNzZXM6IFtcbiAqICAgICBjc3NDbGFzc2VzKHN0eWxlcy5idXR0b24sIHN0eWxlcy5yb3VuZGVkKSxcbiAqICAgICBjc3NDbGFzc2VzKGlzQWN0aXZlLCBzdHlsZXMuYWN0aXZlLCBzdHlsZXMucmFpc2VkKSxcbiAqICAgICBjc3NDbGFzc2VzKHtcbiAqICAgICAgICdidG4tLWRpc2FibGVkJzogaXNEaXNhYmxlZCxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzZXModmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmNsYXNzTmFtZXM6IEFycmF5PENzc0NsYXNzPik6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3NlcyguLi5jbGFzc05hbWVzOiBBcnJheTxDc3NDbGFzcz4pOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzZXMoY2xhc3NOYW1lczogQ3NzQ2xhc3NEaWN0aW9uYXJ5KTogQ3NzQ2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBjc3NDbGFzc2VzKFxuXHQuLi5hcmd1bWVudHNfOiBbQ3NzQ2xhc3NEaWN0aW9uYXJ5XSB8IFtib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uQXJyYXk8Q3NzQ2xhc3M+XSB8IEFycmF5PENzc0NsYXNzPlxuKTogQ3NzQ2xhc3Mge1xuXHRjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gYXJndW1lbnRzX1xuXG5cdGlmICh0eXBlb2YgZmlyc3QgPT09ICdzdHJpbmcnKSByZXR1cm4gam9pbkNsYXNzTmFtZXMoW2ZpcnN0LCAuLi5yZXN0XSBhcyBBcnJheTxDc3NDbGFzcz4pXG5cblx0aWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgZmlyc3QgPT09IG51bGwgfHwgdHlwZW9mIGZpcnN0ID09PSAnYm9vbGVhbicpIHtcblx0XHRpZiAoZmlyc3QgIT09IHRydWUpIHJldHVyblxuXHRcdHJldHVybiBqb2luQ2xhc3NOYW1lcyhyZXN0IGFzIEFycmF5PENzc0NsYXNzPilcblx0fVxuXG5cdHJldHVybiBqb2luQ2xhc3NOYW1lcyhPYmplY3Rcblx0XHQuZW50cmllcyhmaXJzdClcblx0XHQuZmlsdGVyKChbLCB2aXNpYmxlXSkgPT4gdmlzaWJsZSA9PT0gdHJ1ZSlcblx0XHQubWFwKChbY2xhc3NOYW1lXSkgPT4gY2xhc3NOYW1lKSlcbn1cblxuZnVuY3Rpb24gam9pbkNsYXNzTmFtZXMoY2xhc3NOYW1lczogQXJyYXk8Q3NzQ2xhc3M+KTogQ3NzQ2xhc3Mge1xuXHRjb25zdCBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJylcblx0aWYgKCFjbGFzc05hbWUpIHJldHVyblxuXHRyZXR1cm4gY2xhc3NOYW1lXG59XG4iLCJ0eXBlIFN0cmlwQXJpYTxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgYXJpYSR7aW5mZXIgUmVzdH1gID8gVW5jYXBpdGFsaXplPFJlc3Q+IDogU1xuXG50eXBlIEFyaWFTdHJpbmdQcm9wZXJ0aWVzID0ge1xuXHRbUCBpbiBrZXlvZiBBUklBTWl4aW4gYXMgQVJJQU1peGluW1BdIGV4dGVuZHMgc3RyaW5nIHwgbnVsbCA/IFN0cmlwQXJpYTxzdHJpbmcgJiBQPiA6IG5ldmVyXT86IHN0cmluZyB8IG51bGxcbn1cblxuLy8gUHJvcGVydGllcyB0aGF0IG9ubHkgZXhpc3QgYXMgRWxlbWVudFtdIGluIEFSSUFNaXhpbi4gQWNjZXB0cyBhIHN0cmluZyBJRCBvciBhbiBFbGVtZW50IGRpcmVjdGx5LlxudHlwZSBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzID0ge1xuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50J119ICovXG5cdGFjdGl2ZURlc2NlbmRhbnQ/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUNvbnRyb2xzRWxlbWVudHMnXX0gKi9cblx0Y29udHJvbHM/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnXX0gKi9cblx0ZGVzY3JpYmVkQnk/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYURldGFpbHNFbGVtZW50cyddfSAqL1xuXHRkZXRhaWxzPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cyddfSAqL1xuXHRlcnJvck1lc3NhZ2U/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUZsb3dUb0VsZW1lbnRzJ119ICovXG5cdGZsb3dUbz86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJ119ICovXG5cdGxhYmVsbGVkQnk/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYU93bnNFbGVtZW50cyddfSAqL1xuXHRvd25zPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcbn1cblxuLyoqXG4gKiBTaGFwZSBvZiB0aGUgYGFyaWFgIHByb3Agb24gYGVsZW1lbnQoLi4uKWAuIEFjY2VwdHMgZXZlcnkgQVJJQSBhdHRyaWJ1dGVcbiAqIGRlZmluZWQgb24gYEFSSUFNaXhpbmAsIHdpdGggdGhlIGBhcmlhYCBwcmVmaXggc3RyaXBwZWQgKHNvIGBhcmlhLWxhYmVsYFxuICogYmVjb21lcyBgbGFiZWxgLCBgYXJpYS1kZXNjcmliZWRieWAgYmVjb21lcyBgZGVzY3JpYmVkQnlgKS5cbiAqXG4gKiBGb3IgSUQtcmVmZXJlbmNlIGF0dHJpYnV0ZXMgKGBhcmlhLWxhYmVsbGVkYnlgLCBgYXJpYS1jb250cm9sc2AsIGV0Yy4pIHRoZVxuICogdmFsdWUgY2FuIGJlIGEgc3RyaW5nIElEIG9yIGFuIGBFbGVtZW50YCByZWZlcmVuY2UuIEVsZW1lbnQgcmVmZXJlbmNlcyBhcmVcbiAqIHNldCB2aWEgdGhlIElETCByZWZsZWN0aW9uIHByb3BlcnR5IHdoZW4gc3VwcG9ydGVkLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gKiBhdHRyaWJ1dGUgdmFsdWUgb3RoZXJ3aXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZWxlbWVudCgnYnV0dG9uJywge1xuICogICBhcmlhOiB7XG4gKiAgICAgbGFiZWw6ICdTYXZlJyxcbiAqICAgICBkZXNjcmliZWRCeTogaGVscFRleHRFbGVtZW50LFxuICogICAgIHByZXNzZWQ6ICdmYWxzZScsXG4gKiAgIH0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFyaWEgPSBBcmlhU3RyaW5nUHJvcGVydGllcyAmIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNcblxuY29uc3QgYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlczogUmVjb3JkPGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXMsIHN0cmluZz4gPSB7XG5cdGFjdGl2ZURlc2NlbmRhbnQ6ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLFxuXHRjb250cm9sczogJ2FyaWEtY29udHJvbHMnLFxuXHRkZXNjcmliZWRCeTogJ2FyaWEtZGVzY3JpYmVkYnknLFxuXHRkZXRhaWxzOiAnYXJpYS1kZXRhaWxzJyxcblx0ZXJyb3JNZXNzYWdlOiAnYXJpYS1lcnJvcm1lc3NhZ2UnLFxuXHRmbG93VG86ICdhcmlhLWZsb3d0bycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhLWxhYmVsbGVkYnknLFxuXHRvd25zOiAnYXJpYS1vd25zJyxcbn1cblxuLy8gYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50IGlzIHNpbmd1bGFyOyB0aGUgcmVzdCB0YWtlIEVsZW1lbnRbXVxuY29uc3QgYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXM6IFJlY29yZDxrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzLCBzdHJpbmc+ID0ge1xuXHRhY3RpdmVEZXNjZW5kYW50OiAnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50Jyxcblx0Y29udHJvbHM6ICdhcmlhQ29udHJvbHNFbGVtZW50cycsXG5cdGRlc2NyaWJlZEJ5OiAnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnLFxuXHRkZXRhaWxzOiAnYXJpYURldGFpbHNFbGVtZW50cycsXG5cdGVycm9yTWVzc2FnZTogJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cycsXG5cdGZsb3dUbzogJ2FyaWFGbG93VG9FbGVtZW50cycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJyxcblx0b3duczogJ2FyaWFPd25zRWxlbWVudHMnLFxufVxuXG5mdW5jdGlvbiBzZXRQcm9wZXJ0eShlbGVtZW50OiBFbGVtZW50LCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcblx0KGVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFyaWFQcm9wZXJ0aWVzKGFyaWE6IEFyaWEgfCB1bmRlZmluZWQsIGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcblx0aWYgKCFhcmlhKSByZXR1cm5cblx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJpYSkpIHtcblx0XHRpZiAoIShrZXkgaW4gYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlcykpIHtcblx0XHRcdGNvbnN0IGRvbUtleSA9IGBhcmlhJHtrZXlbMF0udG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBkb21LZXksIHZhbHVlKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdFx0Y29uc3QgaWRsS2V5ID0gYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBpZGxLZXksIGlkbEtleS5lbmRzV2l0aCgnRWxlbWVudHMnKSA/IFt2YWx1ZV0gOiB2YWx1ZSlcblx0XHRcdGNvbnRpbnVlXG5cdFx0fVxuXHRcdGVsZW1lbnQuc2V0QXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdLCB2YWx1ZSlcblx0fVxufVxuIiwiaW1wb3J0IHsgRWxlbWVudE9uSGFuZGxlcnMgfSBmcm9tICdAcm9vdGVkL2V2ZW50cydcblxuaW1wb3J0IHsgdHlwZSBBcmlhLCBidWlsZEFyaWFQcm9wZXJ0aWVzIH0gZnJvbSAnLi9hcmlhLm10cydcbmltcG9ydCB7IEVsZW1lbnRDaGlsZHJlbiB9IGZyb20gJy4vY2hpbGRyZW4ubXRzJ1xuaW1wb3J0IHsgQ3NzQ2xhc3NlcyB9IGZyb20gJy4vY2xhc3Nlcy5tdHMnXG5pbXBvcnQgeyBIdG1sRWxlbWVudFByb3BlcnRpZXMgfSBmcm9tICcuL2h0bWwtZWxlbWVudC1wcm9wZXJ0aWVzLm10cydcbmltcG9ydCB7IFN2Z0VsZW1lbnRQcm9wZXJ0aWVzLCBTdmdUYWdFbGVtZW50LCBTdmdUYWdOYW1lIH0gZnJvbSAnLi9zdmctZWxlbWVudC1wcm9wZXJ0aWVzLm10cydcblxuZnVuY3Rpb24gYnVpbGRPbkhhbmRsZXJzPFRFbGVtZW50IGV4dGVuZHMgRWxlbWVudD4oXG5cdG9uOiBFbGVtZW50T25IYW5kbGVyczxURWxlbWVudD4gfCB1bmRlZmluZWQsXG5cdGVsZW1lbnQ6IFRFbGVtZW50LFxuXHRzaWduYWw6IEFib3J0U2lnbmFsLFxuKTogdm9pZCB7XG5cdGlmICghb24pIHJldHVyblxuXHRmb3IgKGNvbnN0IFtrZXksIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKG9uKSkge1xuXHRcdGlmICghaGFuZGxlcikgY29udGludWVcblx0XHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRrZXksXG5cdFx0XHRldmVudCA9PiB2b2lkIChoYW5kbGVyIGFzIChldmVudD86IEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikoZXZlbnQpLFxuXHRcdFx0c2lnbmFsID8geyBzaWduYWwgfSA6IHVuZGVmaW5lZCxcblx0XHQpXG5cdH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDbGFzc0xpc3QoY2xhc3NlczogQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZCkge1xuXHRpZiAoY2xhc3NlcyA9PT0gbnVsbCB8fCBjbGFzc2VzID09PSB1bmRlZmluZWQpIHJldHVybiB7fVxuXHRpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkgcmV0dXJuIHsgY2xhc3NOYW1lOiBjbGFzc2VzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfVxuXG5cdHJldHVybiB7IGNsYXNzTmFtZTogU3RyaW5nKGNsYXNzZXMpIH1cbn1cblxuZnVuY3Rpb24gaXNXcml0YWJsZURvbVByb3BlcnR5KGVsZW1lbnQ6IEVsZW1lbnQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGxldCBwcm90b3R5cGU6IG9iamVjdCB8IG51bGwgPSBlbGVtZW50XG5cdHdoaWxlIChwcm90b3R5cGUpIHtcblx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGtleSlcblx0XHRpZiAoZGVzYykgcmV0dXJuICEhKGRlc2Mud3JpdGFibGUgfHwgZGVzYy5zZXQpXG5cdFx0cHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgYXMgb2JqZWN0IHwgbnVsbFxuXHR9XG5cdHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50Q3JlYXRvciA9IChrZXk6IHN0cmluZywgbnM/OiBzdHJpbmcpID0+IEVsZW1lbnRcblxuLyoqXG4gKiBUaGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiB0eXBlIHJldHVybmVkIGJ5IHtAbGluayBjcmVhdGVFbGVtZW50RmFjdG9yeX0uXG4gKiBBY2NlcHRzIEhUTUwgb3IgU1ZHIHRhZyBuYW1lcyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgZWxlbWVudCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRDcmVhdG9yRnVuY3Rpb24ge1xuXHQodGFnOiAnc3ZnJywgcHJvcGVydGllcz86IFN2Z0VsZW1lbnRQcm9wZXJ0aWVzPCdzdmcnPik6IFNWR1NWR0VsZW1lbnRcblx0PEsgZXh0ZW5kcyBFeGNsdWRlPFN2Z1RhZ05hbWUsICdzdmcnPj4odGFnOiBLLCBwcm9wZXJ0aWVzPzogU3ZnRWxlbWVudFByb3BlcnRpZXM8Sz4pOiBTdmdUYWdFbGVtZW50PEs+XG5cdDxLIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEssIHByb3BlcnRpZXM/OiBOb0luZmVyPEh0bWxFbGVtZW50UHJvcGVydGllczxLPj4pOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS11cbn1cblxuZXhwb3J0IHR5cGUgRWxlbWVudEZhY3RvcnkgPSBFbGVtZW50Q3JlYXRvckZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudEZhY3RvcnkoY29uc3RydWN0RWxlbWVudDogRWxlbWVudENyZWF0b3IsIHNpZ25hbDogQWJvcnRTaWduYWwpOiBFbGVtZW50Q3JlYXRvckZ1bmN0aW9uIHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gSFRNTCBvciBTVkcgZWxlbWVudC4gVGhlIGVsZW1lbnQgaXMgTk9UIGFwcGVuZGVkIHRvIHRoZVxuXHQgKiBkb2N1bWVudDsgcGFzcyBpdCB0byBgYXBwZW5kYCwgYHByZXBlbmRgLCBvciBzZXQgaXQgYXMgYGNoaWxkcmVuYCBvZlxuXHQgKiBhbm90aGVyIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEhUTUwgdGFncyB1c2UgdGhlIHJlZ3VsYXIgYEhUTUxFbGVtZW50VGFnTmFtZU1hcGAga2V5cy4gU1ZHIHRhZ3MgdXNlXG5cdCAqIGAnc3ZnJ2AgZm9yIHRoZSByb290IGFuZCBgJ3N2Zzo8bmFtZT4nYCBmb3IgZXZlcnl0aGluZyBlbHNlICh0aGUgcHJlZml4XG5cdCAqIGtlZXBzIHRoZW0gZnJvbSBjb2xsaWRpbmcgd2l0aCBzYW1lLW5hbWVkIEhUTUwgdGFncykuXG5cdCAqXG5cdCAqIFByb3BlcnRpZXM6XG5cdCAqIC0gYGNsYXNzZXNgOiBhIGNsYXNzIHN0cmluZyBvciBhIHtAbGluayBDc3NDbGFzc2VzfSBhcnJheS4gRmFsc3lcblx0ICogICBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBvdXQuXG5cdCAqIC0gYGFyaWFgOiBBUklBIGF0dHJpYnV0ZXMuIEFjY2VwdHMgc3RyaW5nIElEcyBvciBgRWxlbWVudGAgcmVmZXJlbmNlc1xuXHQgKiAgIGZvciBJREwgcmVmbGVjdGlvbiBwcm9wZXJ0aWVzIChlLmcuIGBhcmlhLWxhYmVsbGVkYnlgKS5cblx0ICogLSBgb25gOiBhbiBvYmplY3Qgb2YgZXZlbnQgaGFuZGxlcnMuIEVhY2ggbGlzdGVuZXIgaXMgcmVtb3ZlZCB3aGVuIHRoZVxuXHQgKiAgIGNvbXBvbmVudCB1bm1vdW50cy5cblx0ICogLSBgY2hpbGRyZW5gOiBhIHNpbmdsZSBgTm9kZWAgb3IgYW4gYXJyYXk7IGFwcGVuZGVkIGluIG9yZGVyLiBgdW5kZWZpbmVkYFxuXHQgKiAgIGFuZCBgbnVsbGAgZW50cmllcyBhcmUgc2tpcHBlZCwgc2FtZSBhcyBgY2xhc3Nlc2AuXG5cdCAqIC0gT3RoZXIgcHJvcHMgYXJlIHNldCBhcyBET00gcHJvcGVydGllcyAoc28gYGh0bWxGb3JgIG5vdCBgZm9yYCxcblx0ICogICBgcmVhZE9ubHlgIG5vdCBgcmVhZG9ubHlgKS4gT24gU1ZHLCBhbnl0aGluZyB0aGF0IGlzbid0IGEgd3JpdGFibGVcblx0ICogICBET00gcHJvcGVydHkgZmFsbHMgYmFjayB0byBgc2V0QXR0cmlidXRlYC5cblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogYGBgdHNcblx0ICogY29uc3QgZGl2ID0gZWxlbWVudCgnZGl2Jywge1xuXHQgKiAgIGNsYXNzZXM6ICdjYXJkJyxcblx0ICogICBhcmlhOiB7XG5cdCAqICAgICBsYWJlbDogJ0NhcmQnLFxuXHQgKiAgICAgbGFiZWxsZWRCeTogaGVhZGluZ0VsLFxuXHQgKiAgIH0sXG5cdCAqICAgY2hpbGRyZW46IFtcblx0ICogICAgIGVsZW1lbnQoJ2gyJywge1xuXHQgKiAgICAgICB0ZXh0Q29udGVudDogJ1RpdGxlJyxcblx0ICogICAgIH0pLFxuXHQgKiAgICAgZWxlbWVudCgncCcsIHtcblx0ICogICAgICAgdGV4dENvbnRlbnQ6ICdCb2R5Jyxcblx0ICogICAgIH0pLFxuXHQgKiAgIF0sXG5cdCAqIH0pXG5cdCAqXG5cdCAqIGNvbnN0IGljb24gPSBlbGVtZW50KCdzdmcnLCB7XG5cdCAqICAgdmlld0JveDogJzAgMCAyNCAyNCcsXG5cdCAqICAgYXJpYToge1xuXHQgKiAgICAgaGlkZGVuOiAndHJ1ZScsXG5cdCAqICAgfSxcblx0ICogICBjaGlsZHJlbjogZWxlbWVudCgnc3ZnOnVzZScsIHtcblx0ICogICAgIGhyZWY6IHNwcml0ZVVybCxcblx0ICogICB9KSxcblx0ICogfSlcblx0ICogYGBgXG5cdCAqL1xuXHRmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZzogJ3N2ZycsIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczwnc3ZnJz4pOiBTVkdTVkdFbGVtZW50XG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQ8SyBleHRlbmRzIEV4Y2x1ZGU8U3ZnVGFnTmFtZSwgJ3N2Zyc+Pih0YWc6IEssIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczxLPik6IFN2Z1RhZ0VsZW1lbnQ8Sz5cblx0ZnVuY3Rpb24gY3JlYXRlRWxlbWVudDxLRWxlbWVudCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcD4odGFnOiBLRWxlbWVudCwgcHJvcGVydGllcz86IE5vSW5mZXI8SHRtbEVsZW1lbnRQcm9wZXJ0aWVzPEtFbGVtZW50Pj4pOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS0VsZW1lbnRdXG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IEVsZW1lbnQge1xuXHRcdGlmICh0YWcgPT09ICdzdmcnIHx8IHRhZy5zdGFydHNXaXRoKCdzdmc6JykpIHtcblx0XHRcdGNvbnN0IGFjdHVhbFRhZyA9IHRhZyA9PT0gJ3N2ZycgPyAnc3ZnJyA6IHRhZy5zbGljZSg0KVxuXHRcdFx0Y29uc3QgeyBjbGFzc2VzLCBjaGlsZHJlbiwgYXJpYSwgb24sIHN0eWxlLCAuLi5hdHRyaWJ1dGVzIH0gPSBwcm9wZXJ0aWVzID8/IHt9XG5cdFx0XHRjb25zdCBuZXdFbGVtZW50ID0gY29uc3RydWN0RWxlbWVudChhY3R1YWxUYWcsICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpIGFzIFNWR0VsZW1lbnRcblxuXHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcblx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIGNvbnRpbnVlXG5cdFx0XHRcdGlmIChpc1dyaXRhYmxlRG9tUHJvcGVydHkobmV3RWxlbWVudCwga2V5KSkge1xuXHRcdFx0XHRcdDsobmV3RWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWVcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0XHRuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgeyBjbGFzc05hbWUgfSA9IGJ1aWxkQ2xhc3NMaXN0KGNsYXNzZXMgYXMgQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZClcblx0XHRcdGlmIChjbGFzc05hbWUpIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIGNsYXNzTmFtZSlcblxuXHRcdFx0aWYgKHN0eWxlKSBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXHRcdFx0YnVpbGRBcmlhUHJvcGVydGllcyhhcmlhIGFzIEFyaWEgfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQpXG5cdFx0XHRidWlsZE9uSGFuZGxlcnMob24gYXMgRWxlbWVudE9uSGFuZGxlcnM8RWxlbWVudD4gfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQsIHNpZ25hbClcblxuXHRcdFx0YXBwZW5kQ2hpbGRyZW4obmV3RWxlbWVudCwgY2hpbGRyZW4gYXMgRWxlbWVudENoaWxkcmVuKVxuXG5cdFx0XHRyZXR1cm4gbmV3RWxlbWVudFxuXHRcdH1cblxuXHRcdGNvbnN0IHsgYXJpYSwgY2hpbGRyZW4sIGNsYXNzZXMsIG9uLCBzdHlsZSwgLi4uYXNzaWduYWJsZVByb3BlcnRpZXMgfSA9IHByb3BlcnRpZXMgPz8ge31cblx0XHRjb25zdCBuZXdFbGVtZW50ID0gY29uc3RydWN0RWxlbWVudCh0YWcpIGFzIEhUTUxFbGVtZW50XG5cblx0XHRjb25zdCB7IGNsYXNzTmFtZSB9ID0gYnVpbGRDbGFzc0xpc3QoY2xhc3NlcyBhcyBDc3NDbGFzc2VzIHwgdW5kZWZpbmVkKVxuXHRcdGlmIChjbGFzc05hbWUpIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lXG5cblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhc3NpZ25hYmxlUHJvcGVydGllcykpIHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSBjb250aW51ZVxuXHRcdFx0aWYgKGlzV3JpdGFibGVEb21Qcm9wZXJ0eShuZXdFbGVtZW50LCBrZXkpKSB7XG5cdFx0XHRcdDsobmV3RWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWVcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuXHRcdFx0XHRuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHN0eWxlKSBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXHRcdGJ1aWxkQXJpYVByb3BlcnRpZXMoYXJpYSBhcyBBcmlhIHwgdW5kZWZpbmVkLCBuZXdFbGVtZW50KVxuXHRcdGJ1aWxkT25IYW5kbGVycyhvbiBhcyBFbGVtZW50T25IYW5kbGVyczxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQsIHNpZ25hbClcblx0XHRhcHBlbmRDaGlsZHJlbihuZXdFbGVtZW50LCBjaGlsZHJlbiBhcyBFbGVtZW50Q2hpbGRyZW4pXG5cblx0XHRyZXR1cm4gbmV3RWxlbWVudFxuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZUVsZW1lbnRcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWxlbWVudDogRWxlbWVudCwgY2hpbGRyZW46IEVsZW1lbnRDaGlsZHJlbik6IHZvaWQge1xuXHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkgY29udGludWVcblx0XHRcdGVsZW1lbnQuYXBwZW5kKGNoaWxkKVxuXHRcdH1cblx0fVxuXHRlbHNlIGlmIChjaGlsZHJlbikge1xuXHRcdGVsZW1lbnQuYXBwZW5kKGNoaWxkcmVuKVxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7QUEwREEsU0FBZ0IsU0FBUyxHQUFHLFlBQTJFO0NBQ3RHLElBQUksV0FBVyxXQUFXLEdBQUcsT0FB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rooted/elements",
3
- "version": "1.0.0-alpha.7",
3
+ "version": "1.0.0-alpha.9",
4
4
  "description": "Typed HTML and SVG element factory for the rooted framework",
5
5
  "keywords": [
6
6
  "web-components",
@@ -50,11 +50,11 @@
50
50
  "extract-api": "rooted-development extract-api"
51
51
  },
52
52
  "peerDependencies": {
53
- "@rooted/events": "1.0.0-alpha.7"
53
+ "@rooted/events": "1.0.0-alpha.9"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@rooted/development": "workspace:*",
57
- "@rooted/events": "1.0.0-alpha.7",
58
- "tsx": "^4.23.1"
57
+ "@rooted/events": "1.0.0-alpha.9",
58
+ "tsx": "^4.23.13"
59
59
  }
60
60
  }
package/readme.md CHANGED
@@ -9,16 +9,31 @@ Typed HTML and SVG element factory. Usable on its own, or as the DOM helper laye
9
9
  pnpm add @rooted/elements
10
10
  ```
11
11
 
12
+ The package ships a factory builder rather than a ready-made `element`. You hand it the function that creates nodes and an `AbortSignal`, and you get the typed `element(...)` back. Inside a rooted component that's already done for you, `element` is on the mount context.
13
+
12
14
  ```ts
13
- import { element } from '@rooted/elements'
15
+ import { createElementFactory, type ElementCreator } from '@rooted/elements'
16
+
17
+ const controller = new AbortController()
18
+ const createElement: ElementCreator = (tag, ns) => ns
19
+ ? document.createElementNS(ns, tag)
20
+ : document.createElement(tag)
21
+
22
+ const element = createElementFactory(createElement, controller.signal)
14
23
 
15
24
  const card = element('div', {
16
25
  classes: 'card',
17
26
  children: [
18
- element('h2', { textContent: 'Title' }),
19
- element('p', { textContent: 'Body' }),
27
+ element('h2', {
28
+ textContent: 'Title',
29
+ }),
30
+ element('p', {
31
+ textContent: 'Body',
32
+ }),
20
33
  ],
21
34
  })
22
35
  ```
23
36
 
37
+ The `ns` branch is what makes `element('svg', ...)` and the `svg:*` tags work, so don't drop it. Aborting the controller removes every listener registered through the `on` prop, which is how components clean up on unmount.
38
+
24
39
  More in the [elements page](https://github.com/Marvin-Brouwer/rooted/blob/main/docs/advanced/elements.md).