@abtnode/blocklet-services 1.16.16-beta-740ea329 → 1.16.16-beta-d6c5ed65

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 (55) hide show
  1. package/api/libs/auth/utils.js +2 -1
  2. package/api/libs/connect/session.js +75 -30
  3. package/api/libs/connect/shared.js +4 -5
  4. package/api/libs/connect/v1.js +7 -9
  5. package/api/routes/federated.js +84 -11
  6. package/api/routes/oauth.js +140 -37
  7. package/api/routes/user.js +7 -2
  8. package/api/services/auth/connect/switch-passport.js +5 -5
  9. package/api/util/blocklet-utils.js +2 -3
  10. package/build/asset-manifest.json +55 -55
  11. package/build/index.html +1 -1
  12. package/build/service-worker.js +1 -1
  13. package/build/service-worker.js.map +1 -1
  14. package/build/static/js/1480.36129849.chunk.js +2 -0
  15. package/build/static/js/{1565.a6f98c38.chunk.js → 1565.ad002b88.chunk.js} +2 -2
  16. package/build/static/js/{1660.5c8ade93.chunk.js → 1660.9fb17942.chunk.js} +2 -2
  17. package/build/static/js/{1760.95d0c320.chunk.js → 1760.71e0c151.chunk.js} +2 -2
  18. package/build/static/js/{2653.11a1ad57.chunk.js → 2653.6f37e8a0.chunk.js} +2 -2
  19. package/build/static/js/2686.7ae70bfd.chunk.js +2 -0
  20. package/build/static/js/4023.4be0c818.chunk.js +2 -0
  21. package/build/static/js/{4716.47aa133c.chunk.js → 4716.17a45b6a.chunk.js} +2 -2
  22. package/build/static/js/{4802.63425dd4.chunk.js → 4802.b7fa8e82.chunk.js} +2 -2
  23. package/build/static/js/50.cbaa5a4e.chunk.js +3 -0
  24. package/build/static/js/{5176.42904a22.chunk.js → 5176.53f7f419.chunk.js} +2 -2
  25. package/build/static/js/{5628.773a32da.chunk.js → 5628.aa14b1a7.chunk.js} +2 -2
  26. package/build/static/js/5662.522d3713.chunk.js +2 -0
  27. package/build/static/js/5683.7e5d47f1.chunk.js +2 -0
  28. package/build/static/js/6186.6462ea21.chunk.js +2 -0
  29. package/build/static/js/{6452.b1899621.chunk.js → 6452.4226209b.chunk.js} +2 -2
  30. package/build/static/js/{6629.36e61c26.chunk.js → 6629.785fe237.chunk.js} +3 -3
  31. package/build/static/js/{6640.53cdcb95.chunk.js → 6640.e453c619.chunk.js} +2 -2
  32. package/build/static/js/6737.7fe9f13a.chunk.js +2 -0
  33. package/build/static/js/{6771.735ebd3f.chunk.js → 6771.1e778542.chunk.js} +3 -3
  34. package/build/static/js/{6856.e5c166e6.chunk.js → 6856.9aaf692c.chunk.js} +2 -2
  35. package/build/static/js/{7006.9a53f7ed.chunk.js → 7006.b72aff66.chunk.js} +2 -2
  36. package/build/static/js/{7465.ba1027a7.chunk.js → 7465.999f0039.chunk.js} +3 -3
  37. package/build/static/js/{9409.befe72b4.chunk.js → 9409.fe4a0af0.chunk.js} +2 -2
  38. package/build/static/js/{9620.59bc85b8.chunk.js → 9620.db1568ef.chunk.js} +2 -2
  39. package/build/static/js/{9899.c8ff588e.chunk.js → 9899.92626f0a.chunk.js} +2 -2
  40. package/build/static/js/main.85d66eb2.js +3 -0
  41. package/build/static/js/{main.3ba3901e.js.LICENSE.txt → main.85d66eb2.js.LICENSE.txt} +1 -1
  42. package/package.json +23 -23
  43. package/build/static/js/1480.30b94380.chunk.js +0 -2
  44. package/build/static/js/2307.2e451912.chunk.js +0 -2
  45. package/build/static/js/2686.07687254.chunk.js +0 -2
  46. package/build/static/js/4023.0f348986.chunk.js +0 -2
  47. package/build/static/js/5683.3bdd2338.chunk.js +0 -2
  48. package/build/static/js/6186.61596c22.chunk.js +0 -2
  49. package/build/static/js/6606.9f17eaa6.chunk.js +0 -3
  50. package/build/static/js/6737.5f735a29.chunk.js +0 -2
  51. package/build/static/js/main.3ba3901e.js +0 -3
  52. /package/build/static/js/{6606.9f17eaa6.chunk.js.LICENSE.txt → 50.cbaa5a4e.chunk.js.LICENSE.txt} +0 -0
  53. /package/build/static/js/{6629.36e61c26.chunk.js.LICENSE.txt → 6629.785fe237.chunk.js.LICENSE.txt} +0 -0
  54. /package/build/static/js/{6771.735ebd3f.chunk.js.LICENSE.txt → 6771.1e778542.chunk.js.LICENSE.txt} +0 -0
  55. /package/build/static/js/{7465.ba1027a7.chunk.js.LICENSE.txt → 7465.999f0039.chunk.js.LICENSE.txt} +0 -0
@@ -19,6 +19,7 @@ const logger = require('@abtnode/logger')('blocklet-services:oauth');
19
19
 
20
20
  const { AuthenticationClient } = require('../libs/auth/adapters/auth0');
21
21
  const { getAvatarByEmail, transferPassport, getAvatarByUrl } = require('../libs/auth/utils');
22
+ const { api } = require('../libs/api');
22
23
  const initJwt = require('../libs/jwt');
23
24
  const { sendToUser } = require('../libs/notification');
24
25
  const { isInvitedUserOnly, createTokenFn, getDidConnectVersion } = require('../util');
@@ -27,6 +28,7 @@ const { ApiError } = require('../util/error');
27
28
  const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
28
29
 
29
30
  const prefix = `${PREFIX}/oauth`;
31
+ const prefixApi = `${PREFIX}/api/oauth`;
30
32
 
