@envive-ai/react-hooks 0.2.7-arthur-1 → 0.2.7

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.
Files changed (83) hide show
  1. package/dist/{TrackComponentVisibleEvent-CXhKOwKQ.js → TrackComponentVisibleEvent-qNE0dIL1.js} +2 -2
  2. package/dist/{TrackComponentVisibleEvent-CgxCqrIt.cjs → TrackComponentVisibleEvent-tDRnrJi3.cjs} +2 -2
  3. package/dist/amplitudeContext-C6LHpqP_.cjs +290 -0
  4. package/dist/amplitudeContext-rEjGf57q.js +268 -0
  5. package/dist/application/utils/index.cjs +2 -2
  6. package/dist/application/utils/index.js +2 -2
  7. package/dist/atoms/app/index.d.cts +7 -7
  8. package/dist/atoms/app/index.d.ts +1 -1
  9. package/dist/atoms/chat/index.cjs +3 -3
  10. package/dist/atoms/chat/index.d.cts +26 -26
  11. package/dist/atoms/chat/index.d.ts +1 -1
  12. package/dist/atoms/chat/index.js +3 -3
  13. package/dist/atoms/globalSearch/index.d.cts +6 -6
  14. package/dist/atoms/globalSearch/index.d.ts +5 -5
  15. package/dist/atoms/org/index.d.cts +16 -16
  16. package/dist/atoms/org/index.d.ts +16 -16
  17. package/dist/atoms/search/index.cjs +5 -5
  18. package/dist/atoms/search/index.js +5 -5
  19. package/dist/atoms/search/utils.d.ts +1 -1
  20. package/dist/{cdnContext-CtrIlAqX.js → cdnContext-B8zWuGGT.js} +1 -1
  21. package/dist/{cdnContext-CaDyQ_5p.cjs → cdnContext-DzifgoNo.cjs} +1 -1
  22. package/dist/{chat-BjhQCyW_.js → chat-DChvXHjz.js} +3 -3
  23. package/dist/{chat-BkPax29G.cjs → chat-L_N0qaqs.cjs} +3 -3
  24. package/dist/{chatSearch-C3N3iIxu.cjs → chatSearch-B5whqPLW.cjs} +3 -3
  25. package/dist/{chatSearch-BsYlFvpv.js → chatSearch-so-qeiEL.js} +3 -3
  26. package/dist/{chatState-CJ52Ag_7.cjs → chatState-D9_aA1_h.cjs} +2 -2
  27. package/dist/{chatState-CXA1vF16.js → chatState-Dl5lyuKC.js} +2 -2
  28. package/dist/{commerce-api-rgj30eEp.js → commerce-api-DEFd5HUH.js} +2 -2
  29. package/dist/{commerce-api-DA1QGGMK.cjs → commerce-api-DqVD4NH8.cjs} +2 -2
  30. package/dist/contexts/amplitudeContext/index.cjs +2 -2
  31. package/dist/contexts/amplitudeContext/index.js +2 -2
  32. package/dist/contexts/cdnContext/index.cjs +1 -1
  33. package/dist/contexts/cdnContext/index.js +1 -1
  34. package/dist/contexts/chatContext/index.cjs +7 -7
  35. package/dist/contexts/chatContext/index.d.ts +4 -4
  36. package/dist/contexts/chatContext/index.js +7 -7
  37. package/dist/contexts/systemSettingsContext/index.d.cts +2 -2
  38. package/dist/contexts/systemSettingsContext/index.d.ts +4 -4
  39. package/dist/contexts/userIdentityContext/index.cjs +4 -4
  40. package/dist/contexts/userIdentityContext/index.js +4 -4
  41. package/dist/frontendConfig-Cawh5iqv.d.ts +1 -1
  42. package/dist/frontendConfig-iZipB5FG.d.cts +1 -1
  43. package/dist/hooks/AmplitudeOperations/index.cjs +3 -3
  44. package/dist/hooks/AmplitudeOperations/index.js +3 -3
  45. package/dist/hooks/CdnOperations/index.cjs +1 -1
  46. package/dist/hooks/CdnOperations/index.js +1 -1
  47. package/dist/hooks/ChatToggle/index.cjs +3 -3
  48. package/dist/hooks/ChatToggle/index.js +3 -3
  49. package/dist/hooks/ChatToggleAnalytics/index.cjs +4 -4
  50. package/dist/hooks/ChatToggleAnalytics/index.js +4 -4
  51. package/dist/hooks/GrabAndScroll/index.d.cts +2 -2
  52. package/dist/hooks/IdentifyUser/index.cjs +4 -4
  53. package/dist/hooks/IdentifyUser/index.js +4 -4
  54. package/dist/hooks/Search/index.cjs +19 -1157
  55. package/dist/hooks/Search/index.js +17 -1156
  56. package/dist/hooks/SystemSettingsContext/index.d.ts +2 -2
  57. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +2 -2
  58. package/dist/hooks/TrackComponentVisibleEvent/index.js +2 -2
  59. package/dist/hooks/UpdateAnalyticsProps/index.cjs +1 -1
  60. package/dist/hooks/UpdateAnalyticsProps/index.js +1 -1
  61. package/dist/{search-Csh2n66W.cjs → search-CneZkauD.cjs} +2 -2
  62. package/dist/{search-DkiqkogN.js → search-DbZeJYdg.js} +2 -2
  63. package/dist/{useAmplitudeOperations-zIRSqmMW.js → useAmplitudeOperations-B9HjVe6G.js} +2 -2
  64. package/dist/{useAmplitudeOperations-Bo6YNbTV.cjs → useAmplitudeOperations-BdvxAzuI.cjs} +2 -2
  65. package/dist/userIdentityContext-CPztaX6-.js +126 -0
  66. package/dist/userIdentityContext-DdySlQBz.cjs +143 -0
  67. package/dist/{utils-C1ErYSoW.js → utils-B4PvsKVY.js} +2 -2
  68. package/dist/{utils-mqfncrhI.cjs → utils-BRVP7Mnu.cjs} +2 -2
  69. package/dist/utils-CBD4g2Nc.d.cts +1 -1
  70. package/dist/utils-QKFAbPT6.d.ts +1 -1
  71. package/package.json +3 -2
  72. package/src/contexts/amplitudeContext/__tests__/amplitudeContext.test.tsx +525 -0
  73. package/src/contexts/amplitudeContext/amplitudeContext.tsx +6 -2
  74. package/src/contexts/userIdentityContext/__tests__/userIdentityContext.test.tsx +0 -162
  75. package/src/contexts/userIdentityContext/userIdentityContext.tsx +13 -4
  76. package/dist/amplitudeContext-C8tT74Mi.cjs +0 -286
  77. package/dist/amplitudeContext-DCk6Va-j.js +0 -264
  78. package/dist/userIdentityContext-BqbNu7xu.cjs +0 -132
  79. package/dist/userIdentityContext-BxFH9FNQ.js +0 -115
  80. /package/dist/{AmplitudeOperations-ChZWcSsc.js → AmplitudeOperations-C-ieCm9m.js} +0 -0
  81. /package/dist/{AmplitudeOperations-JggIc1zD.cjs → AmplitudeOperations-p7APchq9.cjs} +0 -0
  82. /package/dist/{amplitudeContext-BItT9HmT.js → amplitudeContext-DbicJUzl.js} +0 -0
  83. /package/dist/{amplitudeContext-DPtyVv3Q.cjs → amplitudeContext-q3mggFSE.cjs} +0 -0
