@adobe/helix-rum-enhancer 2.35.1 → 2.35.3

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/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## [2.35.3](https://github.com/adobe/helix-rum-enhancer/compare/v2.35.2...v2.35.3) (2025-05-27)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * fixing illegal invocation in webcomponent.js ([#419](https://github.com/adobe/helix-rum-enhancer/issues/419)) ([4153899](https://github.com/adobe/helix-rum-enhancer/commit/415389954e3a7b0d4973a9f176909da60ae8b812))
7
+
8
+ ## [2.35.2](https://github.com/adobe/helix-rum-enhancer/compare/v2.35.1...v2.35.2) (2025-05-22)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * get selector within shadowdom ([b3562cb](https://github.com/adobe/helix-rum-enhancer/commit/b3562cbd6180ccd1d10c81267b3518088359fe00))
14
+ * handle webcomponent sources ([0d3fbf2](https://github.com/adobe/helix-rum-enhancer/commit/0d3fbf247db02b9b296958f2859c9a04e36ace2d))
15
+ * include webcomponent tagname in source selector ([5794f5c](https://github.com/adobe/helix-rum-enhancer/commit/5794f5c3156f2572c63f5ea2560383bf924ead5b))
16
+ * observe nested webcomponent mutations ([9c05d0b](https://github.com/adobe/helix-rum-enhancer/commit/9c05d0b9158af10712004642ba1daa182eb7ac53))
17
+
1
18
  ## [2.35.1](https://github.com/adobe/helix-rum-enhancer/compare/v2.35.0...v2.35.1) (2025-05-21)
2
19
 
3
20
 
package/modules/dom.js CHANGED
@@ -34,7 +34,8 @@ function walk(el, checkFn) {
34
34
  if (!el || el === document.body || el === document.documentElement) {
35
35
  return undefined;
36
36
  }
37
- return checkFn(el) || walk(el.parentElement, checkFn);
37
+
38
+ return checkFn(el) || walk(el.parentElement || (el.parentNode && el.parentNode.host), checkFn);
38
39
  }
39
40
 
40
41
  function isDialog(el) {
@@ -69,6 +70,7 @@ function getSourceContext(el) {
69
70
  const block = el.closest('.block[data-block-name]');
70
71
  return ((block && `.${block.getAttribute('data-block-name')}`)
71
72
  || (walk(el, isDialog) && 'dialog')
73
+ || (walk(el, (e) => e.tagName && e.tagName.includes('-') && e.tagName.toLowerCase()))
72
74
  || ['nav', 'header', 'footer', 'aside'].find((t) => el.closest(t))
73
75
  || walk(el, (e) => e.id && `#${e.id}`));
74
76
  }
@@ -90,6 +92,7 @@ function getSourceIdentifier(el) {
90
92
  if (el.getAttribute('data-block-name')) return `.${el.getAttribute('data-block-name')}`;
91
93
  return (el.classList.length > 0 && `.${el.classList[0]}`);
92
94
  }
95
+
93
96
  export const sourceSelector = (el) => {
94
97
  try {
95
98
  if (!el || el === document.body || el === document.documentElement) {
package/modules/index.js CHANGED
@@ -22,7 +22,7 @@ const { sampleRUM, queue, isSelected } = (window.hlx && window.hlx.rum) ? window
22
22
  const createMO = (cb) => (window.MutationObserver ? new MutationObserver(cb)
23
23
  /* c8 ignore next */ : {});
24
24
 
25
- // blocks & media mutation observer
25
+ // blocks & media mutation observers
26
26
  // eslint-disable-next-line no-use-before-define
27
27
  const [blocksMO, mediaMO] = [blocksMCB, mediaMCB].map(createMO);
28
28
 
@@ -37,13 +37,18 @@ const PLUGINS = {
37
37
  // Interactive elements
38
38
  form: { url: `${pluginBasePath}/form.js`, when: () => document.querySelector('form'), isBlockDependent: true },
39
39
  video: { url: `${pluginBasePath}/video.js`, when: () => document.querySelector('video'), isBlockDependent: true },
40
+ webcomponent: {
41
+ url: `${pluginBasePath}/webcomponent.js`,
42
+ when: () => [...document.querySelectorAll('*')].some((el) => el.tagName && el.tagName.includes('-')),
43
+ isBlockDependent: true,
44
+ },
40
45
  // Martech
41
46
  martech: { url: `${pluginBasePath}/martech.js`, when: ({ urlParameters }) => urlParameters.size > 0 },
42
47
  onetrust: { url: `${pluginBasePath}/onetrust.js`, when: () => (document.querySelector('#onetrust-consent-sdk') || hasCookieKey('OptanonAlertBoxClosed')), isBlockDependent: true },
43
48
  // test: broken-plugin
44
49
  };
45
50
 
46
- function getIntersectionObsever(checkpoint) {
51
+ function getIntersectionObserver(checkpoint) {
47
52
  /* c8 ignore next 3 */
48
53
  if (!window.IntersectionObserver) {
49
54
  return null;
@@ -72,7 +77,8 @@ const PLUGIN_PARAMETERS = {
72
77
  sampleRUM,
73
78
  sourceSelector,
74
79
  targetSelector,
75
- getIntersectionObsever,
80
+ getIntersectionObserver,
81
+ createMO,
76
82
  };
77
83
 
78
84
  const pluginCache = new Map();
@@ -83,9 +89,11 @@ function loadPlugin(key, params) {
83
89
  if (!pluginCache.has(key) && plugin.when && !plugin.when({ urlParameters: usp })) {
84
90
  return null;
85
91
  }
92
+
86
93
  if (!pluginCache.has(key)) {
87
94
  pluginCache.set(key, import(`${plugin.url || plugin}`));
88
95
  }
96
+
89
97
  const pluginLoadPromise = pluginCache.get(key);
90
98
  return pluginLoadPromise
91
99
  .then((p) => (p.default && p.default(params)) || (typeof p === 'function' && p(params)))
@@ -231,7 +239,7 @@ function activateMediaMO() {
231
239
  }
232
240
 
233
241
  function addViewBlockTracking(element) {
234
- const blockobserver = getIntersectionObsever('viewblock');
242
+ const blockobserver = getIntersectionObserver('viewblock');
235
243
  if (blockobserver) {
236
244
  const blocks = element.getAttribute('data-block-status') ? [element] : element.querySelectorAll('div[data-block-status="loaded"]');
237
245
  blocks.forEach((b) => blockobserver.observe(b));
@@ -240,7 +248,7 @@ function addViewBlockTracking(element) {
240
248
 
241
249
  const observedMedia = new Set();
242
250
  function addViewMediaTracking(parent) {
243
- const mediaobserver = getIntersectionObsever('viewmedia');
251
+ const mediaobserver = getIntersectionObserver('viewmedia');
244
252
  if (mediaobserver) {
245
253
  parent.querySelectorAll('img, video, audio, iframe').forEach((m) => {
246
254
  if (!observedMedia.has(m)) {
@@ -281,6 +289,9 @@ function addTrackingFromConfig() {
281
289
  activateMediaMO();
282
290
 
283
291
  document.addEventListener('click', (event) => {
292
+ if (event.optelHandled) {
293
+ return;
294
+ }
284
295
  sampleRUM('click', { target: targetSelector(event.target), source: sourceSelector(event.target) });
285
296
  });
286
297
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/helix-rum-enhancer",
3
- "version": "2.35.1",
3
+ "version": "2.35.3",
4
4
  "description": "Helix RUM Enhancer",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -28,20 +28,20 @@
28
28
  },
29
29
  "homepage": "https://github.com/adobe/helix-rum-enhancer#readme",
30
30
  "mocha": {
31
- "recursive": "true",
31
+ "recursive": true,
32
32
  "reporter": "mocha-multi-reporters",
33
33
  "reporter-options": "configFile=.mocha-multi.json"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@adobe/eslint-config-helix": "2.0.9",
37
- "@adobe/helix-rum-js": "2.10.5",
37
+ "@adobe/helix-rum-js": "2.12.1",
38
38
  "@esm-bundle/chai": "4.3.4-fix.0",
39
39
  "@rollup/plugin-babel": "6.0.4",
40
40
  "@semantic-release/changelog": "6.0.3",
41
41
  "@semantic-release/exec": "7.1.0",
42
42
  "@semantic-release/git": "10.0.1",
43
43
  "@semantic-release/npm": "12.0.1",
44
- "@web/test-runner": "0.20.1",
44
+ "@web/test-runner": "0.20.2",
45
45
  "@web/test-runner-commands": "0.9.0",
46
46
  "@web/test-runner-junit-reporter": "0.8.0",
47
47
  "@web/test-runner-mocha": "0.9.0",
@@ -55,12 +55,12 @@
55
55
  "jsdoc-to-markdown": "9.1.1",
56
56
  "junit-report-builder": "5.1.1",
57
57
  "lint-staged": "16.0.0",
58
- "mocha": "11.4.0",
58
+ "mocha": "11.5.0",
59
59
  "mocha-multi-reporters": "1.5.1",
60
- "rollup": "4.41.0",
60
+ "rollup": "4.41.1",
61
61
  "@adobe/rollup-plugin-checksum": "1.2.0",
62
62
  "rollup-plugin-eslint-bundle": "9.0.0",
63
- "semantic-release": "24.2.4",
63
+ "semantic-release": "24.2.5",
64
64
  "semantic-release-slack-bot": "^4.0.2",
65
65
  "web-vitals": "5.0.1"
66
66
  },
package/plugins/form.js CHANGED
@@ -24,11 +24,11 @@ export const getSubmitType = (el) => {
24
24
  };
25
25
 
26
26
  export default function addFormTracking({
27
- sampleRUM, sourceSelector, targetSelector, context, getIntersectionObsever,
27
+ sampleRUM, sourceSelector, targetSelector, context, getIntersectionObserver,
28
28
  }) {
29
29
  context.querySelectorAll('form').forEach((form) => {
30
30
  form.addEventListener('submit', (e) => sampleRUM(getSubmitType(e.target), { target: targetSelector(e.target), source: sourceSelector(e.target) }), { once: true });
31
- getIntersectionObsever('viewblock').observe(form);
31
+ getIntersectionObserver('viewblock').observe(form);
32
32
  let lastSource;
33
33
  form.addEventListener('change', (e) => {
34
34
  if (e.target.checkVisibility()) {
@@ -0,0 +1,108 @@
1
+ /*
2
+ * Copyright 2025 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+ /** @type {WeakMap<HTMLElement, boolean>} */
14
+ const observedWC = new WeakMap();
15
+
16
+ /** @type {MutationObserver&{active?:boolean}|undefined} */
17
+ let rootMO;
18
+
19
+ export default function addWebComponentTracking({
20
+ context,
21
+ sampleRUM,
22
+ sourceSelector,
23
+ targetSelector,
24
+ createMO,
25
+ }) {
26
+ /**
27
+ * activate mutation observer
28
+ * @param {MutationObserver&{active?:boolean}} mo
29
+ * @param {HTMLElement} [root=document.body]
30
+ * @returns {void}
31
+ */
32
+ function activateMutationObserver(mo, root = document.body) {
33
+ /* c8 ignore next 3 */
34
+ if (!mo || mo.active) {
35
+ return;
36
+ }
37
+ // eslint-disable-next-line no-param-reassign
38
+ mo.active = true;
39
+ mo.observe(
40
+ root,
41
+ { subtree: true, attributes: false, childList: true },
42
+ );
43
+ }
44
+
45
+ /**
46
+ * @callback MutationCallback
47
+ * @param {MutationRecord[]} mutations
48
+ * @param {MutationObserver} observer
49
+ */
50
+ function mutationCB(mutations) {
51
+ mutations
52
+ .forEach((m) => {
53
+ // eslint-disable-next-line no-use-before-define
54
+ _addWebComponentTracking(m.target);
55
+ });
56
+ }
57
+
58
+ // eslint-disable-next-line no-underscore-dangle
59
+ function _addWebComponentTracking(obj) {
60
+ /* c8 ignore next 3 */
61
+ if (!obj) {
62
+ return;
63
+ }
64
+
65
+ const { tagName } = obj;
66
+ if (tagName && tagName.includes('-')) {
67
+ window.customElements.whenDefined(tagName.toLowerCase())
68
+ .then(() => {
69
+ if (obj.shadowRoot && !observedWC.has(obj)) {
70
+ observedWC.set(obj, true);
71
+ const mo = createMO(mutationCB);
72
+ activateMutationObserver(mo, obj.shadowRoot);
73
+ // eslint-disable-next-line no-underscore-dangle, no-param-reassign
74
+ obj.__optelMO = mo;
75
+ _addWebComponentTracking(obj.shadowRoot);
76
+ }
77
+ });
78
+ } else {
79
+ let hasShadowRoot = false;
80
+ try {
81
+ hasShadowRoot = Object.getPrototypeOf(obj).toString().includes('ShadowRoot');
82
+ } catch (e) { /* do nothing */ }
83
+ if (hasShadowRoot) {
84
+ // obj is a shadowRoot, add click tracking
85
+ obj.addEventListener('click', (event) => {
86
+ if (event.optelHandled) {
87
+ return;
88
+ }
89
+ // eslint-disable-next-line no-param-reassign
90
+ event.optelHandled = true;
91
+ sampleRUM('click', { target: targetSelector(event.target), source: sourceSelector(event.target) });
92
+ });
93
+ }
94
+ // look for web components below this element
95
+ [...obj.querySelectorAll('*')]
96
+ .filter((el) => el.tagName && el.tagName.includes('-') && !observedWC.has(el))
97
+ .forEach((el) => {
98
+ _addWebComponentTracking(el);
99
+ });
100
+ }
101
+ }
102
+
103
+ if (!rootMO) {
104
+ rootMO = createMO(mutationCB);
105
+ activateMutationObserver(rootMO);
106
+ }
107
+ _addWebComponentTracking(context);
108
+ }
package/src/index.js CHANGED
@@ -60,7 +60,7 @@
60
60
  if (!el || el === document.body || el === document.documentElement) {
61
61
  return undefined;
62
62
  }
63
- return checkFn(el) || walk(el.parentElement, checkFn);
63
+ return checkFn(el) || walk(el.parentElement || el.parentNode && el.parentNode.host, checkFn);
64
64
  }
65
65
  function isDialog(el) {
66
66
  if (el.tagName === 'DIALOG') return true;
@@ -86,7 +86,7 @@
86
86
  return `form${formEl.classList.length > 0 ? `.${formEl.classList[0]}` : ''}`;
87
87
  }
88
88
  const block = el.closest('.block[data-block-name]');
89
- return block && `.${block.getAttribute('data-block-name')}` || walk(el, isDialog) && 'dialog' || ['nav', 'header', 'footer', 'aside'].find(t => el.closest(t)) || walk(el, e => e.id && `#${e.id}`);
89
+ return block && `.${block.getAttribute('data-block-name')}` || walk(el, isDialog) && 'dialog' || walk(el, e => e.tagName && e.tagName.includes('-') && e.tagName.toLowerCase()) || ['nav', 'header', 'footer', 'aside'].find(t => el.closest(t)) || walk(el, e => e.id && `#${e.id}`);
90
90
  }
91
91
  function getSourceElement(el) {
92
92
  const f = el.closest('form');
@@ -139,6 +139,11 @@
139
139
  when: () => document.querySelector('video'),
140
140
  isBlockDependent: true
141
141
  },
142
+ webcomponent: {
143
+ url: `${pluginBasePath}/webcomponent.js`,
144
+ when: () => [...document.querySelectorAll('*')].some(el => el.tagName && el.tagName.includes('-')),
145
+ isBlockDependent: true
146
+ },
142
147
  martech: {
143
148
  url: `${pluginBasePath}/martech.js`,
144
149
  when: ({
@@ -151,7 +156,7 @@
151
156
  isBlockDependent: true
152
157
  }
153
158
  };
154
- function getIntersectionObsever(checkpoint) {
159
+ function getIntersectionObserver(checkpoint) {
155
160
  if (!window.IntersectionObserver) {
156
161
  return null;
157
162
  }
@@ -176,7 +181,8 @@
176
181
  sampleRUM,
177
182
  sourceSelector,
178
183
  targetSelector,
179
- getIntersectionObsever
184
+ getIntersectionObserver,
185
+ createMO
180
186
  };
181
187
  const pluginCache = new Map();
182
188
  function loadPlugin(key, params) {
@@ -325,7 +331,7 @@
325
331
  });
326
332
  }
327
333
  function addViewBlockTracking(element) {
328
- const blockobserver = getIntersectionObsever('viewblock');
334
+ const blockobserver = getIntersectionObserver('viewblock');
329
335
  if (blockobserver) {
330
336
  const blocks = element.getAttribute('data-block-status') ? [element] : element.querySelectorAll('div[data-block-status="loaded"]');
331
337
  blocks.forEach(b => blockobserver.observe(b));
@@ -333,7 +339,7 @@
333
339
  }
334
340
  const observedMedia = new Set();
335
341
  function addViewMediaTracking(parent) {
336
- const mediaobserver = getIntersectionObsever('viewmedia');
342
+ const mediaobserver = getIntersectionObserver('viewmedia');
337
343
  if (mediaobserver) {
338
344
  parent.querySelectorAll('img, video, audio, iframe').forEach(m => {
339
345
  if (!observedMedia.has(m)) {
@@ -364,6 +370,9 @@
364
370
  activateBlocksMO();
365
371
  activateMediaMO();
366
372
  document.addEventListener('click', event => {
373
+ if (event.optelHandled) {
374
+ return;
375
+ }
367
376
  sampleRUM('click', {
368
377
  target: targetSelector(event.target),
369
378
  source: sourceSelector(event.target)
package/src/index.md5 CHANGED
@@ -1 +1 @@
1
- ec0f8d360b4b5a3f5b5b84ff90cd98cc
1
+ 6451bfbe4efd7f92592400ea417b4df2
package/src/index.sri CHANGED
@@ -1 +1 @@
1
- sha384-nKGw+Uv2w5Lp892LtN6M6AKzK1dpb/b43UakX7zlZMsnJNu7wF9GJJ9rK193kJtd
1
+ sha384-BPW66FB1dP/60xdg/+Fv6d81hSUnnvPEZ+Sx42qVBlnImUISczQh8/S1mo3hifpK
@@ -1 +1 @@
1
- 89d31965ce1c14cfc8ca84968a68a8c0
1
+ dfa5478f232ee91172b33f547625e78f
@@ -22,7 +22,7 @@ function addFormTracking({
22
22
  sourceSelector,
23
23
  targetSelector,
24
24
  context,
25
- getIntersectionObsever
25
+ getIntersectionObserver
26
26
  }) {
27
27
  context.querySelectorAll('form').forEach(form => {
28
28
  form.addEventListener('submit', e => sampleRUM(getSubmitType(e.target), {
@@ -31,7 +31,7 @@ function addFormTracking({
31
31
  }), {
32
32
  once: true
33
33
  });
34
- getIntersectionObsever('viewblock').observe(form);
34
+ getIntersectionObserver('viewblock').observe(form);
35
35
  let lastSource;
36
36
  form.addEventListener('change', e => {
37
37
  if (e.target.checkVisibility()) {
@@ -22,7 +22,7 @@ function addFormTracking({
22
22
  sourceSelector,
23
23
  targetSelector,
24
24
  context,
25
- getIntersectionObsever
25
+ getIntersectionObserver
26
26
  }) {
27
27
  context.querySelectorAll('form').forEach(form => {
28
28
  form.addEventListener('submit', e => sampleRUM(getSubmitType(e.target), {
@@ -31,7 +31,7 @@ function addFormTracking({
31
31
  }), {
32
32
  once: true
33
33
  });
34
- getIntersectionObsever('viewblock').observe(form);
34
+ getIntersectionObserver('viewblock').observe(form);
35
35
  let lastSource;
36
36
  form.addEventListener('change', e => {
37
37
  if (e.target.checkVisibility()) {
@@ -55,4 +55,4 @@ function addFormTracking({
55
55
  }
56
56
 
57
57
  export { addFormTracking as default, getSubmitType };
58
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5tYXAuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3BsdWdpbnMvZm9ybS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjQgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxuICogdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG4gKiBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbiAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGNvbnN0IGdldFN1Ym1pdFR5cGUgPSAoZWwpID0+IHtcbiAgaWYgKCFlbCB8fCBlbC50YWdOYW1lICE9PSAnRk9STScpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIGlmIHRoZSBmb3JtIGhhcyBhIHNlYXJjaCByb2xlIG9yIGEgc2VhcmNoIGZpZWxkLCBpdCdzIGEgc2VhcmNoIGZvcm1cbiAgaWYgKGVsLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnc2VhcmNoJ1xuICAgIHx8IGVsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJzZWFyY2hcIl0sIGlucHV0W3JvbGU9XCJzZWFyY2hib3hcIl0nKSkgcmV0dXJuICdzZWFyY2gnO1xuICAvLyBpZiB0aGUgZm9ybSBoYXMgb25lIHBhc3N3b3JkIGlucHV0LCBpdCdzIGEgbG9naW4gZm9ybVxuICAvLyBpZiB0aGUgZm9ybSBoYXMgbW9yZSB0aGFuIG9uZSBwYXNzd29yZCBpbnB1dCwgaXQncyBhIHNpZ251cCBmb3JtXG4gIGNvbnN0IHB3Q291bnQgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0nKS5sZW5ndGg7XG4gIGlmIChwd0NvdW50ID09PSAxKSByZXR1cm4gJ2xvZ2luJztcbiAgaWYgKHB3Q291bnQgPiAxKSByZXR1cm4gJ3NpZ251cCc7XG4gIHJldHVybiAnZm9ybXN1Ym1pdCc7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRGb3JtVHJhY2tpbmcoe1xuICBzYW1wbGVSVU0sIHNvdXJjZVNlbGVjdG9yLCB0YXJnZXRTZWxlY3RvciwgY29udGV4dCwgZ2V0SW50ZXJzZWN0aW9uT2JzZXZlcixcbn0pIHtcbiAgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCdmb3JtJykuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGUpID0+IHNhbXBsZVJVTShnZXRTdWJtaXRUeXBlKGUudGFyZ2V0KSwgeyB0YXJnZXQ6IHRhcmdldFNlbGVjdG9yKGUudGFyZ2V0KSwgc291cmNlOiBzb3VyY2VTZWxlY3RvcihlLnRhcmdldCkgfSksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBnZXRJbnRlcnNlY3Rpb25PYnNldmVyKCd2aWV3YmxvY2snKS5vYnNlcnZlKGZvcm0pO1xuICAgIGxldCBsYXN0U291cmNlO1xuICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC5jaGVja1Zpc2liaWxpdHkoKSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VTZWxlY3RvcihlLnRhcmdldCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IGxhc3RTb3VyY2UpIHtcbiAgICAgICAgICBzYW1wbGVSVU0oJ2ZpbGwnLCB7IHNvdXJjZSB9KTtcbiAgICAgICAgICBsYXN0U291cmNlID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgKGUpID0+IHtcbiAgICAgIGlmIChbJ0lOUFVUJywgJ1RFWFRBUkVBJywgJ1NFTEVDVCcsICdCVVRUT04nXS5pbmNsdWRlcyhlLnRhcmdldC50YWdOYW1lKVxuICAgICAgICB8fCBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAndHJ1ZScpIHtcbiAgICAgICAgc2FtcGxlUlVNKCdjbGljaycsIHsgc291cmNlOiBzb3VyY2VTZWxlY3RvcihlLnRhcmdldCkgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbImdldFN1Ym1pdFR5cGUiLCJlbCIsInRhZ05hbWUiLCJ1bmRlZmluZWQiLCJnZXRBdHRyaWJ1dGUiLCJxdWVyeVNlbGVjdG9yIiwicHdDb3VudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJsZW5ndGgiLCJhZGRGb3JtVHJhY2tpbmciLCJzYW1wbGVSVU0iLCJzb3VyY2VTZWxlY3RvciIsInRhcmdldFNlbGVjdG9yIiwiY29udGV4dCIsImdldEludGVyc2VjdGlvbk9ic2V2ZXIiLCJmb3JFYWNoIiwiZm9ybSIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwidGFyZ2V0Iiwic291cmNlIiwib25jZSIsIm9ic2VydmUiLCJsYXN0U291cmNlIiwiY2hlY2tWaXNpYmlsaXR5IiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiI7Ozs7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
58
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5tYXAuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3BsdWdpbnMvZm9ybS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjQgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxuICogdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG4gKiBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbiAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGNvbnN0IGdldFN1Ym1pdFR5cGUgPSAoZWwpID0+IHtcbiAgaWYgKCFlbCB8fCBlbC50YWdOYW1lICE9PSAnRk9STScpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIGlmIHRoZSBmb3JtIGhhcyBhIHNlYXJjaCByb2xlIG9yIGEgc2VhcmNoIGZpZWxkLCBpdCdzIGEgc2VhcmNoIGZvcm1cbiAgaWYgKGVsLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnc2VhcmNoJ1xuICAgIHx8IGVsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJzZWFyY2hcIl0sIGlucHV0W3JvbGU9XCJzZWFyY2hib3hcIl0nKSkgcmV0dXJuICdzZWFyY2gnO1xuICAvLyBpZiB0aGUgZm9ybSBoYXMgb25lIHBhc3N3b3JkIGlucHV0LCBpdCdzIGEgbG9naW4gZm9ybVxuICAvLyBpZiB0aGUgZm9ybSBoYXMgbW9yZSB0aGFuIG9uZSBwYXNzd29yZCBpbnB1dCwgaXQncyBhIHNpZ251cCBmb3JtXG4gIGNvbnN0IHB3Q291bnQgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0nKS5sZW5ndGg7XG4gIGlmIChwd0NvdW50ID09PSAxKSByZXR1cm4gJ2xvZ2luJztcbiAgaWYgKHB3Q291bnQgPiAxKSByZXR1cm4gJ3NpZ251cCc7XG4gIHJldHVybiAnZm9ybXN1Ym1pdCc7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRGb3JtVHJhY2tpbmcoe1xuICBzYW1wbGVSVU0sIHNvdXJjZVNlbGVjdG9yLCB0YXJnZXRTZWxlY3RvciwgY29udGV4dCwgZ2V0SW50ZXJzZWN0aW9uT2JzZXJ2ZXIsXG59KSB7XG4gIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCgnZm9ybScpLmZvckVhY2goKGZvcm0pID0+IHtcbiAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiBzYW1wbGVSVU0oZ2V0U3VibWl0VHlwZShlLnRhcmdldCksIHsgdGFyZ2V0OiB0YXJnZXRTZWxlY3RvcihlLnRhcmdldCksIHNvdXJjZTogc291cmNlU2VsZWN0b3IoZS50YXJnZXQpIH0pLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgZ2V0SW50ZXJzZWN0aW9uT2JzZXJ2ZXIoJ3ZpZXdibG9jaycpLm9ic2VydmUoZm9ybSk7XG4gICAgbGV0IGxhc3RTb3VyY2U7XG4gICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmNoZWNrVmlzaWJpbGl0eSgpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZVNlbGVjdG9yKGUudGFyZ2V0KTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbGFzdFNvdXJjZSkge1xuICAgICAgICAgIHNhbXBsZVJVTSgnZmlsbCcsIHsgc291cmNlIH0pO1xuICAgICAgICAgIGxhc3RTb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCAoZSkgPT4ge1xuICAgICAgaWYgKFsnSU5QVVQnLCAnVEVYVEFSRUEnLCAnU0VMRUNUJywgJ0JVVFRPTiddLmluY2x1ZGVzKGUudGFyZ2V0LnRhZ05hbWUpXG4gICAgICAgIHx8IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgPT09ICd0cnVlJykge1xuICAgICAgICBzYW1wbGVSVU0oJ2NsaWNrJywgeyBzb3VyY2U6IHNvdXJjZVNlbGVjdG9yKGUudGFyZ2V0KSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiZ2V0U3VibWl0VHlwZSIsImVsIiwidGFnTmFtZSIsInVuZGVmaW5lZCIsImdldEF0dHJpYnV0ZSIsInF1ZXJ5U2VsZWN0b3IiLCJwd0NvdW50IiwicXVlcnlTZWxlY3RvckFsbCIsImxlbmd0aCIsImFkZEZvcm1UcmFja2luZyIsInNhbXBsZVJVTSIsInNvdXJjZVNlbGVjdG9yIiwidGFyZ2V0U2VsZWN0b3IiLCJjb250ZXh0IiwiZ2V0SW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJmb3JFYWNoIiwiZm9ybSIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwidGFyZ2V0Iiwic291cmNlIiwib25jZSIsIm9ic2VydmUiLCJsYXN0U291cmNlIiwiY2hlY2tWaXNpYmlsaXR5IiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiI7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
@@ -1 +1 @@
1
- c485339de82fa4da1de092c51bd5230a
1
+ 2b38cde77ee1b0e0b6ab60d305c6c8fa
@@ -1 +1 @@
1
- 20d1f82b8a8c89e965f951484f200f35
1
+ 0b8929128308bbefbc995cf739f578f1
@@ -0,0 +1,83 @@
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ const observedWC = new WeakMap();
13
+ let rootMO;
14
+ function addWebComponentTracking({
15
+ context,
16
+ sampleRUM,
17
+ sourceSelector,
18
+ targetSelector,
19
+ createMO
20
+ }) {
21
+ function activateMutationObserver(mo, root = document.body) {
22
+ if (!mo || mo.active) {
23
+ return;
24
+ }
25
+ mo.active = true;
26
+ mo.observe(root, {
27
+ subtree: true,
28
+ attributes: false,
29
+ childList: true
30
+ });
31
+ }
32
+ function mutationCB(mutations) {
33
+ mutations.forEach(m => {
34
+ _addWebComponentTracking(m.target);
35
+ });
36
+ }
37
+ function _addWebComponentTracking(obj) {
38
+ if (!obj) {
39
+ return;
40
+ }
41
+ const {
42
+ tagName
43
+ } = obj;
44
+ if (tagName && tagName.includes('-')) {
45
+ window.customElements.whenDefined(tagName.toLowerCase()).then(() => {
46
+ if (obj.shadowRoot && !observedWC.has(obj)) {
47
+ observedWC.set(obj, true);
48
+ const mo = createMO(mutationCB);
49
+ activateMutationObserver(mo, obj.shadowRoot);
50
+ obj.__optelMO = mo;
51
+ _addWebComponentTracking(obj.shadowRoot);
52
+ }
53
+ });
54
+ } else {
55
+ let hasShadowRoot = false;
56
+ try {
57
+ hasShadowRoot = Object.getPrototypeOf(obj).toString().includes('ShadowRoot');
58
+ } catch (e) {}
59
+ if (hasShadowRoot) {
60
+ obj.addEventListener('click', event => {
61
+ if (event.optelHandled) {
62
+ return;
63
+ }
64
+ event.optelHandled = true;
65
+ sampleRUM('click', {
66
+ target: targetSelector(event.target),
67
+ source: sourceSelector(event.target)
68
+ });
69
+ });
70
+ }
71
+ [...obj.querySelectorAll('*')].filter(el => el.tagName && el.tagName.includes('-') && !observedWC.has(el)).forEach(el => {
72
+ _addWebComponentTracking(el);
73
+ });
74
+ }
75
+ }
76
+ if (!rootMO) {
77
+ rootMO = createMO(mutationCB);
78
+ activateMutationObserver(rootMO);
79
+ }
80
+ _addWebComponentTracking(context);
81
+ }
82
+
83
+ export { addWebComponentTracking as default };
@@ -0,0 +1,84 @@
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ const observedWC = new WeakMap();
13
+ let rootMO;
14
+ function addWebComponentTracking({
15
+ context,
16
+ sampleRUM,
17
+ sourceSelector,
18
+ targetSelector,
19
+ createMO
20
+ }) {
21
+ function activateMutationObserver(mo, root = document.body) {
22
+ if (!mo || mo.active) {
23
+ return;
24
+ }
25
+ mo.active = true;
26
+ mo.observe(root, {
27
+ subtree: true,
28
+ attributes: false,
29
+ childList: true
30
+ });
31
+ }
32
+ function mutationCB(mutations) {
33
+ mutations.forEach(m => {
34
+ _addWebComponentTracking(m.target);
35
+ });
36
+ }
37
+ function _addWebComponentTracking(obj) {
38
+ if (!obj) {
39
+ return;
40
+ }
41
+ const {
42
+ tagName
43
+ } = obj;
44
+ if (tagName && tagName.includes('-')) {
45
+ window.customElements.whenDefined(tagName.toLowerCase()).then(() => {
46
+ if (obj.shadowRoot && !observedWC.has(obj)) {
47
+ observedWC.set(obj, true);
48
+ const mo = createMO(mutationCB);
49
+ activateMutationObserver(mo, obj.shadowRoot);
50
+ obj.__optelMO = mo;
51
+ _addWebComponentTracking(obj.shadowRoot);
52
+ }
53
+ });
54
+ } else {
55
+ let hasShadowRoot = false;
56
+ try {
57
+ hasShadowRoot = Object.getPrototypeOf(obj).toString().includes('ShadowRoot');
58
+ } catch (e) {}
59
+ if (hasShadowRoot) {
60
+ obj.addEventListener('click', event => {
61
+ if (event.optelHandled) {
62
+ return;
63
+ }
64
+ event.optelHandled = true;
65
+ sampleRUM('click', {
66
+ target: targetSelector(event.target),
67
+ source: sourceSelector(event.target)
68
+ });
69
+ });
70
+ }
71
+ [...obj.querySelectorAll('*')].filter(el => el.tagName && el.tagName.includes('-') && !observedWC.has(el)).forEach(el => {
72
+ _addWebComponentTracking(el);
73
+ });
74
+ }
75
+ }
76
+ if (!rootMO) {
77
+ rootMO = createMO(mutationCB);
78
+ activateMutationObserver(rootMO);
79
+ }
80
+ _addWebComponentTracking(context);
81
+ }
82
+
83
+ export { addWebComponentTracking as default };
84
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY29tcG9uZW50Lm1hcC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vcGx1Z2lucy93ZWJjb21wb25lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDI1IEFkb2JlLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHlcbiAqIG9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXJcbiAqIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OU1xuICogT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlXG4gKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxIVE1MRWxlbWVudCwgYm9vbGVhbj59ICovXG5jb25zdCBvYnNlcnZlZFdDID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqIEB0eXBlIHtNdXRhdGlvbk9ic2VydmVyJnthY3RpdmU/OmJvb2xlYW59fHVuZGVmaW5lZH0gKi9cbmxldCByb290TU87XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZFdlYkNvbXBvbmVudFRyYWNraW5nKHtcbiAgY29udGV4dCxcbiAgc2FtcGxlUlVNLFxuICBzb3VyY2VTZWxlY3RvcixcbiAgdGFyZ2V0U2VsZWN0b3IsXG4gIGNyZWF0ZU1PLFxufSkge1xuICAvKipcbiAgICogYWN0aXZhdGUgbXV0YXRpb24gb2JzZXJ2ZXJcbiAgICogQHBhcmFtIHtNdXRhdGlvbk9ic2VydmVyJnthY3RpdmU/OmJvb2xlYW59fSBtb1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbcm9vdD1kb2N1bWVudC5ib2R5XVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIGFjdGl2YXRlTXV0YXRpb25PYnNlcnZlcihtbywgcm9vdCA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICAvKiBjOCBpZ25vcmUgbmV4dCAzICovXG4gICAgaWYgKCFtbyB8fCBtby5hY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgbW8uYWN0aXZlID0gdHJ1ZTtcbiAgICBtby5vYnNlcnZlKFxuICAgICAgcm9vdCxcbiAgICAgIHsgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogZmFsc2UsIGNoaWxkTGlzdDogdHJ1ZSB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIE11dGF0aW9uQ2FsbGJhY2tcbiAgICogQHBhcmFtIHtNdXRhdGlvblJlY29yZFtdfSBtdXRhdGlvbnNcbiAgICogQHBhcmFtIHtNdXRhdGlvbk9ic2VydmVyfSBvYnNlcnZlclxuICAgKi9cbiAgZnVuY3Rpb24gbXV0YXRpb25DQihtdXRhdGlvbnMpIHtcbiAgICBtdXRhdGlvbnNcbiAgICAgIC5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBfYWRkV2ViQ29tcG9uZW50VHJhY2tpbmcobS50YXJnZXQpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgZnVuY3Rpb24gX2FkZFdlYkNvbXBvbmVudFRyYWNraW5nKG9iaikge1xuICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGFnTmFtZSB9ID0gb2JqO1xuICAgIGlmICh0YWdOYW1lICYmIHRhZ05hbWUuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgd2luZG93LmN1c3RvbUVsZW1lbnRzLndoZW5EZWZpbmVkKHRhZ05hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChvYmouc2hhZG93Um9vdCAmJiAhb2JzZXJ2ZWRXQy5oYXMob2JqKSkge1xuICAgICAgICAgICAgb2JzZXJ2ZWRXQy5zZXQob2JqLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IG1vID0gY3JlYXRlTU8obXV0YXRpb25DQik7XG4gICAgICAgICAgICBhY3RpdmF0ZU11dGF0aW9uT2JzZXJ2ZXIobW8sIG9iai5zaGFkb3dSb290KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSwgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIG9iai5fX29wdGVsTU8gPSBtbztcbiAgICAgICAgICAgIF9hZGRXZWJDb21wb25lbnRUcmFja2luZyhvYmouc2hhZG93Um9vdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGhhc1NoYWRvd1Jvb3QgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhc1NoYWRvd1Jvb3QgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKS50b1N0cmluZygpLmluY2x1ZGVzKCdTaGFkb3dSb290Jyk7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGRvIG5vdGhpbmcgKi8gfVxuICAgICAgaWYgKGhhc1NoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gb2JqIGlzIGEgc2hhZG93Um9vdCwgYWRkIGNsaWNrIHRyYWNraW5nXG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5vcHRlbEhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgZXZlbnQub3B0ZWxIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICBzYW1wbGVSVU0oJ2NsaWNrJywgeyB0YXJnZXQ6IHRhcmdldFNlbGVjdG9yKGV2ZW50LnRhcmdldCksIHNvdXJjZTogc291cmNlU2VsZWN0b3IoZXZlbnQudGFyZ2V0KSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBsb29rIGZvciB3ZWIgY29tcG9uZW50cyBiZWxvdyB0aGlzIGVsZW1lbnRcbiAgICAgIFsuLi5vYmoucXVlcnlTZWxlY3RvckFsbCgnKicpXVxuICAgICAgICAuZmlsdGVyKChlbCkgPT4gZWwudGFnTmFtZSAmJiBlbC50YWdOYW1lLmluY2x1ZGVzKCctJykgJiYgIW9ic2VydmVkV0MuaGFzKGVsKSlcbiAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgX2FkZFdlYkNvbXBvbmVudFRyYWNraW5nKGVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyb290TU8pIHtcbiAgICByb290TU8gPSBjcmVhdGVNTyhtdXRhdGlvbkNCKTtcbiAgICBhY3RpdmF0ZU11dGF0aW9uT2JzZXJ2ZXIocm9vdE1PKTtcbiAgfVxuICBfYWRkV2ViQ29tcG9uZW50VHJhY2tpbmcoY29udGV4dCk7XG59XG4iXSwibmFtZXMiOlsib2JzZXJ2ZWRXQyIsIldlYWtNYXAiLCJyb290TU8iLCJhZGRXZWJDb21wb25lbnRUcmFja2luZyIsImNvbnRleHQiLCJzYW1wbGVSVU0iLCJzb3VyY2VTZWxlY3RvciIsInRhcmdldFNlbGVjdG9yIiwiY3JlYXRlTU8iLCJhY3RpdmF0ZU11dGF0aW9uT2JzZXJ2ZXIiLCJtbyIsInJvb3QiLCJkb2N1bWVudCIsImJvZHkiLCJhY3RpdmUiLCJvYnNlcnZlIiwic3VidHJlZSIsImF0dHJpYnV0ZXMiLCJjaGlsZExpc3QiLCJtdXRhdGlvbkNCIiwibXV0YXRpb25zIiwiZm9yRWFjaCIsIm0iLCJfYWRkV2ViQ29tcG9uZW50VHJhY2tpbmciLCJ0YXJnZXQiLCJvYmoiLCJ0YWdOYW1lIiwiaW5jbHVkZXMiLCJ3aW5kb3ciLCJjdXN0b21FbGVtZW50cyIsIndoZW5EZWZpbmVkIiwidG9Mb3dlckNhc2UiLCJ0aGVuIiwic2hhZG93Um9vdCIsImhhcyIsInNldCIsIl9fb3B0ZWxNTyIsImhhc1NoYWRvd1Jvb3QiLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsInRvU3RyaW5nIiwiZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJldmVudCIsIm9wdGVsSGFuZGxlZCIsInNvdXJjZSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmaWx0ZXIiLCJlbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhQSxNQUFNQSxVQUFVLEdBQUcsSUFBSUMsT0FBTyxFQUFFO0FBR2hDLElBQUlDLE1BQU07QUFFSyxTQUFTQyx1QkFBdUJBLENBQUM7RUFDOUNDLE9BQU87RUFDUEMsU0FBUztFQUNUQyxjQUFjO0VBQ2RDLGNBQWM7QUFDZEMsRUFBQUE7QUFDRixDQUFDLEVBQUU7RUFPRCxTQUFTQyx3QkFBd0JBLENBQUNDLEVBQUUsRUFBRUMsSUFBSSxHQUFHQyxRQUFRLENBQUNDLElBQUksRUFBRTtBQUUxRCxJQUFBLElBQUksQ0FBQ0gsRUFBRSxJQUFJQSxFQUFFLENBQUNJLE1BQU0sRUFBRTtB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
@@ -0,0 +1 @@
1
+ a7e70d3923edb7062c45a01ba295c2bd