@okeyamy/lua 5.0.4

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.
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
+ /**
6
+ * Weighted History Manager
7
+ * ========================
8
+ * Manages localStorage for user visit history with exponential decay.
9
+ * Tracks user visits with timestamps, UTM params, intents, and selected variants.
10
+ * Applies configurable exponential decay so recent visits carry more weight.
11
+ *
12
+ * Storage key: 'lua_personalize_history'
13
+ * Registers on window.LuaWeightedHistory
14
+ *
15
+ * No ES6 imports. Self-contained IIFE.
16
+ */
17
+ ;
18
+ (function (root) {
19
+ 'use strict';
20
+
21
+ // ===================================================================
22
+ // Constants
23
+ // ===================================================================
24
+ var STORAGE_KEY = 'lua_personalize_history';
25
+ var DEFAULT_DECAY_RATE = 0.9;
26
+ var DEFAULT_MAX_HISTORY = 10;
27
+ var DEFAULT_MAX_WEIGHTED = 5;
28
+ var MS_PER_DAY = 1000 * 60 * 60 * 24;
29
+
30
+ // ===================================================================
31
+ // UUID Generator (simple, no crypto dependency)
32
+ // ===================================================================
33
+
34
+ /**
35
+ * Generate a simple UUID v4
36
+ * Uses crypto.getRandomValues when available, Math.random fallback
37
+ * @returns {string} - UUID string
38
+ */
39
+ function generateUUID() {
40
+ try {
41
+ if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
42
+ var buf = new Uint8Array(16);
43
+ crypto.getRandomValues(buf);
44
+ buf[6] = buf[6] & 0x0f | 0x40;
45
+ buf[8] = buf[8] & 0x3f | 0x80;
46
+ var hex = '';
47
+ for (var i = 0; i < 16; i++) {
48
+ var h = buf[i].toString(16);
49
+ hex += h.length === 1 ? '0' + h : h;
50
+ }
51
+ return hex.substring(0, 8) + '-' + hex.substring(8, 12) + '-' + hex.substring(12, 16) + '-' + hex.substring(16, 20) + '-' + hex.substring(20, 32);
52
+ }
53
+ } catch (e) {
54
+ // Fallback below
55
+ }
56
+
57
+ // Math.random fallback
58
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
59
+ var r = Math.random() * 16 | 0;
60
+ var v = c === 'x' ? r : r & 0x3 | 0x8;
61
+ return v.toString(16);
62
+ });
63
+ }
64
+
65
+ // ===================================================================
66
+ // LocalStorage Helpers
67
+ // ===================================================================
68
+
69
+ /**
70
+ * Check if localStorage is available
71
+ * @returns {boolean}
72
+ */
73
+ function isLocalStorageAvailable() {
74
+ try {
75
+ if (typeof localStorage === 'undefined') return false;
76
+ var testKey = '__lua_test__';
77
+ localStorage.setItem(testKey, '1');
78
+ localStorage.removeItem(testKey);
79
+ return true;
80
+ } catch (e) {
81
+ return false;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Read history from localStorage
87
+ * @returns {Object|null} - Parsed history object or null
88
+ */
89
+ function readFromStorage() {
90
+ if (!isLocalStorageAvailable()) return null;
91
+ try {
92
+ var raw = localStorage.getItem(STORAGE_KEY);
93
+ if (!raw) return null;
94
+ var parsed = JSON.parse(raw);
95
+ if (parsed && (0, _typeof2.default)(parsed) === 'object' && Array.isArray(parsed.visits)) {
96
+ return parsed;
97
+ }
98
+ return null;
99
+ } catch (e) {
100
+ console.warn('[Lua History] Failed to read history:', e);
101
+ return null;
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Write history to localStorage
107
+ * @param {Object} history - History object to persist
108
+ * @returns {boolean} - Whether the write was successful
109
+ */
110
+ function writeToStorage(history) {
111
+ if (!isLocalStorageAvailable()) return false;
112
+ try {
113
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(history));
114
+ return true;
115
+ } catch (e) {
116
+ console.warn('[Lua History] Failed to write history:', e);
117
+ return false;
118
+ }
119
+ }
120
+
121
+ // ===================================================================
122
+ // Weighted Decay Functions
123
+ // ===================================================================
124
+
125
+ /**
126
+ * Calculate the weight of a visit based on its age using exponential decay
127
+ * Weight = decayRate ^ daysAgo
128
+ * Example: decayRate=0.9, 1 day ago = 0.9, 7 days ago = 0.478, 30 days ago = 0.042
129
+ *
130
+ * @param {number} timestamp - Visit timestamp in ms
131
+ * @param {number} [decayRate] - Decay rate per day (0-1, default: 0.9)
132
+ * @returns {number} - Weight between 0 and 1
133
+ */
134
+ function calculateWeight(timestamp, decayRate) {
135
+ decayRate = typeof decayRate === 'number' ? decayRate : DEFAULT_DECAY_RATE;
136
+ var now = Date.now();
137
+ var daysAgo = Math.max(0, (now - timestamp) / MS_PER_DAY);
138
+ return Math.pow(decayRate, daysAgo);
139
+ }
140
+
141
+ /**
142
+ * Build weighted context from visit history
143
+ * Returns the most relevant visits sorted by weight (highest first)
144
+ *
145
+ * @param {Object} history - History object with visits array
146
+ * @param {Object} [options] - Configuration
147
+ * @param {number} [options.decayRate] - Decay rate (default: 0.9)
148
+ * @param {number} [options.maxWeighted] - Max results to return (default: 5)
149
+ * @returns {Array} - Weighted visits sorted by relevance
150
+ */
151
+ function buildWeightedContext(history, options) {
152
+ options = options || {};
153
+ var decayRate = options.decayRate || DEFAULT_DECAY_RATE;
154
+ var maxWeighted = options.maxWeighted || DEFAULT_MAX_WEIGHTED;
155
+ if (!history || !Array.isArray(history.visits) || history.visits.length === 0) {
156
+ return [];
157
+ }
158
+ var weighted = [];
159
+ for (var i = 0; i < history.visits.length; i++) {
160
+ var visit = history.visits[i];
161
+ var weight = calculateWeight(visit.timestamp, decayRate);
162
+ weighted.push({
163
+ timestamp: visit.timestamp,
164
+ weight: Math.round(weight * 1000) / 1000,
165
+ intent: visit.intent || 'unknown',
166
+ selectedVariant: visit.selectedVariant || null,
167
+ source: visit.source || 'unknown',
168
+ aiDecision: visit.aiDecision || false,
169
+ context: visit.context || {}
170
+ });
171
+ }
172
+
173
+ // Sort by weight descending (most recent / relevant first)
174
+ weighted.sort(function (a, b) {
175
+ return b.weight - a.weight;
176
+ });
177
+
178
+ // Return top N results
179
+ return weighted.slice(0, maxWeighted);
180
+ }
181
+
182
+ /**
183
+ * Aggregate intent preferences from weighted history
184
+ * Produces a score map of intents weighted by recency
185
+ *
186
+ * @param {Array} weightedVisits - Output of buildWeightedContext
187
+ * @returns {Object} - Intent -> score mapping
188
+ */
189
+ function aggregatePreferences(weightedVisits) {
190
+ var scores = {};
191
+ for (var i = 0; i < weightedVisits.length; i++) {
192
+ var visit = weightedVisits[i];
193
+ var intent = visit.intent;
194
+ if (!intent || intent === 'unknown' || intent === 'default') continue;
195
+ if (!scores[intent]) {
196
+ scores[intent] = 0;
197
+ }
198
+ scores[intent] += visit.weight;
199
+ }
200
+ return scores;
201
+ }
202
+
203
+ // ===================================================================
204
+ // History Management
205
+ // ===================================================================
206
+
207
+ /**
208
+ * Initialize or retrieve existing history
209
+ * Creates a new history object with a UUID if none exists
210
+ *
211
+ * @returns {Object} - History object
212
+ */
213
+ function getHistory() {
214
+ var history = readFromStorage();
215
+ if (!history) {
216
+ history = {
217
+ userId: generateUUID(),
218
+ createdAt: Date.now(),
219
+ visits: [],
220
+ preferences: {}
221
+ };
222
+ writeToStorage(history);
223
+ }
224
+ return history;
225
+ }
226
+
227
+ /**
228
+ * Record a new visit to history
229
+ *
230
+ * @param {Object} visitData - Visit data to record
231
+ * @param {Object} visitData.context - UTM context (utm, referrer, userAgent)
232
+ * @param {string} visitData.intent - Inferred or AI-selected intent
233
+ * @param {string} visitData.selectedVariant - Selected template/variant key
234
+ * @param {string} visitData.source - Decision source ('ai', 'utm', 'referrer', 'random-ab', etc.)
235
+ * @param {boolean} [visitData.aiDecision] - Whether AI made this decision
236
+ * @param {Object} [options] - Configuration
237
+ * @param {number} [options.maxHistorySize] - Max visits to keep (default: 10)
238
+ * @returns {Object} - Updated history object
239
+ */
240
+ function recordVisit(visitData, options) {
241
+ options = options || {};
242
+ var maxHistorySize = options.maxHistorySize || DEFAULT_MAX_HISTORY;
243
+ var history = getHistory();
244
+
245
+ // Build a minimal context to store (avoid storing sensitive/large data)
246
+ var minimalContext = {};
247
+ if (visitData.context) {
248
+ if (visitData.context.utm) {
249
+ minimalContext.utm = visitData.context.utm;
250
+ }
251
+ if (visitData.context.referrer) {
252
+ minimalContext.referrer = {
253
+ source: visitData.context.referrer.source,
254
+ category: visitData.context.referrer.category
255
+ };
256
+ }
257
+ if (visitData.context.userAgent) {
258
+ minimalContext.device = visitData.context.userAgent.isMobile ? 'mobile' : visitData.context.userAgent.isTablet ? 'tablet' : 'desktop';
259
+ }
260
+ }
261
+ var visit = {
262
+ timestamp: Date.now(),
263
+ context: minimalContext,
264
+ intent: visitData.intent || 'unknown',
265
+ selectedVariant: visitData.selectedVariant || null,
266
+ source: visitData.source || 'unknown',
267
+ aiDecision: !!visitData.aiDecision
268
+ };
269
+ history.visits.push(visit);
270
+
271
+ // Trim to max size (keep most recent)
272
+ if (history.visits.length > maxHistorySize) {
273
+ history.visits = history.visits.slice(-maxHistorySize);
274
+ }
275
+
276
+ // Update aggregated preferences
277
+ var weighted = buildWeightedContext(history, options);
278
+ history.preferences = aggregatePreferences(weighted);
279
+ writeToStorage(history);
280
+ return history;
281
+ }
282
+
283
+ /**
284
+ * Get the user ID from history (creates one if needed)
285
+ * @returns {string} - User UUID
286
+ */
287
+ function getUserId() {
288
+ var history = getHistory();
289
+ return history.userId;
290
+ }
291
+
292
+ /**
293
+ * Check if this is a returning user (has previous visits)
294
+ * @returns {boolean}
295
+ */
296
+ function isReturningUser() {
297
+ var history = readFromStorage();
298
+ return history !== null && Array.isArray(history.visits) && history.visits.length > 0;
299
+ }
300
+
301
+ /**
302
+ * Get the most recent visit from history
303
+ * @returns {Object|null} - Most recent visit or null
304
+ */
305
+ function getLastVisit() {
306
+ var history = readFromStorage();
307
+ if (!history || !Array.isArray(history.visits) || history.visits.length === 0) {
308
+ return null;
309
+ }
310
+ return history.visits[history.visits.length - 1];
311
+ }
312
+
313
+ /**
314
+ * Format weighted history as a human-readable string for AI prompts
315
+ * @param {Array} weightedVisits - Output of buildWeightedContext
316
+ * @returns {string} - Formatted string
317
+ */
318
+ function formatForPrompt(weightedVisits) {
319
+ if (!weightedVisits || weightedVisits.length === 0) {
320
+ return 'No previous visit history available. This is a new visitor.';
321
+ }
322
+ var lines = [];
323
+ lines.push('Previous visits (' + weightedVisits.length + ' recorded, weighted by recency):');
324
+ for (var i = 0; i < weightedVisits.length; i++) {
325
+ var v = weightedVisits[i];
326
+ var date = new Date(v.timestamp);
327
+ var dateStr = date.toISOString().split('T')[0];
328
+ var line = ' - [' + dateStr + '] ';
329
+ line += 'Intent: ' + v.intent;
330
+ if (v.selectedVariant) line += ', Variant: ' + v.selectedVariant;
331
+ line += ', Source: ' + v.source;
332
+ line += ', Weight: ' + v.weight;
333
+ if (v.context && v.context.utm && v.context.utm.utm_source) {
334
+ line += ', UTM: ' + v.context.utm.utm_source;
335
+ }
336
+ lines.push(line);
337
+ }
338
+ return lines.join('\n');
339
+ }
340
+
341
+ /**
342
+ * Clear all history (useful for testing or user request)
343
+ * @returns {boolean} - Whether the clear was successful
344
+ */
345
+ function clearHistory() {
346
+ if (!isLocalStorageAvailable()) return false;
347
+ try {
348
+ localStorage.removeItem(STORAGE_KEY);
349
+ return true;
350
+ } catch (e) {
351
+ return false;
352
+ }
353
+ }
354
+
355
+ // ===================================================================
356
+ // Public API
357
+ // ===================================================================
358
+
359
+ var LuaWeightedHistory = {
360
+ // Core functions
361
+ getHistory: getHistory,
362
+ recordVisit: recordVisit,
363
+ getUserId: getUserId,
364
+ isReturningUser: isReturningUser,
365
+ getLastVisit: getLastVisit,
366
+ clearHistory: clearHistory,
367
+ // Weighted context
368
+ calculateWeight: calculateWeight,
369
+ buildWeightedContext: buildWeightedContext,
370
+ aggregatePreferences: aggregatePreferences,
371
+ formatForPrompt: formatForPrompt,
372
+ // Utilities
373
+ isLocalStorageAvailable: isLocalStorageAvailable,
374
+ generateUUID: generateUUID,
375
+ // Constants
376
+ STORAGE_KEY: STORAGE_KEY,
377
+ DEFAULT_DECAY_RATE: DEFAULT_DECAY_RATE,
378
+ DEFAULT_MAX_HISTORY: DEFAULT_MAX_HISTORY
379
+ };
380
+
381
+ // Register globally
382
+ root.LuaWeightedHistory = LuaWeightedHistory;
383
+ })(typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : void 0);
384
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb290IiwiU1RPUkFHRV9LRVkiLCJERUZBVUxUX0RFQ0FZX1JBVEUiLCJERUZBVUxUX01BWF9ISVNUT1JZIiwiREVGQVVMVF9NQVhfV0VJR0hURUQiLCJNU19QRVJfREFZIiwiZ2VuZXJhdGVVVUlEIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiYnVmIiwiVWludDhBcnJheSIsImhleCIsImkiLCJoIiwidG9TdHJpbmciLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJlIiwicmVwbGFjZSIsImMiLCJyIiwiTWF0aCIsInJhbmRvbSIsInYiLCJpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSIsImxvY2FsU3RvcmFnZSIsInRlc3RLZXkiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsInJlYWRGcm9tU3RvcmFnZSIsInJhdyIsImdldEl0ZW0iLCJwYXJzZWQiLCJKU09OIiwicGFyc2UiLCJfdHlwZW9mMiIsImRlZmF1bHQiLCJBcnJheSIsImlzQXJyYXkiLCJ2aXNpdHMiLCJjb25zb2xlIiwid2FybiIsIndyaXRlVG9TdG9yYWdlIiwiaGlzdG9yeSIsInN0cmluZ2lmeSIsImNhbGN1bGF0ZVdlaWdodCIsInRpbWVzdGFtcCIsImRlY2F5UmF0ZSIsIm5vdyIsIkRhdGUiLCJkYXlzQWdvIiwibWF4IiwicG93IiwiYnVpbGRXZWlnaHRlZENvbnRleHQiLCJvcHRpb25zIiwibWF4V2VpZ2h0ZWQiLCJ3ZWlnaHRlZCIsInZpc2l0Iiwid2VpZ2h0IiwicHVzaCIsInJvdW5kIiwiaW50ZW50Iiwic2VsZWN0ZWRWYXJpYW50Iiwic291cmNlIiwiYWlEZWNpc2lvbiIsImNvbnRleHQiLCJzb3J0IiwiYSIsImIiLCJzbGljZSIsImFnZ3JlZ2F0ZVByZWZlcmVuY2VzIiwid2VpZ2h0ZWRWaXNpdHMiLCJzY29yZXMiLCJnZXRIaXN0b3J5IiwidXNlcklkIiwiY3JlYXRlZEF0IiwicHJlZmVyZW5jZXMiLCJyZWNvcmRWaXNpdCIsInZpc2l0RGF0YSIsIm1heEhpc3RvcnlTaXplIiwibWluaW1hbENvbnRleHQiLCJ1dG0iLCJyZWZlcnJlciIsImNhdGVnb3J5IiwidXNlckFnZW50IiwiZGV2aWNlIiwiaXNNb2JpbGUiLCJpc1RhYmxldCIsImdldFVzZXJJZCIsImlzUmV0dXJuaW5nVXNlciIsImdldExhc3RWaXNpdCIsImZvcm1hdEZvclByb21wdCIsImxpbmVzIiwiZGF0ZSIsImRhdGVTdHIiLCJ0b0lTT1N0cmluZyIsInNwbGl0IiwibGluZSIsInV0bV9zb3VyY2UiLCJqb2luIiwiY2xlYXJIaXN0b3J5IiwiTHVhV2VpZ2h0ZWRIaXN0b3J5Iiwid2luZG93IiwiZ2xvYmFsIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3JhZ2Uvd2VpZ2h0ZWQtaGlzdG9yeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogV2VpZ2h0ZWQgSGlzdG9yeSBNYW5hZ2VyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE1hbmFnZXMgbG9jYWxTdG9yYWdlIGZvciB1c2VyIHZpc2l0IGhpc3Rvcnkgd2l0aCBleHBvbmVudGlhbCBkZWNheS5cbiAqIFRyYWNrcyB1c2VyIHZpc2l0cyB3aXRoIHRpbWVzdGFtcHMsIFVUTSBwYXJhbXMsIGludGVudHMsIGFuZCBzZWxlY3RlZCB2YXJpYW50cy5cbiAqIEFwcGxpZXMgY29uZmlndXJhYmxlIGV4cG9uZW50aWFsIGRlY2F5IHNvIHJlY2VudCB2aXNpdHMgY2FycnkgbW9yZSB3ZWlnaHQuXG4gKlxuICogU3RvcmFnZSBrZXk6ICdsdWFfcGVyc29uYWxpemVfaGlzdG9yeSdcbiAqIFJlZ2lzdGVycyBvbiB3aW5kb3cuTHVhV2VpZ2h0ZWRIaXN0b3J5XG4gKlxuICogTm8gRVM2IGltcG9ydHMuIFNlbGYtY29udGFpbmVkIElJRkUuXG4gKi9cbjsoZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAndXNlIHN0cmljdCdcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBDb25zdGFudHNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB2YXIgU1RPUkFHRV9LRVkgPSAnbHVhX3BlcnNvbmFsaXplX2hpc3RvcnknXG4gICAgdmFyIERFRkFVTFRfREVDQVlfUkFURSA9IDAuOVxuICAgIHZhciBERUZBVUxUX01BWF9ISVNUT1JZID0gMTBcbiAgICB2YXIgREVGQVVMVF9NQVhfV0VJR0hURUQgPSA1XG4gICAgdmFyIE1TX1BFUl9EQVkgPSAxMDAwICogNjAgKiA2MCAqIDI0XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVVVJRCBHZW5lcmF0b3IgKHNpbXBsZSwgbm8gY3J5cHRvIGRlcGVuZGVuY3kpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzaW1wbGUgVVVJRCB2NFxuICAgICAqIFVzZXMgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyB3aGVuIGF2YWlsYWJsZSwgTWF0aC5yYW5kb20gZmFsbGJhY2tcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFVVSUQgc3RyaW5nXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYpXG4gICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhidWYpXG4gICAgICAgICAgICAgICAgYnVmWzZdID0gKGJ1Zls2XSAmIDB4MGYpIHwgMHg0MFxuICAgICAgICAgICAgICAgIGJ1Zls4XSA9IChidWZbOF0gJiAweDNmKSB8IDB4ODBcbiAgICAgICAgICAgICAgICB2YXIgaGV4ID0gJydcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBidWZbaV0udG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAgICAgICAgIGhleCArPSBoLmxlbmd0aCA9PT0gMSA/ICcwJyArIGggOiBoXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGhleC5zdWJzdHJpbmcoMCwgOCkgKyAnLScgK1xuICAgICAgICAgICAgICAgICAgICBoZXguc3Vic3RyaW5nKDgsIDEyKSArICctJyArXG4gICAgICAgICAgICAgICAgICAgIGhleC5zdWJzdHJpbmcoMTIsIDE2KSArICctJyArXG4gICAgICAgICAgICAgICAgICAgIGhleC5zdWJzdHJpbmcoMTYsIDIwKSArICctJyArXG4gICAgICAgICAgICAgICAgICAgIGhleC5zdWJzdHJpbmcoMjAsIDMyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgYmVsb3dcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGgucmFuZG9tIGZhbGxiYWNrXG4gICAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICB2YXIgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMFxuICAgICAgICAgICAgdmFyIHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4XG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNilcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTG9jYWxTdG9yYWdlIEhlbHBlcnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgdmFyIHRlc3RLZXkgPSAnX19sdWFfdGVzdF9fJ1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdEtleSwgJzEnKVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdEtleSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZCBoaXN0b3J5IGZyb20gbG9jYWxTdG9yYWdlXG4gICAgICogQHJldHVybnMge09iamVjdHxudWxsfSAtIFBhcnNlZCBoaXN0b3J5IG9iamVjdCBvciBudWxsXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVhZEZyb21TdG9yYWdlKCkge1xuICAgICAgICBpZiAoIWlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkpIHJldHVybiBudWxsXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpXG4gICAgICAgICAgICBpZiAoIXJhdykgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIHZhciBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdylcbiAgICAgICAgICAgIGlmIChwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgQXJyYXkuaXNBcnJheShwYXJzZWQudmlzaXRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW0x1YSBIaXN0b3J5XSBGYWlsZWQgdG8gcmVhZCBoaXN0b3J5OicsIGUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgaGlzdG9yeSB0byBsb2NhbFN0b3JhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaGlzdG9yeSAtIEhpc3Rvcnkgb2JqZWN0IHRvIHBlcnNpc3RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSB3cml0ZSB3YXMgc3VjY2Vzc2Z1bFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyaXRlVG9TdG9yYWdlKGhpc3RvcnkpIHtcbiAgICAgICAgaWYgKCFpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSgpKSByZXR1cm4gZmFsc2VcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW0x1YSBIaXN0b3J5XSBGYWlsZWQgdG8gd3JpdGUgaGlzdG9yeTonLCBlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV2VpZ2h0ZWQgRGVjYXkgRnVuY3Rpb25zXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSB3ZWlnaHQgb2YgYSB2aXNpdCBiYXNlZCBvbiBpdHMgYWdlIHVzaW5nIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgICogV2VpZ2h0ID0gZGVjYXlSYXRlIF4gZGF5c0Fnb1xuICAgICAqIEV4YW1wbGU6IGRlY2F5UmF0ZT0wLjksIDEgZGF5IGFnbyA9IDAuOSwgNyBkYXlzIGFnbyA9IDAuNDc4LCAzMCBkYXlzIGFnbyA9IDAuMDQyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXN0YW1wIC0gVmlzaXQgdGltZXN0YW1wIGluIG1zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWNheVJhdGVdIC0gRGVjYXkgcmF0ZSBwZXIgZGF5ICgwLTEsIGRlZmF1bHQ6IDAuOSlcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFdlaWdodCBiZXR3ZWVuIDAgYW5kIDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXZWlnaHQodGltZXN0YW1wLCBkZWNheVJhdGUpIHtcbiAgICAgICAgZGVjYXlSYXRlID0gdHlwZW9mIGRlY2F5UmF0ZSA9PT0gJ251bWJlcicgPyBkZWNheVJhdGUgOiBERUZBVUxUX0RFQ0FZX1JBVEVcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KClcbiAgICAgICAgdmFyIGRheXNBZ28gPSBNYXRoLm1heCgwLCAobm93IC0gdGltZXN0YW1wKSAvIE1TX1BFUl9EQVkpXG4gICAgICAgIHJldHVybiBNYXRoLnBvdyhkZWNheVJhdGUsIGRheXNBZ28pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGQgd2VpZ2h0ZWQgY29udGV4dCBmcm9tIHZpc2l0IGhpc3RvcnlcbiAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IHJlbGV2YW50IHZpc2l0cyBzb3J0ZWQgYnkgd2VpZ2h0IChoaWdoZXN0IGZpcnN0KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhpc3RvcnkgLSBIaXN0b3J5IG9iamVjdCB3aXRoIHZpc2l0cyBhcnJheVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBDb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmRlY2F5UmF0ZV0gLSBEZWNheSByYXRlIChkZWZhdWx0OiAwLjkpXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdlaWdodGVkXSAtIE1heCByZXN1bHRzIHRvIHJldHVybiAoZGVmYXVsdDogNSlcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gV2VpZ2h0ZWQgdmlzaXRzIHNvcnRlZCBieSByZWxldmFuY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBidWlsZFdlaWdodGVkQ29udGV4dChoaXN0b3J5LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gICAgICAgIHZhciBkZWNheVJhdGUgPSBvcHRpb25zLmRlY2F5UmF0ZSB8fCBERUZBVUxUX0RFQ0FZX1JBVEVcbiAgICAgICAgdmFyIG1heFdlaWdodGVkID0gb3B0aW9ucy5tYXhXZWlnaHRlZCB8fCBERUZBVUxUX01BWF9XRUlHSFRFRFxuXG4gICAgICAgIGlmICghaGlzdG9yeSB8fCAhQXJyYXkuaXNBcnJheShoaXN0b3J5LnZpc2l0cykgfHwgaGlzdG9yeS52aXNpdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3ZWlnaHRlZCA9IFtdXG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoaXN0b3J5LnZpc2l0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHZpc2l0ID0gaGlzdG9yeS52aXNpdHNbaV1cbiAgICAgICAgICAgIHZhciB3ZWlnaHQgPSBjYWxjdWxhdGVXZWlnaHQodmlzaXQudGltZXN0YW1wLCBkZWNheVJhdGUpXG5cbiAgICAgICAgICAgIHdlaWdodGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdmlzaXQudGltZXN0YW1wLFxuICAgICAgICAgICAgICAgIHdlaWdodDogTWF0aC5yb3VuZCh3ZWlnaHQgKiAxMDAwKSAvIDEwMDAsXG4gICAgICAgICAgICAgICAgaW50ZW50OiB2aXNpdC5pbnRlbnQgfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFyaWFudDogdmlzaXQuc2VsZWN0ZWRWYXJpYW50IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgc291cmNlOiB2aXNpdC5zb3VyY2UgfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgICAgIGFpRGVjaXNpb246IHZpc2l0LmFpRGVjaXNpb24gfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dDogdmlzaXQuY29udGV4dCB8fCB7fVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgYnkgd2VpZ2h0IGRlc2NlbmRpbmcgKG1vc3QgcmVjZW50IC8gcmVsZXZhbnQgZmlyc3QpXG4gICAgICAgIHdlaWdodGVkLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLndlaWdodCAtIGEud2VpZ2h0XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gUmV0dXJuIHRvcCBOIHJlc3VsdHNcbiAgICAgICAgcmV0dXJuIHdlaWdodGVkLnNsaWNlKDAsIG1heFdlaWdodGVkKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFnZ3JlZ2F0ZSBpbnRlbnQgcHJlZmVyZW5jZXMgZnJvbSB3ZWlnaHRlZCBoaXN0b3J5XG4gICAgICogUHJvZHVjZXMgYSBzY29yZSBtYXAgb2YgaW50ZW50cyB3ZWlnaHRlZCBieSByZWNlbmN5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB3ZWlnaHRlZFZpc2l0cyAtIE91dHB1dCBvZiBidWlsZFdlaWdodGVkQ29udGV4dFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IC0gSW50ZW50IC0+IHNjb3JlIG1hcHBpbmdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZ2dyZWdhdGVQcmVmZXJlbmNlcyh3ZWlnaHRlZFZpc2l0cykge1xuICAgICAgICB2YXIgc2NvcmVzID0ge31cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdlaWdodGVkVmlzaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdmlzaXQgPSB3ZWlnaHRlZFZpc2l0c1tpXVxuICAgICAgICAgICAgdmFyIGludGVudCA9IHZpc2l0LmludGVudFxuICAgICAgICAgICAgaWYgKCFpbnRlbnQgfHwgaW50ZW50ID09PSAndW5rbm93bicgfHwgaW50ZW50ID09PSAnZGVmYXVsdCcpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGlmICghc2NvcmVzW2ludGVudF0pIHtcbiAgICAgICAgICAgICAgICBzY29yZXNbaW50ZW50XSA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3Jlc1tpbnRlbnRdICs9IHZpc2l0LndlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNjb3Jlc1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBIaXN0b3J5IE1hbmFnZW1lbnRcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIG9yIHJldHJpZXZlIGV4aXN0aW5nIGhpc3RvcnlcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGhpc3Rvcnkgb2JqZWN0IHdpdGggYSBVVUlEIGlmIG5vbmUgZXhpc3RzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEhpc3Rvcnkgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0SGlzdG9yeSgpIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSByZWFkRnJvbVN0b3JhZ2UoKVxuXG4gICAgICAgIGlmICghaGlzdG9yeSkge1xuICAgICAgICAgICAgaGlzdG9yeSA9IHtcbiAgICAgICAgICAgICAgICB1c2VySWQ6IGdlbmVyYXRlVVVJRCgpLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICB2aXNpdHM6IFtdLFxuICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JpdGVUb1N0b3JhZ2UoaGlzdG9yeSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoaXN0b3J5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkIGEgbmV3IHZpc2l0IHRvIGhpc3RvcnlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2aXNpdERhdGEgLSBWaXNpdCBkYXRhIHRvIHJlY29yZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2aXNpdERhdGEuY29udGV4dCAtIFVUTSBjb250ZXh0ICh1dG0sIHJlZmVycmVyLCB1c2VyQWdlbnQpXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZpc2l0RGF0YS5pbnRlbnQgLSBJbmZlcnJlZCBvciBBSS1zZWxlY3RlZCBpbnRlbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmlzaXREYXRhLnNlbGVjdGVkVmFyaWFudCAtIFNlbGVjdGVkIHRlbXBsYXRlL3ZhcmlhbnQga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZpc2l0RGF0YS5zb3VyY2UgLSBEZWNpc2lvbiBzb3VyY2UgKCdhaScsICd1dG0nLCAncmVmZXJyZXInLCAncmFuZG9tLWFiJywgZXRjLilcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2aXNpdERhdGEuYWlEZWNpc2lvbl0gLSBXaGV0aGVyIEFJIG1hZGUgdGhpcyBkZWNpc2lvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBDb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heEhpc3RvcnlTaXplXSAtIE1heCB2aXNpdHMgdG8ga2VlcCAoZGVmYXVsdDogMTApXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBVcGRhdGVkIGhpc3Rvcnkgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVjb3JkVmlzaXQodmlzaXREYXRhLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gICAgICAgIHZhciBtYXhIaXN0b3J5U2l6ZSA9IG9wdGlvbnMubWF4SGlzdG9yeVNpemUgfHwgREVGQVVMVF9NQVhfSElTVE9SWVxuXG4gICAgICAgIHZhciBoaXN0b3J5ID0gZ2V0SGlzdG9yeSgpXG5cbiAgICAgICAgLy8gQnVpbGQgYSBtaW5pbWFsIGNvbnRleHQgdG8gc3RvcmUgKGF2b2lkIHN0b3Jpbmcgc2Vuc2l0aXZlL2xhcmdlIGRhdGEpXG4gICAgICAgIHZhciBtaW5pbWFsQ29udGV4dCA9IHt9XG4gICAgICAgIGlmICh2aXNpdERhdGEuY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKHZpc2l0RGF0YS5jb250ZXh0LnV0bSkge1xuICAgICAgICAgICAgICAgIG1pbmltYWxDb250ZXh0LnV0bSA9IHZpc2l0RGF0YS5jb250ZXh0LnV0bVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpc2l0RGF0YS5jb250ZXh0LnJlZmVycmVyKSB7XG4gICAgICAgICAgICAgICAgbWluaW1hbENvbnRleHQucmVmZXJyZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdmlzaXREYXRhLmNvbnRleHQucmVmZXJyZXIuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogdmlzaXREYXRhLmNvbnRleHQucmVmZXJyZXIuY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlzaXREYXRhLmNvbnRleHQudXNlckFnZW50KSB7XG4gICAgICAgICAgICAgICAgbWluaW1hbENvbnRleHQuZGV2aWNlID0gdmlzaXREYXRhLmNvbnRleHQudXNlckFnZW50LmlzTW9iaWxlXG4gICAgICAgICAgICAgICAgICAgID8gJ21vYmlsZSdcbiAgICAgICAgICAgICAgICAgICAgOiB2aXNpdERhdGEuY29udGV4dC51c2VyQWdlbnQuaXNUYWJsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RhYmxldCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Rlc2t0b3AnXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmlzaXQgPSB7XG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBjb250ZXh0OiBtaW5pbWFsQ29udGV4dCxcbiAgICAgICAgICAgIGludGVudDogdmlzaXREYXRhLmludGVudCB8fCAndW5rbm93bicsXG4gICAgICAgICAgICBzZWxlY3RlZFZhcmlhbnQ6IHZpc2l0RGF0YS5zZWxlY3RlZFZhcmlhbnQgfHwgbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZTogdmlzaXREYXRhLnNvdXJjZSB8fCAndW5rbm93bicsXG4gICAgICAgICAgICBhaURlY2lzaW9uOiAhIXZpc2l0RGF0YS5haURlY2lzaW9uXG4gICAgICAgIH1cblxuICAgICAgICBoaXN0b3J5LnZpc2l0cy5wdXNoKHZpc2l0KVxuXG4gICAgICAgIC8vIFRyaW0gdG8gbWF4IHNpemUgKGtlZXAgbW9zdCByZWNlbnQpXG4gICAgICAgIGlmIChoaXN0b3J5LnZpc2l0cy5sZW5ndGggPiBtYXhIaXN0b3J5U2l6ZSkge1xuICAgICAgICAgICAgaGlzdG9yeS52aXNpdHMgPSBoaXN0b3J5LnZpc2l0cy5zbGljZSgtbWF4SGlzdG9yeVNpemUpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgYWdncmVnYXRlZCBwcmVmZXJlbmNlc1xuICAgICAgICB2YXIgd2VpZ2h0ZWQgPSBidWlsZFdlaWdodGVkQ29udGV4dChoaXN0b3J5LCBvcHRpb25zKVxuICAgICAgICBoaXN0b3J5LnByZWZlcmVuY2VzID0gYWdncmVnYXRlUHJlZmVyZW5jZXMod2VpZ2h0ZWQpXG5cbiAgICAgICAgd3JpdGVUb1N0b3JhZ2UoaGlzdG9yeSlcblxuICAgICAgICByZXR1cm4gaGlzdG9yeVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdXNlciBJRCBmcm9tIGhpc3RvcnkgKGNyZWF0ZXMgb25lIGlmIG5lZWRlZClcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFVzZXIgVVVJRFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFVzZXJJZCgpIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSBnZXRIaXN0b3J5KClcbiAgICAgICAgcmV0dXJuIGhpc3RvcnkudXNlcklkXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBpcyBhIHJldHVybmluZyB1c2VyIChoYXMgcHJldmlvdXMgdmlzaXRzKVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUmV0dXJuaW5nVXNlcigpIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSByZWFkRnJvbVN0b3JhZ2UoKVxuICAgICAgICByZXR1cm4gaGlzdG9yeSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGhpc3RvcnkudmlzaXRzKSAmJiBoaXN0b3J5LnZpc2l0cy5sZW5ndGggPiAwXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtb3N0IHJlY2VudCB2aXNpdCBmcm9tIGhpc3RvcnlcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IC0gTW9zdCByZWNlbnQgdmlzaXQgb3IgbnVsbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldExhc3RWaXNpdCgpIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSByZWFkRnJvbVN0b3JhZ2UoKVxuICAgICAgICBpZiAoIWhpc3RvcnkgfHwgIUFycmF5LmlzQXJyYXkoaGlzdG9yeS52aXNpdHMpIHx8IGhpc3RvcnkudmlzaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlzdG9yeS52aXNpdHNbaGlzdG9yeS52aXNpdHMubGVuZ3RoIC0gMV1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgd2VpZ2h0ZWQgaGlzdG9yeSBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgQUkgcHJvbXB0c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IHdlaWdodGVkVmlzaXRzIC0gT3V0cHV0IG9mIGJ1aWxkV2VpZ2h0ZWRDb250ZXh0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBGb3JtYXR0ZWQgc3RyaW5nXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ybWF0Rm9yUHJvbXB0KHdlaWdodGVkVmlzaXRzKSB7XG4gICAgICAgIGlmICghd2VpZ2h0ZWRWaXNpdHMgfHwgd2VpZ2h0ZWRWaXNpdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ05vIHByZXZpb3VzIHZpc2l0IGhpc3RvcnkgYXZhaWxhYmxlLiBUaGlzIGlzIGEgbmV3IHZpc2l0b3IuJ1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxpbmVzID0gW11cbiAgICAgICAgbGluZXMucHVzaCgnUHJldmlvdXMgdmlzaXRzICgnICsgd2VpZ2h0ZWRWaXNpdHMubGVuZ3RoICsgJyByZWNvcmRlZCwgd2VpZ2h0ZWQgYnkgcmVjZW5jeSk6JylcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdlaWdodGVkVmlzaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHdlaWdodGVkVmlzaXRzW2ldXG4gICAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHYudGltZXN0YW1wKVxuICAgICAgICAgICAgdmFyIGRhdGVTdHIgPSBkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXVxuICAgICAgICAgICAgdmFyIGxpbmUgPSAnICAtIFsnICsgZGF0ZVN0ciArICddICdcbiAgICAgICAgICAgIGxpbmUgKz0gJ0ludGVudDogJyArIHYuaW50ZW50XG4gICAgICAgICAgICBpZiAodi5zZWxlY3RlZFZhcmlhbnQpIGxpbmUgKz0gJywgVmFyaWFudDogJyArIHYuc2VsZWN0ZWRWYXJpYW50XG4gICAgICAgICAgICBsaW5lICs9ICcsIFNvdXJjZTogJyArIHYuc291cmNlXG4gICAgICAgICAgICBsaW5lICs9ICcsIFdlaWdodDogJyArIHYud2VpZ2h0XG4gICAgICAgICAgICBpZiAodi5jb250ZXh0ICYmIHYuY29udGV4dC51dG0gJiYgdi5jb250ZXh0LnV0bS51dG1fc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbGluZSArPSAnLCBVVE06ICcgKyB2LmNvbnRleHQudXRtLnV0bV9zb3VyY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBoaXN0b3J5ICh1c2VmdWwgZm9yIHRlc3Rpbmcgb3IgdXNlciByZXF1ZXN0KVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNsZWFyIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xlYXJIaXN0b3J5KCkge1xuICAgICAgICBpZiAoIWlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkpIHJldHVybiBmYWxzZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBQdWJsaWMgQVBJXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgdmFyIEx1YVdlaWdodGVkSGlzdG9yeSA9IHtcbiAgICAgICAgLy8gQ29yZSBmdW5jdGlvbnNcbiAgICAgICAgZ2V0SGlzdG9yeTogZ2V0SGlzdG9yeSxcbiAgICAgICAgcmVjb3JkVmlzaXQ6IHJlY29yZFZpc2l0LFxuICAgICAgICBnZXRVc2VySWQ6IGdldFVzZXJJZCxcbiAgICAgICAgaXNSZXR1cm5pbmdVc2VyOiBpc1JldHVybmluZ1VzZXIsXG4gICAgICAgIGdldExhc3RWaXNpdDogZ2V0TGFzdFZpc2l0LFxuICAgICAgICBjbGVhckhpc3Rvcnk6IGNsZWFySGlzdG9yeSxcblxuICAgICAgICAvLyBXZWlnaHRlZCBjb250ZXh0XG4gICAgICAgIGNhbGN1bGF0ZVdlaWdodDogY2FsY3VsYXRlV2VpZ2h0LFxuICAgICAgICBidWlsZFdlaWdodGVkQ29udGV4dDogYnVpbGRXZWlnaHRlZENvbnRleHQsXG4gICAgICAgIGFnZ3JlZ2F0ZVByZWZlcmVuY2VzOiBhZ2dyZWdhdGVQcmVmZXJlbmNlcyxcbiAgICAgICAgZm9ybWF0Rm9yUHJvbXB0OiBmb3JtYXRGb3JQcm9tcHQsXG5cbiAgICAgICAgLy8gVXRpbGl0aWVzXG4gICAgICAgIGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlOiBpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSxcbiAgICAgICAgZ2VuZXJhdGVVVUlEOiBnZW5lcmF0ZVVVSUQsXG5cbiAgICAgICAgLy8gQ29uc3RhbnRzXG4gICAgICAgIFNUT1JBR0VfS0VZOiBTVE9SQUdFX0tFWSxcbiAgICAgICAgREVGQVVMVF9ERUNBWV9SQVRFOiBERUZBVUxUX0RFQ0FZX1JBVEUsXG4gICAgICAgIERFRkFVTFRfTUFYX0hJU1RPUlk6IERFRkFVTFRfTUFYX0hJU1RPUllcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBnbG9iYWxseVxuICAgIHJvb3QuTHVhV2VpZ2h0ZWRIaXN0b3J5ID0gTHVhV2VpZ2h0ZWRIaXN0b3J5XG5cbn0pKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0aGlzKVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQyxDQUFDLFVBQVVBLElBQUksRUFBRTtFQUNkLFlBQVk7O0VBRVo7RUFDQTtFQUNBO0VBRUEsSUFBSUMsV0FBVyxHQUFHLHlCQUF5QjtFQUMzQyxJQUFJQyxrQkFBa0IsR0FBRyxHQUFHO0VBQzVCLElBQUlDLG1CQUFtQixHQUFHLEVBQUU7RUFDNUIsSUFBSUMsb0JBQW9CLEdBQUcsQ0FBQztFQUM1QixJQUFJQyxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTs7RUFFcEM7RUFDQTtFQUNBOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxTQUFTQyxZQUFZQSxDQUFBLEVBQUc7SUFDcEIsSUFBSTtNQUNBLElBQUksT0FBT0MsTUFBTSxLQUFLLFdBQVcsSUFBSUEsTUFBTSxDQUFDQyxlQUFlLEVBQUU7UUFDekQsSUFBSUMs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
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ // NOTE: use a module
8
+ var _default = exports.default = function _default() {
9
+ return {
10
+ type: 'browserCookie',
11
+ /*eslint-disable */
12
+ get: function get(key) {
13
+ return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
14
+ },
15
+ set: function set(key, val) {
16
+ var expirationDate = new Date('12/31/9999').toUTCString();
17
+ document.cookie = "".concat(encodeURIComponent(key), "=").concat(encodeURIComponent(val), "; expires=").concat(expirationDate, "; path=/");
18
+ },
19
+ /* eslint-enable */
20
+ isSupported: function isSupported() {
21
+ return typeof document !== 'undefined';
22
+ }
23
+ };
24
+ };
25
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0IiwidHlwZSIsImdldCIsImtleSIsImRlY29kZVVSSUNvbXBvbmVudCIsImRvY3VtZW50IiwiY29va2llIiwicmVwbGFjZSIsIlJlZ0V4cCIsImVuY29kZVVSSUNvbXBvbmVudCIsInNldCIsInZhbCIsImV4cGlyYXRpb25EYXRlIiwiRGF0ZSIsInRvVVRDU3RyaW5nIiwiY29uY2F0IiwiaXNTdXBwb3J0ZWQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmVzL2Jyb3dzZXItY29va2llLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLy8gTk9URTogdXNlIGEgbW9kdWxlXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoe1xuICB0eXBlOiAnYnJvd3NlckNvb2tpZScsXG4gIC8qZXNsaW50LWRpc2FibGUgKi9cbiAgZ2V0OiBrZXkgPT4gZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmNvb2tpZS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoPzooPzpefC4qOylcXFxccypcIiArIGVuY29kZVVSSUNvbXBvbmVudChrZXkpLnJlcGxhY2UoL1tcXC1cXC5cXCtcXCpdL2csIFwiXFxcXCQmXCIpICsgXCJcXFxccypcXFxcPVxcXFxzKihbXjtdKikuKiQpfF4uKiRcIiksIFwiJDFcIikpIHx8IG51bGwsXG4gIHNldDogKGtleSwgdmFsKSA9PiB7XG4gICAgY29uc3QgZXhwaXJhdGlvbkRhdGUgPSBuZXcgRGF0ZSgnMTIvMzEvOTk5OScpLnRvVVRDU3RyaW5nKClcbiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsKX07IGV4cGlyZXM9JHtleHBpcmF0aW9uRGF0ZX07IHBhdGg9L2BcbiAgfSxcbiAgLyogZXNsaW50LWVuYWJsZSAqL1xuICBpc1N1cHBvcnRlZDogKCkgPT4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbn0pXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBO0FBQUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBLENBQUFDLE9BQUEsR0FDZSxTQUFBRixTQUFBO0VBQUEsT0FBTztJQUNwQkcsSUFBSSxFQUFFLGVBQWU7SUFDckI7SUFDQUMsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUVDLEdBQUc7TUFBQSxPQUFJQyxrQkFBa0IsQ0FBQ0MsUUFBUSxDQUFDQyxNQUFNLENBQUNDLE9BQU8sQ0FBQyxJQUFJQyxNQUFNLENBQUMsa0JBQWtCLEdBQUdDLGtCQUFrQixDQUFDTixHQUFHLENBQUMsQ0FBQ0ksT0FBTyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsR0FBRyw2QkFBNkIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSTtJQUFBO0lBQzlMRyxHQUFHLEVBQUUsU0FBTEEsR0FBR0EsQ0FBR1AsR0FBRyxFQUFFUSxHQUFHLEVBQUs7TUFDakIsSUFBTUMsY0FBYyxHQUFHLElBQUlDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7TUFDM0RULFFBQVEsQ0FBQ0MsTUFBTSxNQUFBUyxNQUFBLENBQU1OLGtCQUFrQixDQUFDTixHQUFHLENBQUMsT0FBQVksTUFBQSxDQUFJTixrQkFBa0IsQ0FBQ0UsR0FBRyxDQUFDLGdCQUFBSSxNQUFBLENBQWFILGNBQWMsYUFBVTtJQUM5RyxDQUFDO0lBQ0Q7SUFDQUksV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUE7TUFBQSxPQUFRLE9BQU9YLFFBQVEsS0FBSyxXQUFXO0lBQUE7RUFDcEQsQ0FBQztBQUFBLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = exports.default = function _default() {
8
+ return {
9
+ type: 'local',
10
+ get: function get(key) {
11
+ return localStorage.getItem(key);
12
+ },
13
+ set: function set(key, val) {
14
+ return localStorage.setItem(key, val);
15
+ },
16
+ isSupported: function isSupported() {
17
+ if (typeof localStorage !== 'undefined') return true;
18
+ var uid = new Date();
19
+ try {
20
+ localStorage.setItem(uid, uid);
21
+ localStorage.removeItem(uid);
22
+ return true;
23
+ } catch (e) {
24
+ return false;
25
+ }
26
+ }
27
+ };
28
+ };
29
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmYXVsdCIsInR5cGUiLCJnZXQiLCJrZXkiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic2V0IiwidmFsIiwic2V0SXRlbSIsImlzU3VwcG9ydGVkIiwidWlkIiwiRGF0ZSIsInJlbW92ZUl0ZW0iLCJlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3Jlcy9sb2NhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmV4cG9ydCBkZWZhdWx0ICgpID0+ICh7XG4gIHR5cGU6ICdsb2NhbCcsXG4gIGdldDoga2V5ID0+IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSksXG4gIHNldDogKGtleSwgdmFsKSA9PiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbCksXG4gIGlzU3VwcG9ydGVkOiAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gdHJ1ZVxuICAgIGNvbnN0IHVpZCA9IG5ldyBEYXRlKClcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odWlkLCB1aWQpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh1aWQpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSxcbn0pXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztpQ0FDZSxTQUFBQSxTQUFBO0VBQUEsT0FBTztJQUNwQkMsSUFBSSxFQUFFLE9BQU87SUFDYkMsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUVDLEdBQUc7TUFBQSxPQUFJQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDO0lBQUE7SUFDckNHLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFHSCxHQUFHLEVBQUVJLEdBQUc7TUFBQSxPQUFLSCxZQUFZLENBQUNJLE9BQU8sQ0FBQ0wsR0FBRyxFQUFFSSxHQUFHLENBQUM7SUFBQTtJQUNqREUsV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUEsRUFBUTtNQUNqQixJQUFJLE9BQU9MLFlBQVksS0FBSyxXQUFXLEVBQUUsT0FBTyxJQUFJO01BQ3BELElBQU1NLEdBQUcsR0FBRyxJQUFJQyxJQUFJLENBQUMsQ0FBQztNQUN0QixJQUFJO1FBQ0ZQLFlBQVksQ0FBQ0ksT0FBTyxDQUFDRSxHQUFHLEVBQUVBLEdBQUcsQ0FBQztRQUM5Qk4sWUFBWSxDQUFDUSxVQUFVLENBQUNGLEdBQUcsQ0FBQztRQUM1QixPQUFPLElBQUk7TUFDYixDQUFDLENBQUMsT0FBT0csQ0FBQyxFQUFFO1FBQ1YsT0FBTyxLQUFLO01BQ2Q7SUFDRjtFQUNGLENBQUM7QUFBQSxDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = exports.default = function _default() {
8
+ var store = Object.create(null);
9
+ return {
10
+ type: 'memory',
11
+ get: function get(key) {
12
+ return store[key];
13
+ },
14
+ set: function set(key, val) {
15
+ store[key] = val;
16
+ },
17
+ isSupported: function isSupported() {
18
+ return true;
19
+ }
20
+ };
21
+ };
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmYXVsdCIsInN0b3JlIiwiT2JqZWN0IiwiY3JlYXRlIiwidHlwZSIsImdldCIsImtleSIsInNldCIsInZhbCIsImlzU3VwcG9ydGVkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3Jlcy9tZW1vcnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgZGVmYXVsdCAoKSA9PiB7XG4gIGNvbnN0IHN0b3JlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ21lbW9yeScsXG4gICAgZ2V0OiBrZXkgPT4gc3RvcmVba2V5XSxcbiAgICBzZXQ6IChrZXksIHZhbCkgPT4ge1xuICAgICAgc3RvcmVba2V5XSA9IHZhbFxuICAgIH0sXG4gICAgaXNTdXBwb3J0ZWQ6ICgpID0+IHRydWUsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O2lDQUNlLFNBQUFBLFNBQUEsRUFBTTtFQUNuQixJQUFNQyxLQUFLLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLElBQUksQ0FBQztFQUVqQyxPQUFPO0lBQ0xDLElBQUksRUFBRSxRQUFRO0lBQ2RDLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFFQyxHQUFHO01BQUEsT0FBSUwsS0FBSyxDQUFDSyxHQUFHLENBQUM7SUFBQTtJQUN0QkMsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUdELEdBQUcsRUFBRUUsR0FBRyxFQUFLO01BQ2pCUCxLQUFLLENBQUNLLEdBQUcsQ0FBQyxHQUFHRSxHQUFHO0lBQ2xCLENBQUM7SUFDREMsV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUE7TUFBQSxPQUFRLElBQUk7SUFBQTtFQUN6QixDQUFDO0FBQ0gsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.validateStore = exports.rand = exports.getRandomAssignment = exports.getDefaultBucket = exports.chooseWeightedItem = void 0;
7
+ var rand = exports.rand = function rand(min, max) {
8
+ return Math.random() * (max - min) + min;
9
+ };
10
+
11
+ // choose a random value with the specified weights
12
+ var chooseWeightedItem = exports.chooseWeightedItem = function chooseWeightedItem(names, weights) {
13
+ if (names.length !== weights.length) throw new Error('names and weights must have equal length!');
14
+ var sum = weights.reduce(function (a, b) {
15
+ return a + b;
16
+ }, 0);
17
+ var limit = 0;
18
+ var n = rand(0, sum);
19
+ for (var i = 0; i < names.length; i++) {
20
+ limit += weights[i];
21
+ if (n <= limit) return names[i];
22
+ }
23
+ // by default, return the last weight
24
+ return names[names.length - 1];
25
+ };
26
+
27
+ // get the default bucket,
28
+ // which is either the default/winner,
29
+ // otherwise whichever is returned first
30
+ var getDefaultBucket = exports.getDefaultBucket = function getDefaultBucket(buckets) {
31
+ var defaultBuckets = Object.keys(buckets).filter(function (name) {
32
+ var x = buckets[name];
33
+ return x.default || x.winner;
34
+ });
35
+ return defaultBuckets[0] || Object.keys(buckets)[0];
36
+ };
37
+ var validateStore = exports.validateStore = function validateStore(store) {
38
+ if (!store) throw new Error('You must supply a store!');
39
+ if (typeof store.get !== 'function') throw new Error('The store must implement .get()');
40
+ if (typeof store.set !== 'function') throw new Error('The store must implement .set()');
41
+ if (typeof store.isSupported !== 'function') throw new Error('The store must implement .isSupported()');
42
+ if (!store.isSupported()) throw new Error('The store is not supported.');
43
+ };
44
+ var getRandomAssignment = exports.getRandomAssignment = function getRandomAssignment(test) {
45
+ var names = Object.keys(test.buckets);
46
+ var weights = [];
47
+ names.forEach(function (innerBucketName) {
48
+ var weight = test.buckets[innerBucketName].weight;
49
+ if (weight == null) weight = 1;
50
+ weights.push(weight);
51
+ });
52
+ return chooseWeightedItem(names, weights);
53
+ };
54
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyYW5kIiwiZXhwb3J0cyIsIm1pbiIsIm1heCIsIk1hdGgiLCJyYW5kb20iLCJjaG9vc2VXZWlnaHRlZEl0ZW0iLCJuYW1lcyIsIndlaWdodHMiLCJsZW5ndGgiLCJFcnJvciIsInN1bSIsInJlZHVjZSIsImEiLCJiIiwibGltaXQiLCJuIiwiaSIsImdldERlZmF1bHRCdWNrZXQiLCJidWNrZXRzIiwiZGVmYXVsdEJ1Y2tldHMiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwibmFtZSIsIngiLCJkZWZhdWx0Iiwid2lubmVyIiwidmFsaWRhdGVTdG9yZSIsInN0b3JlIiwiZ2V0Iiwic2V0IiwiaXNTdXBwb3J0ZWQiLCJnZXRSYW5kb21Bc3NpZ25tZW50IiwidGVzdCIsImZvckVhY2giLCJpbm5lckJ1Y2tldE5hbWUiLCJ3ZWlnaHQiLCJwdXNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGNvbnN0IHJhbmQgPSAobWluLCBtYXgpID0+IChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluXG5cbi8vIGNob29zZSBhIHJhbmRvbSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2VpZ2h0c1xuZXhwb3J0IGNvbnN0IGNob29zZVdlaWdodGVkSXRlbSA9IChuYW1lcywgd2VpZ2h0cykgPT4ge1xuICBpZiAobmFtZXMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCduYW1lcyBhbmQgd2VpZ2h0cyBtdXN0IGhhdmUgZXF1YWwgbGVuZ3RoIScpXG4gIGNvbnN0IHN1bSA9IHdlaWdodHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMClcbiAgbGV0IGxpbWl0ID0gMFxuICBjb25zdCBuID0gcmFuZCgwLCBzdW0pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsaW1pdCArPSB3ZWlnaHRzW2ldXG4gICAgaWYgKG4gPD0gbGltaXQpIHJldHVybiBuYW1lc1tpXVxuICB9XG4gIC8vIGJ5IGRlZmF1bHQsIHJldHVybiB0aGUgbGFzdCB3ZWlnaHRcbiAgcmV0dXJuIG5hbWVzW25hbWVzLmxlbmd0aCAtIDFdXG59XG5cbi8vIGdldCB0aGUgZGVmYXVsdCBidWNrZXQsXG4vLyB3aGljaCBpcyBlaXRoZXIgdGhlIGRlZmF1bHQvd2lubmVyLFxuLy8gb3RoZXJ3aXNlIHdoaWNoZXZlciBpcyByZXR1cm5lZCBmaXJzdFxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRCdWNrZXQgPSAoYnVja2V0cykgPT4ge1xuICBjb25zdCBkZWZhdWx0QnVja2V0cyA9IE9iamVjdC5rZXlzKGJ1Y2tldHMpLmZpbHRlcigobmFtZSkgPT4ge1xuICAgIGNvbnN0IHggPSBidWNrZXRzW25hbWVdXG4gICAgcmV0dXJuIHguZGVmYXVsdCB8fCB4Lndpbm5lclxuICB9KVxuICByZXR1cm4gZGVmYXVsdEJ1Y2tldHNbMF0gfHwgT2JqZWN0LmtleXMoYnVja2V0cylbMF1cbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlU3RvcmUgPSAoc3RvcmUpID0+IHtcbiAgaWYgKCFzdG9yZSkgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSBzdG9yZSEnKVxuICBpZiAodHlwZW9mIHN0b3JlLmdldCAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3RvcmUgbXVzdCBpbXBsZW1lbnQgLmdldCgpJylcbiAgaWYgKHR5cGVvZiBzdG9yZS5zZXQgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignVGhlIHN0b3JlIG11c3QgaW1wbGVtZW50IC5zZXQoKScpXG4gIGlmICh0eXBlb2Ygc3RvcmUuaXNTdXBwb3J0ZWQgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignVGhlIHN0b3JlIG11c3QgaW1wbGVtZW50IC5pc1N1cHBvcnRlZCgpJylcbiAgaWYgKCFzdG9yZS5pc1N1cHBvcnRlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzdG9yZSBpcyBub3Qgc3VwcG9ydGVkLicpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRSYW5kb21Bc3NpZ25tZW50ID0gKHRlc3QpID0+IHtcbiAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyh0ZXN0LmJ1Y2tldHMpXG4gIGNvbnN0IHdlaWdodHMgPSBbXVxuXG4gIG5hbWVzLmZvckVhY2goKGlubmVyQnVja2V0TmFtZSkgPT4ge1xuICAgIGxldCB3ZWlnaHQgPSB0ZXN0LmJ1Y2tldHNbaW5uZXJCdWNrZXROYW1lXS53ZWlnaHRcbiAgICBpZiAod2VpZ2h0ID09IG51bGwpIHdlaWdodCA9IDFcbiAgICB3ZWlnaHRzLnB1c2god2VpZ2h0KVxuICB9KVxuXG4gIHJldHVybiBjaG9vc2VXZWlnaHRlZEl0ZW0obmFtZXMsIHdlaWdodHMpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNPLElBQU1BLElBQUksR0FBQUMsT0FBQSxDQUFBRCxJQUFBLEdBQUcsU0FBUEEsSUFBSUEsQ0FBSUUsR0FBRyxFQUFFQyxHQUFHO0VBQUEsT0FBTUMsSUFBSSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxJQUFJRixHQUFHLEdBQUdELEdBQUcsQ0FBQyxHQUFJQSxHQUFHO0FBQUE7O0FBRXJFO0FBQ08sSUFBTUksa0JBQWtCLEdBQUFMLE9BQUEsQ0FBQUssa0JBQUEsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFJQyxLQUFLLEVBQUVDLE9BQU8sRUFBSztFQUNwRCxJQUFJRCxLQUFLLENBQUNFLE1BQU0sS0FBS0QsT0FBTyxDQUFDQyxNQUFNLEVBQUUsTUFBTSxJQUFJQyxLQUFLLENBQUMsMkNBQTJDLENBQUM7RUFDakcsSUFBTUMsR0FBRyxHQUFHSCxPQUFPLENBQUNJLE1BQU0sQ0FBQyxVQUFDQyxDQUFDLEVBQUVDLENBQUM7SUFBQSxPQUFLRCxDQUFDLEdBQUdDLENBQUM7RUFBQSxHQUFFLENBQUMsQ0FBQztFQUM5QyxJQUFJQyxLQUFLLEdBQUcsQ0FBQztFQUNiLElBQU1DLENBQUMsR0FBR2hCLElBQUksQ0FBQyxDQUFD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