31
33
  const translations = {
32
34
  zh: {
@@ -62,23 +64,42 @@ function getAuthClient(blocklet, provider) {
62
64
 
63
65
  async function login(req, node, options) {
64
66
  const blocklet = await req.getBlocklet();
65
- const { token, locale = 'en', provider, componentId } = req.body;
67
+ const { token, locale = 'en', provider, componentId, sourceAppPid } = req.body;
66
68
 
67
69
  if (!blocklet.settings?.owner) {
68
70
  throw new ApiError(400, t('oauthCantBeOwner', locale));
69
71
  }
70
- const authClient = getAuthClient(blocklet, provider);
72
+ const { did: teamDid, wallet: blockletWallet, secret, appUrl } = await req.getBlockletInfo();
73
+ let userWallet;
74
+ let oauthInfo;
75
+ let federatedSessionToken;
76
+ let federatedRefreshToken;
77
+
78
+ // NOTICE: 如果是统一登录,则向 master 站点发起 oauth 登录请求,auth0 的账户信息必须由 master 来生成
79
+ if (sourceAppPid) {
80
+ const federatedSites = blocklet.settings?.federated?.sites || [];
81
+ const loginSite = federatedSites.find((x) => x.appPid === sourceAppPid);
82
+ const postData = { token, locale, provider, componentId };
83
+ const url = joinUrl(loginSite.appUrl, WELLKNOWN_SERVICE_PATH_PREFIX, '/api/oauth/login');
84
+ const { data } = await api.post(url, postData, {
85
+ headers: {
86
+ 'x-did-connect-version': getDidConnectVersion(req),
87
+ },
88
+ });
89
+ ({ sessionToken: federatedSessionToken, refreshToken: federatedRefreshToken, oauthInfo, userWallet } = data);
90
+ } else {
91
+ const authClient = getAuthClient(blocklet, provider);
92
+ oauthInfo = await authClient.getProfile(token);
93
+ userWallet = fromAppDid(oauthInfo.sub, blockletWallet.secretKey);
94
+ }
95
+ const userDid = userWallet.address;
96
+ const userPk = userWallet.publicKey;
71
97
 
72
- const { did: teamDid, wallet: blockletWallet, secret } = await req.getBlockletInfo();
73
98
  const config = await req.getServiceConfig(NODE_SERVICES.AUTH, { componentId });
74
99
  const nodeInfo = await req.getNodeInfo();
75
100
  const { dataDir } = await getApplicationInfo({ node, nodeInfo, teamDid });
76
101
  const [invitedUserOnly] = await isInvitedUserOnly(config, node, teamDid);
77
- const oauthInfo = await authClient.getProfile(token);
78
102
 
79
- const userWallet = fromAppDid(oauthInfo.sub, blockletWallet.secretKey);
80
- const userDid = userWallet.address;
81
- const userPk = userWallet.publicKey;
82
103
  const lastLoginIp = get(req, 'headers[x-real-ip]') || '';
83
104
  let passport = { name: 'Guest', role: 'guest' };
84
105
  let currentUser = await node.getUser({
@@ -93,8 +114,20 @@ async function login(req, node, options) {
93
114
  let doc;
94
115
  let passportForLog;
95
116
  const fullName = currentUser?.fullName || oauthInfo?.nickname;
117
+ const connectedAccount = {
118
+ provider,
119
+ did: userDid,
120
+ pk: userPk,
121
+ id: oauthInfo.sub,
122
+ };
123
+ let profile;
96
124
  // 当前账户已存在,更新账户信息
97
125
  if (currentUser) {
126
+ profile = {
127
+ fullName: currentUser.fullName,
128
+ email: currentUser.email || '',
129
+ avatar: currentUser.avatar,
130
+ };
98
131
  const allPassports = currentUser.passports || [];
99
132
  const validPassports = allPassports.filter((item) => item.status === PASSPORT_STATUS.VALID);
100
133
  const lastUsedPassport = last(sortBy(validPassports, 'lastLoginAt'));
@@ -102,6 +135,7 @@ async function login(req, node, options) {
102
135
  if (lastUsedPassport) {
103
136
  passport = pick(lastUsedPassport, ['id', 'name', 'role']);
104
137
  }
138
+
105
139
  doc = await node.loginUser({
106
140
  teamDid,
107
141
  user: {
@@ -109,14 +143,15 @@ async function login(req, node, options) {
109
143
  pk: currentUser.pk,
110
144
  locale,
111
145
  lastLoginIp,
146
+ sourceAppPid,
112
147
  passport: lastUsedPassport,
113
- connectedAccount: { provider, did: userDid },
148
+ connectedAccount,
114
149
  },
115
150
  });
116
151
  } else {
117
152
  currentUser = {
118
- did: userWallet.address,
119
- pk: userWallet.publicKey,
153
+ did: userDid,
154
+ pk: userPk,
120
155
  };
121
156
  let avatar = oauthInfo.picture ? await getAvatarByUrl(oauthInfo.picture) : await getAvatarByEmail(oauthInfo.email);
122
157
  avatar = await extractUserAvatar(avatar, { dataDir });
@@ -125,20 +160,19 @@ async function login(req, node, options) {
125
160
  throw new ApiError(403, t('needInviteToLogin', locale));
126
161
  }
127
162
  passportForLog = { name: 'Guest', role: 'guest' };
163
+ profile = {
164
+ fullName: oauthInfo.nickname,
165
+ email: oauthInfo.email,
166
+ avatar,
167
+ };
128
168
  doc = await node.loginUser({
129
169
  teamDid,
130
170
  user: {
131
- connectedAccount: {
132
- provider,
133
- id: oauthInfo.sub,
134
- did: userDid,
135
- pk: userPk,
136
- },
171
+ connectedAccount,
137
172
  did: userDid,
138
173
  pk: userPk,
139
- fullName: oauthInfo.nickname,
140
- email: oauthInfo.email,
141
- avatar,
174
+ sourceAppPid,
175
+ ...profile,
142
176
  locale,
143
177
  lastLoginIp,
144
178
  },
@@ -148,13 +182,30 @@ async function login(req, node, options) {
148
182
  await node.createAuditLog(
149
183
  {
150
184
  action: 'login',
151
- args: { teamDid, userDid: currentUser.did || userDid, passport: passportForLog, provider },
185
+ args: { teamDid, userDid: currentUser.did || userDid, passport: passportForLog, provider, sourceAppPid },
152
186
  context: formatContext(Object.assign(req, { user: doc })),
153
187
  result: doc,
154
188
  },
155
189
  node
156
190
  );
157
191
 
192
+ // NOTICE: 采用异步来更新,不阻塞接口的正常响应
193
+ node.syncFederated({
194
+ did: teamDid,
195
+ data: {
196
+ users: [
197
+ {
198
+ did: userDid,
199
+ pk: userPk,
200
+ ...profile,
201
+ avatar: getUserAvatarUrl(appUrl, profile.avatar),
202
+ connectedAccount: [connectedAccount],
203
+ action: 'connectAccount',
204
+ },
205
+ ],
206
+ },
207
+ });
208
+
158
209
  const { createSessionToken } = initJwt(node, options);
159
210
 
160
211
  const createToken = createTokenFn(createSessionToken);
@@ -176,7 +227,14 @@ async function login(req, node, options) {
176
227
  return sessionToken;
177
228
  }
178
229
 
179
- return { sessionToken, refreshToken };
230
+ return {
231
+ sessionToken,
232
+ refreshToken,
233
+ federatedSessionToken,
234
+ federatedRefreshToken,
235
+ oauthInfo,
236
+ userWallet: pick(userWallet, ['type', 'publicKey', 'address']),
237
+ };
180
238
  }
181
239
 
182
240
  async function invite(req, node, options) {
@@ -262,17 +320,33 @@ async function invite(req, node, options) {
262
320
  );
263
321
  }
264
322
  } else {
323
+ const connectedAccount = {
324
+ provider,
325
+ id: oauthInfo.sub,
326
+ did: userWallet.address,
327
+ pk: userWallet.publicKey,
328
+ };
265
329
  await node.loginUser({
266
330
  teamDid,
267
331
  user: {
268
332
  did: userDid,
269
333
  pk: userPk,
270
- connectedAccount: {
271
- provider,
272
- id: oauthInfo.sub,
273
- did: userWallet.address,
274
- pk: userWallet.publicKey,
275
- },
334
+ connectedAccount,
335
+ },
336
+ });
337
+ // NOTICE: 采用异步来更新,不阻塞接口的正常响应
338
+ node.syncFederated({
339
+ did: teamDid,
340
+ data: {
341
+ users: [
342
+ {
343
+ did: userDid,
344
+ pk: userPk,
345
+ ...profile,
346
+ connectedAccount: [connectedAccount],
347
+ action: 'connectAccount',
348
+ },
349
+ ],
276
350
  },
277
351
  });
278
352
  }
@@ -369,6 +443,22 @@ async function bind(req, node, options) {
369
443
  },
370
444
  });
371
445
 
446
+ // NOTICE: 采用异步来更新,不阻塞接口的正常响应
447
+ node.syncFederated({
448
+ did: teamDid,
449
+ data: {
450
+ users: [
451
+ {
452
+ did: bindUser.did,
453
+ pk: bindUser.pk,
454
+ ...mergeProfile,
455
+ connectedAccount: [connectedAccount],
456
+ action: 'connectAccount',
457
+ },
458
+ ],
459
+ },
460
+ });
461
+
372
462
  if (!oauthUser) {
373
463
  oauthUser = {
374
464
  did: userWallet.address,
@@ -390,12 +480,15 @@ async function bind(req, node, options) {
390
480
 
391
481
  module.exports = {
392
482
  init(server, node, options) {
393
- server.get(`${prefix}/configs`, async (req, res) => {
483
+ async function configsFn(req, res) {
394
484
  const blocklet = await req.getBlocklet();
395
485
  const oauthConfig = blocklet?.settings?.oauth || {};
396
486
  res.send(oauthConfig);
397
- });
398
- server.get(`${prefix}/passports`, async (req, res) => {
487
+ }
488
+ server.get(`${prefix}/configs`, configsFn);
489
+ server.get(`${prefixApi}/configs`, configsFn);
490
+
491
+ async function passportsFn(req, res) {
399
492
  if (!req.user) {
400
493
  res.status(401).send('Unauthorized');
401
494
  }
@@ -457,9 +550,11 @@ module.exports = {
457
550
  };
458
551
  });
459
552
  res.send(passportTypes);
460
- });
553
+ }
554
+ server.get(`${prefix}/passports`, passportsFn);
555
+ server.get(`${prefixApi}/passports`, passportsFn);
461
556
 
462
- server.post(`${prefix}/bind`, async (req, res) => {
557
+ async function bindFn(req, res) {
463
558
  try {
464
559
  await bind(req, node, options);
465
560
  res.status(200).json({});
@@ -471,9 +566,12 @@ module.exports = {
471
566
  }
472
567
  throw err;
473
568
  }
474
- });
569
+ }
570
+
571
+ server.post(`${prefix}/bind`, bindFn);
572
+ server.post(`${prefixApi}/bind`, bindFn);
475
573
 
476
- server.post(`${prefix}/switch`, async (req, res) => {
574
+ async function switchFn(req, res) {
477
575
  const { did: userDid, provider } = req.user;
478
576
  const { passportId } = req.body;
479
577
  const blocklet = await req.getBlocklet();
@@ -506,14 +604,17 @@ module.exports = {
506
604
  }
507
605
 
508
606
  res.status(200).json({ sessionToken, refreshToken });
509
- });
607
+ }
608
+
609
+ server.post(`${prefix}/switch`, switchFn);
610
+ server.post(`${prefixApi}/switch`, switchFn);
510
611
 
511
612
  /**
512
613
  * oauth 方式登录
513
614
  * 1. 普通配置下,登录/注册是同样的流程,登录过程中会自动注册账号
514
615
  * 2. 仅邀请可登录模式下,只允许登录,不允许注册
515
616
  */
516
- server.post(`${prefix}/login`, async (req, res) => {
617
+ async function loginFn(req, res) {
517
618
  const { action = 'login' } = req.body;
518
619
  const actionMap = {
519
620
  login,
@@ -530,6 +631,8 @@ module.exports = {
530
631
  }
531
632
  throw err;
532
633
  }
533
- });
634
+ }
635
+ server.post(`${prefix}/login`, loginFn);
636
+ server.post(`${prefixApi}/login`, loginFn);
534
637
  },
535
638
  };
@@ -27,6 +27,7 @@ const validateUser = (user) => {
27
27
  const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
28
28
 
29
29
  const prefix = `${PREFIX}/user`;
30
+ const prefixApi = `${PREFIX}/api/user`;
30
31
  const translations = {
31
32
  zh: {
32
33
  needInviteToLogin: '你需要被邀请才可以登录此应用',
@@ -148,6 +149,7 @@ async function loginWallet(
148
149
  if (!validateUser(loginParams.user) || !validateUser(loginParams.user.connectedAccount)) {
149
150
  throw new ApiError(400, t('userInfoError', locale));
150
151
  }
152
+ // TODO: @zhanghan 暂不支持统一登录模式登录
151
153
  const doc = await node.loginUser(loginParams);
152
154
 
153
155
  // NOTICE: 使用 provider: wallet 登录的账号,其账号是由 wallet 产生的,所以不需要到链上 declare 了
@@ -209,6 +211,7 @@ async function loginOAuth(
209
211
  if (!validateUser(loginParams.user) || !validateUser(loginParams.user.connectedAccount)) {
210
212
  throw new ApiError(400, t('userInfoError', locale));
211
213
  }
214
+ // TODO: @zhanghan 暂不支持统一登录模式登录
212
215
  const doc = await node.loginUser(loginParams);
213
216
  return doc;
214
217
  }
@@ -279,7 +282,7 @@ async function login(req, node, options) {
279
282
 
280
283
  module.exports = {
281
284
  init(server, node, options) {
282
- server.post(`${prefix}/login`, verifySig, async (req, res) => {
285
+ async function loginFn(req, res) {
283
286
  try {
284
287
  const data = await login(req, node, options);
285
288
  res.status(200).json(data);
@@ -291,6 +294,8 @@ module.exports = {
291
294
  }
292
295
  throw err;
293
296
  }
294
- });
297
+ }
298
+ server.post(`${prefix}/login`, verifySig, loginFn);
299
+ server.post(`${prefixApi}/login`, verifySig, loginFn);
295
300
  },
296
301
  };
@@ -1,4 +1,4 @@
1
- const { getLoginProvider } = require('@blocklet/sdk/lib/util/login');
1
+ const { getSourceAppPid } = require('@blocklet/sdk/lib/util/login');
2
2
  const { switchPassport } = require('../../../libs/connect/session');
3
3
 
4
4
  const { onConnect, onApprove } = switchPassport;
@@ -7,7 +7,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
7
7
  return {
8
8
  action: 'switch-passport',
9
9
  onConnect: ({ userDid, baseUrl, extraParams: { locale, connectedDid }, req, request }) => {
10
- const provider = getLoginProvider(request);
10
+ const sourceAppPid = getSourceAppPid(request);
11
11
  return onConnect({
12
12
  node,
13
13
  request: req,
@@ -15,12 +15,12 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
15
15
  userDid,
16
16
  previousUserDid: connectedDid,
17
17
  baseUrl,
18
- provider,
18
+ sourceAppPid,
19
19
  });
20
20
  },
21
21
 
22
22
  onAuth: async ({ claims, challenge, userDid, updateSession, extraParams, req, request }) => {
23
- const provider = getLoginProvider(request);
23
+ const sourceAppPid = getSourceAppPid(request);
24
24
  const { sessionToken, refreshToken } = await onApprove({
25
25
  node,
26
26
  request: req,
@@ -29,7 +29,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
29
29
  verifiableCredential: claims.find((x) => x.type === 'verifiableCredential'),
30
30
  userDid,
31
31
  createSessionToken,
32
- provider,
32
+ sourceAppPid,
33
33
  });
34
34
 
35
35
  await updateSession({ sessionToken, refreshToken }, true);
@@ -1,4 +1,3 @@
1
- const { LOGIN_PROVIDER } = require('@blocklet/constant');
2
1
  const { getBlockletAppIdList } = require('@blocklet/meta/lib/util');
3
2
  const pick = require('lodash/pick');
4
3
  const logger = require('@abtnode/logger')(require('../../package.json').name);
@@ -32,9 +31,9 @@ async function getFederatedTrustedIssuers(blocklet) {
32
31
  return [...new Set(issuers.filter(Boolean))];
33
32
  }
34
33
 
35
- async function getTrustedIssuers(blocklet, { provider = LOGIN_PROVIDER.WALLET } = {}) {
34
+ async function getTrustedIssuers(blocklet, { sourceAppPid } = {}) {
36
35
  let federatedTrustedIssuers = [];
37
- if (provider === LOGIN_PROVIDER.FEDERATED) {
36
+ if (sourceAppPid) {
38
37
  federatedTrustedIssuers = await getFederatedTrustedIssuers(blocklet);
39
38
  }
40
39
 
@@ -1,43 +1,43 @@
1
1
  {
2
2
  "files": {
3
3
  "main.css": "/.well-known/service/static/static/css/main.7ea79dc8.css",
4
- "main.js": "/.well-known/service/static/static/js/main.3ba3901e.js",
5
- "static/js/4716.47aa133c.chunk.js": "/.well-known/service/static/static/js/4716.47aa133c.chunk.js",
6
- "static/js/6856.e5c166e6.chunk.js": "/.well-known/service/static/static/js/6856.e5c166e6.chunk.js",
7
- "static/js/1660.5c8ade93.chunk.js": "/.well-known/service/static/static/js/1660.5c8ade93.chunk.js",
8
- "static/js/9899.c8ff588e.chunk.js": "/.well-known/service/static/static/js/9899.c8ff588e.chunk.js",
9
- "static/js/6737.5f735a29.chunk.js": "/.well-known/service/static/static/js/6737.5f735a29.chunk.js",
10
- "static/js/1760.95d0c320.chunk.js": "/.well-known/service/static/static/js/1760.95d0c320.chunk.js",
11
- "static/js/9620.59bc85b8.chunk.js": "/.well-known/service/static/static/js/9620.59bc85b8.chunk.js",
12
- "static/js/1480.30b94380.chunk.js": "/.well-known/service/static/static/js/1480.30b94380.chunk.js",
13
- "static/js/6186.61596c22.chunk.js": "/.well-known/service/static/static/js/6186.61596c22.chunk.js",
4
+ "main.js": "/.well-known/service/static/static/js/main.85d66eb2.js",
5
+ "static/js/4716.17a45b6a.chunk.js": "/.well-known/service/static/static/js/4716.17a45b6a.chunk.js",
6
+ "static/js/6856.9aaf692c.chunk.js": "/.well-known/service/static/static/js/6856.9aaf692c.chunk.js",
7
+ "static/js/1660.9fb17942.chunk.js": "/.well-known/service/static/static/js/1660.9fb17942.chunk.js",
8
+ "static/js/9899.92626f0a.chunk.js": "/.well-known/service/static/static/js/9899.92626f0a.chunk.js",
9
+ "static/js/6737.7fe9f13a.chunk.js": "/.well-known/service/static/static/js/6737.7fe9f13a.chunk.js",
10
+ "static/js/1760.71e0c151.chunk.js": "/.well-known/service/static/static/js/1760.71e0c151.chunk.js",
11
+ "static/js/9620.db1568ef.chunk.js": "/.well-known/service/static/static/js/9620.db1568ef.chunk.js",
12
+ "static/js/1480.36129849.chunk.js": "/.well-known/service/static/static/js/1480.36129849.chunk.js",
13
+ "static/js/6186.6462ea21.chunk.js": "/.well-known/service/static/static/js/6186.6462ea21.chunk.js",
14
14
  "static/js/4682.8e18351a.chunk.js": "/.well-known/service/static/static/js/4682.8e18351a.chunk.js",
15
15
  "static/js/6711.9a173439.chunk.js": "/.well-known/service/static/static/js/6711.9a173439.chunk.js",
16
16
  "static/js/8437.994560bd.chunk.js": "/.well-known/service/static/static/js/8437.994560bd.chunk.js",
17
17
  "static/js/6378.29466d9e.chunk.js": "/.well-known/service/static/static/js/6378.29466d9e.chunk.js",
18
18
  "static/js/5434.523d071d.chunk.js": "/.well-known/service/static/static/js/5434.523d071d.chunk.js",
19
- "static/js/9409.befe72b4.chunk.js": "/.well-known/service/static/static/js/9409.befe72b4.chunk.js",
19
+ "static/js/9409.fe4a0af0.chunk.js": "/.well-known/service/static/static/js/9409.fe4a0af0.chunk.js",
20
20
  "static/js/4420.55971847.chunk.js": "/.well-known/service/static/static/js/4420.55971847.chunk.js",
21
- "static/js/5628.773a32da.chunk.js": "/.well-known/service/static/static/js/5628.773a32da.chunk.js",
21
+ "static/js/5628.aa14b1a7.chunk.js": "/.well-known/service/static/static/js/5628.aa14b1a7.chunk.js",
22
22
  "static/js/941.6a4ed4dd.chunk.js": "/.well-known/service/static/static/js/941.6a4ed4dd.chunk.js",
23
23
  "static/js/6576.f78daf32.chunk.js": "/.well-known/service/static/static/js/6576.f78daf32.chunk.js",
24
- "static/js/5176.42904a22.chunk.js": "/.well-known/service/static/static/js/5176.42904a22.chunk.js",
24
+ "static/js/5176.53f7f419.chunk.js": "/.well-known/service/static/static/js/5176.53f7f419.chunk.js",
25
25
  "static/js/9102.828066ce.chunk.js": "/.well-known/service/static/static/js/9102.828066ce.chunk.js",
26
26
  "static/js/3688.9bb1c7a8.chunk.js": "/.well-known/service/static/static/js/3688.9bb1c7a8.chunk.js",
27
- "static/js/2653.11a1ad57.chunk.js": "/.well-known/service/static/static/js/2653.11a1ad57.chunk.js",
27
+ "static/js/2653.6f37e8a0.chunk.js": "/.well-known/service/static/static/js/2653.6f37e8a0.chunk.js",
28
28
  "static/js/3593.c1eddcd6.chunk.js": "/.well-known/service/static/static/js/3593.c1eddcd6.chunk.js",
29
29
  "static/css/4802.bf353f58.chunk.css": "/.well-known/service/static/static/css/4802.bf353f58.chunk.css",
30
- "static/js/4802.63425dd4.chunk.js": "/.well-known/service/static/static/js/4802.63425dd4.chunk.js",
31
- "static/js/6771.735ebd3f.chunk.js": "/.well-known/service/static/static/js/6771.735ebd3f.chunk.js",
30
+ "static/js/4802.b7fa8e82.chunk.js": "/.well-known/service/static/static/js/4802.b7fa8e82.chunk.js",
31
+ "static/js/6771.1e778542.chunk.js": "/.well-known/service/static/static/js/6771.1e778542.chunk.js",
32
32
  "static/css/5982.ac464505.chunk.css": "/.well-known/service/static/static/css/5982.ac464505.chunk.css",
33
33
  "static/js/5982.89bdb419.chunk.js": "/.well-known/service/static/static/js/5982.89bdb419.chunk.js",
34
- "static/js/4023.0f348986.chunk.js": "/.well-known/service/static/static/js/4023.0f348986.chunk.js",
35
- "static/js/6452.b1899621.chunk.js": "/.well-known/service/static/static/js/6452.b1899621.chunk.js",
36
- "static/js/1565.a6f98c38.chunk.js": "/.well-known/service/static/static/js/1565.a6f98c38.chunk.js",
34
+ "static/js/4023.4be0c818.chunk.js": "/.well-known/service/static/static/js/4023.4be0c818.chunk.js",
35
+ "static/js/6452.4226209b.chunk.js": "/.well-known/service/static/static/js/6452.4226209b.chunk.js",
36
+ "static/js/1565.ad002b88.chunk.js": "/.well-known/service/static/static/js/1565.ad002b88.chunk.js",
37
37
  "static/js/2393.c5bbedfd.chunk.js": "/.well-known/service/static/static/js/2393.c5bbedfd.chunk.js",
38
- "static/js/5683.3bdd2338.chunk.js": "/.well-known/service/static/static/js/5683.3bdd2338.chunk.js",
39
- "static/js/2307.2e451912.chunk.js": "/.well-known/service/static/static/js/2307.2e451912.chunk.js",
40
- "static/js/7006.9a53f7ed.chunk.js": "/.well-known/service/static/static/js/7006.9a53f7ed.chunk.js",
38
+ "static/js/5683.7e5d47f1.chunk.js": "/.well-known/service/static/static/js/5683.7e5d47f1.chunk.js",
39
+ "static/js/5662.522d3713.chunk.js": "/.well-known/service/static/static/js/5662.522d3713.chunk.js",
40
+ "static/js/7006.b72aff66.chunk.js": "/.well-known/service/static/static/js/7006.b72aff66.chunk.js",
41
41
  "static/js/5960.adcd2848.chunk.js": "/.well-known/service/static/static/js/5960.adcd2848.chunk.js",
42
42
  "static/js/2631.54f86f84.chunk.js": "/.well-known/service/static/static/js/2631.54f86f84.chunk.js",
43
43
  "static/js/4355.68364e13.chunk.js": "/.well-known/service/static/static/js/4355.68364e13.chunk.js",
@@ -45,22 +45,22 @@
45
45
  "static/js/3595.cbf763c8.chunk.js": "/.well-known/service/static/static/js/3595.cbf763c8.chunk.js",
46
46
  "static/js/4164.5adbbbba.chunk.js": "/.well-known/service/static/static/js/4164.5adbbbba.chunk.js",
47
47
  "static/js/4319.8d9e189e.chunk.js": "/.well-known/service/static/static/js/4319.8d9e189e.chunk.js",
48
- "static/js/6629.36e61c26.chunk.js": "/.well-known/service/static/static/js/6629.36e61c26.chunk.js",
48
+ "static/js/6629.785fe237.chunk.js": "/.well-known/service/static/static/js/6629.785fe237.chunk.js",
49
49
  "static/js/1013.48b6d77d.chunk.js": "/.well-known/service/static/static/js/1013.48b6d77d.chunk.js",
50
50
  "static/js/4042.3c8e0025.chunk.js": "/.well-known/service/static/static/js/4042.3c8e0025.chunk.js",
51
51
  "static/js/5465.e0965b1d.chunk.js": "/.well-known/service/static/static/js/5465.e0965b1d.chunk.js",
52
52
  "static/js/4764.51208c0d.chunk.js": "/.well-known/service/static/static/js/4764.51208c0d.chunk.js",
53
- "static/js/2686.07687254.chunk.js": "/.well-known/service/static/static/js/2686.07687254.chunk.js",
53
+ "static/js/2686.7ae70bfd.chunk.js": "/.well-known/service/static/static/js/2686.7ae70bfd.chunk.js",
54
54
  "static/js/7606.25231f8c.chunk.js": "/.well-known/service/static/static/js/7606.25231f8c.chunk.js",
55
55
  "static/js/476.1f6135d6.chunk.js": "/.well-known/service/static/static/js/476.1f6135d6.chunk.js",
56
56
  "static/js/8143.5bd71f08.chunk.js": "/.well-known/service/static/static/js/8143.5bd71f08.chunk.js",
57
57
  "static/js/6498.bd96fa39.chunk.js": "/.well-known/service/static/static/js/6498.bd96fa39.chunk.js",
58
58
  "static/css/4706.7a92e9f9.chunk.css": "/.well-known/service/static/static/css/4706.7a92e9f9.chunk.css",
59
59
  "static/js/4706.df5b600d.chunk.js": "/.well-known/service/static/static/js/4706.df5b600d.chunk.js",
60
- "static/js/6606.9f17eaa6.chunk.js": "/.well-known/service/static/static/js/6606.9f17eaa6.chunk.js",
60
+ "static/js/50.cbaa5a4e.chunk.js": "/.well-known/service/static/static/js/50.cbaa5a4e.chunk.js",
61
61
  "static/js/6700.5dfd9c70.chunk.js": "/.well-known/service/static/static/js/6700.5dfd9c70.chunk.js",
62
- "static/js/6640.53cdcb95.chunk.js": "/.well-known/service/static/static/js/6640.53cdcb95.chunk.js",
63
- "static/js/7465.ba1027a7.chunk.js": "/.well-known/service/static/static/js/7465.ba1027a7.chunk.js",
62
+ "static/js/6640.e453c619.chunk.js": "/.well-known/service/static/static/js/6640.e453c619.chunk.js",
63
+ "static/js/7465.999f0039.chunk.js": "/.well-known/service/static/static/js/7465.999f0039.chunk.js",
64
64
  "static/js/8604.ad77a749.chunk.js": "/.well-known/service/static/static/js/8604.ad77a749.chunk.js",
65
65
  "static/js/6380.2b96be29.chunk.js": "/.well-known/service/static/static/js/6380.2b96be29.chunk.js",
66
66
  "static/js/6465.e704f56b.chunk.js": "/.well-known/service/static/static/js/6465.e704f56b.chunk.js",
@@ -95,43 +95,43 @@
95
95
  "index.html": "/.well-known/service/static/index.html",
96
96
  "static/media/space-connected.svg": "/.well-known/service/static/static/media/space-connected.9a4e18fd2bc7d065191b0d241a131c28.svg",
97
97
  "main.7ea79dc8.css.map": "/.well-known/service/static/static/css/main.7ea79dc8.css.map",
98
- "main.3ba3901e.js.map": "/.well-known/service/static/static/js/main.3ba3901e.js.map",
99
- "4716.47aa133c.chunk.js.map": "/.well-known/service/static/static/js/4716.47aa133c.chunk.js.map",
100
- "6856.e5c166e6.chunk.js.map": "/.well-known/service/static/static/js/6856.e5c166e6.chunk.js.map",
101
- "1660.5c8ade93.chunk.js.map": "/.well-known/service/static/static/js/1660.5c8ade93.chunk.js.map",
102
- "9899.c8ff588e.chunk.js.map": "/.well-known/service/static/static/js/9899.c8ff588e.chunk.js.map",
103
- "6737.5f735a29.chunk.js.map": "/.well-known/service/static/static/js/6737.5f735a29.chunk.js.map",
104
- "1760.95d0c320.chunk.js.map": "/.well-known/service/static/static/js/1760.95d0c320.chunk.js.map",
105
- "9620.59bc85b8.chunk.js.map": "/.well-known/service/static/static/js/9620.59bc85b8.chunk.js.map",
106
- "1480.30b94380.chunk.js.map": "/.well-known/service/static/static/js/1480.30b94380.chunk.js.map",
107
- "6186.61596c22.chunk.js.map": "/.well-known/service/static/static/js/6186.61596c22.chunk.js.map",
98
+ "main.85d66eb2.js.map": "/.well-known/service/static/static/js/main.85d66eb2.js.map",
99
+ "4716.17a45b6a.chunk.js.map": "/.well-known/service/static/static/js/4716.17a45b6a.chunk.js.map",
100
+ "6856.9aaf692c.chunk.js.map": "/.well-known/service/static/static/js/6856.9aaf692c.chunk.js.map",
101
+ "1660.9fb17942.chunk.js.map": "/.well-known/service/static/static/js/1660.9fb17942.chunk.js.map",
102
+ "9899.92626f0a.chunk.js.map": "/.well-known/service/static/static/js/9899.92626f0a.chunk.js.map",
103
+ "6737.7fe9f13a.chunk.js.map": "/.well-known/service/static/static/js/6737.7fe9f13a.chunk.js.map",
104
+ "1760.71e0c151.chunk.js.map": "/.well-known/service/static/static/js/1760.71e0c151.chunk.js.map",
105
+ "9620.db1568ef.chunk.js.map": "/.well-known/service/static/static/js/9620.db1568ef.chunk.js.map",
106
+ "1480.36129849.chunk.js.map": "/.well-known/service/static/static/js/1480.36129849.chunk.js.map",
107
+ "6186.6462ea21.chunk.js.map": "/.well-known/service/static/static/js/6186.6462ea21.chunk.js.map",
108
108
  "4682.8e18351a.chunk.js.map": "/.well-known/service/static/static/js/4682.8e18351a.chunk.js.map",
109
109
  "6711.9a173439.chunk.js.map": "/.well-known/service/static/static/js/6711.9a173439.chunk.js.map",
110
110
  "8437.994560bd.chunk.js.map": "/.well-known/service/static/static/js/8437.994560bd.chunk.js.map",
111
111
  "6378.29466d9e.chunk.js.map": "/.well-known/service/static/static/js/6378.29466d9e.chunk.js.map",
112
112
  "5434.523d071d.chunk.js.map": "/.well-known/service/static/static/js/5434.523d071d.chunk.js.map",
113
- "9409.befe72b4.chunk.js.map": "/.well-known/service/static/static/js/9409.befe72b4.chunk.js.map",
113
+ "9409.fe4a0af0.chunk.js.map": "/.well-known/service/static/static/js/9409.fe4a0af0.chunk.js.map",
114
114
  "4420.55971847.chunk.js.map": "/.well-known/service/static/static/js/4420.55971847.chunk.js.map",
115
- "5628.773a32da.chunk.js.map": "/.well-known/service/static/static/js/5628.773a32da.chunk.js.map",
115
+ "5628.aa14b1a7.chunk.js.map": "/.well-known/service/static/static/js/5628.aa14b1a7.chunk.js.map",
116
116
  "941.6a4ed4dd.chunk.js.map": "/.well-known/service/static/static/js/941.6a4ed4dd.chunk.js.map",
117
117
  "6576.f78daf32.chunk.js.map": "/.well-known/service/static/static/js/6576.f78daf32.chunk.js.map",
118
- "5176.42904a22.chunk.js.map": "/.well-known/service/static/static/js/5176.42904a22.chunk.js.map",
118
+ "5176.53f7f419.chunk.js.map": "/.well-known/service/static/static/js/5176.53f7f419.chunk.js.map",
119
119
  "9102.828066ce.chunk.js.map": "/.well-known/service/static/static/js/9102.828066ce.chunk.js.map",
120
120
  "3688.9bb1c7a8.chunk.js.map": "/.well-known/service/static/static/js/3688.9bb1c7a8.chunk.js.map",
121
- "2653.11a1ad57.chunk.js.map": "/.well-known/service/static/static/js/2653.11a1ad57.chunk.js.map",
121
+ "2653.6f37e8a0.chunk.js.map": "/.well-known/service/static/static/js/2653.6f37e8a0.chunk.js.map",
122
122
  "3593.c1eddcd6.chunk.js.map": "/.well-known/service/static/static/js/3593.c1eddcd6.chunk.js.map",
123
123
  "4802.bf353f58.chunk.css.map": "/.well-known/service/static/static/css/4802.bf353f58.chunk.css.map",
124
- "4802.63425dd4.chunk.js.map": "/.well-known/service/static/static/js/4802.63425dd4.chunk.js.map",
125
- "6771.735ebd3f.chunk.js.map": "/.well-known/service/static/static/js/6771.735ebd3f.chunk.js.map",
124
+ "4802.b7fa8e82.chunk.js.map": "/.well-known/service/static/static/js/4802.b7fa8e82.chunk.js.map",
125
+ "6771.1e778542.chunk.js.map": "/.well-known/service/static/static/js/6771.1e778542.chunk.js.map",
126
126
  "5982.ac464505.chunk.css.map": "/.well-known/service/static/static/css/5982.ac464505.chunk.css.map",
127
127
  "5982.89bdb419.chunk.js.map": "/.well-known/service/static/static/js/5982.89bdb419.chunk.js.map",
128
- "4023.0f348986.chunk.js.map": "/.well-known/service/static/static/js/4023.0f348986.chunk.js.map",
129
- "6452.b1899621.chunk.js.map": "/.well-known/service/static/static/js/6452.b1899621.chunk.js.map",
130
- "1565.a6f98c38.chunk.js.map": "/.well-known/service/static/static/js/1565.a6f98c38.chunk.js.map",
128
+ "4023.4be0c818.chunk.js.map": "/.well-known/service/static/static/js/4023.4be0c818.chunk.js.map",
129
+ "6452.4226209b.chunk.js.map": "/.well-known/service/static/static/js/6452.4226209b.chunk.js.map",
130
+ "1565.ad002b88.chunk.js.map": "/.well-known/service/static/static/js/1565.ad002b88.chunk.js.map",
131
131
  "2393.c5bbedfd.chunk.js.map": "/.well-known/service/static/static/js/2393.c5bbedfd.chunk.js.map",
132
- "5683.3bdd2338.chunk.js.map": "/.well-known/service/static/static/js/5683.3bdd2338.chunk.js.map",
133
- "2307.2e451912.chunk.js.map": "/.well-known/service/static/static/js/2307.2e451912.chunk.js.map",
134
- "7006.9a53f7ed.chunk.js.map": "/.well-known/service/static/static/js/7006.9a53f7ed.chunk.js.map",
132
+ "5683.7e5d47f1.chunk.js.map": "/.well-known/service/static/static/js/5683.7e5d47f1.chunk.js.map",
133
+ "5662.522d3713.chunk.js.map": "/.well-known/service/static/static/js/5662.522d3713.chunk.js.map",
134
+ "7006.b72aff66.chunk.js.map": "/.well-known/service/static/static/js/7006.b72aff66.chunk.js.map",
135
135
  "5960.adcd2848.chunk.js.map": "/.well-known/service/static/static/js/5960.adcd2848.chunk.js.map",
136
136
  "2631.54f86f84.chunk.js.map": "/.well-known/service/static/static/js/2631.54f86f84.chunk.js.map",
137
137
  "4355.68364e13.chunk.js.map": "/.well-known/service/static/static/js/4355.68364e13.chunk.js.map",
@@ -139,22 +139,22 @@
139
139
  "3595.cbf763c8.chunk.js.map": "/.well-known/service/static/static/js/3595.cbf763c8.chunk.js.map",
140
140
  "4164.5adbbbba.chunk.js.map": "/.well-known/service/static/static/js/4164.5adbbbba.chunk.js.map",
141
141
  "4319.8d9e189e.chunk.js.map": "/.well-known/service/static/static/js/4319.8d9e189e.chunk.js.map",
142
- "6629.36e61c26.chunk.js.map": "/.well-known/service/static/static/js/6629.36e61c26.chunk.js.map",
142
+ "6629.785fe237.chunk.js.map": "/.well-known/service/static/static/js/6629.785fe237.chunk.js.map",
143
143
  "1013.48b6d77d.chunk.js.map": "/.well-known/service/static/static/js/1013.48b6d77d.chunk.js.map",
144
144
  "4042.3c8e0025.chunk.js.map": "/.well-known/service/static/static/js/4042.3c8e0025.chunk.js.map",
145
145
  "5465.e0965b1d.chunk.js.map": "/.well-known/service/static/static/js/5465.e0965b1d.chunk.js.map",
146
146
  "4764.51208c0d.chunk.js.map": "/.well-known/service/static/static/js/4764.51208c0d.chunk.js.map",
147
- "2686.07687254.chunk.js.map": "/.well-known/service/static/static/js/2686.07687254.chunk.js.map",
147
+ "2686.7ae70bfd.chunk.js.map": "/.well-known/service/static/static/js/2686.7ae70bfd.chunk.js.map",
148
148
  "7606.25231f8c.chunk.js.map": "/.well-known/service/static/static/js/7606.25231f8c.chunk.js.map",
149
149
  "476.1f6135d6.chunk.js.map": "/.well-known/service/static/static/js/476.1f6135d6.chunk.js.map",
150
150
  "8143.5bd71f08.chunk.js.map": "/.well-known/service/static/static/js/8143.5bd71f08.chunk.js.map",
151
151
  "6498.bd96fa39.chunk.js.map": "/.well-known/service/static/static/js/6498.bd96fa39.chunk.js.map",
152
152
  "4706.7a92e9f9.chunk.css.map": "/.well-known/service/static/static/css/4706.7a92e9f9.chunk.css.map",
153
153
  "4706.df5b600d.chunk.js.map": "/.well-known/service/static/static/js/4706.df5b600d.chunk.js.map",
154
- "6606.9f17eaa6.chunk.js.map": "/.well-known/service/static/static/js/6606.9f17eaa6.chunk.js.map",
154
+ "50.cbaa5a4e.chunk.js.map": "/.well-known/service/static/static/js/50.cbaa5a4e.chunk.js.map",
155
155
  "6700.5dfd9c70.chunk.js.map": "/.well-known/service/static/static/js/6700.5dfd9c70.chunk.js.map",
156
- "6640.53cdcb95.chunk.js.map": "/.well-known/service/static/static/js/6640.53cdcb95.chunk.js.map",
157
- "7465.ba1027a7.chunk.js.map": "/.well-known/service/static/static/js/7465.ba1027a7.chunk.js.map",
156
+ "6640.e453c619.chunk.js.map": "/.well-known/service/static/static/js/6640.e453c619.chunk.js.map",
157
+ "7465.999f0039.chunk.js.map": "/.well-known/service/static/static/js/7465.999f0039.chunk.js.map",
158
158
  "8604.ad77a749.chunk.js.map": "/.well-known/service/static/static/js/8604.ad77a749.chunk.js.map",
159
159
  "6380.2b96be29.chunk.js.map": "/.well-known/service/static/static/js/6380.2b96be29.chunk.js.map",
160
160
  "6465.e704f56b.chunk.js.map": "/.well-known/service/static/static/js/6465.e704f56b.chunk.js.map",
@@ -168,6 +168,6 @@
168
168
  },
169
169
  "entrypoints": [
170
170
  "static/css/main.7ea79dc8.css",
171
- "static/js/main.3ba3901e.js"
171
+ "static/js/main.85d66eb2.js"
172
172
  ]
173
173
  }