PageSourceSearch

https://kyn-care.com/src/components/WaitlistBubble.tsx

js kyn-care.com collected 2026-10-08 11:36:23 UTC 29,982 bytes, 328 lines download raw bytes

1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/components/WaitlistBubble.tsx");import __vite__cjsImport0_react_jsxDevRuntime from "/@fs/home/runner/workspace/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=9ce4103e"; const Fragment = __vite__cjsImport0_react_jsxDevRuntime["Fragment"]; const jsxDEV = __vite__cjsImport0_react_jsxDevRuntime["jsxDEV"];
2import RefreshRuntime from "/@react-refresh";
3const inWebWorker = typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope;
4let prevRefreshReg;
5let prevRefreshSig;
6if (import.meta.hot && !inWebWorker) {
7  if (!window.__vite_plugin_react_preamble_installed__) {
8    throw new Error("@vitejs/plugin-react can't detect preamble. Something is wrong. See https://github.com/vitejs/vite-plugin-react/pull/11#discussion_r430879201");
9  }
10  prevRefreshReg = window.$RefreshReg$;
11  prevRefreshSig = window.$RefreshSig$;
12  window.$RefreshReg$ = (type, id) => {
13    RefreshRuntime.register(type, "/home/runner/workspace/client/src/components/WaitlistBubble.tsx " + id);
14  };
15  window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
16}
17var _s = $RefreshSig$();
18import __vite__cjsImport3_react from "/@fs/home/runner/workspace/node_modules/.vite/deps/react.js?v=9ce4103e"; const useState = __vite__cjsImport3_react["useState"]; const useEffect = __vite__cjsImport3_react["useEffect"];
19import { Mail, X } from "/@fs/home/runner/workspace/node_modules/.vite/deps/lucide-react.js?v=9ce4103e";
20import { useLanguage } from "/src/lib/LanguageContext.tsx";
21import { useLocation } from "/@fs/home/runner/workspace/node_modules/.vite/deps/wouter.js?v=9ce4103e";
22const WaitlistBubble = () => {
23  _s();
24  const { t } = useLanguage();
25  const [location] = useLocation();
26  const [isVisible, setIsVisible] = useState(false);
27  const [isDismissed, setIsDismissed] = useState(false);
28  const [isExpanded, setIsExpanded] = useState(false);
29  const isPlaybookPage = location.startsWith("/playbook") || location.startsWith("/skincare-guide");
30  useEffect(() => {
31    const dismissed = sessionStorage.getItem("waitlistBubbleDismissed");
32    if (dismissed) {
33      setIsDismissed(true);
34      return;
35    }
36    let timeoutId;
37    const showBubble = () => {
38      const cookieConsent = localStorage.getItem("kyn_cookie_consent");
39      if (!cookieConsent) return;
40      setIsVisible(true);
41      window.removeEventListener("scroll", handleScroll);
42      clearTimeout(timeoutId);
43    };
44    const handleScroll = () => {
45      const cookieConsent = localStorage.getItem("kyn_cookie_consent");
46      if (!cookieConsent) return;
47      const scrollableHeight = document.documentElement.scrollHeight - window.innerHeight;
48      if (scrollableHeight <= 0) return;
49      const scrollPercent = window.scrollY / scrollableHeight * 100;
50      if (scrollPercent >= 25) {
51        showBubble();
52      }
53    };
54    timeoutId = setTimeout(() => {
55      if (!isVisible) {
56        showBubble();
57      }
58    }, 5e3);
59    window.addEventListener("scroll", handleScroll);
60    return () => {
61      window.removeEventListener("scroll", handleScroll);
62      clearTimeout(timeoutId);
63    };
64  }, [isVisible]);
65  const scrollToSubscribe = () => {
66    const subscribeSection = document.getElementById("subscribe-section");
67    if (subscribeSection) {
68      const navHeight = 118;
69      const elementPosition = subscribeSection.getBoundingClientRect().top + window.scrollY;
70      window.scrollTo({ top: elementPosition - navHeight, behavior: "smooth" });
71    }
72    setIsVisible(false);
73    setIsDismissed(true);
74    sessionStorage.setItem("waitlistBubbleDismissed", "true");
75    sessionStorage.setItem("kyn-waitlist-popup-closed", "true");
76  };
77  const handleClick = () => {
78    if (isExpanded) {
79      scrollToSubscribe();
80    } else {
81      setIsExpanded(true);
82    }
83  };
84  const handleDismiss = (e) => {
85    e.stopPropagation();
86    setIsVisible(false);
87    setIsDismissed(true);
88    sessionStorage.setItem("waitlistBubbleDismissed", "true");
89  };
90  if (isDismissed || isPlaybookPage) return null;
91  return /* @__PURE__ */ jsxDEV(Fragment, { children: [
92    /* @__PURE__ */ jsxDEV(
93      "div",
94      {
95        className: `fixed bottom-6 left-6 z-[100] transition-all duration-500 ease-out hidden md:flex items-center gap-2 ${isVisible ? "translate-x-0 opacity-100" : "-translate-x-full opacity-0"}`,
96        children: [
97          /* @__PURE__ */ jsxDEV(
98            "button",
99            {
100              className: "flex items-center gap-3 text-white cursor-pointer hover:opacity-90 transition-opacity focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white",
101              style: {
102                padding: "14px 28px",
103                backgroundColor: "#0F0F0F",
104                borderRadius: "2px"
105              },
106              onClick: scrollToSubscribe,
107              "data-testid": "button-waitlist-fab-desktop",
108              children: /* @__PURE__ */ jsxDEV(
109                "span",
110                {
111                  className: "text-[11px] uppercase",
112                  style: {
113                    letterSpacing: "2px",
114                    fontFamily: "Helvetica, Arial, sans-serif",
115                    fontWeight: 400
116                  },
117                  children: t("beTheFirstToKnow")
118                },
119                void 0,
120                false,
121                {
122                  fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
123                  lineNumber: 112,
124                  columnNumber: 11
125                },
126                this
127              )
128            },
129            void 0,
130            false,
131            {
132              fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
133              lineNumber: 102,
134              columnNumber: 9
135            },
136            this
137          ),
138          /* @__PURE__ */ jsxDEV(
139            "button",
140            {
141              onClick: handleDismiss,
142              className: "flex items-center justify-center text-white hover:opacity-70 transition-opacity",
143              style: {
144                width: "32px",
145                height: "32px",
146                backgroundColor: "#0F0F0F",
147                borderRadius: "2px"
148              },
149              "aria-label": "Close",
150              "data-testid": "button-waitlist-close-desktop",
151              children: /* @__PURE__ */ jsxDEV(X, { size: 14, strokeWidth: 1.5 }, void 0, false, {
152                fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
153                lineNumber: 135,
154                columnNumber: 11
155              }, this)
156            },
157            void 0,
158            false,
159            {
160              fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
161              lineNumber: 123,
162              columnNumber: 9
163            },
164            this
165          )
166        ]
167      },
168      void 0,
169      true,
170      {
171        fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
172        lineNumber: 95,
173        columnNumber: 7
174      },
175      this
176    ),
177    /* @__PURE__ */ jsxDEV(
178      "div",
179      {
180        className: `fixed bottom-6 left-5 z-[100] transition-all duration-500 ease-out md:hidden flex items-center ${isVisible ? "translate-x-0 opacity-100" : "-translate-x-full opacity-0"}`,
181        children: [
182          /* @__PURE__ */ jsxDEV(
183            "button",
184            {
185              className: "relative flex items-center justify-center text-white cursor-pointer transition-all duration-300 ease-out focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white",
186              style: {
187                height: "48px",
188                minWidth: isExpanded ? "160px" : "48px",
189                padding: isExpanded ? "0 20px" : "0",
190                backgroundColor: "#0F0F0F",
191                borderRadius: "24px"
192              },
193              onClick: handleClick,
194              "data-testid": "button-waitlist-fab",
195              children: [
196                /* @__PURE__ */ jsxDEV(
197                  "span",
198                  {
199                    className: "absolute flex items-center justify-center text-white transition-opacity duration-200",
200                    style: {
201                      top: "-3px",
202                      right: "-3px",
203                      width: "16px",
204                      height: "16px",
205                      fontSize: "9px",
206                      fontWeight: 500,
207                      fontFamily: "Helvetica, Arial, sans-serif",
208                      backgroundColor: "#0F0F0F",
209                      borderRadius: "8px",
210                      boxShadow: "0 0 0 1.5px rgba(255,255,255,0.5)",
211                      opacity: isExpanded ? 0 : 1,
212                      pointerEvents: "none"
213                    },
214                    "data-testid": "badge-waitlist-count",
215                    children: "1"
216                  },
217                  void 0,
218                  false,
219                  {
220                    fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
221                    lineNumber: 160,
222                    columnNumber: 11
223                  },
224                  this
225                ),
226                !isExpanded ? /* @__PURE__ */ jsxDEV(Mail, { size: 20, strokeWidth: 1.4 }, void 0, false, {
227                  fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
228                  lineNumber: 183,
229                  columnNumber: 11
230                }, this) : /* @__PURE__ */ jsxDEV(
231                  "span",
232                  {
233                    className: "text-[10px] uppercase whitespace-nowrap",
234                    style: {
235                      letterSpacing: "1.5px",
236                      fontFamily: "Helvetica, Arial, sans-serif",
237                      fontWeight: 400
238                    },
239                    children: t("beTheFirstToKnow")
240                  },
241                  void 0,
242                  false,
243                  {
244                    fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
245                    lineNumber: 185,
246                    columnNumber: 11
247                  },
248                  this
249                )
250              ]
251            },
252            void 0,
253            true,
254            {
255              fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
256              lineNumber: 147,
257              columnNumber: 9
258            },
259            this
260          ),
261          /* @__PURE__ */ jsxDEV(
262            "button",
263            {
264              onClick: handleDismiss,
265              className: "flex items-center justify-center text-white hover:opacity-70 transition-opacity ml-2",
266              style: {
267                width: "32px",
268                height: "32px",
269                backgroundColor: "#0F0F0F",
270                borderRadius: "16px"
271              },
272              "aria-label": "Close",
273              "data-testid": "button-waitlist-close-mobile",
274              children: /* @__PURE__ */ jsxDEV(X, { size: 12, strokeWidth: 1.5 }, void 0, false, {
275                fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
276                lineNumber: 210,
277                columnNumber: 11
278              }, this)
279            },
280            void 0,
281            false,
282            {
283              fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
284              lineNumber: 198,
285              columnNumber: 9
286            },
287            this
288          )
289        ]
290      },
291      void 0,
292      true,
293      {
294        fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
295        lineNumber: 140,
296        columnNumber: 7
297      },
298      this
299    )
300  ] }, void 0, true, {
301    fileName: "/home/runner/workspace/client/src/components/WaitlistBubble.tsx",
302    lineNumber: 93,
303    columnNumber: 5
304  }, this);
305};
306_s(WaitlistBubble, "YZG7kRLFtXyiOm+Y4lBy24q9B+A=", false, function() {
307  return [useLanguage, useLocation];
308});
309_c = WaitlistBubble;
310export default WaitlistBubble;
311var _c;
312$RefreshReg$(_c, "WaitlistBubble");
313if (import.meta.hot && !inWebWorker) {
314  window.$RefreshReg$ = prevRefreshReg;
315  window.$RefreshSig$ = prevRefreshSig;
316}
317if (import.meta.hot && !inWebWorker) {
318  RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
319    RefreshRuntime.registerExportsForReactRefresh("/home/runner/workspace/client/src/components/WaitlistBubble.tsx", currentExports);
320    import.meta.hot.accept((nextExports) => {
321      if (!nextExports) return;
322      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/home/runner/workspace/client/src/components/WaitlistBubble.tsx", currentExports, nextExports);
323      if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
324    });
325  });
326}
327
328//# sourceMappingURL=data:application/json;base64,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GO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQXdFQTtBQUFBLE9BdkhGO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0F3SEE7QUFFSjtBQUFFaEQsR0FqTklELGdCQUF3QjtBQUFBLFVBQ2RGLGFBQ0tDLFdBQVc7QUFBQTtBQUFBOEQsS0FGMUI3RDtBQW1OTixlQUFlQTtBQUFlLElBQUE2RDtBQUFBQyxhQUFBRCxJQUFBIiwibmFtZXMiOlsidXNlRWZmZWN0IiwiTWFpbCIsIlgiLCJ1c2VMYW5ndWFnZSIsInVzZUxvY2F0aW9uIiwiV2FpdGxpc3RCdWJibGUiLCJfcyIsInQiLCJsb2NhdGlvbiIsImlzVmlzaWJsZSIsInNldElzVmlzaWJsZSIsInVzZVN0YXRlIiwiaXNEaXNtaXNzZWQiLCJzZXRJc0Rpc21pc3NlZCIsImlzRXhwYW5kZWQiLCJzZXRJc0V4cGFuZGVkIiwiaXNQbGF5Ym9va1BhZ2UiLCJzdGFydHNXaXRoIiwiZGlzbWlzc2VkIiwic2Vzc2lvblN0b3JhZ2UiLCJnZXRJdGVtIiwidGltZW91dElkIiwic2hvd0J1YmJsZSIsImNvb2tpZUNvbnNlbnQiLCJsb2NhbFN0b3JhZ2UiLCJ3aW5kb3ciLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiaGFuZGxlU2Nyb2xsIiwiY2xlYXJUaW1lb3V0Iiwic2Nyb2xsYWJsZUhlaWdodCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iiwic2Nyb2xsSGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJzY3JvbGxQZXJjZW50Iiwic2Nyb2xsWSIsInNldFRpbWVvdXQiLCJhZGRFdmVudExpc3RlbmVyIiwic2Nyb2xsVG9TdWJzY3JpYmUiLCJzdWJzY3JpYmVTZWN0aW9uIiwiZ2V0RWxlbWVudEJ5SWQiLCJuYXZIZWlnaHQiLCJlbGVtZW50UG9zaXRpb24iLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b3AiLCJzY3JvbGxUbyIsImJlaGF2aW9yIiwic2V0SXRlbSIsImhhbmRsZUNsaWNrIiwiaGFuZGxlRGlzbWlzcyIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJwYWRkaW5nIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyUmFkaXVzIiwibGV0dG
328VyU3BhY2luZyIsImZvbnRGYW1pbHkiLCJmb250V2VpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJtaW5XaWR0aCIsInJpZ2h0IiwiZm9udFNpemUiLCJib3hTaGFkb3ciLCJvcGFjaXR5IiwicG9pbnRlckV2ZW50cyIsIl9jIiwiJFJlZnJlc2hSZWckIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIldhaXRsaXN0QnViYmxlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTWFpbCwgWCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VMYW5ndWFnZSB9IGZyb20gJ0AvbGliL0xhbmd1YWdlQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiB9IGZyb20gJ3dvdXRlcic7XG5cbmNvbnN0IFdhaXRsaXN0QnViYmxlOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VMYW5ndWFnZSgpO1xuICBjb25zdCBbbG9jYXRpb25dID0gdXNlTG9jYXRpb24oKTtcbiAgY29uc3QgW2lzVmlzaWJsZSwgc2V0SXNWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzRGlzbWlzc2VkLCBzZXRJc0Rpc21pc3NlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc0V4cGFuZGVkLCBzZXRJc0V4cGFuZGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAvLyBIaWRlIG9uIFBsYXlib29rIHBhZ2VzIC0gdXNlcnMgYWxyZWFkeSBoYXZlIGFjY2Vzc1xuICBjb25zdCBpc1BsYXlib29rUGFnZSA9IGxvY2F0aW9uLnN0YXJ0c1dpdGgoJy9wbGF5Ym9vaycpIHx8IGxvY2F0aW9uLnN0YXJ0c1dpdGgoJy9za2luY2FyZS1ndWlkZScpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZGlzbWlzc2VkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnd2FpdGxpc3RCdWJibGVEaXNtaXNzZWQnKTtcbiAgICBpZiAoZGlzbWlzc2VkKSB7XG4gICAgICBzZXRJc0Rpc21pc3NlZCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGltZW91dElkOiBOb2RlSlMuVGltZW91dDtcbiAgICBcbiAgICBjb25zdCBzaG93QnViYmxlID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29va2llQ29uc2VudCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdreW5fY29va2llX2NvbnNlbnQnKTtcbiAgICAgIGlmICghY29va2llQ29uc2VudCkgcmV0dXJuO1xuICAgICAgXG4gICAgICBzZXRJc1Zpc2libGUodHJ1ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlU2Nyb2xsKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVTY3JvbGwgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb29raWVDb25zZW50ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2t5bl9jb29raWVfY29uc2VudCcpO1xuICAgICAgaWYgKCFjb29raWVDb25zZW50KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGVIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgaWYgKHNjcm9sbGFibGVIZWlnaHQgPD0gMCkgcmV0dXJuO1xuICAgICAgXG4gICAgICBjb25zdCBzY3JvbGxQZXJjZW50ID0gKHdpbmRvdy5zY3JvbGxZIC8gc2Nyb2xsYWJsZUhlaWdodCkgKiAxMDA7XG4gICAgICBpZiAoc2Nyb2xsUGVyY2VudCA+PSAyNSkge1xuICAgICAgICBzaG93QnViYmxlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFpc1Zpc2libGUpIHtcbiAgICAgICAgc2hvd0J1YmJsZSgpO1xuICAgICAgfVxuICAgIH0sIDUwMDApO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZVNjcm9sbCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVTY3JvbGwpO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfTtcbiAgfSwgW2lzVmlzaWJsZV0pO1xuXG4gIGNvbnN0IHNjcm9sbFRvU3Vic2NyaWJlID0gKCkgPT4ge1xuICAgIGNvbnN0IHN1YnNjcmliZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3Vic2NyaWJlLXNlY3Rpb24nKTtcbiAgICBpZiAoc3Vic2NyaWJlU2VjdGlvbikge1xuICAgICAgY29uc3QgbmF2SGVpZ2h0ID0gMTE4O1xuICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gc3Vic2NyaWJlU2VjdGlvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWTtcbiAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogZWxlbWVudFBvc2l0aW9uIC0gbmF2SGVpZ2h0LCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgfVxuICAgIC8vIE1hcmsgYnViYmxlIGFzIGRpc21pc3NlZFxuICAgIHNldElzVmlzaWJsZShmYWxzZSk7XG4gICAgc2V0SXNEaXNtaXNzZWQodHJ1ZSk7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnd2FpdGxpc3RCdWJibGVEaXNtaXNzZWQnLCAndHJ1ZScpO1xuICAgIC8vIEJsb2NrIHRoZSBwb3B1cCBmcm9tIHNob3dpbmcgd2hlbiB1c2VyIGNsaWNrcyB0aGlzIGJ1dHRvblxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2t5bi13YWl0bGlzdC1wb3B1cC1jbG9zZWQnLCAndHJ1ZScpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKCkgPT4ge1xuICAgIGlmIChpc0V4cGFuZGVkKSB7XG4gICAgICBzY3JvbGxUb1N1YnNjcmliZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRJc0V4cGFuZGVkKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVEaXNtaXNzID0gKGU6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldElzVmlzaWJsZShmYWxzZSk7XG4gICAgc2V0SXNEaXNtaXNzZWQodHJ1ZSk7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnd2FpdGxpc3RCdWJibGVEaXNtaXNzZWQnLCAndHJ1ZScpO1xuICB9O1xuXG4gIGlmIChpc0Rpc21pc3NlZCB8fCBpc1BsYXlib29rUGFnZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgey8qIERlc2t0b3AgdmVyc2lvbiAqL31cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtgZml4ZWQgYm90dG9tLTYgbGVmdC02IHotWzEwMF0gdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tNTAwIGVhc2Utb3V0IGhpZGRlbiBtZDpmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiAke1xuICAgICAgICAgIGlzVmlzaWJsZSBcbiAgICAgICAgICAgID8gJ3RyYW5zbGF0ZS14LTAgb3BhY2l0eS0xMDAnIFxuICAgICAgICAgICAgOiAnLXRyYW5zbGF0ZS14LWZ1bGwgb3BhY2l0eS0wJ1xuICAgICAgICB9YH1cbiAgICAgID5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyB0ZXh0LXdoaXRlIGN1cnNvci1wb2ludGVyIGhvdmVyOm9wYWNpdHktOTAgdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLXdoaXRlXCJcbiAgICAgICAgICBzdHlsZT17eyBcbiAgICAgICAgICAgI
328HBhZGRpbmc6ICcxNHB4IDI4cHgnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzBGMEYwRicsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcycHgnLFxuICAgICAgICAgIH19XG4gICAgICAgICAgb25DbGljaz17c2Nyb2xsVG9TdWJzY3JpYmV9XG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJidXR0b24td2FpdGxpc3QtZmFiLWRlc2t0b3BcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSB1cHBlcmNhc2VcIlxuICAgICAgICAgICAgc3R5bGU9e3sgXG4gICAgICAgICAgICAgIGxldHRlclNwYWNpbmc6ICcycHgnLFxuICAgICAgICAgICAgICBmb250RmFtaWx5OiAnSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZicsXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDQwMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3QoJ2JlVGhlRmlyc3RUb0tub3cnKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17aGFuZGxlRGlzbWlzc31cbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LXdoaXRlIGhvdmVyOm9wYWNpdHktNzAgdHJhbnNpdGlvbi1vcGFjaXR5XCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6ICczMnB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzMycHgnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzBGMEYwRicsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcycHgnLFxuICAgICAgICAgIH19XG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImJ1dHRvbi13YWl0bGlzdC1jbG9zZS1kZXNrdG9wXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxYIHNpemU9ezE0fSBzdHJva2VXaWR0aD17MS41fSAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogTW9iaWxlIHZlcnNpb24gLSBQcmVtaXVtIG1pbmltYWwgcGlsbCAqL31cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtgZml4ZWQgYm90dG9tLTYgbGVmdC01IHotWzEwMF0gdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tNTAwIGVhc2Utb3V0IG1kOmhpZGRlbiBmbGV4IGl0ZW1zLWNlbnRlciAke1xuICAgICAgICAgIGlzVmlzaWJsZSBcbiAgICAgICAgICAgID8gJ3RyYW5zbGF0ZS14LTAgb3BhY2l0eS0xMDAnIFxuICAgICAgICAgICAgOiAnLXRyYW5zbGF0ZS14LWZ1bGwgb3BhY2l0eS0wJ1xuICAgICAgICB9YH1cbiAgICAgID5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LXdoaXRlIGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCBlYXNlLW91dCBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC0yIGZvY3VzLXZpc2libGU6b3V0bGluZS13aGl0ZVwiXG4gICAgICAgICAgc3R5bGU9e3sgXG4gICAgICAgICAgICBoZWlnaHQ6ICc0OHB4JyxcbiAgICAgICAgICAgIG1pbldpZHRoOiBpc0V4cGFuZGVkID8gJzE2MHB4JyA6ICc0OHB4JyxcbiAgICAgICAgICAgIHBhZGRpbmc6IGlzRXhwYW5kZWQgPyAnMCAyMHB4JyA6ICcwJyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMwRjBGMEYnLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMjRweCcsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImJ1dHRvbi13YWl0bGlzdC1mYWJcIlxuICAgICAgICA+XG4gICAgICAgICAgey8qIE5vdGlmaWNhdGlvbiBiYWRnZSAtIG9ubHkgdmlzaWJsZSB3aGVuIGNvbGxhcHNlZCAqL31cbiAgICAgICAgICA8c3BhbiBcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMFwiXG4gICAgICAgICAgICBzdHlsZT17eyBcbiAgICAgICAgICAgICAgdG9wOiAnLTNweCcsXG4gICAgICAgICAgICAgIHJpZ2h0OiAnLTNweCcsXG4gICAgICAgICAgICAgIHdpZHRoOiAnMTZweCcsXG4gICAgICAgICAgICAgIGhlaWdodDogJzE2cHgnLFxuICAgICAgICAgICAgICBmb250U2l6ZTogJzlweCcsXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMEYwRjBGJyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgICAgICAgICAgYm94U2hhZG93OiAnMCAwIDAgMS41cHggcmdiYSgyNTUsMjU1LDI1NSwwLjUpJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogaXNFeHBhbmRlZCA/IDAgOiAxLFxuICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJiYWRnZS13YWl0bGlzdC1jb3VudFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgMVxuICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgIHsvKiBDb250ZW50ICovfVxuICAgICAgICAgIHshaXNFeHBhbmRlZCA/IChcbiAgICAgICAgICAgIDxNYWlsIHNpemU9ezIwfSBzdHJva2VXaWR0aD17MS40fSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8c3BhbiBcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMTBweF0gdXBwZXJjYXNlIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgXG4gICAgICAgICAgICAgICAgbGV0dGVyU3BhY2luZzogJzEuNXB4JyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiAnSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZicsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogNDAwLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dCgnYmVUaGVGaXJzdFRvS25vdycpfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB7LyogQ2xvc2UgYnV0dG9uIGZvciBtb2JpbGUgKi99XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVEaXNtaXNzfVxuICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtd2hpdGUgaG92ZXI6b3BhY2l0eS03MCB0cmFuc2l0aW9uLW9wYWNpdHkgbWwtMlwiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgI
328HdpZHRoOiAnMzJweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICczMnB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMwRjBGMEYnLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMTZweCcsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2VcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYnV0dG9uLXdhaXRsaXN0LWNsb3NlLW1vYmlsZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8WCBzaXplPXsxMn0gc3Ryb2tlV2lkdGg9ezEuNX0gLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFdhaXRsaXN0QnViYmxlO1xuIl0sImZpbGUiOiIvaG9tZS9ydW5uZXIvd29ya3NwYWNlL2NsaWVudC9zcmMvY29tcG9uZW50cy9XYWl0bGlzdEJ1YmJsZS50c3gifQ==

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.