ngx-reactify 0.0.3 → 0.1.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.
@@ -10,137 +10,205 @@ import { firstValueFrom } from 'rxjs';
10
10
  * Usage: An Angular top-level application with a ReactifyNgComponent react implementation
11
11
  * that needs to embed Angular components as children of the react-wrapped component.
12
12
  *
13
- * @experimental
14
- * @param componentClass Angular component
15
- * @param envInjector An `EnvironmentInjector` instance to be used for the component
16
- * @param injector An `ElementInjector` instance
17
- * @param _inputs
18
- * @param _outputs
19
- * @returns
13
+ * This is replaced by `WrapAngularComponentInReact`.
14
+ * @deprecated
20
15
  */
21
16
  export const ReactifyAngularComponent = ({ component, appRef, injector, ngZone, staticInputs = {}, staticOutputs = {}, preSiblings = [], postSiblings = [], additionalChildren = [], rootElementName = '', containerElementName = '' }) => React.memo((args) => {
22
17
  return ngZone.runOutsideAngular(() => {
23
- const id = Math.random().toString();
18
+ let outputSubscriptions;
19
+ let componentInstance;
20
+ const tripChangeDetection = () => componentInstance?.changeDetectorRef?.detectChanges();
21
+ // These attributes will trigger change detection when they fire from
22
+ // the underlying React element.
23
+ // ... This will break things. FUCK.
24
+ const attributes = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];
25
+ const attrObj = {};
26
+ attributes.forEach(a => attrObj[a] = tripChangeDetection);
24
27
  React.useEffect(() => {
25
- try {
26
- const componentInstance = createComponent(component, {
27
- environmentInjector: appRef.injector,
28
- elementInjector: injector,
29
- hostElement: document.getElementById(id)
30
- });
31
- appRef.attachView(componentInstance.hostView);
32
- // @ts-ignore
33
- // component.hostView = hostView;
34
- Object.assign(staticInputs, args);
35
- const { inputs, outputs } = component['ɵcmp'];
36
- // Returns a list of entries that need to be set
37
- // This makes it so that unnecessary setters are not invoked.
38
- const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
39
- return componentInstance.instance[childKey] != staticInputs[parentKey];
40
- });
41
- updated.forEach(([parentKey, childKey]) => {
42
- if (staticInputs.hasOwnProperty(parentKey))
43
- componentInstance.instance[childKey] = staticInputs[parentKey];
44
- });
45
- const outputSubscriptions = {};
46
- // Get a list of unregistered outputs
47
- const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
48
- return !outputSubscriptions[parentKey];
49
- });
50
- // Reverse bind via subscription
51
- newOutputs.forEach(([parentKey, childKey]) => {
52
- if (!staticOutputs.hasOwnProperty(parentKey))
53
- return;
54
- const target = componentInstance.instance[childKey];
55
- const outputs = staticOutputs;
56
- const sub = target.subscribe((...args) => {
57
- // Run the callback in the provided zone
58
- ngZone.run(() => {
59
- outputs[parentKey](...args);
60
- });
61
- }); // Subscription
62
- outputSubscriptions[parentKey] = sub;
63
- });
64
- // Wrap the destroy method to safely release the subscriptions
65
- const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
66
- componentInstance.onDestroy = (cb) => {
67
- Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
68
- originalDestroy?.(cb);
69
- };
70
- componentInstance.changeDetectorRef.detectChanges();
71
- }
72
- catch (err) {
73
- console.error(err);
74
- }
28
+ return () => {
29
+ // Code to run when the component unmounts
30
+ appRef?.detachView(componentInstance.hostView);
31
+ Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
32
+ componentInstance?.destroy();
33
+ };
75
34
  }, []);
76
35
  const elements = [
77
36
  ...(preSiblings || []),
78
- React.createElement(containerElementName || "div", { id }),
37
+ React.createElement(containerElementName || "div", {
38
+ ...attrObj,
39
+ ref: node => {
40
+ const { inputs, outputs } = component['ɵcmp'];
41
+ if (componentInstance)
42
+ return;
43
+ ngZone.run(() => {
44
+ componentInstance = createComponent(component, {
45
+ environmentInjector: appRef.injector,
46
+ elementInjector: injector,
47
+ hostElement: node
48
+ });
49
+ Object.assign(staticInputs, args);
50
+ appRef.attachView(componentInstance.hostView);
51
+ });
52
+ // Returns a list of entries that need to be set
53
+ // This makes it so that unnecessary setters are not invoked.
54
+ const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
55
+ return componentInstance.instance[childKey] != staticInputs[parentKey];
56
+ });
57
+ updated.forEach(([parentKey, childKey]) => {
58
+ if (staticInputs.hasOwnProperty(parentKey))
59
+ componentInstance.instance[childKey] = staticInputs[parentKey];
60
+ });
61
+ outputSubscriptions = {};
62
+ // Get a list of unregistered outputs
63
+ const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
64
+ return !outputSubscriptions[parentKey];
65
+ });
66
+ // Reverse bind via subscription
67
+ newOutputs.forEach(([parentKey, childKey]) => {
68
+ if (!staticOutputs.hasOwnProperty(parentKey))
69
+ return;
70
+ const target = componentInstance.instance[childKey];
71
+ const outputs = staticOutputs;
72
+ const sub = target.subscribe((...args) => {
73
+ // Run the callback in the provided zone
74
+ ngZone.run(() => {
75
+ outputs[parentKey](...args);
76
+ });
77
+ }); // Subscription
78
+ outputSubscriptions[parentKey] = sub;
79
+ });
80
+ // Wrap the destroy method to safely release the subscriptions
81
+ const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
82
+ componentInstance.onDestroy = (cb) => {
83
+ Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
84
+ originalDestroy?.(cb);
85
+ };
86
+ componentInstance.changeDetectorRef.detectChanges();
87
+ }
88
+ }),
79
89
  ...(postSiblings || []),
80
90
  ...(additionalChildren || [])
81
91
  ].filter(e => e);
82
92
  return React.createElement(rootElementName || "div", {}, ...elements);
83
93
  });
84
94
  });
85
- // TODO: Remove in major release.
86
- export const ReactifyReactComponent = ReactifyAngularComponent;
87
95
  /**
88
96
  * Do not use this.
89
97
  * @hidden
90
98
  * @experimental
91
99
  */
