@oila/0account 3.4.3 → 3.4.5

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 (94) hide show
  1. package/LICENSE +1 -1
  2. package/dist/cjs/index-1e526aba.js +1645 -0
  3. package/dist/cjs/index-1e526aba.js.map +1 -0
  4. package/dist/cjs/index.cjs.js +4 -0
  5. package/dist/cjs/index.cjs.js.map +1 -0
  6. package/dist/cjs/loader.cjs.js +15 -0
  7. package/dist/cjs/loader.cjs.js.map +1 -0
  8. package/dist/cjs/qr-code_2.cjs.entry.js +2472 -0
  9. package/dist/cjs/qr-code_2.cjs.entry.js.map +1 -0
  10. package/dist/cjs/zero-account.cjs.js +25 -0
  11. package/dist/cjs/zero-account.cjs.js.map +1 -0
  12. package/dist/collection/collection-manifest.json +13 -0
  13. package/dist/collection/components/zero-account/enums.js +18 -0
  14. package/dist/collection/components/zero-account/enums.js.map +1 -0
  15. package/dist/collection/components/zero-account/logo.js +6 -0
  16. package/dist/collection/components/zero-account/logo.js.map +1 -0
  17. package/dist/collection/components/zero-account/qrcode.js +111 -0
  18. package/dist/collection/components/zero-account/qrcode.js.map +1 -0
  19. package/dist/collection/components/zero-account/websocket.js +174 -0
  20. package/dist/collection/components/zero-account/websocket.js.map +1 -0
  21. package/dist/collection/components/zero-account/zero-account.css +287 -0
  22. package/dist/collection/components/zero-account/zero-account.e2e.js +26 -0
  23. package/dist/collection/components/zero-account/zero-account.e2e.js.map +1 -0
  24. package/dist/collection/components/zero-account/zero-account.js +457 -0
  25. package/dist/collection/components/zero-account/zero-account.js.map +1 -0
  26. package/dist/collection/components/zero-account/zero-account.spec.js +35 -0
  27. package/dist/collection/components/zero-account/zero-account.spec.js.map +1 -0
  28. package/dist/collection/index.js +2 -0
  29. package/dist/collection/index.js.map +1 -0
  30. package/dist/collection/utils/qrcode/qrcode.js +1007 -0
  31. package/dist/collection/utils/request.js +38 -0
  32. package/dist/collection/utils/request.js.map +1 -0
  33. package/dist/collection/utils/url.js +43 -0
  34. package/dist/collection/utils/utils.js +16 -0
  35. package/dist/collection/utils/utils.js.map +1 -0
  36. package/dist/collection/utils/utils.spec.js +10 -0
  37. package/dist/collection/utils/utils.spec.js.map +1 -0
  38. package/dist/components/index.d.ts +27 -0
  39. package/dist/components/index.js +3 -0
  40. package/dist/components/index.js.map +1 -0
  41. package/dist/components/qr-code.d.ts +11 -0
  42. package/dist/components/qr-code.js +8 -0
  43. package/dist/components/qr-code.js.map +1 -0
  44. package/dist/components/qrcode.js +1073 -0
  45. package/dist/components/qrcode.js.map +1 -0
  46. package/dist/components/zero-account.d.ts +11 -0
  47. package/dist/components/zero-account.js +1460 -0
  48. package/dist/components/zero-account.js.map +1 -0
  49. package/dist/esm/index-09024c20.js +1616 -0
  50. package/dist/esm/index-09024c20.js.map +1 -0
  51. package/dist/esm/index.js +3 -0
  52. package/dist/esm/index.js.map +1 -0
  53. package/dist/esm/loader.js +11 -0
  54. package/dist/esm/loader.js.map +1 -0
  55. package/dist/esm/polyfills/core-js.js +11 -0
  56. package/dist/esm/polyfills/dom.js +79 -0
  57. package/dist/esm/polyfills/es5-html-element.js +1 -0
  58. package/dist/esm/polyfills/index.js +34 -0
  59. package/dist/esm/polyfills/system.js +6 -0
  60. package/dist/esm/qr-code_2.entry.js +2467 -0
  61. package/dist/esm/qr-code_2.entry.js.map +1 -0
  62. package/dist/esm/zero-account.js +20 -0
  63. package/dist/esm/zero-account.js.map +1 -0
  64. package/dist/index.cjs.js +1 -0
  65. package/dist/index.js +1 -0
  66. package/dist/types/components/zero-account/enums.d.ts +14 -0
  67. package/dist/types/components/zero-account/logo.d.ts +5 -0
  68. package/dist/types/components/zero-account/qrcode.d.ts +8 -0
  69. package/dist/types/components/zero-account/websocket.d.ts +31 -0
  70. package/dist/types/components/zero-account/zero-account.d.ts +45 -0
  71. package/dist/types/components.d.ts +88 -0
  72. package/dist/types/index.d.ts +1 -0
  73. package/dist/types/stencil-public-runtime.d.ts +1640 -0
  74. package/dist/types/utils/request.d.ts +10 -0
  75. package/dist/types/utils/utils.d.ts +7 -0
  76. package/dist/zero-account/index.esm.js +2 -0
  77. package/dist/zero-account/index.esm.js.map +1 -0
  78. package/dist/zero-account/p-21f4994d.js +3 -0
  79. package/dist/zero-account/p-21f4994d.js.map +1 -0
  80. package/dist/zero-account/p-9a90a04d.entry.js +2 -0
  81. package/dist/zero-account/p-9a90a04d.entry.js.map +1 -0
  82. package/dist/zero-account/zero-account.esm.js +2 -0
  83. package/dist/zero-account/zero-account.esm.js.map +1 -0
  84. package/loader/cdn.js +3 -0
  85. package/loader/index.cjs.js +3 -0
  86. package/loader/index.d.ts +21 -0
  87. package/loader/index.es2017.js +3 -0
  88. package/loader/index.js +4 -0
  89. package/loader/package.json +11 -0
  90. package/package.json +33 -40
  91. package/readme.md +75 -0
  92. package/0account.d.ts +0 -24
  93. package/README.md +0 -3
  94. package/dist/0account.js +0 -1
