photon-grid-angular 0.0.1

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.
package/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # PhotonGridAngular
2
+
3
+ This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.14.
4
+
5
+ ## Development server
6
+
7
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
8
+
9
+ ## Code scaffolding
10
+
11
+ Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12
+
13
+ ## Build
14
+
15
+ Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
16
+
17
+ ## Running unit tests
18
+
19
+ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20
+
21
+ ## Running end-to-end tests
22
+
23
+ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
24
+
25
+ ## Further help
26
+
27
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,269 @@
1
+ import { TemplateRef, createComponent, } from '@angular/core';
2
+ import { isComponentRendererSpec, isTemplateRendererSpec, } from './angular-renderer.types';
3
+ /**
4
+ * Bridges the framework-agnostic `ColumnRendererMap` (plain functions
5
+ * returning `HTMLElement | string`) to Angular components and templates.
6
+ *
7
+ * One instance is owned per `<photon-grid>` and lives for the component's
8
+ * lifetime: {@link adaptColumns} is called whenever columns are (re)supplied,
9
+ * and {@link dispose} is called once, in `ngOnDestroy`, to guarantee nothing
10
+ * outlives the host component.
11
+ *
12
+ * ### Why a MutationObserver
13
+ * The core owns cell/row virtualization and recycling; it has no lifecycle
14
+ * hook that tells us "this cell's DOM node is gone, destroy whatever you
15
+ * mounted into it". Since every renderer invocation mounts a *fresh*
16
+ * component/embedded view (the core's contract is "produce output for these
17
+ * params", not "patch existing output"), the only reliable place to catch
18
+ * disposal is watching the DOM itself: when the core removes/replaces a
19
+ * mounted host element, a MutationObserver on the grid root sees it and we
20
+ * destroy the corresponding Angular view right then. This is what keeps
21
+ * scrolling/virtualized grids from leaking components.
22
+ */
23
+ export class RendererAdapter {
24
+ appRef;
25
+ environmentInjector;
26
+ elementInjector;
27
+ /** Host element -> live Angular view mounted into it. */
28
+ mounts = new Map();
29
+ observer;
30
+ constructor(appRef, environmentInjector, elementInjector) {
31
+ this.appRef = appRef;
32
+ this.environmentInjector = environmentInjector;
33
+ this.elementInjector = elementInjector;
34
+ }
35
+ /**
36
+ * Starts watching `root` for node removals so mounted views can be torn
37
+ * down as soon as the core discards their host element. Safe to call
38
+ * repeatedly (e.g. across grid recreation) — any previous observer is
39
+ * disconnected first, but existing mounts are left untouched.
40
+ */
41
+ observe(root) {
42
+ this.observer?.disconnect();
43
+ this.observer = new MutationObserver((mutations) => {
44
+ // Bounded by the number of *currently mounted* renderer views
45
+ // (i.e. visible custom cells), not by row/data-set size, because
46
+ // virtualization keeps that number small regardless of grid size.
47
+ if (this.mounts.size === 0) {
48
+ return;
49
+ }
50
+ for (const mutation of mutations) {
51
+ mutation.removedNodes.forEach((node) => this.cleanupRemovedNode(node));
52
+ }
53
+ });
54
+ this.observer.observe(root, { childList: true, subtree: true });
55
+ }
56
+ /** Recursively converts `GridColumnDef[]` into plain `ColumnDef[]`. */
57
+ adaptColumns(columns) {
58
+ return columns.map((column) => this.adaptColumn(column));
59
+ }
60
+ /**
61
+ * Destroys every currently-mounted component/embedded view and stops
62
+ * observing. Call exactly once, when the owning grid is torn down.
63
+ * Deliberately unconditional (does not wait on the MutationObserver):
64
+ * `disconnect()` drops any in-flight mutation records, so relying on it
65
+ * for final teardown would risk leaking whatever hadn't been flushed yet.
66
+ */
67
+ dispose() {
68
+ this.observer?.disconnect();
69
+ this.observer = undefined;
70
+ for (const [element, mount] of this.mounts) {
71
+ this.destroyMount(mount);
72
+ this.mounts.delete(element);
73
+ }
74
+ }
75
+ adaptColumn(column) {
76
+ const { renderer, children, ...rest } = column;
77
+ const adapted = { ...rest };
78
+ if (renderer) {
79
+ // Adapted per-slot (rather than via a generic loop over the
80
+ // slot names) so each call keeps its own TParams/TOutput pair —
81
+ // looping over a union of keys would force `adaptRenderer` to
82
+ // accept the union of every slot's renderer type at once, which
83
+ // doesn't type-check (an EditorRendererParams renderer isn't
84
+ // assignable where a TooltipRendererParams renderer is expected).
85
+ const adaptedRenderer = {
86
+ display: this.adaptRenderer(renderer.display),
87
+ editor: this.adaptRenderer(renderer.editor),
88
+ option: this.adaptRenderer(renderer.option),
89
+ filter: this.adaptRenderer(renderer.filter),
90
+ tooltip: this.adaptRenderer(renderer.tooltip),
91
+ group: this.adaptRenderer(renderer.group),
92
+ header: this.adaptRenderer(renderer.header),
93
+ summary: this.adaptRenderer(renderer.summary),
94
+ };
95
+ adapted.renderer = adaptedRenderer;
96
+ }
97
+ if (children) {
98
+ adapted.children = children.map((child) => this.adaptColumn(child));
99
+ }
100
+ return adapted;
101
+ }
102
+ adaptRenderer(renderer) {
103
+ if (!renderer) {
104
+ return undefined;
105
+ }
106
+ if (isComponentRendererSpec(renderer)) {
107
+ return (params) => this.mountComponent(renderer, params);
108
+ }
109
+ if (isTemplateRendererSpec(renderer)) {
110
+ return (params) => this.mountTemplate(renderer, params);
111
+ }
112
+ if (renderer instanceof TemplateRef) {
113
+ return (params) => this.mountTemplate({ template: renderer }, params);
114
+ }
115
+ if (this.isComponentType(renderer)) {
116
+ return (params) => this.mountComponent({ component: renderer }, params);
117
+ }
118
+ if (typeof renderer === 'function') {
119
+ return renderer;
120
+ }
121
+ return undefined;
122
+ }
123
+ isComponentType(value) {
124
+ return typeof value === 'function' && !!value.ɵcmp;
125
+ }
126
+ mountComponent(spec, params) {
127
+ const componentRef = createComponent(spec.component, {
128
+ environmentInjector: this.environmentInjector,
129
+ elementInjector: this.elementInjector,
130
+ });
131
+ const normalizedParams = this.normalizeRendererParams(params);
132
+ const inputs = spec.inputs ? spec.inputs(normalizedParams) : this.inferInputs(componentRef, normalizedParams);
133
+ for (const [key, value] of Object.entries(inputs)) {
134
+ this.setComponentInput(componentRef, key, value);
135
+ }
136
+ this.setComponentInput(componentRef, 'params', normalizedParams);
137
+ // Attaching to ApplicationRef is what makes this component
138
+ // participate in normal change detection (zone triggers, async
139
+ // pipe, etc.) for as long as it stays mounted — required for any
140
+ // interactivity inside the component itself (clicks, forms, ...).
141
+ this.appRef.attachView(componentRef.hostView);
142
+ componentRef.changeDetectorRef.detectChanges();
143
+ this.invokeLifecycle(componentRef.instance, 'pgGridInit', normalizedParams);
144
+ this.invokeLifecycle(componentRef.instance, 'pgGridRefresh', normalizedParams);
145
+ const element = componentRef.location.nativeElement;
146
+ this.mounts.set(element, { kind: 'component', ref: componentRef });
147
+ return element;
148
+ }
149
+ setComponentInput(componentRef, key, value) {
150
+ try {
151
+ componentRef.setInput(key, value);
152
+ return;
153
+ }
154
+ catch {
155
+ const instance = componentRef.instance;
156
+ instance[key] = value;
157
+ }
158
+ }
159
+ normalizeRendererParams(params) {
160
+ const normalized = { ...params };
161
+ const option = normalized['option'];
162
+ if (normalized['value'] === undefined && option && typeof option === 'object') {
163
+ const optionValue = option.value;
164
+ normalized['value'] = optionValue;
165
+ normalized['rawValue'] = optionValue;
166
+ }
167
+ return normalized;
168
+ }
169
+ inferInputs(componentRef, params) {
170
+ const instance = componentRef.instance;
171
+ const inputs = {};
172
+ const paramBag = params;
173
+ const row = paramBag['row'] && typeof paramBag['row'] === 'object'
174
+ ? paramBag['row']
175
+ : undefined;
176
+ for (const key of Object.keys(instance)) {
177
+ if (key === '__ngContext__' || key === 'constructor') {
178
+ continue;
179
+ }
180
+ if (paramBag[key] !== undefined) {
181
+ inputs[key] = paramBag[key];
182
+ continue;
183
+ }
184
+ if (row && row[key] !== undefined) {
185
+ inputs[key] = row[key];
186
+ continue;
187
+ }
188
+ if (key === 'seed' && row && row['id'] !== undefined) {
189
+ inputs[key] = row['id'];
190
+ continue;
191
+ }
192
+ if (key === 'value' && paramBag['value'] !== undefined) {
193
+ inputs[key] = paramBag['value'];
194
+ }
195
+ }
196
+ return inputs;
197
+ }
198
+ invokeLifecycle(instance, lifecycle, params) {
199
+ const candidate = instance?.[lifecycle];
200
+ if (typeof candidate === 'function') {
201
+ candidate.call(instance, params);
202
+ }
203
+ }
204
+ mountTemplate(spec, params) {
205
+ const normalizedParams = this.normalizeRendererParams(params);
206
+ const context = {
207
+ $implicit: normalizedParams,
208
+ params: normalizedParams,
209
+ ...(spec.context ? spec.context(normalizedParams) : {}),
210
+ };
211
+ const viewRef = spec.template.createEmbeddedView(context);
212
+ this.appRef.attachView(viewRef);
213
+ viewRef.detectChanges();
214
+ const host = this.resolveTemplateHost(viewRef);
215
+ this.mounts.set(host, { kind: 'template', ref: viewRef });
216
+ return host;
217
+ }
218
+ /**
219
+ * Uses the template's single root element directly when possible (so
220
+ * `editor`/`filter` slots that expect the returned element to *be* the
221
+ * control keep working); falls back to a wrapper `<div>` for templates
222
+ * with multiple root nodes or text-only content.
223
+ */
224
+ resolveTemplateHost(viewRef) {
225
+ const [singleRoot] = viewRef.rootNodes;
226
+ if (viewRef.rootNodes.length === 1 && singleRoot instanceof HTMLElement) {
227
+ return singleRoot;
228
+ }
229
+ const host = document.createElement('div');
230
+ host.classList.add('photon-grid__template-host');
231
+ host.append(...viewRef.rootNodes);
232
+ return host;
233
+ }
234
+ cleanupRemovedNode(node) {
235
+ if (!(node instanceof HTMLElement)) {
236
+ return;
237
+ }
238
+ const directMount = this.mounts.get(node);
239
+ if (directMount) {
240
+ this.mounts.delete(node);
241
+ this.destroyMount(directMount);
242
+ }
243
+ // The core may remove an ancestor (e.g. an entire recycled row)
244
+ // rather than the mounted element itself; sweep for any tracked
245
+ // host contained in the removed subtree.
246
+ if (node.childElementCount === 0) {
247
+ return;
248
+ }
249
+ for (const [element, mount] of this.mounts) {
250
+ if (node.contains(element)) {
251
+ this.mounts.delete(element);
252
+ this.destroyMount(mount);
253
+ }
254
+ }
255
+ }
256
+ destroyMount(mount) {
257
+ if (mount.kind === 'component') {
258
+ this.invokeLifecycle(mount.ref.instance, 'pgGridDestroy', undefined);
259
+ const viewRef = mount.ref.hostView;
260
+ this.appRef.detachView(viewRef);
261
+ mount.ref.destroy();
262
+ return;
263
+ }
264
+ const viewRef = mount.ref;
265
+ this.appRef.detachView(viewRef);
266
+ mount.ref.destroy();
267
+ }
268
+ }
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZW5kZXJlci5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYnJhcnkvYW5ndWxhci1yZW5kZXJlci5hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFNSCxXQUFXLEVBQ1gsZUFBZSxHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBS0gsdUJBQXVCLEVBQ3ZCLHNCQUFzQixHQUN6QixNQUFNLDBCQUEwQixDQUFDO0FBUWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFPSDtJQUNBO0lBQ0E7SUFSckIseURBQXlEO0lBQ3hDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztJQUV4RCxRQUFRLENBQW9CO0lBRXBDLFlBQ3FCLE1BQXNCLEVBQ3RCLG1CQUF3QyxFQUN4QyxlQUF5QjtRQUZ6QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG9CQUFlLEdBQWYsZUFBZSxDQUFVO0lBQzNDLENBQUM7SUFFSjs7Ozs7T0FLRztJQUNILE9BQU8sQ0FBQyxJQUFpQjtRQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBRTVCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQy9DLDhEQUE4RDtZQUM5RCxpRUFBaUU7WUFDakUsa0VBQWtFO1lBQ2xFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU87WUFDWCxDQUFDO1lBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FB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QyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBcHBsaWNhdGlvblJlZixcclxuICAgIENvbXBvbmVudFJlZixcclxuICAgIEVtYmVkZGVkVmlld1JlZixcclxuICAgIEVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgICBJbmplY3RvcixcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgY3JlYXRlQ29tcG9uZW50LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBDb2x1bW5EZWYsIFJlbmRlcmVyT3V0cHV0IH0gZnJvbSAncGhvdG9uLWdyaWQtY29yZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgQ2VsbFJlbmRlcmVyLFxyXG4gICAgQ29sdW1uUmVuZGVyZXJNYXAsXHJcbiAgICBDb2x1bW5EZWYgYXMgR3JpZENvbHVtbkRlZixcclxuICAgIFJlbmRlcmVyQ29udGV4dCxcclxuICAgIGlzQ29tcG9uZW50UmVuZGVyZXJTcGVjLFxyXG4gICAgaXNUZW1wbGF0ZVJlbmRlcmVyU3BlYyxcclxufSBmcm9tICcuL2FuZ3VsYXItcmVuZGVyZXIudHlwZXMnO1xyXG5cclxudHlwZSBSZW5kZXJlck1vdW50ID1cclxuICAgIHwgeyByZWFkb25seSBraW5kOiAnY29tcG9uZW50JzsgcmVhZG9ubHkgcmVmOiBDb21wb25lbnRSZWY8dW5rbm93bj4gfVxyXG4gICAgfCB7IHJlYWRvbmx5IGtpbmQ6ICd0ZW1wbGF0ZSc7IHJlYWRvbmx5IHJlZjogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+IH07XHJcblxyXG50eXBlIEdyaWRMaWZlY3ljbGVNZXRob2QgPSAncGdHcmlkSW5pdCcgfCAncGdHcmlkUmVmcmVzaCcgfCAncGdHcmlkRGVzdHJveSc7XHJcblxyXG4vKipcclxuICogQnJpZGdlcyB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGBDb2x1bW5SZW5kZXJlck1hcGAgKHBsYWluIGZ1bmN0aW9uc1xyXG4gKiByZXR1cm5pbmcgYEhUTUxFbGVtZW50IHwgc3RyaW5nYCkgdG8gQW5ndWxhciBjb21wb25lbnRzIGFuZCB0ZW1wbGF0ZXMuXHJcbiAqXHJcbiAqIE9uZSBpbnN0YW5jZSBpcyBvd25lZCBwZXIgYDxwaG90b24tZ3JpZD5gIGFuZCBsaXZlcyBmb3IgdGhlIGNvbXBvbmVudCdzXHJcbiAqIGxpZmV0aW1lOiB7QGxpbmsgYWRhcHRDb2x1bW5zfSBpcyBjYWxsZWQgd2hlbmV2ZXIgY29sdW1ucyBhcmUgKHJlKXN1cHBsaWVkLFxyXG4gKiBhbmQge0BsaW5rIGRpc3Bvc2V9IGlzIGNhbGxlZCBvbmNlLCBpbiBgbmdPbkRlc3Ryb3lgLCB0byBndWFyYW50ZWUgbm90aGluZ1xyXG4gKiBvdXRsaXZlcyB0aGUgaG9zdCBjb21wb25lbnQuXHJcbiAqXHJcbiAqICMjIyBXaHkgYSBNdXRhdGlvbk9ic2VydmVyXHJcbiAqIFRoZSBjb3JlIG93bnMgY2VsbC9yb3cgdmlydHVhbGl6YXRpb24gYW5kIHJlY3ljbGluZzsgaXQgaGFzIG5vIGxpZmVjeWNsZVxyXG4gKiBob29rIHRoYXQgdGVsbHMgdXMgXCJ0aGlzIGNlbGwncyBET00gbm9kZSBpcyBnb25lLCBkZXN0cm95IHdoYXRldmVyIHlvdVxyXG4gKiBtb3VudGVkIGludG8gaXRcIi4gU2luY2UgZXZlcnkgcmVuZGVyZXIgaW52b2NhdGlvbiBtb3VudHMgYSAqZnJlc2gqXHJcbiAqIGNvbXBvbmVudC9lbWJlZGRlZCB2aWV3ICh0aGUgY29yZSdzIGNvbnRyYWN0IGlzIFwicHJvZHVjZSBvdXRwdXQgZm9yIHRoZXNlXHJcbiAqIHBhcmFtc1wiLCBub3QgXCJwYXRjaCBleGlzdGluZyBvdXRwdXRcIiksIHRoZSBvbmx5IHJlbGlhYmxlIHBsYWNlIHRvIGNhdGNoXHJcbiAqIGRpc3Bvc2FsIGlzIHdhdGNoaW5nIHRoZSBET00gaXRzZWxmOiB3aGVuIHRoZSBjb3JlIHJlbW92ZXMvcmVwbGFjZXMgYVxyXG4gKiBtb3VudGVkIGhvc3QgZWxlbWVudCwgYSBNdXRhdGlvbk9ic2VydmVyIG9uIHRoZSBncmlkIHJvb3Qgc2VlcyBpdCBhbmQgd2VcclxuICogZGVzdHJveSB0aGUgY29ycmVzcG9uZGluZyBBbmd1bGFyIHZpZXcgcmlnaHQgdGhlbi4gVGhpcyBpcyB3aGF0IGtlZXBzXHJcbiAqIHNjcm9sbGluZy92aXJ0dWFsaXplZCBncmlkcyBmcm9tIGxlYWtpbmcgY29tcG9uZW50cy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZW5kZXJlckFkYXB0ZXIge1xyXG4gICAgLyoqIEhvc3QgZWxlbWVudCAtPiBsaXZlIEFuZ3VsYXIgdmlldyBtb3VudGVkIGludG8gaXQuICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vdW50cyA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIFJlbmRlcmVyTW91bnQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBvYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnRJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRJbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICApIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgd2F0Y2hpbmcgYHJvb3RgIGZvciBub2RlIHJlbW92YWxzIHNvIG1vdW50ZWQgdmlld3MgY2FuIGJlIHRvcm5cclxuICAgICAqIGRvd24gYXMgc29vbiBhcyB0aGUgY29yZSBkaXNjYXJkcyB0aGVpciBob3N0IGVsZW1lbnQuIFNhZmUgdG8gY2FsbFxyXG4gICAgICogcmVwZWF0ZWRseSAoZS5nLiBhY3Jvc3MgZ3JpZCByZWNyZWF0aW9uKSDigJQgYW55IHByZXZpb3VzIG9ic2VydmVyIGlzXHJcbiAgICAgKiBkaXNjb25uZWN0ZWQgZmlyc3QsIGJ1dCBleGlzdGluZyBtb3VudHMgYXJlIGxlZnQgdW50b3VjaGVkLlxyXG4gICAgICovXHJcbiAgICBvYnNlcnZlKHJvb3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xyXG5cclxuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAvLyBCb3VuZGVkIGJ5IHRoZSBudW1iZXIgb2YgKmN1cnJlbnRseSBtb3VudGVkKiByZW5kZXJlciB2aWV3c1xyXG4gICAgICAgICAgICAvLyAoaS5lLiB2aXNpYmxlIGN1c3RvbSBjZWxscyksIG5vdCBieSByb3cvZGF0YS1zZXQgc2l6ZSwgYmVjYXVzZVxyXG4gICAgICAgICAgICAvLyB2aXJ0dWFsaXphdGlvbiBrZWVwcyB0aGF0IG51bWJlciBzbWFsbCByZWdhcmRsZXNzIG9mIGdyaWQgc2l6ZS5cclxuICAgICAgICAgICAgaWYgKHRoaXMubW91bnRzLnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHRoaXMuY2xlYW51cFJlbW92ZWROb2RlKG5vZGUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUocm9vdCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIGBHcmlkQ29sdW1uRGVmW11gIGludG8gcGxhaW4gYENvbHVtbkRlZltdYC4gKi9cclxuICAgIGFkYXB0Q29sdW1ucyhjb2x1bW5zOiByZWFkb25seSBHcmlkQ29sdW1uRGVmW10pOiBDb2x1bW5EZWZbXSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHRoaXMuYWRhcHRDb2x1bW4oY29sdW1uKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyBldmVyeSBjdXJyZW50bHktbW91bnRlZCBjb21wb25lbnQvZW1iZWRkZWQgdmlldyBhbmQgc3RvcHNcclxuICAgICAqIG9ic2VydmluZy4gQ2FsbCBleGFjdGx5IG9uY2UsIHdoZW4gdGhlIG93bmluZyBncmlkIGlzIHRvcm4gZG93bi5cclxuICAgICAqIERlbGliZXJhdGVseSB1bmNvbmRpdGlvbmFsIChkb2VzIG5vdCB3YWl0IG9uIHRoZSBNdXRhdGlvbk9ic2VydmVyKTpcclxuICAgICAqIGBkaXNjb25uZWN0KClgIGRyb3BzIGFueSBpbi1mbGlnaHQgbXV0YXRpb24gcmVjb3Jkcywgc28gcmVseWluZyBvbiBpdFxyXG4gICAgICogZm9yIGZpbmFsIHRlYXJkb3duIHdvdWxkIHJpc2sgbGVha2luZyB3aGF0ZXZlciBoYWRuJ3QgYmVlbiBmbHVzaGVkIHlldC5cclxuICAgICAqL1xyXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudCwgbW91bnRdIG9mIHRoaXMubW91bnRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vdW50KG1vdW50KTtcclxuICAgICAgICAgICAgdGhpcy5tb3VudHMuZGVsZXRlKGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkYXB0Q29sdW1uKGNvbHVtbjogR3JpZENvbHVtbkRlZik6IENvbHVtbkRlZiB7XHJcbiAgICAgICAgY29uc3QgeyByZW5kZXJlciwgY2hpbGRyZW4sIC4uLnJlc3QgfSA9IGNvbHVtbjtcclxuICAgICAgICBjb25zdCBhZGFwdGVkID0geyAuLi5yZXN0IH0gYXMgQ29sdW1uRGVmO1xyXG5cclxuICAgICAgICBpZiAocmVuZGVyZXIpIHtcclxuICAgICAgICAgICAgLy8gQWRhcHRlZCBwZXItc2xvdCAocmF0aGVyIHRoYW4gdmlhIGEgZ2VuZXJpYyBsb29wIG92ZXIgdGhlXHJcbiAgICAgICAgICAgIC8vIHNsb3QgbmFtZXMpIHNvIGVhY2ggY2FsbCBrZWVwcyBpdHMgb3duIFRQYXJhbXMvVE91dHB1dCBwYWlyIOKAlFxyXG4gICAgICAgICAgICAvLyBsb29waW5nIG92ZXIgYSB1bmlvbiBvZiBrZXlzIHdvdWxkIGZvcmNlIGBhZGFwdFJlbmRlcmVyYCB0b1xyXG4gICAgICAgICAgICAvLyBhY2NlcHQgdGhlIHVuaW9uIG9mIGV2ZXJ5IHNsb3QncyByZW5kZXJlciB0eXBlIGF0IG9uY2UsIHdoaWNoXHJcbiAgICAgICAgICAgIC8vIGRvZXNuJ3QgdHlwZS1jaGVjayAoYW4gRWRpdG9yUmVuZGVyZXJQYXJhbXMgcmVuZGVyZXIgaXNuJ3RcclxuICAgICAgICAgICAgLy8gYXNzaWduYWJsZSB3aGVyZSBhIFRvb2x0aXBSZW5kZXJlclBhcmFtcyByZW5kZXJlciBpcyBleHBlY3RlZCkuXHJcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZWRSZW5kZXJlcjogUGFydGlhbDxDb2x1bW5SZW5kZXJlck1hcD4gPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiB0aGlzLmFkYXB0UmVuZGVyZXIocmVuZGVyZXIuZGlzcGxheSksXHJcbiAgICAgICAgICAgICAgICBlZGl0b3I6IHRoaXMuYWRhcHRSZW5kZXJlcihyZW5kZXJlci5lZGl0b3IpLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uOiB0aGlzLmFkYXB0UmVuZGVyZXIocmVuZGVyZXIub3B0aW9uKSxcclxuICAgICAgICAgICAgICAgIGZpbHRlcjogdGhpcy5hZGFwdFJlbmRlcmVyKHJlbmRlcmVyLmZpbHRlciksXHJcbiAgICAgICAgICAgICAgICB0b29sdGlwOiB0aGlzLmFkYXB0UmVuZGVyZXIocmVuZGVyZXIudG9vbHRpcCksXHJcbiAgICAgICAgICAgICAgICBncm91cDogdGhpcy5hZGFwdFJlbmRlcmVyKHJlbmRlcmVyLmdyb3VwKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogdGhpcy5hZGFwdFJlbmRlcmVyKHJlbmRlcmVyLmhlYWRlciksXHJcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLmFkYXB0UmVuZGVyZXIocmVuZGVyZXIuc3VtbWFyeSksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGFkYXB0ZWQucmVuZGVyZXIgPSBhZGFwdGVkUmVuZGVyZXIgYXMgYW55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGFkYXB0ZWQuY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB0aGlzLmFkYXB0Q29sdW1uKGNoaWxkKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWRhcHRlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkYXB0UmVuZGVyZXI8VFBhcmFtcywgVE91dHB1dCBleHRlbmRzIFJlbmRlcmVyT3V0cHV0IHwgSFRNTEVsZW1lbnQ+KFxyXG4gICAgICAgIHJlbmRlcmVyOiBDZWxsUmVuZGVyZXI8VFBhcmFtcywgVE91dHB1dD4gfCB1bmRlZmluZWQsXHJcbiAgICApOiAoKHBhcmFtczogVFBhcmFtcykgPT4gVE91dHB1dCkgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICghcmVuZGVyZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpc0NvbXBvbmVudFJlbmRlcmVyU3BlYyhyZW5kZXJlcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJhbXM6IFRQYXJhbXMpID0+IHRoaXMubW91bnRDb21wb25lbnQocmVuZGVyZXIsIHBhcmFtcykgYXMgdW5rbm93biBhcyBUT3V0cHV0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlzVGVtcGxhdGVSZW5kZXJlclNwZWMocmVuZGVyZXIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAocGFyYW1zOiBUUGFyYW1zKSA9PiB0aGlzLm1vdW50VGVtcGxhdGUocmVuZGVyZXIsIHBhcmFtcykgYXMgdW5rbm93biBhcyBUT3V0cHV0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbmRlcmVyIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJhbXM6IFRQYXJhbXMpID0+IHRoaXMubW91bnRUZW1wbGF0ZSh7IHRlbXBsYXRlOiByZW5kZXJlciB9LCBwYXJhbXMpIGFzIHVua25vd24gYXMgVE91dHB1dDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50VHlwZShyZW5kZXJlcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJhbXM6IFRQYXJhbXMpID0+IHRoaXMubW91bnRDb21wb25lbnQoeyBjb21wb25lbnQ6IHJlbmRlcmVyIH0sIHBhcmFtcykgYXMgdW5rbm93biBhcyBUT3V0cHV0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiByZW5kZXJlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNDb21wb25lbnRUeXBlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgaW1wb3J0KCdAYW5ndWxhci9jb3JlJykuVHlwZTx1bmtub3duPiB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhISh2YWx1ZSBhcyB7IHJlYWRvbmx5IMm1Y21wPzogdW5rbm93biB9KS7JtWNtcDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1vdW50Q29tcG9uZW50PFRQYXJhbXM+KFxyXG4gICAgICAgIHNwZWM6IHsgY29tcG9uZW50OiBpbXBvcnQoJ0Bhbmd1bGFyL2NvcmUnKS5UeXBlPHVua25vd24+OyBpbnB1dHM/OiAocGFyYW1zOiBUUGFyYW1zKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxyXG4gICAgICAgIHBhcmFtczogVFBhcmFtcyxcclxuICAgICk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjcmVhdGVDb21wb25lbnQoc3BlYy5jb21wb25lbnQsIHtcclxuICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy5lbnZpcm9ubWVudEluamVjdG9yLFxyXG4gICAgICAgICAgICBlbGVtZW50SW5qZWN0b3I6IHRoaXMuZWxlbWVudEluamVjdG9yLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBub3JtYWxpemVkUGFyYW1zID0gdGhpcy5ub3JtYWxpemVSZW5kZXJlclBhcmFtcyhwYXJhbXMpO1xyXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHNwZWMuaW5wdXRzID8gc3BlYy5pbnB1dHMobm9ybWFsaXplZFBhcmFtcykgOiB0aGlzLmluZmVySW5wdXRzKGNvbXBvbmVudFJlZiwgbm9ybWFsaXplZFBhcmFtcyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXRzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldENvbXBvbmVudElucHV0KGNvbXBvbmVudFJlZiwga2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldENvbXBvbmVudElucHV0KGNvbXBvbmVudFJlZiwgJ3BhcmFtcycsIG5vcm1hbGl6ZWRQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyBBdHRhY2hpbmcgdG8gQXBwbGljYXRpb25SZWYgaXMgd2hhdCBtYWtlcyB0aGlzIGNvbXBvbmVudFxyXG4gICAgICAgIC8vIHBhcnRpY2lwYXRlIGluIG5vcm1hbCBjaGFuZ2UgZGV0ZWN0aW9uICh6b25lIHRyaWdnZXJzLCBhc3luY1xyXG4gICAgICAgIC8vIHBpcGUsIGV0Yy4pIGZvciBhcyBsb25nIGFzIGl0IHN0YXlzIG1vdW50ZWQg4oCUIHJlcXVpcmVkIGZvciBhbnlcclxuICAgICAgICAvLyBpbnRlcmFjdGl2aXR5IGluc2lkZSB0aGUgY29tcG9uZW50IGl0c2VsZiAoY2xpY2tzLCBmb3JtcywgLi4uKS5cclxuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XHJcbiAgICAgICAgY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnZva2VMaWZlY3ljbGUoY29tcG9uZW50UmVmLmluc3RhbmNlLCAncGdHcmlkSW5pdCcsIG5vcm1hbGl6ZWRQYXJhbXMpO1xyXG4gICAgICAgIHRoaXMuaW52b2tlTGlmZWN5Y2xlKGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgJ3BnR3JpZFJlZnJlc2gnLCBub3JtYWxpemVkUGFyYW1zKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHRoaXMubW91bnRzLnNldChlbGVtZW50LCB7IGtpbmQ6ICdjb21wb25lbnQnLCByZWY6IGNvbXBvbmVudFJlZiB9KTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENvbXBvbmVudElucHV0PFRDb21wb25lbnQ+KFxyXG4gICAgICAgIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFRDb21wb25lbnQ+LFxyXG4gICAgICAgIGtleTogc3RyaW5nLFxyXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbm9ybWFsaXplUmVuZGVyZXJQYXJhbXM8VFBhcmFtcz4ocGFyYW1zOiBUUGFyYW1zKTogVFBhcmFtcyAmIHsgdmFsdWU/OiB1bmtub3duOyByYXdWYWx1ZT86IHVua25vd24gfSB7XHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHsgLi4uKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSBub3JtYWxpemVkWydvcHRpb24nXTtcclxuXHJcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRbJ3ZhbHVlJ10gPT09IHVuZGVmaW5lZCAmJiBvcHRpb24gJiYgdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSAob3B0aW9uIGFzIHsgdmFsdWU/OiB1bmtub3duIH0pLnZhbHVlO1xyXG4gICAgICAgICAgICBub3JtYWxpemVkWyd2YWx1ZSddID0gb3B0aW9uVmFsdWU7XHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRbJ3Jhd1ZhbHVlJ10gPSBvcHRpb25WYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkIGFzIFRQYXJhbXMgJiB7IHZhbHVlPzogdW5rbm93bjsgcmF3VmFsdWU/OiB1bmtub3duIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbmZlcklucHV0czxUQ29tcG9uZW50LCBUUGFyYW1zPihcclxuICAgICAgICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUQ29tcG9uZW50PixcclxuICAgICAgICBwYXJhbXM6IFRQYXJhbXMsXHJcbiAgICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAgICAgY29uc3QgaW5wdXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHBhcmFtQmFnID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHBhcmFtQmFnWydyb3cnXSAmJiB0eXBlb2YgcGFyYW1CYWdbJ3JvdyddID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IHBhcmFtQmFnWydyb3cnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaW5zdGFuY2UpKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdfX25nQ29udGV4dF9fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyYW1CYWdba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dHNba2V5XSA9IHBhcmFtQmFnW2tleV07XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJvdyAmJiByb3dba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dHNba2V5XSA9IHJvd1trZXldO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdzZWVkJyAmJiByb3cgJiYgcm93WydpZCddICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0c1trZXldID0gcm93WydpZCddO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd2YWx1ZScgJiYgcGFyYW1CYWdbJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRzW2tleV0gPSBwYXJhbUJhZ1sndmFsdWUnXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0cztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGludm9rZUxpZmVjeWNsZTxUUGFyYW1zPihcclxuICAgICAgICBpbnN0YW5jZTogdW5rbm93bixcclxuICAgICAgICBsaWZlY3ljbGU6IEdyaWRMaWZlY3ljbGVNZXRob2QsXHJcbiAgICAgICAgcGFyYW1zOiBUUGFyYW1zLFxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gKGluc3RhbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LltsaWZlY3ljbGVdO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIChjYW5kaWRhdGUgYXMgKHBhcmFtczogVFBhcmFtcykgPT4gdm9pZCkuY2FsbChpbnN0YW5jZSwgcGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtb3VudFRlbXBsYXRlPFRQYXJhbXM+KFxyXG4gICAgICAgIHNwZWM6IHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6IGltcG9ydCgnQGFuZ3VsYXIvY29yZScpLlRlbXBsYXRlUmVmPFJlbmRlcmVyQ29udGV4dDxUUGFyYW1zPj47XHJcbiAgICAgICAgICAgIGNvbnRleHQ/OiAocGFyYW1zOiBUUGFyYW1zKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcmFtczogVFBhcmFtcyxcclxuICAgICk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkUGFyYW1zID0gdGhpcy5ub3JtYWxpemVSZW5kZXJlclBhcmFtcyhwYXJhbXMpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICRpbXBsaWNpdDogbm9ybWFsaXplZFBhcmFtcyxcclxuICAgICAgICAgICAgcGFyYW1zOiBub3JtYWxpemVkUGFyYW1zLFxyXG4gICAgICAgICAgICAuLi4oc3BlYy5jb250ZXh0ID8gc3BlYy5jb250ZXh0KG5vcm1hbGl6ZWRQYXJhbXMpIDoge30pLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHZpZXdSZWYgPSBzcGVjLnRlbXBsYXRlLmNyZWF0ZUVtYmVkZGVkVmlldyhjb250ZXh0KTtcclxuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHZpZXdSZWYpO1xyXG4gICAgICAgIHZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5yZXNvbHZlVGVtcGxhdGVIb3N0KHZpZXdSZWYpO1xyXG4gICAgICAgIHRoaXMubW91bnRzLnNldChob3N0LCB7IGtpbmQ6ICd0ZW1wbGF0ZScsIHJlZjogdmlld1JlZiB9KTtcclxuICAgICAgICByZXR1cm4gaG9zdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZXMgdGhlIHRlbXBsYXRlJ3Mgc2luZ2xlIHJvb3QgZWxlbWVudCBkaXJlY3RseSB3aGVuIHBvc3NpYmxlIChzb1xyXG4gICAgICogYGVkaXRvcmAvYGZpbHRlcmAgc2xvdHMgdGhhdCBleHBlY3QgdGhlIHJldHVybmVkIGVsZW1lbnQgdG8gKmJlKiB0aGVcclxuICAgICAqIGNvbnRyb2wga2VlcCB3b3JraW5nKTsgZmFsbHMgYmFjayB0byBhIHdyYXBwZXIgYDxkaXY+YCBmb3IgdGVtcGxhdGVzXHJcbiAgICAgKiB3aXRoIG11bHRpcGxlIHJvb3Qgbm9kZXMgb3IgdGV4dC1vbmx5IGNvbnRlbnQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVzb2x2ZVRlbXBsYXRlSG9zdCh2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj4pOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgW3NpbmdsZVJvb3RdID0gdmlld1JlZi5yb290Tm9kZXM7XHJcbiAgICAgICAgaWYgKHZpZXdSZWYucm9vdE5vZGVzLmxlbmd0aCA9PT0gMSAmJiBzaW5nbGVSb290IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVJvb3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaG9zdC5jbGFzc0xpc3QuYWRkKCdwaG90b24tZ3JpZF9fdGVtcGxhdGUtaG9zdCcpO1xyXG4gICAgICAgIGhvc3QuYXBwZW5kKC4uLnZpZXdSZWYucm9vdE5vZGVzKTtcclxuICAgICAgICByZXR1cm4gaG9zdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsZWFudXBSZW1vdmVkTm9kZShub2RlOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaXJlY3RNb3VudCA9IHRoaXMubW91bnRzLmdldChub2RlKTtcclxuICAgICAgICBpZiAoZGlyZWN0TW91bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb3VudHMuZGVsZXRlKG5vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lNb3VudChkaXJlY3RNb3VudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUaGUgY29yZSBtYXkgcmVtb3ZlIGFuIGFuY2VzdG9yIChlLmcuIGFuIGVudGlyZSByZWN5Y2xlZCByb3cpXHJcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gdGhlIG1vdW50ZWQgZWxlbWVudCBpdHNlbGY7IHN3ZWVwIGZvciBhbnkgdHJhY2tlZFxyXG4gICAgICAgIC8vIGhvc3QgY29udGFpbmVkIGluIHRoZSByZW1vdmVkIHN1YnRyZWUuXHJcbiAgICAgICAgaWYgKG5vZGUuY2hpbGRFbGVtZW50Q291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50LCBtb3VudF0gb2YgdGhpcy5tb3VudHMpIHtcclxuICAgICAgICAgICAgaWYgKG5vZGUuY29udGFpbnMoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW91bnRzLmRlbGV0ZShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vdW50KG1vdW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlc3Ryb3lNb3VudChtb3VudDogUmVuZGVyZXJNb3VudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChtb3VudC5raW5kID09PSAnY29tcG9uZW50Jykge1xyXG4gICAgICAgICAgICB0aGlzLmludm9rZUxpZmVjeWNsZShtb3VudC5yZWYuaW5zdGFuY2UsICdwZ0dyaWREZXN0cm95JywgdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgY29uc3Qgdmlld1JlZiA9IG1vdW50LnJlZi5ob3N0VmlldztcclxuICAgICAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyh2aWV3UmVmKTtcclxuICAgICAgICAgICAgbW91bnQucmVmLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgdmlld1JlZiA9IG1vdW50LnJlZjtcclxuICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KHZpZXdSZWYpO1xyXG4gICAgICAgIG1vdW50LnJlZi5kZXN0cm95KCk7XHJcbiAgICB9XHJcbn0iXX0=
@@ -0,0 +1,8 @@
1
+ /** Narrowing helpers used by the adapter (and usable by consumers/tests). */
2
+ export function isComponentRendererSpec(value) {
3
+ return !!value && typeof value === 'object' && value.kind === 'component';
4
+ }
5
+ export function isTemplateRendererSpec(value) {
6
+ return !!value && typeof value === 'object' && value.kind === 'template';
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZW5kZXJlci50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5L2FuZ3VsYXItcmVuZGVyZXIudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0ZBLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsdUJBQXVCLENBQ25DLEtBQWM7SUFFZCxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFLLEtBQTRCLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztBQUN0RyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNsQyxLQUFjO0lBRWQsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSyxLQUE0QixDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7QUFDckcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVGVtcGxhdGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB0eXBlIHtcclxuICAgIENvbHVtbkRlZiBhcyBjb3JlQ29sdW1uRGVmLFxyXG4gICAgRGlzcGxheVJlbmRlcmVyUGFyYW1zLFxyXG4gICAgRWRpdG9yUmVuZGVyZXJQYXJhbXMsXHJcbiAgICBGaWx0ZXJSZW5kZXJlclBhcmFtcyxcclxuICAgIEdyb3VwUmVuZGVyZXJQYXJhbXMsXHJcbiAgICBIZWFkZXJSZW5kZXJlclBhcmFtcyxcclxuICAgIE9wdGlvblJlbmRlcmVyUGFyYW1zLFxyXG4gICAgUmVuZGVyZXJPdXRwdXQsXHJcbiAgICBTdW1tYXJ5UmVuZGVyZXJQYXJhbXMsXHJcbiAgICBUb29sdGlwUmVuZGVyZXJQYXJhbXMsXHJcbn0gZnJvbSAncGhvdG9uLWdyaWQtY29yZSc7XHJcbiBcclxuLyoqXHJcbiAqIFJlbmRlcnMgYHBhcmFtc2AgdGhyb3VnaCBhIGBAQ29tcG9uZW50YC5cclxuICpcclxuICogQSAqKm5ldyoqIGNvbXBvbmVudCBpbnN0YW5jZSBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhlIGNvcmUgaW52b2tlcyB0aGVcclxuICogcmVuZGVyZXIgKGl0IGhhcyBubyBjb25jZXB0IG9mIFwidXBkYXRlXCIsIG9ubHkgXCJwcm9kdWNlIG91dHB1dCBmb3IgdGhlc2VcclxuICogcGFyYW1zXCIpLiBgaW5wdXRzYCBpcyByZS1ldmFsdWF0ZWQgb24gZXZlcnkgbW91bnQgYW5kIGFwcGxpZWQgdmlhXHJcbiAqIGBDb21wb25lbnRSZWYuc2V0SW5wdXRgIGJlZm9yZSB0aGUgZmlyc3QgY2hhbmdlLWRldGVjdGlvbiBwYXNzLCBzbyB0aGVcclxuICogY29tcG9uZW50IHNlZXMgdGhlIGN1cnJlbnQgcGFyYW1zIGFzIGl0cyBpbml0aWFsIGBASW5wdXQoKWBzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRSZW5kZXJlclNwZWM8VFBhcmFtcywgVENvbXBvbmVudCA9IHVua25vd24+IHtcclxuICAgIHJlYWRvbmx5IGtpbmQ6ICdjb21wb25lbnQnO1xyXG4gICAgcmVhZG9ubHkgY29tcG9uZW50OiBUeXBlPFRDb21wb25lbnQ+O1xyXG4gICAgLyoqIE1hcHMgcmVuZGVyZXIgcGFyYW1zIHRvIHRoZSBjb21wb25lbnQncyBgQElucHV0KClgIGJhZy4gKi9cclxuICAgIHJlYWRvbmx5IGlucHV0cz86IChwYXJhbXM6IFRQYXJhbXMpID0+IFBhcnRpYWw8VENvbXBvbmVudD4gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxufVxyXG5cclxuLyoqIENvbnRleHQgaGFuZGVkIHRvIGFuIGA8bmctdGVtcGxhdGU+YCB1c2VkIGFzIGEgcmVuZGVyZXIuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyZXJDb250ZXh0PFRQYXJhbXM+IHtcclxuICAgIC8qKiBFbmFibGVzIGBsZXQteGAgLyBpbXBsaWNpdCBgbGV0LXBhcmFtc2AgdGVtcGxhdGUgc3ludGF4LiAqL1xyXG4gICAgJGltcGxpY2l0OiBUUGFyYW1zO1xyXG4gICAgcGFyYW1zOiBUUGFyYW1zO1xyXG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgYHBhcmFtc2AgdGhyb3VnaCBhbiBgPG5nLXRlbXBsYXRlPmAgKG9idGFpbmVkIHZpYSBgQFZpZXdDaGlsZGApLlxyXG4gKlxyXG4gKiBQcmVmZXIgYSBzaW5nbGUgcm9vdCBlbGVtZW50IGluIHRoZSB0ZW1wbGF0ZSBmb3IgYGVkaXRvcmAgLyBgZmlsdGVyYFxyXG4gKiBzbG90czogdGhlIGNvcmUgdHJlYXRzIHRoZSByZXR1cm5lZCBgSFRNTEVsZW1lbnRgIGFzIHRoZSBpbnRlcmFjdGl2ZVxyXG4gKiBjb250cm9sIGl0c2VsZiAoZS5nLiBpdCBtYXkgY2FsbCBgLmZvY3VzKClgIG9uIGl0KSwgYW5kIGEgbXVsdGktcm9vdFxyXG4gKiB0ZW1wbGF0ZSBnZXRzIHdyYXBwZWQgaW4gYSBzeW50aGV0aWMgYDxkaXY+YCBob3N0IHRoYXQgYnJlYWtzIHRoYXRcclxuICogYXNzdW1wdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVSZW5kZXJlclNwZWM8VFBhcmFtcz4ge1xyXG4gICAgcmVhZG9ubHkga2luZDogJ3RlbXBsYXRlJztcclxuICAgIHJlYWRvbmx5IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxSZW5kZXJlckNvbnRleHQ8VFBhcmFtcz4+O1xyXG4gICAgcmVhZG9ubHkgY29udGV4dD86IChwYXJhbXM6IFRQYXJhbXMpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG59XHJcblxyXG4vKipcclxuICogQSByZW5kZXJlciBzbG90IGFjY2VwdHMgZWl0aGVyOlxyXG4gKiAtIGEgZGVjbGFyYXRpdmUgc3BlYyAoYHsga2luZDogJ2NvbXBvbmVudCcgfCAndGVtcGxhdGUnLCAuLi4gfWApLCBvclxyXG4gKiAtIGEgcGxhaW4gZnVuY3Rpb24sIGZvciBjb25zdW1lcnMgd2hvIHdhbnQgdG8ga2VlcCBwcm9kdWNpbmcgcmF3XHJcbiAqICAgYEhUTUxFbGVtZW50YC9gc3RyaW5nYCBvdXRwdXQgKGlkZW50aWNhbCB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgQVBJKS5cclxuICovXHJcbmV4cG9ydCB0eXBlIENlbGxSZW5kZXJlcjxUUGFyYW1zLCBUT3V0cHV0PiA9XHJcbiAgICB8IENvbXBvbmVudFJlbmRlcmVyU3BlYzxUUGFyYW1zPlxyXG4gICAgfCBUZW1wbGF0ZVJlbmRlcmVyU3BlYzxUUGFyYW1zPlxyXG4gICAgfCBUeXBlPHVua25vd24+XHJcbiAgICB8IFRlbXBsYXRlUmVmPFJlbmRlcmVyQ29udGV4dDxUUGFyYW1zPj5cclxuICAgIHwgKChwYXJhbXM6IFRQYXJhbXMpID0+IFRPdXRwdXQpO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5SZW5kZXJlck1hcCB7XHJcbiAgICBkaXNwbGF5PzogQ2VsbFJlbmRlcmVyPERpc3BsYXlSZW5kZXJlclBhcmFtcywgUmVuZGVyZXJPdXRwdXQ+O1xyXG4gICAgZWRpdG9yPzogQ2VsbFJlbmRlcmVyPEVkaXRvclJlbmRlcmVyUGFyYW1zLCBIVE1MRWxlbWVudD47XHJcbiAgICBvcHRpb24/OiBUeXBlPGFueT4gfCBUZW1wbGF0ZVJlZjxhbnk+IHwgKChwYXJhbXM6IE9wdGlvblJlbmRlcmVyUGFyYW1zKSA9PiBIVE1MRWxlbWVudCk7XHJcbiAgICBmaWx0ZXI/OiBDZWxsUmVuZGVyZXI8RmlsdGVyUmVuZGVyZXJQYXJhbXMsIEhUTUxFbGVtZW50PjtcclxuICAgIHRvb2x0aXA/OiBDZWxsUmVuZGVyZXI8VG9vbHRpcFJlbmRlcmVyUGFyYW1zLCBSZW5kZXJlck91dHB1dD47XHJcbiAgICBncm91cD86IENlbGxSZW5kZXJlcjxHcm91cFJlbmRlcmVyUGFyYW1zLCBSZW5kZXJlck91dHB1dD47XHJcbiAgICBoZWFkZXI/OiBDZWxsUmVuZGVyZXI8SGVhZGVyUmVuZGVyZXJQYXJhbXMsIFJlbmRlcmVyT3V0cHV0PjtcclxuICAgIHN1bW1hcnk/OiBDZWxsUmVuZGVyZXI8U3VtbWFyeVJlbmRlcmVyUGFyYW1zLCBSZW5kZXJlck91dHB1dD47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBgQ29sdW1uRGVmYDogaWRlbnRpY2FsIHNoYXBlLCBleGNlcHQgYHJlbmRlcmVyYFxyXG4gKiAoYW5kIGByZW5kZXJlcmAgb24gYW55IG5lc3RlZCBgY2hpbGRyZW5gKSBhY2NlcHRzIHRoZSBkZWNsYXJhdGl2ZVxyXG4gKiBjb21wb25lbnQvdGVtcGxhdGUgc3BlY3MgYWJvdmUgaW4gYWRkaXRpb24gdG8gcGxhaW4gZnVuY3Rpb25zLlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQ29sdW1uRGVmID0gT21pdDxjb3JlQ29sdW1uRGVmLCAncmVuZGVyZXInIHwgJ2NoaWxkcmVuJz4gJiB7XHJcbiAgICByZW5kZXJlcj86IENvbHVtblJlbmRlcmVyTWFwO1xyXG4gICAgY2hpbGRyZW4/OiBDb2x1bW5EZWZbXTtcclxufTtcclxuXHJcbi8qKiBOYXJyb3dpbmcgaGVscGVycyB1c2VkIGJ5IHRoZSBhZGFwdGVyIChhbmQgdXNhYmxlIGJ5IGNvbnN1bWVycy90ZXN0cykuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudFJlbmRlcmVyU3BlYyhcclxuICAgIHZhbHVlOiB1bmtub3duLFxyXG4pOiB2YWx1ZSBpcyBDb21wb25lbnRSZW5kZXJlclNwZWM8dW5rbm93bj4ge1xyXG4gICAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAodmFsdWUgYXMgeyBraW5kPzogdW5rbm93biB9KS5raW5kID09PSAnY29tcG9uZW50JztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVtcGxhdGVSZW5kZXJlclNwZWMoXHJcbiAgICB2YWx1ZTogdW5rbm93bixcclxuKTogdmFsdWUgaXMgVGVtcGxhdGVSZW5kZXJlclNwZWM8dW5rbm93bj4ge1xyXG4gICAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAodmFsdWUgYXMgeyBraW5kPzogdW5rbm93biB9KS5raW5kID09PSAndGVtcGxhdGUnO1xyXG59Il19