92
- export function ReactifyAngularComponent3(component, ngZone, appRef, injector, props = {}, containerTag = 'div') {
100
+ export const ng2ReactProps = (obj = {}) => {
101
+ const props = {};
102
+ Object.entries(obj).forEach(([k, v]) => {
103
+ // Omit things prefixed with an underscore
104
+ if (k.startsWith('_'))
105
+ return;
106
+ // Omit output event emitters
107
+ if (v instanceof EventEmitter) {
108
+ props[k] = (...args) => v.emit([args]);
109
+ }
110
+ else {
111
+ props[k] = v;
112
+ }
113
+ });
114
+ return props;
115
+ };
116
+ /**
117
+ * This method will create a React component that
118
+ * wraps an Angular component.
119
+ * @returns React.NamedExoticComponent
120
+ *
121
+ * @hidden
122
+ * @experimental
123
+ */
124
+ export function WrapAngularComponentInReact({ component, ngZone, appRef, injector, props, containerTag, reactTemplate, projectableNodes }) {
125
+ props ??= {};
126
+ containerTag ??= 'div';
93
127
  const ctx = this;
94
- console.log("ReactifyAngularComponent3");
95
- return ngZone.runOutsideAngular(() => {
96
- // Is there a better way to do this?
97
- let subscriptions;
98
- let app;
99
- let componentInstance;
100
- React.useEffect(() => {
101
- return () => {
102
- // Code to run when the component unmounts
103
- subscriptions?.forEach(s => s?.unsubscribe());
104
- // app?.destroy();
105
- appRef.detachView(componentInstance.hostView);
106
- };
107
- }, []);
108
- return React.createElement(containerTag, {
109
- ref: async (node) => {
110
- // Not sure if this ever actually happens, added as a preventative measure
111
- // to memory leaks.
112
- subscriptions?.forEach(s => s?.unsubscribe());
113
- app?.destroy();
114
- // ngZone.run(async () => {
115
- // Init an Angular application root & bootstrap it to a DOM element.
116
- componentInstance = createComponent(component, {
117
- environmentInjector: appRef.injector,
118
- elementInjector: injector,
119
- hostElement: node
120
- });
121
- appRef.attachView(componentInstance.hostView);
122
- // app = await createApplication({ providers });
123
- // const base = app.bootstrap(component, node);
124
- // const { instance } = base;
125
- // Wait for the JS to finish rendering and initing.
126
- // await firstValueFrom(app.isStable);
127
- // Now that everything has settled, bind inputs and outputs.
128
- subscriptions = [];
129
- Object.entries(props).filter(([k, v]) => {
130
- // @Outputs are always Event Emitters (I think)
131
- if (v instanceof EventEmitter) {
132
- subscriptions.push(componentInstance.instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
133
- }
134
- else {
135
- componentInstance.instance[k] = props[k];
136
- }
137
- });
138
- // })
139
- // app.tick();
140
- }
128
+ const createWrappedElement = () => {
129
+ reactTemplate ??= (el) => el;
130
+ return React.memo((args) => {
131
+ // Is there a better way to do this?
132
+ let subscriptions;
133
+ let componentInstance;
134
+ Object.assign(props, args);
135
+ React.useEffect(() => {
136
+ return () => {
137
+ // Cleanup and dispose leftover Angular objects
138
+ appRef?.detachView(componentInstance.hostView);
139
+ subscriptions?.forEach(s => s?.unsubscribe());
140
+ componentInstance?.destroy();
141
+ };
142
+ }, []);
143
+ const tripChangeDetection = () => componentInstance?.changeDetectorRef?.detectChanges();
144
+ // These attributes will trigger change detection when they fire from
145
+ // the underlying React element.
146
+ // ... This will break things. FUCK.
147
+ const attributes = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];
148
+ const attrObj = {};
149
+ attributes.forEach(a => attrObj[a] = tripChangeDetection);
150
+ return reactTemplate(React.createElement(containerTag, {
151
+ ...attrObj,
152
+ ref: async (node) => {
153
+ if (componentInstance)
154
+ return;
155
+ // Not sure if this ever actually happens, added as a preventative measure
156
+ // to memory leaks.
157
+ subscriptions?.forEach(s => s?.unsubscribe());
158
+ const bootstrap = () => {
159
+ // Init the Angular component with the context of the root Angular app.
160
+ componentInstance = createComponent(component, {
161
+ environmentInjector: appRef.injector,
162
+ elementInjector: injector,
163
+ hostElement: node,
164
+ projectableNodes: projectableNodes
165
+ });
166
+ appRef.attachView(componentInstance.hostView);
167
+ };
168
+ ngZone?.runTask
169
+ ? ngZone?.runTask(bootstrap)
170
+ : bootstrap();
171
+ // Now that everything has settled, bind inputs and outputs.
172
+ subscriptions = [];
173
+ Object.entries(props).filter(([k, v]) => {
174
+ // @Outputs are always Event Emitters (I think)
175
+ if (v instanceof EventEmitter) {
176
+ subscriptions.push(componentInstance.instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
177
+ }
178
+ else {
179
+ componentInstance.instance[k] = props[k];
180
+ }
181
+ });
182
+ componentInstance.changeDetectorRef.detectChanges();
183
+ }
184
+ }));
141
185
  });
142
- });
186
+ };
187
+ return ngZone?.runOutsideAngular
188
+ ? ngZone?.runOutsideAngular(createWrappedElement)
189
+ : createWrappedElement();
143
190
  }
191
+ /**
192
+ * This method will automatically wrap an Angular
193
+ * Component or Directive into a React object.
194
+ * @Outputs (EventEmitters) will be automatically
195
+ * linked into the input properties along with
196
+ * all of the @Inputs.
197
+ * @returns React.NamedExoticComponent
198
+ * @experimental
199
+ */
200
+ export const AutoWrapAngularObject = ({ component, appRef, ngZone, instance, injector, containerTag, reactTemplate, }) => {
201
+ const props = ng2ReactProps(instance);
202
+ return WrapAngularComponentInReact({
203
+ component,
204
+ ngZone,
205
+ appRef,
206
+ injector,
207
+ containerTag,
208
+ props,
209
+ reactTemplate
210
+ });
211
+ };
144
212
  /**
145
213
  * Bootstrap an Angular component with `createApplication` and export it under a
146
214
  * react Element.
@@ -158,7 +226,8 @@ export function ReactifyStandaloneAngularComponent(component, props = {}, provid
158
226
  app?.destroy();
159
227
  };
160
228
  }, []);
161
- return React.createElement(containerTag, { ref: async (node) => {
229
+ return React.createElement(containerTag, {
230
+ ref: async (node) => {
162
231
  // Not sure if this ever actually happens, added as a preventative measure
163
232
  // to memory leaks.
164
233
  subscriptions?.forEach(s => s?.unsubscribe());
@@ -181,6 +250,11 @@ export function ReactifyStandaloneAngularComponent(component, props = {}, provid
181
250
  }
182
251
  });
183
252
  base.changeDetectorRef.detectChanges();
184
- } });
253
+ }
254
+ });
185
255
  }
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10by1yZWFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL2FuZ3VsYXItdG8tcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQyxlQUFlLEVBQUUsWUFBWSxFQUFnRCxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUdwRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEVBQ3JDLFNBQVMsRUFDVCxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEdBQUcsRUFBRSxFQUNqQixhQUFhLEdBQUcsRUFBRSxFQUNsQixXQUFXLEdBQUcsRUFBRSxFQUNoQixZQUFZLEdBQUcsRUFBRSxFQUNqQixrQkFBa0IsR0FBRyxFQUFFLEVBQ3ZCLGVBQWUsR0FBRyxFQUFFLEVBQ3BCLG9CQUFvQixHQUFHLEVBQUUsRUFhNUIsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBRXRCLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtRQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBSSxDQUFDO2dCQUVELE1BQU0saUJBQWlCLEdBQUcsZUFBZSxDQUFDLFNBQVMsRUFBRTtvQkFDakQsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFFBQVE7b0JBQ3BDLGVBQWUsRUFBRSxRQUFRO29CQUN6QixXQUFXLEVBQUUsUUFB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RSxDQUFDLENBQUM7WUFDOUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBRWYsb0VBQW9FO1lBQ3BFLEdBQUcsR0FBRyxNQUFNLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBRzFCLG1EQUFtRDtZQUNuRCxNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkMsNERBQTREO1lBQzVELGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNwQywrQ0FBK0M7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLFlBQVksRUFBRSxDQUFDO29CQUM1QixhQUFhLENBQUMsSUFBSSxDQUNkLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUN6RCxDQUFDO2dCQUNOLENBQUM7cUJBQ0ksQ0FBQztvQkFDRixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0MsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBBcHBsaWNhdGlvblJlZiwgSW5qZWN0b3IsIE5nWm9uZSwgY3JlYXRlQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIFByb3ZpZGVyLCBFbnZpcm9ubWVudFByb3ZpZGVycywgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVBcHBsaWNhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5cbi8qKlxuICogV3JhcCBhbiBBbmd1bGFyIGNvbXBvbmVudCBpbnNpZGUgb2YgYSBSZWFjdCBtZW1vIG9iamVjdC5cbiAqIFdpbGwgYXR0ZW1wdCB0byBiaW5kIEBJbnB1dCBhbmQgQE91dHB1dCBwcm9wZXJ0aWVzIGlmIHByb3ZpZGVkLFxuICogYW5kIHdpbGwgYmluZCB0aGUgcmVhY3QgYXJndW1lbnRzIGRpcmVjdGx5IGFzIEBJbnB1dCBwcm9wZXJ0aWVzLlxuICpcbiAqIFVzYWdlOiBBbiBBbmd1bGFyIHRvcC1sZXZlbCBhcHBsaWNhdGlvbiB3aXRoIGEgUmVhY3RpZnlOZ0NvbXBvbmVudCByZWFjdCBpbXBsZW1lbnRhdGlvblxuICogdGhhdCBuZWVkcyB0byBlbWJlZCBBbmd1bGFyIGNvbXBvbmVudHMgYXMgY2hpbGRyZW4gb2YgdGhlIHJlYWN0LXdyYXBwZWQgY29tcG9uZW50LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyBBbmd1bGFyIGNvbXBvbmVudFxuICogQHBhcmFtIGVudkluamVjdG9yICAgIEFuIGBFbnZpcm9ubWVudEluamVjdG9yYCBpbnN0YW5jZSB0byBiZSB1c2VkIGZvciB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0gaW5qZWN0b3IgICAgICAgQW4gYEVsZW1lbnRJbmplY3RvcmAgaW5zdGFuY2VcbiAqIEBwYXJhbSBfaW5wdXRzXG4gKiBAcGFyYW0gX291dHB1dHNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBSZWFjdGlmeUFuZ3VsYXJDb21wb25lbnQgPSAoe1xuICAgIGNvbXBvbmVudCxcbiAgICBhcHBSZWYsXG4gICAgaW5qZWN0b3IsXG4gICAgbmdab25lLFxuICAgIHN0YXRpY0lucHV0cyA9IHt9LFxuICAgIHN0YXRpY091dHB1dHMgPSB7fSxcbiAgICBwcmVTaWJsaW5ncyA9IFtdLFxuICAgIHBvc3RTaWJsaW5ncyA9IFtdLFxuICAgIGFkZGl0aW9uYWxDaGlsZHJlbiA9IFtdLFxuICAgIHJvb3RFbGVtZW50TmFtZSA9ICcnLFxuICAgIGNvbnRhaW5lckVsZW1lbnROYW1lID0gJydcbn06IHtcbiAgICBjb21wb25lbnQ6IFR5cGU8YW55PixcbiAgICBhcHBSZWY6IE9taXQ8QXBwbGljYXRpb25SZWYsICdfcnVubmluZ1RpY2snPixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgbmdab25lOiBOZ1pvbmUsXG4gICAgc3RhdGljSW5wdXRzPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sXG4gICAgc3RhdGljT3V0cHV0cz86IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb247IH0sXG4gICAgcHJlU2libGluZ3M/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICBwb3N0U2libGluZ3M/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICBhZGRpdGlvbmFsQ2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICByb290RWxlbWVudE5hbWU/OiBQYXJhbWV0ZXJzPHR5cGVvZiBSZWFjdC5jcmVhdGVFbGVtZW50PlswXSxcbiAgICBjb250YWluZXJFbGVtZW50TmFtZT86IHN0cmluZztcbn0pID0+IFJlYWN0Lm1lbW8oKGFyZ3MpID0+IHtcblxuICAgIHJldHVybiBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKTtcbiAgICAgICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogYXBwUmVmLmluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5qZWN0b3I6IGluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBob3N0RWxlbWVudDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBhcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5ob3N0VmlldyA9IGhvc3RWaWV3O1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0aWNJbnB1dHMsIGFyZ3MpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMgfSA9IGNvbXBvbmVudFsnybVjbXAnXTtcblxuICAgICAgICAgICAgICAgIC8vIFJldHVybnMgYSBsaXN0IG9mIGVudHJpZXMgdGhhdCBuZWVkIHRvIGJlIHNldFxuICAgICAgICAgICAgICAgIC8vIFRoaXMgbWFrZXMgaXQgc28gdGhhdCB1bm5lY2Vzc2FyeSBzZXR0ZXJzIGFyZSBub3QgaW52b2tlZC5cbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gT2JqZWN0LmVudHJpZXMoaW5wdXRzKS5maWx0ZXIoKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldICE9IHN0YXRpY0lucHV0c1twYXJlbnRLZXldO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdXBkYXRlZC5mb3JFYWNoKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY0lucHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldID0gc3RhdGljSW5wdXRzW3BhcmVudEtleV07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRTdWJzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IFN1YnNjcmlwdGlvbjsgfSA9IHt9O1xuICAgICAgICAgICAgICAgIC8vIEdldCBhIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIG91dHB1dHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdPdXRwdXRzID0gT2JqZWN0LmVudHJpZXMob3V0cHV0cykuZmlsdGVyKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFvdXRwdXRTdWJzY3JpcHRpb25zW3BhcmVudEtleV07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIGJpbmQgdmlhIHN1YnNjcmlwdGlvblxuICAgICAgICAgICAgICAgIG5ld091dHB1dHMuZm9yRWFjaCgoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGljT3V0cHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0OiBFdmVudEVtaXR0ZXI8dW5rbm93bj4gPSBjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZVtjaGlsZEtleV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBzdGF0aWNPdXRwdXRzO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IHRhcmdldC5zdWJzY3JpYmUoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgY2FsbGJhY2sgaW4gdGhlIHByb3ZpZGVkIHpvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbcGFyZW50S2V5XSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgLy8gU3Vic2NyaXB0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3Vic2NyaXB0aW9uc1twYXJlbnRLZXldID0gc3ViO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gV3JhcCB0aGUgZGVzdHJveSBtZXRob2QgdG8gc2FmZWx5IHJlbGVhc2UgdGhlIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnRJbnN0YW5jZS5vbkRlc3Ryb3k/LmJpbmQoY29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLm9uRGVzdHJveSA9IChjYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKG91dHB1dFN1YnNjcmlwdGlvbnMpLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LihjYik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IFtcbiAgICAgICAgICAgIC4uLihwcmVTaWJsaW5ncyB8fCBbXSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRhaW5lckVsZW1lbnROYW1lIHx8IFwiZGl2XCIsIHsgaWQgfSksXG4gICAgICAgICAgICAuLi4ocG9zdFNpYmxpbmdzIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLihhZGRpdGlvbmFsQ2hpbGRyZW4gfHwgW10pXG4gICAgICAgIF0uZmlsdGVyKGUgPT4gZSk7XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQocm9vdEVsZW1lbnROYW1lIHx8IFwiZGl2XCIsIHt9LCAuLi5lbGVtZW50cyk7XG4gICAgfSlcbn0pO1xuLy8gVE9ETzogUmVtb3ZlIGluIG1ham9yIHJlbGVhc2UuXG5leHBvcnQgY29uc3QgUmVhY3RpZnlSZWFjdENvbXBvbmVudCA9IFJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudDtcblxuLyoqXG4gKiBEbyBub3QgdXNlIHRoaXMuXG4gKiBAaGlkZGVuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWFjdGlmeUFuZ3VsYXJDb21wb25lbnQzKFxuICAgIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICAgIG5nWm9uZTogTmdab25lLFxuICAgIGFwcFJlZjogT21pdDxBcHBsaWNhdGlvblJlZiwgJ19ydW5uaW5nVGljayc+LFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm9wczogYW55ID0ge30sXG4gICAgY29udGFpbmVyVGFnOiBzdHJpbmcgPSAnZGl2J1xuKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcbiAgICBjb25zb2xlLmxvZyhcIlJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudDNcIilcblxuICAgIHJldHVybiBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xuICAgICAgICBsZXQgYXBwOiBBcHBsaWNhdGlvblJlZjtcbiAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlOiBDb21wb25lbnRSZWY8YW55PjtcblxuICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb2RlIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zPy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICAgICAgLy8gYXBwPy5kZXN0cm95KCk7XG5cbiAgICAgICAgICAgICAgICBhcHBSZWYuZGV0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGFpbmVyVGFnLCB7XG4gICAgICAgICAgICByZWY6IGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgaWYgdGhpcyBldmVyIGFjdHVhbGx5IGhhcHBlbnMsIGFkZGVkIGFzIGEgcHJldmVudGF0aXZlIG1lYXN1cmVcbiAgICAgICAgICAgICAgICAvLyB0byBtZW1vcnkgbGVha3MuXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucz8uZm9yRWFjaChzID0+IHM/LnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgICAgICAgIGFwcD8uZGVzdHJveSgpO1xuXG5cbiAgICAgICAgICAgICAgICAvLyBuZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJbml0IGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gcm9vdCAmIGJvb3RzdHJhcCBpdCB0byBhIERPTSBlbGVtZW50LlxuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGFwcFJlZi5pbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluamVjdG9yOiBpbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgaG9zdEVsZW1lbnQ6IG5vZGVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudEluc3RhbmNlLmhvc3RWaWV3KTtcbiAgICAgICAgICAgICAgICAvLyBhcHAgPSBhd2FpdCBjcmVhdGVBcHBsaWNhdGlvbih7IHByb3ZpZGVycyB9KTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBiYXNlID0gYXBwLmJvb3RzdHJhcChjb21wb25lbnQsIG5vZGUpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGJhc2U7XG5cblxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBKUyB0byBmaW5pc2ggcmVuZGVyaW5nIGFuZCBpbml0aW5nLlxuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGZpcnN0VmFsdWVGcm9tKGFwcC5pc1N0YWJsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCBldmVyeXRoaW5nIGhhcyBzZXR0bGVkLCBiaW5kIGlucHV0cyBhbmQgb3V0cHV0cy5cbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZpbHRlcigoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEBPdXRwdXRzIGFyZSBhbHdheXMgRXZlbnQgRW1pdHRlcnMgKEkgdGhpbmspXG4gICAgICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2Vba10/LnN1YnNjcmliZShldnQgPT4gcHJvcHNba10uY2FsbChjdHgsIGV2dCkpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2Vba10gPSBwcm9wc1trXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIH0pXG5cbiAgICAgICAgICAgICAgICAvLyBhcHAudGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEJvb3RzdHJhcCBhbiBBbmd1bGFyIGNvbXBvbmVudCB3aXRoIGBjcmVhdGVBcHBsaWNhdGlvbmAgYW5kIGV4cG9ydCBpdCB1bmRlciBhXG4gKiByZWFjdCBFbGVtZW50LlxuICogVXNhZ2U6IFJlYWN0IHRvcC1sZXZlbCBhcHBsaWNhdGlvbiBlbWJlZGRpbmcgYW4gQW5ndWxhciBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWFjdGlmeVN0YW5kYWxvbmVBbmd1bGFyQ29tcG9uZW50KFxuICAgIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICAgIHByb3BzOiBhbnkgPSB7fSxcbiAgICBwcm92aWRlcnM6IChQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzKVtdID0gW10sXG4gICAgY29udGFpbmVyVGFnOiBzdHJpbmcgPSAnZGl2J1xuKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcblxuICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuICAgIGxldCBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXTtcbiAgICBsZXQgYXBwOiBBcHBsaWNhdGlvblJlZjtcblxuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBDb2RlIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM/LmZvckVhY2gocyA9PiBzPy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgIGFwcD8uZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRhaW5lclRhZywgeyByZWY6IGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgIC8vIE5vdCBzdXJlIGlmIHRoaXMgZXZlciBhY3R1YWxseSBoYXBwZW5zLCBhZGRlZCBhcyBhIHByZXZlbnRhdGl2ZSBtZWFzdXJlXG4gICAgICAgIC8vIHRvIG1lbW9yeSBsZWFrcy5cbiAgICAgICAgc3Vic2NyaXB0aW9ucz8uZm9yRWFjaChzID0+IHM/LnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICBhcHA/LmRlc3Ryb3koKTtcblxuICAgICAgICAvLyBJbml0IGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gcm9vdCAmIGJvb3RzdHJhcCBpdCB0byBhIERPTSBlbGVtZW50LlxuICAgICAgICBhcHAgPSBhd2FpdCBjcmVhdGVBcHBsaWNhdGlvbih7IHByb3ZpZGVycyB9KTtcbiAgICAgICAgY29uc3QgYmFzZSA9IGFwcC5ib290c3RyYXAoY29tcG9uZW50LCBub2RlKTtcbiAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gYmFzZTtcblxuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBKUyB0byBmaW5pc2ggcmVuZGVyaW5nIGFuZCBpbml0aW5nLlxuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShhcHAuaXNTdGFibGUpO1xuXG4gICAgICAgIC8vIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHNldHRsZWQsIGJpbmQgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgICAgICBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5maWx0ZXIoKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgLy8gQE91dHB1dHMgYXJlIGFsd2F5cyBFdmVudCBFbWl0dGVycyAoSSB0aGluaylcbiAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrXT8uc3Vic2NyaWJlKGV2dCA9PiBwcm9wc1trXS5jYWxsKGN0eCwgZXZ0KSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Vba10gPSBwcm9wc1trXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYmFzZS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSB9KTtcbn1cbiJdfQ==
256
+ // These exports exist to attempt to make the API have minimal breaking changes.
257
+ export const ReactifyReactComponent = ReactifyAngularComponent;
258
+ export const ReactifyAngularComponent3 = WrapAngularComponentInReact;
259
+ ;
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10by1yZWFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL2FuZ3VsYXItdG8tcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQyxlQUFlLEVBQUUsWUFBWSxFQUFnRCxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUdwRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxFQUNyQyxTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sWUFBWSxHQUFHLEVBQUUsRUFDakIsYUFBYSxHQUFHLEVBQUUsRUFDbEIsV0FBVyxHQUFHLEVBQUUsRUFDaEIsWUFBWSxHQUFHLEVBQUUsRUFDakIsa0JBQWtCLEdBQUcsRUFBRSxFQUN2QixlQUFlLEdBQUcsRUFBRSxFQUNwQixvQkFBb0IsR0FBRyxFQUFFLEVBYTVCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtJQUV0QixPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7UUFDakMsSUFBSSxtQkFBcUQsQ0FBQztRQUMxRCxJQUFJLGlCQUFvQyxDQUFDO1FBRXpDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxFQUFFLENBQzdCLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxDQUFDO1FBRTFELHFFQUFxRTtRQUNyRSxnQ0FBZ0M7UUFDaEMsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUEwQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVB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Q0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3pELENBQUM7Z0JBQ04sQ0FBQztxQkFDSSxDQUFDO29CQUNGLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUlELGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMvRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQztBQUFBLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBBcHBsaWNhdGlvblJlZiwgSW5qZWN0b3IsIE5nWm9uZSwgY3JlYXRlQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIFByb3ZpZGVyLCBFbnZpcm9ubWVudFByb3ZpZGVycywgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVBcHBsaWNhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5cbi8qKlxuICogV3JhcCBhbiBBbmd1bGFyIGNvbXBvbmVudCBpbnNpZGUgb2YgYSBSZWFjdCBtZW1vIG9iamVjdC5cbiAqIFdpbGwgYXR0ZW1wdCB0byBiaW5kIEBJbnB1dCBhbmQgQE91dHB1dCBwcm9wZXJ0aWVzIGlmIHByb3ZpZGVkLFxuICogYW5kIHdpbGwgYmluZCB0aGUgcmVhY3QgYXJndW1lbnRzIGRpcmVjdGx5IGFzIEBJbnB1dCBwcm9wZXJ0aWVzLlxuICpcbiAqIFVzYWdlOiBBbiBBbmd1bGFyIHRvcC1sZXZlbCBhcHBsaWNhdGlvbiB3aXRoIGEgUmVhY3RpZnlOZ0NvbXBvbmVudCByZWFjdCBpbXBsZW1lbnRhdGlvblxuICogdGhhdCBuZWVkcyB0byBlbWJlZCBBbmd1bGFyIGNvbXBvbmVudHMgYXMgY2hpbGRyZW4gb2YgdGhlIHJlYWN0LXdyYXBwZWQgY29tcG9uZW50LlxuICpcbiAqIFRoaXMgaXMgcmVwbGFjZWQgYnkgYFdyYXBBbmd1bGFyQ29tcG9uZW50SW5SZWFjdGAuXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgY29uc3QgUmVhY3RpZnlBbmd1bGFyQ29tcG9uZW50ID0gKHtcbiAgICBjb21wb25lbnQsXG4gICAgYXBwUmVmLFxuICAgIGluamVjdG9yLFxuICAgIG5nWm9uZSxcbiAgICBzdGF0aWNJbnB1dHMgPSB7fSxcbiAgICBzdGF0aWNPdXRwdXRzID0ge30sXG4gICAgcHJlU2libGluZ3MgPSBbXSxcbiAgICBwb3N0U2libGluZ3MgPSBbXSxcbiAgICBhZGRpdGlvbmFsQ2hpbGRyZW4gPSBbXSxcbiAgICByb290RWxlbWVudE5hbWUgPSAnJyxcbiAgICBjb250YWluZXJFbGVtZW50TmFtZSA9ICcnXG59OiB7XG4gICAgY29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgYXBwUmVmOiBPbWl0PEFwcGxpY2F0aW9uUmVmLCAnX3J1bm5pbmdUaWNrJz4sXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIG5nWm9uZTogTmdab25lLFxuICAgIHN0YXRpY0lucHV0cz86IHsgW2tleTogc3RyaW5nXTogYW55OyB9LFxuICAgIHN0YXRpY091dHB1dHM/OiB7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uOyB9LFxuICAgIHByZVNpYmxpbmdzPzogUmVhY3QuUmVhY3ROb2RlW10sXG4gICAgcG9zdFNpYmxpbmdzPzogUmVhY3QuUmVhY3ROb2RlW10sXG4gICAgYWRkaXRpb25hbENoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlW10sXG4gICAgcm9vdEVsZW1lbnROYW1lPzogUGFyYW1ldGVyczx0eXBlb2YgUmVhY3QuY3JlYXRlRWxlbWVudD5bMF0sXG4gICAgY29udGFpbmVyRWxlbWVudE5hbWU/OiBzdHJpbmc7XG59KSA9PiBSZWFjdC5tZW1vKChhcmdzKSA9PiB7XG5cbiAgICByZXR1cm4gbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgbGV0IG91dHB1dFN1YnNjcmlwdGlvbnM6IHsgW2tleTogc3RyaW5nXTogU3Vic2NyaXB0aW9uOyB9O1xuICAgICAgICBsZXQgY29tcG9uZW50SW5zdGFuY2U6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gICAgICAgIGNvbnN0IHRyaXBDaGFuZ2VEZXRlY3Rpb24gPSAoKSA9PlxuICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2U/LmNoYW5nZURldGVjdG9yUmVmPy5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgLy8gVGhlc2UgYXR0cmlidXRlcyB3aWxsIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB3aGVuIHRoZXkgZmlyZSBmcm9tXG4gICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIFJlYWN0IGVsZW1lbnQuXG4gICAgICAgIC8vIC4uLiBUaGlzIHdpbGwgYnJlYWsgdGhpbmdzLiBGVUNLLlxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBBcnJheTxrZXlvZiBSZWFjdC5ET01BdHRyaWJ1dGVzPGFueT4+ID0gWydvbkNvcHknLCAnb25DdXQnLCAnb25QYXN0ZScsICdvbkFib3J0JywgJ29uQmx1cicsICdvbkZvY3VzJywgJ29uQ2FuUGxheScsICdvbkNhblBsYXlUaHJvdWdoJywgJ29uQ2hhbmdlJywgJ29uQ2xpY2snLCAnb25Db250ZXh0TWVudScsICdvbkRvdWJsZUNsaWNrJywgJ29uRHJhZycsICdvbkRyYWdFbmQnLCAnb25EcmFnRW50ZXInLCAnb25EcmFnTGVhdmUnLCAnb25EcmFnT3ZlcicsICdvbkRyYWdTdGFydCcsICdvbkRyb3AnLCAnb25EdXJhdGlvbkNoYW5nZScsICdvbkVtcHRpZWQnLCAnb25FbmRlZCcsICdvbklucHV0JywgJ29uSW52YWxpZCcsICdvbktleURvd24nLCAnb25LZXlQcmVzcycsICdvbktleVVwJywgJ29uTG9hZCcsICdvbkxvYWRlZERhdGEnLCAnb25Mb2FkZWRNZXRhZGF0YScsICdvbkxvYWRTdGFydCcsICdvbk1vdXNlRG93bicsICdvbk1vdXNlRW50ZXInLCAnb25Nb3VzZUxlYXZlJywgJ29uTW91c2VNb3ZlJywgJ29uTW91c2VPdXQnLCAnb25Nb3VzZU92ZXInLCAnb25Nb3VzZVVwJywgJ29uUGF1c2UnLCAnb25QbGF5JywgJ29uUGxheWluZycsICdvblByb2dyZXNzJywgJ29uUmF0ZUNoYW5nZScsICdvblJlc2V0JywgJ29uU2Nyb2xsJywgJ29uU2Vla2VkJywgJ29uU2Vla2luZycsICdvblNlbGVjdCcsICdvblN0YWxsZWQnLCAnb25TdWJtaXQnLCAnb25TdXNwZW5kJywgJ29uVGltZVVwZGF0ZScsICdvblZvbHVtZUNoYW5nZScsICdvbldhaXRpbmcnLCAnb25FcnJvciddO1xuXG4gICAgICAgIGNvbnN0IGF0dHJPYmogPSB7fTtcbiAgICAgICAgYXR0cmlidXRlcy5mb3JFYWNoKGEgPT4gYXR0ck9ialthXSA9IHRyaXBDaGFuZ2VEZXRlY3Rpb24pO1xuXG4gICAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvZGUgdG8gcnVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bm1vdW50c1xuICAgICAgICAgICAgICAgIGFwcFJlZj8uZGV0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhvdXRwdXRTdWJzY3JpcHRpb25zKS5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSwgW10pO1xuXG5cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbXG4gICAgICAgICAgICAuLi4ocHJlU2libGluZ3MgfHwgW10pLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChjb250YWluZXJFbGVtZW50TmFtZSB8fCBcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgLi4uYXR0ck9iaixcbiAgICAgICAgICAgICAgICByZWY6IG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlucHV0cywgb3V0cHV0cyB9ID0gY29tcG9uZW50WyfJtWNtcCddO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRJbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogYXBwUmVmLmluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmplY3RvcjogaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdEVsZW1lbnQ6IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRpY0lucHV0cywgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJldHVybnMgYSBsaXN0IG9mIGVudHJpZXMgdGhhdCBuZWVkIHRvIGJlIHNldFxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1ha2VzIGl0IHNvIHRoYXQgdW5uZWNlc3Nhcnkgc2V0dGVycyBhcmUgbm90IGludm9rZWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZpbHRlcigoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldICE9IHN0YXRpY0lucHV0c1twYXJlbnRLZXldO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLmZvckVhY2goKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY0lucHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2NoaWxkS2V5XSA9IHN0YXRpY0lucHV0c1twYXJlbnRLZXldO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdWJzY3JpcHRpb25zID0ge307XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIG91dHB1dHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3T3V0cHV0cyA9IE9iamVjdC5lbnRyaWVzKG91dHB1dHMpLmZpbHRlcigoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW91dHB1dFN1YnNjcmlwdGlvbnNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmV2ZXJzZSBiaW5kIHZpYSBzdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgbmV3T3V0cHV0cy5mb3JFYWNoKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGljT3V0cHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldDogRXZlbnRFbWl0dGVyPHVua25vd24+ID0gY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHN0YXRpY091dHB1dHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IHRhcmdldC5zdWJzY3JpYmUoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW4gdGhlIGNhbGxiYWNrIGluIHRoZSBwcm92aWRlZCB6b25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbcGFyZW50S2V5XSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAvLyBTdWJzY3JpcHRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3Vic2NyaXB0aW9uc1twYXJlbnRLZXldID0gc3ViO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBkZXN0cm95IG1ldGhvZCB0byBzYWZlbHkgcmVsZWFzZSB0aGUgc3Vic2NyaXB0aW9uc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnRJbnN0YW5jZS5vbkRlc3Ryb3k/LmJpbmQoY29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5vbkRlc3Ryb3kgPSAoY2IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMob3V0cHV0U3Vic2NyaXB0aW9ucykuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LihjYik7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4uKHBvc3RTaWJsaW5ncyB8fCBbXSksXG4gICAgICAgICAgICAuLi4oYWRkaXRpb25hbENoaWxkcmVuIHx8IFtdKVxuICAgICAgICBdLmZpbHRlcihlID0+IGUpO1xuXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHJvb3RFbGVtZW50TmFtZSB8fCBcImRpdlwiLCB7fSwgLi4uZWxlbWVudHMpO1xuICAgIH0pO1xufSk7XG5cblxuLyoqXG4gKiBEbyBub3QgdXNlIHRoaXMuXG4gKiBAaGlkZGVuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjb25zdCBuZzJSZWFjdFByb3BzID0gKG9iaiA9IHt9KSA9PiB7XG4gICAgY29uc3QgcHJvcHMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhvYmopLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICAvLyBPbWl0IHRoaW5ncyBwcmVmaXhlZCB3aXRoIGFuIHVuZGVyc2NvcmVcbiAgICAgICAgaWYgKGsuc3RhcnRzV2l0aCgnXycpKSByZXR1cm47XG5cbiAgICAgICAgLy8gT21pdCBvdXRwdXQgZXZlbnQgZW1pdHRlcnNcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpIHtcbiAgICAgICAgICAgIHByb3BzW2tdID0gKC4uLmFyZ3MpID0+IHYuZW1pdChbYXJnc10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvcHNba10gPSB2O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3BzO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhIFJlYWN0IGNvbXBvbmVudCB0aGF0XG4gKiB3cmFwcyBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIFJlYWN0Lk5hbWVkRXhvdGljQ29tcG9uZW50XG4gKlxuICogQGhpZGRlblxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gV3JhcEFuZ3VsYXJDb21wb25lbnRJblJlYWN0KHtcbiAgICBjb21wb25lbnQsXG4gICAgbmdab25lLFxuICAgIGFwcFJlZixcbiAgICBpbmplY3RvcixcbiAgICBwcm9wcyxcbiAgICBjb250YWluZXJUYWcsXG4gICAgcmVhY3RUZW1wbGF0ZSxcbiAgICBwcm9qZWN0YWJsZU5vZGVzXG59OiB7XG4gICAgLyoqXG4gICAgICogQW5ndWxhciBDb21wb25lbnQgdG8gYmUgcmVuZGVyZWQgd2l0aGluIFJlYWN0XG4gICAgICovXG4gICAgY29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgLyoqXG4gICAgICogQW5ndWxhciBBcHBsaWNhdGlvbiBSZWZlcmVuY2UuIFVzZWQgZm9yIGJvb3RzdHJhcHBpbmdcbiAgICAgKiBhbmQgY2hhbmdlIGRldGVjdGlvbiBoaWVyYXJjaHkuXG4gICAgICovXG4gICAgYXBwUmVmOiBPbWl0PEFwcGxpY2F0aW9uUmVmLCAnX3J1bm5pbmdUaWNrJz4sXG4gICAgLyoqXG4gICAgICogSW5zdGFuY2Ugb2YgTmdab25lIGNsYXNzLlxuICAgICAqIFZlcnkgaW1wb3J0YW50IHRvIHByZXZlbnQgWm9uZS5qcyBldmVudCBwZXJmb3JtYW5jZSBpc3N1ZXMuXG4gICAgICogRG8gbm90IHNldCBpZiBydW5uaW5nIFpvbmVsZXNzIENELlxuICAgICAqL1xuICAgIG5nWm9uZT86IE5nWm9uZSxcbiAgICAvKipcbiAgICAgKiBTdGF0aWMgcHJvcGVydGllcyB0byBiZSBwYXNzZWQgaW50byB0aGUgQW5ndWxhciBpbnN0YW5jZS5cbiAgICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBldmVudCBwcm94aWVzIGZvciBBbmd1bGFyIEV2ZW50RW1pdHRlcnMuXG4gICAgICovXG4gICAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC8qKlxuICAgICAqIExvY2FsIEVsZW1lbnQgSW5qZWN0b3IgcHJvdmlkZWQgdG8gdGhlIEFuZ3VsYXIgb2JqZWN0XG4gICAgICovXG4gICAgaW5qZWN0b3I/OiBJbmplY3RvcixcbiAgICAvKipcbiAgICAgKiBIVE1MIFRhZyBmb3IgdGhlIGNyZWF0ZWQgRE9NIHdyYXBwZXIuIERlZmF1bHRzIHRvIGBkaXZgLlxuICAgICAqL1xuICAgIGNvbnRhaW5lclRhZz86IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBSZWFjdCBGdW5jdGlvbiB0ZW1wbGF0ZVxuICAgICAqL1xuICAgIHJlYWN0VGVtcGxhdGU/OiAoZWw6IFJlYWN0LlJlYWN0RWxlbWVudCkgPT4gUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgIC8qKlxuICAgICAqIE5vZGVzIHRvIGJlIHBhc3NlZCB0byB0aGUgYG5nLWNvbnRlbnRgIG9mIHRoZSBjaGlsZCBBbmd1bGFyIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBwcm9qZWN0YWJsZU5vZGVzPzogTm9kZVtdW107XG59KSB7XG4gICAgcHJvcHMgPz89IHt9O1xuICAgIGNvbnRhaW5lclRhZyA/Pz0gJ2Rpdic7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcblxuICAgIGNvbnN0IGNyZWF0ZVdyYXBwZWRFbGVtZW50ID0gKCkgPT4ge1xuXG4gICAgICAgIHJlYWN0VGVtcGxhdGUgPz89IChlbCkgPT4gZWw7XG4gICAgICAgIHJldHVybiBSZWFjdC5tZW1vKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cbiAgICAgICAgICAgIGxldCBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXTtcbiAgICAgICAgICAgIGxldCBjb21wb25lbnRJbnN0YW5jZTogQ29tcG9uZW50UmVmPGFueT47XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcHMsIGFyZ3MpO1xuXG4gICAgICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXAgYW5kIGRpc3Bvc2UgbGVmdG92ZXIgQW5ndWxhciBvYmplY3RzXG4gICAgICAgICAgICAgICAgICAgIGFwcFJlZj8uZGV0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM/LmZvckVhY2gocyA9PiBzPy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICBjb25zdCB0cmlwQ2hhbmdlRGV0ZWN0aW9uID0gKCkgPT5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZT8uY2hhbmdlRGV0ZWN0b3JSZWY/LmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgLy8gVGhlc2UgYXR0cmlidXRlcyB3aWxsIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB3aGVuIHRoZXkgZmlyZSBmcm9tXG4gICAgICAgICAgICAvLyB0aGUgdW5kZXJseWluZyBSZWFjdCBlbGVtZW50LlxuICAgICAgICAgICAgLy8gLi4uIFRoaXMgd2lsbCBicmVhayB0aGluZ3MuIEZVQ0suXG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBBcnJheTxrZXlvZiBSZWFjdC5ET01BdHRyaWJ1dGVzPGFueT4+ID0gWydvbkNvcHknLCAnb25DdXQnLCAnb25QYXN0ZScsICdvbkFib3J0JywgJ29uQmx1cicsICdvbkZvY3VzJywgJ29uQ2FuUGxheScsICdvbkNhblBsYXlUaHJvdWdoJywgJ29uQ2hhbmdlJywgJ29uQ2xpY2snLCAnb25Db250ZXh0TWVudScsICdvbkRvdWJsZUNsaWNrJywgJ29uRHJhZycsICdvbkRyYWdFbmQnLCAnb25EcmFnRW50ZXInLCAnb25EcmFnTGVhdmUnLCAnb25EcmFnT3ZlcicsICdvbkRyYWdTdGFydCcsICdvbkRyb3AnLCAnb25EdXJhdGlvbkNoYW5nZScsICdvbkVtcHRpZWQnLCAnb25FbmRlZCcsICdvbklucHV0JywgJ29uSW52YWxpZCcsICdvbktleURvd24nLCAnb25LZXlQcmVzcycsICdvbktleVVwJywgJ29uTG9hZCcsICdvbkxvYWRlZERhdGEnLCAnb25Mb2FkZWRNZXRhZGF0YScsICdvbkxvYWRTdGFydCcsICdvbk1vdXNlRG93bicsICdvbk1vdXNlRW50ZXInLCAnb25Nb3VzZUxlYXZlJywgJ29uTW91c2VNb3ZlJywgJ29uTW91c2VPdXQnLCAnb25Nb3VzZU92ZXInLCAnb25Nb3VzZVVwJywgJ29uUGF1c2UnLCAnb25QbGF5JywgJ29uUGxheWluZycsICdvblByb2dyZXNzJywgJ29uUmF0ZUNoYW5nZScsICdvblJlc2V0JywgJ29uU2Nyb2xsJywgJ29uU2Vla2VkJywgJ29uU2Vla2luZycsICdvblNlbGVjdCcsICdvblN0YWxsZWQnLCAnb25TdWJtaXQnLCAnb25TdXNwZW5kJywgJ29uVGltZVVwZGF0ZScsICdvblZvbHVtZUNoYW5nZScsICdvbldhaXRpbmcnLCAnb25FcnJvciddO1xuXG4gICAgICAgICAgICBjb25zdCBhdHRyT2JqID0ge307XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmZvckVhY2goYSA9PiBhdHRyT2JqW2FdID0gdHJpcENoYW5nZURldGVjdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybiByZWFjdFRlbXBsYXRlKFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGFpbmVyVGFnLCB7XG4gICAgICAgICAgICAgICAgLi4uYXR0ck9iaixcbiAgICAgICAgICAgICAgICByZWY6IGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRJbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBzdXJlIGlmIHRoaXMgZXZlciBhY3R1YWxseSBoYXBwZW5zLCBhZGRlZCBhcyBhIHByZXZlbnRhdGl2ZSBtZWFzdXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIG1lbW9yeSBsZWFrcy5cbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucz8uZm9yRWFjaChzID0+IHM/LnVuc3Vic2NyaWJlKCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3RzdHJhcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXQgdGhlIEFuZ3VsYXIgY29tcG9uZW50IHdpdGggdGhlIGNvbnRleHQgb2YgdGhlIHJvb3QgQW5ndWxhciBhcHAuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZSA9IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudEluamVjdG9yOiBhcHBSZWYuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluamVjdG9yOiBpbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0RWxlbWVudDogbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0YWJsZU5vZGVzOiBwcm9qZWN0YWJsZU5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudEluc3RhbmNlLmhvc3RWaWV3KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBuZ1pvbmU/LnJ1blRhc2tcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmdab25lPy5ydW5UYXNrKGJvb3RzdHJhcClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYm9vdHN0cmFwKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc2V0dGxlZCwgYmluZCBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZpbHRlcigoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAT3V0cHV0cyBhcmUgYWx3YXlzIEV2ZW50IEVtaXR0ZXJzIChJIHRoaW5rKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2tdPy5zdWJzY3JpYmUoZXZ0ID0+IHByb3BzW2tdLmNhbGwoY3R4LCBldnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZVtrXSA9IHByb3BzW2tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5nWm9uZT8ucnVuT3V0c2lkZUFuZ3VsYXJcbiAgICAgICAgPyBuZ1pvbmU/LnJ1bk91dHNpZGVBbmd1bGFyKGNyZWF0ZVdyYXBwZWRFbGVtZW50KVxuICAgICAgICA6IGNyZWF0ZVdyYXBwZWRFbGVtZW50KCk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2Qgd2lsbCBhdXRvbWF0aWNhbGx5IHdyYXAgYW4gQW5ndWxhclxuICogQ29tcG9uZW50IG9yIERpcmVjdGl2ZSBpbnRvIGEgUmVhY3Qgb2JqZWN0LlxuICogQE91dHB1dHMgKEV2ZW50RW1pdHRlcnMpIHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogbGlua2VkIGludG8gdGhlIGlucHV0IHByb3BlcnRpZXMgYWxvbmcgd2l0aFxuICogYWxsIG9mIHRoZSBASW5wdXRzLlxuICogQHJldHVybnMgUmVhY3QuTmFtZWRFeG90aWNDb21wb25lbnRcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNvbnN0IEF1dG9XcmFwQW5ndWxhck9iamVjdCA9ICh7XG4gICAgY29tcG9uZW50LFxuICAgIGFwcFJlZixcbiAgICBuZ1pvbmUsXG4gICAgaW5zdGFuY2UsXG4gICAgaW5qZWN0b3IsXG4gICAgY29udGFpbmVyVGFnLFxuICAgIHJlYWN0VGVtcGxhdGUsXG59OiAoUGFyYW1ldGVyczx0eXBlb2YgV3JhcEFuZ3VsYXJDb21wb25lbnRJblJlYWN0PlswXSAmIHtcbiAgICAvKipcbiAgICAgKiBBbmd1bGFyIENvbXBvbmVudC9EaXJlY3RpdmUgaW5zdGFuY2UgdGhhdCB3aWxsIGhhdmUgcHJvcGVydGllcyBib3VuZCB0byB0aGUgY3JlYXRlZFxuICAgICAqL1xuICAgIGluc3RhbmNlPzogSW5zdGFuY2VUeXBlPFR5cGU8YW55Pj4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXG59KSkgPT4ge1xuICAgIGNvbnN0IHByb3BzID0gbmcyUmVhY3RQcm9wcyhpbnN0YW5jZSk7XG5cbiAgICByZXR1cm4gV3JhcEFuZ3VsYXJDb21wb25lbnRJblJlYWN0KHtcbiAgICAgICAgY29tcG9uZW50LFxuICAgICAgICBuZ1pvbmUsXG4gICAgICAgIGFwcFJlZixcbiAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgIGNvbnRhaW5lclRhZyxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHJlYWN0VGVtcGxhdGVcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQm9vdHN0cmFwIGFuIEFuZ3VsYXIgY29tcG9uZW50IHdpdGggYGNyZWF0ZUFwcGxpY2F0aW9uYCBhbmQgZXhwb3J0IGl0IHVuZGVyIGFcbiAqIHJlYWN0IEVsZW1lbnQuXG4gKiBVc2FnZTogUmVhY3QgdG9wLWxldmVsIGFwcGxpY2F0aW9uIGVtYmVkZGluZyBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlYWN0aWZ5U3RhbmRhbG9uZUFuZ3VsYXJDb21wb25lbnQoXG4gICAgY29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgcHJvcHM6IGFueSA9IHt9LFxuICAgIHByb3ZpZGVyczogKFByb3ZpZGVyIHwgRW52aXJvbm1lbnRQcm92aWRlcnMpW10gPSBbXSxcbiAgICBjb250YWluZXJUYWc6IHN0cmluZyA9ICdkaXYnXG4pIHtcbiAgICBjb25zdCBjdHggPSB0aGlzO1xuXG4gICAgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/XG4gICAgbGV0IHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xuICAgIGxldCBhcHA6IEFwcGxpY2F0aW9uUmVmO1xuXG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIENvZGUgdG8gcnVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bm1vdW50c1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9ucz8uZm9yRWFjaChzID0+IHM/LnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgICAgYXBwPy5kZXN0cm95KCk7XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGFpbmVyVGFnLCB7XG4gICAgICAgIHJlZjogYXN5bmMgKG5vZGUpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGlmIHRoaXMgZXZlciBhY3R1YWxseSBoYXBwZW5zLCBhZGRlZCBhcyBhIHByZXZlbnRhdGl2ZSBtZWFzdXJlXG4gICAgICAgICAgICAvLyB0byBtZW1vcnkgbGVha3MuXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zPy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICBhcHA/LmRlc3Ryb3koKTtcblxuICAgICAgICAgICAgLy8gSW5pdCBhbiBBbmd1bGFyIGFwcGxpY2F0aW9uIHJvb3QgJiBib290c3RyYXAgaXQgdG8gYSBET00gZWxlbWVudC5cbiAgICAgICAgICAgIGFwcCA9IGF3YWl0IGNyZWF0ZUFwcGxpY2F0aW9uKHsgcHJvdmlkZXJzIH0pO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGFwcC5ib290c3RyYXAoY29tcG9uZW50LCBub2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGJhc2U7XG5cblxuICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIEpTIHRvIGZpbmlzaCByZW5kZXJpbmcgYW5kIGluaXRpbmcuXG4gICAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShhcHAuaXNTdGFibGUpO1xuXG4gICAgICAgICAgICAvLyBOb3cgdGhhdCBldmVyeXRoaW5nIGhhcyBzZXR0bGVkLCBiaW5kIGlucHV0cyBhbmQgb3V0cHV0cy5cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5maWx0ZXIoKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEBPdXRwdXRzIGFyZSBhbHdheXMgRXZlbnQgRW1pdHRlcnMgKEkgdGhpbmspXG4gICAgICAgICAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba10/LnN1YnNjcmliZShldnQgPT4gcHJvcHNba10uY2FsbChjdHgsIGV2dCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrXSA9IHByb3BzW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBiYXNlLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5cblxuLy8gVGhlc2UgZXhwb3J0cyBleGlzdCB0byBhdHRlbXB0IHRvIG1ha2UgdGhlIEFQSSBoYXZlIG1pbmltYWwgYnJlYWtpbmcgY2hhbmdlcy5cbmV4cG9ydCBjb25zdCBSZWFjdGlmeVJlYWN0Q29tcG9uZW50ID0gUmVhY3RpZnlBbmd1bGFyQ29tcG9uZW50O1xuZXhwb3J0IGNvbnN0IFJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudDMgPSBXcmFwQW5ndWxhckNvbXBvbmVudEluUmVhY3Q7O1xuIl19
@@ -1,19 +1,44 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, EventEmitter } from '@angular/core';
2
2
  import * as React from 'react';
3
3
  import { createRoot } from 'react-dom/client';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
6
- * Extend this component to automatically generate
7
- * bindings to a React component.
6
+ * This component can be used to automatically wrap a React
7
+ * component into Angular bindings with functional change detection.
8
+ * All you need to provide is the @Input and @Output interface
9
+ * for the component in order to tell Angular which keys correspond to what.
10
+ *
11
+ * ### You _must_ override the property `ngReactComponent`.
8
12
  *
9
- * ! You _must_ override the property `ngReactComponent`
10
13
  * Failure to do so will result in errors
11
- * `override readonly ngReactComponent = ReactFlowWrappableComponent;`
14
+ *
15
+ * `override readonly ngReactComponent = SomeReactFunction;`
16
+ *
17
+ * Example:
18
+ *
19
+ * ```ts
20
+ * @Component({
21
+ * selector: "app-react-wrapped",
22
+ * standalone: true
23
+ * })
24
+ * export class MyReactWrappedComponent extends ReactifyNgComponent {
25
+ *
26
+ * @Input() data: any;
27
+ * @Input() options: any;
28
+ * @Input() version: any;
29
+ *
30
+ * // Notice how we wrap the result in an array, this is important because
31
+ * // React can pass multiple properties to a callback and Angular can't.
32
+ * @Output() onClick = new EventEmitter<[any]>();
33
+ *
34
+ * }
35
+ * ```
12
36
  */
13
37
  export class ReactifyNgComponent {
14
38
  constructor(ngContainer, ngZone) {
15
39
  this.ngContainer = ngContainer;
16
40
  this.ngZone = ngZone;
41
+ this._props = {};
17
42
  }
18
43
  ngOnInit() {
19
44
  if (!this.ngReactComponent) {
@@ -41,35 +66,35 @@ export class ReactifyNgComponent {
41
66
  // List all keys that do not start with `_` nor `ng`
42
67
  const keys = Object.keys(this).filter(k => !/^(?:_|ng)/.test(k));
43
68
  // Get all property keys from the class
44
- const propKeys = keys.filter(k => !k.startsWith("on"));
69
+ const propKeys = keys.filter(k => !(this[k] instanceof EventEmitter));
45
70
  // Get all event handler keys from the class
46
- const evtKeys = keys.filter(k => k.startsWith("on"));
47
- const props = {};
71
+ const evtKeys = keys.filter(k => this[k] instanceof EventEmitter);
48
72
  // Project all key properties onto `props`
49
- propKeys.forEach(k => props[k] = this[k]);
73
+ propKeys.forEach(k => this._props[k] = this[k]);
50
74
  // Attempt to ensure no zone is lost during the event emitter fires
51
75
  this.ngZone.runGuarded(() => {
52
76
  // Bind all event handlers.
53
77
  // ! important Angular uses EventEmitter, React uses
54
78
  // a different method of event binding
55
- evtKeys.forEach(k => props[k] = (...args) => this[k].next(args));
79
+ evtKeys.forEach(k => this._props[k] = (...args) => this[k].next(args));
56
80
  });
57
- this._root.render(React.createElement(this.ngReactComponent, { props: props }));
81
+ this._reactElement = React.createElement(this.ngReactComponent, { props: this._props });
82
+ this._root.render(this._reactElement);
58
83
  }
59
84
  catch (err) {
60
85
  console.error(err);
61
86
  }
62
87
  });
63
88
  }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ReactifyNgComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: ReactifyNgComponent, isStandalone: true, selector: "app-react-magic-wrapper", usesOnChanges: true, ngImport: i0, template: ``, isInline: true }); }
89
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactifyNgComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
90
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactifyNgComponent, isStandalone: true, selector: "ngx-reactify", usesOnChanges: true, ngImport: i0, template: ``, isInline: true }); }
66
91
  }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ReactifyNgComponent, decorators: [{
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactifyNgComponent, decorators: [{
68
93
  type: Component,
69
94
  args: [{
70
- selector: 'app-react-magic-wrapper',
95
+ selector: 'ngx-reactify',
71
96
  template: ``,
72
97
  standalone: true
73
98
  }]
74
99
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.NgZone }] });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdG8tYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL3JlYWN0LXRvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWlFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHcEQ7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTyxtQkFBbUI7SUFVNUIsWUFDdUIsV0FBNkIsRUFDN0IsTUFBYztRQURkLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBRXJDLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUF1QjtRQUMvQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxPQUFPO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtZQUN4RCxPQUFNO1FBQ1YsQ0FBQztRQUFBLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRWxFLG9EQUFvRDtnQkFDcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakUsdUNBQXVDO2dCQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELDRDQUE0QztnQkFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNqQiwwQ0FBMEM7Z0JBQzFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTFDLG1FQUFtRTtnQkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUN4QiwyQkFBMkI7b0JBQzNCLG9EQUFvRDtvQkFDcEQsc0NBQXNDO29CQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDckUsQ0FBQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ2IsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBWSxFQUFFLENBQUMsQ0FDdEUsQ0FBQztZQUNOLENBQUM7WUFDRCxPQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs4R0F4RVEsbUJBQW1CO2tHQUFuQixtQkFBbUIsd0dBSGxCLEVBQUU7OzJGQUdILG1CQUFtQjtrQkFML0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxRQUFRLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsSUFBSTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVJvb3QsIFJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcblxuXG4vKipcbiAqIEV4dGVuZCB0aGlzIGNvbXBvbmVudCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlXG4gKiBiaW5kaW5ncyB0byBhIFJlYWN0IGNvbXBvbmVudC5cbiAqXG4gKiAhIFlvdSBfbXVzdF8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGBuZ1JlYWN0Q29tcG9uZW50YFxuICogRmFpbHVyZSB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBlcnJvcnNcbiAqIGBvdmVycmlkZSByZWFkb25seSBuZ1JlYWN0Q29tcG9uZW50ID0gUmVhY3RGbG93V3JhcHBhYmxlQ29tcG9uZW50O2BcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtcmVhY3QtbWFnaWMtd3JhcHBlcicsXG4gICAgdGVtcGxhdGU6IGBgLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgUmVhY3RpZnlOZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFjdCBjb21wb25lbnQgdG8gYmUgd3JhcHBlZC5cbiAgICAgKiAhIE11c3QgYmUgb3ZlcnJpZGRlbiBmb3IgdGhpcyB3cmFwcGVyIHRvIHdvcmtcbiAgICAgKi9cbiAgICBuZ1JlYWN0Q29tcG9uZW50OiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudDxhbnk+IHwgUmVhY3QuQ29tcG9uZW50Q2xhc3M8YW55PjtcblxuICAgIHByaXZhdGUgX3Jvb3Q6IFJvb3Q7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5nQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmVcbiAgICApIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5nUmVhY3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0aWZ5TmdDb21wb25lbnQgY2Fubm90IGJlIGluaGVyaXRlZCB3aXRob3V0IGEgcHJvdmlkZWQgbmdSZWFjdENvbXBvbmVudCFcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzPzogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9yb290Py51bm1vdW50KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMubmdSZWFjdENvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJSZW5kZXIgbm8gY29tcG9uZW50LiBNYXkgYmUgY29udGV4dCBpc3N1ZVwiKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290ID8/PSBjcmVhdGVSb290KHRoaXMubmdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIExpc3QgYWxsIGtleXMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgX2Agbm9yIGBuZ2BcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcykuZmlsdGVyKGsgPT4gIS9eKD86X3xuZykvLnRlc3QoaykpO1xuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGFsbCBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIGNsYXNzXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcEtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFrLnN0YXJ0c1dpdGgoXCJvblwiKSk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IGFsbCBldmVudCBoYW5kbGVyIGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBldnRLZXlzID0ga2V5cy5maWx0ZXIoayA9PiBrLnN0YXJ0c1dpdGgoXCJvblwiKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IHt9O1xuICAgICAgICAgICAgICAgIC8vIFByb2plY3QgYWxsIGtleSBwcm9wZXJ0aWVzIG9udG8gYHByb3BzYFxuICAgICAgICAgICAgICAgIHByb3BLZXlzLmZvckVhY2goayA9PiBwcm9wc1trXSA9IHRoaXNba10pO1xuXG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBlbnN1cmUgbm8gem9uZSBpcyBsb3N0IGR1cmluZyB0aGUgZXZlbnQgZW1pdHRlciBmaXJlc1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bkd1YXJkZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBCaW5kIGFsbCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgLy8gISBpbXBvcnRhbnQgQW5ndWxhciB1c2VzIEV2ZW50RW1pdHRlciwgUmVhY3QgdXNlc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgZXZlbnQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICBldnRLZXlzLmZvckVhY2goayA9PiBwcm9wc1trXSA9ICguLi5hcmdzKSA9PiB0aGlzW2tdLm5leHQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yb290LnJlbmRlcihcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCh0aGlzLm5nUmVhY3RDb21wb25lbnQsIHsgcHJvcHM6IHByb3BzIGFzIGFueSB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdG8tYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL3JlYWN0LXRvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFpRSxNQUFNLGVBQWUsQ0FBQztBQUN0SSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sa0JBQWtCLENBQUM7O0FBR3BEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBTUgsTUFBTSxPQUFPLG1CQUFtQjtJQWM1QixZQUN1QixXQUE2QixFQUM3QixNQUFjO1FBRGQsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFKN0IsV0FBTSxHQUFXLEVBQUUsQ0FBQztJQU01QixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDhFQUE4RSxDQUFDLENBQUM7UUFDcEcsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBdUI7UUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUE7WUFDeEQsT0FBTTtRQUNWLENBQUM7UUFBQSxDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxDQUFDO2dCQUNELElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUVsRSxvREFBb0Q7Z0JBQ3BELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWpFLHVDQUF1QztnQkFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDdEUsNENBQTRDO2dCQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxDQUFDO2dCQUVsRSwwQ0FBMEM7Z0JBQzFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVoRCxtRUFBbUU7Z0JBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDeEIsMkJBQTJCO29CQUMzQixvREFBb0Q7b0JBQ3BELHNDQUFzQztvQkFDdEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDLENBQUMsQ0FBQTtnQkFFRixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE9BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN0QixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDOytHQTFFUSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw2RkFIbEIsRUFBRTs7NEZBR0gsbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxjQUFjO29CQUN4QixRQUFRLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsSUFBSTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcywgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCwgUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5cbi8qKlxuICogVGhpcyBjb21wb25lbnQgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSB3cmFwIGEgUmVhY3RcbiAqIGNvbXBvbmVudCBpbnRvIEFuZ3VsYXIgYmluZGluZ3Mgd2l0aCBmdW5jdGlvbmFsIGNoYW5nZSBkZXRlY3Rpb24uXG4gKiBBbGwgeW91IG5lZWQgdG8gcHJvdmlkZSBpcyB0aGUgQElucHV0IGFuZCBAT3V0cHV0IGludGVyZmFjZVxuICogZm9yIHRoZSBjb21wb25lbnQgaW4gb3JkZXIgdG8gdGVsbCBBbmd1bGFyIHdoaWNoIGtleXMgY29ycmVzcG9uZCB0byB3aGF0LlxuICpcbiAqICMjIyBZb3UgX211c3RfIG92ZXJyaWRlIHRoZSBwcm9wZXJ0eSBgbmdSZWFjdENvbXBvbmVudGAuXG4gKlxuICogRmFpbHVyZSB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBlcnJvcnNcbiAqXG4gKiBgb3ZlcnJpZGUgcmVhZG9ubHkgbmdSZWFjdENvbXBvbmVudCA9IFNvbWVSZWFjdEZ1bmN0aW9uO2BcbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgQENvbXBvbmVudCh7XG4gKiAgICAgIHNlbGVjdG9yOiBcImFwcC1yZWFjdC13cmFwcGVkXCIsXG4gKiAgICAgIHN0YW5kYWxvbmU6IHRydWVcbiAqICB9KVxuICogIGV4cG9ydCBjbGFzcyBNeVJlYWN0V3JhcHBlZENvbXBvbmVudCBleHRlbmRzIFJlYWN0aWZ5TmdDb21wb25lbnQge1xuICpcbiAqICAgICAgQElucHV0KCkgZGF0YTogYW55O1xuICogICAgICBASW5wdXQoKSBvcHRpb25zOiBhbnk7XG4gKiAgICAgIEBJbnB1dCgpIHZlcnNpb246IGFueTtcbiAqXG4gKiAgICAgIC8vIE5vdGljZSBob3cgd2Ugd3JhcCB0aGUgcmVzdWx0IGluIGFuIGFycmF5LCB0aGlzIGlzIGltcG9ydGFudCBiZWNhdXNlXG4gKiAgICAgIC8vIFJlYWN0IGNhbiBwYXNzIG11bHRpcGxlIHByb3BlcnRpZXMgdG8gYSBjYWxsYmFjayBhbmQgQW5ndWxhciBjYW4ndC5cbiAqICAgICAgQE91dHB1dCgpIG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFthbnldPigpO1xuICpcbiAqIH1cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1yZWFjdGlmeScsXG4gICAgdGVtcGxhdGU6IGBgLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgUmVhY3RpZnlOZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFjdCBjb21wb25lbnQgdG8gYmUgd3JhcHBlZC5cbiAgICAgKiAhIE11c3QgYmUgb3ZlcnJpZGRlbiBmb3IgdGhpcyB3cmFwcGVyIHRvIHdvcmtcbiAgICAgKi9cbiAgICBuZ1JlYWN0Q29tcG9uZW50OiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudDxhbnk+IHwgUmVhY3QuQ29tcG9uZW50Q2xhc3M8YW55PjtcblxuICAgIHByaXZhdGUgX3Jvb3Q6IFJvb3Q7XG5cbiAgICBwcml2YXRlIF9yZWFjdEVsZW1lbnQ6IFJlYWN0LlJlYWN0RWxlbWVudDtcblxuICAgIHByaXZhdGUgX3Byb3BzOiBPYmplY3QgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBuZ1pvbmU6IE5nWm9uZVxuICAgICkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMubmdSZWFjdENvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3RpZnlOZ0NvbXBvbmVudCBjYW5ub3QgYmUgaW5oZXJpdGVkIHdpdGhvdXQgYSBwcm92aWRlZCBuZ1JlYWN0Q29tcG9uZW50IVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM/OiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX3Jvb3Q/LnVubW91bnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW5kZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlbmRlciBubyBjb21wb25lbnQuIE1heSBiZSBjb250ZXh0IGlzc3VlXCIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QgPz89IGNyZWF0ZVJvb3QodGhpcy5uZ0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gTGlzdCBhbGwga2V5cyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGBfYCBub3IgYG5nYFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKS5maWx0ZXIoayA9PiAhL14oPzpffG5nKS8udGVzdChrKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wS2V5cyA9IGtleXMuZmlsdGVyKGsgPT4gISh0aGlzW2tdIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IGFsbCBldmVudCBoYW5kbGVyIGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBldnRLZXlzID0ga2V5cy5maWx0ZXIoayA9PiB0aGlzW2tdIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKTtcblxuICAgICAgICAgICAgICAgIC8vIFByb2plY3QgYWxsIGtleSBwcm9wZXJ0aWVzIG9udG8gYHByb3BzYFxuICAgICAgICAgICAgICAgIHByb3BLZXlzLmZvckVhY2goayA9PiB0aGlzLl9wcm9wc1trXSA9IHRoaXNba10pO1xuXG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBlbnN1cmUgbm8gem9uZSBpcyBsb3N0IGR1cmluZyB0aGUgZXZlbnQgZW1pdHRlciBmaXJlc1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bkd1YXJkZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBCaW5kIGFsbCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgLy8gISBpbXBvcnRhbnQgQW5ndWxhciB1c2VzIEV2ZW50RW1pdHRlciwgUmVhY3QgdXNlc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgZXZlbnQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICBldnRLZXlzLmZvckVhY2goayA9PiB0aGlzLl9wcm9wc1trXSA9ICguLi5hcmdzKSA9PiB0aGlzW2tdLm5leHQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFjdEVsZW1lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KHRoaXMubmdSZWFjdENvbXBvbmVudCwgeyBwcm9wczogdGhpcy5fcHJvcHMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QucmVuZGVyKHRoaXMuX3JlYWN0RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=