@@ -0,0 +1,1460 @@
1
+ import { Build, h, proxyCustomElement, HTMLElement, Host } from '@stencil/core/internal/client';
2
+ import { E as Environment, a as ErrorCorrectionLevel, T as ThemePreset, d as defineCustomElement$2 } from './qrcode.js';
3
+
4
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
5
+
6
+ function createCommonjsModule(fn, basedir, module) {
7
+ return module = {
8
+ path: basedir,
9
+ exports: {},
10
+ require: function (path, base) {
11
+ return commonjsRequire();
12
+ }
13
+ }, fn(module, module.exports), module.exports;
14
+ }
15
+
16
+ function commonjsRequire () {
17
+ throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
18
+ }
19
+
20
+ var uaParser = createCommonjsModule(function (module, exports) {
21
+ /////////////////////////////////////////////////////////////////////////////////
22
+ /* UAParser.js v1.0.35
23
+ Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
24
+ MIT License *//*
25
+ Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
26
+ Supports browser & node.js environment.
27
+ Demo : https://faisalman.github.io/ua-parser-js
28
+ Source : https://github.com/faisalman/ua-parser-js */
29
+ /////////////////////////////////////////////////////////////////////////////////
30
+
31
+ (function (window, undefined$1) {
32
+
33
+ //////////////
34
+ // Constants
35
+ /////////////
36
+
37
+
38
+ var LIBVERSION = '1.0.35',
39
+ EMPTY = '',
40
+ UNKNOWN = '?',
41
+ FUNC_TYPE = 'function',
42
+ UNDEF_TYPE = 'undefined',
43
+ OBJ_TYPE = 'object',
44
+ STR_TYPE = 'string',
45
+ MAJOR = 'major',
46
+ MODEL = 'model',
47
+ NAME = 'name',
48
+ TYPE = 'type',
49
+ VENDOR = 'vendor',
50
+ VERSION = 'version',
51
+ ARCHITECTURE= 'architecture',
52
+ CONSOLE = 'console',
53
+ MOBILE = 'mobile',
54
+ TABLET = 'tablet',
55
+ SMARTTV = 'smarttv',
56
+ WEARABLE = 'wearable',
57
+ EMBEDDED = 'embedded',
58
+ UA_MAX_LENGTH = 350;
59
+
60
+ var AMAZON = 'Amazon',
61
+ APPLE = 'Apple',
62
+ ASUS = 'ASUS',
63
+ BLACKBERRY = 'BlackBerry',
64
+ BROWSER = 'Browser',
65
+ CHROME = 'Chrome',
66
+ EDGE = 'Edge',
67
+ FIREFOX = 'Firefox',
68
+ GOOGLE = 'Google',
69
+ HUAWEI = 'Huawei',
70
+ LG = 'LG',
71
+ MICROSOFT = 'Microsoft',
72
+ MOTOROLA = 'Motorola',
73
+ OPERA = 'Opera',
74
+ SAMSUNG = 'Samsung',
75
+ SHARP = 'Sharp',
76
+ SONY = 'Sony',
77
+ XIAOMI = 'Xiaomi',
78
+ ZEBRA = 'Zebra',
79
+ FACEBOOK = 'Facebook',
80
+ CHROMIUM_OS = 'Chromium OS',
81
+ MAC_OS = 'Mac OS';
82
+
83
+ ///////////
84
+ // Helper
85
+ //////////
86
+
87
+ var extend = function (regexes, extensions) {
88
+ var mergedRegexes = {};
89
+ for (var i in regexes) {
90
+ if (extensions[i] && extensions[i].length % 2 === 0) {
91
+ mergedRegexes[i] = extensions[i].concat(regexes[i]);
92
+ } else {
93
+ mergedRegexes[i] = regexes[i];
94
+ }
95
+ }
96
+ return mergedRegexes;
97
+ },
98
+ enumerize = function (arr) {
99
+ var enums = {};
100
+ for (var i=0; i<arr.length; i++) {
101
+ enums[arr[i].toUpperCase()] = arr[i];
102
+ }
103
+ return enums;
104
+ },
105
+ has = function (str1, str2) {
106
+ return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
107
+ },
108
+ lowerize = function (str) {
109
+ return str.toLowerCase();
110
+ },
111
+ majorize = function (version) {
112
+ return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split('.')[0] : undefined$1;
113
+ },
114
+ trim = function (str, len) {
115
+ if (typeof(str) === STR_TYPE) {
116
+ str = str.replace(/^\s\s*/, EMPTY);
117
+ return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
118
+ }
119
+ };
120
+
121
+ ///////////////
122
+ // Map helper
123
+ //////////////
124
+
125
+ var rgxMapper = function (ua, arrays) {
126
+
127
+ var i = 0, j, k, p, q, matches, match;
128
+
129
+ // loop through all regexes maps
130
+ while (i < arrays.length && !matches) {
131
+
132
+ var regex = arrays[i], // even sequence (0,2,4,..)
133
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
134
+ j = k = 0;
135
+
136
+ // try matching uastring with regexes
137
+ while (j < regex.length && !matches) {
138
+
139
+ if (!regex[j]) { break; }
140
+ matches = regex[j++].exec(ua);
141
+
142
+ if (!!matches) {
143
+ for (p = 0; p < props.length; p++) {
144
+ match = matches[++k];
145
+ q = props[p];
146
+ // check if given property is actually array
147
+ if (typeof q === OBJ_TYPE && q.length > 0) {
148
+ if (q.length === 2) {
149
+ if (typeof q[1] == FUNC_TYPE) {
150
+ // assign modified match
151
+ this[q[0]] = q[1].call(this, match);
152
+ } else {
153
+ // assign given value, ignore regex match
154
+ this[q[0]] = q[1];
155
+ }
156
+ } else if (q.length === 3) {
157
+ // check whether function or regex
158
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
159
+ // call function (usually string mapper)
160
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined$1;
161
+ } else {
162
+ // sanitize match using given regex
163
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined$1;
164
+ }
165
+ } else if (q.length === 4) {
166
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined$1;
167
+ }
168
+ } else {
169
+ this[q] = match ? match : undefined$1;
170
+ }
171
+ }
172
+ }
173
+ }
174
+ i += 2;
175
+ }
176
+ },
177
+
178
+ strMapper = function (str, map) {
179
+
180
+ for (var i in map) {
181
+ // check if current value is array
182
+ if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
183
+ for (var j = 0; j < map[i].length; j++) {
184
+ if (has(map[i][j], str)) {
185
+ return (i === UNKNOWN) ? undefined$1 : i;
186
+ }
187
+ }
188
+ } else if (has(map[i], str)) {
189
+ return (i === UNKNOWN) ? undefined$1 : i;
190
+ }
191
+ }
192
+ return str;
193
+ };
194
+
195
+ ///////////////
196
+ // String map
197
+ //////////////
198
+
199
+ // Safari < 3.0
200
+ var oldSafariMap = {
201
+ '1.0' : '/8',
202
+ '1.2' : '/1',
203
+ '1.3' : '/3',
204
+ '2.0' : '/412',
205
+ '2.0.2' : '/416',
206
+ '2.0.3' : '/417',
207
+ '2.0.4' : '/419',
208
+ '?' : '/'
209
+ },
210
+ windowsVersionMap = {
211
+ 'ME' : '4.90',
212
+ 'NT 3.11' : 'NT3.51',
213
+ 'NT 4.0' : 'NT4.0',
214
+ '2000' : 'NT 5.0',
215
+ 'XP' : ['NT 5.1', 'NT 5.2'],
216
+ 'Vista' : 'NT 6.0',
217
+ '7' : 'NT 6.1',
218
+ '8' : 'NT 6.2',
219
+ '8.1' : 'NT 6.3',
220
+ '10' : ['NT 6.4', 'NT 10.0'],
221
+ 'RT' : 'ARM'
222
+ };
223
+
224
+ //////////////
225
+ // Regex map
226
+ /////////////
227
+
228
+ var regexes = {
229
+
230
+ browser : [[
231
+
232
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
233
+ ], [VERSION, [NAME, 'Chrome']], [
234
+ /edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
235
+ ], [VERSION, [NAME, 'Edge']], [
236
+
237
+ // Presto based
238
+ /(opera mini)\/([-\w\.]+)/i, // Opera Mini
239
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
240
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
241
+ ], [NAME, VERSION], [
242
+ /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
243
+ ], [VERSION, [NAME, OPERA+' Mini']], [
244
+ /\bopr\/([\w\.]+)/i // Opera Webkit
245
+ ], [VERSION, [NAME, OPERA]], [
246
+
247
+ // Mixed
248
+ /(kindle)\/([\w\.]+)/i, // Kindle
249
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer
250
+ // Trident based
251
+ /(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
252
+ /(ba?idubrowser)[\/ ]?([\w\.]+)/i, // Baidu Browser
253
+ /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
254
+
255
+ // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
256
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,
257
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
258
+ /(heytap|ovi)browser\/([\d\.]+)/i, // Heytap/Ovi
259
+ /(weibo)__([\d\.]+)/i // Weibo
260
+ ], [NAME, VERSION], [
261
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
262
+ ], [VERSION, [NAME, 'UC'+BROWSER]], [
263
+ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
264
+ /\bqbcore\/([\w\.]+).+microm/i
265
+ ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
266
+ /micromessenger\/([\w\.]+)/i // WeChat
267
+ ], [VERSION, [NAME, 'WeChat']], [
268
+ /konqueror\/([\w\.]+)/i // Konqueror
269
+ ], [VERSION, [NAME, 'Konqueror']], [
270
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
271
+ ], [VERSION, [NAME, 'IE']], [
272
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
273
+ ], [VERSION, [NAME, 'Yandex']], [
274
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
275
+ ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [
276
+ /\bfocus\/([\w\.]+)/i // Firefox Focus
277
+ ], [VERSION, [NAME, FIREFOX+' Focus']], [
278
+ /\bopt\/([\w\.]+)/i // Opera Touch
279
+ ], [VERSION, [NAME, OPERA+' Touch']], [
280
+ /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
281
+ ], [VERSION, [NAME, 'Coc Coc']], [
282
+ /dolfin\/([\w\.]+)/i // Dolphin
283
+ ], [VERSION, [NAME, 'Dolphin']], [
284
+ /coast\/([\w\.]+)/i // Opera Coast
285
+ ], [VERSION, [NAME, OPERA+' Coast']], [
286
+ /miuibrowser\/([\w\.]+)/i // MIUI Browser
287
+ ], [VERSION, [NAME, 'MIUI '+BROWSER]], [
288
+ /fxios\/([-\w\.]+)/i // Firefox for iOS
289
+ ], [VERSION, [NAME, FIREFOX]], [
290
+ /\bqihu|(qi?ho?o?|360)browser/i // 360
291
+ ], [[NAME, '360 '+BROWSER]], [
292
+ /(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i
293
+ ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser
294
+ /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
295
+ ], [[NAME, /_/g, ' '], VERSION], [
296
+ /(electron)\/([\w\.]+) safari/i, // Electron-based App
297
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
298
+ /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
299
+ ], [NAME, VERSION], [
300
+ /(metasr)[\/ ]?([\w\.]+)/i, // SouGouBrowser
301
+ /(lbbrowser)/i, // LieBao Browser
302
+ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
303
+ ], [NAME], [
304
+
305
+ // WebView
306
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
307
+ ], [[NAME, FACEBOOK], VERSION], [
308
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
309
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
310
+ /safari (line)\/([\w\.]+)/i, // Line App for iOS
311
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
312
+ /(chromium|instagram)[\/ ]([-\w\.]+)/i // Chromium/Instagram
313
+ ], [NAME, VERSION], [
314
+ /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
315
+ ], [VERSION, [NAME, 'GSA']], [
316
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
317
+ ], [VERSION, [NAME, 'TikTok']], [
318
+
319
+ /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
320
+ ], [VERSION, [NAME, CHROME+' Headless']], [
321
+
322
+ / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
323
+ ], [[NAME, CHROME+' WebView'], VERSION], [
324
+
325
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
326
+ ], [VERSION, [NAME, 'Android '+BROWSER]], [
327
+
328
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
329
+ ], [NAME, VERSION], [
330
+
331
+ /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari
332
+ ], [VERSION, [NAME, 'Mobile Safari']], [
333
+ /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
334
+ ], [VERSION, NAME], [
335
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
336
+ ], [NAME, [VERSION, strMapper, oldSafariMap]], [
337
+
338
+ /(webkit|khtml)\/([\w\.]+)/i
339
+ ], [NAME, VERSION], [
340
+
341
+ // Gecko based
342
+ /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
343
+ ], [[NAME, 'Netscape'], VERSION], [
344
+ /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
345
+ ], [VERSION, [NAME, FIREFOX+' Reality']], [
346
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
347
+ /(swiftfox)/i, // Swiftfox
348
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,
349
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar
350
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
351
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
352
+ /(firefox)\/([\w\.]+)/i, // Other Firefox-based
353
+ /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
354
+
355
+ // Other
356
+ /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
357
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser
358
+ /(links) \(([\w\.]+)/i, // Links
359
+ /panasonic;(viera)/i // Panasonic Viera
360
+ ], [NAME, VERSION], [
361
+
362
+ /(cobalt)\/([\w\.]+)/i // Cobalt
363
+ ], [NAME, [VERSION, /master.|lts./, ""]]
364
+ ],
365
+
366
+ cpu : [[
367
+
368
+ /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i // AMD64 (x64)
369
+ ], [[ARCHITECTURE, 'amd64']], [
370
+
371
+ /(ia32(?=;))/i // IA32 (quicktime)
372
+ ], [[ARCHITECTURE, lowerize]], [
373
+
374
+ /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
375
+ ], [[ARCHITECTURE, 'ia32']], [
376
+
377
+ /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
378
+ ], [[ARCHITECTURE, 'arm64']], [
379
+
380
+ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
381
+ ], [[ARCHITECTURE, 'armhf']], [
382
+
383
+ // PocketPC mistakenly identified as PowerPC
384
+ /windows (ce|mobile); ppc;/i
385
+ ], [[ARCHITECTURE, 'arm']], [
386
+
387
+ /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
388
+ ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
389
+
390
+ /(sun4\w)[;\)]/i // SPARC
391
+ ], [[ARCHITECTURE, 'sparc']], [
392
+
393
+ /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
394
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
395
+ ], [[ARCHITECTURE, lowerize]]
396
+ ],
397
+
398
+ device : [[
399
+
400
+ //////////////////////////
401
+ // MOBILES & TABLETS
402
+ /////////////////////////
403
+
404
+ // Samsung
405
+ /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
406
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
407
+ /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
408
+ /samsung[- ]([-\w]+)/i,
409
+ /sec-(sgh\w+)/i
410
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
411
+
412
+ // Apple
413
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
414
+ ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
415
+ /\((ipad);[-\w\),; ]+apple/i, // iPad
416
+ /applecoremedia\/[\w\.]+ \((ipad)/i,
417
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
418
+ ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
419
+ /(macintosh);/i
420
+ ], [MODEL, [VENDOR, APPLE]], [
421
+
422
+ // Sharp
423
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
424
+ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
425
+
426
+ // Huawei
427
+ /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
428
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
429
+ /(?:huawei|honor)([-\w ]+)[;\)]/i,
430
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
431
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
432
+
433
+ // Xiaomi
434
+ /\b(poco[\w ]+)(?: bui|\))/i, // Xiaomi POCO
435
+ /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
436
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
437
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
438
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
439
+ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
440
+ /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
441
+ ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
442
+
443
+ // OPPO
444
+ /; (\w+) bui.+ oppo/i,
445
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
446
+ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
447
+
448
+ // Vivo
449
+ /vivo (\w+)(?: bui|\))/i,
450
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
451
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
452
+
453
+ // Realme
454
+ /\b(rmx[12]\d{3})(?: bui|;|\))/i
455
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
456
+
457
+ // Motorola
458
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
459
+ /\bmot(?:orola)?[- ](\w*)/i,
460
+ /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
461
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
462
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
463
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
464
+
465
+ // LG
466
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
467
+ ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
468
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
469
+ /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
470
+ /\blg-?([\d\w]+) bui/i
471
+ ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
472
+
473
+ // Lenovo
474
+ /(ideatab[-\w ]+)/i,
475
+ /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
476
+ ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
477
+
478
+ // Nokia
479
+ /(?:maemo|nokia).*(n900|lumia \d+)/i,
480
+ /nokia[-_ ]?([-\w\.]*)/i
481
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
482
+
483
+ // Google
484
+ /(pixel c)\b/i // Google Pixel C
485
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
486
+ /droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel
487
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
488
+
489
+ // Sony
490
+ /droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
491
+ ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
492
+ /sony tablet [ps]/i,
493
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
494
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
495
+
496
+ // OnePlus
497
+ / (kb2005|in20[12]5|be20[12][59])\b/i,
498
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
499
+ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
500
+
501
+ // Amazon
502
+ /(alexa)webm/i,
503
+ /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show
504
+ /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
505
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
506
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
507
+ ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
508
+
509
+ // BlackBerry
510
+ /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
511
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
512
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
513
+ /\(bb10; (\w+)/i // BlackBerry 10
514
+ ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
515
+
516
+ // Asus
517
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
518
+ ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
519
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
520
+ ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
521
+
522
+ // HTC
523
+ /(nexus 9)/i // HTC Nexus 9
524
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
525
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
526
+
527
+ // ZTE
528
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
529
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
530
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
531
+
532
+ // Acer
533
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
534
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
535
+
536
+ // Meizu
537
+ /droid.+; (m[1-5] note) bui/i,
538
+ /\bmz-([-\w]{2,})/i
539
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
540
+
541
+ // MIXED
542
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,
543
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
544
+ /(hp) ([\w ]+\w)/i, // HP iPAQ
545
+ /(asus)-?(\w+)/i, // Asus
546
+ /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
547
+ /(lenovo)[-_ ]?([-\w]+)/i, // Lenovo
548
+ /(jolla)/i, // Jolla
549
+ /(oppo) ?([\w ]+) bui/i // OPPO
550
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
551
+
552
+ /(kobo)\s(ereader|touch)/i, // Kobo
553
+ /(archos) (gamepad2?)/i, // Archos
554
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
555
+ /(kindle)\/([\w\.]+)/i, // Kindle
556
+ /(nook)[\w ]+build\/(\w+)/i, // Nook
557
+ /(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak
558
+ /(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets
559
+ /(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets
560
+ /(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets
561
+ /(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
562
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
563
+
564
+ /(surface duo)/i // Surface Duo
565
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
566
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
567
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
568
+ /(u304aa)/i // AT&T
569
+ ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
570
+ /\bsie-(\w*)/i // Siemens
571
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
572
+ /\b(rct\w+) b/i // RCA Tablets
573
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
574
+ /\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
575
+ ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
576
+ /\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
577
+ ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
578
+ /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
579
+ ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
580
+ /\b(tm\d{3}\w+) b/i
581
+ ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
582
+ /\b(k88) b/i // ZTE K Series Tablet
583
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
584
+ /\b(nx\d{3}j) b/i // ZTE Nubia
585
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
586
+ /\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
587
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
588
+ /\b(zur\d{3}) b/i // Swiss ZUR Tablet
589
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
590
+ /\b((zeki)?tb.*\b) b/i // Zeki Tablets
591
+ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
592
+ /\b([yr]\d{2}) b/i,
593
+ /\b(dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
594
+ ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
595
+ /\b(ns-?\w{0,9}) b/i // Insignia Tablets
596
+ ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
597
+ /\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
598
+ ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
599
+ /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
600
+ ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [
601
+ /\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
602
+ ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
603
+ /\b(ph-1) /i // Essential PH-1
604
+ ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [
605
+ /\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
606
+ ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
607
+ /\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
608
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
609
+ /\btu_(1491) b/i // Rotor Tablets
610
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
611
+ /(shield[\w ]+) b/i // Nvidia Shield Tablets
612
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
613
+ /(sprint) (\w+)/i // Sprint Phones
614
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
615
+ /(kin\.[onetw]{3})/i // Microsoft Kin
616
+ ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
617
+ /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
618
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
619
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
620
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
621
+
622
+ ///////////////////
623
+ // SMARTTVS
624
+ ///////////////////
625
+
626
+ /smart-tv.+(samsung)/i // Samsung
627
+ ], [VENDOR, [TYPE, SMARTTV]], [
628
+ /hbbtv.+maple;(\d+)/i
629
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
630
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i // LG SmartTV
631
+ ], [[VENDOR, LG], [TYPE, SMARTTV]], [
632
+ /(apple) ?tv/i // Apple TV
633
+ ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
634
+ /crkey/i // Google Chromecast
635
+ ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
636
+ /droid.+aft(\w)( bui|\))/i // Fire TV
637
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
638
+ /\(dtv[\);].+(aquos)/i,
639
+ /(aquos-tv[\w ]+)\)/i // Sharp
640
+ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
641
+ /(bravia[\w ]+)( bui|\))/i // Sony
642
+ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
643
+ /(mitv-\w{5}) bui/i // Xiaomi
644
+ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
645
+ /Hbbtv.*(technisat) (.*);/i // TechniSAT
646
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
647
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
648
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
649
+ ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
650
+ /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
651
+ ], [[TYPE, SMARTTV]], [
652
+
653
+ ///////////////////
654
+ // CONSOLES
655
+ ///////////////////
656
+
657
+ /(ouya)/i, // Ouya
658
+ /(nintendo) ([wids3utch]+)/i // Nintendo
659
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
660
+ /droid.+; (shield) bui/i // Nvidia
661
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
662
+ /(playstation [345portablevi]+)/i // Playstation
663
+ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
664
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
665
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
666
+
667
+ ///////////////////
668
+ // WEARABLES
669
+ ///////////////////
670
+
671
+ /((pebble))app/i // Pebble
672
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
673
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
674
+ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
675
+ /droid.+; (glass) \d/i // Google Glass
676
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [
677
+ /droid.+; (wt63?0{2,3})\)/i
678
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
679
+ /(quest( 2| pro)?)/i // Oculus Quest
680
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [
681
+
682
+ ///////////////////
683
+ // EMBEDDED
684
+ ///////////////////
685
+
686
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
687
+ ], [VENDOR, [TYPE, EMBEDDED]], [
688
+ /(aeobc)\b/i // Echo Dot
689
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
690
+
691
+ ////////////////////
692
+ // MIXED (GENERIC)
693
+ ///////////////////
694
+
695
+ /droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
696
+ ], [MODEL, [TYPE, MOBILE]], [
697
+ /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
698
+ ], [MODEL, [TYPE, TABLET]], [
699
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
700
+ ], [[TYPE, TABLET]], [
701
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
702
+ ], [[TYPE, MOBILE]], [
703
+ /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
704
+ ], [MODEL, [VENDOR, 'Generic']]
705
+ ],
706
+
707
+ engine : [[
708
+
709
+ /windows.+ edge\/([\w\.]+)/i // EdgeHTML
710
+ ], [VERSION, [NAME, EDGE+'HTML']], [
711
+
712
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
713
+ ], [VERSION, [NAME, 'Blink']], [
714
+
715
+ /(presto)\/([\w\.]+)/i, // Presto
716
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
717
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
718
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
719
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
720
+ /\b(libweb)/i
721
+ ], [NAME, VERSION], [
722
+
723
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
724
+ ], [VERSION, NAME]
725
+ ],
726
+
727
+ os : [[
728
+
729
+ // Windows
730
+ /microsoft (windows) (vista|xp)/i // Windows (iTunes)
731
+ ], [NAME, VERSION], [
732
+ /(windows) nt 6\.2; (arm)/i, // Windows RT
733
+ /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i, // Windows Phone
734
+ /(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i
735
+ ], [NAME, [VERSION, strMapper, windowsVersionMap]], [
736
+ /(win(?=3|9|n)|win 9x )([nt\d\.]+)/i
737
+ ], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [
738
+
739
+ // iOS/macOS
740
+ /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
741
+ /ios;fbsv\/([\d\.]+)/i,
742
+ /cfnetwork\/.+darwin/i
743
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
744
+ /(mac os x) ?([\w\. ]*)/i,
745
+ /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
746
+ ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [
747
+
748
+ // Mobile OSes
749
+ /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
750
+ ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
751
+ /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
752
+ /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
753
+ /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
754
+ /\((series40);/i // Series 40
755
+ ], [NAME, VERSION], [
756
+ /\(bb(10);/i // BlackBerry 10
757
+ ], [VERSION, [NAME, BLACKBERRY]], [
758
+ /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
759
+ ], [VERSION, [NAME, 'Symbian']], [
760
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
761
+ ], [VERSION, [NAME, FIREFOX+' OS']], [
762
+ /web0s;.+rt(tv)/i,
763
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
764
+ ], [VERSION, [NAME, 'webOS']], [
765
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
766
+ ], [VERSION, [NAME, 'watchOS']], [
767
+
768
+ // Google Chromecast
769
+ /crkey\/([\d\.]+)/i // Google Chromecast
770
+ ], [VERSION, [NAME, CHROME+'cast']], [
771
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
772
+ ], [[NAME, CHROMIUM_OS], VERSION],[
773
+
774
+ // Smart TVs
775
+ /panasonic;(viera)/i, // Panasonic Viera
776
+ /(netrange)mmh/i, // Netrange
777
+ /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
778
+
779
+ // Console
780
+ /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation
781
+ /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
782
+
783
+ // Other
784
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
785
+ /(mint)[\/\(\) ]?(\w*)/i, // Mint
786
+ /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux
787
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
788
+ // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
789
+ /(hurd|linux) ?([\w\.]*)/i, // Hurd/Linux
790
+ /(gnu) ?([\w\.]*)/i, // GNU
791
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
792
+ /(haiku) (\w+)/i // Haiku
793
+ ], [NAME, VERSION], [
794
+ /(sunos) ?([\w\.\d]*)/i // Solaris
795
+ ], [[NAME, 'Solaris'], VERSION], [
796
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
797
+ /(aix) ((\d)(?=\.|\)| )[\w\.])*/i, // AIX
798
+ /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
799
+ /(unix) ?([\w\.]*)/i // UNIX
800
+ ], [NAME, VERSION]
801
+ ]
802
+ };
803
+
804
+ /////////////////
805
+ // Constructor
806
+ ////////////////
807
+
808
+ var UAParser = function (ua, extensions) {
809
+
810
+ if (typeof ua === OBJ_TYPE) {
811
+ extensions = ua;
812
+ ua = undefined$1;
813
+ }
814
+
815
+ if (!(this instanceof UAParser)) {
816
+ return new UAParser(ua, extensions).getResult();
817
+ }
818
+
819
+ var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined$1;
820
+ var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);
821
+ var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined$1;
822
+ var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
823
+ var _isSelfNav = _navigator && _navigator.userAgent == _ua;
824
+
825
+ this.getBrowser = function () {
826
+ var _browser = {};
827
+ _browser[NAME] = undefined$1;
828
+ _browser[VERSION] = undefined$1;
829
+ rgxMapper.call(_browser, _ua, _rgxmap.browser);
830
+ _browser[MAJOR] = majorize(_browser[VERSION]);
831
+ // Brave-specific detection
832
+ if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
833
+ _browser[NAME] = 'Brave';
834
+ }
835
+ return _browser;
836
+ };
837
+ this.getCPU = function () {
838
+ var _cpu = {};
839
+ _cpu[ARCHITECTURE] = undefined$1;
840
+ rgxMapper.call(_cpu, _ua, _rgxmap.cpu);
841
+ return _cpu;
842
+ };
843
+ this.getDevice = function () {
844
+ var _device = {};
845
+ _device[VENDOR] = undefined$1;
846
+ _device[MODEL] = undefined$1;
847
+ _device[TYPE] = undefined$1;
848
+ rgxMapper.call(_device, _ua, _rgxmap.device);
849
+ if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
850
+ _device[TYPE] = MOBILE;
851
+ }
852
+ // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
853
+ if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
854
+ _device[MODEL] = 'iPad';
855
+ _device[TYPE] = TABLET;
856
+ }
857
+ return _device;
858
+ };
859
+ this.getEngine = function () {
860
+ var _engine = {};
861
+ _engine[NAME] = undefined$1;
862
+ _engine[VERSION] = undefined$1;
863
+ rgxMapper.call(_engine, _ua, _rgxmap.engine);
864
+ return _engine;
865
+ };
866
+ this.getOS = function () {
867
+ var _os = {};
868
+ _os[NAME] = undefined$1;
869
+ _os[VERSION] = undefined$1;
870
+ rgxMapper.call(_os, _ua, _rgxmap.os);
871
+ if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {
872
+ _os[NAME] = _uach.platform
873
+ .replace(/chrome os/i, CHROMIUM_OS)
874
+ .replace(/macos/i, MAC_OS); // backward compatibility
875
+ }
876
+ return _os;
877
+ };
878
+ this.getResult = function () {
879
+ return {
880
+ ua : this.getUA(),
881
+ browser : this.getBrowser(),
882
+ engine : this.getEngine(),
883
+ os : this.getOS(),
884
+ device : this.getDevice(),
885
+ cpu : this.getCPU()
886
+ };
887
+ };
888
+ this.getUA = function () {
889
+ return _ua;
890
+ };
891
+ this.setUA = function (ua) {
892
+ _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;
893
+ return this;
894
+ };
895
+ this.setUA(_ua);
896
+ return this;
897
+ };
898
+
899
+ UAParser.VERSION = LIBVERSION;
900
+ UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);
901
+ UAParser.CPU = enumerize([ARCHITECTURE]);
902
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
903
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
904
+
905
+ ///////////
906
+ // Export
907
+ //////////
908
+
909
+ // check js environment
910
+ {
911
+ // nodejs env
912
+ if (module.exports) {
913
+ exports = module.exports = UAParser;
914
+ }
915
+ exports.UAParser = UAParser;
916
+ }
917
+
918
+ // jQuery/Zepto specific (optional)
919
+ // Note:
920
+ // In AMD env the global scope should be kept clean, but jQuery is an exception.
921
+ // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
922
+ // and we should catch that.
923
+ var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);
924
+ if ($ && !$.ua) {
925
+ var parser = new UAParser();
926
+ $.ua = parser.getResult();
927
+ $.ua.get = function () {
928
+ return parser.getUA();
929
+ };
930
+ $.ua.set = function (ua) {
931
+ parser.setUA(ua);
932
+ var result = parser.getResult();
933
+ for (var prop in result) {
934
+ $.ua[prop] = result[prop];
935
+ }
936
+ };
937
+ }
938
+
939
+ })(typeof window === 'object' ? window : commonjsGlobal);
940
+ });
941
+
942
+ // Unique ID creation requires a high quality random # generator. In the browser we therefore
943
+ // require the crypto API and do not support built-in fallback to lower quality random number
944
+ // generators (like Math.random()).
945
+ let getRandomValues;
946
+ const rnds8 = new Uint8Array(16);
947
+ function rng() {
948
+ // lazy load so that environments that need to polyfill have a chance to do so
949
+ if (!getRandomValues) {
950
+ // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
951
+ getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
952
+
953
+ if (!getRandomValues) {
954
+ throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
955
+ }
956
+ }
957
+
958
+ return getRandomValues(rnds8);
959
+ }
960
+
961
+ /**
962
+ * Convert array of 16 byte values to UUID string format of the form:
963
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
964
+ */
965
+
966
+ const byteToHex = [];
967
+
968
+ for (let i = 0; i < 256; ++i) {
969
+ byteToHex.push((i + 0x100).toString(16).slice(1));
970
+ }
971
+
972
+ function unsafeStringify(arr, offset = 0) {
973
+ // Note: Be careful editing this code! It's been tuned for performance
974
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
975
+ return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
976
+ }
977
+
978
+ const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
979
+ const native = {
980
+ randomUUID
981
+ };
982
+
983
+ function v4(options, buf, offset) {
984
+ if (native.randomUUID && !buf && !options) {
985
+ return native.randomUUID();
986
+ }
987
+
988
+ options = options || {};
989
+ const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
990
+
991
+ rnds[6] = rnds[6] & 0x0f | 0x40;
992
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
993
+
994
+ if (buf) {
995
+ offset = offset || 0;
996
+
997
+ for (let i = 0; i < 16; ++i) {
998
+ buf[offset + i] = rnds[i];
999
+ }
1000
+
1001
+ return buf;
1002
+ }
1003
+
1004
+ return unsafeStringify(rnds);
1005
+ }
1006
+
1007
+ class Logger {
1008
+ constructor(environment) {
1009
+ this.log = (...args) => {
1010
+ if (this.environment !== 'production' && Build.isDev) {
1011
+ console.clear();
1012
+ console.log(...args);
1013
+ }
1014
+ };
1015
+ this.environment = environment;
1016
+ }
1017
+ }
1018
+
1019
+ function appendToParams(url, getParamsToUpdate) {
1020
+ if (typeof getParamsToUpdate !== "object") return false;
1021
+
1022
+ // remove consecutive duplicate '&' chars from the url
1023
+ url = url.replace(/(&)\1+/g, '&');
1024
+ //Note: substr(1) removes first character (getting rid of possible "?")
1025
+ // (does nothing with empty string)
1026
+ let getParams = url.substr(1).split('&');
1027
+
1028
+ //avoid extra "&" at the beginning if current document.location.search was empty or 1 char
1029
+ if ((getParams.length < 1) || ((getParams.length === 1) && (getParams[0] === "")))
1030
+ getParams = [];
1031
+
1032
+ let searchBuffer;
1033
+ let found;
1034
+
1035
+ for (let k in getParamsToUpdate) {
1036
+ if (!getParamsToUpdate.hasOwnProperty(k)) continue;
1037
+
1038
+ let key = encodeURIComponent(k);
1039
+ let value = encodeURIComponent(getParamsToUpdate[k]);
1040
+
1041
+ searchBuffer = [];
1042
+ found = false;
1043
+
1044
+ let paramsLength = getParams.length - 1;
1045
+ //from the end to start...
1046
+ for (let i = paramsLength; i >= 0; --i) {
1047
+ searchBuffer = getParams[i].split('=');
1048
+
1049
+ if (searchBuffer[0] === key) {
1050
+ //found key!
1051
+ getParams[i] = key + '=' + value;
1052
+ found = true;
1053
+ break;
1054
+ }
1055
+ }
1056
+
1057
+ if (!found) getParams.push(key + '=' + value);
1058
+ }
1059
+
1060
+ return getParams.join('&');
1061
+ }
1062
+
1063
+ const Logo = ({ className = '', color = '#7263FA' }) => {
1064
+ return (h("svg", { class: className, xmlns: 'http://www.w3.org/2000/svg', fill: 'none', viewBox: '0 0 256 256' },
1065
+ h("g", { fill: color, "clip-path": 'url(#a)' },
1066
+ h("path", { d: 'M128 185h57v57h-57zM128 14h57v57h-57zM71 185h57v57H71zM71 14h57v57H71zM14 71h57v57H14zM185 71h57v57h-57zM71 14v57H14l57-57ZM14 128h57v57H14zM185 128h57v57h-57zM14 185h57v57l-57-57ZM185 14l57 57h-57V14Z' })),
1067
+ h("defs", null,
1068
+ h("clipPath", { id: 'a' },
1069
+ h("path", { fill: '#fff', d: 'M14 14h228v228H14z' })))));
1070
+ };
1071
+
1072
+ const send = (url, opts, request, errorCount) => {
1073
+ let limit = errorCount
1074
+ ? Math.pow(2, errorCount - 1) * opts.startLimit
1075
+ : 0;
1076
+ limit = limit < opts.maxLimit ? limit : opts.maxLimit;
1077
+ const pause = Math.random() * limit;
1078
+ setTimeout(function () {
1079
+ request.open('POST', url, true);
1080
+ for (const k in opts.headers) {
1081
+ if (Object.prototype.hasOwnProperty.call(opts.headers, k)) {
1082
+ request.setRequestHeader(k, opts.headers[k]);
1083
+ }
1084
+ }
1085
+ request.send();
1086
+ }, pause);
1087
+ };
1088
+ const xhr = (url, opts = { startLimit: 100, maxLimit: 3 * 1000, enableWithCredentials: false }, callback) => {
1089
+ let errorCount = 0;
1090
+ const request = new XMLHttpRequest();
1091
+ if (opts.enableWithCredentials)
1092
+ request.withCredentials = true;
1093
+ const retry = () => send(url, opts, request, ++errorCount);
1094
+ request.addEventListener('error', retry);
1095
+ request.addEventListener('timeout', retry);
1096
+ request.addEventListener('load', () => {
1097
+ if (request.status >= 200 && request.status < 300) {
1098
+ return callback(request.responseText);
1099
+ }
1100
+ retry();
1101
+ });
1102
+ send(url, opts, request, errorCount);
1103
+ return request;
1104
+ };
1105
+ const http = {
1106
+ send: xhr,
1107
+ };
1108
+
1109
+ const API_URL = 'wss://ws.0account.com/ws';
1110
+ const API_URL_STAGING = 'wss://staging.ws.0account.com/ws';
1111
+ const PREFIX = '0account';
1112
+ const SESSION_ID = 'session-id';
1113
+ const SESSION_TOKEN = 'session-token';
1114
+ const fromWidgetUUIDUpdated = 'from-widget-uuid-updated';
1115
+ // const fromWidgetAuthenticationStarted = 'from-widget-authentication-started';
1116
+ const fromWidgetEnsureSession = 'from-widget-ensure-session';
1117
+ const toWidgetLogout = 'to-widget-logout';
1118
+ const toWidgetApproved = 'to-widget-approved';
1119
+ const toAnyError = 'to-any-error';
1120
+ // CustomEvents
1121
+ const zeroLogout = '0account-logout';
1122
+ const zeroAuthenticated = '0account-authenticated';
1123
+ // const zeroAuthenticationFailed = '0account-authentication-failed';
1124
+ function debounce(func, timeout = 300) {
1125
+ let timer;
1126
+ return (...args) => {
1127
+ clearTimeout(timer);
1128
+ timer = setTimeout(() => {
1129
+ func.apply(this, args);
1130
+ }, timeout);
1131
+ };
1132
+ }
1133
+ class WS {
1134
+ constructor(appId, opts) {
1135
+ this.wsURL = API_URL;
1136
+ this.callbackURL = API_URL;
1137
+ if (!opts.env)
1138
+ opts.env = Environment.production;
1139
+ this.appId = appId;
1140
+ this.uaParser = opts.uaParser;
1141
+ this.callbackURL = opts.callbackURL;
1142
+ this.updateInterval = opts.updateInterval;
1143
+ this.log = opts.log;
1144
+ if (opts.env !== Environment.production)
1145
+ this.wsURL = API_URL_STAGING;
1146
+ this.init();
1147
+ }
1148
+ deviceInfo() {
1149
+ return {
1150
+ appId: this.appId,
1151
+ browser: this.uaParser.getBrowser().name,
1152
+ os: this.uaParser.getOS().name,
1153
+ // TODO: handle these on backend:
1154
+ // device: `${this.uaParser.getDevice().vendor} ${this.uaParser.getDevice().model}`,
1155
+ // all: this.uaParser.getResult()
1156
+ };
1157
+ }
1158
+ reinit() {
1159
+ const retry = debounce(this.init.bind(this), 1000);
1160
+ retry();
1161
+ }
1162
+ init() {
1163
+ const onopen = (_) => {
1164
+ this.send(fromWidgetEnsureSession, this.deviceInfo());
1165
+ };
1166
+ const onmessage = (event) => {
1167
+ try {
1168
+ const data = JSON.parse(event.data);
1169
+ this.handleMessage(data);
1170
+ }
1171
+ catch (e) {
1172
+ this.log(e);
1173
+ }
1174
+ };
1175
+ const onerror = (_) => {
1176
+ if (this.socket && (this.socket.readyState !== WebSocket.CLOSED
1177
+ && this.socket.readyState !== WebSocket.CLOSING)) {
1178
+ this.socket.close();
1179
+ }
1180
+ };
1181
+ const onclose = (_) => {
1182
+ if (this.socket) {
1183
+ this.socket.removeEventListener('open', onopen);
1184
+ this.socket.removeEventListener('message', onmessage);
1185
+ this.socket.removeEventListener('error', onerror);
1186
+ this.socket.removeEventListener('close', onclose);
1187
+ delete this.socket;
1188
+ }
1189
+ this.reinit();
1190
+ };
1191
+ if (this.socket) {
1192
+ this.socket.removeEventListener('open', onopen);
1193
+ this.socket.removeEventListener('message', onmessage);
1194
+ this.socket.removeEventListener('error', onerror);
1195
+ this.socket.removeEventListener('close', onclose);
1196
+ }
1197
+ this.socket = new WebSocket(this.wsURL);
1198
+ this.socket.addEventListener('open', onopen);
1199
+ this.socket.addEventListener('message', onmessage);
1200
+ this.socket.addEventListener('error', onerror);
1201
+ this.socket.addEventListener('close', onclose);
1202
+ }
1203
+ updateUUID(uuid) {
1204
+ this.uuid = uuid;
1205
+ this.send(fromWidgetUUIDUpdated, this.deviceInfo());
1206
+ }
1207
+ send(action, data) {
1208
+ if (!this.socket || !this.socket.readyState || this.socket.readyState !== WebSocket.OPEN) {
1209
+ const retry = debounce(this.send.bind(this), 1000);
1210
+ return retry();
1211
+ }
1212
+ const msg = {
1213
+ action: action,
1214
+ timeout: `${this.updateInterval}ms`,
1215
+ uuid: this.uuid,
1216
+ appId: `${this.appId}`,
1217
+ message: {},
1218
+ };
1219
+ if (action === fromWidgetEnsureSession) {
1220
+ const sessionId = localStorage.getItem(`${PREFIX}_${SESSION_ID}`);
1221
+ const sessionToken = localStorage.getItem(`${PREFIX}_${SESSION_TOKEN}`);
1222
+ if (!sessionId || !sessionToken)
1223
+ return;
1224
+ msg.sessionId = sessionId;
1225
+ msg.sessionToken = sessionToken;
1226
+ }
1227
+ if (data)
1228
+ msg.message = data;
1229
+ this.socket.send(JSON.stringify(msg));
1230
+ }
1231
+ onZeroAuth() {
1232
+ if (this.request)
1233
+ this.request.abort();
1234
+ this.request = http.send(this.callbackURL, {
1235
+ enableWithCredentials: true,
1236
+ headers: {
1237
+ 'x-0account-uuid': this.uuid,
1238
+ 'x-0account-auth': 'true',
1239
+ },
1240
+ }, (responseText) => {
1241
+ try {
1242
+ const data = JSON.parse(responseText);
1243
+ this.dispatchEventAndWsSend(zeroAuthenticated, data);
1244
+ }
1245
+ catch (err) {
1246
+ this.log(err);
1247
+ }
1248
+ });
1249
+ }
1250
+ handleMessage(msg) {
1251
+ switch (msg.action) {
1252
+ case toWidgetApproved:
1253
+ this.onZeroAuth();
1254
+ localStorage.setItem(`${PREFIX}_${SESSION_ID}`, msg.sessionId);
1255
+ localStorage.setItem(`${PREFIX}_${SESSION_TOKEN}`, msg.message);
1256
+ break;
1257
+ case toWidgetLogout:
1258
+ localStorage.removeItem(`${PREFIX}_${SESSION_ID}`);
1259
+ localStorage.removeItem(`${PREFIX}_${SESSION_TOKEN}`);
1260
+ this.dispatchEvent(zeroLogout);
1261
+ break;
1262
+ case toAnyError:
1263
+ this.log('ws error', msg);
1264
+ break;
1265
+ default:
1266
+ this.log('incorrect action', msg.action, msg);
1267
+ }
1268
+ }
1269
+ dispatchEventAndWsSend(name, data) {
1270
+ this.dispatchEvent(name, data);
1271
+ this.send('from-widget-' + name, data);
1272
+ }
1273
+ dispatchEvent(name, data) {
1274
+ let event = new CustomEvent(name);
1275
+ if (data)
1276
+ event = new CustomEvent(name, { detail: data });
1277
+ document.dispatchEvent(event);
1278
+ }
1279
+ }
1280
+
1281
+ const zeroAccountCss = ":host{--primary-color:#7263FA;--primary-background-color:#FFF;--button-animation-duration:200ms;--text-color:#000;--button-border-color:#B2D4FF;--button-border-radius:9999px;--button-background-color:var(--primary-background-color);--modal-logo-border-color:var(--primary-color);--modal-animation-duration:350ms;--easing:cubic-bezier(0.16, 1, 0.3, 1);font-family:sans-serif}.dark{--button-background-color:rgb(30, 41, 59);--primary-background-color:rgb(30, 41, 59);--button-border-color:#FFFFF9;--text-color:#FFFFF9;--modal-logo-border-color:#CCC}.button{font-size:16px;color:var(--text-color);cursor:pointer;padding:8px 12px 8px 10px;display:flex;flex-direction:row;align-items:center;gap:6px;border:1px solid var(--button-border-color);background-color:var(--button-background-color);border-radius:var(--button-border-radius)}.button:hover{transition:box-shadow var(--button-animation-duration);box-shadow:0 0 3px rgba(0, 0, 0, 0.3);background:linear-gradient(\n to top,\n rgba(200, 200, 200, 0.1),\n rgba(200, 200, 200, 0.1)\n ) var(--button-background-color)}.button:active{transition:box-shadow var(--button-animation-duration);box-shadow:0 0 0 rgba(0, 0, 0, 0)}.button__logo{width:1.3rem}.modal{display:flex;z-index:9999;justify-content:center;align-items:center;position:fixed;top:0;left:0;width:100%;height:100%;opacity:1;background-color:rgba(0, 0, 0, 0.3);transition:opacity var(--modal-animation-duration) var(--easing)}.modal--hidden{opacity:0;pointer-events:none}.modal__content{max-width:240px;border-radius:4px;position:relative;display:flex;flex-direction:column;align-items:center;padding:16px;background-color:var(--primary-background-color);transform:scale(1);transition:transform var(--modal-animation-duration) var(--easing)}.modal--hidden .modal__content{transform:scale(0.5)}.modal__qrcode__container{position:relative}.modal__qrcode{border-radius:4px;width:100%;height:auto}.modal__logo{padding:8px;border:2px var(--modal-logo-border-color) solid;border-radius:var(--button-border-radius);background-color:var(--primary-background-color);position:absolute;width:16%;top:50%;left:50%;transform:translate3d(-50%, -50%, 0)}.modal-animated .circle__overlay{width:100%;height:100%}.modal-animated .modal__qrcode{filter:blur(2px)}.modal-animated .modal__logo{border:none;animation:spin 2.5s var(--easing) infinite}@keyframes spin{0%{transform:translate3d(-50%, -50%, 0) rotate(0deg)}50%{transform:translate3d(-50%, -50%, 0) rotate(180deg)}100%{transform:translate3d(-50%, -50%, 0) rotate(360deg)}}.modal__buttons{width:100%;flex-direction:column;align-items:center;margin-top:14px;display:flex;text-align:center}.modal:not(.modal--hidden) .modal__button{transform:scale(1) translate3d(0, 0, 0)}.modal:not(.modal--hidden) .modal__link{transform:scale(1) translate3d(0, 0, 0)}.modal__button{transform:scale(0) translate3d(0, 150px, 0);transition:calc(var(--modal-animation-duration) + 50ms) var(--easing);transition-property:scale, transform, background-color;cursor:pointer;padding:12px;font-size:14px;background-color:var(--primary-color);color:white;border:none;border-radius:6px;width:100%}.modal__button:hover{background:linear-gradient(\n to top,\n rgba(0, 0, 0, 0.1),\n rgba(0, 0, 0, 0.1)\n ) var(--primary-color)}.modal__link{transform:scale(0) translate3d(0, 150px, 0);transition:calc(var(--modal-animation-duration) + 150ms) var(--easing);transition-property:scale, transform;font-size:0.8rem;padding:10px 20px 0;color:var(--primary-color);width:100%;text-decoration:underline rgba(0, 0, 0, 0)}.modal__link:hover{text-decoration-color:var(--primary-color)}.modal__close-button{position:absolute;top:-26px;right:-26px;width:24px;height:24px;background-color:rgba(0, 0, 0, 0.1);border-radius:10px;cursor:pointer;transition:background-color var(--modal-animation-duration) var(--easing)}.modal__close-button:hover{background-color:rgba(0, 0, 0, 0.3)}.modal__close-button:before,.modal__close-button:after{content:\"\";position:absolute;top:50%;left:50%;width:50%;height:1px;background-color:rgba(255, 255, 255, 0.8);transform:translate(-50%, -50%) rotate(45deg)}.modal__close-button:after{transform:translate(-50%, -50%) rotate(-45deg)}.circle__overlay{overflow:hidden;top:50%;left:50%;transform:translate(-50%, -50%);position:absolute;background-color:var(--primary-background-color);border-radius:var(--button-border-radius);width:10%;height:10%;border:2px var(--modal-logo-border-color) solid;transition:calc(var(--modal-animation-duration) + 200ms) var(--easing);transition-property:width, height, opacity}.circle{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100px;height:100px;border-radius:50%;background-color:#E0E0E0;animation:circle__ripple 2s linear infinite}.circle--medium{width:150px;height:150px;animation-duration:2.5s}.circle--large{width:200px;height:200px;animation-duration:3s}@keyframes circle__ripple{0%{transform:translate(-50%, -50%) scale(0);opacity:1}100%{transform:translate(-50%, -50%) scale(1.5);opacity:0}}";
1282
+
1283
+ const maxInterval = 59 * 60 * 1000;
1284
+ const minInterval = 10 * 1000;
1285
+ const DEFAULT_CALLBACK_URL = window.location.origin + '/zero/auth';
1286
+ const ANIMATION_DURATION = 3000;
1287
+ const ZeroAccount$1 = /*@__PURE__*/ proxyCustomElement(class ZeroAccount extends HTMLElement {
1288
+ constructor() {
1289
+ super();
1290
+ this.__registerHost();
1291
+ this.__attachShadow();
1292
+ this.refreshQR = (ignoreAnimate = false) => {
1293
+ const update = () => {
1294
+ this.restartTimer();
1295
+ this.updateURL();
1296
+ };
1297
+ if (ignoreAnimate)
1298
+ return update();
1299
+ this.isAnimating = true;
1300
+ this.animationTimer = window.setTimeout(() => {
1301
+ update();
1302
+ this.isAnimating = false;
1303
+ }, ANIMATION_DURATION);
1304
+ };
1305
+ this.hideOnEsc = (e) => {
1306
+ if ((e.key === 'Escape' || e.key === 'Esc')) {
1307
+ this.modalOpen = false;
1308
+ }
1309
+ };
1310
+ this.log = (...args) => this.logger.log(...args);
1311
+ this.appId = undefined;
1312
+ this.updateInterval = 3 * 60 * 1000;
1313
+ this.callbackURL = DEFAULT_CALLBACK_URL;
1314
+ this.modal = true;
1315
+ this.selector = null;
1316
+ this.level = ErrorCorrectionLevel.M;
1317
+ this.primaryColor = '#3C444F';
1318
+ this.secondaryColor = undefined;
1319
+ this.instructionsText = undefined;
1320
+ this.hideInstructions = false;
1321
+ this.environment = Environment.production;
1322
+ this.enableWithCredentials = false;
1323
+ this.themePreset = ThemePreset.light;
1324
+ this.autoStartApp = true;
1325
+ this.modalOpen = false;
1326
+ this.isAnimating = false;
1327
+ this.url = '';
1328
+ }
1329
+ getUpdateInterval() {
1330
+ // make sure the provided value is within bounds
1331
+ return Math.min(Math.max(this.updateInterval, minInterval), maxInterval);
1332
+ }
1333
+ toggleModal() {
1334
+ this.modalOpen = !this.modalOpen;
1335
+ if (this.modalOpen)
1336
+ this.refreshQR(true);
1337
+ if ((this.modalOpen && this.autoStartApp) || this.isMobile())
1338
+ this.openApp();
1339
+ }
1340
+ _closeModal() {
1341
+ this.modalOpen = false;
1342
+ this.stopTimer();
1343
+ }
1344
+ closeModal(e) {
1345
+ if (e.target !== this.modalEl && e.target !== this.closeButtonEl) {
1346
+ return e.stopPropagation();
1347
+ }
1348
+ this._closeModal();
1349
+ }
1350
+ openApp() {
1351
+ if (this.modalOpen) {
1352
+ window.location.href = this.url;
1353
+ }
1354
+ }
1355
+ render() {
1356
+ const logoColor = this.themePreset === ThemePreset.light ? '#7263FA' : '#FFFFF9';
1357
+ const qrColor = this.themePreset === ThemePreset.light ? '#000' : '#FFFFF9';
1358
+ return (h(Host, null, h("slot", null), this.host.childNodes.length === 0 &&
1359
+ h("button", { class: `button ${this.themePreset}`, onClick: () => this.toggleModal() }, h(Logo, { className: 'button__logo', color: logoColor }), "use 0account"), h("div", { ref: el => this.modalEl = el, onClick: (e) => this.closeModal(e), class: `modal ${this.themePreset} ${this.isAnimating ? 'modal-animated' : ''} ${this.modalOpen ? '' : 'modal--hidden'}` }, h("div", { class: 'modal__content' }, h("div", { ref: el => this.closeButtonEl = el, class: 'modal__close-button' }), h("div", { class: 'modal__qrcode__container' }, h("qr-code", { url: this.url, class: `modal__qrcode`, level: this.level, color: qrColor }), h("div", { class: 'circle__overlay' }, h("div", { class: 'circle' }), h("div", { class: 'circle circle--medium' }), h("div", { class: 'circle circle--large' })), h(Logo, { className: 'modal__logo', color: logoColor })), h("div", { class: 'modal__buttons' }, h("button", { onClick: () => this.openApp(), class: 'modal__button' }, "Open the desktop app"), h("a", { href: '#', class: 'modal__link' }, "Download the app"))))));
1360
+ }
1361
+ // called only once
1362
+ componentWillLoad() {
1363
+ this.logger = new Logger(this.environment);
1364
+ this.uaParser = new uaParser.UAParser();
1365
+ this.ws = new WS(this.appId, {
1366
+ updateInterval: this.getUpdateInterval(),
1367
+ callbackURL: this.callbackURL,
1368
+ uaParser: this.uaParser,
1369
+ env: this.environment,
1370
+ log: this.log,
1371
+ });
1372
+ // make sure we initQR
1373
+ this.refreshQR(true);
1374
+ document.addEventListener('keydown', this.hideOnEsc);
1375
+ }
1376
+ updateURL() {
1377
+ const expires = new Date().getTime() + this.getUpdateInterval();
1378
+ const uuid = v4();
1379
+ this.ws.updateUUID(uuid);
1380
+ const params = appendToParams('', {
1381
+ appId: this.appId,
1382
+ uuid: uuid,
1383
+ expires: expires,
1384
+ });
1385
+ if (this.isMobile()) {
1386
+ this.url = 'https://launch.0account.com/auth?' + params;
1387
+ }
1388
+ else {
1389
+ this.url = 'zero-account://auth?' + params;
1390
+ }
1391
+ }
1392
+ isMobile() {
1393
+ const device = this.uaParser.getDevice();
1394
+ return device.type === 'tablet' || device.type === 'mobile';
1395
+ }
1396
+ connectedCallback() {
1397
+ this.startTimer();
1398
+ }
1399
+ disconnectedCallback() {
1400
+ this.stopTimer();
1401
+ document.removeEventListener('keydown', this.hideOnEsc);
1402
+ }
1403
+ restartTimer() {
1404
+ this.stopTimer();
1405
+ this.startTimer();
1406
+ }
1407
+ startTimer() {
1408
+ this.timer = window.setInterval(this.refreshQR, this.getUpdateInterval());
1409
+ }
1410
+ stopTimer() {
1411
+ window.clearInterval(this.timer);
1412
+ window.clearTimeout(this.animationTimer);
1413
+ this.isAnimating = false;
1414
+ }
1415
+ get host() { return this; }
1416
+ static get style() { return zeroAccountCss; }
1417
+ }, [1, "zero-account", {
1418
+ "appId": [1, "app-id"],
1419
+ "updateInterval": [2, "update-interval"],
1420
+ "callbackURL": [1, "callback-u-r-l"],
1421
+ "modal": [4],
1422
+ "selector": [1],
1423
+ "level": [1],
1424
+ "primaryColor": [1, "primary-color"],
1425
+ "secondaryColor": [1, "secondary-color"],
1426
+ "instructionsText": [1, "instructions-text"],
1427
+ "hideInstructions": [4, "hide-instructions"],
1428
+ "environment": [1],
1429
+ "enableWithCredentials": [4, "enable-with-credentials"],
1430
+ "themePreset": [1, "theme-preset"],
1431
+ "autoStartApp": [4, "auto-start-app"],
1432
+ "modalOpen": [32],
1433
+ "isAnimating": [32],
1434
+ "url": [32]
1435
+ }, [[4, "0account-toggle-modal", "toggleModal"], [4, "0account-close-modal", "_closeModal"], [4, "0account-authenticated", "_closeModal"], [4, "0account-open-app", "openApp"]]]);
1436
+ function defineCustomElement$1() {
1437
+ if (typeof customElements === "undefined") {
1438
+ return;
1439
+ }
1440
+ const components = ["zero-account", "qr-code"];
1441
+ components.forEach(tagName => { switch (tagName) {
1442
+ case "zero-account":
1443
+ if (!customElements.get(tagName)) {
1444
+ customElements.define(tagName, ZeroAccount$1);
1445
+ }
1446
+ break;
1447
+ case "qr-code":
1448
+ if (!customElements.get(tagName)) {
1449
+ defineCustomElement$2();
1450
+ }
1451
+ break;
1452
+ } });
1453
+ }
1454
+
1455
+ const ZeroAccount = ZeroAccount$1;
1456
+ const defineCustomElement = defineCustomElement$1;
1457
+
1458
+ export { ZeroAccount, defineCustomElement };
1459
+
1460
+ //# sourceMappingURL=zero-account.js.map