@@ -1,264 +0,0 @@
1
- import { EventsDispatcher, SpiffyEvent } from "./events-DyUix-Bn.js";
2
- import { OrgShortName } from "./models-CWOgrLCm.js";
3
- import { FeatureGates } from "./featureGates-KEwAL8p_.js";
4
- import { logger_default } from "./logger-W3lqg-4b.js";
5
- import { LocalStorageKeys, useLocalStorage } from "./localStorageContext-BPZ82q-G.js";
6
- import { amplitudeApiKeyAtom, contextSourceAtom, dataResidencyAtom, envAtom, identifyingPrefixAtom } from "./enviveConfig-DZBohDpc.js";
7
- import { orgAnalyticsGoogleAnalyticsConfigAtom } from "./orgAnalyticsConfig-CpBmga08.js";
8
- import { userIdAtom } from "./app-CflxT_xI.js";
9
- import { useEnviveConfig } from "./enviveConfigContext-DrDjCems.js";
10
- import { useFeatureFlagService } from "./featureFlagServiceContext-FBM6DdMJ.js";
11
- import React, { createContext, useCallback, useContext, useEffect, useMemo } from "react";
12
- import { useAtomValue } from "jotai";
13
- import { createInstance } from "@amplitude/analytics-browser";
14
- import { jsx } from "react/jsx-runtime";
15
-
16
- //#region src/contexts/amplitudeContext/amplitudeContext.tsx
17
- let SpiffyMetricsEventName = /* @__PURE__ */ function(SpiffyMetricsEventName$1) {
18
- SpiffyMetricsEventName$1["BundleLoaded"] = "Bundle Loaded";
19
- SpiffyMetricsEventName$1["ChatLiveAgentBtnClick"] = "Chat Live Agent Btn Click";
20
- SpiffyMetricsEventName$1["ChatFloatingButtonVisible"] = "Chat Floating Button Visible";
21
- SpiffyMetricsEventName$1["ChatComponentVisible"] = "Chat Component Visible";
22
- SpiffyMetricsEventName$1["ChatComponentExpanded"] = "Chat Component Expanded";
23
- SpiffyMetricsEventName$1["ChatComponentCollapsed"] = "Chat Component Collapsed";
24
- SpiffyMetricsEventName$1["ChatUserMessageInput"] = "Chat User Message Input";
25
- SpiffyMetricsEventName$1["ChatSuggestionClicked"] = "Chat Suggestion Clicked";
26
- SpiffyMetricsEventName$1["ChatAssistantResponse"] = "Chat Assistant Response";
27
- SpiffyMetricsEventName$1["ProductCardClicked"] = "Product Card Clicked";
28
- SpiffyMetricsEventName$1["ProductReviewCardClicked"] = "Product Review Card Clicked";
29
- SpiffyMetricsEventName$1["AddToCartClicked"] = "Add to Cart Clicked";
30
- SpiffyMetricsEventName$1["PromptCardClicked"] = "Prompt Card Clicked";
31
- SpiffyMetricsEventName$1["SupportedEvent"] = "Supported Event";
32
- SpiffyMetricsEventName$1["SearchBackToResponseClicked"] = "Search Back to Response Clicked";
33
- SpiffyMetricsEventName$1["PerformanceMetrics"] = "Performance Metrics";
34
- SpiffyMetricsEventName$1["SearchBarClicked"] = "Search Bar Clicked";
35
- SpiffyMetricsEventName$1["OrderLookupStarted"] = "Order Lookup Started";
36
- SpiffyMetricsEventName$1["OrderLookupFormSubmitted"] = "Order Lookup Form Submitted";
37
- SpiffyMetricsEventName$1["SearchComponentVisible"] = "Search Component Visible";
38
- SpiffyMetricsEventName$1["SearchZeroStateSuggestionClicked"] = "Search Zero State Suggestion Clicked";
39
- SpiffyMetricsEventName$1["SearchInputStarted"] = "Search Input Started";
40
- SpiffyMetricsEventName$1["SearchQuerySubmitted"] = "Search Query Submitted";
41
- SpiffyMetricsEventName$1["SearchResultsViewed"] = "Search Results Viewed";
42
- SpiffyMetricsEventName$1["SearchTimeToFirstClick"] = "Search Time to First Click";
43
- SpiffyMetricsEventName$1["SearchZeroResultsRate"] = "Search Zero Results Rate";
44
- SpiffyMetricsEventName$1["SearchFilterClicked"] = "Search Filter Clicked";
45
- SpiffyMetricsEventName$1["SearchSortClicked"] = "Search Sort Clicked";
46
- return SpiffyMetricsEventName$1;
47
- }({});
48
- const AmplitudeContext = createContext(null);
49
- const AmplitudeProvider = ({ children }) => {
50
- const userId = useAtomValue(userIdAtom);
51
- const amplitudeApiKey = useAtomValue(amplitudeApiKeyAtom);
52
- const dataResidency = useAtomValue(dataResidencyAtom);
53
- const orgGaConfig = useAtomValue(orgAnalyticsGoogleAnalyticsConfigAtom);
54
- const env = useAtomValue(envAtom);
55
- const contextSource = useAtomValue(contextSourceAtom);
56
- useAtomValue(identifyingPrefixAtom);
57
- const { getItem } = useLocalStorage();
58
- const { publicKey, featureOverrides, variantUrlOverride, variantInfoOverride, show, orgShortName, featureGates } = useEnviveConfig();
59
- const { featureFlagService } = useFeatureFlagService();
60
- const [amplitudeClient, setAmplitudeClient] = React.useState(void 0);
61
- const [internalEventTrackingEnrichment, setInternalEventTrackingEnrichment] = React.useState(void 0);
62
- const [supplementalDefaultProps, setSupplementalDefaultProps] = React.useState({});
63
- const isReady = Boolean(userId && featureFlagService && amplitudeApiKey && userId);
64
- const getDefaultTrackingProps = useCallback(() => {
65
- const gatesProps = featureGates ? featureGates.reduce((acc, curr) => {
66
- if (curr.name && curr.value != null) return {
67
- ...acc,
68
- [`feature_gate.${curr.name}`]: curr.value
69
- };
70
- return acc;
71
- }, {}) : {};
72
- const experimentProps = {};
73
- return {
74
- ...gatesProps,
75
- ...experimentProps,
76
- ...supplementalDefaultProps,
77
- app_id: "commerce-chat-react-component",
78
- chat_id: getItem(LocalStorageKeys.ChatId),
79
- env: env || "unknown",
80
- app_source: contextSource,
81
- "org.short_name": orgShortName,
82
- "user.id": userId,
83
- "cdp.user_id": null,
84
- "cdp.provider": null,
85
- "event.source": "web-browser",
86
- "event.type": "user-activity",
87
- "event.id": null,
88
- "event.channel": "web",
89
- "event.timestamp": null
90
- };
91
- }, [
92
- featureGates,
93
- supplementalDefaultProps,
94
- env,
95
- contextSource,
96
- orgShortName,
97
- userId
98
- ]);
99
- const eventPropsToPrefixedEventProps = useCallback((eventName, eventProps) => {
100
- const prefix = eventName.toLowerCase().replace(/\s+/g, "_");
101
- return Object.entries(eventProps).reduce((acc, [key, value$1]) => {
102
- acc[`${prefix}.${key}`] = value$1;
103
- return acc;
104
- }, {});
105
- }, []);
106
- const amplitudeSessionReplayInit = useCallback(() => {
107
- const isEnabled = Boolean(orgShortName === OrgShortName.UniqueVintage && featureFlagService?.isClientSessionEnabled() && featureFlagService?.isFeatureGateEnabled(FeatureGates.IsNewFeatureEnabled));
108
- const sampleRate = 1;
109
- try {
110
- logger_default.logDebug(`[spiffy-ai] amplitude session-replay initializing isEnabled=${isEnabled} sampleRate=${sampleRate}`);
111
- if (!isEnabled) return isEnabled;
112
- return isEnabled;
113
- } catch (e) {
114
- logger_default.logError("[spiffy-ai] Error initializing amplitude session-replay", e);
115
- return false;
116
- }
117
- }, [orgShortName, featureFlagService]);
118
- const getEventTrackingEnrichment = useCallback(() => {
119
- if (internalEventTrackingEnrichment !== void 0) return internalEventTrackingEnrichment;
120
- const enrichment = {
121
- name: "page-view-tracking-enrichment",
122
- type: "enrichment",
123
- setup: async () => void 0,
124
- execute: async (event) => {
125
- let enrichedEvent;
126
- if (["[Amplitude] Page Viewed", `[Spiffy] ${SpiffyMetricsEventName.BundleLoaded}`].includes(event.event_type)) {
127
- const globalProperties = {};
128
- if (publicKey) globalProperties["globalProperties.publicKey"] = publicKey;
129
- if (featureOverrides) Object.entries(featureOverrides).forEach(([key, value$1]) => {
130
- globalProperties[`globalProperties.featureOverrides.${key}`] = String(value$1);
131
- });
132
- if (variantUrlOverride) globalProperties["globalProperties.variantUrlOverride"] = variantUrlOverride;
133
- if (variantInfoOverride) globalProperties["globalProperties.variantInfoOverride"] = JSON.stringify(variantInfoOverride);
134
- if (show != null) globalProperties["globalProperties.show"] = String(show);
135
- const enabledFeatures = featureFlagService.getFeatureFlags();
136
- const enabledFeaturesProperties = Object.entries(enabledFeatures).reduce((acc, [key, value$1]) => ({
137
- ...acc,
138
- [`enabledFeatures.${key}`]: `${value$1}`
139
- }), {});
140
- const timingProperties = { "timing.enriched_at_ms": window.performance?.now() };
141
- enrichedEvent = {
142
- ...event,
143
- event_properties: {
144
- ...event.event_properties,
145
- ...getDefaultTrackingProps(),
146
- ...globalProperties,
147
- ...enabledFeaturesProperties,
148
- ...timingProperties
149
- }
150
- };
151
- } else enrichedEvent = event;
152
- EventsDispatcher.dispatch(SpiffyEvent.AMPLITUDE_EVENT, enrichedEvent);
153
- return enrichedEvent;
154
- }
155
- };
156
- setInternalEventTrackingEnrichment(enrichment);
157
- return enrichment;
158
- }, [
159
- internalEventTrackingEnrichment,
160
- getDefaultTrackingProps,
161
- featureFlagService,
162
- publicKey,
163
- featureOverrides,
164
- variantUrlOverride,
165
- variantInfoOverride,
166
- show
167
- ]);
168
- useEffect(() => {
169
- if (isReady && !amplitudeClient) {
170
- const currentAmplitudeInstance = createInstance();
171
- const isSessionsEnabled = amplitudeSessionReplayInit();
172
- currentAmplitudeInstance.add(getEventTrackingEnrichment());
173
- currentAmplitudeInstance.init(amplitudeApiKey, userId, {
174
- serverZone: dataResidency,
175
- trackingOptions: { ipAddress: true },
176
- autocapture: {
177
- attribution: true,
178
- pageViews: { trackHistoryChanges: "pathOnly" },
179
- sessions: isSessionsEnabled,
180
- formInteractions: false,
181
- fileDownloads: false
182
- }
183
- });
184
- setAmplitudeClient(currentAmplitudeInstance);
185
- }
186
- }, [
187
- isReady,
188
- amplitudeClient,
189
- amplitudeApiKey,
190
- userId,
191
- dataResidency,
192
- amplitudeSessionReplayInit,
193
- getEventTrackingEnrichment
194
- ]);
195
- const trackEvent = useCallback(async ({ eventName, eventProps, eventGroups, alsoSendToGoogleAnalytics = false }) => {
196
- logger_default.logDebug("Submitting event", eventName);
197
- try {
198
- const decoratedEventName = `[Spiffy] ${eventName}`;
199
- if (!amplitudeClient) {
200
- logger_default.logWarn("amplitude client undefined", void 0, { event_name: decoratedEventName });
201
- return;
202
- }
203
- const eventData = JSON.stringify({
204
- eventName,
205
- eventProps,
206
- created_at: (/* @__PURE__ */ new Date()).toISOString()
207
- });
208
- const data = new TextEncoder().encode(eventData);
209
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
210
- const currentInsertId = Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
211
- logger_default.logDebug(`amplitude tracking ${decoratedEventName}`, null, {
212
- event_name: decoratedEventName,
213
- props: eventProps
214
- });
215
- amplitudeClient.track(decoratedEventName, {
216
- ...getDefaultTrackingProps(),
217
- ...eventProps,
218
- ...eventProps ? eventPropsToPrefixedEventProps(eventName, eventProps) : {}
219
- }, {
220
- ...eventGroups,
221
- insert_id: currentInsertId
222
- });
223
- if (alsoSendToGoogleAnalytics && orgGaConfig) {
224
- logger_default.logDebug("[spiffy-ai] GA tracking", decoratedEventName);
225
- if (window.dataLayer) window.dataLayer.push({
226
- event: decoratedEventName,
227
- eventProps
228
- });
229
- }
230
- } catch (err) {
231
- logger_default.logError("[spiffy-ai] Error tracking event", err, {
232
- eventName,
233
- eventProps
234
- });
235
- }
236
- }, [
237
- amplitudeClient,
238
- getDefaultTrackingProps,
239
- eventPropsToPrefixedEventProps,
240
- orgGaConfig
241
- ]);
242
- const value = useMemo(() => ({
243
- trackEvent,
244
- isReady,
245
- setSupplementalDefaultProps: (props) => setSupplementalDefaultProps(props)
246
- }), [
247
- trackEvent,
248
- isReady,
249
- setSupplementalDefaultProps
250
- ]);
251
- return /* @__PURE__ */ jsx(AmplitudeContext.Provider, {
252
- value,
253
- children
254
- });
255
- };
256
- const useAmplitude = () => {
257
- const context = useContext(AmplitudeContext);
258
- if (!context) throw new Error("useAmplitude must be used within AmplitudeProvider");
259
- return context;
260
- };
261
-
262
- //#endregion
263
- export { AmplitudeProvider, SpiffyMetricsEventName, useAmplitude };
264
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1wbGl0dWRlQ29udGV4dC1EQ2s2VmEtai5qcyIsIm5hbWVzIjpbIkFtcGxpdHVkZVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4iLCJ2YWx1ZSIsImVucmljaG1lbnQ6IEVucmljaG1lbnRQbHVnaW4iLCJlbnJpY2hlZEV2ZW50OiBFdmVudCIsImdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2U6IEJyb3dzZXJDbGllbnQiXSwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dHMvYW1wbGl0dWRlQ29udGV4dC9hbXBsaXR1ZGVDb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZU1lbW8sXG4gIHVzZUVmZmVjdCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VBdG9tVmFsdWUgfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSBcIkBhbXBsaXR1ZGUvYW5hbHl0aWNzLWJyb3dzZXJcIjtcbmltcG9ydCB7IEZlYXR1cmVHYXRlcyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL2ZlYXR1cmVHYXRlc1wiO1xuaW1wb3J0IHsgT3JnU2hvcnROYW1lIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHNcIjtcbmltcG9ydCB7IEV2ZW50c0Rpc3BhdGNoZXIsIFNwaWZmeUV2ZW50IH0gZnJvbSBcInNyYy9ldmVudHNcIjtcbmltcG9ydCB7XG4gIGFtcGxpdHVkZUFwaUtleUF0b20sXG4gIGNvbnRleHRTb3VyY2VBdG9tLFxuICBkYXRhUmVzaWRlbmN5QXRvbSxcbiAgaWRlbnRpZnlpbmdQcmVmaXhBdG9tLFxufSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7XG4gIExvY2FsU3RvcmFnZUtleXMsXG4gIHVzZUxvY2FsU3RvcmFnZSxcbn0gZnJvbSBcInNyYy9jb250ZXh0cy9sb2NhbFN0b3JhZ2VDb250ZXh0XCI7XG5pbXBvcnQgeyBvcmdBbmFseXRpY3NHb29nbGVBbmFseXRpY3NDb25maWdBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmcvb3JnQW5hbHl0aWNzQ29uZmlnXCI7XG5pbXBvcnQgeyB1c2VySWRBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9hcHBcIjtcbmltcG9ydCB7IGVudkF0b20gfSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUge1xuICBCcm93c2VyQ2xpZW50LFxuICBFbnJpY2htZW50UGx1Z2luLFxuICBFdmVudCxcbiAgU2VydmVyWm9uZVR5cGUsXG59IGZyb20gXCJAYW1wbGl0dWRlL2FuYWx5dGljcy10eXBlc1wiO1xuaW1wb3J0IHsgdXNlRW52aXZlQ29uZmlnIH0gZnJvbSBcInNyYy9jb250ZXh0cy9lbnZpdmVDb25maWdDb250ZXh0L2Vudml2ZUNvbmZpZ0NvbnRleHRcIjtcbmltcG9ydCB7XG4gIHVzZUZlYXR1cmVGbGFnU2VydmljZSxcbn0gZnJvbSBcInNyYy9jb250ZXh0cy9mZWF0dXJlRmxhZ1NlcnZpY2VDb250ZXh0L2ZlYXR1cmVGbGFnU2VydmljZUNvbnRleHRcIjtcbmltcG9ydCB7IHVzZVVzZXJJZGVudGl0eSB9IGZyb20gXCJzcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0XCI7XG5cbmV4cG9ydCBlbnVtIFNwaWZmeU1ldHJpY3NFdmVudE5hbWUge1xuICBCdW5kbGVMb2FkZWQgPSBcIkJ1bmRsZSBMb2FkZWRcIixcbiAgQ2hhdExpdmVBZ2VudEJ0bkNsaWNrID0gXCJDaGF0IExpdmUgQWdlbnQgQnRuIENsaWNrXCIsXG4gIENoYXRGbG9hdGluZ0J1dHRvblZpc2libGUgPSBcIkNoYXQgRmxvYXRpbmcgQnV0dG9uIFZpc2libGVcIixcbiAgQ2hhdENvbXBvbmVudFZpc2libGUgPSBcIkNoYXQgQ29tcG9uZW50IFZpc2libGVcIixcbiAgQ2hhdENvbXBvbmVudEV4cGFuZGVkID0gXCJDaGF0IENvbXBvbmVudCBFeHBhbmRlZFwiLFxuICBDaGF0Q29tcG9uZW50Q29sbGFwc2VkID0gXCJDaGF0IENvbXBvbmVudCBDb2xsYXBzZWRcIixcbiAgQ2hhdFVzZXJNZXNzYWdlSW5wdXQgPSBcIkNoYXQgVXNlciBNZXNzYWdlIElucHV0XCIsXG4gIENoYXRTdWdnZXN0aW9uQ2xpY2tlZCA9IFwiQ2hhdCBTdWdnZXN0aW9uIENsaWNrZWRcIixcbiAgQ2hhdEFzc2lzdGFudFJlc3BvbnNlID0gXCJDaGF0IEFzc2lzdGFudCBSZXNwb25zZVwiLFxuICBQcm9kdWN0Q2FyZENsaWNrZWQgPSBcIlByb2R1Y3QgQ2FyZCBDbGlja2VkXCIsXG4gIFByb2R1Y3RSZXZpZXdDYXJkQ2xpY2tlZCA9IFwiUHJvZHVjdCBSZXZpZXcgQ2FyZCBDbGlja2VkXCIsXG4gIEFkZFRvQ2FydENsaWNrZWQgPSBcIkFkZCB0byBDYXJ0IENsaWNrZWRcIixcbiAgUHJvbXB0Q2FyZENsaWNrZWQgPSBcIlByb21wdCBDYXJkIENsaWNrZWRcIixcbiAgU3VwcG9ydGVkRXZlbnQgPSBcIlN1cHBvcnRlZCBFdmVudFwiLFxuICBTZWFyY2hCYWNrVG9SZXNwb25zZUNsaWNrZWQgPSBcIlNlYXJjaCBCYWNrIHRvIFJlc3BvbnNlIENsaWNrZWRcIixcbiAgUGVyZm9ybWFuY2VNZXRyaWNzID0gXCJQZXJmb3JtYW5jZSBNZXRyaWNzXCIsXG4gIFNlYXJjaEJhckNsaWNrZWQgPSBcIlNlYXJjaCBCYXIgQ2xpY2tlZFwiLFxuICBPcmRlckxvb2t1cFN0YXJ0ZWQgPSBcIk9yZGVyIExvb2t1cCBTdGFydGVkXCIsXG4gIE9yZGVyTG9va3VwRm9ybVN1Ym1pdHRlZCA9IFwiT3JkZXIgTG9va3VwIEZvcm0gU3VibWl0dGVkXCIsXG4gIFNlYXJjaENvbXBvbmVudFZpc2libGUgPSBcIlNlYXJjaCBDb21wb25lbnQgVmlzaWJsZVwiLFxuICBTZWFyY2haZXJvU3RhdGVTdWdnZXN0aW9uQ2xpY2tlZCA9IFwiU2VhcmNoIFplcm8gU3RhdGUgU3VnZ2VzdGlvbiBDbGlja2VkXCIsIC8vIFRoaXMgaXMgdGhlIHNjcm9sbGluZyBsaXN0IG9mIHN1Z2dlc3Rpb24gYnV0dG9ucyBpbiBnbG9iYWwgc2VhcmNoXG4gIFNlYXJjaElucHV0U3RhcnRlZCA9IFwiU2VhcmNoIElucHV0IFN0YXJ0ZWRcIixcbiAgU2VhcmNoUXVlcnlTdWJtaXR0ZWQgPSBcIlNlYXJjaCBRdWVyeSBTdWJtaXR0ZWRcIixcbiAgLy8gU2VhcmNoQXV0b2NvbXBsZXRlVmlld2VkID0gJ1NlYXJjaCBBdXRvY29tcGxldGUgVmlld2VkJywgLy8gVE9ETzogYWRkIHRoaXMgd2hlbiBhdXRvY29tcGxldGUgaXMgYWRkZWRcbiAgLy8gU2VhcmNoQXV0b2NvbXBsZXRlQ2xpY2tlZCA9ICdTZWFyY2ggQXV0b2NvbXBsZXRlIENsaWNrZWQnLCAvLyBUT0RPOiBhZGQgdGhpcyB3aGVuIGF1dG9jb21wbGV0ZSBpcyBhZGRlZFxuICBTZWFyY2hSZXN1bHRzVmlld2VkID0gXCJTZWFyY2ggUmVzdWx0cyBWaWV3ZWRcIixcbiAgU2VhcmNoVGltZVRvRmlyc3RDbGljayA9IFwiU2VhcmNoIFRpbWUgdG8gRmlyc3QgQ2xpY2tcIixcbiAgU2VhcmNoWmVyb1Jlc3VsdHNSYXRlID0gXCJTZWFyY2ggWmVybyBSZXN1bHRzIFJhdGVcIixcbiAgU2VhcmNoRmlsdGVyQ2xpY2tlZCA9IFwiU2VhcmNoIEZpbHRlciBDbGlja2VkXCIsXG4gIFNlYXJjaFNvcnRDbGlja2VkID0gXCJTZWFyY2ggU29ydCBDbGlja2VkXCIsXG59XG5cbmludGVyZmFjZSBUcmFja0V2ZW50UGFyYW1zIHtcbiAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lO1xuICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV2ZW50R3JvdXBzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGFsc29TZW5kVG9Hb29nbGVBbmFseXRpY3M/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQW1wbGl0dWRlQ29udGV4dFR5cGUge1xuICB0cmFja0V2ZW50OiAocGFyYW1zOiBUcmFja0V2ZW50UGFyYW1zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBpc1JlYWR5OiBib29sZWFuO1xuICBzZXRTdXBwbGVtZW50YWxEZWZhdWx0UHJvcHM6IChwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEFtcGxpdHVkZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEFtcGxpdHVkZUNvbnRleHRUeXBlIHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBjb25zdCBBbXBsaXR1ZGVQcm92aWRlcjogUmVhY3QuRkM8eyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0+ID0gKHtcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IHVzZXJJZCA9IHVzZUF0b21WYWx1ZSh1c2VySWRBdG9tKTtcbiAgY29uc3QgYW1wbGl0dWRlQXBpS2V5ID0gdXNlQXRvbVZhbHVlKGFtcGxpdHVkZUFwaUtleUF0b20pO1xuICBjb25zdCBkYXRhUmVzaWRlbmN5ID0gdXNlQXRvbVZhbHVlKGRhdGFSZXNpZGVuY3lBdG9tKTtcbiAgY29uc3Qgb3JnR2FDb25maWcgPSB1c2VBdG9tVmFsdWUob3JnQW5hbHl0aWNzR29vZ2xlQW5hbHl0aWNzQ29uZmlnQXRvbSk7XG4gIGNvbnN0IGVudiA9IHVzZUF0b21WYWx1ZShlbnZBdG9tKTtcbiAgY29uc3QgY29udGV4dFNvdXJjZSA9IHVzZUF0b21WYWx1ZShjb250ZXh0U291cmNlQXRvbSk7XG4gIGNvbnN0IGlkZW50aWZ5aW5nUHJlZml4ID0gdXNlQXRvbVZhbHVlKGlkZW50aWZ5aW5nUHJlZml4QXRvbSk7XG4gIGNvbnN0IHsgZ2V0SXRlbSB9ID0gdXNlTG9jYWxTdG9yYWdlKCk7XG4gIGNvbnN0IHtcbiAgICBwdWJsaWNLZXksXG4gICAgZmVhdHVyZU92ZXJyaWRlcyxcbiAgICB2YXJpYW50VXJsT3ZlcnJpZGUsXG4gICAgdmFyaWFudEluZm9PdmVycmlkZSxcbiAgICBzaG93LFxuICAgIG9yZ1Nob3J0TmFtZSxcbiAgICBmZWF0dXJlR2F0ZXMsXG4gIH0gPSB1c2VFbnZpdmVDb25maWcoKTtcblxuICBjb25zdCB7IGZlYXR1cmVGbGFnU2VydmljZSB9ID0gdXNlRmVhdHVyZUZsYWdTZXJ2aWNlKCk7XG5cbiAgY29uc3QgW2FtcGxpdHVkZUNsaWVudCwgc2V0QW1wbGl0dWRlQ2xpZW50XSA9IFJlYWN0LnVzZVN0YXRlPFxuICAgIEJyb3dzZXJDbGllbnQgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudCwgc2V0SW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudF0gPVxuICAgIFJlYWN0LnVzZVN0YXRlPEVucmljaG1lbnRQbHVnaW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFtzdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wc10gPVxuICAgIFJlYWN0LnVzZVN0YXRlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7fSk7XG5cbiAgY29uc3QgaXNSZWFkeSA9IEJvb2xlYW4oXG4gICAgdXNlcklkICYmIGZlYXR1cmVGbGFnU2VydmljZSAmJiBhbXBsaXR1ZGVBcGlLZXkgJiYgdXNlcklkXG4gICk7XG5cbiAgY29uc3QgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMgPSB1c2VDYWxsYmFjaygoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IGdhdGVzUHJvcHMgPSBmZWF0dXJlR2F0ZXNcbiAgICAgID8gZmVhdHVyZUdhdGVzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgIGlmIChjdXJyLm5hbWUgJiYgY3Vyci52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIFtgZmVhdHVyZV9nYXRlLiR7Y3Vyci5uYW1lfWBdOiBjdXJyLnZhbHVlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiB7fTtcbiAgICBjb25zdCBleHBlcmltZW50UHJvcHMgPSB7fTsgLy8gTm8gZGlyZWN0IGVxdWl2YWxlbnQgZm9yIGV4cGVyaW1lbnRzIGluIEVudml2ZUNvbmZpZyB5ZXRcblxuICAgIGNvbnN0IG9yZ0xldmVsQW1wbGl0dWRlVHJhY2tpbmdQcm9wcyA9IHtcbiAgICAgIC4uLmdhdGVzUHJvcHMsXG4gICAgICAuLi5leHBlcmltZW50UHJvcHMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5vcmdMZXZlbEFtcGxpdHVkZVRyYWNraW5nUHJvcHMsXG4gICAgICAuLi5zdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsXG4gICAgICAvLyBUT0RPOiBvcmdfaWQgaXMgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSBpbiBFbnZpdmVDb25maWcuIE5lZWQgdG8gZmluZCBhIG5ldyBzb3VyY2Ugb3IgZGVyaXZlIGl0LlxuICAgICAgLy8gb3JnX2lkOiBvcmdDb25maWc/Lm9yZz8ub3JnPy5pZCxcbiAgICAgIGFwcF9pZDogXCJjb21tZXJjZS1jaGF0LXJlYWN0LWNvbXBvbmVudFwiLFxuICAgICAgY2hhdF9pZDogZ2V0SXRlbShMb2NhbFN0b3JhZ2VLZXlzLkNoYXRJZCksXG4gICAgICBlbnY6IGVudiB8fCBcInVua25vd25cIixcbiAgICAgIGFwcF9zb3VyY2U6IGNvbnRleHRTb3VyY2UsXG4gICAgICBcIm9yZy5zaG9ydF9uYW1lXCI6IG9yZ1Nob3J0TmFtZSxcbiAgICAgIFwidXNlci5pZFwiOiB1c2VySWQsXG4gICAgICBcImNkcC51c2VyX2lkXCI6IG51bGwsXG4gICAgICBcImNkcC5wcm92aWRlclwiOiBudWxsLFxuICAgICAgXCJldmVudC5zb3VyY2VcIjogXCJ3ZWItYnJvd3NlclwiLFxuICAgICAgXCJldmVudC50eXBlXCI6IFwidXNlci1hY3Rpdml0eVwiLFxuICAgICAgXCJldmVudC5pZFwiOiBudWxsLFxuICAgICAgXCJldmVudC5jaGFubmVsXCI6IFwid2ViXCIsXG4gICAgICBcImV2ZW50LnRpbWVzdGFtcFwiOiBudWxsLFxuICAgIH07XG4gIH0sIFtcbiAgICBmZWF0dXJlR2F0ZXMsXG4gICAgc3VwcGxlbWVudGFsRGVmYXVsdFByb3BzLFxuICAgIGVudixcbiAgICBjb250ZXh0U291cmNlLFxuICAgIG9yZ1Nob3J0TmFtZSxcbiAgICB1c2VySWQsXG4gIF0pO1xuXG4gIGNvbnN0IGV2ZW50UHJvcHNUb1ByZWZpeGVkRXZlbnRQcm9wcyA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgICAgIGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgY29uc3QgcHJlZml4ID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIl9cIik7XG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZXZlbnRQcm9wcykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBhY2NbYCR7cHJlZml4fS4ke2tleX1gXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBhbXBsaXR1ZGVTZXNzaW9uUmVwbGF5SW5pdCA9IHVzZUNhbGxiYWNrKCgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBpc0VuYWJsZWQgPSBCb29sZWFuKFxuICAgICAgb3JnU2hvcnROYW1lID09PSBPcmdTaG9ydE5hbWUuVW5pcXVlVmludGFnZSAmJlxuICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmlzQ2xpZW50U2Vzc2lvbkVuYWJsZWQoKSAmJlxuICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmlzRmVhdHVyZUdhdGVFbmFibGVkKFxuICAgICAgICAgIEZlYXR1cmVHYXRlcy5Jc05ld0ZlYXR1cmVFbmFibGVkXG4gICAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHNhbXBsZVJhdGUgPSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICAgYFtzcGlmZnktYWldIGFtcGxpdHVkZSBzZXNzaW9uLXJlcGxheSBpbml0aWFsaXppbmcgaXNFbmFibGVkPSR7aXNFbmFibGVkfSBzYW1wbGVSYXRlPSR7c2FtcGxlUmF0ZX1gXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBhbXBsaXR1ZGVJbnN0YW5jZS5hZGQoc2Vzc2lvblJlcGxheVBsdWdpbih7IHNhbXBsZVJhdGUgfSkpO1xuXG4gICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgXCJbc3BpZmZ5LWFpXSBFcnJvciBpbml0aWFsaXppbmcgYW1wbGl0dWRlIHNlc3Npb24tcmVwbGF5XCIsXG4gICAgICAgIGVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBbb3JnU2hvcnROYW1lLCBmZWF0dXJlRmxhZ1NlcnZpY2VdKTtcblxuICBjb25zdCBnZXRFdmVudFRyYWNraW5nRW5yaWNobWVudCA9IHVzZUNhbGxiYWNrKCgpOiBFbnJpY2htZW50UGx1Z2luID0+IHtcbiAgICBpZiAoaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBlbnJpY2htZW50OiBFbnJpY2htZW50UGx1Z2luID0ge1xuICAgICAgbmFtZTogXCJwYWdlLXZpZXctdHJhY2tpbmctZW5yaWNobWVudFwiLFxuICAgICAgdHlwZTogXCJlbnJpY2htZW50XCIsXG4gICAgICBzZXR1cDogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGV2ZW50OiBFdmVudCk6IFByb21pc2U8RXZlbnQ+ID0+IHtcbiAgICAgICAgbGV0IGVucmljaGVkRXZlbnQ6IEV2ZW50O1xuXG4gICAgICAgIGNvbnN0IGV2ZW50c1RvRW5yaWNoID0gW1xuICAgICAgICAgIFwiW0FtcGxpdHVkZV0gUGFnZSBWaWV3ZWRcIixcbiAgICAgICAgICBgW1NwaWZmeV0gJHtTcGlmZnlNZXRyaWNzRXZlbnROYW1lLkJ1bmRsZUxvYWRlZH1gLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChldmVudHNUb0VucmljaC5pbmNsdWRlcyhldmVudC5ldmVudF90eXBlKSkge1xuICAgICAgICAgIGNvbnN0IGdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgIGlmIChwdWJsaWNLZXkpIHtcbiAgICAgICAgICAgIGdsb2JhbFByb3BlcnRpZXNbXCJnbG9iYWxQcm9wZXJ0aWVzLnB1YmxpY0tleVwiXSA9IHB1YmxpY0tleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZlYXR1cmVPdmVycmlkZXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVPdmVycmlkZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW2BnbG9iYWxQcm9wZXJ0aWVzLmZlYXR1cmVPdmVycmlkZXMuJHtrZXl9YF0gPVxuICAgICAgICAgICAgICAgIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhbnRVcmxPdmVycmlkZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMudmFyaWFudFVybE92ZXJyaWRlXCJdID1cbiAgICAgICAgICAgICAgdmFyaWFudFVybE92ZXJyaWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFudEluZm9PdmVycmlkZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMudmFyaWFudEluZm9PdmVycmlkZVwiXSA9XG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhcmlhbnRJbmZvT3ZlcnJpZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW1wiZ2xvYmFsUHJvcGVydGllcy5zaG93XCJdID0gU3RyaW5nKHNob3cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVuYWJsZWRGZWF0dXJlcyA9IGZlYXR1cmVGbGFnU2VydmljZSEuZ2V0RmVhdHVyZUZsYWdzKCk7XG4gICAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzUHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgZW5hYmxlZEZlYXR1cmVzXG4gICAgICAgICAgKS5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gICAgICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgICAgW2BlbmFibGVkRmVhdHVyZXMuJHtrZXl9YF06IGAke3ZhbHVlfWAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHRpbWluZ1Byb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBcInRpbWluZy5lbnJpY2hlZF9hdF9tc1wiOiB3aW5kb3cucGVyZm9ybWFuY2U/Lm5vdygpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBlbnJpY2hlZEV2ZW50ID0ge1xuICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICBldmVudF9wcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIC4uLmV2ZW50LmV2ZW50X3Byb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLmdldERlZmF1bHRUcmFja2luZ1Byb3BzKCksXG4gICAgICAgICAgICAgIC4uLmdsb2JhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLmVuYWJsZWRGZWF0dXJlc1Byb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLnRpbWluZ1Byb3BlcnRpZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5yaWNoZWRFdmVudCA9IGV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgRXZlbnRzRGlzcGF0Y2hlci5kaXNwYXRjaChTcGlmZnlFdmVudC5BTVBMSVRVREVfRVZFTlQsIGVucmljaGVkRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiBlbnJpY2hlZEV2ZW50O1xuICAgICAgfSxcbiAgICB9O1xuICAgIHNldEludGVybmFsRXZlbnRUcmFja2luZ0VucmljaG1lbnQoZW5yaWNobWVudCk7XG4gICAgcmV0dXJuIGVucmljaG1lbnQ7XG4gIH0sIFtcbiAgICBpbnRlcm5hbEV2ZW50VHJhY2tpbmdFbnJpY2htZW50LFxuICAgIGdldERlZmF1bHRUcmFja2luZ1Byb3BzLFxuICAgIGZlYXR1cmVGbGFnU2VydmljZSxcbiAgICBwdWJsaWNLZXksXG4gICAgZmVhdHVyZU92ZXJyaWRlcyxcbiAgICB2YXJpYW50VXJsT3ZlcnJpZGUsXG4gICAgdmFyaWFudEluZm9PdmVycmlkZSxcbiAgICBzaG93LFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc1JlYWR5ICYmICFhbXBsaXR1ZGVDbGllbnQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZTogQnJvd3NlckNsaWVudCA9IGNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICBjb25zdCBpc1Nlc3Npb25zRW5hYmxlZCA9IGFtcGxpdHVkZVNlc3Npb25SZXBsYXlJbml0KCk7XG4gICAgICBjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UuYWRkKGdldEV2ZW50VHJhY2tpbmdFbnJpY2htZW50KCkpO1xuICAgICAgY3VycmVudEFtcGxpdHVkZUluc3RhbmNlLmluaXQoYW1wbGl0dWRlQXBpS2V5ISwgdXNlcklkISwge1xuICAgICAgICBzZXJ2ZXJab25lOiBkYXRhUmVzaWRlbmN5IGFzIFNlcnZlclpvbmVUeXBlLFxuICAgICAgICB0cmFja2luZ09wdGlvbnM6IHtcbiAgICAgICAgICBpcEFkZHJlc3M6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9jYXB0dXJlOiB7XG4gICAgICAgICAgYXR0cmlidXRpb246IHRydWUsXG4gICAgICAgICAgcGFnZVZpZXdzOiB7XG4gICAgICAgICAgICB0cmFja0hpc3RvcnlDaGFuZ2VzOiBcInBhdGhPbmx5XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uczogaXNTZXNzaW9uc0VuYWJsZWQsXG4gICAgICAgICAgZm9ybUludGVyYWN0aW9uczogZmFsc2UsXG4gICAgICAgICAgZmlsZURvd25sb2FkczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHNldEFtcGxpdHVkZUNsaWVudChjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UpO1xuICAgIH1cbiAgfSwgW1xuICAgIGlzUmVhZHksXG4gICAgYW1wbGl0dWRlQ2xpZW50LFxuICAgIGFtcGxpdHVkZUFwaUtleSxcbiAgICB1c2VySWQsXG4gICAgZGF0YVJlc2lkZW5jeSxcbiAgICBhbXBsaXR1ZGVTZXNzaW9uUmVwbGF5SW5pdCxcbiAgICBnZXRFdmVudFRyYWNraW5nRW5yaWNobWVudCxcbiAgXSk7XG5cbiAgY29uc3QgdHJhY2tFdmVudCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7XG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudFByb3BzLFxuICAgICAgZXZlbnRHcm91cHMsXG4gICAgICBhbHNvU2VuZFRvR29vZ2xlQW5hbHl0aWNzID0gZmFsc2UsXG4gICAgfTogVHJhY2tFdmVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFwiU3VibWl0dGluZyBldmVudFwiLCBldmVudE5hbWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkRXZlbnROYW1lID0gYFtTcGlmZnldICR7ZXZlbnROYW1lfWA7XG5cbiAgICAgICAgaWYgKCFhbXBsaXR1ZGVDbGllbnQpIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybihcImFtcGxpdHVkZSBjbGllbnQgdW5kZWZpbmVkXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgZXZlbnRfbmFtZTogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudE5hbWUsXG4gICAgICAgICAgZXZlbnRQcm9wcyxcbiAgICAgICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShldmVudERhdGEpO1xuICAgICAgICAgLy8gY2FsY3VsYXRlIGEgaGFzaCBvZiB0aGUgZXZlbnQgcHJvcGVydGllcyB0byB1c2UgYXMgdGhlIGluc2VydF9pZCBzbyB0aGF0IGR1cGxpY2F0ZSBldmVudHNcbiAgICAgICAgLy8gYXJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZCBieSBBbXBsaXR1ZGVcbiAgICAgICAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFwiU0hBLTI1NlwiLCBkYXRhKTtcbiAgICAgICAgY29uc3QgaGFzaEFycmF5ID0gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShoYXNoQnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbnNlcnRJZCA9IGhhc2hBcnJheVxuICAgICAgICAgIC5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSlcbiAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICBMb2dnZXIubG9nRGVidWcoYGFtcGxpdHVkZSB0cmFja2luZyAke2RlY29yYXRlZEV2ZW50TmFtZX1gLCBudWxsLCB7XG4gICAgICAgICAgZXZlbnRfbmFtZTogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIHByb3BzOiBldmVudFByb3BzLFxuICAgICAgICB9KTtcblxuICAgICAgICBhbXBsaXR1ZGVDbGllbnQudHJhY2soXG4gICAgICAgICAgZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmdldERlZmF1bHRUcmFja2luZ1Byb3BzKCksXG4gICAgICAgICAgICAuLi5ldmVudFByb3BzLFxuICAgICAgICAgICAgLi4uKGV2ZW50UHJvcHNcbiAgICAgICAgICAgICAgPyBldmVudFByb3BzVG9QcmVmaXhlZEV2ZW50UHJvcHMoZXZlbnROYW1lLCBldmVudFByb3BzKVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmV2ZW50R3JvdXBzLFxuICAgICAgICAgICAgaW5zZXJ0X2lkOiBjdXJyZW50SW5zZXJ0SWQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChhbHNvU2VuZFRvR29vZ2xlQW5hbHl0aWNzICYmIG9yZ0dhQ29uZmlnKSB7XG4gICAgICAgICAgLy8gVE9ETzogQWRkIGluIHdpbmRvd0RhdGFMYXllclNlcnZpY2Ugb3IgY29udGV4dCBhbHRlcm5hdGl2ZSBhbmQgaG9vayBpdCB1cCBoZXJlXG4gICAgICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFwiW3NwaWZmeS1haV0gR0EgdHJhY2tpbmdcIiwgZGVjb3JhdGVkRXZlbnROYW1lKTtcbiAgICAgICAgICBpZiAod2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgKHdpbmRvdy5kYXRhTGF5ZXIgYXMgYW55W10pLnB1c2goe1xuICAgICAgICAgICAgICBldmVudDogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFByb3BzOiBldmVudFByb3BzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiW3NwaWZmeS1haV0gRXJyb3IgdHJhY2tpbmcgZXZlbnRcIiwgZXJyLCB7XG4gICAgICAgICAgZXZlbnROYW1lLFxuICAgICAgICAgIGV2ZW50UHJvcHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYW1wbGl0dWRlQ2xpZW50LFxuICAgICAgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMsXG4gICAgICBldmVudFByb3BzVG9QcmVmaXhlZEV2ZW50UHJvcHMsXG4gICAgICBvcmdHYUNvbmZpZyxcbiAgICBdXG4gICk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICB0cmFja0V2ZW50LFxuICAgICAgaXNSZWFkeSxcbiAgICAgIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wczogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT5cbiAgICAgICAgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzKHByb3BzKSxcbiAgICB9KSxcbiAgICBbdHJhY2tFdmVudCwgaXNSZWFkeSwgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEFtcGxpdHVkZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0FtcGxpdHVkZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQW1wbGl0dWRlID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChBbXBsaXR1ZGVDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlQW1wbGl0dWRlIG11c3QgYmUgdXNlZCB3aXRoaW4gQW1wbGl0dWRlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBc0NBLElBQVksNEVBQUw7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBZ0JGLE1BQU0sbUJBQW1CLGNBQTJDLEtBQUs7QUFFekUsTUFBYUEscUJBQThELEVBQ3pFLGVBQ0k7Q0FDSixNQUFNLFNBQVMsYUFBYSxXQUFXO0NBQ3ZDLE1BQU0sa0JBQWtCLGFBQWEsb0JBQW9CO0NBQ3pELE1BQU0sZ0JBQWdCLGFBQWEsa0JBQWtCO0NBQ3JELE1BQU0sY0FBYyxhQUFhLHNDQUFzQztDQUN2RSxNQUFNLE1BQU0sYUFBYSxR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
@@ -1,132 +0,0 @@
1
- const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_logger = require('./logger-TBIl4uIH.cjs');
3
- const require_localStorageContext = require('./localStorageContext-NRP-CdmF.cjs');
4
- const require_app = require('./app-BbPSHefQ.cjs');
5
- const require_commerce_api = require('./commerce-api-DA1QGGMK.cjs');
6
- let uuid = require("uuid");
7
- uuid = require_chunk.__toESM(uuid);
8
- let react = require("react");
9
- react = require_chunk.__toESM(react);
10
- let jotai = require("jotai");
11
- jotai = require_chunk.__toESM(jotai);
12
- let react_jsx_runtime = require("react/jsx-runtime");
13
- react_jsx_runtime = require_chunk.__toESM(react_jsx_runtime);
14
- let ua_parser_js = require("ua-parser-js");
15
- ua_parser_js = require_chunk.__toESM(ua_parser_js);
16
-
17
- //#region src/contexts/userIdentityContext/userIdentityContext.tsx
18
- const getUserAgentDetails = () => {
19
- const result = new ua_parser_js.default().getResult();
20
- return {
21
- os: result?.os?.name,
22
- osVersion: result?.os?.version,
23
- deviceBrand: result?.device?.vendor,
24
- deviceManufacturer: result?.device?.vendor,
25
- deviceModel: result?.device?.model,
26
- browser: result?.browser?.name,
27
- browserVersion: result?.browser?.version,
28
- userAgent: result?.ua
29
- };
30
- };
31
- const UserIdentityContext = (0, react.createContext)(void 0);
32
- const UserIdentityProvider = ({ children }) => {
33
- const { getItem, setItem, isAvailable: localStorageIsReady } = require_localStorageContext.useLocalStorage();
34
- const [isReady, setIsReady] = (0, react.useState)(false);
35
- (0, react.useEffect)(() => {
36
- setIsReady(localStorageIsReady);
37
- }, [localStorageIsReady]);
38
- const USER_ID_OVERRIDE_KEY = "v1-spiffy-user-id-override";
39
- const USER_ID_DEFAULT_KEY = "v1-spiffy-user-id-default";
40
- const getUserIdOverrideFromLocalStorage = (0, react.useCallback)(() => {
41
- return getItem(USER_ID_OVERRIDE_KEY) ?? void 0;
42
- }, [getItem]);
43
- const getUserIdDefaultFromLocalStorage = (0, react.useCallback)(() => {
44
- return getItem(USER_ID_DEFAULT_KEY) ?? void 0;
45
- }, [getItem]);
46
- const setUserIdDefaultInLocalStorage = (0, react.useCallback)((userId) => {
47
- require_logger.logger_default.logInfo(`setUserIdDefaultInLocalStorage - Setting user_id=${userId}`);
48
- setItem(USER_ID_DEFAULT_KEY, userId);
49
- return userId;
50
- }, [setItem, USER_ID_DEFAULT_KEY]);
51
- const setUserIdOverrideInLocalStorage = (0, react.useCallback)((userId) => {
52
- require_logger.logger_default.logInfo(`setUserIdOverrideInLocalStorage - Setting user_id=${userId}`);
53
- setItem(USER_ID_OVERRIDE_KEY, userId);
54
- return userId;
55
- }, [setItem, USER_ID_OVERRIDE_KEY]);
56
- const clearUserIdOverrideInLocalStorage = (0, react.useCallback)(() => {
57
- require_logger.logger_default.logInfo(`clearUserIdOverrideInLocalStorage - Clearing user_id`);
58
- setItem(USER_ID_OVERRIDE_KEY, "");
59
- }, [setItem, USER_ID_OVERRIDE_KEY]);
60
- const getUserIdOrDefault = (0, react.useCallback)(() => {
61
- const userIdOverride = getUserIdOverrideFromLocalStorage();
62
- if (userIdOverride) return userIdOverride;
63
- const defaultUserId = getUserIdDefaultFromLocalStorage();
64
- if (defaultUserId) return defaultUserId;
65
- return setUserIdDefaultInLocalStorage(`spiffy-user-id-${(0, uuid.v4)()}`);
66
- }, [
67
- getUserIdOverrideFromLocalStorage,
68
- getUserIdDefaultFromLocalStorage,
69
- setUserIdDefaultInLocalStorage
70
- ]);
71
- const identifyUser = (0, react.useCallback)(async () => {
72
- if (!isReady) {
73
- require_logger.logger_default.logWarn("[UserIdentityContext] Context not ready, skipping identifyUser", void 0);
74
- return;
75
- }
76
- try {
77
- const cdpUserId = "UNKNOWN_CDP_USER_ID";
78
- const userId = getUserIdOrDefault();
79
- const userAgentDetails = getUserAgentDetails();
80
- await require_commerce_api.commerce_api_default.identifyUser(userId, cdpUserId, userAgentDetails);
81
- } catch (error) {
82
- require_logger.logger_default.logError("[spiffy-ai] Error identifying user", error);
83
- }
84
- }, [isReady, getUserIdOrDefault]);
85
- const value = (0, react.useMemo)(() => ({
86
- identifyUser,
87
- getUserIdOrDefault,
88
- getUserIdOverrideFromLocalStorage,
89
- getUserIdDefaultFromLocalStorage,
90
- setUserIdDefaultInLocalStorage,
91
- setUserIdOverrideInLocalStorage,
92
- clearUserIdOverrideInLocalStorage,
93
- isReady
94
- }), [
95
- identifyUser,
96
- getUserIdOrDefault,
97
- getUserIdOverrideFromLocalStorage,
98
- getUserIdDefaultFromLocalStorage,
99
- setUserIdDefaultInLocalStorage,
100
- setUserIdOverrideInLocalStorage,
101
- clearUserIdOverrideInLocalStorage,
102
- isReady
103
- ]);
104
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(UserIdentityContext.Provider, {
105
- value,
106
- children
107
- });
108
- };
109
- const useUserIdentity = () => {
110
- const context = (0, react.useContext)(UserIdentityContext);
111
- const setUserId = (0, jotai.useSetAtom)(require_app.userIdAtom);
112
- (0, react.useEffect)(() => {
113
- setUserId(context?.getUserIdOrDefault() ?? "");
114
- }, [context, setUserId]);
115
- if (!context) throw new Error("useUserIdentity must be used within a UserIdentityProvider");
116
- return context;
117
- };
118
-
119
- //#endregion
120
- Object.defineProperty(exports, 'UserIdentityProvider', {
121
- enumerable: true,
122
- get: function () {
123
- return UserIdentityProvider;
124
- }
125
- });
126
- Object.defineProperty(exports, 'useUserIdentity', {
127
- enumerable: true,
128
- get: function () {
129
- return useUserIdentity;
130
- }
131
- });
132
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcklkZW50aXR5Q29udGV4dC1CcWJOdTd4dS5janMiLCJuYW1lcyI6WyJVQVBhcnNlciIsIlVzZXJJZGVudGl0eVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4iLCJ1c2VMb2NhbFN0b3JhZ2UiLCJDb21tZXJjZUFwaUNsaWVudCIsInVzZXJJZEF0b20iXSwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZU1lbW8sXG4gIHVzZVN0YXRlLFxuICB1c2VFZmZlY3QsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFVBUGFyc2VyIGZyb20gXCJ1YS1wYXJzZXItanNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IENvbW1lcmNlQXBpQ2xpZW50IGZyb20gXCJzcmMvYXBwbGljYXRpb24vY29tbWVyY2UtYXBpXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IENsaWVudERldGFpbHMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9jbGllbnREZXRhaWxzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbFN0b3JhZ2UgfSBmcm9tIFwic3JjL2NvbnRleHRzL2xvY2FsU3RvcmFnZUNvbnRleHRcIjtcbmltcG9ydCB7IHVzZVNldEF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IHVzZXJJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gZnJvbSB0aGUgb3JpZ2luYWwgc2VydmljZVxuY29uc3QgZ2V0VXNlckFnZW50RGV0YWlscyA9ICgpOiBDbGllbnREZXRhaWxzID0+IHtcbiAgY29uc3QgdWFQYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgY29uc3QgcmVzdWx0ID0gdWFQYXJzZXIuZ2V0UmVzdWx0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBvczogcmVzdWx0Py5vcz8ubmFtZSxcbiAgICBvc1ZlcnNpb246IHJlc3VsdD8ub3M/LnZlcnNpb24sXG4gICAgZGV2aWNlQnJhbmQ6IHJlc3VsdD8uZGV2aWNlPy52ZW5kb3IsXG4gICAgZGV2aWNlTWFudWZhY3R1cmVyOiByZXN1bHQ/LmRldmljZT8udmVuZG9yLFxuICAgIGRldmljZU1vZGVsOiByZXN1bHQ/LmRldmljZT8ubW9kZWwsXG4gICAgYnJvd3NlcjogcmVzdWx0Py5icm93c2VyPy5uYW1lLFxuICAgIGJyb3dzZXJWZXJzaW9uOiByZXN1bHQ/LmJyb3dzZXI/LnZlcnNpb24sXG4gICAgdXNlckFnZW50OiByZXN1bHQ/LnVhLFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VySWRlbnRpdHlDb250ZXh0VHlwZSB7XG4gIGlkZW50aWZ5VXNlcjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZ2V0VXNlcklkT3JEZWZhdWx0OiAoKSA9PiBzdHJpbmc7XG4gIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZTogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZTogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2U6ICh1c2VySWQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlOiAodXNlcklkOiBzdHJpbmcpID0+IHN0cmluZztcbiAgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlOiAoKSA9PiB2b2lkO1xuICBpc1JlYWR5OiBib29sZWFuO1xufVxuXG5jb25zdCBVc2VySWRlbnRpdHlDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxVc2VySWRlbnRpdHlDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZFxuKTtcblxuZXhwb3J0IGNvbnN0IFVzZXJJZGVudGl0eVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4gPSAoe1xuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIGdldEl0ZW0sXG4gICAgc2V0SXRlbSxcbiAgICBpc0F2YWlsYWJsZTogbG9jYWxTdG9yYWdlSXNSZWFkeSxcbiAgfSA9IHVzZUxvY2FsU3RvcmFnZSgpO1xuXG4gIGNvbnN0IFtpc1JlYWR5LCBzZXRJc1JlYWR5XSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIEFzc3VtaW5nIENvbW1lcmNlQXBpQ2xpZW50IGFuZCBvdGhlciBkZXBlbmRlbmNpZXMgYXJlIHJlYWR5IGlmIGxvY2FsU3RvcmFnZSBpcy5cbiAgICAvLyBJbiBhIG1vcmUgY29tcGxleCBzY2VuYXJpbywgeW91IG1pZ2h0IGhhdmUgbW9yZSBjaGVja3MgaGVyZS5cbiAgICBzZXRJc1JlYWR5KGxvY2FsU3RvcmFnZUlzUmVhZHkpO1xuICB9LCBbbG9jYWxTdG9yYWdlSXNSZWFkeV0pO1xuXG4gIGNvbnN0IFVTRVJfSURfT1ZFUlJJREVfS0VZID0gXCJ2MS1zcGlmZnktdXNlci1pZC1vdmVycmlkZVwiO1xuICBjb25zdCBVU0VSX0lEX0RFRkFVTFRfS0VZID0gXCJ2MS1zcGlmZnktdXNlci1pZC1kZWZhdWx0XCI7XG5cbiAgY29uc3QgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soKCk6XG4gICAgfCBzdHJpbmdcbiAgICB8IHVuZGVmaW5lZCA9PiB7XG4gICAgcmV0dXJuIGdldEl0ZW0oVVNFUl9JRF9PVkVSUklERV9LRVkpID8/IHVuZGVmaW5lZDtcbiAgfSwgW2dldEl0ZW1dKTtcblxuICBjb25zdCBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKCgpOlxuICAgIHwgc3RyaW5nXG4gICAgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiBnZXRJdGVtKFVTRVJfSURfREVGQVVMVF9LRVkpID8/IHVuZGVmaW5lZDtcbiAgfSwgW2dldEl0ZW1dKTtcblxuICBjb25zdCBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oXG4gICAgICAgIGBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UgLSBTZXR0aW5nIHVzZXJfaWQ9JHt1c2VySWR9YFxuICAgICAgKTtcbiAgICAgIHNldEl0ZW0oVVNFUl9JRF9ERUZBVUxUX0tFWSwgdXNlcklkKTtcbiAgICAgIC8vIHdpbmRvdy5kaXNwYXRjaEV2ZW50IGlzIGhhbmRsZWQgYnkgdXNlTG9jYWxTdG9yYWdlIG5vd1xuICAgICAgcmV0dXJuIHVzZXJJZDtcbiAgICB9LFxuICAgIFtzZXRJdGVtLCBVU0VSX0lEX0RFRkFVTFRfS0VZXVxuICApO1xuXG4gIGNvbnN0IHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oXG4gICAgICAgIGBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlIC0gU2V0dGluZyB1c2VyX2lkPSR7dXNlcklkfWBcbiAgICAgICk7XG4gICAgICBzZXRJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZLCB1c2VySWQpO1xuICAgICAgLy8gd2luZG93LmRpc3BhdGNoRXZlbnQgaXMgaGFuZGxlZCBieSB1c2VMb2NhbFN0b3JhZ2Ugbm93XG4gICAgICByZXR1cm4gdXNlcklkO1xuICAgIH0sXG4gICAgW3NldEl0ZW0sIFVTRVJfSURfT1ZFUlJJREVfS0VZXVxuICApO1xuXG4gIGNvbnN0IGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBMb2dnZXIubG9nSW5mbyhgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlIC0gQ2xlYXJpbmcgdXNlcl9pZGApO1xuICAgIC8vIExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0TG9jYWxTdG9yYWdlKCk/LnJlbW92ZUl0ZW0oVVNFUl9JRF9PVkVSUklERV9LRVkpO1xuICAgIC8vIHdpbmRvdy5kaXNwYXRjaEV2ZW50IGlzIGhhbmRsZWQgYnkgdXNlTG9jYWxTdG9yYWdlIG5vd1xuICAgIHNldEl0ZW0oVVNFUl9JRF9PVkVSUklERV9LRVksIFwiXCIpOyAvLyBTZXQgdG8gZW1wdHkgc3RyaW5nIHRvIGNsZWFyXG4gIH0sIFtzZXRJdGVtLCBVU0VSX0lEX09WRVJSSURFX0tFWV0pO1xuXG4gIGNvbnN0IGdldFVzZXJJZE9yRGVmYXVsdCA9IHVzZUNhbGxiYWNrKCgpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHVzZXJJZE92ZXJyaWRlID0gZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKHVzZXJJZE92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gdXNlcklkT3ZlcnJpZGU7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFVzZXJJZCA9IGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKGRlZmF1bHRVc2VySWQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VXNlcklkO1xuICAgIH1cblxuICAgIHJldHVybiBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UoYHNwaWZmeS11c2VyLWlkLSR7dXVpZCgpfWApO1xuICB9LCBbXG4gICAgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlLFxuICAgIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlLFxuICAgIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSxcbiAgXSk7XG5cbiAgY29uc3QgaWRlbnRpZnlVc2VyID0gdXNlQ2FsbGJhY2soYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghaXNSZWFkeSkge1xuICAgICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAgIFwiW1VzZXJJZGVudGl0eUNvbnRleHRdIENvbnRleHQgbm90IHJlYWR5LCBza2lwcGluZyBpZGVudGlmeVVzZXJcIixcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBUZW1wb3JhcmlseSBjb21tZW50ZWQgb3V0IHVudGlsIFdpbmRvd0RhdGFMYXllclNlcnZpY2UgaXMgcmVzb2x2ZWRcbiAgICAgIC8vIGNvbnN0IGNkcFVzZXJJZCA9IFdpbmRvd0RhdGFMYXllclNlcnZpY2UuZ2V0R29vZ2xlQW5hbHl0aWNzQ2xpZW50SWQoKTtcbiAgICAgIGNvbnN0IGNkcFVzZXJJZCA9IFwiVU5LTk9XTl9DRFBfVVNFUl9JRFwiOyAvLyBQbGFjZWhvbGRlclxuICAgICAgY29uc3QgdXNlcklkID0gZ2V0VXNlcklkT3JEZWZhdWx0KCk7XG4gICAgICBjb25zdCB1c2VyQWdlbnREZXRhaWxzID0gZ2V0VXNlckFnZW50RGV0YWlscygpO1xuXG4gICAgICBpZiAoIWNkcFVzZXJJZCkge1xuICAgICAgICBMb2dnZXIubG9nV2FybihcbiAgICAgICAgICBcIltzcGlmZnktYWldIE5vIEdBIENsaWVudCBJRCBmb3VuZCwgc2tpcHBpbmcgaWRlbnRpZnlVc2VyXCIsXG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuaWRlbnRpZnlVc2VyKHVzZXJJZCwgY2RwVXNlcklkLCB1c2VyQWdlbnREZXRhaWxzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiW3NwaWZmeS1haV0gRXJyb3IgaWRlbnRpZnlpbmcgdXNlclwiLCBlcnJvcik7XG4gICAgfVxuICB9LCBbaXNSZWFkeSwgZ2V0VXNlcklkT3JEZWZhdWx0XSk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBpZGVudGlmeVVzZXIsXG4gICAgICBnZXRVc2VySWRPckRlZmF1bHQsXG4gICAgICBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBpc1JlYWR5LFxuICAgIH0pLFxuICAgIFtcbiAgICAgIGlkZW50aWZ5VXNlcixcbiAgICAgIGdldFVzZXJJZE9yRGVmYXVsdCxcbiAgICAgIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGlzUmVhZHksXG4gICAgXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPFVzZXJJZGVudGl0eUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L1VzZXJJZGVudGl0eUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlVXNlcklkZW50aXR5ID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChVc2VySWRlbnRpdHlDb250ZXh0KTtcbiAgY29uc3Qgc2V0VXNlcklkID0gdXNlU2V0QXRvbSh1c2VySWRBdG9tKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRVc2VySWQoY29udGV4dD8uZ2V0VXNlcklkT3JEZWZhdWx0KCkgPz8gXCJcIik7XG4gIH0sIFtjb250ZXh0LCBzZXRVc2VySWRdKTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJ1c2VVc2VySWRlbnRpdHkgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFVzZXJJZGVudGl0eVByb3ZpZGVyXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsTUFBTSw0QkFBMkM7Q0FFL0MsTUFBTSxTQURXLElBQUlBLHNCQUFVLENBQ1AsV0FBVztBQUVuQyxRQUFPO0VBQ0wsSUFBSSxRQUFRLElBQUk7RUFDaEIsV0FBVyxRQUFRLElBQUk7RUFDdkIsYUFBYSxRQUFRLFFBQVE7RUFDN0Isb0JBQW9CLFFBQVEsUUFBUTtFQUNwQyxhQUFhLFFBQVEsUUFBUTtFQUM3QixTQUFTLFFBQVEsU0FBUztFQUMxQixnQkFBZ0IsUUFBUSxTQUFTO0VBQ2pDLFdBQVcsUUFBUTtFQUNwQjs7QUFjSCxNQUFNLCtDQUNKLE9BQ0Q7QUFFRCxNQUFhQyx3QkFBaUUsRUFDNUUsZUFDSTtDQUNKLE1BQU0sRUFDSixTQUNBLFNBQ0EsYUFBYSx3QkFDWEMsNkNBQWlCO0NBRXJCLE1BQU0sQ0FBQyxTQUFTLGtDQUF1QixNQUFNO0FBRTdDLDRCQUFnQjtBQUdkLGFBQVcsb0JBQW9CO0lBQzlCLENBQUMsb0JBQW9CLENBQUM7Q0FFekIsTUFBTSx1QkFBdUI7Q0FDN0IsTUFBTSxzQkFBc0I7Q0FFNUIsTUFBTSxpRUFFVztBQUNmLFNBQU8sUUFBUSxxQkFBcUIsSUFBSTtJQUN2QyxDQUFDLFFBQVEsQ0FBQztDQUViLE1BQU0sZ0VBRVc7QUFDZixTQUFPLFFBQVEsb0JBQW9CLElBQUk7SUFDdEMsQ0FBQyxRQUFRLENBQUM7Q0FFYixNQUFNLHlEQUNILFdBQTJCO0FBQzFCLGdDQUFPLFFBQ0wsb0RBQW9ELFNBQ3JEO0FBQ0QsVUFBUSxxQkFBcUIsT0FBTztBQUVwQyxTQUFPO0lBRVQsQ0FBQyxTQUFTLG9CQUFvQixDQUMvQjtDQUVELE1BQU0sMERBQ0gsV0FBMkI7QUFDMUIsZ0NBQU8sUUFDTCxxREFBcUQsU0FDdEQ7QUFDRCxVQUFRLHNCQUFzQixPQUFPO0FBRXJDLFNBQU87SUFFVCxDQUFDLFNBQVMscUJBQXFCLENBQ2hDO0NBRUQsTUFBTSxpRUFBc0Q7QUFDMUQsZ0NBQU8sUUFBUSx1REFBdUQ7QUFHdEUsVUFBUSxzQkFBc0IsR0FBRztJQUNoQyxDQUFDLFNBQVMscUJBQXFCLENBQUM7Q0FFbkMsTUFBTSxrREFBK0M7RUFDbkQsTUFBTSxpQkFBaUIsbUNBQW1DO0FBQzFELE1BQUksZUFDRixRQUFPO0VBR1QsTUFBTSxnQkFBZ0Isa0NBQWtDO0FBQ3hELE1BQUksY0FDRixRQUFPO0FBR1QsU0FBTywrQkFBK0IsZ0NBQXdCLEdBQUc7SUFDaEU7RUFDRDtFQUNBO0VBQ0E7RUFDRCxDQUFDO0NBRUYsTUFBTSxzQ0FBMkIsWUFBMkI7QUFDMUQsTUFBSSxDQUFDLFNBQVM7QUFDWixpQ0FBTyxRQUNMLGtFQUNBLE9BQ0Q7QUFDRDs7QUFHRixNQUFJO0dBR0YsTUFBTSxZQUFZO0dBQ2xCLE1BQU0sU0FBUyxvQkFBb0I7R0FDbkMsTUFBTSxtQkFBbUIscUJBQXFCO0FBVTlDLFNBQU1DLDBDQUFrQixhQUFhLFFBQVEsV0FBVyxpQkFBaUI7V0FDbEUsT0FBTztBQUNkLGlDQUFPLFNBQVMsc0NBQXNDLE1BQU07O0lBRTdELENBQUMsU0FBUyxtQkFBbUIsQ0FBQztDQUVqQyxNQUFNLGtDQUNHO0VBQ0w7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNELEdBQ0Q7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0QsQ0FDRjtBQUVELFFBQ0UsMkNBQUMsb0JBQW9CO0VBQWdCO0VBQ2xDO0dBQzRCOztBQUluQyxNQUFhLHdCQUF3QjtDQUNuQyxNQUFNLGdDQUFxQixvQkFBb0I7Q0FDL0MsTUFBTSxrQ0FBdUJDLHVCQUFXO0FBQ3hDLDRCQUFnQjtBQUNkLFlBQVUsU0FBUyxvQkFBb0IsSUFBSSxHQUFHO0lBQzdDLENBQUMsU0FBUyxVQUFVLENBQUM7QUFDeEIsS0FBSSxDQUFDLFFBQ0gsT0FBTSxJQUFJLE1BQ1IsNkRBQ0Q7QUFFSCxRQUFPIn0=
@@ -1,115 +0,0 @@
1
- import { logger_default } from "./logger-W3lqg-4b.js";
2
- import { useLocalStorage } from "./localStorageContext-BPZ82q-G.js";
3
- import { userIdAtom } from "./app-CflxT_xI.js";
4
- import { commerce_api_default } from "./commerce-api-rgj30eEp.js";
5
- import { v4 } from "uuid";
6
- import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
7
- import { useSetAtom } from "jotai";
8
- import { jsx } from "react/jsx-runtime";
9
- import UAParser from "ua-parser-js";
10
-
11
- //#region src/contexts/userIdentityContext/userIdentityContext.tsx
12
- const getUserAgentDetails = () => {
13
- const result = new UAParser().getResult();
14
- return {
15
- os: result?.os?.name,
16
- osVersion: result?.os?.version,
17
- deviceBrand: result?.device?.vendor,
18
- deviceManufacturer: result?.device?.vendor,
19
- deviceModel: result?.device?.model,
20
- browser: result?.browser?.name,
21
- browserVersion: result?.browser?.version,
22
- userAgent: result?.ua
23
- };
24
- };
25
- const UserIdentityContext = createContext(void 0);
26
- const UserIdentityProvider = ({ children }) => {
27
- const { getItem, setItem, isAvailable: localStorageIsReady } = useLocalStorage();
28
- const [isReady, setIsReady] = useState(false);
29
- useEffect(() => {
30
- setIsReady(localStorageIsReady);
31
- }, [localStorageIsReady]);
32
- const USER_ID_OVERRIDE_KEY = "v1-spiffy-user-id-override";
33
- const USER_ID_DEFAULT_KEY = "v1-spiffy-user-id-default";
34
- const getUserIdOverrideFromLocalStorage = useCallback(() => {
35
- return getItem(USER_ID_OVERRIDE_KEY) ?? void 0;
36
- }, [getItem]);
37
- const getUserIdDefaultFromLocalStorage = useCallback(() => {
38
- return getItem(USER_ID_DEFAULT_KEY) ?? void 0;
39
- }, [getItem]);
40
- const setUserIdDefaultInLocalStorage = useCallback((userId) => {
41
- logger_default.logInfo(`setUserIdDefaultInLocalStorage - Setting user_id=${userId}`);
42
- setItem(USER_ID_DEFAULT_KEY, userId);
43
- return userId;
44
- }, [setItem, USER_ID_DEFAULT_KEY]);
45
- const setUserIdOverrideInLocalStorage = useCallback((userId) => {
46
- logger_default.logInfo(`setUserIdOverrideInLocalStorage - Setting user_id=${userId}`);
47
- setItem(USER_ID_OVERRIDE_KEY, userId);
48
- return userId;
49
- }, [setItem, USER_ID_OVERRIDE_KEY]);
50
- const clearUserIdOverrideInLocalStorage = useCallback(() => {
51
- logger_default.logInfo(`clearUserIdOverrideInLocalStorage - Clearing user_id`);
52
- setItem(USER_ID_OVERRIDE_KEY, "");
53
- }, [setItem, USER_ID_OVERRIDE_KEY]);
54
- const getUserIdOrDefault = useCallback(() => {
55
- const userIdOverride = getUserIdOverrideFromLocalStorage();
56
- if (userIdOverride) return userIdOverride;
57
- const defaultUserId = getUserIdDefaultFromLocalStorage();
58
- if (defaultUserId) return defaultUserId;
59
- return setUserIdDefaultInLocalStorage(`spiffy-user-id-${v4()}`);
60
- }, [
61
- getUserIdOverrideFromLocalStorage,
62
- getUserIdDefaultFromLocalStorage,
63
- setUserIdDefaultInLocalStorage
64
- ]);
65
- const identifyUser = useCallback(async () => {
66
- if (!isReady) {
67
- logger_default.logWarn("[UserIdentityContext] Context not ready, skipping identifyUser", void 0);
68
- return;
69
- }
70
- try {
71
- const cdpUserId = "UNKNOWN_CDP_USER_ID";
72
- const userId = getUserIdOrDefault();
73
- const userAgentDetails = getUserAgentDetails();
74
- await commerce_api_default.identifyUser(userId, cdpUserId, userAgentDetails);
75
- } catch (error) {
76
- logger_default.logError("[spiffy-ai] Error identifying user", error);
77
- }
78
- }, [isReady, getUserIdOrDefault]);
79
- const value = useMemo(() => ({
80
- identifyUser,
81
- getUserIdOrDefault,
82
- getUserIdOverrideFromLocalStorage,
83
- getUserIdDefaultFromLocalStorage,
84
- setUserIdDefaultInLocalStorage,
85
- setUserIdOverrideInLocalStorage,
86
- clearUserIdOverrideInLocalStorage,
87
- isReady
88
- }), [
89
- identifyUser,
90
- getUserIdOrDefault,
91
- getUserIdOverrideFromLocalStorage,
92
- getUserIdDefaultFromLocalStorage,
93
- setUserIdDefaultInLocalStorage,
94
- setUserIdOverrideInLocalStorage,
95
- clearUserIdOverrideInLocalStorage,
96
- isReady
97
- ]);
98
- return /* @__PURE__ */ jsx(UserIdentityContext.Provider, {
99
- value,
100
- children
101
- });
102
- };
103
- const useUserIdentity = () => {
104
- const context = useContext(UserIdentityContext);
105
- const setUserId = useSetAtom(userIdAtom);
106
- useEffect(() => {
107
- setUserId(context?.getUserIdOrDefault() ?? "");
108
- }, [context, setUserId]);
109
- if (!context) throw new Error("useUserIdentity must be used within a UserIdentityProvider");
110
- return context;
111
- };
112
-
113
- //#endregion
114
- export { UserIdentityProvider, useUserIdentity };
115
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcklkZW50aXR5Q29udGV4dC1CeEZIOUZOUS5qcyIsIm5hbWVzIjpbIlVzZXJJZGVudGl0eVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4iLCJ1dWlkIiwiQ29tbWVyY2VBcGlDbGllbnQiXSwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZU1lbW8sXG4gIHVzZVN0YXRlLFxuICB1c2VFZmZlY3QsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFVBUGFyc2VyIGZyb20gXCJ1YS1wYXJzZXItanNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IENvbW1lcmNlQXBpQ2xpZW50IGZyb20gXCJzcmMvYXBwbGljYXRpb24vY29tbWVyY2UtYXBpXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IENsaWVudERldGFpbHMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9jbGllbnREZXRhaWxzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbFN0b3JhZ2UgfSBmcm9tIFwic3JjL2NvbnRleHRzL2xvY2FsU3RvcmFnZUNvbnRleHRcIjtcbmltcG9ydCB7IHVzZVNldEF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IHVzZXJJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gZnJvbSB0aGUgb3JpZ2luYWwgc2VydmljZVxuY29uc3QgZ2V0VXNlckFnZW50RGV0YWlscyA9ICgpOiBDbGllbnREZXRhaWxzID0+IHtcbiAgY29uc3QgdWFQYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgY29uc3QgcmVzdWx0ID0gdWFQYXJzZXIuZ2V0UmVzdWx0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBvczogcmVzdWx0Py5vcz8ubmFtZSxcbiAgICBvc1ZlcnNpb246IHJlc3VsdD8ub3M/LnZlcnNpb24sXG4gICAgZGV2aWNlQnJhbmQ6IHJlc3VsdD8uZGV2aWNlPy52ZW5kb3IsXG4gICAgZGV2aWNlTWFudWZhY3R1cmVyOiByZXN1bHQ/LmRldmljZT8udmVuZG9yLFxuICAgIGRldmljZU1vZGVsOiByZXN1bHQ/LmRldmljZT8ubW9kZWwsXG4gICAgYnJvd3NlcjogcmVzdWx0Py5icm93c2VyPy5uYW1lLFxuICAgIGJyb3dzZXJWZXJzaW9uOiByZXN1bHQ/LmJyb3dzZXI/LnZlcnNpb24sXG4gICAgdXNlckFnZW50OiByZXN1bHQ/LnVhLFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VySWRlbnRpdHlDb250ZXh0VHlwZSB7XG4gIGlkZW50aWZ5VXNlcjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZ2V0VXNlcklkT3JEZWZhdWx0OiAoKSA9PiBzdHJpbmc7XG4gIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZTogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZTogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2U6ICh1c2VySWQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlOiAodXNlcklkOiBzdHJpbmcpID0+IHN0cmluZztcbiAgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlOiAoKSA9PiB2b2lkO1xuICBpc1JlYWR5OiBib29sZWFuO1xufVxuXG5jb25zdCBVc2VySWRlbnRpdHlDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxVc2VySWRlbnRpdHlDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZFxuKTtcblxuZXhwb3J0IGNvbnN0IFVzZXJJZGVudGl0eVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4gPSAoe1xuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIGdldEl0ZW0sXG4gICAgc2V0SXRlbSxcbiAgICBpc0F2YWlsYWJsZTogbG9jYWxTdG9yYWdlSXNSZWFkeSxcbiAgfSA9IHVzZUxvY2FsU3RvcmFnZSgpO1xuXG4gIGNvbnN0IFtpc1JlYWR5LCBzZXRJc1JlYWR5XSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIEFzc3VtaW5nIENvbW1lcmNlQXBpQ2xpZW50IGFuZCBvdGhlciBkZXBlbmRlbmNpZXMgYXJlIHJlYWR5IGlmIGxvY2FsU3RvcmFnZSBpcy5cbiAgICAvLyBJbiBhIG1vcmUgY29tcGxleCBzY2VuYXJpbywgeW91IG1pZ2h0IGhhdmUgbW9yZSBjaGVja3MgaGVyZS5cbiAgICBzZXRJc1JlYWR5KGxvY2FsU3RvcmFnZUlzUmVhZHkpO1xuICB9LCBbbG9jYWxTdG9yYWdlSXNSZWFkeV0pO1xuXG4gIGNvbnN0IFVTRVJfSURfT1ZFUlJJREVfS0VZID0gXCJ2MS1zcGlmZnktdXNlci1pZC1vdmVycmlkZVwiO1xuICBjb25zdCBVU0VSX0lEX0RFRkFVTFRfS0VZID0gXCJ2MS1zcGlmZnktdXNlci1pZC1kZWZhdWx0XCI7XG5cbiAgY29uc3QgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soKCk6XG4gICAgfCBzdHJpbmdcbiAgICB8IHVuZGVmaW5lZCA9PiB7XG4gICAgcmV0dXJuIGdldEl0ZW0oVVNFUl9JRF9PVkVSUklERV9LRVkpID8/IHVuZGVmaW5lZDtcbiAgfSwgW2dldEl0ZW1dKTtcblxuICBjb25zdCBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKCgpOlxuICAgIHwgc3RyaW5nXG4gICAgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiBnZXRJdGVtKFVTRVJfSURfREVGQVVMVF9LRVkpID8/IHVuZGVmaW5lZDtcbiAgfSwgW2dldEl0ZW1dKTtcblxuICBjb25zdCBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oXG4gICAgICAgIGBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UgLSBTZXR0aW5nIHVzZXJfaWQ9JHt1c2VySWR9YFxuICAgICAgKTtcbiAgICAgIHNldEl0ZW0oVVNFUl9JRF9ERUZBVUxUX0tFWSwgdXNlcklkKTtcbiAgICAgIC8vIHdpbmRvdy5kaXNwYXRjaEV2ZW50IGlzIGhhbmRsZWQgYnkgdXNlTG9jYWxTdG9yYWdlIG5vd1xuICAgICAgcmV0dXJuIHVzZXJJZDtcbiAgICB9LFxuICAgIFtzZXRJdGVtLCBVU0VSX0lEX0RFRkFVTFRfS0VZXVxuICApO1xuXG4gIGNvbnN0IHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oXG4gICAgICAgIGBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlIC0gU2V0dGluZyB1c2VyX2lkPSR7dXNlcklkfWBcbiAgICAgICk7XG4gICAgICBzZXRJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZLCB1c2VySWQpO1xuICAgICAgLy8gd2luZG93LmRpc3BhdGNoRXZlbnQgaXMgaGFuZGxlZCBieSB1c2VMb2NhbFN0b3JhZ2Ugbm93XG4gICAgICByZXR1cm4gdXNlcklkO1xuICAgIH0sXG4gICAgW3NldEl0ZW0sIFVTRVJfSURfT1ZFUlJJREVfS0VZXVxuICApO1xuXG4gIGNvbnN0IGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBMb2dnZXIubG9nSW5mbyhgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlIC0gQ2xlYXJpbmcgdXNlcl9pZGApO1xuICAgIC8vIExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0TG9jYWxTdG9yYWdlKCk/LnJlbW92ZUl0ZW0oVVNFUl9JRF9PVkVSUklERV9LRVkpO1xuICAgIC8vIHdpbmRvdy5kaXNwYXRjaEV2ZW50IGlzIGhhbmRsZWQgYnkgdXNlTG9jYWxTdG9yYWdlIG5vd1xuICAgIHNldEl0ZW0oVVNFUl9JRF9PVkVSUklERV9LRVksIFwiXCIpOyAvLyBTZXQgdG8gZW1wdHkgc3RyaW5nIHRvIGNsZWFyXG4gIH0sIFtzZXRJdGVtLCBVU0VSX0lEX09WRVJSSURFX0tFWV0pO1xuXG4gIGNvbnN0IGdldFVzZXJJZE9yRGVmYXVsdCA9IHVzZUNhbGxiYWNrKCgpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHVzZXJJZE92ZXJyaWRlID0gZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKHVzZXJJZE92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gdXNlcklkT3ZlcnJpZGU7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFVzZXJJZCA9IGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKGRlZmF1bHRVc2VySWQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VXNlcklkO1xuICAgIH1cblxuICAgIHJldHVybiBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UoYHNwaWZmeS11c2VyLWlkLSR7dXVpZCgpfWApO1xuICB9LCBbXG4gICAgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlLFxuICAgIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlLFxuICAgIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSxcbiAgXSk7XG5cbiAgY29uc3QgaWRlbnRpZnlVc2VyID0gdXNlQ2FsbGJhY2soYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghaXNSZWFkeSkge1xuICAgICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAgIFwiW1VzZXJJZGVudGl0eUNvbnRleHRdIENvbnRleHQgbm90IHJlYWR5LCBza2lwcGluZyBpZGVudGlmeVVzZXJcIixcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBUZW1wb3JhcmlseSBjb21tZW50ZWQgb3V0IHVudGlsIFdpbmRvd0RhdGFMYXllclNlcnZpY2UgaXMgcmVzb2x2ZWRcbiAgICAgIC8vIGNvbnN0IGNkcFVzZXJJZCA9IFdpbmRvd0RhdGFMYXllclNlcnZpY2UuZ2V0R29vZ2xlQW5hbHl0aWNzQ2xpZW50SWQoKTtcbiAgICAgIGNvbnN0IGNkcFVzZXJJZCA9IFwiVU5LTk9XTl9DRFBfVVNFUl9JRFwiOyAvLyBQbGFjZWhvbGRlclxuICAgICAgY29uc3QgdXNlcklkID0gZ2V0VXNlcklkT3JEZWZhdWx0KCk7XG4gICAgICBjb25zdCB1c2VyQWdlbnREZXRhaWxzID0gZ2V0VXNlckFnZW50RGV0YWlscygpO1xuXG4gICAgICBpZiAoIWNkcFVzZXJJZCkge1xuICAgICAgICBMb2dnZXIubG9nV2FybihcbiAgICAgICAgICBcIltzcGlmZnktYWldIE5vIEdBIENsaWVudCBJRCBmb3VuZCwgc2tpcHBpbmcgaWRlbnRpZnlVc2VyXCIsXG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuaWRlbnRpZnlVc2VyKHVzZXJJZCwgY2RwVXNlcklkLCB1c2VyQWdlbnREZXRhaWxzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiW3NwaWZmeS1haV0gRXJyb3IgaWRlbnRpZnlpbmcgdXNlclwiLCBlcnJvcik7XG4gICAgfVxuICB9LCBbaXNSZWFkeSwgZ2V0VXNlcklkT3JEZWZhdWx0XSk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBpZGVudGlmeVVzZXIsXG4gICAgICBnZXRVc2VySWRPckRlZmF1bHQsXG4gICAgICBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBpc1JlYWR5LFxuICAgIH0pLFxuICAgIFtcbiAgICAgIGlkZW50aWZ5VXNlcixcbiAgICAgIGdldFVzZXJJZE9yRGVmYXVsdCxcbiAgICAgIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGlzUmVhZHksXG4gICAgXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPFVzZXJJZGVudGl0eUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L1VzZXJJZGVudGl0eUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlVXNlcklkZW50aXR5ID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChVc2VySWRlbnRpdHlDb250ZXh0KTtcbiAgY29uc3Qgc2V0VXNlcklkID0gdXNlU2V0QXRvbSh1c2VySWRBdG9tKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRVc2VySWQoY29udGV4dD8uZ2V0VXNlcklkT3JEZWZhdWx0KCkgPz8gXCJcIik7XG4gIH0sIFtjb250ZXh0LCBzZXRVc2VySWRdKTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJ1c2VVc2VySWRlbnRpdHkgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFVzZXJJZGVudGl0eVByb3ZpZGVyXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFrQkEsTUFBTSw0QkFBMkM7Q0FFL0MsTUFBTSxTQURXLElBQUksVUFBVSxDQUNQLFdBQVc7QUFFbkMsUUFBTztFQUNMLElBQUksUUFBUSxJQUFJO0VBQ2hCLFdBQVcsUUFBUSxJQUFJO0VBQ3ZCLGFBQWEsUUFBUSxRQUFRO0VBQzdCLG9CQUFvQixRQUFRLFFBQVE7RUFDcEMsYUFBYSxRQUFRLFFBQVE7RUFDN0IsU0FBUyxRQUFRLFNBQVM7RUFDMUIsZ0JBQWdCLFFBQVEsU0FBUztFQUNqQyxXQUFXLFFBQVE7RUFDcEI7O0FBY0gsTUFBTSxzQkFBc0IsY0FDMUIsT0FDRDtBQUVELE1BQWFBLHdCQUFpRSxFQUM1RSxlQUNJO0NBQ0osTUFBTSxFQUNKLFNBQ0EsU0FDQSxhQUFhLHdCQUNYLGlCQUFpQjtDQUVyQixNQUFNLENBQUMsU0FBUyxjQUFjLFNBQVMsTUFBTTtBQUU3QyxpQkFBZ0I7QUFHZCxhQUFXLG9CQUFvQjtJQUM5QixDQUFDLG9CQUFvQixDQUFDO0NBRXpCLE1BQU0sdUJBQXVCO0NBQzdCLE1BQU0sc0JBQXNCO0NBRTVCLE1BQU0sb0NBQW9DLGtCQUV6QjtBQUNmLFNBQU8sUUFBUSxxQkFBcUIsSUFBSTtJQUN2QyxDQUFDLFFBQVEsQ0FBQztDQUViLE1BQU0sbUNBQW1DLGtCQUV4QjtBQUNmLFNBQU8sUUFBUSxvQkFBb0IsSUFBSTtJQUN0QyxDQUFDLFFBQVEsQ0FBQztDQUViLE1BQU0saUNBQWlDLGFBQ3BDLFdBQTJCO0FBQzFCLGlCQUFPLFFBQ0wsb0RBQW9ELFNBQ3JEO0FBQ0QsVUFBUSxxQkFBcUIsT0FBTztBQUVwQyxTQUFPO0lBRVQsQ0FBQyxTQUFTLG9CQUFvQixDQUMvQjtDQUVELE1BQU0sa0NBQWtDLGFBQ3JDLFdBQTJCO0FBQzFCLGlCQUFPLFFBQ0wscURBQXFELFNBQ3REO0FBQ0QsVUFBUSxzQkFBc0IsT0FBTztBQUVyQyxTQUFPO0lBRVQsQ0FBQyxTQUFTLHFCQUFxQixDQUNoQztDQUVELE1BQU0sb0NBQW9DLGtCQUFrQjtBQUMxRCxpQkFBTyxRQUFRLHVEQUF1RDtBQUd0RSxVQUFRLHNCQUFzQixHQUFHO0lBQ2hDLENBQUMsU0FBUyxxQkFBcUIsQ0FBQztDQUVuQyxNQUFNLHFCQUFxQixrQkFBMEI7RUFDbkQsTUFBTSxpQkFBaUIsbUNBQW1DO0FBQzFELE1BQUksZUFDRixRQUFPO0VBR1QsTUFBTSxnQkFBZ0Isa0NBQWtDO0FBQ3hELE1BQUksY0FDRixRQUFPO0FBR1QsU0FBTywrQkFBK0Isa0JBQWtCQyxJQUFNLEdBQUc7SUFDaEU7RUFDRDtFQUNBO0VBQ0E7RUFDRCxDQUFDO0NBRUYsTUFBTSxlQUFlLFlBQVksWUFBMkI7QUFDMUQsTUFBSSxDQUFDLFNBQVM7QUFDWixrQkFBTyxRQUNMLGtFQUNBLE9BQ0Q7QUFDRDs7QUFHRixNQUFJO0dBR0YsTUFBTSxZQUFZO0dBQ2xCLE1BQU0sU0FBUyxvQkFBb0I7R0FDbkMsTUFBTSxtQkFBbUIscUJBQXFCO0FBVTlDLFNBQU1DLHFCQUFrQixhQUFhLFFBQVEsV0FBVyxpQkFBaUI7V0FDbEUsT0FBTztBQUNkLGtCQUFPLFNBQVMsc0NBQXNDLE1BQU07O0lBRTdELENBQUMsU0FBUyxtQkFBbUIsQ0FBQztDQUVqQyxNQUFNLFFBQVEsZUFDTDtFQUNMO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRCxHQUNEO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNELENBQ0Y7QUFFRCxRQUNFLG9CQUFDLG9CQUFvQjtFQUFnQjtFQUNsQztHQUM0Qjs7QUFJbkMsTUFBYSx3QkFBd0I7Q0FDbkMsTUFBTSxVQUFVLFdBQVcsb0JBQW9CO0NBQy9DLE1BQU0sWUFBWSxXQUFXLFdBQVc7QUFDeEMsaUJBQWdCO0FBQ2QsWUFBVSxTQUFTLG9CQUFvQixJQUFJLEdBQUc7SUFDN0MsQ0FBQyxTQUFTLFVBQVUsQ0FBQztBQUN4QixLQUFJLENBQUMsUUFDSCxPQUFNLElBQUksTUFDUiw2REFDRDtBQUVILFFBQU8ifQ==